•sandyxp
Strain
Karma: -1
Deconectat
Mesaje: 39
|
 |
« : 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 aiciCum î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 oriunde | | Să 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 teste | | Exemplu: "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: 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: 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 testeEvaluatorul 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: dan@Core: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 dan@Core: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
|
 |
« 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! 
|
|
|
Memorat
|
|
|
|
•sandyxp
Strain
Karma: -1
Deconectat
Mesaje: 39
|
 |
« Răspunde #2 : Aprilie 13, 2009, 20:00:49 » |
|
Much appreciated. Chiar eram nedumerit unde sa-l incadrez, deci iti multumesc  So, unde ai gasit timp sa mai si rasfoiesti infoarena la ONI ? Intriguing Sper sa mai vada si alta lume threadul  Sau poate chiar au toti cate un evaluator bun, scris de ei, la purtator. Mai stii ? 
|
|
|
Memorat
|
|
|
|
•sandyxp
Strain
Karma: -1
Deconectat
Mesaje: 39
|
 |
« 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 
|
|
« Ultima modificare: Aprilie 25, 2009, 09:28:34 de către Savin Tiberiu »
|
Memorat
|
|
|
|
•toni2007
|
 |
« 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 :
|
|
« Ultima modificare: Aprilie 25, 2009, 19:55:41 de către Pripoae Teodor Anton »
|
Memorat
|
|
|
|
•sandyxp
Strain
Karma: -1
Deconectat
Mesaje: 39
|
 |
« 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 : Aa, pai uite-te in eval.py --help. Ca zice acolo asa: -t TIME, --time=TIME time limit in milisecunde -m MEM, --memory=MEM limita memorie, kb in which case, folosesti: ./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
|
 |
« 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  . 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. 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... [toni@centos-minimal-vm 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;
[toni@centos-minimal-vm 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
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
|
 |
« 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: #!/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 : [root@centos-minimal-vm 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 : [root@centos-minimal-vm 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 
|
|
|
Memorat
|
|
|
|
•sandyxp
Strain
Karma: -1
Deconectat
Mesaje: 39
|
 |
« 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  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  gets.chomp.to_i parca e nefiresc, mai degraba un int(f.readline().trim()) 
|
|
|
Memorat
|
|
|
|
•toni2007
|
 |
« 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  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  (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  , 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. [root@centos-minimal-vm eval_alpha]# ruby grader.rb STARTUP PROBLEM: usage: ./grader.rb <day-to-evaluate> -or- ./grader.rb -- <problem> <contestant>
|
|
|
Memorat
|
|
|
|
•sandyxp
Strain
Karma: -1
Deconectat
Mesaje: 39
|
 |
« 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  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  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 $@ din bash vor aparea (inlocuieste si tu ? cu orice nr de test): /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
|
 |
« 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 : # 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 : # 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). [root@centos-minimal-vm 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). [root@centos-minimal-vm 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
|
 |
« 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 : 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
Mesaje: 39
|
 |
« 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
|
 |
« 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  . 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
Mesaje: 39
|
 |
« 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: -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) 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  ) 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: ################################################################################################################## # 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
|
 |
« 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  (sunt la lot), dar o sa modific cand ma intorc  . 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
Mesaje: 39
|
 |
« Răspunde #17 : Mai 11, 2009, 07:47:48 » |
|
Pai, cand am extras arhiva nu era  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
Mesaje: 11
|
 |
« 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! 
|
|
|
Memorat
|
|
|
|
•sandyxp
Strain
Karma: -1
Deconectat
Mesaje: 39
|
 |
« 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 
|
|
|
Memorat
|
|
|
|
•toni2007
|
 |
« Răspunde #20 : Mai 12, 2009, 10:13:01 » |
|
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 : 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. #!/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
|
 |
« 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 : svn co http://opensvn.csie.org/eval/ eval
|
|
|
Memorat
|
|
|
|
•sandyxp
Strain
Karma: -1
Deconectat
Mesaje: 39
|
 |
« Răspunde #22 : Mai 13, 2009, 06:53:38 » |
|
Okay, i-am facut checkout. Nu am avut timp sa vad daca merge though 
|
|
|
Memorat
|
|
|
|
•toni2007
|
 |
« Răspunde #23 : Mai 16, 2009, 17:35:32 » |
|
Okay, i-am facut checkout. Nu am avut timp sa vad daca merge though  Bun  . Cred ca am descoperit un bug. Cand sunt 10 teste, nu imi afiseaza punctajul pe test : 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 : 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
Mesaje: 39
|
 |
« 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
|
|
|
|
|