infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Sanduleac Dan din Aprilie 11, 2009, 19:10:52



Titlul: Yet another evaluator, wrote by me (0.65 stable)
Scris de: Sanduleac Dan din 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 (http://infoarena.ro/documentatie/evaluator), 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 (http://bitbucket.org/dan.sanduleac/eval2/wiki/Home)


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 (http://bitbucket.org/dan.sanduleac/eval2/downloads) ş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 (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 (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 (http://bitbucket.org/dan.sanduleac/eval2/downloads/jrun.zip), î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 (http://infoarena.ro/utilizator/sandyxp?action=download&file=jrun.zip)


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Sima Cotizo din 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:


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Sanduleac Dan din Aprilie 13, 2009, 20:00:49
Much appreciated. Chiar eram nedumerit unde sa-l incadrez, deci iti multumesc :D
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 ?  :thumbup:


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Sanduleac Dan din 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 :D



Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Pripoae Teodor Anton din 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


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Sanduleac Dan din 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 (http://shootout.alioth.debian.org/) 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.


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Pripoae Teodor Anton din 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.


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.


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Pripoae Teodor Anton din 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:


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Sanduleac Dan din 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()) :D


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Pripoae Teodor Anton din 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 :D (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 :D, 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  (http://infoarena.ro/utilizator/toni2007?action=download&file=eval_alpha.tar.gz&safe_only=false).

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>


Titlul: Răspuns: Răspuns: Yet another evaluator, wrote by me
Scris de: Sanduleac Dan din Mai 07, 2009, 19:05:56
Ne-am sincronizat, ca sa vezi.

[raspuns la ultimul post]
Ma bucur ca e chiar ce-ti trebuia :P 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 [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.


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Pripoae Teodor Anton din 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 ;


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Pripoae Teodor Anton din 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


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Sanduleac Dan din 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 (http://infoarena.ro/utilizator/sandyxp?action=download&file=eval.py) (poate ar trebui sa fac un fel de versioning, ca sa se reflecte schimbarile)


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Pripoae Teodor Anton din 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).


Titlul: Răspuns: Yet another evaluator, wrote by me
Scris de: Sanduleac Dan din 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 :P) 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


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: Pripoae Teodor Anton din 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 :). Mersi de completare. Vezi si tu daca merge cu modificarile zise de tine (e ultima arhiva la mine pe profil).


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: Sanduleac Dan din Mai 11, 2009, 07:47:48
Pai, cand am extras arhiva nu era :P 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


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: trip flip din 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:


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: Sanduleac Dan din 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 :D


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: Pripoae Teodor Anton din 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


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: Pripoae Teodor Anton din Mai 12, 2009, 11:27:38
Am facut un svn (https://opensvn.csie.org/eval/) 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


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: Sanduleac Dan din Mai 13, 2009, 06:53:38
Okay, i-am facut checkout. Nu am avut timp sa vad daca merge though :)


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: Pripoae Teodor Anton din 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 :

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 ?


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Sanduleac Dan din 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.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Sanduleac Dan din Mai 28, 2009, 20:31:22
Am postat in pagina mea "nightly buildul" noii versiuni care este "currently in development", pt toni.
Pentru ca am facut multe modificari si restructurari programului, care nu au fost inca finalizate (sau testate), acesta este inca o pre-versiune a versiunii 0.64 (hence the -13 de la revizia 13).
Programul este backwards compatible cu 0.62.
Una din functiile noi: afiseaza borderoul dupa cum mi-a cerut toni (hopefully).
Folosire: consoleapp.py a inlocuit fostul eval.py. Rulati consoleapp.py.
Pentru interfata de consola este nevoie de consoleapp.py si evalcore.py.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Pripoae Teodor Anton din Mai 28, 2009, 21:38:38
Am reusit sa termin in sfarsit evalul :). Varianta finala se gaseste aici (http://opensvn.csie.org/eval), si se poate lua cu urmatoarea comanda, din linux :

Cod:
svn checkout http://opensvn.csie.org/eval eval

Deocamdata, evalul suporta probleme normale (folosind evaluatorul scris de Dan), probleme de output-only si interactive, cu un eval scris de mine, putand evalua atat runde normale, cat si un singur user pe o singura problema (pt site-uri cu evaluator automat). In caz ca se arata cineva interesat, voi scrie un hotwo pt instalare si folosire.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.61 beta)
Scris de: Alexandru Pana din Iunie 11, 2009, 14:57:08
Este un alt fel de programare. Nu e algoritmica, e "application development".

Nu te supara, dar nu ma pot abtine: nu exista alt fel de programare. Toate programele sunt 'algoritmica'. In rest, pare simpatic evaluatorul tau, spor in continuare.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Pripoae Teodor Anton din Iunie 11, 2009, 20:13:57
Nu e adevarat :). Sunt unele aplicatii pentru care nu trebuie sa stii deloc algoritmi: applets, scripturi, si alte programe care sunt utile inainte de a fi eficiente.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Alexandru Pana din Iunie 12, 2009, 09:21:01
Uite un citat de pe wiki: "In mathematics, computing, linguistics, and related subjects, an algorithm is a finite sequence of instructions, an explicit, step-by-step procedure for solving a problem, often used for calculation and data processing."

Algoritmul nu implica eficienta si nu exclude pragmatismul. Orice succesiune finita de instructiuni aplicata la rezolvarea unei probleme se numeste algoritm. Fie ca e o carte de bucate, applet sau engine-ul grafic al unui joc.

Algoritm nu inseamna doar "Algoritmul lui X" cu o complexitate cat mai mica.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Sima Cotizo din Iunie 12, 2009, 09:29:53
Discutia devine offtopic. Daca ar fi sa ne luam de exprimari, sunt tare curios daca ai auzit de "algoritmul de prajit cartofi"...


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Alexandru Pana din Iunie 12, 2009, 09:33:48
Discutia devine offtopic. Daca ar fi sa ne luam de exprimari, sunt tare curios daca ai auzit de "algoritmul de prajit cartofi"...

Da, am auzit chiar si de algoritmul de prajit oua. Vrei sa facem si paine?


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Sima Cotizo din Iunie 12, 2009, 09:59:12
Discutia devine offtopic. Daca ar fi sa ne luam de exprimari, sunt tare curios daca ai auzit de "algoritmul de prajit cartofi"...

Da, am auzit chiar si de algoritmul de prajit oua. Vrei sa facem si paine?

Consider ca te indepartezi mult. Poti deschide topic nou in sectiunea offtopic. Alte mesaje scrise aici pe tema asta iti vor fi sterse.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Sanduleac Dan din Iunie 12, 2009, 12:55:30
Am actualizat primul mesaj pentru a reflecta noua versiune, 0.64 rc1.
Mie mi se pare stabila, dar nu am avut posibilitatea de a o testa foarte mult.
Daca gasiti buguri, va rog raportati :)

Aceasta versiune introduce cateva adaugiri si schimbari nu neaparat majore.
In schimb, a fost reorganizata masiv, in materie de cod, fata de 0.62, pentru a fi mai usor de dezolvat si mai usor de refolosit intr-un proiect mai amplu.
0.64 este backwards compatible cu 0.62 in ceea ce priveste parametrii pe care ii primeste si fisierul de configurare, insa afisarea a fost modificata pentru a arata mai prezentabil.
Una dintre schimbarile importante a fost separarea codului de evaluare de codul de "interfata" de consola. De aici a reiesit in mod natural reorganizarea aplicatiei pe mai multe fisiere. Prin aceasta, am putut apoi cu usurinta incepe dezvoltarea unei interfete grafice folosind GTK si Python.
(puteti sa o incercati prin rularea guiapp.py)


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Savin Tiberiu din Iunie 27, 2009, 15:21:18
Ai pus pe svn  ultimele modificari? si toate fisierele? ca eu nu gasesc config.py si nici guiapp.py. Am incercat sa evaluez si eu o problema cu consoleapp.py si nu mi-a mers zicand ca nu gaseste directorul cu teste, si nu prea stiu cum il setez. Vroiam si eu sa fac ceva dev la evalu asta, de fapt vroiam sa fac si eu o interfata gui numai ca vroiam sa o fac in Java folosind swing.


Titlul: Răspuns: Yet another evaluator, wrote by me (stable - 0.64 rc1; dev - 0.65)
Scris de: Sanduleac Dan din Iunie 27, 2009, 16:33:04
Merge sa-i faci o interfata swing, daca rulezi evalul din Jython din cadrul lui java, in loc sa folosesti CPython care e "default".

In legatura cu lipsa fisierelor, nu stiu ce sa zic ca s-a intamplat, daca intru din browser pe acel link vad toate fisierele prezente.
config.py trebuie sa contina doar linia:
TestDBRoot = 'o cale pentru directorul de teste'
pentru ca evalul sa functioneze. Dar mi se pare ciudat ca nu gasesti fisierele, nu iti apar cand intri aici ?
http://informatrix.ro/svn/eval2/tags/stable-0.6/ (http://informatrix.ro/svn/eval2/tags/stable-0.6/)


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1; dev - 0.65)
Scris de: Sanduleac Dan din Iunie 27, 2009, 18:50:57
Am scos versiunea 0.65 cu niste modificari mari la structura programului si cateva bugfixuri. De asemenea am modificat guiapp sa foloseasca output generat de consoleapp pentru fereastra de 'log' a sa. Well, pe cine intereseaza  :)

Aceasta versiune este inca netestata, si am creat un branch special pt ea, in general pentru ultima versiune a programului care este cat de cat stabila, 'testing'. Puteti s-o descarcati prin svn:

svn co http://informatrix.ro/svn/eval/eval2/branches/testing-0.6 eval2-testing

CHANGELOG-ul e in directorul aplicatiei, sau puteti sa-l accesati direct la adresa aceasta (http://informatrix.ro/svn/eval/eval2/branches/testing-0.6/CHANGELOG)

Apropo, devil, daca mai vrei sa dezvolti in java un GUI, ultimul release 'stable' nu va merge cu Jython. Merge in schimb versiunea 0.65 de sub testing


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.62 beta)
Scris de: Andrei Misarca din August 26, 2009, 14:18:15
In caz ca se arata cineva interesat, voi scrie un hotwo pt instalare si folosire.

Ar merita sa scri si un howto. Eu cel putin chiar sunt interesat cum se foloseste :D


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Sanduleac Dan din August 26, 2009, 14:30:04
Am impresia ca proiectele noastre (al meu si al lui toni) au cam stagnat. Cu toate astea, ambele erau functionale ultima data cand am verificat.
http://informatrix.ro/svn/eval/eval2/branches/testing-0.6 (http://informatrix.ro/svn/eval/eval2/branches/testing-0.6) - cred ca uitasem sa actualizez linkul catre svn-ul meu, s-a schimbat.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Andrei Misarca din August 26, 2009, 14:37:15
Ambele fiind functionale, cred ca ar merge scris un ghid de folosire :)


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Pripoae Teodor Anton din August 27, 2009, 19:42:31
L-am scris in graba, e posibil sa mai fie ceva greseli (http://bitbucket.org/toni/eval/wiki/Home).


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Andrei Misarca din August 28, 2009, 19:19:21
Good job Toni ! =D&gt;
Insa cand ii dau comanda
Cod:
./scripts/add-contest mycontest
imi creaza doar un folder contest, dar in el nu se afla nimic.
iar add-problem nu am vazut niciun script sau executabil pe acolo :)
Si de asemenea nu am gasit niciun executabil grader :)


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Pripoae Teodor Anton din August 28, 2009, 23:17:36
Am uitat sa pun ultima versiune  :-', scrisesem tutorialul si apoi am adaugat scripturile pt add-contest si add-problem. Iar in loc de grader este grader.rb :).

LE : Am modificat, si am updatat si in wiki. Daca iei acum ultima versiune a sursei de pe site, va merge.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Andrei Misarca din August 29, 2009, 09:32:37
Merge  :winner1:
Este posibil ca la o problema sa existe si un eval, si daca da cum trebe facut?


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.64 rc1)
Scris de: Pripoae Teodor Anton din August 29, 2009, 15:21:12
Sigur, inlocuiesti fisierul judge din directorul problemei cu alt fisier (script sau executabil) cu numele "judge", care va primi ca parametrii "fisier.in fisier.out fisier.ok", si va afisa raspunsul sub forma : "mesaj\n(procent punctaj din max)" (ex : "gresit\n0" sau "ok\n100"), asta pentru problemele classical, iar pentru cele output only de forma "mesaj\npunctaj" (ex : "gresit\n0" sau "ok\n10"). Pentru cele interactive este mai greu, pt ca in eval este de fapt hardcodat pipe-ul cu procesul, si e destul de greu de modificat pentru cineva care nu prea stie chestii de genul "fork", "pipe", etc. Am sa scriu un tutorial cand voi avea timp.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.65 in svn only)
Scris de: Sanduleac Dan din Septembrie 01, 2009, 15:58:15
@toni: Te-as sfatui sa schimbi in evalul tau folosirea fisierelor temporare cu nume unic
Ca idee, de ex daca doi useri lucreaza pe acelasi calculator cu evalul tau, unul dintre ei va crea fisierul temporar nush care, iar celalalt va primi frumos access denied pe acel fisier din momentul acela incolo. Asadar, foloseste `mktemp` ca sa creezi un fisier temporar cu nume random, si sterge-l dupa folosire.  (comanda iti returneaza numele fisierului generat)

Asa, si 2:
Dupa ce rulezi evalul tau, va modifica (adica suprascrie probabil) niste fisiere care nu au ce cauta acolo de la bun inceput (acolo, adica in repository). Dupa ce le modifica, daca vrei sa faci commit, le tragi dupa tine pe alea modificate degeaba.
Ma refer la
Cod:
M contest/test/allres.txt
M contest/test/scores.txt
M scripts/evalcore.pyc
nu stiu daca sunt si altele. In orice caz, scapa de pyc, ca ala se genereaza automat la prima folosire, si de txt-uri :)

Edit:
inca ceva, pentru runde mai bine nu zici decat numele problemelor, iar utilizatorii sa fie sub forma de foldere cu numele lor intr-un director de utilizatori, evaluatorul evaluand automat pe toti userii dintr-un folder dat, pe acele probleme. (mai flexibil asa)


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.65 in svn only)
Scris de: Pripoae Teodor Anton din Septembrie 01, 2009, 19:48:02
Eu lucram oricum cu evaluatorul in alt director, deci nu aveam probleme cu rularea. Oricum o sa pun in .hgignore acele fisiere. Legat de mktemp, n-am mai facut un alt release la eval (e tot versiunea 0.91), am tot zis ca modific, dar n-am avut timp. Nu pot pune sa evalueze un director intreg, pt ca astfel ar evalua toti concurentii, iar daca am userii de la 2 concursuri ar evalua tot.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.65 in svn only)
Scris de: Sanduleac Dan din Septembrie 02, 2009, 12:06:41
Nu pot pune sa evalueze un director intreg, pt ca astfel ar evalua toti concurentii, iar daca am userii de la 2 concursuri ar evalua tot.

da, dar poti sa separi de la bun inceput utilizatorii in directoare corespunzatoare concursului, care sa nu fie neaparat in dir unde e evalul tau, ci oriunde. Chiar si daca ar fi in acelasi dir, poti avea cv gen "stud/<round_name>/<username>/..." si aclo sa fie sursele.


Titlul: Răspuns: Yet another evaluator, wrote by me (current - 0.65 in svn only)
Scris de: Sanduleac Dan din Septembrie 09, 2009, 14:45:04
Un ghid incepe sa fie publicat pentru evaluatorul meu aici: http://bitbucket.org/dan.sanduleac/eval2/wiki/Home (http://bitbucket.org/dan.sanduleac/eval2/wiki/Home)
Evaluatorul meu e cel pe care se bazeaza cel facut de toni, al lui implementand in plus fata de al meu posibilitatea evaluarii de runde intregi (mai multi utilizatori, mai multe probleme de-odata, totul automat).
Momentan, in ghidul meu nu apar decat o introducere simpla si putine detalii de implementare, un "Cum se foloseste" urmand a fi scris in curand. Oricum, daca sunteti interesati, probabil veti folosi mai degraba interfata facuta de toni pentru ca ofera mai multe functii ;)
In schimb, daca vreti sa stiti cum functioneaza ambele evaluatoare, ghidul acesta va va ajuta mult