This shows you the differences between two versions of the page.
|
pp:26:teme:haskell-graphs-draft [2026/04/26 20:36] mihnea.muraru [Descriere generală și organizare] |
pp:26:teme:haskell-graphs-draft [2026/04/26 23:02] (current) mihnea.muraru [Haskell: Graph Zoo] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Haskell: Graph Zoo ====== | ====== Haskell: Graph Zoo ====== | ||
| - | * Data publicării: 26.04.2026 | + | * Data publicării: 27.04.2026 |
| - | * Data ultimei modificări: 26.04.2026 | + | * Data ultimei modificări: 27.04.2026 |
| * Deadline hard: ziua laboratorului 12 | * Deadline hard: ziua laboratorului 12 | ||
| * Forum temă | * Forum temă | ||
| Line 56: | Line 56: | ||
| * Funcția ''%%splitNode%%'' **sparge** un nod în mai multe noduri, ținând cond de arcele nodului inițial. | * Funcția ''%%splitNode%%'' **sparge** un nod în mai multe noduri, ținând cond de arcele nodului inițial. | ||
| * Funcția ''%%mergeNodes%%'' **îmbină** mai multe noduri într-unul singur, ținând cont de arcele nodurilor inițiale. | * Funcția ''%%mergeNodes%%'' **îmbină** mai multe noduri într-unul singur, ținând cont de arcele nodurilor inițiale. | ||
| - | * ''%%Algorithms%%'': conține algoritmii standard de **căutare**, BFS și DFS: | + | * ''%%Algorithms%%'': conține algoritmii standard de **căutare**, BFS și DFS, **restricționați** pentru simplitate la grafuri pentru care nu există mai multe căi între două noduri și nici cicluri. |
| - | * Funcțiile ''%%bfs%%'' și ''%%dfs%%'' întorc lista de noduri parcurse în ordinea aferentă **căutării în lățime**, respectiv **în adâncime**, pornind de la un anumit nod, ținând cont și de posibilele cicluri. Aceste funcții vor fi **derivate** dintr-o funcție mai generală, menționată în continuare. | + | * Funcțiile ''%%bfs%%'' și ''%%dfs%%'' întorc lista de noduri parcurse în ordinea aferentă **căutării în lățime**, respectiv **în adâncime**, pornind de la un anumit nod. |
| - | * Funcția ''%%search%%'' **generalizează** cele două strategii de căutare de mai sus, plecând de la observația că principala diferență dintre ele este modul în care se **combină** la un moment dat nodurile deja existente în structura de date utilizată (stivă/coadă, ambele reprezentate ca liste standard) cu vecinii proaspăt expandați ai nodului curent. Funcția **nu este testată direct**. | + | |
| * Funcția ''%%countIntermediate%%'' verifică **existența unei căi** între două noduri din graf, și calculează **numărul nodurilor intermediare** pe care le expandează cele două strategii de mai sus pentru acest scop. | * Funcția ''%%countIntermediate%%'' verifică **existența unei căi** între două noduri din graf, și calculează **numărul nodurilor intermediare** pe care le expandează cele două strategii de mai sus pentru acest scop. | ||
| Line 75: | Line 74: | ||
| Găsiți detalii despre **funcționalitate** și **implementare**, precum și **exemple**, direct în codul sursă. Aveți de completat definițiile care încep cu **''%%*** TODO ***%%''**. | Găsiți detalii despre **funcționalitate** și **implementare**, precum și **exemple**, direct în codul sursă. Aveți de completat definițiile care încep cu **''%%*** TODO ***%%''**. | ||
| - | Se impun următoarele **constrângeri** de implementare: | + | Se impun următoarele **constrângeri** de implementare asupra funcțiilor din modulul ''StandardGraph'': |
| - | * Toate funcțiile din această etapă, cu excepția ''%%search%%'', trebuie implementate **FĂRĂ recursivitate explicită**. | + | * Toate trebuie implementate **FĂRĂ recursivitate explicită**. |
| - | * Funcțiile trebuie să opereze **direct pe mulțimile** de noduri și arce, utilizând funcțiile specifice acestei reprezentări, **FĂRĂ conversii** redundante la liste și înapoi la mulțimi. | + | * Ele trebuie să opereze **direct pe mulțimile** de noduri și arce, utilizând funcțiile specifice acestei reprezentări, **FĂRĂ conversii** redundante la liste și înapoi la mulțimi. |
| Este suficient ca arhiva pentru **vmchecker** să conțină modulele ''%%StandardGraph%%'' și ''%%Algorithms%%''. | Este suficient ca arhiva pentru **vmchecker** să conțină modulele ''%%StandardGraph%%'' și ''%%Algorithms%%''. | ||
| + | |||
| + | **ATENȚIE!** După ce experimentați în modulul ''Algorithms'' cu funcțiile de **debug** din schelet, ''appendDebug'' și ''concatMapDebug'', așa cum se precizează în comentarii, **reveniți** la versiunile obișnuite ale acestora, ''(++)'' și ''concatMap'', pentru a evita generarea mesajelor stufoase pe vmchecker. | ||
| ==== Depunctări ==== | ==== Depunctări ==== | ||
| - | Funcțiile care nu respectă cele două constrângeri de mai sus vor fi **depunctate total**. | + | * Funcțiile din modulul ''StandardGraph'' care nu respectă cele două constrângeri de mai sus vor fi **depunctate total**. |
| + | * Funcțiile din modulul ''Algorithms'' care nu respectă constrângerile din schelet vor fi **depunctate total**. | ||
| ===== Etapa 2 ===== | ===== Etapa 2 ===== | ||
| Line 174: | Line 176: | ||
| * Tipul ''%%AlgebraicGraph%%'' este cel prezentat mai sus. | * Tipul ''%%AlgebraicGraph%%'' este cel prezentat mai sus. | ||
| * Mai departe, veți implementa **aceleași funcții** ca în modulul ''%%StandardGraph%%'', cu excepția ''%%fromComponents%%'', dar de data aceasta vor opera pe reprezentarea algebrică. | * Mai departe, veți implementa **aceleași funcții** ca în modulul ''%%StandardGraph%%'', cu excepția ''%%fromComponents%%'', dar de data aceasta vor opera pe reprezentarea algebrică. | ||
| - | * 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. | ||
| + | |||
| + | Se impun următoarele **constrângeri** de implementare asupra funcțiilor din modulul ''AlgebraicGraph'': | ||
| + | |||
| + | * Toate trebuie implementate **CU recursivitate explicită**. | ||
| + | * Toate 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. | ||
| ==== Depunctări ==== | ==== Depunctări ==== | ||
| - | Funcțiile care nu respectă constrângerile de mai sus, și cele din schelet, vor fi **depunctate total**. | + | Funcțiile care nu respectă constrângerile de mai sus sau pe cele din schelet vor fi **depunctate total**. |
| ===== Etapa 3 ===== | ===== Etapa 3 ===== | ||