| Autor zadání | Miroslav Jaroš |
|---|---|
| Odevzdávané soubory |
*.c
*.h
|
| Konec odevzdání | 2026-06-29 24:00 |
|
Kostru k úkolu nelze stáhnout
|
Jedna z populárních idejí ze společenskovědních oborů tvrdí, že všichni lidé na planetě jsou od sebe vzdáleni nejvíce přes 6 osob, tedy že pokud bychom hráli celoplanetární tichou poštu, potom by zpráva od Vás libovolnému jinému člověku prošla nejvíce přes 6 uší.
Vaši kolegové, zabývající se analýzou sociálních sítí chtěli tuto teorii ověřit a proto pomocí mocného prompt engineeringu dokázali provést analýzu mnoha sociálních sítí a vytvořili nástroj, který dokáže pro zvolenou sociální síť vygenerovat CSV soubor obsahující jednotlivá propojení osob na této síti.
Soubory obsahují jednotlivá propojení osob na zvolené platformě včetně magického čísla trust, které je zahaleno
mlhou těžké statistiky ale zjednodušeně vyjadřuje důvěru osoby svému kontaktu.
Po prozkoumání vstupních souborů vaši kolegové zjistili, že nejsou schopni je nadále zpracovávat a potřebují efektivní program, který by data propojil a vypočítal požadované metriky.
Cíl programu
Váš program dostane přes argumenty příkazové řádky nejméně jeden až mnoho CSV souborů, které obsahují vztahy
mezi uživateli sociální sítě. Vaším prvním úkolem je z těchto souborů vystavět
celistvou síť uživatelů, vypočítat průměrný stupeň odloučení celé sítě a najít všechny osoby, které mají
alespoň jeden kontakt se vzdáleností větší než 6.
Pro každou z těchto osob následně vypočítáte její průměrnou důvěryhodnost v síti.
Co to je důvěra a důvěryhodnost
Vstupní soubor obsahuje položku trust, která vyjadřuje, jak moc osoba A důvěřuje osobě B na konkrétní platformě.
Jedná se o celé číslo na intervalu <0; 100), kde nižší číslo vyjadřuje vyšší důvěru.
Pro jedno spojení je potom důvěra nejnižší hodnota napříč všemi sociálními sítěmi. Tedy napříkad, pokud
A má pro osobu B index důvěry na twitteru o hodnotě 80 a na facebooku o hodnotě 40 potom je přímá důvěra osoby A osobě B rovna 40.
Důvěryhodnost si můžeme definovat jako tranzitivní uzávěr důvěry, tedy jedná se o nejmenší hodnotu součtu všech možných propojení osoby A s osobou B.
Jinými slovy pokud osoba A důvěřuje osobě B s hodnotou 30 a osobě C s hodnotou 3, osoba C důvěřuje osobě B s hodnotou 2, potom je
důvěryhodnost osoby C pro osobu A rovna 3, a důvěryhodnost osoby B rovna 5 (důvěryhodnost je nižší - tedy lepší - než důvěra). Ovšem pozor, žádnou
další důvěryhodnost z tohoto příkadu nevyčteme, pokud by pouze toto byl náš vstup, potom osoby B ani C nemají s osobou A vůbec žádný vztah a
taková síť by byla brána za nesouvislou.
Stupeň odloučení
Stupeň odloučení osoby A od osoby B je roven počtu osob, které tvoří nejkratší řetězec propojení A a B.
Pokud A má přímou asociaci s B (tedy definuje pro něj trust), potom je jejich stupeň odloučení 1.
Pokud A má asociaci s B a B s C, potom je stupeň odloučení A s C roven 2.
Všimněte si, že pro určení stupně odloučení osob není atribut trust vůbec relevantní. Dále mějte na paměti, že
podobně jako u důvěry to že platí A→B→C neznamená, že by zároveň platilo C→B→A. Může nastat situace, že
C nemá žádnou vazbu na A.
Pokud bychom použili podobnou definici jako výše, potom stupeň odloučení osoby je tranzitivní uzávěr relace existujeDůvěra na množině osob.
Formát vstupu
Váš program bude spuštěn s několika vsutpními soubory ve formátu CSV (comma separated values), které budou obsahovat následující sloupce:
-
real_nameReálné jméno uživatele. -
loginAlias uživatele na platformě. -
emailEmailová adresa uživatele. -
friend_loginPřihlašovací jméno přítele. -
trusthodnota ležící na intervalu<0; 100)která vyjadřuje úroveň důvěry směrem odloginkfriend_login.
Každý vstupní soubor začíná hlavičkou na prvním řádku, kde jsou vyjmenovány sloupce použité v tomto souboru oddělené čárkou. Na každém následujícím řádku pak již jsou data samotná. Každý validní vstupní může obsahovat libovolný počet sloupců nad rámec těch povinných. Je to důsledek různorodosti platforem a způsobu ukládání dat.
Vzhledem k tomu, že se vaši kolegové snažili mít alespoň trošku příčetná data, můžete se spolehnout, že validní vsutpní soubor,
bude mít vždy prvních 5 sloupců dle definice v jejich uspořádání. Tedy nemůže se stát, že by se nejdříve objevil login a až následně real_name, nebo že by soubor měl jako první sloupec cokoliv jiného než real_name, tedy takový soubor můžete
okamžitě označit za neplatný.
Další úlevou je, že jakýkoliv výskyt čárky v řádku je oddělovačem sloupců, tedy situaci, kdy je buňka v CSV obalena dvojitými uvozovkami nemusíte řešit.
Formát CSV
CSV je velmi jednoduchý promát pro serializaci dat, jedná se o druh tabulky, kde jsou jednotlivé buňky řádku odděleny
čárkami a jednotlive řádky tabulky jsou realizovány řádky v souboru (tedy ukončeny znakem \n).
V obecném CSV jsou jako řídící znak použity i uvozovky ", které označují řetězec, v němž libovolný jiný znak (rozuměj primárně čárka) ztrácí řídící význam, tedy:
| CSV | Tabulka | ||||||
|---|---|---|---|---|---|---|---|
a,b,c d,e,f |
|
||||||
"a,b",c d,"e,f" |
|
U našich vstupů se nicméně dvojité uvozovky nebudou vyskytovat, tedy tuto situaci nemusíte řešit.
Výstup programu
Váš program bude zpracovávat a kombinovat větší množstvi CSV souborů obsahující asociace osob (formát výše) nad kterými sestaví jednotnou síť osob, kterou bude následně analyzovat.
Jako první krok vypočítá průměrný stupeň odloučení a určí počet osob se stupňem odloučení vyšším než 6.
V případě, že by nastala situace, že existují naprosto nepropojení lidé (například dva CSV soubory obsahující
zcela odlišné osoby bez jakéhokoliv průniku), potom váš program vypíše na standardní výstup:
Social networks are disconnected.
Následně ukončí výpočet. V případě, že není předán žádný CSV soubor, nebo nebyl načten žádný platný CSV soubor (viz níže) program vypíše:
The social network is empty.
V jiných případech program vypíše následující zprávu a pokračuje v dalším výpočtu:
Average degree of separation is $DEGREE, number of distant people is $DISTANT
Kde $DEGREE je desetinné číslo vypsané s přesností na dvě desetinná místa vyjadřující průměrný stupeň odloučení celé sítě
a $DISTANT je celé číslo vyjadřující počet osob u nichž je stupeň odloučení vyšší než 6.
Pro každou nalezenou osobu vypočítá její průměrnou důvěryhodnost a vypíše je ve formátu:
$email: $trust
Každá nalezená osoba nechť je vypsána na samostatném řádku a všechny musí být ve výstupu uspořádány lexikograficky dle jejich emailu.
Validace vstupu
Bohužel práce nástroje pro těžení dat ze sociálních sítí není úplně optimální (nejedná se o jeden nástroj, ale pro každou sociální síť je vyroben samostatný program, který data zpracovává). Navíc je jejich běh poměrně časově náročný, takže dochází k drobným nekonzistencím v datech.
Nevalidní CSV soubor
První problém, který může při běhu nastat je nevalidní CSV soubor na vstupu, v tomto případě pouze vypište na standardní chybový výstup libovolnou zprávu, zastavte zpracování souboru a pokračujte dalším souborem. CSV soubor je nevalidní, pokud v hlavičce nejsou všechny povinné položky, situaci přeuspořádání sloupců nemusíte brát v úvahu.
Nevalidní řádek v CSV souboru
Dalším druhem problému je situace nalezení neplatného řádku souboru. V takovém případě řádek přeskočte a pokračujte na další (bez zapisování chybové hlášky).
Neplatný řádek je takový, který neobsahuje všechny sloupce definované dle hlavičky souboru, má prázdný login nebo email nebo friend_login,
případně takový řádek, jehož trust není celé číslo v rozmezí <0-100).
Pozor, i řádek, na kterém jsou vyplněny všechny povinné identifikační údaje, může být neplatný, například pokud neobsahuje všechny sloupce definované dle hlavičky.
Neprázdnost, či platnost, ostatních atributů (včetně real_name) nemusíte ověřovat.
Redefinující asociace
Bohužel v některých souborech může nastat situace, kdy jsou vstupní data nekonzistentní, současná teorie je, že se jedná o halucinaci způsobenou zpětnovazebnou smyčkou do náhodného LLM (počet tokenů není neomezený). Takovým souborům bohužel nemůžeme věřit.
Pokud váš program při zpracování CSV souboru narazí na záznamy obsahující stejný email, a různé loginy, nebo naopak, pro stejný login různé emaily, potom vaše řešení musí označit celý soubor za neplatný (stejně jako výše), ukončit jeho zpracování a vypsat na standardní chybový výstup zprávu o chybě. Zároveň musí platit, že jakékoliv načtené záznamy z tohoto souboru musí být brány za neplatné.
Neexistující login
V případě, že po zpracování vstupu nenaleznete email k přihlašovacímu jménu, potom takovou asociaci nesmíte brát při výpočtu v úvahu, tedy všechny takto přidané asociace jsou neplatné. Tato situace může nastat v případě, kdy pro libovolný login neexistuje žádná odchozí aosicace, tedy pro daný login nedokážete určit jeho email.
Odevzdání řešení
Své programy odevzdáváte standardně pomocí vašeho repozitáře na gitlab. Očekává se, že
řešení bude ve složce semestral/ ve větvi semestral/work. Pro zjednodušení komunikace
bude, stejně jako u domácích úloh, vyrobena také větev semestral/base a otevřen Merge Request.
Ovšem jde pouze o nástroj při řešení problémů, stav MR nebude mít žádný[1]
vliv na hodnocení.
Při odevzdání budou kompilovány pouze .c soubory ve složce semestral. Validnost své implementace můžete ověřit následující příkazem:
gcc -std=c23 -Wall -Wextra -pedantic -Werror -o semestral -D_POSIX_C_SOURCE *.c -lpthread
Pokud tento příkaz vytvoří spustitelný soubor semestral, potom bude vaše řešení přeložitelné
v testovacím prostředí. Případně ke stejnému účelu můžete využít přiložený Makefile, který přeloží
váš kód podobným způsobem jako v testovacím prostředí spuštěním příkazu make.
Pokud se rozhodnete použít meson nebo cmake nebo si napsat vlastní testy, rozhodně můžete
a je to podporováno, jenom mějte na paměti, že jakékoliv soubory v podsložkách budou při kompilaci
ignorovány a v .c souborech umístěných ve složce semestral musí být funkce main definována
právě jednou.
Testování řešení
Vaše implementace bude testována ve dvou režimech:
-
Funkční — ověření veškeré požadované funkcionality, ošetřování chyb - 15 bodů.
-
Výkonostní — ověření efektivity implementace nad různě velkými vstupy - 15 bodů.
Funkční testování
Funkční testování ověřuje váš program vzhledem ke specifikaci tohoto zadání, tedy testuje že pro daný vstup vracíte (vypisujete) korektní a očekávaný výstup.
|
Deadline pro funkční testování
Pro funkční testování je deadline pro získání plných 15 bodů konec výuky v semestru, tedy 18. 5. 2026. Tedy do tohoto data můžete vylepšovat svůj bodový zisk. Nicméně pokud do této deadline nezískáte plný počet bodů, nebude vaše řešení nadále vůbec testováno. |
| Další popis testovacích scénářů a proces testování zde bude doplněn společně s otevřením odevzdávání, které bude ohlášeno na diskuzním fóru. |
Výkonostní testování
Spouští se pouze v případě, že Váš program splnil funkční testy na 15 b. Tyto testy budou zkoušet poměrně velké instance problémů a extrémní situace a očekávají, že váš výpočet krom korektnosti splní i výkonostní požadavky.
| Funkční testy jsou nutnou podmínkou spuštění výkonostních testů, tedy každá změna bude vždy nejdříve otestována funkčními testy. |
Pro jejich splnění bude měřena jak časová, tak i paměťová náročnost vašich algoritmů a nesplnění kterékoliv z nich znamená neúspěch v testovacím případě.
Obecné parametry řešení:
-
Vaše řešení by nemělo mít vyšší časovou složitost než kubickou vzhledem k počtu osob.
-
Vaše řešení by nemělo mít vyšší paměťovou náročnost než kvadratickou vzhledem k počtu osob.
Při návrhu algoritmů se můžete spolehnout, že počet lidí se stupněm odloučení větším než 6 bude logaritmický vzhledem k celkovému počtu osob - tedy pro 128 osob to bude maximálně 7, pro 1024 maximálně 10 a tak dále.
Poznámky
-
Při implementaci můžete plně využít celý standard jazyka C23 včetně vláken.
-
Zároveň máte povoleno použití POSIX C LIBRARY ve které můžete najít další užitečné funkce.
-
Velice doporučuji nejdříve vyřešit algoritmickou část problému bez ohledu na výkonnost, funkční testy budou velice štědré co se týká dostupných zdrojů vzhledem k řešenému problému, tedy chyby typu docházející paměti, či překročení maximální doby běhu, budou s nejvyšší pravděpodobností způsobeny zacyklením programu, či špatnou prací s pamětí.
-
Váš důvěrný přítel
valgrindsamozřejmě nebude chybět ani na této party a jím reportované problémy budou snižovat Váš bodový zisk, tedy rozumná práce se zdroji se vyplatí.
Příklady
Nyní si ukáteme pár praktických příkladů, formát vstupního csv může vypadat například takto
full_name,login,email,friend_login,trust,misc King Elessar heir to Isildur,king_elessar,aragorn@gondor.me,steward,80,Last communication on 15-03-3019:TA. Frodo Baggins,frodo_baggins,frodo@hobbiton.me,king_elessar,60,No activity in past year. Gimli the slayer,gimli_the_dwarf,gimli@erebor.me,steward,99,No activity. Gimli the slayer,gimli_the_dwarf,gimli@erebor.me,king_elessar,60,No activity. Boromir son of Denethor,boromir_the_brave,boromir@gondor.me,steward,0,Last activity on 26-02-3019:TA Denethor II steward of Gondor (Official),steward,steward@gondor.me,king_elessar,99,Last activity on 15-03-3019:TA this user is on fire! Denethor II steward of Gondor (Official),steward,steward@gondor.me,boromir_the_brave,0,Last activity on 01-01-3019:TA Denethor II steward of Gondor (Official),steward,steward@gondor.me,faramir_ungreatful,50,No activity ever. Faramir,faramir_ungreatful,faramir@gondor.me,king_elessar,0,Last contact on 15-03-3019:TA Faramir,faramir_ungreatful,faramir@gondor.me,steward,20,Last contact on 15-03-3019:TA this is heated relationship. Faramir,faramir_ungreatful,faramir@gondor.me,boromir_the_brave,10,Last contact on 26-03-3019:TA this relationship is very cold.
Toto CSV ukazuje propojení na jedné konkrétní síti a pokud by to byl jedinný vstup našeho programu, potom by program výstup byl:
Social networks are disconnected.
Nicméně pokud přidáme další CSV situace se změní.
full_name,login,email,friend_login,trust,last_contact,last_message Aragorn son of Arathorn (AKA Strider),the_strider,aragorn@gondor.me,the_ring_bearer,0,26-02-3019:TA,Where are you? we just found Boromir. hope you're alright. Aragorn son of Arathorn (AKA Strider),the_strider,aragorn@gondor.me,boromir,40,26-02-3019:TA,Hey where did you go? Can't find you or the halflings. Reach back please! Aragorn son of Arathorn (AKA Strider),the_strider,aragorn@gondor.me,gimli_,20,15-03-3019:TA,Right after we disembark we'll need to spearhead to Pelenor fields. Master Frodo,the_ring_bearer,frodo@hobbiton.me,the_strider,0,26-02-3019:TA,Whoa! I still can't belive what a beauty is Lothlorien and lady Galadriel was awesome. Master Frodo,the_ring_bearer,frodo@hobbiton.me,boromir,50,25-02-3019:TA,Lady Galadriel made me think about this whole ordeal. Let's talk tomorrow. Master Frodo,the_ring_bearer,frodo@hobbiton.me,gimli_,20,26-02-3019:TA,You're right boating is a strange mode of transportation. Gimli son of Gloin,gimli_,gimli@erebor.me,the_ring_bearer,0,26-02-3019:TA,Transporting on a moving water is not decent for a dwarf!. Gimli son of Gloin,gimli_,gimli@erebor.me,the_strider,0,15-02-3019:TA,Whoa was that a Nazgûl? Flying? Gimli son of Gloin,gimli_,gimli@erebor.me,boromir,30,13-01-3019:TA,Oh what a joy I'll introduce you to cousin Durin. Khazad-dûm is the best. Boromir of Gondor,boromir,boromir@gondor.me,the_ring_bearer,0,26-02-3019:TA,You are right about that ring. It is very dangerous and I'm sorry. Boromir of Gondor,boromir,boromir@gondor.me,the_strider,50,15-01-3019:TA,What we'll do now without the Gandalf where we'll get the support? Boromir of Gondor,boromir,boromir@gondor.me,gimli_,20,01-02-3019:TA,I saw you talking to lady Galadriel? What do you think about her?
V tomto případě již je celá síť propojená. Pokud bychom náš program pustili normálně, potom by výstup programu byl:
Average degree of separation is 1.33, number of distant people is 0
Pokud bychom hledali lidi, jejichž stupeň odloučení je větší než 2, potom by výstup vypadal:
Average degree of separation is 1.33, number of distant people is 2 faramir@gondor.me: 74.00 frodo@hobbiton.me: 0.00