Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2008-03-16 20:46:56.
Revizia anterioară   Revizia următoare  

Aceasta pagina e in constructie

LimeEval

  • Versiune :
  • Framework .NET :
  • Functii generale :
    • - mod consola / mod grafic
    • - configurare completa din interfata
    • - compilare automata surse concurenti (selectiva sau totala)
    • - posibilitate de specificare a compilatoare multiple
    • - directive custom de compilare
    • - salvare output compilatoare pe fiecare sursa
    • - xml generat cu rezultatele compilarii tuturor concurentilor
    • - evaluare (selectiva sau totala) in mod sandbox
    • - limitare de timp si limitare de memorie
    • - evaluare test cu test, sau rapida
    • - salvarea in fisier individual outputului produs de fiecare concurent pe fiecare test
    • - salvare in fisier individual rezultate evaluare pe fiecare test (punctaj, timp, memorie, mesaj verif)
    • - xml generat cu rezultatele totale ale evaluarii
    • - curatare foldere concurenti \ filtrare surse \ redenumire surse
    • - error reporting, exceptii, warninguri, erori, salvate in fisiere si afisate in consola grafica
  • To Do :
    • - clasament real time, si detasat din tab control
    • - exportare borderouri in *.txt-uri individuale pentru fiecare concurent
    • - exportare clasament in *.xls (Excel)
  • Buguri cunoscute :
    • - in timpul evaluarii in mod grafic (fara pauza), daca se tot face resize la tabel, aplicatia se blocheaza. (thread deadlock)

<br><br>

Screenshots

<br><br><br>

Structura de fisiere a evaluatorului

In folderul root al evaluatorului :

lime.exeExecutabilul evaluatorului
compilatoare.xmlFisier de configurare a compilatoarelor
errlog.txtFisier unde se scriu unele erori si warninguri

! Numele de mai jos sunt doar exemple nu sunt fixe, ele depind de configurarea fiecarei runde

Undeva pe disc :

fisier_runda.xmlFisier de configurare al unei runde
/surse/Folder unde se vor pune folderele personale fiecarui id

In surse se poate copia orice. Folderele si fisierele care nu sunt solutii la probleme si nu au extensiile valide
vor fi sterse

/surse/1/Folderul id-ului nr 1
/surse/2/Folderul id-ului nr 2
/surse/3/Folderul id-ului nr 3
/teste/Folderul cu testele problemelor

Pentru fiecare problema specificata in fisierul cu teste trebuie sa fie un folder cu numele acesteia. Acesta trebuie sa contina testele de intrare, testele de iesire corecte si un (verificator) verif.exe - care verifica corectitudinea raspunsului concurentului pe out-ul produs de acesta. (mai multe in "Intrebari frecvente":(#intrebari) )

/teste/problema1/Folder pentru problema1
/teste/problema2/Folder pentru problema2
/bin/Aici se vor pune sursele compilate ale concurentilor

Se va creea de catre evaluator pentru fiecare id un folder cu valoarea id-ului, si pentru fiecare compilator cu care s-au compilat sursele concurentului, va exista un folder si in fiecare folder va exista un executabil, cu numele problemei compilate (Daca compilarea a avut succes). Ex :

/bin/1/g++/problema1.exeBinarul creat pentru concurentul cu id-ul 1, pentru sursa sa la problema1, compilata cu g++
/bin/1/fpc/problema1.exeBinarul creat pentru concurentul cu id-ul 1, pentru sursa sa la problema1, compilata cu fpc
/bin/1/gcc/problema2.exeBinarul creat pentru concurentul cu id-ul 1, pentru sursa sa la problema2, compilata cu gcc
/eval/Aici se vor evalua binarele concurentilor

In acest folder se vor copia in mod repetat fisiere in, se vor redenumi, se vor copia binarele concurentilor, in acest folder se vor rula, aici se va rula verif-ul etc..
(Vezi : Cum se produce evaluarea? in "Intrebari frecvente":(#intrebari) )

/rezultate/Acesta este folderul unde se vor scrie rezultate. In acest folder se vor creea 3 foldere
/rezultate/compilare/Aici se vor pune rezultatele compilarii
/rezultate/evaluare/Aici se vor pune rezultatele evaluarii
/rezultate/log/Aici se vor scrie loguri, cu probleme aparute in timpul compilarii si evaluarii

Evaluatorul va crea (depinde de flagurile cu care este rulat), fisiere xml cu rezultatele totale ale compilarii si evaluarii

/rezultate/compilare/rezultat_compilare.xmlRezultate totale ale compilarii
/rezultate/evaluare/rezultat_evaluare.xmlRezultate totale ale evaluarii

In /rezultate/compilare/ se va creea pentru fiecare id, si pentru fiecare compilator folosit un folder, in care se vor pune fisiere de forma : "problema.compilator" , in care va fi exact outputul produs de compilator.

De ex : g++-ul si gcc-ul, la o compilare reusita, scrie 2-3 linii noi. La o compilare gresita e stackul de erori.
Ex : /rezultate/compilare/1/g++/problema.g++

In /rezultate/evaluare/ pentru fiecare id si pentru fiecare compilator se vor creea fisiere de forma :

problemaQ.outcontine exact raspunsul concurentului la acea problema pe testul Q
problemaQ.rezcontine rezultatul evaluarii. 
Pe prima linie un intreg (punctajul obtinut pe test)
Pe a doua linie un intreg, memoria folosita pe acel test.
Pe a 3-a linie un intreg, punctajul obtinut pe test
Pe a 4-a lini eun mesaj (OK, Puntcaj Partial, Gresit, etc..)

In /rezultate/log/ se vor crea :

compilare.txtContine warninguri erori si exceptii aparute in timpul compilarii
evaluare.txtContine warninguri erori si exceptii aparute in timpul evaluarii

<br>

Instructiuni de folosire

Instructiunile de folosire sunt sub forma de screenshoturi insotite de text explicativ si indicatii.

Tutorial 1 - Instalare si configurare compilatoare

Tutorial 2 - Creare si definire runda

Tutorial 3 - Compilarea si evaluarea unei runde definite anterior

Tutorial 4 - ConsolaGrafica - warninguri si erori
img1 img2

Tutorial 5 - Rulare evaluator in mod consola
img1 img2 img3 img4 img5 img6 img7 img8

<br><br><br>

Download runde

<br><br><br>

Intrebari frecvente

<br><br><br>

Sursa verif

Verificatorul este necesar pentru a puncta fisierul OUT produs de concurent. Trebuie pus sub forma de executabil in fisierul cu testele problemei.

Mai jos este o sursa generala de verificator. Sursa are implementate functii de comparare bit la bit, si a numarului din fisier. Pentru probleme cu solutii multiple sau un alt mod de verificare vor trebui implementate si alte functii de verificare a rezultatului.
Shimbati #define-urile INFILE, OUTFILE, si OKFILE cu numele corespunzatoare.

#include <stdio.h>

/* !!! schimba <problema> cu numele problemei */
#define INFILE "problema.in"
#define OUTFILE "problema.out"
#define OKFILE "problema.ok"

FILE *fIN, *fOUT, *fOK, *fV;

bool openFiles();        /* deschide fisierele si verifica existenta lor */
void closeHandles();     /* inchide fisierele */
bool compareBitByBit();  /* compara out si ok, bit la bit */
bool compareNumber();    /* compara numerele din out si ok */

int main()
{
    if(!openFiles()) return 0;
    if (compareBitByBit())
        fprintf(fV, "10\nCorect");
    else
        fprintf(fV, "0\nGresit");
    closeHandles();
    
    return 0;
}

bool openFiles()
{
    fIN = fopen(INFILE, "r");
    fOUT = fopen(OUTFILE, "r");
    fOK = fopen(OKFILE, "r");
    fV = fopen("punctaj.verif", "w");
    if (!fIN)
    {
        fprintf(fV, "0\nFisier IN lipsa.");
        closeHandles();
        return false;
    }
    if (!fOUT)
    {
        fprintf(fV, "0\nFisier OUT lipsa.");
        closeHandles();
        return false;
    }
    if (!fOK)
    {
        fprintf(fV, "0\nFisier OK lipsa.");
        closeHandles();
        return false;
    }
    return true;
}

void closeHandles()
{
    if (fIN) fclose(fIN);
    if (fOUT) fclose(fOUT);
    if (fOK) fclose(fOK);
    if (fV) fclose(fV);
}

bool compareBitByBit()
{
    char b1, b2;
    int ret1, ret2;
    while (1)
    {
        ret1 = fscanf(fOUT, "%c", &b1);
        ret2 = fscanf(fOK, "%c", &b2);
        if (ret1 > 0 && ret2 <= 0) return false;
        if (ret1 <= 0 && ret2 > 0)  return false;
        if (b1 != b2) return false;
        if (ret1 <= 0 && ret2 <= 0) return true;
    }
    return true;
}

bool compareNumber()
{
     int nr1, nr2;
     fscanf(fOUT, "%d", &nr1);
     fscanf(fOK, "%d", &nr2);
     if (nr1 != nr2) return false;
     return true;
}