This shows you the differences between two versions of the page.
pp:22:teme:haskell-graph-zoo [2022/04/19 16:38] mihnea.muraru [Etapa 2] |
pp:22:teme:haskell-graph-zoo [2022/05/04 14:49] (current) bot.pp |
||
---|---|---|---|
Line 2: | Line 2: | ||
* Data publicării: 12.04.2022 | * Data publicării: 12.04.2022 | ||
- | * Data ultimei modificări: 19.04.2022 | + | * Data ultimei modificări: 04.05.2022 |
+ | * Deadline hard: ziua laboratorului 10 | ||
* [[https://curs.upb.ro/2021/mod/forum/view.php?id=208281|Forum temă]] | * [[https://curs.upb.ro/2021/mod/forum/view.php?id=208281|Forum temă]] | ||
* [[https://vmchecker.cs.pub.ro/ui/#PP|vmchecker]] | * [[https://vmchecker.cs.pub.ro/ui/#PP|vmchecker]] | ||
Line 28: | Line 29: | ||
Așa cum se poate observa, **ziua deadline-ului variază în funcție de semigrupa în care sunteți repartizați**. **Restanțierii care refac tema și nu refac laboratorul beneficiază de ultimul deadline** (deci vor avea deadline-uri în zilele de 02.05, 09.05, 16.05). | Așa cum se poate observa, **ziua deadline-ului variază în funcție de semigrupa în care sunteți repartizați**. **Restanțierii care refac tema și nu refac laboratorul beneficiază de ultimul deadline** (deci vor avea deadline-uri în zilele de 02.05, 09.05, 16.05). | ||
- | **Rezolvările tuturor etapelor pot fi trimise până în ziua laboratorului 10**, dar orice exercițiu trimis după deadline se punctează cu **jumătate** din punctaj. Nota finală pe etapă se calculează conform formulei: **n = (n1 + n2) / 2** (n1 = nota obținută înainte de deadline; n2 = nota obținută după deadline). Când toate submisiile sunt înainte de deadline, nota pe ultima submisie este și nota finală (întrucât n1 = n2). | + | **Rezolvările tuturor etapelor pot fi trimise până în ziua laboratorului 10** (**deadline hard pentru toate etapele**). Orice exercițiu trimis după un **deadline soft** se punctează cu **jumătate** din punctaj. Cu alte cuvinte, nota finală pe etapă se calculează conform formulei: **n = (n1 + n2) / 2** (n1 = nota obținută înainte de deadline; n2 = nota obținută după deadline). Când toate submisiile sunt înainte de deadline, nota pe ultima submisie este și nota finală (întrucât n1 = n2). |
În fiecare etapă, veți folosi ce ați învățat în săptămâna anterioară pentru a dezvolta aplicația. | În fiecare etapă, veți folosi ce ați învățat în săptămâna anterioară pentru a dezvolta aplicația. | ||
Line 49: | Line 50: | ||
* **evaluare leneșă**, implicită în Haskell, pentru decuplarea conceptuală a construcției unei structuri de parcurgerea acesteia. | * **evaluare leneșă**, implicită în Haskell, pentru decuplarea conceptuală a construcției unei structuri de parcurgerea acesteia. | ||
- | În schelet veți găsi două module: | + | În **schelet** veți găsi două module: |
* ''%%StandardGraph%%'': conține **reprezentarea** grafului orientat și funcții de **acces și manipulare**: | * ''%%StandardGraph%%'': conține **reprezentarea** grafului orientat și funcții de **acces și manipulare**: | ||
Line 163: | Line 164: | ||
* Toate funcțiile vor fi implementate **CU recursivitate explicită**. | * Toate funcțiile vor fi implementate **CU recursivitate explicită**. | ||
* Veți observa că implementările funcțiilor ''%%removeNode%%'', ''%%splitNode%%'' și ''%%mergeNodes%%'' respectă un **tipar similar**, pe care vom căuta să îl generalizăm în etapa 3. | * Veți observa că implementările funcțiilor ''%%removeNode%%'', ''%%splitNode%%'' și ''%%mergeNodes%%'' respectă un **tipar similar**, pe care vom căuta să îl generalizăm în etapa 3. | ||
+ | * **ATENȚIE!** Funcțiile de mai sus trebuie să opereze **direct pe reprezentarea algebrică** din această etapă. **NU este permisă** convertirea în reprezentarea din etapa 1 și utilizarea funcțiilor de acolo. | ||
* ''%%Modular%%'': conține momentan doar câteva funcții pentru determinarea **descompunerii modulare** a grafului, dar va fi îmbogățit în etapa 3: | * ''%%Modular%%'': conține momentan doar câteva funcții pentru determinarea **descompunerii modulare** a grafului, dar va fi îmbogățit în etapa 3: | ||
* Funcția ''%%mapSingle%%'' este asemănătoare cu ''%%map%%'', în sensul că aplică o funcție asupra fiecărui element al unei liste, dar aplicarea se face asupra unui **singur element** din listă la un moment dat, celelalte rămânând nemodificate. | * Funcția ''%%mapSingle%%'' este asemănătoare cu ''%%map%%'', în sensul că aplică o funcție asupra fiecărui element al unei liste, dar aplicarea se face asupra unui **singur element** din listă la un moment dat, celelalte rămânând nemodificate. | ||
* Funcția ''%%partitions%%'' generează toate partițiile unei liste. | * Funcția ''%%partitions%%'' generează toate partițiile unei liste. | ||
+ | |||
+ | ===== Etapa 3 ===== | ||
+ | |||
+ | În această etapă: | ||
+ | |||
+ | * veți continua să lucrați cu reprezentarea **algebrică** a grafurilor, cu care v-ați familiarizat în etapa 2 | ||
+ | * veți înzestra reprezentarea cu funcționalități standard (de exemplu, de descriere sub formă de șir de caractere sau de verificare a egalității), utilizând instanțe de **clase** | ||
+ | * veți defini anumite **funcționale pe grafuri**, pentru a observa cum funcționalele pe liste pot fi **generalizate**, întrucât ele surprind tipare universale de prelucrare a structurilor | ||
+ | * veți **redefini** anumite funcții din etapa 2 pentru a utiliza funcționalele de mai sus | ||
+ | * în cea mai mare parte pentru bonus, veți continua să implementați funcționalitatea de **compactare** a reprezentării unui graf, începută în etapa 2. | ||
+ | |||
+ | Construcțiile și mecanismele noi de limbaj pe care le veți exploata în rezolvare, pe lângă cele din etapa 2, sunt: | ||
+ | |||
+ | * **polimorfismul ad-hoc** și **clasele**. | ||
+ | |||
+ | Ca încălzire, amintiți-vă că ați operat până acum cu **două reprezentări** ale grafurilor, ''%%StandardGraph%%'' și ''%%AlgebraicGraph%%'', și că ați implementat același set de funcții de acces și manipulare pentru amândouă (''%%nodes%%'', ''%%edges%%'' etc.). Gândiți-vă cum ați putea **generaliza** această interfață de lucru cu grafuri în Haskell: | ||
+ | |||
+ | * Cum ați defini o **clasă** care să surprindă conceptul de graf orientat? Ați parametriza-o cu **tipul concret** (de exemplu, ''%%AlgebraicGraph a%%'') sau cu **constructorul de tip** în sine (de exemplu, ''%%AlgebraicGraph%%'')? | ||
+ | * Cum ar arăta **tipul** funcției ''%%nodes%%'' dacă ar fi definită în interiorul acestei clase? | ||
+ | |||
+ | Schițați răspunsul în comentarii în vederea **prezentării** (partea aceasta nu este testată automat). | ||
+ | |||
+ | În etapa 3, **scheletul** conține următoarele module: | ||
+ | |||
+ | * ''%%AlgebraicGraph%%'' | ||
+ | * Funcțiile ''%%nodes%%'', ''%%edges%%'', ''%%outNeighbors%%'', ''%%inNeighbors%%'' sunt cele din etapa 2. | ||
+ | * Instanța clasei ''%%Num%%'' permite interpretarea unei **expresii aritmetice** ca un graf algebric, în care literalii numerici sunt etichete de noduri, iar adunarea și înmulțirea reprezintă operațiile ''%%Overlay%%'', respectiv ''%%Connect%%''. De exemplu, graful din diagrama de mai sus poate fi reprezentat prin expresia aritmetică ''%%((1*2) * (3+4)) * 5%%''. | ||
+ | * Instanța clasei ''%%Show%%'' permite descrierea grafului sub forma unui **șir de caractere**, utilizând perspectiva aritmetică de mai sus. | ||
+ | * Instanța clasei ''%%Eq%%'' permite verificarea corectă a **egalității** dintre două grafuri algebrice, ținând cont că același graf conceptual poate avea două descrieri simbolice diferite. | ||
+ | * Funcția ''%%extend%%'' permite **elaborarea** unui graf, prin atașarea unor subgrafuri oarecare în locul nodurilor, în baza unei funcții de corespondență. Funcția ''%%extend%%'' constituie **baza implementării** tuturor operațiilor de mai jos. | ||
+ | * Funcția familiară ''%%splitNode%%'' va fi **reimplementată** utilizând ''%%extend%%''. | ||
+ | * Instanța clasei ''%%Functor%%'', prin operația ''%%fmap%%'', **generalizează** funcționala ''%%map%%'' de pe liste pe grafuri, permițând **aplicarea unei funcții** pe toate etichetele nodurilor dintr-un graf. Implementarea va utiliza ''%%extend%%''. | ||
+ | * Funcția familiară ''%%mergeNodes%%'' va fi **reimplementată** utilizând ''%%fmap%%''. | ||
+ | * Funcționala ''%%filterGraph%%'' **generalizează** funcționala ''%%filter%%'' de pe liste pe grafuri, pentru a **păstra** doar nodurile ale căror etichete satisfac o proprietate. Implementarea va utiliza ''%%extend%%''. | ||
+ | * Funcția familiară ''%%removeNode%%'' va fi **reimplementată** utilizând ''%%filterGraph%%''. | ||
+ | * ''%%Modular%%'' | ||
+ | * Funcțiile ''%%mapSingle%%'' și ''%%partitions%%'' sunt cele din etapa 2. | ||
+ | * Funcția ''%%isModule%%'' verifică dacă o mulțime candidat de noduri constituie într-adevăr un **modul** (vedeți explicațiile din etapa 2). | ||
+ | * Funcția ''%%isModularPartition%%'' verifică dacă o partiție candidat este într-adevăr **modulară**, i.e. dacă toate **submulțimile** sunt module. | ||
+ | * Funcția ''%%maximalModularPartition%%'' determină cea mai acoperitoare partiție, pornind de la lista tuturor partițiilor mulțimii de noduri (vedeți explicațiile din comentarii). | ||
+ | * Funcția ''%%modularlyDecompose%%'' este **deja implementată**, și vă permite să puneți cap la cap funcțiile de mai sus. | ||
===== Precizări ===== | ===== Precizări ===== | ||
Line 177: | Line 220: | ||
* [[https://ocw.cs.pub.ro/courses/_media/pp/22/teme/haskell/etapa1.zip|Schelet etapa 1]] | * [[https://ocw.cs.pub.ro/courses/_media/pp/22/teme/haskell/etapa1.zip|Schelet etapa 1]] | ||
* [[https://ocw.cs.pub.ro/courses/_media/pp/22/teme/haskell/etapa2.zip|Schelet etapa 2]] | * [[https://ocw.cs.pub.ro/courses/_media/pp/22/teme/haskell/etapa2.zip|Schelet etapa 2]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/_media/pp/22/teme/haskell/etapa3.zip|Schelet etapa 3]] | ||
===== Referințe ===== | ===== Referințe ===== | ||
Line 184: | Line 228: | ||
===== Changelog ===== | ===== Changelog ===== | ||
+ | * 04.05 (14:50) - Clarificare deadline hard | ||
+ | * 01.05 (19:40) | ||
+ | * Etapa 2 - Flexibilizare testPartitions pentru a nu ține cont de ordinea elementelor și a submulțimilor. | ||
+ | * Etapa 3 - Flexibilizare testMaximalModularPartition pentru a ține cont de ambele descompuneri valide de la ultimul subtest. | ||
+ | * 29.04 (11:35) - Etapa 3 - Publicare | ||
* 19.04 (16:30) - Etapa 2 - Publicare | * 19.04 (16:30) - Etapa 2 - Publicare | ||
* 17.04 (18:54) - Etapa 1 - Actualizare checker, subtest 10 de la bfs, care apela dfs în loc de bfs. | * 17.04 (18:54) - Etapa 1 - Actualizare checker, subtest 10 de la bfs, care apela dfs în loc de bfs. |