Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pp:22:teme:haskell-graph-zoo [2022/04/19 17:26]
bot.pp
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 167: Line 168:
     * 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 178: 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 185: 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.
pp/22/teme/haskell-graph-zoo.1650378405.txt.gz · Last modified: 2022/04/19 17:26 by bot.pp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0