TEKNINEN MÄÄRITTELY. PROJEKTITYÖ Tik Wclique

Samankaltaiset tiedostot
TOIMINNALLINEN MÄÄRITTELY. PROJEKTITYÖ Tik Wclique

VAATIMUSMÄÄRITTELY. PROJEKTITYÖ Tik Wclique

- painottamattoman graafin solmujen järjestäminen. - painotetun graafin solmujen järjestäminen

VAATIMUSMÄÄRITTELY. PROJEKTITYÖ Tik Wclique

TOIMINNALLINEN MÄÄRITTELY. PROJEKTITYÖ Tik Wclique

TOIMINNALLINEN MÄÄRITTELY. PROJEKTITYÖ Tik Wclique

TEKNINEN MÄÄRITTELY. PROJEKTITYÖ Tik Wclique

WCLIQUE. Ohjelmistoprojekti. Testaussuunnitelma

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Digi-tv vastaanottimella toteutetut interaktiiviset sovellukset

Ohjelmoinnin perusteet Y Python

Sisältö. 22. Taulukot. Yleistä. Yleistä

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Käyttäjien tunnistaminen ja käyttöoikeuksien hallinta hajautetussa ympäristössä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisältö. 2. Taulukot. Yleistä. Yleistä

811120P Diskreetit rakenteet

WCLIQUE. Ohjelmistoprojekti. Testaussuunnitelma

Ohjelmoinnin perusteet Y Python

TEKNINEN MÄÄRITTELY. PROJEKTITYÖ Tik Wclique

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Ohjelmoinnin peruskurssi Y1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Algoritmit 1. Luento 1 Ti Timo Männikkö

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

12. Näppäimistöltä lukeminen 12.1

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

TIE Tietorakenteet ja algoritmit 261

Algoritmit 2. Luento 7 Ti Timo Männikkö

TAMPEREEN TEKNILLINEN YLIOPISTO

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

WCLIQUE. Ohjelmistoprojekti. Testaussuunnitelma

811120P Diskreetit rakenteet

Tietueet. Tietueiden määrittely

Tietorakenteet ja algoritmit - syksy

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin perusteet Y Python

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Loppukurssin järjestelyt C:n edistyneet piirteet

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

C++11 lambdat: [](){} Matti Rintala

Algoritmit 1. Luento 9 Ti Timo Männikkö

10. Painotetut graafit

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Algoritmit 1. Luento 8 Ke Timo Männikkö

Lyhyt kertaus osoittimista

13 Lyhimmät painotetut polut

Ohjelmoinnin perusteet Y Python

Osoitin ja viittaus C++:ssa

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

TAMPEREEN TEKNILLINEN YLIOPISTO

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit

Ohjelmoinnin perusteet Y Python

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Määrittelydokumentti

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

6.4. Järjestyssuhteet

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Ohjelmoinnin perusteet Y Python

Moduli 5: Kehittyneitä piirteitä

Ohjelmoinnin perusteet Y Python

Zeon PDF Driver Trial

Ohjelmoinnin perusteet Y Python

Luento 5. Timo Savola. 28. huhtikuuta 2006

Loppukurssin järjestelyt

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

11. Javan toistorakenteet 11.1

Tietorakenteet ja algoritmit

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

Harjoitustyö: virtuaalikone

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

Hohde Consulting 2004

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Tietorakenteet ja algoritmit

811120P Diskreetit rakenteet

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

Rakenteiset tietotyypit Moniulotteiset taulukot

Ohjelmointiharjoituksia Arduino-ympäristössä

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Tietorakenteet ja algoritmit

1. Omat operaatiot 1.1

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Transkriptio:

TEKNINEN MÄÄRITTELY PROJEKTITYÖ Tik-76.115

SISÄLLYSLUETTELO Sisällysluettelo... 2 Versiohistoria... 3 1. JOHDANTO... 4 1.1 Tarkoitus ja kattavuus... 4 1.2 Tuote ja ympäristö... 4 1.3 Määritelmät, merkintätavat ja lyhenteet... 4 1.4 Viitteet... 5 1.5 Yleiskatsaus dokumenttiin... 5 2. JÄRJESTELMÄN YLEISKUVAUS... 6 2.1 Sovellusalueen kuvaus... 6 2.2 Järjestelmän liittyminen ympäristöönsä... 6 2.3 Laitteistoympäristö... 6 2.4 Ohjelmistoympäristö... 6 2.5 Toteutuksen keskeiset reunaehdot... 6 2.6 Sopimukset ja standardit... 7 3. ARKKITEHTUURIN KUVAUS... 7 3.1 Ratkaisun "filosofia" (suunnitteluperiaatteet)... 7 3.2 Tietokanta-arkkitehtuuri... 7 3.3 Ohjelmistoarkkitehtuuri, moduulit ja prosessit... 7 3.3.1 Loogiset rakenteet... 7 3.3.2 Ohjelman moduulirakenne... 8 3.4 Sisäiset tietorakenteet moduuleittain... 9 3.4.1 Graafin ratkaisumoduuli... 9 3.4.2 Apuohjelmamoduuli... 10 3.4.3 Komentorivitulkkimoduuli... 12 4. PSEUDOKOODIMODUULIEN JA PROSESSIN KUVAUS... 13 4.1 Ohjelman kulun pääperiaate loogisella tasolla... 14 4.2 Pseudokoodimoduuli uw_maxclique... 17 4.2.1 Kuvaus... 17 4.2.2 Toteutus... 17 4.2.3 Virhekäsittely... 17 4.3 Pseudokoodimoduuli uw_sclique... 18 4.3.1 Kuvaus... 18 4.3.2 Toteutus... 18 4.3.3 Virhekäsittely... 18 4.4 Pseudokoodimoduuli uw_allsclique... 19 4.4.1 Kuvaus... 19 4.4.2 Toteutus... 19 4.4.3 Virhekäsittely... 19 4.5 Pseudokoodimoduuli uw_allnlessclique... 20 4.5.1 Kuvaus... 20 4.5.2 Toteutus... 20 4.5.3 Virhekäsittely... 20 4.6 Pseudokoodimoduuli w_maxclique... 21 4.6.1 Kuvaus... 21 4.6.2 Toteutus... 21 4.6.3 Virhekäsittely... 21 4.7 Pseudokoodimoduuli w_sclique... 22 4.7.1 Kuvaus... 22 4.7.2 Toteutus... 22

4.7.3 Virhekäsittely... 22 4.8 Pseudokoodimoduuli w_allsclique... 23 4.8.1 Kuvaus... 23 4.8.2 Toteutus... 23 4.8.3 Virhekäsittely... 23 4.9 Pseudokoodimoduuli w_nlessclique... 24 4.9.1 Kuvaus... 24 4.9.2 Toteutus... 24 4.9.3 Virhekäsittely... 24 4.10 Pseudokoodimoduuli w_allnlessclique... 25 4.10.1 Kuvaus... 25 4.10.2 Toteutus... 25 4.10.3 Virhekäsittely... 25 4.11 Pääohjelma... 26 4.12 Graafin järjestäminen... 28 4.12.1 Painotetun graafin värittäminen... 28 4.12.2 Painottamattoman graafin värittäminen... 28 4.13 DIMACS ASCII formaatin lukeminen... 29 4.14 Ohjelman funktiot... 29 5. MUUT ERITYISET TEKNISET RATKAISUT... 30 5.1 Komentorivikutsu... 30 5.2 Ohjelman kääntäminen... 30 6. HYLÄTYT RATKAISuVAIHTOEHDOT... 31 6.1 Bittikarttaesitys... 31 7. VIRHEKÄSITTELY... 31 LIITE 1: Käyttäjän funktiot... 32 VERSIOHISTORIA Versio Päivämäärä Laatija Kuvaus 1.0-2 14.01.2001 Dufva Proposal 1.1 18.03.2001 Dufva First draft 1.1-1 09.04.2001 Dufva Second draft 1.1-2 19.04.2001 Dufva Third draft 1.2 20.04.2001 Dufva Edited according to comments received from Patric Östergård and Harri Haanpää

TEKNINEN MÄÄRITTELY 4 (36) 1. JOHDANTO Tässä dokumentissa kerrotaan kuinka tekninen osuus projektityöstä on tehty. 1.1 Tarkoitus ja kattavuus Tekninen osuus pitää sisällään -ohjelman rakenteellisen selvityksen ja kuinka sen osat toimivat ja kommunikoivat eri moduulien kesken. Dokumentti on tarkoitettu projektin tekijöille sekä henkilöille jotka ovat kiinnostuneet ohjelman toiminnasta. 1.2 Tuote ja ympäristö Tuote joka tässä projektissa tehdään on -ohjelma, mikä toimii Unix ja Linux ympäristössä. 1.3 Määritelmät, merkintätavat ja lyhenteet : Projektityön kohde. Ohjelma jonka tarkoituksena on etsiä haluttuja ominaisuuksia annetuista graafeista. Ohjelma kirjoitetaan isolla jos ohjelmasta puhutaan yleisesti tai viitataan projektityön nimeen. Kun varsinainen ohjelma koodataan, puhutaan wcliquesta pienellä alkukirjaimella. Graafi: Useissa yhteyksissä tarkastellaan joukkoa solmuja, joista joko on tai ei ole kaaria toisiin solmuihin. Tyypillisiä esimerkkejä tällaisista ovat kartta, johon on merkitty kaupunkeja, sekä näiden väliset suorat liikenneyhteydet, tietokoneohjelman kulkua kuvaava vuokaavio ja sukupuut. Graafi, eli verkko G = ( V, E ) muodostuu äärellisistä joukoista V ja E, joista V on ns. solmujen joukko ja E on sivujen joukko. Solmu: Solmuista käytetään joissain yhteyksissä myös nimityksiä kärki tai piste. Kartta vertauksessa solmua edustaisi kaupunki. Kaari: Käytössä myös nimitykset kaari ja haara. Kartassa kaari olisi kaupungit yhdistävä tie. Algoritmi: Algoritmilla voidaan ratkaista olemassa olevasta graafista asioita, joista ollaan kiinnostuneita. Algoritmi jonka ympärille ohjelma rakennetaan on julkinen. Algoritmin toimintaa on kuvattu Internetissä seuraavissa dokumenteissa: "A Fast Algorithm for the Maximum Clique Problem" http://www.tcs.hut.fi/ ~ pat/paper1.ps "A New Algorithm for the Maximum-Weight Clique Problem" http://www.tcs.hut.fi/ ~ pat/paper2.ps Klikki: Klikki tarkoittaa sellaista solmujoukkoa joista kaikista on kaari kaikkiin. Ansi C: Ohjelmointikieli, jolla ohjelma toteutetaan

TEKNINEN MÄÄRITTELY 5 (36) 1.4 Viitteet [Vaat] [Unixprog] Vaatimusmäärittely Brian W. Kernighan, Rob Pike: The Unix Programming Environment 1.5 Yleiskatsaus dokumenttiin Johdanto-osuudessa luodaan yleiskatsaus dokumenttiin. Siinä selvitetään termit, lyhenteet ja viitteet jotka auttavat lukijaa tutustumaan tähän dokumenttiin ja -ohjelmaan. Toinen luku tarkentaa ohjelmaa yleisellä tasolla. Jos lukija ei ole kiinnostunut pikkutarkasta ohjelman kuvauksesta, niin usein riittää tämän luvun lukeminen ohjelman idean ymmärtämiseksi. Arkkitehtuuriosuudessa käydään läpi ohjelman rakenne, tiedostot, moduulit ja sisäiset tietorakenteet. Neljännessä luvussa tarkennetaan toisessa luvussa esitettyjä ohjelman ominaisuuksia ja toimintoja mm. pseudokoodiesityksillä ohjelman sisäisistä loogisista kokonaisuuksista. Luvussa 5 käydään läpi mm. komentoriviesitys, luvussa 6 hylätyt ratkaisuvaihtoehdot ja luvussa 7 virhekäsittelyä.

TEKNINEN MÄÄRITTELY 6 (36) 2. JÄRJESTELMÄN YLEISKUVAUS 2.1 Sovellusalueen kuvaus Sovellus toimii standardi Unix/Linux ympäristössä. 2.2 Järjestelmän liittyminen ympäristöönsä Ohjelma ei itsessään vaadi liityntöjä järjestelmään, mutta voi kirjaston ominaisuudessa olla itse osana suurempaa järjestelmää. 2.3 Laitteistoympäristö Standardi Unix / Linux käyttöympäristö. 2.4 Ohjelmistoympäristö Ohjelma toimii /Unix / Linux ympäristössä. Kun n toiminta on havaittu toimivaksi tässä ympäristössä, tehdään sta myös Windows ympäristössä toimiva versio. 2.5 Toteutuksen keskeiset reunaehdot Ohjelma sisältää seuraavat ominaisuudet [vaat]: Painottamattomien graafien vaatimukset: Yhden maksimiklikin laskeminen Kaikkien maksimiklikkien laskeminen Yhden kokoa S olevan klikin laskeminen Kaikkien kokoa S olevien klikkien laskeminen Yhden vähintään kokoa S olevan klikin laskeminen Kaikkien vähintään kokoa S olevien klikkien laskeminen Eri syöteformaattien lukeminen Graafin järjestäminen Painotettujen graafien vaatimukset Yhden maksimiklikin laskeminen Kaikkien maksimiklikkien laskeminen Yhden kokoa S olevan klikin laskeminen Kaikkien kokoa S olevien klikkien laskeminen Yhden vähintään kokoa S olevan klikin laskeminen Kaikkien vähintään kokoa S olevien klikkien laskeminen Eri syöteformaattien lukeminen Graafin järjestäminen

TEKNINEN MÄÄRITTELY 7 (36) 2.6 Sopimukset ja standardit Koodauksessa noudatetaan Brian W. Kernighan, Rob Pike: The Unix Programming Environment ja Kenneth Oksasen C-ohjelmointiopas -kirjoissa mainittuja hyvän koodin tunnusmerkkejä Sopimukset: Vaatimusmäärittely ja tekijänoikeussopimus. 3. ARKKITEHTUURIN KUVAUS 3.1 Ratkaisun "filosofia" (suunnitteluperiaatteet) - n koodi voidaan ajatella koostuvan useasta loogisesta kokonaisuudesta jotka on esitetty pseudokoodimoduuleina. Pseudokoodimoduulit on esitetty luvussa 4. Nämä kyseiset moduulit on nimetty seuraavasti: w_xxx tai uw_xxx, riippuen siitä onko kyseessä painotettu vai painottamaton graafi. - C-kieli, asiakkaan vaatimus 3.2 Tietokanta-arkkitehtuuri ei sisällä tietokantaominaisuuksia. 3.3 Ohjelmistoarkkitehtuuri, moduulit ja prosessit 3.3.1 Loogiset rakenteet Ohjelmassa on kolme tiedostoa: otsikkotiedosto wclique.h, kirjastotiedosto wclique.c sekä pääohjelma main.c, josta käytetään kirjaston tarjoamia palveluja. Ohjelma koostu useista loogisista kokonaisuuksista jotka on lueteltu tässä alla. Tarkempi kuvaus on esitetty luvussa 4. 1. Yhden painottamattoman maksimiklikin laskeminen (uw_maxclique) - uw_maxclique - etsii graafista YHDEN maksimiklikin (laskee myös maksimiklikin koon). 2. Kaikkien painottamattomien maksimiklikkien laskeminen - ei omaa moduulia vaan tehdään moduulissa uw_allsclique (S=uw_maxclique). 3. Yhden painottamattoman klikin laskeminen kokoa S (uw_sclique) - uw_sclique etsii painottamattomasta graafista YHDEN annetun kokoisen klikin. 4. Kaikkien painottamattomien klikkien laskeminen kokoa S (uw_allsclique) - uw_allsclique etsii painottamattomasta graafista KAIKKI annetun kokoiset klikit. 5. Yhden painottamattoman klikin laskeminen vähintään kokoa S - sama kuin 4, koska algoritmi löytää ensin kuitenkin kokoa S olevan klikin (>=S). 6. Kaikkien painottamattomien klikkien laskeminen vähintään kokoa S (uw_allnlessclique) - uw_allnlessclique etsii painottamattomasta graafista kaikki vähintään annetun kokoiset klikit. 7. Graafin solmujen järjestäminen (uw_coloring) 8. Yhden painotetun maksimiklikin laskeminen (w_maxclique) - w_maxclique etsii painotetusta graafista YHDEN maksimiklikin.

TEKNINEN MÄÄRITTELY 8 (36) 9. Kaikkien painotettujen maksimiklikkien laskeminen - Ei omaa moduulia vaan tehdään moduulissa w_allsclique (S=w_maxclique). 10. Yhden painotetun klikin laskeminen kokoa S (w_sclique) - w_sclique etsii painotetusta graafista YHDEN annetun kokoisen klikin. 11. Kaikkien painotettujen klikkien laskeminen kokoa S (w_allsclique) - w_allsclique etsii painotetusta graafista KAIKKI annetun kokoiset klikit. 12. Yhden painotetun klikin laskeminen vähintään kokoa S (w_nlessclique) - w_nlessclique painotetusta graafista YHDEN vähintään annetun kokoisen klikin. 13. Kaikkien painotettujen klikkien laskeminen vähintään kokoa S (w_allnlessclique) - w_allnlessclique painotetusta graafista KAIKKI vähintään annetun kokoiset klikit. 3.3.2 Ohjelman moduulirakenne - Graafin ratkaisumoduuli - Painotetun maksimiklikin ratkaisu - Painotetun kokoa S olevien klikkien ratkaisut - Painottamattoman maksimiklikin ratkaisu - Painottamattomien kokoa S olevien klikkien ratkaisut - Graafin ratkaisussa sisäisesti tarvittavien tietorakenteiden varaus (ei sisällä rekursiossa varattavia tietorakenteita) - Edellä mainittujen tietorakenteiden vapautus - Painotetun graafin solmujen järjestäminen - Painottamattoman graafin solmujen järjestäminen - Otsikkomoduuli graafin ratkaisumoduulille - Apuohjelmamoduuli - Graafin solmujen lukumäärän lukeminen DIMACS ASCII -formaatissa olevasta tiedostosta - Graafin solmujen lukumäärän lukeminen DIMACS binääri -formaatissa olevasta tiedostosta - Graafin kaarien ja painojen lukeminen DIMACS ASCII -formaatissa olevasta tiedostosta - Graafin kaarien ja painojen lukeminen DIMACS binääri -formaatissa olevasta tiedostosta - Graafin kaarimuistirakenteen varaus - Graafin solmujen painomuistirakenteen varaus - Tulosklikin solmumuistirakenteen varaus - Kaarimuistirakenteen alustaminen - Kaaren lisääminen kaarimuistirakenteeseen - Kaaren poisto kaarimuistirakenteesta - Solmun painon lisääminen painomuistirakenteeseen - Muistirakenteen vapautus - Otsikkomoduuli apuohjelmamoduulille - Komentorivitulkkimoduuli - Pääohjelma - Komentoriviparametrien luku (graafin ratkaisulle annetuiden parametrien tulkinta) - Graafin ratkaisun tulostaminen (funktio, jonka osoitin välitetään graafin ratkaisumoduulille) - Ohjelman opastuksen tulostaminen - Otsikkomoduuli komentorivitulkkimoduulille

TEKNINEN MÄÄRITTELY 9 (36) 3.4 Sisäiset tietorakenteet moduuleittain 3.4.1 Graafin ratkaisumoduuli Monessa funktiossa käytettävät tietorakenteet (osoittimia välitetään funktioparametreina) - Tietorakenne solmujen uudelle järjestykselle (yksiulotteinen kokonaislukutaulukko jossa kokonaislukutaulukon koko on graafin solmujen lukumäärä) - Tietorakenne maksimiklikkien kooille (yksiulotteinen kokonaislukutaulukko graafin c- arvoille) - Tietorakenne käsittelyssä olevan klikin solmuille (yksiulotteinen kokonaislukutaulukko jossa kokonaislukutaulukon koko on graafin solmujen lukumäärä. Taulukon alkion arvo on yksi, jos ratkaistavana oleva klikki sisältää kyseisen solmun). - Edellä mainittujen tietorakenteiden osoittimet sisällytetään seuraavankaltaisiin struktuureihin, jotka sisältävät graafin ja graafin ratkaisun aikaista informaatiota. Struktuuri graafi-informaatiolle: typedef struct { unsigned int nbrofvertices; unsigned int *edgetblptr; unsigned int *weighttblptr; unsigned int *sortordertblptr; //graafin solmujen lukumäärä (syötteenä moduulille) //osoitin kaaritietorakenteeseen (syötteenä moduulille) //osoitin solmujen painotietorakenteeseen (syötteenä moduulille) //osoitin solmujen järjestyksen tietorakenteeseen } wc_graph_variables;

TEKNINEN MÄÄRITTELY 10 (36) Struktuuri graafin ratkaisun aikaiselle informaatiolle: typedef struct { unsigned int *maxclique; short int cliquefound; char *curcliquetblptr; char *rescliquetblptr; //osoitin löydetyn maksimiklikin kokoon (syötteenä moduulille/arvoa muutetaan moduulissa) //true/false tieto, onko etsityn kaltainen klikki löydetty (arvo muutetaan false:sta true:ksi, kun etsityn kaltainen klikki on löydetty) //osoitin käsittelyssä olevan klikin solmutietorakenteeseen //osoitin tulosklikin solmutietorakenteeseen (syötteenä moduulille/sisältöä muutetaan moduulissa) unsigned int *weightsofcliquestblptr; //osoitin maksimiklikkien kokojen (c-arvot) tietorakenteeseen } wc_clique_variables; Paikallisesti käytettävät tietorakenteet - Tietorakenne käsiteltävän solmun naapureille (yksiulotteinen kokonaislukutaulukko, jossa naapurit järjestetyssä järjestyksessä). Naapureita käsitellään taulukon indeksin perusteella pienimmästä suurimpaan. Jokaiselle rekursiokierrokselle varataan oma taulukkonsa, joka saa sisältönsä syötteenä tulevasta naapuritaulukosta. Tämän taulukon koko on määritelty wclique.h tiedostossa. - Naapureiden painojen summa (yksiulotteinen kokonaislukutaulukko) alustetaan painotetun graafin järjestelyfunktiossa ja naapuripainoja päivitetään järjestelyn aikana. - Solmun asteluku (yksiulotteinen kokonaislukutaulukko) alustetaan painottamattoman graafin järjestelyfunktiossa ja astelukua päivitetään järjestelyn aikana. 3.4.2 Apuohjelmamoduuli - Seuraavassa kahdessa tietorakenteessa solmuja indeksoidaan välillä 0...n-1, vaikka ohjelmasta ulospäin solmuja indeksoidaan välillä 1...n. Solmujen indeksoinnin muuttaminen tehdään ohjelmassa sisäisesti. - Tietorakenne graafin kaarille (tietorakenteen osoitin välitetään kutsuvalle moduulille, mutta varaus suoritetaan tässä moduulissa, joten tietorakenteen voinee esittää tämän moduulin yhteydessä). Kaksiulotteinen taulukko, jossa toinen ulottuvuus on graafin solmun numero kokonaislukuna 0...n-1 ja toinen ulottuvuus bittivektori 0...n-1, siten, että ykkösenä oleva bitti kertoo solmujen välillä olevasta kaaresta.

TEKNINEN MÄÄRITTELY 11 (36) - Esimerkki edellisestä (graafi, jossa yhdeksän solmua): solmu kaari solmuun 0 1 4 6 8 1 0 3 6 2 4 6 3 1 4 0 2 5 6 7 8 6 0 1 2 5 8 7 5 8 8 0 5 6 7 Esimerkki kaaritaulukosta jossa unsigned int on 8 bittiä. 0 1 2 3 01001010 10000000 10010010 00000000 00001010 00000000 10000000 00000000 4 5 6 7 10100000 00000000 00000011 10000000 11100000 10000000 00000100 10000000 8 10000111 00000000 - Tietorakenne graafin solmujen painoille (tietorakenteen osoitin välitetään kutsuvalle moduulille, mutta varaus suoritetaan tässä moduulissa, joten tietorakenteen voinee esittää tämän moduulin yhteydessä) (yksiulotteinen kokonaislukutaulukko jossa kokonaislukutaulukon koko on graafin solmujen lukumäärä). - Tietorakenne tulosklikin solmuille (tietorakenteen osoitin välitetään kutsuvalle moduulille, mutta varaus suoritetaan tässä moduulissa, joten tietorakenteen voinee esittää tämän moduulin yhteydessä) (yksiulotteinen kokonaislukutaulukko jossa kokonaislukutaulukon koko on graafin solmujen lukumäärä). Taulukon alkion arvo on yksi, jos ratkaistavana oleva klikki sisältää kyseisen solmun.

TEKNINEN MÄÄRITTELY 12 (36) 3.4.3 Komentorivitulkkimoduuli - Tietorakenne graafista ratkaistavan klikin optioille. Tietorakenteen osoitin annetaan syöteparametrina graafin ratkaisumoduulille, jossa tietorakenteesta tehdään paikallinen kopio. Tietorakenne on seuraavaa muotoa: typedef struct { /* if true, running time information is displayed */ short int info; short int reorder; short int atleastsizes; short int maxclique; unsigned int sizes; short int allcliques; short int weighted; void (*printfunc)(); //true=graafin solmut järjestetään ennen ratkaisua //true=etsitään ainakin kokoa S oleva klikki //true=etsitään maksimiklikki //etsittävän klikin koko, mikäli etsitään tietyn tai vähintään tietyn kokoista klikkiä //true=etsitään kaikkia klikkejä //true=etsitään painotettua klikkiä //osoitin käyttäjän määrittelemään funktioon, jota kutsutaan aina graafin ratkaisun löydyttyä (syötteenä moduulille) } wc_options; Esimerkiksi muuttujien reorder, maxclique, allcliques ja weighted arvojen ollessa true, graafin solmut järjestetään painojensa perusteella, jonka jälkeen järjestetystä painotetusta graafista etsitään kaikkia painoltaan maksimi klikkejä.

TEKNINEN MÄÄRITTELY 13 (36) 4. PSEUDOKOODIMODUULIEN JA PROSESSIN KUVAUS Alla olevassa kuvassa 1, esitetään painottamattoman graafin tapauksessa tapahtuva prosessi. Aloitus Komentorivi: graafin syöte, kutsuttava funktio 4 Tulkitse komentorivi Jokin muu 1,2 tai 3 Etsi maksimiklikki 1 tai 2 3 Etsi yksi klikki / kaikki klikit kokoa S Lopetus Kuva 1. Painottamattomien graafien laskeminen Kommentteja: Tässä käsitelty tapaukset 1-4 (painottamaton). Ensimmäisessä moduulissa kutsutaan parametrilla annettua funktiota, joka esim. tulostaa klikin koon tai solmut. Toisessa moduulissa samoin. Lisäksi tutkitaan ehtoa, jonka perusteella päätettä, etsitäänkö vielä ensimmäisen löytyneen jälkeen loputkin. Tapaukset: 1. Painottoman maksimiklikin koko 2. Yhden maksimiklikin laskeminen 3. Kaikkien maksimiklikkien laskeminen 4. Yhden klikin laskeminen kokoa S

TEKNINEN MÄÄRITTELY 14 (36) 4.1 Ohjelman kulun pääperiaate loogisella tasolla Seuraavat operaatiot suoritetaan komentorivitulkkimoduulin pääohjelmassa käyttäen apuna moduulin omia, sekä apuohjelmamoduulin sisältämiä palveluita. - Mikäli ohjelman suoritus lopetetaan hallitusti virheellisen tapahtuman johdosta, virheilmoitus tilanteesta kirjoitetaan stderr:iin - Tulkitaan komentoriviparametrit - Mikäli --help tai -h parametri annettu, tulostetaan ohjelman opastusteksti stdout:iin ja lopetetaan ohjelman suoritus - Avataan tiedosto komentorivillä annetulla tiedoston nimellä. Mikäli nimeä ei ole annettu, luetaan stdin:nniä. - Luetaan graafin solmujen lukumäärä tiedostosta. Mikäli --type parametrin arvo on binary, yritetään lukea binääri-muotoista tiedostoa. Mikäli --type parametrin arvo on ASCII, yritetään lukea ASCII-muotoista tiedostoa. - Mikäli lukeminen estyy, ohjelman suoritus lopetetaan - Varataan muistialue kaaritaulukolle - Varataan muistialue solmujen painotaulukolle - Varataan muistialue tulosklikiin solmutaulukolle - Mikäli jokin varaus epäonnistuu, ohjelman suoritus lopetetaan - Alustetaan painotaulukko ykkösillä, joka on solmun oletuspaino, mikäli solmulle ei ole annettua painoa vaikka käsitellään painotettua graafia - Luetaan graafin kaaret tiedostosta ja täytetään kaaret kaaritaulukkoon. Mikäli type parametrin arvo on binary, luetaan binäärimuotoista tiedostoa. Mikäli --type parametrin arvo on ASCII, luetaan ASCII-muotoista tiedostoa. ASCII-tiedoston tapauksessa luetaan myös tiedoston mahdollisesti sisältämät solmujen painot ja täytetään ne solmujen painotaulukkoon. Mikäli tiedostosta löytyy yksikin ykkösestä poikkeava solmun paino, graafia käsitellään painotettuna graafina. - Mikäli tiedoston lukeminen estyy, ohjelman suoritus lopetetaan - Kutsutaan graafin ratkaisua, antaen samalla syötteenä osoittimet varattujen tietorakenteiden alkuun sekä tuloksen tulostusfunktioon, graafin solmujen lukumäärän, parametrit tietyn tyyppisen klikin ratkaisemiselle ja osoitin maksimiklikin kokoa varten - Graafin ratkaisumoduulista palattua, vapautetaan varatut muistialueet

TEKNINEN MÄÄRITTELY 15 (36) Seuraavat operaatiot suoritetaan graafin ratkaisumoduulissa - Kopioidaan syöteparametreina annetut osoittimet paikallisiksi osoittimiksi - Varataan muistialueet solmujen uudelle järjestykselle, maksimiklikkien kooille (c-arvo) ja käsittelyssä olevan klikin solmuille - Mikäli jonkin muistialueen varaus epäonnistuu, palataan virhekoodilla (false) moduulia kutsuneeseen ohjelmaan - Mikäli --reorder tai -r parametri on annettu, graafin solmujen läpikäyntijärjestys talletetaan kokonaisluku taulukkoon väritysmenetelmän avulla. Sekä painotetulle, että painottamattomalle graafille on oma järjestelyfunktio ja menetelmä. Väritysmenetelmät on kuvattu tarkemmin luvussa 4.12. - Ratkaistaan graafi seuraavien annettujen parametrikombinaatioiden perusteella: - --size=max, --type=one, --weighted; ratkaistaan yksi maksimiklikki painotetusta graafista - --size=max, --type=all, --weighted; ratkaistaan kaikki maksimiklikit painotetusta graafista - --size=s, --type=one, --weighted; ratkaistaan yksi kokoa S oleva klikki painotetusta graafista - --size=s, --type=all, --weighted; ratkaistaan kaikki kokoa S olevat klikit painotetusta graafista - --size=+s, --type=one, --weighted; ratkaistaan yksi vähintään kokoa S oleva klikki painotetusta graafista - --size=+s, --type=all, --weighted; ratkaistaan kaikki vähintään kokoa S olevat klikit painotetusta graafista - --size=max, --type=one; ratkaistaan yksi maksimiklikki painottamattomasta graafista - --size=max, --type=all; ratkaistaan kaikki maksimiklikit painottamattomasta graafista - --size=s, --type=one; ratkaistaan yksi kokoa S oleva klikki painottamattomasta graafista - --size=s, --type=all; ratkaistaan kaikki kokoa S olevat klikit painottamattomasta graafista - --size=+s, --type=one; ratkaistaan yksi vähintään kokoa S oleva klikki painottamattomasta graafista - --size=+s, --type=all; ratkaistaan kaikki vähintään kokoa S olevat klikit painottamattomasta graafista - Tarkempaa informaatiota ratkaisuista saa luvuista 4.2-4.10 joissa on esitetty graafien oleviin pseudokoodeihin... - Lisäyksenä pseudokoodien ulkopuolelta, mikäli --info tai -i parametri on annettu, tulostetaan graafin ratkaisusta väliaikatietoa stderr:iin. Väliaikatietona käsiteltävän solmun numero, löytyneen maksimiklikin koko ja ratkaisuun tähän mennessä käytetty aika.

TEKNINEN MÄÄRITTELY 16 (36) - Tulosklikin solmujen tulostus tapahtuu ratkaistavan graafin tyypistä riippuen ratkaisun eri vaiheissa. Periaate kaikissa tulostuksissa on kuitenkin sama. Kutsutaan moduulille syöteparametrina annettua funktio-osoitinta. Itse tulostusfunktio on kutsuvassa ohjelmassa (komentorivitulkkimoduulissa), mutta suorituksellisesti funktiota ajetaan tässä vaiheessa. Funktiossa luetaan läpi suurimman tai tulosklikin solmuille varattu tietorakenne ja tulostetaan sen sisältö stdout:iin. Mikäli on etsitty ainoastaan yhtä maksimiklikkiä, tulostetaan myös tämän klikin koko stdout:iin. - Graafin ratkaisumoduulissa varattujen muistialueiden vapautus

TEKNINEN MÄÄRITTELY 17 (36) 4.2 Pseudokoodimoduuli uw_maxclique 4.2.1 Kuvaus 4.2.2 Toteutus Pseudokoodimoduuli sisältää algoritmin painottamattomalle klikille, josta lasketaan maksimiklikin koko. /**** uw_maxclique etsii painottamattomasta graafista maksimiklikin *****/ function uw_maxclique(u; size) 1: if U = 0 then 2: if size > max then 3: max := size 4: \\ save new record 5: found := true 6: end if 7: return 8: end if 9: while U!= 0 do 10: if size + U <= max then 11: return 12: end if 13: i := min { j v j E U } 14: if size + c[i] <= max then 15: return 16: end if 17: U := U \ {v i } 18: uw_maxclique(u & N(v i ); size + 1) 19: if found = true then 20: return 21: end if 22: end while 23: return function uw_max 24: max := 0 25: for i := n downto 1 do 26: found := false 27: uw_maxclique(s i & N(v i ); 1) 28: c[i] :=max 29: end for 30: \\ call function x with maxclique 31: return 4.2.3 Virhekäsittely Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 18 (36) 4.3 Pseudokoodimoduuli uw_sclique 4.3.1 Kuvaus 4.3.2 Toteutus 4.3.3 Virhekäsittely uw_sclique etsii painottamattomasta graafista YHDEN annetun kokoisen klikin /**** uw_sclique etsii painottamattomasta graafista YHDEN annetun kokoisen klikin *****/ function uw_sclique(u; size) 1: if U = 0 then 2: if size > max then 3: max := size 4: if max = S then 5: \\ save new record 6: end if 7: found := true 8: end if 9: return 10: end if 11: while U!= 0 do 12: if size + U <= max then 13: return 14: end if 15: i := min { j v j E U } 16: if size + c[i] <= max then 17: return 18: end if 19: U := U \ {v i } 20: uw_sclique(u & N(v i ); size + 1) 21: if found = true then 22: return 23: end if 24: end while 25: return function uw_s 26: max := 0 27: for i := n downto 1 do 28: found := false 29: uw_sclique(s i & N(v i ); 1) 30: if max = S then 31: \\ call function x 32: return 33: end if 34: c[i] :=max 35: end for 36: return Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 19 (36) 4.4 Pseudokoodimoduuli uw_allsclique 4.4.1 Kuvaus 4.4.2 Toteutus uw_allsclique etsii painottamattomasta graafista KAIKKI annetun kokoiset klikit /**** uw_allsclique etsii painottamattomasta graafista KAIKKI annetun kokoiset klikit *****/ function uw_allsclique(u; size) 1: if size > max then 2: if size = S then 3: \\ call function x 4: else 5: max := size 6: found := true 7: end if 8: return 9: end if 10: while U!= 0 do 11: if size + U <= max then 12: return 13: end if 14: i := min { j v j E U } 15: if size + c[i] <= max then 16: return 17: end if 18: U := U \ {v i } 19: uw_allsclique(u & N(v i ); size + 1) 20: if found=true 21: return 22: end if 23: end while 24: return function uw_alls 25: max := 0 26: for i := n downto 1 do 27 found := false 28: uw_allsclique(s i & N(v i ); 1) 29: c[i] :=max 30: end for 31: return 4.4.3 Virhekäsittely Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 20 (36) 4.5 Pseudokoodimoduuli uw_allnlessclique 4.5.1 Kuvaus uw_allnlessclique painottamattomasta graafista kaikki vähintään annetun kokoiset klikit. 4.5.2 Toteutus /**** uw_allnlessclique painottamattomasta graafista kaikki vähintään annetun kokoiset klikit ****/ function uw_allnlessclique(u; size) 1: if size > max then 2: if size >= S then 3: \\ call function X 4: else 5: max := size 6: found := true 7: return 8: end if 9: end if 10: while U!= 0 do 11: if size + U <= max then 12: return 13: end if 14: i := min { j v j E U } 15: if size + c[i] <= max then 16: return 17: end if 18: U := U \ {v i } 19: uw_allnlessclique(u & N(v i ); size + 1) 20: if found := true 21: return 22: end if 23: end while 24: return function uw_allnless 25: max := 0 26: for i := n downto 1 do 27: found := false 28: uw_allnlessclique(s i & N(v i ); 1) 29: c[i] :=max 30: end for 31: return 4.5.3 Virhekäsittely Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 21 (36) 4.6 Pseudokoodimoduuli w_maxclique 4.6.1 Kuvaus 4.6.2 Toteutus w_maxclique etsii painotetusta graafista maksimi klikin function w_maxclique(u; size) 1: if U = 0 then 2: if size > max then 3: max := size 4: \\ save new record 5: end if 6: return 7: end if 8: while U!= 0 do 9: if size + wt(u) <= max then 10: return 11: end if 12: i := min { j v j E U } 13: if size + C[i] <= max then 14: return 15: end if 16: U := U \ {v i } 17: w_maxclique(u & N(v i ); size + w[i]) 18: end while 19: return function w_max 20: max := 0 21: for i := n downto 1 do 22: w_maxclique(s i & N(v i ); w[i]) 23: C[i] :=max 24: end for 25: \\ call function x with maxclique 26: return 4.6.3 Virhekäsittely Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 22 (36) 4.7 Pseudokoodimoduuli w_sclique 4.7.1 Kuvaus 4.7.2 Toteutus 4.7.3 Virhekäsittely w_sclique etsii painotetusta graafista YHDEN annetun kokoisen klikin /**** w_sclique etsii painotetusta graafista YHDEN annetun kokoisen klikin *****/ function w_sclique(u; size) 1: if size > max then 2: max := size 3: if max = S then 4: \\ save new record 5 found := true 6: return 7: end if 8: end if 9: while U!= 0 do 10: if size + wt(u) <= max then 11: return 12: end if 13: i := min { j v j E U } 14: if size + C[i] <= max then 15: return 16: end if 17: U := U \ {v i } 18: if size + w[i] > S then 19: continue 20: end if 21: w_sclique(u & N(v i ); size + w[i]) 22: if found = true then 23: return 24: end if 25: end while 26: return function w_s 27: max := 0 28: found := false 29: for i := n downto 1 do 30: w_sclique(s i & N(v i ); w[i]) 31: if found = true then 32: \\ call function x 33: return 34: end if 35: C[i] :=max 36: end for 37: return Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 23 (36) 4.8 Pseudokoodimoduuli w_allsclique 4.8.1 Kuvaus 4.8.2 Toteutus w_allsclique etsii painotetusta graafista KAIKKI annetun kokoiset klikit /**** w_allsclique etsii painotetusta graafista KAIKKI annetun kokoiset klikit *****/ function w_allsclique(u; size) 1: if size > max then 2: if size = S then 3: \\ call function x 4: return 5: else 6: max := size 7: end if 8: end if 9: while U!= 0 do 10: if size + wt(u) <= max then 11: return 12: end if 13: i := min { j v j E U } 14: if size + C[i] <= max then 15: return 16: end if 17: U := U \ {v i } 18: if size + w[i] > S then 19: continue 20: end if 21: w_allsclique(u & N(v i ); size + w[i]) 22: end while 23: return function w_alls 24: max := 0 25: for i := n downto 1 do 26: w_allsclique(s i & N(v i ); w[i]) 27: C[i] :=max 28: end for 29: return 4.8.3 Virhekäsittely Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 24 (36) 4.9 Pseudokoodimoduuli w_nlessclique 4.9.1 Kuvaus 4.9.2 Toteutus w_nlessclique painotetusta graafista YHDEN vähintään annetun kokoisen klikin function w_nlessclique(u; size) 1: if size > max then 2: max := size 3: if max >= S then 4: \\ save new record 5 found := true 6: return 7: end if 8: end if 9: while U!= 0 do 10: if size + wt(u) <= max then 11: return 12: end if 13: i := min { j v j E U } 14: if size + C[i] <= max then 15: return 16: end if 17: U := U \ {v i } 18: w_nlessclique(u & N(v i ); size + w[i]) 19: if found = true then 20: return 21: end if 22: end while 23: return function w_nless 24: max := 0 25: found := false 26: for i := n downto 1 do 27: w_nlessclique(s i & N(v i ); w[i]) 28: if found = true then 29: \\ call function x 30: return 31: end if 32: C[i] :=max 33: end for 34: return 4.9.3 Virhekäsittely Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 25 (36) 4.10 Pseudokoodimoduuli w_allnlessclique 4.10.1 Kuvaus 4.10.2 Toteutus w_allnlessclique painotetusta graafista KAIKKI vähintään annetun kokoiset klikit function w_allnlessclique(u; size) 1: if size > max then 2: if size >= S then 3: \\ call function x 4: else 5: max := size 6: end if 7: end if 8: while U!= 0 do 9: if size + wt(u) <= max then 10: return 11: end if 12: i := min { j v j E U } 13: if size + C[i] <= max then 14: return 15: end if 16: U := U \ {v i } 17: w_allnlessclique(u & N(v i ); size + w[i]) 18: end while 19: return function w_allnless 20: for i := n downto 1 do 21: w_allnlessclique(s i & N(v i ); w[i]) 22: C[i] :=max 23: end for 24: return 4.10.3 Virhekäsittely Ei sisällä virheenkäsittelyä.

TEKNINEN MÄÄRITTELY 26 (36) 4.11 Pääohjelma Alla on esitetty pääohjelman vuokaavio. start getparameters() Open File no if formatbinary yes getnbrofverticesfromasciifile() getnbrofverticesfrombinaryfile() allocwcedgetbl() allocwcweighttbl() allocwcresulttbl() fillwcweighttbl() no if formatbinary yes readdimacsbinary() readdimacsascii() //read Graph Close File wclique() freewcedgetbl() freewcweighttbl() freewcresulttbl() Kuva 2. Pääohjelman vuokaavio. end

TEKNINEN MÄÄRITTELY 27 (36) Pääohjelman wclique() funktio wclique: WCIntMask[] initialization local copy for options alloccliquetbls() sortcliquetbl no if weighted yes getuwcliques() getwcliques() no if findallmaxcliques yes no if weighted yes cliqueoptions getuwcliques() getwcliques() releasecliquetbls return

TEKNINEN MÄÄRITTELY 28 (36) 4.12 Graafin järjestäminen Graafin järjestämisellä pyritään nopeuttamaan varsinaisen algoritmin toimintaa. Tämä tapahtuu siten, että haun alkuvaiheessa maksimaalinen klikin koko pyritään pitämään pienenä, jolloin tähän perustuva haun typistys toimii mahdollisimman tehokkaasti. Solmut järjestetään väritysmenetelmällä siten, että naapurisolmut eivät saa olla samanvärisiä: Solmut Värit a1-an, b1-bn,...,m1-mn A,B,...,M Tietoa siitä, mitkä solmut väritetään samalla värillä ei käytetä, mutta läpikäyntijärjestys talletetaan kokonaislukutaulukkoon, jota varsinainen algoritmi käyttää. 4.12.1 Painotetun graafin värittäminen Järjestelyn periaate on seuraava: Valitaan painoarvoltaan pienin solmu. Samanpainoisten solmujen tapauksessa valitaan se solmu, jonka naapurien painot ovat suurimmat. Seuraavaksi valitaan solmuja, jotka eivät ole valitun solmun (eivätkä keskenään) naapureita yllämainittujen ehtojen mukaisesti. Nämä solmut "väritetään" samalla värillä ts. ne on listattu valintajärjestyksessä. Poistetaan väritetyt solmut ja päivitetään näiden naapureiden naapuripainot. Toistetaan yllämainitut toimenpiteet niin kauan kuin solmuja riittää. 4.12.2 Painottamattoman graafin värittäminen Painottamattomalla graafilla väritysperiaate on sama kuin edellä, mutta nyt käytetään valintakriteerinä ainoastaan solmun astelukua, eli solmusta lähtevien kaarien määrää. Poistettaessa väritetyt solmut graafista päivitetään myös näiden naapurien asteluvut.

TEKNINEN MÄÄRITTELY 29 (36) 4.13 DIMACS ASCII formaatin lukeminen Alla on esimerkki DIMACS:in ASCII formaatista jota ohjelma lukee syötteenä. c The following lines are all comments c number of vertices : 10 c nonisolated vertices: 9 c number of edges : 18 c This is the last comment line p clq 7 11 e 1 2 e 1 3 e 1 4 e 1 5 e 2 3 e 2 5 e 2 7 e 3 4 e 3 5 e 3 6 e 5 6 n 1 7 n 2 2 n 3 1 n 4 2 n 5 1 n 6 9 n 7 8 4.14 Ohjelman funktiot initcliqueproc -rutiinilla kirjastolle kerrotaan solmujen lukumäärä, T/F tieto järjestämisestä, T/F tieto haetaanko vähintään kokoa S olevia klikkejä, T/F tieto haetaanko maksimiklikkiä, koko S, T/F tieto haetaanko kaikkia klikkejä ja osoitin kirjaston kutsumaan tulostusrutiiniin. /* initcliqueproc(nbrofvertices,reorder,atleastsizes,maxsize,sizes,allcliques,*printcliquestd) */ fillcliquetbl -rutiinilla kirjastolle kerrotaan kaksi solmua, joiden välillä on kaari. /* fillcliquetbl(n1,n2) */ fillweighttbl -rutiinilla kirjastolle kerrotaan solmu ja sen paino. /* fillweighttbl(i,weigth) */ wclique -rutiinilla kerrotaan T/F tiedolla ollaanko laskemassa painotettua vai painottamatonta graafia sekä aloitetaan graafin ratkaiseminen alustusehdoilla. /* wclique(weighted) */

TEKNINEN MÄÄRITTELY 30 (36) 5. MUUT ERITYISET TEKNISET RATKAISUT 5.1 Komentorivikutsu Komentorivikutsu, eli komentoriviltä annettava kutsu parametreineen, tapahtuu seuraavan toteutusmallin mukaisesti: wclique [-hir] [--help] [--info] [--reorder] [--format={ascii,binary}] [--size={[+]n,max}] [--type={one,all}] [name] -h, --help -i, --info -r, --reorder tulostaa aputekstin tulostaa haun etenemisen näytölle. solmujen heuristinen järjestäminen --format={ascii,binary} syötetiedoston tyyppi, oletus on ASCII. --size={[+]n,max} haettujen klikkien koko, oletus on max, N := annettu koko, +N := >= annettu koko. --type={one,all} haettujen klikkien lukumäärä, oletus on one. Muutama tarkennus: 1. Painotettu/painottamaton: binaaritiedosto => aina painottamaton, ASCII => selviää tiedoston sisällöstä. 2. Jos syöte tiedoston nimi puuttuu luetaan standardi syöte. 3. Ohjelma tulostaa aina kaikki klikit, yksi klikki per rivi -> standardi tuloste. 5.2 Ohjelman kääntäminen Ohjelman käännöskomento on: gcc wcfinder.c -o wclique O2, missä wclique on ohjelman nimi.

TEKNINEN MÄÄRITTELY 31 (36) 6. HYLÄTYT RATKAISUVAIHTOEHDOT 6.1 Bittikarttaesitys Sisäisessä tietorakenteessa luovuttiin bittikarttaesityksestä tehokkuussyistä. 7. VIRHEKÄSITTELY sisältää ainoastaan seuraavat virheenkäsittely ominaisuudet: Syötetiedosto viallinen. Ohjelman suoritus keskeytetään mikäli graafin määrittelyrivi puuttuu tai on viallinen. Ohjelman suoritus keskeytyy myös tilanteessa jos solmujen numerot ovat liian suuria. Muistin loppuminen (tapauksessa että allokointi ei onnistu). Kyseisessä tilanteessa ohjelman suoritus loppuu. Tässä on huomioitavaa että graafin kokoa ei kiinteästi rajoiteta. Muita virhetapauksia varten lopputuotteessa ei ole virheenkäsittelyä. Control-C ja muut epänormaalit ohjelmansuorituksen lopetukset ovat Unix käyttöjärjestelmän toiminnallisuutta. Ohjelma ainoastaan varmistaa että käytönaikaiset tiedostot jäävät eheiksi [unixprog].

TEKNINEN MÄÄRITTELY 32 (36) LIITE 1: KÄYTTÄJÄN FUNKTIOT Alla on esitetty kaikki ohjelmassa esiintyvät käyttäjälle tärkeät funktiot. wclique -moduuli: Funktio graafin ratkaisuun. short int wclique(unsigned int nbrofvertices,wc_options *options,unsigned int *edgetbl,unsigned int *weighttbl,char *rescliquetbl,unsigned int *maxclique) NbrOfVertices -parametri määrittää graafin solmujen lukumäärän. Wc_options -parametri määrittää ominaisuuden, jota graafista etsitään. Tietorakenne on kuvattu tarkemmin teknisessä määrittelyssä. EdgeTbl -parametri on osoitin graafin kaaritaulukkoon. Käyttäjän on varattava ja täytettävä muistialue tietorakenteelle ennen funktiokutsua. Kaaritaulukko on kuvattu tarkemmin teknisessä määrittelyssä. WeightTbl -parametri on osoitin graafin solmujen painotaulukkoon. Käyttäjän on varattava ja täytettävä muistialue tietorakenteelle ennen funktiokutsua. ResCliqueTbl -parametri on osoitin tulosklikkiin. Käyttäjän on varattava muistialue tietorakenteelle ennen funktiokutsua. Tietorakenne on kuvattu tarkemmin teknisessä määrittelyssä. MaxClique -parametri on osoitin maksimiklikin kokoon, jonka arvona on maksimiklikin koko siinä tapauksessa, että käyttäjä on pyytänyt laskemaan yhden maksimiklikin. Paluuarvona funktion palauttaa true/false tiedon onnistumisesta tai epäonnistumisesta.

TEKNINEN MÄÄRITTELY 33 (36) wcutils -moduuli: Funktio kaaritaulukon varausta varten (funktio myös alustaa taulukon). short int allocwcedgetbl(unsigned int nbrofvertices,unsigned int **tblptr) NbrOfVertices -parametri määrittää graafin solmujen lukumäärän. TblPtr -parametri on osoitin graafin kaaritaulukkoon, jonka funktio palauttaa. Funktio graafin solmujen painotaulukon varausta varten. short int allocwcweighttbl(unsigned int nbrofvertices,unsigned int **tblptr) NbrOfVertices -parametri määrittää graafin solmujen lukumäärän. TblPtr -parametri on osoitin graafin solmujen painotaulukkoon, jonka funktio palauttaa. Funktio tulosklikin taulukon varausta varten. short int allocwcresulttbl(unsigned int nbrofvertices,char **tblptr) NbrOfVertices -parametri määrittää graafin solmujen lukumäärän. TblPtr -parametri on osoitin tulosklikkiin, jonka funktio palauttaa. Funktio kaaritaulukon alustusta varten. void initwcedgetbl(unsigned int nbrofvertices,unsigned int *tblptr) NbrOfVertices -parametri määrittää graafin solmujen lukumäärän. TblPtr -parametri on osoitin graafin kaaritaulukkoon.

TEKNINEN MÄÄRITTELY 34 (36) Funktio yhden kaaren lisäämiseksi graafitaulukkoon. void fillwcedgetbl(unsigned int *edgetblptr,unsigned int nbrofvertices,unsigned int vertex1,unsigned int vertex2) EdgeTblPtr -parametri on osoitin graafin kaaritaulukkoon. NbrOfVertices -parametri määrittää graafin solmujen lukumäärän. Vertex1 -parametri on kaaren toisen pään solmu ja Vertex2 -parametri toisen pään solmu. Funktio yhden kaaren poistamiseksi graafitaulukosta. void removewcedgetbl(unsigned int *edgetblptr,unsigned int nbrofvertices,unsigned int vertex1,unsigned int vertex2) EdgeTblPtr -parametri on osoitin graafin kaaritaulukkoon. NbrOfVertices -parametri määrittää graafin solmujen lukumäärän. Vertex1 -parametri on kaaren toisen pään solmun indeksi ja Vertex2 -parametri toisen pään solmun indeksi. Funktio yhden solmun painon lisäämiseksi painotaulukkoon. void fillwcweighttbl(unsigned int *weighttblptr,unsigned int vertex,unsigned int weight) WeightTbl -parametri on osoitin graafin solmujen painotaulukkoon. Vertex -parametri on solmun indeksi. Weight -parametri on solmun paino.

TEKNINEN MÄÄRITTELY 35 (36) Funktio graafin solmujen lukumäärän lukemiseksi Dimacs ascii formaatissa olevasta tiedostosta. short int getnbrofverticesfromasciifile(file *f,unsigned int *nbrofvertices) F -parametri on osoitin tiedostoon. NbrOfVertices -parametri on osoitin graafin solmujen lukumäärään, jonka funktio palauttaa. Funktio graafin solmujen lukumäärän lukemiseksi Dimacs binääri formaatissa olevasta tiedostosta. short int getnbrofverticesfrombinaryfile(file *f,unsigned int *nbrofvertices) F -parametri on osoitin tiedostoon. NbrOfVertices -parametri on osoitin graafin solmujen lukumäärään, jonka funktio palauttaa. Funktio graafin kaarien ja solmujen painojen lukemiseksi Dimacs ascii formaatissa olevasta tiedostosta (funktio lisää kaaret ja solmujen painot itsenäisesti kaari- ja solmujen painotaulukoihin). short int readdimacsascii(unsigned int *edgetblptr,unsigned int *weighttblptr,file *f,unsigned int nbrofvertices,short int *weighted) EdgeTblPtr -parametri on osoitin graafin kaaritaulukkoon. WeightTbl -parametri on osoitin graafin solmujen painotaulukkoon. F -parametri on osoitin tiedostoon. NbrOfVertices -parametri määrittää graafin solmujen lukumäärän. Weighted -parametri on osoitin informaation, jolla kerrotaan funktiota kutsuneelle prosessille, onko tiedostosta luettu graafi painotettu (true) vai painottamaton (false).

TEKNINEN MÄÄRITTELY 36 (36) Funktio graafin kaarien lukemiseksi Dimacs binääri formaatissa olevasta tiedostosta (funktio lisää kaaret itsenäisesti kaaritaulukkoon). void readdimacsbinary(unsigned int *edgetblptr,file *f,unsigned int nbrofvertices) EdgeTblPtr -parametri on osoitin graafin kaaritaulukkoon. F -parametri on osoitin tiedostoon. NbrOfVertices -parametri määrittää graafin solmujen lukumäärän.