Pagini: [1] 2   În jos
  Imprimă  
Ajutor Subiect: Yet another evaluator, wrote by me (0.65 stable)  (Citit de 13608 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« : Aprilie 11, 2009, 19:10:52 »

Salut toata lumea!

Cu prilejul acestui mesaj public evaluatorul meu de probleme, scris in Python. El se foloseste de jrun, folosit si de evaluatorul Infoarena, pentru a evalua teste individuale, deci poate fi considerat mai degraba o 'interfata' destul de avansata pentru jrun.

Programul, fiind scris in Python, este portabil, dar datorită neportabilităţii lui jrun care foloseşte tehnici exclusive sistemelor Linux, funcţionează doar pe Linux.


Ultima versiune: 0.65 - stabilă
Programul de versioning este acum mercurial (hg).
Linia principală de dezvoltare şi următoarele "release-uri" stabile se vor găsi aici


Cum îl punem pe roate:

1) Facem rost de evaluator
     
  • (recomandat) Îl descărcăm direct de pe bitbucket, intrând pe pagina de download şi descărcând o arhivă a versiunei dorite, de jos unde scrie "Tags and snapshots". "tip" înseamnă ultima versiune de dezvoltare, care ar putea fi instabilă.

  • Sau îl preluăm prin mercurial (îl obţineţi executând apt-get install mercurial pe Ubuntu, yum install mercurial pe Fedora/Red Hat/SUSE), folosind comanda:
    hg clone http://bitbucket.org/dan.sanduleac/eval2
    Dacă vreţi ultima versiune stabilă în locul celei instabile, rulaţi hg update 0.65 (înlocuind 0.65 cu ultima versiune apărută).
  • Prin subversion, folosind comanda:
    "svn co http://informatrix.ro/svn/eval/eval2/tags/stable-0.6 eval2"

Ce obtinem in orice caz va fi un director numit eval2 (daca l-ati descarcat de pe aceasta pagina, extrageti arhiva).

2) Creăm o legatură simbolică pentru a-l putea apela de oriundeSă presupunem că directorul eval2 se află in "/home/utilizator/".
Apelăm următoarea comandă, înlocuind calea până la eval2 cu cea adevarată:
ln -s /home/utilizator/eval2/evaluator.py /usr/local/bin/

3) Facem rost de jrun (este ataşat la sfârşitul mesajului, sau disponibil pe aici, în pagina de downloads a proiectului)Extragem arhiva, si din directorul 'jrun' nou creat, scriem comenzile "make" si apoi "sudo cp jrun /usr/local/bin".


4) Configuram evaluatorul prin editarea config.py
-- notă -- De la versiunea 0.65 înainte, copiaţi config.py.example în config.py şi apoi editaţi-l.
Deschidem config.py cu un editor si cautam variabila TestDBRoot. O modificam sa reflecte un director gen /home/utilizator/teste/, in care vom pastra 'baza de date' de probleme.

(Un director cu numele problemei in care intra testele si eventual un fisier de configurare este de ajuns pentru a evalua apoi acea problema. Pentru fiecare problema, acest director trebuie sa se gaseasca undeva in baza de date de probleme.)

5) Creăm directorul de testeExemplu: "mkdir ~/teste".
Apoi punem probleme in directorul de teste, si folosim evaluatorul ca sa le evaluam.

Cum evaluam?

Pe scurt, se evalueaza cu: evaluator.py numele_executabilului [--prob numele_problemei]
Se precizeaza numele problemei doar daca difera de numele executabilului pe care-l evaluam.
Exemplu:
Daca avem problema 'joc' (testele vor fi in directorul /home/utilizator/teste/joc, sa zicem) si executabilul de evaluat este joc_dan, scriem:
Cod:
evaluator.py joc_dan --prob joc

Un ultim cuvant:
In directorul de teste pentru o anumita problema, testele trebuie sa arate (by default) ca ?-numele_problemei.in si ?-numele_problemei.ok DAR asta se poate schimba (ori din command line, cititi evaluator.py --help, ori facand un fisier de configurare in directorul de teste).

Fisierul de configurare:
Fiecare problema are datele ei (limita de timp, de memorie, cum arata testele de intrare si de iesire)
Pe langa faptul ca acesti parametri pot fi precizati la rularea lui evaluator.py (din consola), este posibila si crearea unui fisier de configurare din care evaluator.py sa incarce automat setarile corespunzatoare problemei evaluate.
Fisierul de configurare trebuie doar sa aiba extensia 'cfg' si sa se afle in directorul de teste al problemei.
Fisierul de configuratie va contine numai linii de aceasta forma:
Cod:
Cheie=Valoare
unde 'Cheie' este una din urmatoarele: time, memory, inf, outf
iar 'Valoare' este .. va prindeti voi ;)
Precizari:
  • Memoria se precizeaza in KB
  • Limita de timp se precizeaza in milisecunde
  • Formatul fisierului de intrare/iesire preluat din variabilele inf/outf trebuie sa contina anumite caractere/grupuri de caractere care vor fi inlocuite:
    %s va fi inlocuit cu numele problemei
    ? va fi inlocuit cu numarul testului
    Astfel: daca am teste gen sum1.in si sum1.out (in-ul si ok-ul), atunci voi adauga urmatorii doi parametri in fis. de config.:
    inf=%s?.in
    outf=%s?.out



"Localizarea automata a problemei" in directorul de teste

Evaluatorul va parsa numele problemei dat de parametrul -p (identic cu --prob) si se va folosi de el inteligent:
Daca ai o problema (adica directorul cu numele ei, ce ii contine testele) numita 'whatever' in directorul de teste, sub calea DIRECTORUL_DE_TESTE/ONI/2009/ziua1/whatever si vrei sa evaluezi acea problema, ai mai multe optiuni:
  • evaluator.py executabil_de_evaluat --prob whatever
  • Daca insa ar putea fi mai multe probleme cu acest nume in baza de date cu testele problemelor, evaluatorul nu stie exact la care problema ne referim (si o va lua pur si simplu pe prima pe care o gaseste, specificand pe care, desigur). In acest caz, putem fi mai expliciti:
    evaluator.py executabil_de_evaluat --prob ONI/whatever sau evaluator.py executabil_de_evaluat --prob ONI/2009/whatever
    intelegeti unde vreau sa ajung ?:)
Toate aceste formate de specificare a problemei functioneaza pentru a gasi acea problema. Primul exemplu gaseste problema whatever care este undeva in directorul ONI, iar al doilea e si mai specific, gaseste problema whatever care se afla undeva in directorul ONI/2009.
Astfel, problemele vor fi nu doar indexate frumos dupa "sursa de provenienta", ci si mai usor de indicat la evaluare.


Exemplu concret:
Cod:
[email protected]:surse$ evaluator.py virus-withoutcheck -p ONI/virus
Evaluez problema `/home/dan/teste/ONI/2008/11-12/virus'
Numele problemei: virus
[config-file] memory=64000
[config-file] time=500
[config-file] groups=0-2,4-6
Test   Score Group Time       Memory     Verdict
------ ----- ----- ---------- ---------- -------------
0      10    ↓     10ms       1100kb     OK
1      0     ↓     10ms       1476kb     Wrong Answer
2      10    0     30ms       2108kb     OK
3      0     0     190ms      16984kb    Wrong Answer
4      10    ↓     370ms      26976kb    OK
5      10    ↓     200ms      16816kb    OK
6      10    30    410ms      33056kb    OK
7      0     0     210ms      17040kb    Wrong Answer
8      0     0     20ms       3076kb     Wrong Answer
9      0     0     10ms       1768kb     Wrong Answer
------ ----- ----- ---------- ---------- -------------
Total        30
[email protected]:surse$

Comentarii si sugestii sunt binevenite



Descarcă jrun.zip
« Ultima modificare: Septembrie 21, 2009, 14:47:35 de către Sanduleac Dan » Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #1 : Aprilie 13, 2009, 19:03:53 »

Postul se potriveste mai bine aici.

Te sustin, Dane! Evaluatorul este foarte bun si odata obisnuit cu el, face munca in linux mult mai usoara!  Ok
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #2 : Aprilie 13, 2009, 20:00:49 »

Much appreciated. Chiar eram nedumerit unde sa-l incadrez, deci iti multumesc Very Happy
So, unde ai gasit timp sa mai si rasfoiesti infoarena la ONI ? Intriguing

Sper sa mai vada si alta lume threadul Smile Sau poate chiar au toti cate un evaluator bun, scris de ei, la purtator. Mai stii ?  Thumb up
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #3 : Aprilie 25, 2009, 01:30:28 »

Am uploadat pe serverul infoarena fisierele, scuze pentru intarzierea de a face acest lucru.
In curând voi face si un script care va automatiza instalarea evaluatorului si lui jrun, pentru mai putina bătaie de cap.

@toni2007: ai încercat evaluator-ul pe care l-am postat eu?

@Laurentiu: Start a different thread, please - [moderator] Done Very Happy

« Ultima modificare: Aprilie 25, 2009, 09:28:34 de către Savin Tiberiu » Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #4 : Aprilie 25, 2009, 16:40:12 »

M-am uitat. Merge destul de bine, singura chestie care nu mi-a mers, a fost cand am incercat sa fac un program pentru a + b (in ruby). Mi-am luat Blocked System Call de la interpreter. Ar trebui reglata treaba asta.

[LE] Ar merge sa poti seta din linia de comanda timpul si memoria, preferabil ceva de genul urmator :

Cod:
./eval.py prob 100 16384
« Ultima modificare: Aprilie 25, 2009, 19:55:41 de către Pripoae Teodor Anton » Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #5 : Aprilie 26, 2009, 08:31:08 »

M-am uitat. Merge destul de bine, singura chestie care nu mi-a mers, a fost cand am incercat sa fac un program pentru a + b (in ruby). Mi-am luat Blocked System Call de la interpreter. Ar trebui reglata treaba asta.

[LE] Ar merge sa poti seta din linia de comanda timpul si memoria, preferabil ceva de genul urmator :

Cod:
./eval.py prob 100 16384

Aa, pai uite-te in eval.py --help.
Ca zice acolo asa:
Cod:
  -t TIME, --time=TIME  time limit in milisecunde
  -m MEM, --memory=MEM  limita memorie, kb
in which case, folosesti:
Cod:
./eval.py prob -t 100 -m 16384
(Apropo, evaluatorul, daca nu-i precizezi aceste valori, le foloseste ca default exact pe cele scrise mai sus.)

Blocked System Call e vina lui jrun, care are grija sa nu iti permita sa folosesti metode de sistem (ex. fork) in codul tau. Asta este pentru siguranta serverului evaluator (infoarena) si pentru ca nu ar trebui sa ai nevoie (sau voie) sa folosesti acele "system calls" cand rezolvi probleme de informatica.

Trebuie sa-mi zici cum ai incercat sa rulezi programul din ruby, si cum arata acesta.
Eu de exemplu am reusit sa evaluez un program facut in python. Pur si simplu l-am facut executabil (chmod +x) si i-am adaugat #!/usr/bin/python in header. And it worked. No blocked system calls of any kind.
I'm wondering why it didn't with Ruby...

Apropo, limbajele "interpreted" (Python, Ruby, PHP, ...) au un mare deficit in a putea executa rapid cod pentru tipul de probleme "de informatica" (care tin de algoritmica) care se gasesc la olimpiade, concursuri si pe infoarena, pentru ca au un mare overhead datorita obiectelor folosite pretutindeni (desi.. si aceste limbaje pot refolosi cod compilat sub forma de librarii sau pot imbrica cod C++ direct in sursa lor - Python cel putin sigur poate).  Asa ca nu prea vad cum ar putea fi eficiente si pentru alte aplicatii mai greoaie, gen recursivitati, chestii cu vectori multi, arbori si alte computatii cpu-intensive.
Aici se poate vedea ca atat Python cat si Python 3.0 sunt way behind C++ pentru acest tip de operatii. Pentru arbori binari de ex, pot fi de 300 de ori mai lenti.
Java, de ex, is doing a much better job, dar fiindca si el ruleaza intr-o masina virtuala, are de asemenea multe zone in care este si de 10 ori mai lent decat C/C++.
Well, the rant's gotta end somewhere.
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #6 : Mai 07, 2009, 17:58:29 »

Scuze pentru intarziere, dar am fost cam ocupat cu campionul, algoritmiada, pregatirea pt lot, etc. Am mai incercat odata, si se pare ca imi merge de data asta. Nu imi dau seama de ce nu a mers inainte, singura explicatie pe care o pot da, e ca am dezinstalat ruby 1.9 (the new ruby), din cauza unor probleme cu acesta, si acum am testat cu ruby 1.8.5. Voi mai incerca cand voi mai avea timp Smile. De vreo saptamana, m-am apucat sa scriu o interfata catre evaluatorul tau (practic un evaluator complet, care sa evalueze runde intregi), pe care l-am codat in ruby. Mai am putin si il termin. Dupa aceea il voi face public. Mai sunt mici probleme cu clasamentul (vreau sa fac toata treaba in bash).  si cu borderourile finale, deoarece vreau sa fac borderouri cu toate joburile, si cu joburile fiecarui concurent.


Citat
Trebuie sa-mi zici cum ai incercat sa rulezi programul din ruby, si cum arata acesta.
Eu de exemplu am reusit sa evaluez un program facut in python. Pur si simplu l-am facut executabil (chmod +x) si i-am adaugat #!/usr/bin/python in header. And it worked. No blocked system calls of any kind.
I'm wondering why it didn't with Ruby...

Cod:
[[email protected] eval_alpha]$ cat work/adun
#!/usr/bin/env ruby

inp=File.new("adun.in", "r");
outp=File.new("adun.out", "w");

a=inp.gets.chomp.to_i;
b=inp.gets.chomp.to_i;

outp.puts(a+b).to_s;

inp.close;
outp.close;

[[email protected] eval_alpha]$ python scripts/eval.py work/adun
Evaluez `work/adun' folosind directorul `/home/toni/Desktop/eval_alpha/tests/adun'
Numele problemei: adun
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Testul 1    OK   5   time 19ms memory 1536kb   Execution successful.  
Testul 2    OK   5   time 12ms memory 1468kb   Execution successful.  
Testul 3    OK   5   time 11ms memory 1344kb   Execution successful.  
Testul 4    OK   5   time 19ms memory 1544kb   Execution successful.  
Testul 5    OK   5   time 15ms memory 1544kb   Execution successful.  
Testul 6    OK   5   time 16ms memory 1572kb   Execution successful.  
Testul 7    OK   5   time 18ms memory 1172kb   Execution successful.  
Testul 8    OK   5   time 18ms memory 1540kb   Execution successful.  
Testul 9    OK   5   time 16ms memory 1572kb   Execution successful.  
Testul 10   OK   5   time 13ms memory 1536kb   Execution successful.  
Testul 11   OK   5   time 10ms memory 1508kb   Execution successful.  
Testul 12   OK   5   time 14ms memory 1360kb   Execution successful.  
Testul 13   OK   5   time 9ms memory 1544kb    Execution successful.  
Testul 14   OK   5   time 10ms memory 1272kb   Execution successful.  
Testul 15   OK   5   time 13ms memory 1500kb   Execution successful.  
Testul 16   OK   5   time 17ms memory 1496kb   Execution successful.  
Testul 17   OK   5   time 11ms memory 1320kb   Execution successful.  
Testul 18   OK   5   time 17ms memory 1496kb   Execution successful.  
Testul 19   OK   5   time 18ms memory 1544kb   Execution successful.  
Testul 20   OK   5   time 12ms memory 1468kb   Execution successful.  
Punctaj total: 100

Citat
Apropo, limbajele "interpreted" (Python, Ruby, PHP, ...) au un mare deficit in a putea executa rapid cod pentru tipul de probleme "de informatica" (care tin de algoritmica) care se gasesc la olimpiade, concursuri si pe infoarena, pentru ca au un mare overhead datorita obiectelor folosite pretutindeni (desi.. si aceste limbaje pot refolosi cod compilat sub forma de librarii sau pot imbrica cod C++ direct in sursa lor - Python cel putin sigur poate).

Legat de asta, stiu ca ruby poate merge mai incet decat alte limbaje (am incercat pe spoj cateva probleme), dar ruby1.9 (the new ruby), merge de aproximativ 2-3 ori mai rapid, si este destul de fun de codat in el.

Revin cand termin evaluatorul. Chiar acum ma apuc de terminat micile buguri, si intr-o saptamana maxim il fac public.
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #7 : Mai 07, 2009, 18:31:07 »

[LE] E deja prea mare postul anterior, asa ca scriu un nou post.

Am incercat sa rulez verificatorul cu --verif=prob/adun/verif, in care am scris:

Cod:
#!/bin/bash
# general file-compare verifier

ls 1> /home/toni/bla_bla.txt      
OFILES="adun.out"
KFILES="adun.ok"
IFILES="adun.in"

COMPARE(){
for O in $OFILES $INT_OFILES ; do
if [ -z "$1" ]; then
echo "FATAL ERROR IN verif: not enough files in KFILES" >&2
exit 1
fi
if [ ! -r "$O" ]; then
echo "FATAL ERROR IN verif: missing $O" >&2
exit 1
fi
if diff -q -b $O $1 >/dev/null ; then
shift
else
printf "Wrong answer in: $O\n0"
exit 0
fi
done
if [ ! -z "$1" ]; then
echo "FATAL ERROR IN verif: more files in KFILES: $*" >&2
exit 1
fi
printf "Okay\n$SCORE"
}

SCORE=100

if [ -z "$OFILES$INT_FILES" ]; then
echo "FATAL ERROR IN verif: missing OFILES variable!" >&2;
exit 1
fi
COMPARE $KFILES

Apoi, deoarece mie imi dadea ceva de genul :

Cod:
[[email protected] eval_alpha]# python scripts/eval.py -p adun work/theexe -t 100 -m 16384 --verif=prob/adun/verif
Evaluez `work/theexe' folosind directorul `/home/toni/Desktop/eval_alpha/tests/adun'
Numele problemei: adun
1diff: adun.ok: No such file or directory
. 2diff: adun.ok: No such file or directory
. 3diff: adun.ok: No such file or directory
. 4diff: adun.ok: No such file or directory
. 5diff: adun.ok: No such file or directory
. 6diff: adun.ok: No such file or directory
. 7diff: adun.ok: No such file or directory
. 8diff: adun.ok: No such file or directory
. 9diff: adun.ok: No such file or directory
. 10diff: adun.ok: No such file or directory
. 11diff: adun.ok: No such file or directory
. 12diff: adun.ok: No such file or directory
. 13diff: adun.ok: No such file or directory
. 14diff: adun.ok: No such file or directory
. 15diff: adun.ok: No such file or directory
. 16diff: adun.ok: No such file or directory
. 17diff: adun.ok: No such file or directory
. 18diff: adun.ok: No such file or directory
. 19diff: adun.ok: No such file or directory
. 20diff: adun.ok: No such file or directory
.
Testul 1    Wrong answer in: adun.out   0   time 2ms memory 12kb   Execution successful.  
Testul 2    Wrong answer in: adun.out   0   time 0ms memory 8kb    Execution successful.  
Testul 3    Wrong answer in: adun.out   0   time 2ms memory 64kb   Execution successful.  
Testul 4    Wrong answer in: adun.out   0   time 1ms memory 40kb   Execution successful.  
Testul 5    Wrong answer in: adun.out   0   time 4ms memory 12kb   Execution successful.  
Testul 6    Wrong answer in: adun.out   0   time 1ms memory 40kb   Execution successful.  
Testul 7    Wrong answer in: adun.out   0   time 3ms memory 80kb   Execution successful.  
Testul 8    Wrong answer in: adun.out   0   time 1ms memory 12kb   Execution successful.  
Testul 9    Wrong answer in: adun.out   0   time 1ms memory 8kb    Execution successful.  
Testul 10   Wrong answer in: adun.out   0   time 3ms memory 12kb   Execution successful.  
Testul 11   Wrong answer in: adun.out   0   time 1ms memory 12kb   Execution successful.  
Testul 12   Wrong answer in: adun.out   0   time 3ms memory 12kb   Execution successful.  
Testul 13   Wrong answer in: adun.out   0   time 1ms memory 12kb   Execution successful.  
Testul 14   Wrong answer in: adun.out   0   time 0ms memory 12kb   Execution successful.  
Testul 15   Wrong answer in: adun.out   0   time 3ms memory 8kb    Execution successful.  
Testul 16   Wrong answer in: adun.out   0   time 0ms memory 8kb    Execution successful.  
Testul 17   Wrong answer in: adun.out   0   time 3ms memory 12kb   Execution successful.  
Testul 18   Wrong answer in: adun.out   0   time 2ms memory 8kb    Execution successful.  
Testul 19   Wrong answer in: adun.out   0   time 3ms memory 8kb    Execution successful.  
Testul 20   Wrong answer in: adun.out   0   time 1ms memory 8kb    Execution successful.  
Punctaj total: 0

M-am uitat in /home/toni/bla_bla.txt  si se pare ca afiseaza :

Cod:
[[email protected] eval_alpha]# cat /home/toni/bla_bla.txt
adun
adun.in
adun.out

Nu stiu de ce, dar se pare ca nu imi copiaza fisierul .ok Weightlift
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #8 : Mai 07, 2009, 18:40:53 »

Pare interesant ce zici. Dar nu stiu de ce vrei sa te chinui in bash cu asta, este totusi un limbaj destul de limitat (desi.. evaluatorul meu a fost initial scris in bash, si apoi adaptat + re-codat in python).
Chiar sunt curios ce interfata faci. In orice caz, va fi amuzant ca eval-ul tau se va folosi de al meu care se foloseste de jrun Smile Este un exemplu perfect de a crea un proiect pe baza codului modular, peste care se poate construi mai departe.

Singura intrebare e.. ce planuri ai pentru un evaluator care sa evalueze runde intregi? Sa-l lansezi ca proiect Open Source sau sa-l propui asociatiei infoarena in schimbul eval-ului in PHP pe care-l folosesc ei acuma?

Apropo, daca parsezi codul evaluatorului meu din al tau, poate ar fi mai bine sa introduc niste cod care sa omita culorile in output daca acesta este redirectat, ca nu prea isi au farmecul decat in terminal (stiu ca se putea cumva detecta asta), sau eventual niste optiuni gen -q, de la quiet, pentru a afisa doar scorul, borderoul fiind afisabil printr-un alt nou flag `-w fisier_borderou`. Spune-mi cum mai sta treaba si daca pot sa te ajut cumva.

PS: ruby arata dubios, prefer python Smile gets.chomp.to_i parca e nefiresc, mai degraba un int(f.readline().trim()) Very Happy
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #9 : Mai 07, 2009, 18:56:47 »

Pare interesant ce zici. Dar nu stiu de ce vrei sa te chinui in bash cu asta, este totusi un limbaj destul de limitat (desi.. evaluatorul meu a fost initial scris in bash, si apoi adaptat + re-codat in python).
Chiar sunt curios ce interfata faci. In orice caz, va fi amuzant ca eval-ul tau se va folosi de al meu care se foloseste de jrun Smile Este un exemplu perfect de a crea un proiect pe baza codului modular, peste care se poate construi mai departe.

Evalul propriu-zis are 2.5 kilo Very Happy (asta imi place la ruby, ca scrii cod folositor in foarte putine linii), si mai am cateva scripturi de bash (ca sa nu lucrez cu bash/system in ruby => e destul de naspa).


Singura intrebare e.. ce planuri ai pentru un evaluator care sa evalueze runde intregi? Sa-l lansezi ca proiect Open Source sau sa-l propui asociatiei infoarena in schimbul eval-ului in PHP pe care-l folosesc ei acuma?

Deocamdata nu am foarte multe planuri, intai sa-l vad ca merge, si dupaia voi vedea. In caz ca merge, il voi lansa Open Source. Ideea din spatele acestui eval, e ca de ceva timp, m-am gandit sa-mi fac propriul meu site de pb. Totul bun, am ales evalul facut de Mihai Patrascu, si am inceput sa testez cu el. Doar ca, nu stiu daca stii, acesta are niste mici probleme legate de memorie pe kernelurile noi (ulimit). Asa ca evalul tau a fost perfect pentru ce imi trebuia mie, si i-am facut o interfata asemanatoare cu cel vechi, folosit pe la ONI, campion si lot.

Apropo, daca parsezi codul evaluatorului meu din al tau, poate ar fi mai bine sa introduc niste cod care sa omita culorile in output daca acesta este redirectat, ca nu prea isi au farmecul decat in terminal (stiu ca se putea cumva detecta asta), sau eventual niste optiuni gen -q, de la quiet, pentru a afisa doar scorul, borderoul fiind afisabil printr-un alt nou flag `-w fisier_borderou`. Spune-mi cum mai sta treaba si daca pot sa te ajut cumva.

Suna interesant ce zici Very Happy, eventual sa-i faci si un return code = punctaj obtinut, pt ca asa tre sa parsez destul de dubios borderoul.

PS : Am atasat evalul (ce am facut din el pana acum) aici .

Se ruleaza in felul urmator : "ruby grader.rb runda", pentru runde normale, sau "ruby grader.rb -- prob user", pentru a evalua userul user pe problema prob.

Cod:
[[email protected] eval_alpha]# ruby grader.rb
STARTUP PROBLEM: usage:
                ./grader.rb <day-to-evaluate>    -or-
                ./grader.rb -- <problem> <contestant>
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #10 : Mai 07, 2009, 19:05:56 »

Ne-am sincronizat, ca sa vezi.

[raspuns la ultimul post]
Ma bucur ca e chiar ce-ti trebuia Tongue Si da, as putea sa fac cu return code, sau sa implementez -q, care afiseaza doar scorul in stdout si iese (mi se par la fel de usor de parsat ambele alternative).
O sa ma apuc sa modific aceste chestii cand apuc. Apropo, am pus o versiune noua a evalului, erau cateva linii cu buguri minore pe la verif, get your new copy off my account page Wink

Edit :: acuma am vazut ca ai atasat eval-ul, o sa-l incerc cu prima ocazie. Chiar seamana cu cel al lui M Patrascu, nu l-am folosit pe acela niciodata dar recunosc "interfata".

[la postul precedent]

Pai uite cum sta treaba cu verif (probabil am facut eu helpul cam neclar):

Programul verificator va primi trei parametri din partea lui eval.py, si anume cele trei fisiere  (in-ul out-ul concurentului si (optional) ok-ul). El poate sau nu sa le foloseasca, dar nu poate cauta aceste fisiere in directorul curent dupa numele lor pur si simplu.
Parametri: VERIF fisier.in fisier.out fisier.ok
                        Returneaza: "mesaj\n(procent punctaj din max)"
                        Exemplu: Gresit\n0 ; sau: OK\n100
Apropo, la "procent punctaj din max" cred ca ai inteles despre ce e vorba, dar ca sa nu fiu neclar, ideea era numarul este cat% din cat ar lua testul acela (adica, in principiu, 100puncte / numarul de teste) ii acorzi (si nu cat% din punctajul total pe problema). Pentru 10 teste, 100 acolo inseamna 10 puncte la scorul final care e maxim 100p.

Asa.. Scriptul tau din bash zice ca nu gaseste `adun.ok` pentru ca nu se afla in directorul curent. Directorul din care e rulat verif-ul este un director temporar. Acolo se afla in-ul copiat pentru testul curent, out-ul returnat de sursa evaluata, si executabilul evaluat. Fisierul de ok insa nu e copiat acolo de evalul meu, este in directorul de teste.
De aceea pasez acei parametri: ai sa vezi ca daca printezi [email protected] din bash vor aparea (inlocuieste si tu ? cu orice nr de test):
Cod:
/home/toni/Desktop/eval_alpha/tests/adun/?-adun.in /tmp/UNNUMEDUBIOS/adun.out /home/toni/Desktop/eval_alpha/tests/adun/?-adun.ok
Acelea sunt fisierele cu care vrei sa lucrezi, care iti sunt date cu cale completa.
Mesajul 'Wrong answer in: adun.out' (si scorul) este doar preluat din out-ul verif-ului de catre eval.py si afisat acolo.
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #11 : Mai 07, 2009, 19:43:17 »

Am uploadat versiunea noua a evalului, folosind versiunea noua a eval.py. Sa descriu cam cum functioneaza. Exista 2 moduri :

1. single job mode (user prob)

In acest caz, se ruleaza ruby grader.rb -- prob stud. In directorul stud/$stud/ ar trebui sa existe sursa prob.ext, unde ext = c, c++, pas, pp (pas e pt gnu pascal, pp pentru free pascal). Dupa rularea eval.py, in directorul stud/$stud/ vor exista 2 fisiere, prob.tmp si prob-compile.tmp, in prima se afla borderoul, si in a doua se afla mesajul de compilare. Daca se evalueaza cu single job, se va afisa si outputul acestora in terminal.

2. round mode (round_name)

Va trebui sa existe in directorul contest/ un director round_name, care va contine fisierul de configurare round_name-config.rb, care trebuie sa arate in felul urmator :
Cod:
# This is a sample configuration script for a round

$probs = ["adun"];
$studs = ["judge-1", "judge-2"];


Evaluatorul va include scriptul, $probs si $studs ajungand variabile. Pentru fiecare problema, si fiecare student, se va rula single job, si se vor crea outputurile in stud/$stud/$prob.tmp si stud/$stud/$prob-compile.tmp. Acestea vor urma sa fie parsate la sfarsit pentru a se actualiza clasamentul. Pentru fiecare problema, va trebui sa existe un director prob/nume_problema, in care se vor afla 2 fisiere:

params.rb, care va contine datele despre problema, si care trebuie sa arate in felul urmator :

Cod:
# This is the configuration file for problem adun

# Write here the memory limit (in kilobytes)

$MEM_LIMIT="16384"

# Write here the time limit  (in miliseconds)

$TIME_LIMIT="100"

verif, acesta poate fi orice binar sau script, care afiseaza "Mesaj\nProcent". In caz ca raspunsul este unic, se poate folosi verificatorul initial. Se poate scrie si un verificator in c++, dar trebuie compilat in binarul verif (g++ verif.cpp -o verif).

Verificatorul standard :(este copyright by Mihai Patrascu, l-am luat din evaluatorul sau, si l-am adaptat).
Cod:
[[email protected] eval_alpha]# cat prob/adun/verif
#!/bin/bash
# general file-compare verifier

OFILES=$2
KFILES=$3
IFILES=$1

COMPARE(){
        for O in $OFILES $INT_OFILES ; do
                if [ -z "$1" ]; then
                        echo "FATAL ERROR IN verif: not enough files in KFILES" >&2
                        exit 1
                fi
                if [ ! -r "$O" ]; then
                        echo "FATAL ERROR IN verif: missing $O" >&2
                        exit 1
                fi
                if diff -q -b $O $1 >/dev/null ; then
                        shift
                else
                        printf "Wrong answer in: $O\n0"
                        exit 0
                fi
        done
        if [ ! -z "$1" ]; then
                echo "FATAL ERROR IN verif: more files in KFILES: $*" >&2
                exit 1
        fi
        printf "Okay\n$SCORE"
}

SCORE=100

if [ -z "$OFILES$INT_FILES" ]; then
        echo "FATAL ERROR IN verif: missing OFILES variable!" >&2;
        exit 1
fi
COMPARE $KFILES

Now, the power of ruby (evaluatorul de 2.5 kb).

Cod:
[[email protected] eval_alpha]# cat grader.rb
#!/usr/bin/env ruby

#################################################################################
#                           Grader version 0.1.1 (alpha)                        #
#===============================================================================#
#                           Made by Pripoae Teodor Anton                        #
#                            Distributed under GNU GPL                          #
#################################################################################

USAGE= "STARTUP PROBLEM: usage:\n\
        \t./grader.rb <day-to-evaluate>    -or-\n\
        \t./grader.rb -- <problem> <contestant> \n"

def grader_die (mesg, code)
        if (mesg != USAGE)
                $stdout.puts "Fatal error occurred : " + mesg + "\n\n";
                else
                        $stdout.puts mesg;
        end
        exit (code);
end


def load_round (round)
        $stdout.puts "============ Loading Round " + round + " ============\n";
        require ("contest/" + round + "/" + round + "-config.rb");
end

def grade_student(prob,stud)
        if ($global_grading == false)
                puts "Grading student " + stud + "on problem " + prob + "\n";
        end
        require ("prob/" + prob + "/params.rb");

        system("bash scripts/clear-all.sh");
        system("bash scripts/compile.sh " + stud + " " + prob);
        system("python scripts/eval.py work/theexe --prob " + prob + " --memory=" + $MEM_LIMIT + " --time=" + $TIME_LIMIT + " --verif=prob/" + prob + "/verif  >work/run.tmp");
        system("bash scripts/copy_results.sh " + stud + " " + prob);
end

def grade_round (round)

        stud_no = 0;
        $studs.each {
                stud_no += 1;
        }

        prob_no = 0;
        $probs.each {
                prob_no += 1;
        }

        prob_graded = 0;
        $global_grading = true;

        $probs.each {
                |prob|
                prob_graded += 1;
                puts "******* Problem: " + prob + "[" + prob_graded.to_s + " of " + prob_no.to_s + "]\n";
                stud_graded = 0;
                $studs.each {
                        |stud|
                        stud_graded += 1;
                        print "[processing " + stud_graded.to_s + " of " + stud_no.to_s + "] " + stud + ": comp ";
                        grade_student(prob,stud);
                        puts("");
                }
        }

        $studs.each {
                |stud|
#  system("bash scripts/merge_all_res.sh " + stud );
        }
end

def main_loop

        if (! ARGV[0])
                grader_die(USAGE,1);
        end

        if (! ARGV[1])          # it's round
                load_round(ARGV[0]);
                grade_round(ARGV[0]);

        else
                if (! ARGV[2])
                        grader_die(USAGE,1);
                end
                grade_student(ARGV[1],ARGV[2]);
                puts "\nShowing Compile Details";
                system("cat stud/" + ARGV[2] + "/" + ARGV[1] + "-compile.tmp");
                puts "\nShowing Allres ";
                system("cat stud/" + ARGV[2] + "/" + ARGV[1] + ".tmp");
        end
end

main_loop ;
« Ultima modificare: Mai 07, 2009, 19:57:08 de către Pripoae Teodor Anton » Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #12 : Mai 07, 2009, 20:51:19 »

Am testat evaluatorul pe opensuse 11.1, care vine cu python 2.6, si imi iau urmatorul warning :

Cod:
linux-g88s:/home/tuxdistro/Desktop/eval_alpha # ruby grader.rb test
============ Loading Round test ============
******* Problem: adun[1 of 1]
[processing 1 of 2] judge-1: comp scripts/eval.py:16: DeprecationWarning: The popen2 module is deprecated.  Use the subprocess module.
  from popen2 import popen4 # stres cu asta
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[processing 2 of 2] judge-2: comp scripts/eval.py:16: DeprecationWarning: The popen2 module is deprecated.  Use the subprocess module.
  from popen2 import popen4 # stres cu asta
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #13 : Mai 08, 2009, 14:42:54 »

Da, si eu am patit asta cand am upgradat la Ubuntu 9.04 care vine de asemenea cu Python 2.6. Foloseam o librarie veche, am schimbat de ieri acea bucata si am pus noul script pe pagina contului meu, dar am uitat sa mentionez.
Go get it (poate ar trebui sa fac un fel de versioning, ca sa se reflecte schimbarile)
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #14 : Mai 08, 2009, 16:00:26 »

Am terminat si scriptul care alcatuieste clasamentul si allres-ul, deci pot zice ca e gata evalul. Mai ramane de testat Smile. Am pus link pe profilul meu catre eval. Singura chestie care nu imi place, e ca afiseaza cu culori, si nu se vede bine cand deschizi borderoul cu un editor de texte. Ar merge treaba aia cu -q (quiet).
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #15 : Mai 08, 2009, 20:21:18 »

Gata! Am facut schimbarile.
Acestea sunt modificarile, care sunt reflectate si in `eval.py --help`:
[Changelog de la ver. 0.5 la 0.6]
FEATURES:
Doi noi parametri:
-qafiseaza doar scorul in stdout
-O fisierafiseaza doar scorul in stdout + scrie borderoul (fara culori) in acel fisier

BUGFIXES:
 - elimina culorile daca stdout nu este un tty (adica daca redirectezi sau folosesti un pipe)

Sa-mi zici cum merge
----------------------------------------------------------------------------------------
Apropo eval-ul tau are o mica buba. Cand il rulez prima data incearca sa stearga tot (dar i-au scapat directoarele, ca rm-ul a fost chemat fara -r Tongue) din propriul sau director.
Asta se intampla la clear-all.sh, pt ca faci `cd work` si daca directorul work nu exista, va ajunge sa dea eroare si sa stearga tot din directorul curent...
fixed:
Cod:
##################################################################################################################
#            part of grader scripts, please don't modify it unless you know what you are doing                   #
#================================================================================================================#

# asserts :
#               pwd : eval

if [ -d work ]; then
    rm -rf work/*
fi
« Ultima modificare: Mai 09, 2009, 07:45:16 de către Sanduleac Dan » Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #16 : Mai 09, 2009, 21:28:30 »

Da, asa e, dar nu vad de ce nu ar fi directorul work/. Acum nu prea am acces la eval  Banana (sunt la lot), dar o sa modific cand ma intorc Smile. Mersi de completare. Vezi si tu daca merge cu modificarile zise de tine (e ultima arhiva la mine pe profil).
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #17 : Mai 11, 2009, 07:47:48 »

Pai, cand am extras arhiva nu era Tongue Better safe than sorry, poate il sterge cineva si apoi se mira de ce i-a disparut eval-ul
Bafta multa la lot!!! Il voi da si eu la ora 2
Memorat
cosmina_yup
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #18 : Mai 11, 2009, 09:07:49 »

Felicitari pentru munca depusa!  :DE dificil sa faci un evaluator? Stiu ca e mai greu de facut decat o problema. Cam cat ti-a luat?


Go on! Yahoo!
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #19 : Mai 11, 2009, 20:56:55 »

Este un alt fel de programare. Nu e algoritmica, e "application development". In teorie un evaluator mai rudimentar se face rapid. Asa am inceput si eu, dar dupa aceea am tot adaugat features si am rezolvat diverse probleme ce tot apareau si ma incomodau. Am vazut si ca trebuia sa-l adaptez ca sa fie cat mai general, mai flexibil. Nu poti sa zici ca "ia mult", ci mai degraba ca este un proiect in continua dezvoltare, ca multe altele de acest gen.
Evaluatorul.. l-am inceput in alt limbaj cam acum 2 (3?) ani, l-am portat in python (pt ca era mult mai flexibil si mai productiv si imi inlatura anumite constrangeri) anul trecut, si l-am mai tot imbunatatit de cand l-am scris prima oara in python. Desi am lucrat la el doar din cand in cand, s-au adunat poate 1-2 saptamani de lucru mai consistent. Fiindca a fost folosit si de diriginta mea, si de mine, am avut si ocazia de a gasi mai multe buguri, pe langa faptul ca am primit si sugestii de imbunatatire, si astfel am reusit sa il aduc intr-o stare destul de stabila si user-friendly, zic eu.

Well, multumesc pt incurajare Very Happy
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #20 : Mai 12, 2009, 10:13:01 »

Citat
Modificari de la versiunea 0.5 la 0.61

    * NEW FEATURES
      -q   afiseaza doar scorul in stdout
      -O fisier   afiseaza doar scorul in stdout + scrie borderoul (fara culori) in acel fisier
    * BUGFIXES
       - elimina culorile daca stdout nu este un tty (adica daca redirectezi sau folosesti un pipe)




Legat de scor, am reusit sa scot scorul in urmatorul fel :

Cod:
cat allres.txt | grep Punctaj | awk -F " " '{print $3}' > /tmp/score.tmp
read score </tmp/score.tmp

[LE] Am facut un install script pt jrun, si am atasat arhiva noua.

Cod:

#!/bin/bash

cd jrun

#if [ -f jrun ] ; then
# rm jrun -f
#fi

make clean
make
sudo cp jrun /usr/bin/ -f
« Ultima modificare: Mai 12, 2009, 11:02:33 de către Pripoae Teodor Anton » Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #21 : Mai 12, 2009, 11:27:38 »

Am facut un svn pt eval (ca sa nu mai uploadez toata arhiva cand modific). Sursa se poate lua in felul urmator :

Cod:
svn co http://opensvn.csie.org/eval/ eval
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #22 : Mai 13, 2009, 06:53:38 »

Okay, i-am facut checkout. Nu am avut timp sa vad daca merge though Smile
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #23 : Mai 16, 2009, 17:35:32 »

Okay, i-am facut checkout. Nu am avut timp sa vad daca merge though Smile

Bun Smile. Cred ca am descoperit un bug. Cand sunt 10 teste, nu imi afiseaza punctajul pe test :

Cod:
Testul 1    OK     time 0ms memory 12kb     Execution successful.   
Testul 2    OK     time 0ms memory 8kb      Execution successful.   
Testul 3    OK     time 0ms memory 64kb     Execution successful.   
Testul 4    OK     time 28ms memory 84kb    Execution successful.   
Testul 5    OK     time 47ms memory 84kb    Execution successful.   
Testul 6    OK     time 56ms memory 88kb    Execution successful.   
Testul 7    OK     time 71ms memory 88kb    Execution successful.   
Testul 8    OK     time 87ms memory 88kb    Execution successful.   
Testul 9    OK     time 88ms memory 88kb    Execution successful.   
Testul 10   FAIL   time 117ms memory 88kb   Time limit exceeded.   
Total: 90 -- --

Cand sunt mai multe, imi afiseaza asa :
Cod:
Testul 1    Gresit   0   time 3ms memory 596kb   Execution successful.   
Testul 2    Gresit   0   time 3ms memory 688kb   Execution successful.   
Testul 3    OK       5   time 4ms memory 592kb   Execution successful.   
Testul 4    OK       5   time 0ms memory 104kb   Execution successful.   
Testul 5    OK       5   time 3ms memory 688kb   Execution successful.   
Testul 6    OK       5   time 1ms memory 16kb    Execution successful.   
Testul 7    OK       5   time 4ms memory 584kb   Execution successful.   
Testul 8    Gresit   0   time 2ms memory 584kb   Execution successful.   
Testul 9    OK       5   time 2ms memory 688kb   Execution successful.   
Testul 10   Gresit   0   time 0ms memory 20kb    Execution successful.   
Testul 11   OK       5   time 1ms memory 352kb   Execution successful.   
Testul 12   OK       5   time 3ms memory 684kb   Execution successful.   
Testul 13   Gresit   0   time 0ms memory 584kb   Execution successful.   
Testul 14   OK       5   time 1ms memory 540kb   Execution successful.   
Testul 15   OK       5   time 1ms memory 592kb   Execution successful.   
Testul 16   Gresit   0   time 3ms memory 684kb   Execution successful.   
Testul 17   OK       5   time 2ms memory 692kb   Execution successful.   
Testul 18   OK       5   time 1ms memory 176kb   Execution successful.   
Testul 19   OK       5   time 1ms memory 684kb   Execution successful.   
Testul 20   Gresit   0   time 2ms memory 200kb   Execution successful.   


N-ar trebui sa afiseze si scorul pe teste ?
Memorat
sandyxp
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #24 : Mai 17, 2009, 17:51:35 »

Nu e un bug. Afisarea scorului pe teste are loc doar cand in directorul de teste exista tests.txt, care indica exact cate puncte are fiecare test, ca sa se stie exact de unde vine punctajul. Altfel, scorul pe test este pur si simplu 100/nr_teste. tests.txt contine linii de tipul "i j", i fiind33*88 nr testului iar j punctele pt acel test.
Memorat
Pagini: [1] 2   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines