zgo s cevanje redkih (lr) tabeleprints.fri.uni-lj.si/1092/1/Štangar_d.-vs.pdf · check tabela:...

101
UNIVERZA V LJUBLJANI FAKULTETA ZA RA ˇ CUNALNI ˇ STVO IN INFORMATIKO Domen ˇ Stangar Zgoˇ cevanje redkih (LR) tabel DIPLOMSKO DELO NA VISOKO ˇ SOLSKEM STROKOVNEM ˇ STUDIJU Mentor: prof. doc. dr. Boˇ stjan Slivnik Ljubljana, 2010

Upload: others

Post on 04-Nov-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

UNIVERZA V LJUBLJANIFAKULTETA ZA RACUNALNISTVO IN INFORMATIKO

Domen Stangar

Zgoscevanje redkih (LR) tabel

DIPLOMSKO DELONA VISOKOSOLSKEM STROKOVNEM STUDIJU

Mentor: prof. doc. dr. Bostjan Slivnik

Ljubljana, 2010

Page 2: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela
Page 3: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Rezultati diplomskega dela so intelektualna lastnina Fakultete za racunalnistvo in

informatiko Univerze v Ljubljani. Za objavljanje ali izkoriscanje rezultatov

diplomskega dela je potrebno pisno soglasje Fakultete za racunalnistvo in

informatiko ter mentorja.

Besedilo je oblikovano z urejevalnikom besedil LATEX.

Page 4: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

original izdane teme diplomskega dela

Page 5: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela
Page 6: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

IZJAVA O AVTORSTVU

diplomskega dela

Spodaj podpisani Domen Stangar,

z vpisno stevilko 63000116,

sem avtor diplomskega dela z naslovom:

Zgoscevanje redkih (LR) tabel

S svojim podpisom zagotavljam, da:

• sem diplomsko delo izdelal samostojno pod mentorstvomprof. doc. dr. Bostjana Slivnika

• so elektronska oblika diplomskega dela, naslov (slov., angl.), povzetek(slov., angl.) ter kljucne besede (slov., angl.) identicni s tiskano oblikodiplomskega dela

• soglasam z javno objavo elektronske oblike diplomskega dela v zbirki“Dela FRI”

V Ljubljani, dne 14. 5. 2010 Podpis avtorja:

Page 7: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela
Page 8: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Kazalo

Povzetek 1

Abstract 2

1 Redke tabele 3

1.1 Uvod v problematiko . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2 Uvod v sintaksni analizator vrste LR . . . . . . . . . . . . . . . 4

2 Metode zgoscevanja 7

2.1 Metode zgoscevanja matrik . . . . . . . . . . . . . . . . . . . . . 7

2.2 Metode zgoscevanja LR tabel . . . . . . . . . . . . . . . . . . . 10

2.3 Metoda barvanja grafov (GCS) . . . . . . . . . . . . . . . . . . 10

2.4 Metoda eliminacije (LES) . . . . . . . . . . . . . . . . . . . . . 16

2.5 Metoda odmika (RDS) . . . . . . . . . . . . . . . . . . . . . . . 20

2.6 Metoda zamika zacetne in zadnje vrednosti (SDS) . . . . . . . . 30

2.7 Metoda vrstica, stolpec (RCS) . . . . . . . . . . . . . . . . . . . 30

2.8 Metoda izogibanja nicnih vrednosti (SZS) . . . . . . . . . . . . 32

2.9 Primerjava metod pri zgoscevanju LR tabel . . . . . . . . . . . 33

3 Implementacija sintaksnega analizatorja 35

3.1 Sintaksni analizator Bison . . . . . . . . . . . . . . . . . . . . . 35

3.1.1 Algoritem zgoscevanja tabel pri Bisonu . . . . . . . . . . 36

3.1.2 Algoritem preverjanja sintakse . . . . . . . . . . . . . . . 40

3.2 Analiza patenta za zgoscevanje LR tabel . . . . . . . . . . . . . 42

4 Sklep 44

A Priloga 45

Seznam slik 45

Page 9: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

8 KAZALO

Seznam tabel 47

Seznam algoritmov 48

Literatura 49

B izvorna koda zgoscevanje redke tabele 50

C izvorna koda analize in uporabe Bison tabele 71

D izvorna koda uporabe patenta 76

Page 10: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Seznam uporabljenih kratic insimbolov

Bison: Odprtokodna resitev, v kateri najdemo sintaksni generator in analizatorvrste LALR (Look-Ahead LR).Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa.Data table: Tabela pri metodi RDS, v kateri imamo vrednosti elementov.Displacement tabela: Tabela pri metodi RDS, v kateri imamo odmike za vrsticoali stolpec.Eli: Odprtokodna resitev, v kateri imamo sintaksni generator in analizator vrsteLR. Ima tudi moznost uporabe starejsih metod poleg trenutno edine uporabljenemetode za zgoscanje LR tabel.GCS: Graph coloring scheme - Metoda barvanja grafovLES: Line elimination scheme - Metoda eliminacijeLR: (Left to right) - Sintaksna analiza, ki bere vhod od leve proti desni ter deterministicnosestavi skrajno desno izpeljavo v nasprotnem vrstnem redu.Matlab: Popularno programsko orodje, v katerem se tudi uporabljajo redke tabeleRCS: Row column scheme - Metoda vrstica, stolpecRDS: Row displacement scheme - Metoda odmikaSDS: Significant distance scheme - Metoda zamika zacetne in zadnje vrednostiSigmap: Tabela pri metodi GCS in LES, v kateri preverjamo, ali imamo za dolocenovrstico ali stolpec veljavno vrednost.SZS: Suppressed zero scheme - Metoda izogibanja nicnih vrednosti

Page 11: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Povzetek

Diplomska naloga se ukvarja z algoritmi za zgoscanje redkih tabel. Redkatabela predstavlja tabelo, v kateri imamo veliko elementov, njihova vrednost jenepomembna, vendar nam kljub temu zasedajo prostor. Problematika redkihtabel se pojavlja v LR tabelah, tabelah velikih dimenzij in pri matrikah velikegareda, v katerih je veliko vrednosti 0.LR tabele se uporabljajo pri sintaksni analizi in lahko zasedejo veliko pomnilnika,hkrati pa je vsebina tabele skorajda prazna, zato potrebujemo algoritme, kizgoscujejo tabele. Ob vsakem izvajanju ali prevajanju programov potrebujemodostop do tabele. Ce teh tabel ne bi zgoscevali, bi za samo preverjanje sintaksepotrebovali vec pomnilnika.Diplomska naloga v prvem delu opisuje prakticne primere zgoscevanja redkihtabel in podrobno opisuje algoritme posameznih metod. Tako obravnavamometode barvanja grafov, eliminacije, odmika vrstic in metodo vrstica-stolpec.Na koncu prvega dela je narejena primerjava rezultatov na primeru LR tabel. Izprimerjave dobimo trenutno najbolj pogosto uporabljeno metodo za zgoscevanjeredkih tabel.V drugem delu je predstavljena uporaba zgoscenih LR tabel pri sintaksnemanalizatorju Bison in implementacijo sintaksnega analizatorja z uporabo LRtabel, ki jih generira generator Bison. Implementiran je tudi v delu [2] objavljenipatent na podrocju zgoscanja LR tabel.V prilogah so navedene izvorne kode za vse metode, ki so bile obravnavane vnalogi, prav tako pa tudi implementacija sintaksnega analizatorja.

Kljucne besede:redke tabele, LR tabele, sintaksna analiza, redke matrike, zgoscevanje redkihtabel

1

Page 12: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Abstract

This diploma thesis deals with algorithms for compressing sparse tables. Sparsetable represents a table in which we have many items whose value is irrelevant,but it nevertheless take up space. The problem of sparse tables occurs in LRtables, tables of large dimensions and high order matrices in which we havehigh number of values 0.The LR table is used for syntactic analysis and can take up lot of memory, whilethe contents of the table is almost empty, so we need algorithms that compressthose tables. At any execution or translation of a program we need accessto the table. If these tables would not be compressed, we would need morememory just to check the syntax. In the first part of the paper we describepractical examples of sparse tables and we describe in detail the algorithms ofeach method. We describe methods like graph coloring, line elimination, rowdisplacement and row column scheme.In second part we present the use of compressed LR tables and implement asyntactic analyzer using LR tables generated by the Bison. We also implementa patent which is also published in compressing LR table. In the annexes youcan find the source code for all methods that we have discussed in this paperand the implementation of the syntactical analyzer.

Key words:sparse tables, LR tables, syntax analysis, sparse matrix, compressing sparsetables

2

Page 13: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Poglavje 1

Redke tabele

1.1 Uvod v problematiko

V diplomski nalogi se ukvarjamo s problematiko zgoscanja LR tabel. LR tabeledobimo iz sintaksnih generatorjev in so del sintaksnih analizatorjev, zato jihpotrebujemo za sintaksno analizo. Obicajno so te tabele vecjih dimenzij invsebujejo zelo malo elementov s pomembno vrednostjo. Taki tabeli recemoredka tabela.Redko tabelo si lahko predstavljamo kot veliko tabelo, ki ima veliko stevilostolpcev in vrstic, vendar ima vecina vsebine tabele nicno vrednost. V tabeli zdolocenimi dimenzijami celice zasedajo pomnilnik, ne glede na to, ali potrebujemovrednost dolocene celice, zato se nam tako tabelo splaca zgoscevati.Lahko si predstavljamo, da potrebujemo tabelo, v kateri imamo vse izdelkein vse stranke, ki te izdelke kupujejo. Ce vrstice tabele predstavljajo stranke,stolpci izdelke, in imamo 10.000 izdelkov in 5000 strank, potrebujemo za totabelo 50.000.000 celic. Glede na to, da vse stranke ne kupujejo vseh izdelkov,si lahko predstavljamo, da bo tabela vecinoma prazna.Se en primer redke tabele so matrike. Matriki kot sta spodnja ali zgornjatrikotna, predstavljata primer redkih tabel. Ko delamo z matrikami velikegareda, lahko prihranimo veliko pomnilnika.Redke tabele lahko definiramo tudi kot tabele, za katere poznamo zapis nanacin, ki zaseda manj pomnilnika, kot ga v osnovni obliki. Taka definicijaredke table je zapisana v delu [4]. Za novi zapis je pomemben cas, ki gapotrebujemo, da zapis uredimo, oziroma kaksna je dodatna cena za novi zapis,glede na pomnilnik ali cas dostopa do dolocene celice.Vsekakor bi radi, da je cas gradnje novega zapisa cim krajsi, da nam koncnizapis zaseda cim manj pomnilnika in da imamo pri tem dostop cim krajsi,

3

Page 14: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

4 Poglavje 1: Redke tabele

vendar kot obicajno, vse hkrati ni mozno. Imamo algoritme, ki imajo kratekdostopni cas do elementov, vendar se nam podaljsa cas grajenja tega zapisa.Locimo dinamicno ali staticno dodajanje elementov. Pri staticnem dodajanjuelementov imamo vrednosti dolocene ze vnaprej in si zato lahko vzamemo veccasa, kot pri dinamicnem dodajanju elementov. Staticno dodajanje elementovje torej bolj kvalitetno in tudi bolj dostopno, kot dinamicno dodajanje.V diplomski nalogi se bomo osredotocili na staticni nacin dodajanja elementovin kakovost dolocenih metod za zgoscanje LR tabel.

1.2 Uvod v sintaksni analizator vrste LR

Prevajalnik je racunalniski program, ki prevede izvorno kodo programske opreme,napisano v visjenivojskem programskem jeziku, v vmesno kodo programskeopreme ali strojni jezik. Programske opreme prevajalnikov vsebujejo vec fazoziroma stopenj, po katerih poteka prevod. Prvo od faz imenujemo leksikalnaanaliza. Naloga leksikalne analize je, da vhodne znake zdruzi v vecje pomenskeenote, kot so imena spremenljivk, kljucne besede in stevilcne konstante. Temenotam pravimo osnovni simboli in jih uporablja sintaksna analiza. To jepostopek, s katerim ugotovimo sintaksno zgradbo nekega niza simbolov (gledena gramatiko jezika). Sintaksni analizator vrste LR se v praksi uporabljanajbolj pogosto in predstavlja najpomembnejso vrsto desne analize. Sintaksnianalizator vrste LR je skladovni pretvornik, ki izracuna desno sled izpeljavevhodnega niza in jo izpise v obratnem vrstnem redu.LR sintaksni analizator je sestavljen iz vhoda, izhoda, sklada, pogona in dvehtabel (LR tabela). Kako bo sintaksni analizator deloval, dolocata tabeli prehodovin odlocitev. Analizator bere po en simbol naenkrat. Katero operacijo boizbral, se odloci glede na trenutno stanje in vhod, ter na podlagi odlocitvenetabele in tabele prehodov. Odlocitvena tabela lahko vsebuje pomik, prevedbo,sprejem ali napako. Ce je operacija prevedba, potem na stanje analizatorjavpliva tudi tabela prehodov. Ta vsebuje prehode, ki jih uporabimo glede natrenutno stanje sklada.Na velikost teh dveh tabel vpliva gramatika, zato je treba omeniti se vmesnein koncne simbole, ki so del gramatike jezika in hkrati vplivajo na velikost tehdveh tabel. V primeru (slika 1.1) so simboli id,’+’,’*’,’(’,’)’,$ koncni simboli,Izraz, Termin, Faktor pa so vmesni simboli.Primer delovanja analizatorja je viden v tabeli 1.2, pri vhodu id+id* id$.Vhod si lahko predstavljamo kot niz znakov, s katerim preverjamo ali je sintaksapravilna. Id v nasem primeru predstavlja neko spremenljivko, ki jo uporabljamo

Page 15: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

1.2 Uvod v sintaksni analizator vrste LR 5

v programu.Pri preverjanju sintakse uporabljamo tabelo 1.1, brez katere sintaksni analizatorne more delovati. V nasem primeru je gramatika zelo osnovna, LR tabeli sepovecujeta, glede na stevilo vmesnih in koncnih simbolov, zato je zgoscevanjete tabele smiselno.

Slika 1.1: Gramatika

1. Izraz → Izraz + Termin

2. Izraz → Termin

3. Termin→ Termin ∗ Faktor

4. Termin→ Faktor

5. Faktor → (Izraz)

6. Faktor → id

Page 16: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

6 Poglavje 1: Redke tabele

Tabela 1.1: LR Tabela

Stanje Odlocitvena tabela Tabela prehodov

id + * ( ) $ Izraz Termin Faktor

0 Po5 Po4 1 2 3

1 Po6 Spr

2 p2 Po7 p2 p2

3 p4 p4 p4 p4

4 Po5 Po4 8 2 3

5 p6 p6 p6 p6

6 Po5 Po4 9 3

7 Po5 Po4 10

8 Po6 Po11

9 p1 Po7 p1 p1

10 p3 p3 p3 p3

11 p5 p5 p5 p5

Tabela 1.2: Delovanje LR analizatorja

Korak Sklad Simboli Vhod Pripomba

1 0 id+id*id$ Pomik v stanje 5

2 0 5 id +id*id$ Prevedba po 6 (Faktor → id)

3 0 3 Faktor +id*id$ Prevedba po 4 (Termin→ Faktor)

4 0 2 Termin +id*id$ Prevedba po 2 (Izraz → Termin)

5 0 1 Izraz +id*id$ Pomik v stanje 6

6 0 1 6 Izraz+ id*id$ Pomik v stanje 5

7 0 1 6 5 Izraz+id *id$ Prevedba po 6 (Faktor → id)

8 0 1 6 3 Izraz+Faktor *id$ Prevedba po 4 (Termin→ Faktor)

9 0 1 6 9 Izraz+Termin *id$ Pomik v stanje 7

10 0 1 6 9 7 Izraz+Termin* id$ Pomik v stanje 5

11 0 1 6 9 7 5 Izraz+Termin*id $ Prevedba po 6 (Faktor → id)

12 0 1 6 9 7 10 Izraz+Termin*Faktor $ Prevedba po 3 (Termin→ Termin ∗ Faktor)

13 0 1 6 9 Izraz+Termin $ Prevedba po 1 (Izraz → Izraz + Termin)

14 0 1 Izraz $ Sprejem

Page 17: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Poglavje 2

Metode zgoscevanja

V tem poglavju bomo predstavili splosne metode, ki se uporabljajo pri zgoscevanjuredkih tabel. V nasem primeru je to zgoscevanje LR tabel ali matrik. Glede nato, da je problematika podobna, se metode za zgoscevanje lahko uporabljajov obeh primerih, le da lahko pri LR tabelah izkoriscamo dolocene lastnosti, kijih matrike nimajo.

2.1 Metode zgoscevanja matrik

Pri matrikah nas zanima hitro grajenje zgoscene oblike in hiter cas dostopa doelementov. Tako obstajajo razlicne resitve:

• Slovar po kljucu (stolpec, vrstica) (Dictionary of Keys)

• Seznam seznamov (List of Lists)

• Koordiniran seznam (Coordinate List)

• Yale format matrike (Yale Sparse Matrix)

Slovar po kljucu stolpec, vrstica

V slovar preslikamo vse pare (vrstica, stolpec), ki imajo vrednost drugacno odnic. Pri iskanju elementa, ki ga ni v slovarju, moramo pregledati celotni slovar.To je osnovna oblika zgoscevanja, vendar ta nacin ne omogoca konstantnegadostopa do elementov.

7

Page 18: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

8 Poglavje 2: Metode zgoscevanja

Seznam seznamov

To je seznam vrstic, od katerih vsaka vsebuje kazalec na nov seznam vrstice. Tavsebuje indeks stolpca in vrednost celice stolpca. Rezultat je seznam seznamov,s katerim lahko dostopamo do redke tabele, s tem zapisom pa lahko prihranimonezasedeni prostor, vendar cas dostopa ni konstanten.

Slika 2.1: Seznam seznamov

(a) Tabela

33 6 921

5 117

(b) Seznam

1

2

3

4

Seznam vrstic

1 33

21

5

7

11

6 94 5

3

4

1

5

Koordiniran seznam

To obliko uporablja tudi matematicni program Matlab. Kako Matlab uporabljata zapis, je podrobno opisano v delu [4]. Podobno metodo uporabljamo tudipri zgoscanju LR tabel.Matlab uporablja tri tabele za zapis ne-nicnih elementov. Za primer smouporabili vhodno tabelo (2.1a). Prva tabela vsebuje vse ne-nicne elemente(tabela 2.1b) in si elementi sledijo glede na stolpec. Druga tabela vsebujevrstico, na kateri naj bi bil ta element (tabela 2.1c), tretja tabela pa vsebujeindekse za zacetek stolpca, s katerim dobimo indeks na prvo tabelo (tabela2.1d). S tem nacinom zapisa potrebujemo prostor za 2 ∗ nnz + n elementov.Nnz predstavlja stevilo nenicnih elementov, n pa stevilo stolpcev.Podobno metodo uporabljamo tudi pri zgoscevanju LR tabel, ki je podrobnoopisana v poglavju 2.7. Razlika med metodama je, v smeri, ki jo uporabljamoza preverjanje veljavnosti elementov - tako, kot si sledijo v vrstici, ali kot sisledijo v smeri stolpca.

Page 19: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.1 Metode zgoscevanja matrik 9

Tabela 2.1: Primer za Matlab

(a) Vhodnatabela

21 3 5

4 6

(b) Nenicni elementi

2 1 3 5 4 6

(c) Vrstica elementa

0 1 1 1 2 2

(d) Indeks prvega elementav stolpcu

0 2 3 5

Yale format matrike

To je zelo uporabna metoda, ki se tudi uporablja za zgoscevanje LR tabel. Opisbomo nadaljevali v poglavju 2.5. Razlika med zapisom LR tabel ali matrik jev tem, kako si elementi sledijo v tabeli. Pri matrikah se obicajno uporabljastolpec, pri LR tabelah se uporabljajo vrstice.

Page 20: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

10 Poglavje 2: Metode zgoscevanja

2.2 Metode zgoscevanja LR tabel

Metode za uporabo pri zgoscevanju LR tabel so bile podrobno analizirane vdelu [3, 1].Tako imamo metode:

• Metoda barvanja grafov (Graph Coloring Scheme)

• Metoda eliminacije (Line Elimination Scheme)

• Metoda odmika (Row Displacement Scheme)

• Metoda zamika zacetne in zadnje vrednosti (Significant Distance Scheme)

• Metoda vrstica, stolpec (Row Column Scheme)

• Metoda izogibanja nicnih vrednosti (Suppressed Zero Scheme)

2.3 Metoda barvanja grafov (GCS)

V tej metodi poskusamo zdruziti vrstice ali stolpce tako, da cimbolj zapolnimoprazne prostore. Kot primer imamo tabelo (2.2a), kjer poskusamo zdruzitivrstice, ki nimajo vrednosti v istih stolpcih. Ko to zdruzevanje koncamo,dobimo novo tabelo, ki je bolj zgoscena, in novo preslikavo vrstic (tabela 2.2b).Nova preslikava vrstic preusmeri staro vrstico v novo vrstico, s katero najdemovrednosti dolocene vrstice. Ko so vrstice preslikane, dobimo bolj zgoscenoobliko tabele z novimi dimenzijami (2.2c). S tem koncamo zgoscevanje povrsticah. Isto lahko naredimo tudi z zgoscevanjem stolpcev in dobimo koncnozgosceno tabelo 2.2e. Da lahko preverjamo veljavnosti elementov, potrebujemotudi bitno polje sigmap v velikosti tabele pred zgoscanjem, tako da ne moremodobiti neveljavne vrednosti.Metoda se imenuje metoda barvanja grafov zato, ker iskanje vrstic, ki jihlahko zdruzimo, poteka po principu barvanja grafov. Vsaka vrstica predstavljavozlisce v grafu, kjer poskusamo zdruziti vozlisca s tem, da uporabimo cimmanj barvila in s tem zmanjsamo dimenzije tabele.Zgoscevanje se zacne z iskanjem sosednjih vrstic, ki jih kasneje uporabimo pribarvanju. Pri tem stejemo sosednje vrstice, katerih stevilo pomaga pri vrstnemredu barvanja. Sosednja vrstica je tista vrstica, ki ima razlicne vrednosti naistih stoplcih. To nam pomaga pri barvanju, da sosednji vrstici ne moreta bitiv isti barvi. Tista vrstica, ki ima najvec sosednjih vrstic, bo bolj verjetno vsvoji barvi, zato vrstice, ki jih imajo najvec, barvamo najprej. Vsaka barva

Page 21: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.3 Metoda barvanja grafov (GCS) 11

predstavlja vrstico ali stolpec v novi tabeli.Rezultat tega zgoscevanja je tabela, ki ima veliko manj praznega prostora.Kot slabost te metode je treba omeniti, da potrebujemo bitno polje (sigmap,algoritem 2.2), s katerim preverjamo, ali imamo v doloceni vrstici ali stolpcunenicno vrednost. Brez bitnega polja ne moremo preverjati veljavnosti dolocenegaelementa.

Tabela 2.2: Primer metode GCS

(a) Primer tabele

12

35 4

(b) Columnmap

1112

(c) Nova tabela pozgoscevanju vrstic

1 2 35 4

(d) Rowmap

1 2 3 1

(e) Koncna oblikanove tabele

1 2 34 5

Algoritem

V prvem delu algoritma dolocimo vse sosednje vrstice za vsako vrstico posebej,kar prikazuje algoritem 2.3. Nato sortiramo vrstice po stevilu sosednjih vrsticin sledi se barvanje teh vrstic. Barvanje poteka po algoritmu 2.4. Zacnemos prvo barvo in poskusamo barvati z ze obstojecimi barvami. Ce ne najdemoprostora z obstojecimi barvami, moramo dodati novo barvo. Kakovost rezultatazgoscevanja je odvisen od stevila barv, ki jih potrebujemo, da lahko zdruzimovrstice.

Page 22: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

12 Poglavje 2: Metode zgoscevanja

Algorithm 2.1 GCS branje tabele

Izhod: Vrednost elementa na dolocenem mestuVhod: sigmap[visina][sirina] (Bitno polje za preverjanje veljavnosti

elementov)Vhod: novatabela[][] (Zgoscena oblike tabele)Vhod: rowmap[visina], columnmap[sirina] (Preslikava vrstic in stolpcev v

novo tabelo)Vhod: i,j (Vrstica in stolpec zahtevanega elementa)

if sigmap[i,j] = 1 thenreturn novatabela[rowmap[i],[columnmap[j]]

elsereturn 0

end if

Algorithm 2.2 Generiranje tabele Sigmap

Izhod: sigmap[visinatabele][sirinatabele] (Bitno polje za preverjanje veljavnostielementov)

Vhod: vhodnatabela[visinatabele][sirinatabele], sirinatabele, visinatabelefor i = 0 to visinatabele do

for j = 0 to sirinatabele doif vhodnatabela[i,j] 6= 0 thensigmap[i,j]← 1

elsesigmap[i,j]← 0

end ifend for

end for

Page 23: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.3 Metoda barvanja grafov (GCS) 13

Algorithm 2.3 GCS iskanje in dodajanje sosednjih vrstic

Vhod: vhodnatabela[visinatabele][sirinatabele], sirinatabele, visinatabeleIzhod: sosednjevrstice [visinatabele] [ ] (Sosednje vrstice)Izhod: stevilososedovvrstice [visinatabele] (Stevilo sosednjih vrstic posamezne

vrstice)Izhod: sortiranevrstice [visinatabele] (Vsebuje sortirane indekse vrstic po

kljucu stevila sosednjih vrstic)for i = 0 to visinatabele do

for j = 0 to i dojesosednjavrstica← 1for x = 0 to sirinatabele do

if vhodnatabela[j][x] 6= 0 and vhodnatabela[i][x] 6= 0 andvhodnatabela[i][x] 6= vhodnatabela[j][x] thenjesosednjavrstica← 0

end ifend forif jesosednjavrstica = 1 thensosednjevrstice [i] [stevilososedovvrstice[i]] ← jstevilososedovvrstice[i] ← stevilososedovvrstice[i]+1sosednjevrstice [j] [stevilososedovvrstice[j]] ← istevilososedovvrstice[j] ← stevilososedovvrstice[j]+1

end ifend for

end forsortiranevrstice[]←Qsort(stevilososedovvrstice) {Sortiramo vrstice po stevilusosednjih vrstic}

Page 24: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

14 Poglavje 2: Metode zgoscevanja

Algorithm 2.4 GCS barvanje grafov (zgoscevanje)

Vhod: sirinatabele, visinatabele, vhodnatabela[visinatabele][sirinatabele]Vhod: sosednjevrstice [visinatabele] [ ]Vhod: stevilososedovvrstice [visinatabele]Vhod: sortiranevrstice [visinatabele]Izhod: ntable[][] (Nova tabela, zgoscena po vrsticah)Izhod: barvavrstice Preusmeritve v novo vrstico pri branju jo imenujemorowmapfor i = 0 to visinatabele dobarvavrstice [i] ← −1

end formaksbarva ← 0for i = 0 to visinatabele dotrenutnavrstica ← sortiranevrstice[i]for trenutnabarva = 0 to maksbarva + 1 dozeimamobarvo ← 0for j = 0 to stevilososedovvrstice[trenutnavrstica] do

if trenutnabarva = barvavrstice [trenutnavrstica] thenzeimamobarvo ← 1 {Sosednja vrstica s to barvo ze obstaja}KONEC FOR ZANKE

end ifend forif zeimamobarvo = 0 thenbarvavrstice [trenutnavrstica] ← trenutnabarva {Nasli smo barvo}

end ifend forif zeimamobarvo 6= 0 thenmaksbarva ← maksbarva + 1 {Nismo barvali, povecamo stevilo barv}barvavrstice [trenutnavrstica] ← maksbarva

end ifend forNaredimo novo tabelo (ntable), ki ima dimenzije [maksbarva][sirinatabele].for i = 0 to visinatabele do

for j = 0 to sirinatabele dontable[barvavrstice[i]][j]← vhodnatabela[i][j] {Vpisemo vrednosti v novoobliko}

end forend for

Page 25: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.3 Metoda barvanja grafov (GCS) 15

Analiza algoritma

Velikost vseh podatkov, ki jih potrebujemo za dostop do zgoscene oblike, sepovecuje linearno glede, na dimenzije tabele. Pomanjkljivost metode je, danima moznosti prepoznave ponavljajocih se vrednosti, kot to pocneta metodaeliminacije vrstic in metoda odmika vrstic. Velika slabost te metode je, dapotrebujemo bitno polje, v katerem imamo zapisano veljavnost dolocene celice.Zgoscena oblika nove tabele ima se vedno dolocene prazne prostore, ki jih nismomogli zdruziti. Iz slike 2.2 je razvidno, kaksen je presezek praznega prostora,glede na stevilo elementov, ki je v tabeli. Imamo tabelo dimenzije 100*50, karnam prinese pri polni zasedenosti 5000 elementov. Na sliki je tudi razvidno,da imamo pri dvajset odstotni zasedenosti tabele, se dvakrat toliko presezka,kot je elementov v tabeli.

Slika 2.2: GCS graf

0

300

600

900

1200

1500

1800

2100

2400

2700

0 100 200 300 400 500 600 700 800 900 1000

Vel

ikos

t nov

e ta

bele

Število elementov

Graf velikosti data tabele pri [100,50]

Tabela [100,50]x

Page 26: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

16 Poglavje 2: Metode zgoscevanja

2.4 Metoda eliminacije (LES)

Metoda deluje na principu eliminacije enakovrednih vrstic in stolpcev. Topocnemo izmenicno. Najprej izlocimo vrstico, nato stolpec. Ko eliminiramovse, kar lahko, dobimo novo tabelo, ki ima drugacne dimenzije kot tabela, skatero smo zaceli. Za vrstice ali stolpce, ki so bili eliminirani, si zapisemo,v katerem koraku so bili eliminirani in jih tako locimo med seboj. Za tistevrstice ali stolpce, ki jih ne moremo eliminirati, zapisemo, da so bili eliminiraniv zadnjem koraku. Tako dobimo stiri nove tabele, dve za branje vrstic in dveza branje stolpcev.Branje tabel poteka po algoritmu 2.5. Tako imamo tabeli dr in dc, ki predstavljatakorak eliminacije, in tabeli r in c, v katerih so zapisane vrednosti eliminiranihvrstic, indeksi na nove vrstice ali stolpce v novi tabeli (primer je v tabeli 2.3).Ker gre v tem primeru za preusmerjanje v novo tabelo, nastane, kot pri metodibarvanja grafov, problem preverjanja veljavnosti elementov. Zato potrebujemose bitno polje za preverjanje veljavnosti. Zgoscevanje poteka po algoritmu 2.6.Pri algoritmu za zgoscevanje tabel smo izpustili funkciji, ki preverjata ali lahkoeliminiramo dolocen stolpec ali vrstico. Funkciji f ali lahko eliminiramo vrstico()in f ali lahko eliminiramo stolpec() preverjata, ali imamo iste vrednosti navseh elementih vrstice ali stolpca. Pri tem moramo paziti, da ne upostevamoze eliminiranih vrstic ali stolpcev. Ob zakljucku algoritma smo izpustili prepisneeliminiranih vrstic in stolpcev v bolj zgosceno obliko.

Tabela 2.3: LES primer

(a) Tabela

1419

45 81 70

(b) r

01419070

(c) dr

13579

(d) c

45 81 0 0 1

(e) dc

2 6 4 13 13

Page 27: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.4 Metoda eliminacije (LES) 17

Algorithm 2.5 LES branje tabele

Izhod: Vrednost elementa na dolocenem mestuVhod: sigmap[visina][sirina] (Bitno polje za preverjanje veljavnosti

elementov)Vhod: i,j (Vrstica in stolpec zahtevanega elementa)Vhod: dr[visina], r[visina] (Vrstice)Vhod: dc[sirina], c[sirina] (Stolpci)Vhod: novatabela[][] (Nova tabela, v kateri so elementi, ki jih nismo mogli

zgostiti)if sigmap[i][j]) = 1 then

if dr[i] < dc[j] thenreturn r[i]

elseif dr[i] > dc[j] then

return c[j]else

return novatabela[r[i]][c[j]]end if

end ifend if

Page 28: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

18 Poglavje 2: Metode zgoscevanja

Algorithm 2.6 LES zgoscevanje

Vhod: vhodnatabela[visina][sirina],sirina,visinaIzhod: nova tabela[][],dr[sirina],dc[visina],r[sirina],c[visina]drvrstice[sirina]← −1, rvrstice[sirina]← −1dcvrstice[visina]← −1, cvrstice[visina]← −1scan ← 0repeatdodali vrstico ← 0, dodali stolpec ← 0for j = 0 to visina do

if f ali lahko eliminiramo vrstico(j) thenPreverimo ali ima vrstica po celi dolzini iste vrednostidr[j] ← scan, r[j] ← vrednostvrsticedodali vrstico ← 1KONEC FOR ZANKE

end ifend forscan ← scan + 1 {koncali vrstico}for j = 0 to sirina do

if f ali lahko eliminiramo stolpec(j) thenPreverimo ali ima vrstica po celem stolpcu iste vrednostidc[j] ← scan, c[j] ← vrednoststolpcadodali stolpec ← 1KONEC FOR ZANKE

end ifend forscan ← scan + 1 {koncali stolpec}

until dodali stolpec 6= 0 or dodali vrstica 6= 0scan ← scan + 1Dolocimo indekse vrsticam, stolpcem, ki niso bili eliminiranifor j = 0 to visina do

if dr[j] = −1 thenr[j] ← indeks vrstice v novi tabeli, dr[j] ← scan {Dolocimo novovrstico v novi tabeli}

end ifend forfor j = 0 to sirina do

if dc[j] = −1 thenc[j] ← indeks stolpca v novi tabeli, dc[j] ← scan {Dolocimo novstolpec v novi tabeli}

end ifend forVse neeliminirane vrstice in stolpce prepisemo v novo tabelo (nova tabela[][])

Page 29: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.4 Metoda eliminacije (LES) 19

Analiza algoritma

Algoritem deluje ucinkovito, dokler se imamo veliko praznih vrstic oz. stolpcev(slika 2.3). Ko nam zmanjka vrstic, ki bi jih lahko eliminirali, ostane samotabela v originalni velikosti in prostora ne pridobimo.

Slika 2.3: LES graf

0

300

600

900

1200

1500

1800

2100

2400

2700

3000

3300

3600

3900

4200

4500

4800

5100

0 100 200 300 400 500 600 700 800 900 1000

Vel

ikos

t nov

e ta

bele

Število elementov

Graf velikosti data tabele pri [100,50]

Tabela [100,50]x

Page 30: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

20 Poglavje 2: Metode zgoscevanja

2.5 Metoda odmika (RDS)

Za lazje razumevanje delovanja metode moramo razumeti, kako je tabela predstavljenav racunalniku. Tabela, ki ima dve dimenziji, je v racunalniku predstavljena kotenodimenzionalno polje. Da je to mogoce, moramo poznati dimenzije tabele.Tabela 2.4 predstavlja v pomnilniku 5*10 celic. Prva vrstica predstavlja prvih10 elementov, druga vrstica naslednjih 10 elementov in tako dalje.Metoda, ki je predstavljena v delu [5], deluje na principu odmika vrstic. Vrsticeshranjujemo tako, kot so obicajno predstavljene dvodimenzionalne tabele vracunalniku, se pravi linearno, vendar v nasem primeru nimajo konstantnegaodmika. S takim nacinom predstavitve tabele lahko izkoristimo prostor, ki gaimajo na pol prazne vrstice. To pomeni, da se vrstice lahko prekrivajo. Kotprimer lahko vzamemo vrstico z enim elementom. Lahko jo vrinemo kamorkoliv seznam, kjer je prosto mesto. Ker se vrstice lahko prekrivajo, potrebujemose dodatno tabelo, v kateri je zapisano, za katero vrstico je veljavna vrednost.Tabele v sliki 2.5 predstavljajo novo zgosceno obliko tabele, ki je predstavljenav sliki 2.4. Novo obliko predstavljajo tri nove tabele - zgoscena oblika, kjerimamo vrednosti elementov, odmik ali displacement tabela, v kateri imamoodmike za vsako vrstico posebej in check tabela, s katero lahko preverjamoveljavnost elementa.Branje teh tabel poteka po algoritmu 2.7. Iscemo vrednost tabele v dolocenivrstici in stolpcu. Zacnemo z displacement tabelo, v kateri dobimo zacetniodmik za doloceno vrstico, in temu odmiku pristejemo stevilko stolpca, ki naszanima. Tako dobimo indeks v data tabeli. Da je ta vrednost veljavna, moramopreveriti tudi to, ali je vrednost veljavna za pravo vrstico (check tabela).

Tabela 2.4: Vhodna tabela

1 2 3 4 5 6 7 8 9 101 87 14 622 13 99 66 673 654 28 115

Page 31: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.5 Metoda odmika (RDS) 21

Tabela 2.5: Nova predstavitev

1 2 3 4 5 6 7 8 9 10 11 12 13 odmikvrstica

1 87 14 62 32 13 99 66 67 03 65 -64 28 11 05 0

data tabela 13 99 65 87 28 66 67 14 11 62check tabela 1 1 2 0 3 1 1 0 3 0

Tabele, ki jih potrebujemo so:

• data tabela, ki vsebuje elemente,

• displacement tabela, ki vsebuje indeks za doloceno vrstico,

• check tabela, ki vsebuje vrednost vrstice (stolpec), pri kateri je vrednostveljavna.

Algorithm 2.7 RDS branje tabele

Izhod: Vrednost elementa na dolocenem mestuVhod: vrstica, stolpec (Zahtevan element)Vhod: displace[], data[], check[]Vhod: stolpec, vrstica (Vrstica in stolpec zahtevanega elementa)indeks ← displace[ vrstica ] + stolpecif indeks ≥ 0 and indeks ≤ length( data [] ) then

if check [ indeks ] = vrstica thenreturn data[ indeks ]

end ifend ifreturn 0

Obstajajo tudi razlicne variacije zgoscevanja. Vrstice lahko zapisujemo, kotje prikazano v zgornjem primeru, ali pa elemente zapisujemo, kot si sledijo vstolpcih. Koncni rezultat je razlicen in je lahko v dolocenih primerih zapiskrajsi. Razlika je tudi v razlicnem nacinu preverjanja veljavnosti elementov.

Page 32: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

22 Poglavje 2: Metode zgoscevanja

V zgornjem primeru imamo stevilko vrstice, lahko pa bi imeli stevilko stolpca.Razlog za uporabo stevilke stolpca je, da nam dovoljuje ponavljanje celotnevrstice. Torej imamo dve vrstici, ki imata iste vrednosti in imata tako istiodmik. Pri tem je treba paziti, da se dve vrstici, ki nimata istih vrednosti, neprekrivata s stevilko stolpca.Prednost tega algoritma je, da ima moznost ponavljanja celotne vrstice in daje casovna zahtevnost konstantna O(1) .

Algoritem zgoscevanja tabel

Cilj samega algoritma za zgoscevanje je poiskati odmike vrstic tako, da imamozgosceno (data) tabelo v velikosti stevila nenicelnih elementov. Iskanje tehresitev je NP problem, ker nam iskanje najboljsega vrstnega reda vrstic predstavljaproblem v velikosti N !.V delu [5] je predstavljena resitev, ki se imenuje metoda prvega primernegaprostora s padajocim stevilom elementov (first-fit decreasing), v nadaljevanjumetoda prvega primernega. To pomeni, da vrstice, ki imajo najvecje steviloelementov, najprej dodamo v seznam dodajanja. Posledica tega je, da dajemomoznost manjsim vrsticam, da se vrinejo v vrstice z vecjim stevilom elementov.Algoritem, ki ga predstavljamo, ni identicen algoritmu, ki je bil predstavljenv delu [5], ampak ima dodano se preverjanje sirine vrstice, ki nam pomaga vprimeru, ko imamo vrstice z istim stevilom elementov.Sam algoritem za zgoscevanje zaradi enostavnosti lahko razdelimo na tri dele.V prvem delu dolocimo stevilo elementov in sirino vrstice (algoritem 2.8). Vdrugem delu sortiramo vrstice po stevilu nenicnih elementov in po dolzinivrstice (algoritem 2.9). Dolzina vrstice naj bi se zacela s prvim nenicnimelementom, do zadnjega nenicnega elementa. Rezultat sortiranja uporabimopri zadnjem delu, tako da dodajamo vrstice, ki so bile sortirane po prejsnjemalgoritmu (algoritem 2.10). Razlog za sortiranje vrstic je v tem, da vrstice, kiimajo vec elementov, dodamo najprej, s tem pa lahko pridobimo prostor zakrajse vrstice.Casovno zahtevnost algoritmov lahko razdelimo na 3 dele. V nadaljevanjubo n predstavljal red tabele. Casovno zahtevnost algoritma 2.9, 2.10 lahkodefiniramo kot O(n2). Za algoritem 2.10 tezje dolocimo, koliko korakov bopotrebno, da najdemo prostor za vrstico. Zato lahko recemo, da za iskanjeprostega mesta potrebujemo od 1 do n korakov za vsako vrstico. Iz tega lahkosklepamo, da bo algoritem potreboval O(n) v najboljsem primeru ali O(n2) vnajslabsem primeru.

Page 33: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.5 Metoda odmika (RDS) 23

Algorithm 2.8 RDS stetje elementov in dolocitev dolzine vrstic

Vhod: tabela[visinatabele][sirinatabele] (Tabela, ki jo zgoscamo)Izhod: stevilo elementov[visinatabele], sirina vrstice[visinatabele]

for i = 0 to visinatabele dozacetek vrstice, konec vrstice← −1temp stevilo elementov ← 0for j = 0 to sirinatabele do

if tabela[i][j] 6= 0 thenif zacetek vrstice < 0 thenzacetek vrstice, konec vrstice← j {Nasli zacetek vrstice}

else {Ze nasel zacetek vrstice}konec vrstice← j

end iftemp stevilo elementov ← temp stevilo elementov + 1

end ifend forstevilo elementov[i] ← temp stevilo elementovsirina vrstice[i] ← (konec vrstice + 1)− zacetek vrstice

end for

Page 34: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

24 Poglavje 2: Metode zgoscevanja

Algorithm 2.9 RDS sortiranje vrstic

Vhod: stevilo elementov[visinatabele]Vhod: sirina vrstice[visinatabele]Izhod: sortirane vrstice[visinatabele] Sortirana tabela z indeksi vrsticcount← 0 {Stevilo vrstic, dodanih v tabelo}for i = 0 to visinatabele dopozicija← count− 1 {Pozicija v tabeli}x← stevilo elementov[sortirane vrstice[pozicija]]y ← stevilo elementov[i] {Sortiramo po stevilu elementov}while pozicija ≥ 0 and x < y dopozicija← pozicija− 1

end whilej ← sirina vrstice[sortirane vrstice[pozicija]]k ← sirina vrstice[i] {Sortiramo po sirini vrstic}while pozicija ≥ 0 and x = y and j < k dopozicija← pozicija− 1

end whilefor j = count− 1 to position dosortirane vrstice[j + 1]← sortirane vrstice[j]

end forsortirane vrstice[pozicija + 1] ← icount← count + 1

end for

Page 35: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.5 Metoda odmika (RDS) 25

Algorithm 2.10 RDS zgoscevanje

Vhod: tabela[visinatabele][sirinatabele], sortirane vrstice[visinatabele]Vhod: sirina vrstice[visinatabele], zacetek vrstice[visinatabele]Izhod: tabele displace[],data[],check[]

for i = 0 to visinatabele dovrstica← sortirane vrstice[i] {Indeks vrstice (sortirane)}length← sirina vrstice[vrstica]place at← −1repeatok ← 1place at← place at + 1for k = 0 to length doj ← k + zacetek vrstice[vrstica]if tabela[vrstica][j] 6= 0 and data[place at + k] 6= 0 thenok ← 0 {Ni mogoce dodati vrstice na tem indeksu}

end ifend for

until ok 6= 1 {Dodajamo vrstico}displace[vrstica] ← place at− zacetek vrstice[vrstica]for k = 0 to length doj ← k + zacetek vrstice[vrstica]if tabela[vrstica][j] 6= 0 thendata[place at + k] ← tabela[vrstica][j]check[place at + k] ← vrstica

end ifend for

end for

Page 36: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

26 Poglavje 2: Metode zgoscevanja

Analiza algoritma

Da algoritem prvega primernega deluje ucinkovito, mora imeti tabela dolocenelastnosti.Imamo tabelo dimenzije m ∗ m, v kateri imamo n nenicnih elementov, indefiniramo funkcijo n(l), ki predstavlja stevilo vseh nenicnih elementov v vrsticahz vec kot l elementov.Izrek, ki je omenjen v delu [5], pravi, da ce imamo tabelo, ki ima lastnostharmonicnega padanja:

Definicija. H: Za vse l, n(l) ≤ n/(l + 1),potem velja, da bodo vsi elementi prisli v tabelo v velikosti n.

Dokaz. Predpostavljamo, da ima ta vrstica vsaj 1 nenicni element. Po definicijije H stevilo prejsnjih nenicnih elementov najvec n/l. Kar predstavlja, daimamo zasedenega najvec l prostora od n. Torej velja, da pridejo vsi nenicnielementi v tabelo dolzine n.

To tudi pomeni, da ce se vrednost n(l)/n hitro zmanjsuje, s tem, ko sel povecuje, potem lahko recemo, da bo metoda prvega primernega delovalaucinkovito. Iz te lastnosti lahko tudi sklepamo, da bo koncna velikost podatkov2 ∗ n + m. Lastnost harmonicnega padanja preprosto pomeni, da imamopolovico vrstic samo z enim nenicnim elementom.Imamo dva primera tabel - tabeli v velikosti [500, 50] in [50, 500]. Vsebujeta2500 nakljucno generiranih elementov. Za obe tabeli imamo dve funkciji.Zelena crta predstavlja funkcijo n(l), polni crti predstavljata harmonicno padanjen/(l + 1). Iz grafa je razvidno, da ima tabela z vec vrsticami kot stolpci, zeloodmaknjeno funkcijo od harmonicnega padanja. Posledica tega je, da imazgoscena oblika tabele zelo veliko praznih prostorov, ker se vrstice z manjelementi ne morejo vriniti v prazne prostore. Iz tega grafa je razvidna tudizasedenost same vrstice.Primer za to, do katere gostote elementov je ta metoda se primerna, je vnajboljsem primeru 2 ∗ n + m elementov. Ce imamo tabelo velikosti [50,50],ki predstavlja 2500 elementov, nam v najboljsem primeru, ko je ta zapis sesmiselen, predstavlja 1225 stevilo nenicelnih elementov. Teoreticna zgornjameja, ko je ta zapis se smiselno uporabiti, bi bila 49-odstotna zasedenost,vendar v praksi to ni vedno mogoce. Glede na to, da v nasem primeruuporabljamo odmik vrstice, ne moremo pricakovati, da bomo imeli dobre rezultate,ce bomo stevilo vrstic zmanjsevali. Ce imamo vec stolpcev kot vrstic, se spovecanjem gostote zmanjsa moznost, da bi se vrstice prekrivale. To je vidnov sliki 2.6, v kateri imamo 100 stolpcev in 50 vrstic, in v sliki 2.5, v kateri imamo

Page 37: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.5 Metoda odmika (RDS) 27

20 stolpcev in 100 vrstic. Ce naredimo primerjavo velikosti data tabele, je veckot ocitno, da se v prvem primeru veliko hitreje povecuje velikost data tabele.Iz slike 2.5 je tudi razvidna razlika, ce uporabljamo se dodatno sortiranje posirini vrstice. Ta nam pomaga v primeru, ko imamo veliko vrstic z enakimstevilom elementov in v tem primeru daje za odtenek boljse rezultate.

Slika 2.4: Harmonicno padanje

0

200

400

600

800

1000

1200

1400

1600

1800

2000

2200

2400

2600

10 20 30 40 50 60 70

Šte

vilo

ele

men

tov

Število vrstic, ki ima vec kot x elementov

Graf funkcij hramonicnega padanja

Tabela [500,50]Tabela [50,500]

2500/x

Page 38: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

28 Poglavje 2: Metode zgoscevanja

Slika 2.5: RDS graf tabele [20,100]

0

100

200

300

400

500

600

700

800

900

1000

1100

1200

1300

1400

1500

0 100 200 300 400 500 600 700 800 900 1000

Vel

ikos

t dat

a ta

bele

Število elementov

Graf velikosti data tabele pri [20,100]

Tabela [20,100]Tabela [20,100] brez dodatnega sortiranja

x

Page 39: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.5 Metoda odmika (RDS) 29

Slika 2.6: RDS graf tabele [100,50]

0

300

600

900

1200

1500

1800

2100

2400

0 100 200 300 400 500 600 700 800 900 1000

Vel

ikos

t dat

a ta

bele

Število elementov

Graf velikosti data tabele pri [100,50]

Tabela [100,50]x

Page 40: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

30 Poglavje 2: Metode zgoscevanja

2.6 Metoda zamika zacetne in zadnje vrednosti

(SDS)

Metoda deluje tako, da si zacnemo zapisovati vrstico od prve nenicne vrednosti,do zadnje nenicne vrednosti. Tako dobimo dve novi tabeli first in last, kipredstavljata zacetni in koncni indeks vsake vrstice, s katero se zacnejo nenicnevrednosti. Branje tabele poteka po algoritmu 2.11. Ker metoda ne daje dobrihrezultatov, je ne obravnavamo podrobno.

Algorithm 2.11 SDS branje tabele

Izhod: Vrednost elementa na dolocenem mestuVhod: i,j (Vrstica in stolpec zahtevanega elementa)Vhod: first[visina], last[visina], rowpointer[visina]

if (j < first[i]) or (j > last[i]) thenreturn 0

elsereturn value[rowpointer[i]+j]

end if

2.7 Metoda vrstica, stolpec (RCS)

Metoda zapisuje nenicne elemente tako, kot si sledijo v vrstici ali stolpcu (istametoda, drugacen nacin zapisa). Tako imamo tri tabele. V eni so vse nenicnevrednosti, v drugi stevilke vrstice ali stolpca, za katero vrednost je veljavnanenicna vrednost, in tretjo, v katero si zapisujemo zacetek neke vrstice alistolpca. Za primer imamo v poglavju 2.1 ze koordiniran seznam. Slabost temetode je, da nimamo konstantnega dostopnega casa. Algoritem za branjeRCS tabel je 2.12 in zgoscanje poteka po algoritmu 2.13.

Page 41: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.7 Metoda vrstica, stolpec (RCS) 31

Algorithm 2.12 RCS branje tabele

Izhod: Vrednost elementa na dolocenem mestuVhod: row pointer[visina],column index[],vrednosti[]Vhod: i,j (Vrstica in stolpec zahtevanega elementa)

for tmp=row pointer[i] to row pointer[i + 1] doif column index[tmp] = j then

return vrednosti[tmp]end if

end forreturn 0

Algorithm 2.13 RCS zgoscevanje

Izhod: row pointer[visina], column index[], vrednosti[] Zgoscena oblikatabele

Vhod: tabela[visina][sirina], visina, sirinastevilo vrednosti ← 0row pointer[0] ← 0 {Prva vrstica se zacne s prvim elementom}stevilo vrstic ← 1for i = 0 to visina do

for j = 0 to sirina doif tabela[i][j] 6= 0 thencolumn index[stevilo vrednosti] ← tabela[i][j]stevilo vrednosti ← stevilo vrednosti + 1

end ifend forrow pointer[stevilo vrstic] ← stevilo vrednostistevilo vrstic ← stevilo vrstic + 1

end for

Analiza algoritma

Kot je bilo ze v poglavju 2.1 omenjeno, tabela narasca z velikostjo nenicnihelementov. Tako imamo tabelo v velikosti 2 ∗ nnz + n, kjer nnz predstavljastevilo nenicnih elementov, in n, ki predstavlja stevilo vrstic.

Page 42: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

32 Poglavje 2: Metode zgoscevanja

Slika 2.7: RCS graf

0

300

600

900

1200

1500

1800

2100

0 100 200 300 400 500 600 700 800 900 1000

Vel

ikos

t nov

e ta

bele

Število elementov

Graf velikosti data tabele pri [100,50]

Tabela [100,50]x

2.8 Metoda izogibanja nicnih vrednosti (SZS)

Metoda deluje zelo podobno kot metoda RCS. Razlika je v tem, da v tabelozapisujemo se nenicne elemente. Tako izgubimo tabelo, ki preverja veljavnostvrednosti za dolocen stolpec. Poleg tega, da si zapisujemo nenicne elemente,dodamo se poseben zapis, v katerem zapisujemo zacetek elementov z vrednostjonic in stevilo elementov. Bistvene prednosti v tem zapisu ni. Kot pri metodiRCS je tudi tu slabost nekonstanten cas dostopa.

Page 43: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

2.9 Primerjava metod pri zgoscevanju LR tabel 33

2.9 Primerjava metod pri zgoscevanju LR tabel

Prva primerjava metod je v delu [3], dotakne se vseh metod in primerja njihovoucinkovitost na razlicnih programskih jezikih. Analiza je vidna v tabeli 2.8.Faktor, v tabeli predstavlja ulomek:

prostor aktualnemetode

prostor najboljsemetode

To pomeni, da metoda, ki zaseda najmanj prostora, dobi faktor 1, tako iztabele vidimo, katera metoda v povprecju zaseda najmanj pomnilnika. Izkazese, da je najboljsa metoda GCS.Naredili smo tudi analizo na lastnih LR tabelah. LR tabelo smo pridobili izsintaksnega analizatorja Bison, za programski jezik Pascal, drugo tabelo pa izsintaksnega generatorja Eli, za programski jezik ALGOL60. Vzeli smo samoodlocitveno tabelo, ker tako najlaze naredimo primerjavo. Locili smo tudirezultate samega RDS algoritma s podporo ponavljanja vrstic in brez.Med metodami smo primerjali, kateri podatki so potrebni za dostop in nenicelnevrednosti same nove tabele. Za obe smo uporabili velikost podatkovnega tipacelega stevila. Ceprav bi lahko podatke za dostop do tabele omejili na velikostmanjsega podatkovnega tipa, nam v novodobnih racunalniskih sistemih to neprinese nobene prednosti.Tabela za programski jezik ALGOL60 je pridobljena s sintaksnim generatorjemEli [9]. Dobimo odlocitveno tabelo v dimenzijah 56 ∗ 119, ki nam v nezgosceniobliki predstavlja 6664 elementov. Tabela 2.6 predstavlja, koliko smo z dolocenometodo zgostili odlocitveno tabelo. Tudi v tem primeru je najboljsa metodaGCS.Tabela za programski jezik Pascal je pridobljena s sintaksnim generatorjemBison[8]. Dobimo odlocitveno tabelo v dimenzijah 67∗410, ki nam v nezgosceniobliki predstavlja 27470 elementov. Tabela 2.7 predstavlja zgostitev kot vprejsnjem primeru, vendar nam v tem primeru najboljse rezultate vrne metodaRDS, z moznostjo ponavljanja vrstic.Razlika med sintaksnimi generatorji in med razlicnimi jeziki se kaze v nacinuzapisovanja LR tabel. Bison za delovanje analizatorja potrebuje odlocitvenotabelo in tabelo prehodov pri analizatorju, Eli uporablja odlocitveno tabeloza terminale in odlocitveno tabelo za neterminale. Prednost algoritma RDS jev tem, da generator Bison generira tabele, v katerih je veliko ponovitev istihvrednosti v stanjih (vrstice).

Rezultate smo pridobili z izvorno kodo v dodatku B.

Page 44: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

34 Poglavje 2: Metode zgoscevanja

Tabela 2.6: Zgoscevanje odlocitvene tabele za Algol60

Podatki za dostop Podatki nove tabele Sestevek Odstotek zgostitve

RDS 1269+119 1269 2657 39.9 %RDS pon. 856+119 856 1831 27.5 %

RCS 866+120 866 1852 27.8 %LES 119*2+56*2 56*87 3917 58.8 %GCS 56+119+208(sigmap) 34*31 1437 21.56 %

Tabela 2.7: Zgoscevanje odlocitvene tabele za Pascal

Podatki za dostop Podatki nove tabele Sestevek Odstotek zgostitve

RDS 1043+410 1043 2496 9.09 %RDS pon. 241+410 241 892 3.25 %

RCS 769+411 769 1949 7.09 %LES 410*2+67*2 63*13 1773 6.45 %GCS 67+410+858(sigmap) 58*13 2089 7.6 %

Tabela 2.8: Primerjava metod pri [3]

Metoda GCS LES RDS SDS LES&GCS LES&RDS RCS SZS

Faktor 1.04 2.01 1.54 1.63 1.09 1.11 1.93 1.42

Page 45: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Poglavje 3

Implementacija sintaksnegaanalizatorja

V tem poglavju bomo predstavili delovanje samega LR analizatorja in realizacijedolocenih LR analizatorjev, ki se uporabljajo. Imamo novejse analizatorje, kiuporabljajo za analizo eno odlocitveno tabelo in tabelo prehodov, obstajajopa tudi starejsi analizatorji, ki imajo dve odlocitveni tabeli eno za koncnesimbole in drugo za vmesne simbole. V tem primeru zgoscujemo dve tabeli.Tako pridemo do najbolj pogosto uporabljane metode RDS, ki nam hkratiomogoca zgoscevanje tabele prehodov in odlocitvene tabele. Od starejsihmetod je najboljsa metoda GCS, vendar ni primerna za uporabo pri sodobnihracunalniskih sistemih, kjer je dostop do bitnih polj drag.Tako imamo analizatorje kot so [10, 8, 7, 9], ki uporabljajo prirejeno metodoRDS, in malo starejse analizatorje [9] Cola, ki uporabljajo metode, opisanev prejsnjem poglavju. Metoda RCS je nadgrajena toliko, da nam daje velikoboljse rezultate kot ostali algoritmi zato, ker imamo poleg moznosti ponavljanjavrstic se zgoscene tabele.Sodobni analizatorji so zelo podrobno opisani v delu [6], odkoder prihaja tudivecina resitev, ki se trenutno najbolj uporabljajo.V tem poglavju bomo opisali delovanje same sintaksne analize na dolocenemvhodu na analizatorju Bison, opisali pa bomo tudi patent za zgoscevanje LRtabel.

3.1 Sintaksni analizator Bison

Sintaksni analizator Bison je odprtokodna resitev in je vrste LALR (Look-Ahead LR). V tem delu predstavljamo delovanje tega analizatorja. Z uporabo

35

Page 46: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

36 Poglavje 3: Implementacija sintaksnega analizatorja

gramatike iz slike 1.1 Bison generira naslednjo tabelo 3.1. Za delovanje analizatorjaBison doloci celostevilcno vrednost vsakemu simbolu (koncnim in vmesnim)tabela 3.2. Bison naredi tudi posebne simbole, ki se uporabljajo interno.Ti simboli so $end, error, $undefined, $accept. Predstavljajo konec stavka,napako, nedefiniran simbol ali sprejem stavka.Delovanje Bison analizatorja lahko opisemo tudi kot skladovni avtomat na sliki3.1, kjer polna crta predstavlja pomik, crtkana pa prevedbo.

3.1.1 Algoritem zgoscevanja tabel pri Bisonu

Algoritem zgoscevanja tabel poteka z metodo RDS, z dodano moznostjo ponavljanjavrstic. Poleg ponavljanja vrstic imamo se tabelo, ki vsebuje privzete vrednostiza vsako vrstico, ali stolpec, in tako zasedajo manj prostora v data tabeli. Zapisvmesnih in koncnih simbolov v data se razlikuje, glede na to, ali zapisujemokoncne ali vmesne simbole. Koncne simbole zapisujemo tako, kot si sledijo vvrsticah, vmesne pa zapisujemo, kot si sledijo v stolpcih. Razlog za tak zapisje v privzeti vrednosti za doloceno vrstico pri koncnih simbolih in privzetivrednosti za dolocen stolpec pri vmesnih simbolih. S tem nacinom zapisa nepotrebujemo dveh tabel, ampak lahko zdruzimo dve tabeli v eno in s tem tudiprihranimo prostor.Pri koncnih simbolih Bison shranjuje pomik kot pozitivno stevilo in prevedbokot negativno stevilo, tako da za shranjevanje te tabele potrebujemo predznacenocelo stevilo. Pred zgostitvijo tabele, se definira privzete vrednosti, za vsakovrstico v odlocitveni tabeli, ki jih izlocimo (tabela 3.3). Privzete vrednosti vodlocitveni tabeli so vedno prevedbe. V tabeli za privzete vrednosti je tudipreverjanje napake, in sicer tako, da vrednost 0 predstavlja napako.Kot je bilo omenjeno, tabela prehodov Bison shranjuje vrednosti, kot si sledijov stolpcih oz. po vmesnih simbolih. Razlog za to je v privzeti vrednosti, ki jevezana na stolpec, in se ponavlja v dolocenem stolpcu. Privzete vrednosti seizloci tako, kot v odlocitveni tabeli, s tem pa prihranimo prostor (tabela 3.4).Ko so tabele s privzetimi vrednostmi narejene, se zgostijo. Tako iz odlocitvenetabele in tabele prehodov dobimo displacement tabeli (tabeli 3.5 in 3.6), data(tabela 3.7) ter check (tabela 3.8) tabelo.Za delovanje analizatorja potrebujemo simbol, ki ga dobimo po operaciji prevedba.Tako tabela vsebuje simbol, ki ga dobimo po prevedbi po dolocenem pravilu(tabela 3.9). Pri isti operaciji potrebujemo tudi stevilo simbolov, ki smo jihreducirali za doloceno pravilo. Tako dobimo se tabelo 3.10.

Page 47: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

3.1 Sintaksni analizator Bison 37

Tabela 3.1: Odlocitvena tabela in tabela prehodov

Stanje Odlocitvena tabela Tabela prehodov

id ( ) * + $end Izraz Termin Faktor

0 Po1 Po2 3 4 5

1 p6 p6 p6 p6 p6 p6

2 Po1 Po2 6 4 5

3 Po8 Po7

4 p2 p2 p2 Po9 p2 p2

5 p4 p4 p4 p4 p4 p4

6 Po10 Po8

7 spr spr spr spr spr spr

8 Po1 Po2 11 5

9 Po1 Po2 12

10 p1 p1 p1 p1 p1 p1

11 p1 p1 p1 Po9 p1 p1

12 p3 p3 p3 p3 p3 p3

Tabela 3.2: Simboli v Bisonu

Simbol Vrednost

$end 0

error 1

$undefined 2

id 3

+ 4

* 5

( 6

) 7

$accept 8

Izraz 9

Termin 10

Faktor 11

Tabela 3.3: Privzeta akcija za doloceno stanje

Stanje 0 1 2 3 4 5 6 7 8 9 10 11 12

privzeta vrednost 0 7 0 0 3 5 0 1 0 0 6 2 4

Page 48: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

38 Poglavje 3: Implementacija sintaksnega analizatorja

Tabela 3.4: Privzeto stanje za vsak vmesni simbol

Vmesni simbol accept$ Izraz Termin Faktor

privzeta vrednost -1 3 4 5

Tabela 3.5: Displacement tabela za vsa stanja

Stanje 0 1 2 3 4 5 6 7 8 9 10 11 12

indeks -1 -5 -1 0 -4 -5 2 -5 -1 -1 -5 -4 -5

Tabela 3.6: Displacement tabela za vse vmesne simbole

Vmesni simbol accept$ Izraz Termin Faktor

privzeta vrednost -5 1 3 -2

Tabela 3.7: Data tabela

Indeks 0 1 2 3 4 5 6 7 8 9 10 11

vrednost 7 9 1 6 8 2 8 12 0 10 0 1

Tabela 3.8: Check tabela

Indeks 0 1 2 3 4 5 6 7 8 9 10 11

vrednost 0 5 3 2 4 6 4 9 -1 7 -1 8

Tabela 3.9: Simboli po pravilih

Indeks 0 1 2 3 4 5 6 7

vrednost 0 8 9 9 10 10 11 11

Tabela 3.10: Stevilo simbolov v pravilu

Indeks 0 1 2 3 4 5 6 7 8 9

vrednost 0 2 3 1 3 5 0 1 0 0

Page 49: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

3.1 Sintaksni analizator Bison 39

Slika 3.1: Bison skladovni avtomat

I0 I1Faktor ← id •

I2Faktor ← (•Izraz)

I3$accept ← Izraz • $endIzraz ← Izraz •+Termin

I4

Termin ← Termin • ∗Faktor

Izraz ← Termin•

I5Termin ← Faktor•

I6Izraz ← Izraz •+Termin

Faktor ← (Izraz•)

I7$accept ← Izraz $end•

I8Izraz ← Izraz + •Termin

I9Termin ← Termin ∗ •Faktor

I10Faktor ← (Izraz)•

I11Izraz ← Izraz + Termin•Termin ← Termin • ∗Faktor

I12Termin ← Termin ∗ Faktor•

id

Faktor

Termin

Izraz

’(’

idFactorTermin

’(’

Faktor

$end

’+’

’*’

’+’’)’

Faktor id

Termin

’(’

id

’(’

’*’

$accept: • Izraz $end

Izraz

Page 50: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

40 Poglavje 3: Implementacija sintaksnega analizatorja

3.1.2 Algoritem preverjanja sintakse

V tem delu predstavljamo algoritem delovanja sintaksnega analizatorja. Zadelovanje samega analizatorja potrebujemo tabele, ki so bile ze predstavljene:

• yyTable tabela 3.7,

• yyCheck tabela 3.8,

• yyPact tabela 3.5,

• yyDefact tabela 3.3,

• yyPgoto tabela 3.4,

• yyr1 tabela 3.9,

• yyr2 tabela 3.10.

Za delovanje potrebujemo tudi dolocene konstante, ki jih potrebujemo zapravilno delovanje:

• konstanto yyPact ninf, ki predstavlja maksimalno negativno stevilo, innam pove, ali imamo sploh kako vrednost v tabeli za doloceno stanje,

• konstanto yyLast, ki predstavlja maksimalni indeks pri yyTabeli,

• konstanto yyNtokens, s katero lahko locimo vmesne in koncne simbole,

• konstanto yyFinal, ki predstavlja stanje, v katerem ugotovimo pravilnosintakso.

Sam algoritem smo razdelili na dva dela. V prvem delu algoritma predstavljamodelovanje glede na posamezne operacije, v drugem delu pa predstavljamo, kakoberemo tabele, da dobimo operacijo za doloceno stanje. Algoritem se izvaja,dokler ima kaksno stanje v skladu ali dokler ne pridemo do stanja, kjer je vhodveljaven.Algoritem v delu, kjer imamo razlicne operacije, je viden v algoritmu 3.1,v katerem predstavljamo razliko med operacijama prevedba in pomik. Prioperaciji pomik, potisnemo novo stanje na sklad in povecamo trenutni vhod zaen znak. Pri operaciji prevedba, se nam zgodi malo vec stvari. Najprej se namzmanjsa sklad, za stevilo simbolov, glede na pravilo, ki ga reduciramo. Takolahko preberemo stanje, ki ga potrebujemo za branje tabele prehodov. Kot jerazvidno iz algoritma, dobimo novo stanje, ki ga dobimo iz zgoscene tabele ali

Page 51: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

3.1 Sintaksni analizator Bison 41

iz privzete tabele za dolocen vmesni simbol.Imamo tudi algoritem, s katerim dobimo naslednjo operacijo (algoritem 3.2).Izvedba kode je v dodatku C.

Algorithm 3.1 Bison sintaksna analiza

Vhod: yyPact[yyLast],yycheck[yyLast],yyTable[]stack[0] ← 0dolzina ← dolzina + 1while dolzina > 0 do

Pridobimo naslednjo operacijo, algoritem 3.2if akcija = Pomik then

if novo stanje = yyF inal thenDobili smo veljavno sintakso

end ifstack[dolzina] ← novo stanje {Potisnemo novo stanje na sklad}dolzina ← dolzina + 1Trenuten vhod povecamo za en znak

elseif akcija = Prevedba thendolzina=dolzina-yyr2[pravilo] {S sklada snamemo yyr2[pravilo]simbolov}NovSimbol ← yyr1[pravilo]PrejsnjeStanje ← stack[dolzina]Nidx ← yyPgoto[NovSimbol − yyNtokens]+PrejsnjeStanjeif 0 <= Nidx and Nidx <= yyLast and yycheck[Nidx] ==PrejsnjeStanje thenstack[dolzina] ← yyTable[Nidx]

elsestack[dolzina] ← yyDefgoto[NovSimbol − yyNtokens]dolzina ← dolzina + 1

end ifelse

if akcija = Napaka thenNapaka v sintaksi

end ifend if

end ifend while

Page 52: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

42 Poglavje 3: Implementacija sintaksnega analizatorja

Algorithm 3.2 Bison, naslednja operacija

Vhod: yypact[yyLast],yycheck[yyLast],yytable[]trenutno stanje ← stack[dolzina]if yypact[trenutno stanje] = yyPact ninf thenakcija ← Prevedbapravilo ← yydefact[trenutno stanje]

elseznak ← Naslednji znak na vhoduyyn ← yyPact[trenutno stanje]+znakif yyn < 0 or yyLAST < yyn or yyCheck[yyn] 6= znak thenakcija ← Prevedbapravilo ← yyDefact[trenutno stanje]

elseif yyTable[yyn] <= 0 then

if yyTable[yyn] = yyPact ninf or yyTable[yyn] = 0 thenakcija ← Napaka

elseakcija ← Prevedbapravilo ← −yyTable[yyn]

end ifelseakcija ← Pomiknovo stanje ← yyTable[yyn]

end ifend if

end if

3.2 Analiza patenta za zgoscevanje LR tabel

V tem poglavju opisujemo zgoscevanje LR tabel po patentu [2]. Patent predstavljametodo za zgoscanje LR tabel. Primer, ki ga predstavlja, vsebuje dve tabeli,eno za koncne simbole in drugo za vmesne simbole. Metodo smo primerjali zobstojecimi metodami, ki smo jih predstavili. Direktne primerjave z analizatorjemBison ne moremo izvesti, ker ne uporabljamo istih tabel. Algoritem patentauporablja podobne metode, kot jih uporablja sedanja razlicica Bison. Uporabljametodo z uporabo privzete vrednosti, za vsako stanje posebej (vrstice), natopermutira stolpce tako, da so karseda podobni zgornji trikotni obliki (matrike).To je tudi edina bistvena razlika, glede na sintaksni analizator Bison. Bistvene

Page 53: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

3.2 Analiza patenta za zgoscevanje LR tabel 43

prednosti s tem nacinom pri Bison-u ne bi pridobili, ker je glavna prednostmetode RDS pred ostalimi algoritmi to, da imamo cim vec podobnih vrstic. Priizvedbi patenta smo nasli napako na sliki st. 12, v kateri so napacne vrednostiin napacna velikost. Izvedba patenta je v dodatku D.

Page 54: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Poglavje 4

Sklep

V diplomski nalogi je bila implementirana vecina uspesnih metod za zgoscevanjeLR tabel, z uporabo teh tabel pa je bil implementiran tudi sam LR analizator.Implementiran je bil patent, ki je trenutno edini objavljen patent za zgoscevanjeLR tabel in z uporabo zgoscenih tabel tudi sam LR analizator.Zgoscevanje redkih tabel so raziskovali ze, odkar obstajajo programski jeziki,kompleksnost resitev pa se je vecala s procesno mocjo racunalnikov. V sedanjemcasu nismo toliko omejeni s pomnilnikom, zato so metode, ki jih sedaj uporabljamo,drugacne, kot so bile. To je bil tudi razlog za tezave s pridobivanjem gradiva,ker se metode, ki so se uporabljale vcasih, ne uporabljajo vec.Metode, ki so bile predstavljene, so se uporabljale za zgoscevanje LR tabel, insicer za vmesne in koncne simbole. Ko se je sam generator LR tabel spremeniltoliko, da smo dobili tabeli prehodov in odlocitev, je s tem metoda RDSpridobila toliko prednosti pred ostalimi metodami, da se uporablja samo seta.

44

Page 55: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Dodatek A

Priloga

45

Page 56: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Slike

1.1 Gramatika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.1 Seznam seznamov . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2 GCS graf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.3 LES graf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.4 Harmonicno padanje . . . . . . . . . . . . . . . . . . . . . . . . 272.5 RDS graf tabele [20,100] . . . . . . . . . . . . . . . . . . . . . . 282.6 RDS graf tabele [100,50] . . . . . . . . . . . . . . . . . . . . . . 292.7 RCS graf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.1 Bison skladovni avtomat . . . . . . . . . . . . . . . . . . . . . . 39

46

Page 57: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Tabele

1.1 LR Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2 Delovanje LR analizatorja . . . . . . . . . . . . . . . . . . . . . 6

2.1 Primer za Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2 Primer metode GCS . . . . . . . . . . . . . . . . . . . . . . . . 112.3 LES primer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.4 Vhodna tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.5 Nova predstavitev . . . . . . . . . . . . . . . . . . . . . . . . . . 212.6 Zgoscevanje odlocitvene tabele za Algol60 . . . . . . . . . . . . 342.7 Zgoscevanje odlocitvene tabele za Pascal . . . . . . . . . . . . . 342.8 Primerjava metod pri [3] . . . . . . . . . . . . . . . . . . . . . . 34

3.1 Odlocitvena tabela in tabela prehodov . . . . . . . . . . . . . . 373.2 Simboli v Bisonu . . . . . . . . . . . . . . . . . . . . . . . . . . 373.3 Privzeta akcija za doloceno stanje . . . . . . . . . . . . . . . . . 373.4 Privzeto stanje za vsak vmesni simbol . . . . . . . . . . . . . . . 383.5 Displacement tabela za vsa stanja . . . . . . . . . . . . . . . . . 383.6 Displacement tabela za vse vmesne simbole . . . . . . . . . . . . 383.7 Data tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.8 Check tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.9 Simboli po pravilih . . . . . . . . . . . . . . . . . . . . . . . . . 383.10 Stevilo simbolov v pravilu . . . . . . . . . . . . . . . . . . . . . 38

47

Page 58: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Seznam algoritmov

2.1 GCS branje tabele . . . . . . . . . . . . . . . . . . . . . . . . . 122.2 Generiranje tabele Sigmap . . . . . . . . . . . . . . . . . . . . . 122.3 GCS iskanje in dodajanje sosednjih vrstic . . . . . . . . . . . . . 132.4 GCS barvanje grafov (zgoscevanje) . . . . . . . . . . . . . . . . 142.5 LES branje tabele . . . . . . . . . . . . . . . . . . . . . . . . . . 172.6 LES zgoscevanje . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.7 RDS branje tabele . . . . . . . . . . . . . . . . . . . . . . . . . 212.8 RDS stetje elementov in dolocitev dolzine vrstic . . . . . . . . . 232.9 RDS sortiranje vrstic . . . . . . . . . . . . . . . . . . . . . . . . 242.10 RDS zgoscevanje . . . . . . . . . . . . . . . . . . . . . . . . . . 252.11 SDS branje tabele . . . . . . . . . . . . . . . . . . . . . . . . . . 302.12 RCS branje tabele . . . . . . . . . . . . . . . . . . . . . . . . . 312.13 RCS zgoscevanje . . . . . . . . . . . . . . . . . . . . . . . . . . 313.1 Bison sintaksna analiza . . . . . . . . . . . . . . . . . . . . . . . 413.2 Bison, naslednja operacija . . . . . . . . . . . . . . . . . . . . . 42

48

Page 59: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

LITERATURA 49

[1] P. Charles, “A practical method for constructing efficient LALR(k) parserswith automatic error recovery,” Dr. dizertacija, Univerza New York, Maj1991. Dostopno na: http://jikes.sourceforge.net/documents/thesis.pdf

[2] G. A. Charles, Philippe Gerard Fisher Jr. A methodfor lr (left-right) table compression. Dostopno na:http://www.freepatentsonline.com/EP0313973.html

[3] P. Dencker, K. Durre, and J. Heuft, “Optimization of parser tables forportable compilers,” ACM Trans. Program. Lang. Syst., st. 6, str. 546–572,Oktober 1984. Dostopno na: http://doi.acm.org/10.1145/1780.1802

[4] J. R. Gilbert, C. Moler, and R. Schreiber, “Sparse matrices in matlab:Design and implementation,” 1997.

[5] R. E. Tarjan and A. C.-C. Yao, “Storing a sparse table,” Commun. ACM,st. 22, no. 11, str. 606–611, 1979.

[6] A. V. A. . M. S. L. . R. S. . J. D. Ullman, Compilers:Principles, Techniques,and Tools: International Edition. Pearson Education, 2007.

[7] Beaver. Dostopno na: http://beaver.sourceforge.net/

[8] Bison. Dostopno na: http://www.gnu.org/software/bison/

[9] Eli. Dostopno na: http://eli-project.sourceforge.net/

[10] Sablecc. Dostopno na: http://sablecc.org/

Page 60: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Dodatek B

izvorna koda zgoscevanje redketabele

#include <s t d i o . h>#include <s t d l i b . h>#include <s t r i n g . h>#include <time . h>#include <unis td . h>

#include < f c n t l . h>#include <sys / s t a t . h>

// i n t w id th =15;// i n t h e i g h t =10;//#d e f i n e WW 15//#d e f i n e WH 10#define DGOSTOTA 0.1//#d e f i n e WW width//#d e f i n e WH h e i g h t

struct dyn tab le {int w;int h ;int ∗data ;

} ;

struct RDS data{struct dyn tab le d i sp l a c e r ows ;int ∗data ;int ∗ check data ;int da ta l en ;int end data ;int method ;

} ;

int r t da t a ( struct dyn tab le ∗ tbl , int y , int x ){i f (y>=tbl−>h | | y<0) abort ( ) ;i f (x>=tbl−>w | | x<0) abort ( ) ;return tbl−>data [ ( tbl−>w∗y )+x ] ;

} ;

int s e t da t a ( struct dyn tab le ∗ tbl , int y , int x , int va l ){i f (y>=tbl−>h | | y<0) abort ( ) ;i f (x>=tbl−>w | | x<0) abort ( ) ;tb l−>data [ ( tbl−>w∗y )+x]= val ;return 0 ;

} ;

void f r e e d yn t a b l e ( struct dyn tab le ∗ tb l ){i f ( tbl−>data )

f r e e ( tbl−>data ) ;tbl−>data=NULL;

50

Page 61: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

51

tbl−>w=tbl−>h=0;} ;

int a l l o c d yn t a b l e ( struct dyn tab le ∗ tbl , int w, int h){f r e e d yn t a b l e ( tb l ) ;tb l−>data=malloc ( s izeof ( int )∗w∗h) ;memset ( tbl−>data , 0 , s izeof ( int )∗w∗h) ;tbl−>w=w;tbl−>h=h ;

} ;

int s e t dyn t ab l e ( struct dyn tab le ∗ tb l ){memset ( tbl−>data , 0 xfe , s izeof ( int )∗ tbl−>w∗ tbl−>h) ;

} ;

void print data RDS ( struct RDS data ∗pck data ) ;

void al loc data RDS ( struct RDS data ∗pck , int s i z e ){i f ( ! pck ) return ;int o l d d a t a s i z e=pck−>data l en ;i f ( pck−>data ){

pck−>data=r e a l l o c ( pck−>data , s i z e ) ;memset ( ( ( char ∗) pck−>data )+o l d da t a s i z e , 0 , s i z e−o l d d a t a s i z e ) ;

} else {pck−>data=malloc ( s i z e ) ;memset ( pck−>data , 0 , s i z e ) ;

} ;i f ( pck−>check data ){

pck−>check data=r e a l l o c ( pck−>check data , s i z e ) ;memset ( ( ( char ∗) pck−>check data )+o l d da t a s i z e , 0 xfe , s i z e−o l d d a t a s i z e ) ;

} else {pck−>check data=malloc ( s i z e ) ;memset ( pck−>check data , 0 xfe , s i z e ) ;

} ;pck−>da ta l en=s i z e ;

} ;

void reset data RDS ( struct RDS data ∗pck data , int row count ){i f ( pck data−>data ){

bzero ( pck data−>data , pck data−>da ta l en ) ;} ;i f ( pck data−>check data ){

// b z e ro ( pck da ta−>check da ta , pck da ta−>d a t a l e n ) ;memset ( pck data−>check data , 0 xfe , pck data−>da ta l en ) ;

} ;// b z e ro ( pck da ta−>d i s p l a c e r ow s , s i z e o f ( pck da ta−>d i s p l a c e r ow s ) ) ;a l l o c d yn t a b l e (&pck data−>d i sp lace rows , row count , 1 ) ;s e t dyn t ab l e (&pck data−>d i sp l a c e r ows ) ;pck data−>end data=0;

} ;

void f ree data RDS ( struct RDS data ∗pck data ){i f ( pck data−>data ){

f r e e ( pck data−>data ) ;pck data−>data=NULL;

} ;i f ( pck data−>check data ){

f r e e ( pck data−>check data ) ;pck data−>check data=NULL;

} ;f r e e d yn t a b l e (&pck data−>d i sp l a c e r ows ) ;

} ;

struct RCS data{int ∗ va lues ;int ∗ column index ;int v a l u e s s i z e ;int number o f va lue s in ;int ∗ row ptr ;int r ow s i z e ;int number of rows ;

int method ;} ;

void reset data RCS ( struct RCS data ∗pck data ){i f ( pck data−>va lues ){

bzero ( pck data−>values , pck data−>v a l u e s s i z e ) ;} ;i f ( pck data−>column index ){

Page 62: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

52 Poglavje B: izvorna koda zgoscevanje redke tabele

bzero ( pck data−>column index , pck data−>v a l u e s s i z e ) ;} ;i f ( pck data−>row ptr ){

bzero ( pck data−>row ptr , pck data−>r ow s i z e ) ;} ;pck data−>number o f va lue s in =0;pck data−>number of rows=0;

} ;

void a l loc data RCS ( struct RCS data ∗pck , int nnz len , int row count ){i f ( ! pck ) return ;i f ( pck−>v a l u e s s i z e != nnz l en ){

int o l d d a t a s i z e=pck−>v a l u e s s i z e ;i f ( pck−>va lues ){

pck−>va lues=r e a l l o c ( pck−>values , nnz l en ) ;memset ( ( ( char ∗) pck−>va lues )+o l d da t a s i z e , 0 , nnz len−o l d d a t a s i z e ) ;

} else {pck−>va lues=malloc ( nnz l en ) ;memset ( pck−>values , 0 , nnz l en ) ;

} ;i f ( pck−>column index ){

pck−>column index=r e a l l o c ( pck−>column index , nnz l en ) ;memset ( ( ( char ∗) pck−>column index )+o l d da t a s i z e , 0 xfe , nnz len−o l d d a t a s i z e ) ;

} else {pck−>column index=malloc ( nnz l en ) ;memset ( pck−>column index , 0 xfe , nnz l en ) ;

} ;pck−>v a l u e s s i z e=nnz l en ;

} ;

i f ( pck−>r ow s i z e != row count ){int o l d d a t a s i z e=pck−>r ow s i z e ;i f ( pck−>row ptr ){

pck−>row ptr=r e a l l o c ( pck−>row ptr , row count ) ;memset ( ( ( char ∗) pck−>row ptr )+o l d da t a s i z e , 0 xfe , row count−o l d d a t a s i z e ) ;

} else {pck−>row ptr=malloc ( row count ) ;memset ( pck−>row ptr , 0 xfe , row count ) ;

} ;pck−>r ow s i z e=row count ;

} ;

} ;

void free RCS DATA( struct RCS data ∗pck data ){i f ( pck data−>va lues ){

f r e e ( pck data−>va lues ) ;pck data−>va lues=NULL;

} ;i f ( pck data−>column index ){

f r e e ( pck data−>column index ) ;pck data−>column index=NULL;

} ;i f ( pck data−>row ptr ){

f r e e ( pck data−>row ptr ) ;pck data−>row ptr=NULL;

} ;} ;

struct LES data{int ∗ r p t r ,∗ c p t r ;int ∗dr ptr ,∗ dc pt r ;// need e x t r a sigmapint r s i z e , c s i z e ;// i n t i n r , i n c ;struct dyn tab le new table ;

} ;

void re se t data LES ( struct LES data ∗pck data ){i f ( pck data−>r p t r ){

bzero ( pck data−>r p t r , pck data−>r s i z e ) ;} ;i f ( pck data−>c p t r ){

bzero ( pck data−>c ptr , pck data−>c s i z e ) ;} ;i f ( pck data−>dr p t r ){

bzero ( pck data−>dr ptr , pck data−>r s i z e ) ;} ;i f ( pck data−>dc pt r ){

bzero ( pck data−>dc ptr , pck data−>c s i z e ) ;

Page 63: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

53

} ;} ;

void a l l oc data LES ( struct LES data ∗pck , int r s i z e , int c s i z e ){int o l d d a t a s i z e ;o l d d a t a s i z e=pck−>r s i z e ;i f ( o l d d a t a s i z e != r s i z e ){

i f ( pck−>r p t r ){pck−>r p t r=r e a l l o c ( pck−>r p t r , r s i z e ) ;memset ( ( ( char ∗) pck−>r p t r )+o l d da t a s i z e , 0 , r s i z e−o l d d a t a s i z e ) ;

} else {pck−>r p t r=malloc ( r s i z e ) ;memset ( pck−>r p t r , 0 , r s i z e ) ;

} ;

i f ( pck−>dr p t r ){pck−>dr p t r=r e a l l o c ( pck−>dr ptr , r s i z e ) ;memset ( ( ( char ∗) pck−>dr p t r )+o l d da t a s i z e , 0 , r s i z e−o l d d a t a s i z e ) ;

} else {pck−>dr p t r=malloc ( r s i z e ) ;memset ( pck−>dr ptr , 0 , r s i z e ) ;

} ;pck−>r s i z e=r s i z e ;

}

o l d d a t a s i z e=pck−>c s i z e ;i f ( o l d d a t a s i z e != c s i z e ){

i f ( pck−>c p t r ){pck−>c p t r=r e a l l o c ( pck−>c ptr , c s i z e ) ;memset ( ( ( char ∗) pck−>c p t r )+o l d da t a s i z e , 0 , c s i z e−o l d d a t a s i z e ) ;

} else {pck−>c p t r=malloc ( c s i z e ) ;memset ( pck−>c ptr , 0 , c s i z e ) ;

} ;

i f ( pck−>dc pt r ){pck−>dc pt r=r e a l l o c ( pck−>dc ptr , c s i z e ) ;memset ( ( ( char ∗) pck−>dc pt r )+o l d da t a s i z e , 0 , c s i z e−o l d d a t a s i z e ) ;

} else {pck−>dc pt r=malloc ( c s i z e ) ;memset ( pck−>dc ptr , 0 , c s i z e ) ;

} ;pck−>c s i z e=c s i z e ;

} ;} ;

struct GCS data{struct dyn tab le c o l i n f o ;struct dyn tab le row in fo ;struct dyn tab le t ab l e ;

} ;

void free GCS ( struct GCS data ∗pck ){f r e e d yn t a b l e (&pck−>c o l i n f o ) ;f r e e d yn t a b l e (&pck−>r ow in fo ) ;f r e e d yn t a b l e (&pck−>t ab l e ) ;

} ;

int ge t r emove de f au l t s ( struct dyn tab le ∗ table , struct dyn tab le ∗ d e f a u l t r e du c t i o n s ){int k , i , j ;struct dyn tab le temp table ={0};int count=0;

i f ( d e f au l t r educ t i on s−>w==0|| de f au l t r educ t i on s−>h==0)a l l o c d yn t a b l e ( d e f au l t r educ t i on s , table−>h , 1 ) ;

a l l o c d yn t a b l e (&temp table , table−>w, 2 ) ;

for ( k=0;k<table−>h ; k++){int cn t =0;

for ( i =0; i<table−>w; i++){s e t da t a (&temp table , 0 , i , 0 ) ;s e t da t a (&temp table , 1 , i , 0 ) ;

} ;

for ( i =0; i<table−>w; i++){int cu r r educ t i on=r t da t a ( table , k , i ) ;i f ( cu r r educ t i on !=0){

int index=−1;

Page 64: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

54 Poglavje B: izvorna koda zgoscevanje redke tabele

for ( j =0; j< cn t ; j++){int tmp val=r t da t a (&temp table , 0 , j ) ;i f ( tmp val !=0){

i f ( tmp val==cur r educ t i on ){index=j ;s e t da t a (&temp table , 1 , j , r t da t a (&temp table , 1 , j )+1) ;break ;

} ;} ;

} ;i f ( index <0){

index= cnt ;s e t da t a (&temp table , 0 , j , cu r r educ t i on ) ;s e t da t a (&temp table , 1 , j , r t da t a (&temp table , 1 , j )+1) ;cn t++;

} ;} ;

} ;

int idx max=0;int max val=r t da t a (&temp table , 1 , 0 ) ;

for ( i =1; i< cn t ; i++){i f ( max val<r t da t a (&temp table , 1 , i ) ){

idx max=i ;max val=r t da t a (&temp table , 1 , i ) ;

} ;} ;s e t da t a ( d e f au l t r educ t i on s , 0 , k , r t da t a (&temp table , 0 , idx max ) ) ;

// p r i n t f ( ” v r s t i c a k=%d max va l=%d v a l=%d\n ” , k , r t d a t a (& t emp ta b l e , 1 , idx max ) , r t d a t a (&t emp ta b l e , 0 , idx max ) ) ;

} ;

// remove d e f a u l t r e d u c t i o n s fromd datafor ( k=0;k<table−>h ; k++){

int de f r educ t i on=r t da t a ( d e f au l t r educ t i on s , 0 , k ) ;i f ( d e f r educ t i on )for ( i =0; i<table−>w; i++){

i f ( r t da t a ( table , k , i )==de f r educ t i on ){// p r i n t f ( ”k=%d i=%d de f r e du c t i on=%d v a l=%d\n ” , k , i , d e f r e d u c t i o n , r t d a t a ( t a b l e , k , i

) ) ;s e t da t a ( table , k , i , 0 ) ;count++;

} ;} ;

} ;f r e e d yn t ab l e (&temp table ) ;return count ;

} ;

void p r i n t t a b l e ( struct dyn tab le ∗ t ab l e ){int i , j ;for ( i =0; i<table−>h ; i++){

p r i n t f ( ”%d . ” , i ) ;for ( j =0; j<table−>w; j++){

p r i n t f ( ”%2d ” , r t da t a ( table , i , j ) ) ;}p r i n t f ( ”\n”) ;

}} ;

void l o a d d a t a f r om f i l e ( char ∗ f name , struct dyn tab le ∗ t ab l e ){char bu f f e r [ 1 0 2 4 ] ;unsigned int i n b u f f =0;int e r r ;int fd ;char ∗ endstr ;char ∗ tmp end str ;unsigned int l i n e s c o un t =0;int tb l w=0, t b l h =0;fd=open ( f name ,ORDONLY) ;i f ( fd<0)

return ;do{

e r r=read ( fd , bu f f e r+in bu f f ,1023− i n b u f f ) ;i f ( err <0){

p r i n t f ( ” e r r o r read ing \n”) ;

Page 65: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

55

break ;} ;i n b u f f+=er r ;bu f f e r [ i n b u f f ]=0;i f ( ( endstr=s t r ch r ( bu f f e r , ’\n ’ ) ) ){{

char ∗ s t a r t b u f f=bu f f e r ;unsigned int row cnt=0;while ( endstr>s t a r t b u f f &&(( ( tmp end str=s t r ch r ( s t a r t bu f f , ’ ’ ) ) &&endstr>=

tmp end str ) | | ( ( tmp end str=s t r ch r ( s t a r t bu f f , ’\n ’ ) ) &&endstr>=tmp end str ) )){

∗ tmp end str =0;i f ( l i n e s c o un t==0){

i f ( row cnt==0){t b l h=a to i ( s t a r t b u f f ) ;

}else{

tb l w=ato i ( s t a r t b u f f ) ;p r i n t f ( ”Got tab l e w=%d h=%d\n” , tbl w , t b l h ) ;i f ( table−>w | | table−>h)

abort ( ) ;a l l o c d yn t a b l e ( table , tbl w , t b l h ) ;

} ;}else {

int tmpval=a to i ( s t a r t b u f f ) ;i f ( tmpval ){

// p r i n t f ( ”GOT tmpva l=%d s s=%s ln=%d row=%d\n ” , tmpval , s t a r t b u f f , l i n e s c o un t ,row cn t ) ;

s e t da t a ( table , l i n e s c oun t −1, row cnt , tmpval ) ;}// e l s e

// s e t d a t a ( t a b l e , l i n e s c o un t , row cnt , 0 ) ;} ;s t a r t b u f f=tmp end str +1;row cnt++;

} ;l i n e s c o un t++;

}endstr++;i n bu f f−=endstr−bu f f e r ;memmove( bu f f e r , endstr , i n b u f f ) ;// p r i n t f ( ” removing s i z e =%d\n ” , ends t r−b u f f e r ) ;

}else{

p r i n t f ( ” e r r \n”) ;break ;

} ;}while ( i n b u f f ) ;c l o s e ( fd ) ;

} ;

void f i l l t a b l e ( struct dyn tab le ∗ table , int count ){// i n t count ;int i , j , c ;// b z e ro ( t a b l e ,WW∗WH∗ s i z e o f ( i n t ) ) ;i f ( count<=0)

count=1;// p r i n t f ( ”Dodal %d e lementov \n ” , count ) ;

#i f 0for ( i =0; i<table−>w; i++)

for ( j =0; j<table−>h ; j++)s e t da t a ( table , j , i , i ) ;

return ;#endif#i f 0

for ( i =0; i<table−>w; i++)for ( j =0; j<table−>h ; j++)

s e t da t a ( table , j , i , j ) ;j =0;for ( i =0; i<table−>w; i++)

s e t da t a ( table , j , i , rand ( )%100) ;return ;

#endiffor ( c=0;c<count ; c++){

do{i=rand ( )%table−>w;j=rand ( )%table−>h ;

}while ( r t da t a ( table , j , i ) !=0) ;// t a b l e [ j ] [ i ]=( rand ( ) %99)+1;

Page 66: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

56 Poglavje B: izvorna koda zgoscevanje redke tabele

s e t da t a ( table , j , i , ( rand ( )%99)+1) ;

} ;} ;

void check rows ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data ){// [WH] [ 4 ]int col , row ;int s ta r t , end , count ;for ( row=0;row<table−>h ; row++){

end=s t a r t=−1;count=0;for ( c o l =0; co l<table−>w; co l++){

i f ( r t da t a ( table , row , c o l ) !=0){// p r i n t f (”%d,%d\n ” , row , c o l ) ;i f ( s ta r t <0){

s t a r t=co l ;end=s t a r t +1;

}else {

end=co l +1;} ;count++;

} ;} ;s e t da t a ( rows data , 0 , row , count ) ;s e t da t a ( rows data , 1 , row , end−s t a r t ) ;s e t da t a ( rows data , 2 , row , s t a r t ) ;s e t da t a ( rows data , 3 , row , end ) ;// rows da ta [ row ] [ 1 ]= end−s t a r t ;// rows da ta [ row ] [ 2 ]= s t a r t ;// rows da ta [ row ] [ 3 ]= end ;// p r i n t f ( ”row=%d s t a r t=%d end=%d count=%d\n ” , row , s t a r t , end , count ) ;

} ;} ;

int s o r t r ows ( struct dyn tab le ∗ rows data , struct dyn tab le ∗ r ow l i s t , int metoda ){// [WH] [ 4 ] [WH]

int count=0;int i , j ;int pos ;for ( i =0; i<rows data−>w; i++){

int rowcount=r t da t a ( rows data , 0 , i ) ;// p r i n t f ( ”row %d l en=%d\n ” , i , rowcount ) ;pos=count−1;i f ( rowcount>0){

while ( pos>=0&&rt da ta ( rows data , 0 , r t da t a ( r ow l i s t , 0 , pos ) ) < rowcount )pos−−;

i f ( ! ( metoda&2) )while ( pos>=0&& rowcount==r t da ta ( rows data , 0 , r t da t a ( r ow l i s t , 0 , pos ) ) && r t da ta (

rows data , 1 , r t da t a ( r ow l i s t , 0 , pos ) ) < r t da t a ( rows data , 1 , i ) )pos−−;

for ( j=count−1; j>pos ; j−−){s e t da t a ( r ow l i s t , 0 , j +1, r t da t a ( r ow l i s t , 0 , j ) ) ;

} ;// r o w l i s t [ pos+1]= i ;s e t da t a ( r ow l i s t , 0 , pos+1, i ) ;count++;

}else {

s e t da t a ( r ow l i s t , 0 , pos+1, i ) ;count++;

} ;} ;// f o r ( i =0; i<count ; i++)// p r i n t f (”%d count=%d t a l l y=%d\n ” , r o w l i s t [ i ] , r ows da ta [ r o w l i s t [ i ] ] [ 0 ] , r ows da ta [

r o w l i s t [ i ] ] [ 1 ] ) ;return rows data−>w;// r e t u rn count ;

} ;

int match row ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data , struct dyn tab le ∗r ow l i s t , int srow , int crow )

{i f ( r t da t a ( rows data , 0 , srow )>0&&r t da ta ( rows data , 0 , srow )==r t da ta ( rows data , 0 , crow )&&

r t da ta ( rows data , 1 , srow )==r t da ta ( rows data , 1 , crow )){//&&r t d a t a ( rows data , 2 , srow )==r t d a t a ( rows data , 2 , crow )&&r t d a t a ( rows data , 3 , srow )

==r t d a t a ( rows data , 3 , crow )int c ;for ( c=r t da t a ( rows data , 2 , srow ) ; c<r t da t a ( rows data , 2 , srow )+r t da t a ( rows data , 1 , srow ) ;

c++){

Page 67: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

57

i f ( r t da t a ( table , srow , c ) != r t da t a ( table , crow , c ) )return 0 ;

} ;// f o r ( c=r t d a t a ( rows data , 2 , srow ) ; c<r t d a t a ( rows data , 2 , srow )+r t d a t a ( rows data , 1 , srow

) ; c++)// p r i n t f ( ”c=%d v1=%d v2=%d\n ” , c , r t d a t a ( t a b l e , srow , c ) , r t d a t a ( t a b l e , crow , c ) ) ;// p r i n t f ( ” found match c=%d r=%d\n ” , crow , srow ) ;return 1 ;

} ;return 0 ;

} ;

int pack row RDS ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data , struct RDS data ∗pck data , int row idx ){

int d i s p l a c e i d x=r t da t a ( rows data , 2 , row idx ) ;int i ;int p l a c e a t =0;int ok ;

i f ( r t da t a ( rows data , 1 , row idx )<=0) return −999;for ( ; ; p l a c e a t++){

int k ;// p r i n t f ( ” p l a c e a t=%d id x=%d\n ” , p l a c e a t , r ow id x ) ;ok=1;i f ( ( p l a c e a t+r t da t a ( rows data , 1 , row idx )+1)∗ s izeof ( int )>=pck data−>da ta l en ){

int da ta l en=pck data−>data l en ∗2 ;i f ( data len <=(r t da t a ( rows data , 1 , row idx )∗ s izeof ( int ) ) )

da ta l en+=(r t da t a ( rows data , 1 , row idx )∗ s izeof ( int )∗ s izeof ( int ) ) ∗2 ;a l loc data RDS ( pck data , da ta l en ) ;

} ;

for ( k=0;k<r t da t a ( rows data , 1 , row idx )&&ok ; k++){#i f 0

i f ( pck data−>data [ p l a c e a t+k ] !=0) {// p r i n t f ( ” p l a c e a t=%d k=%d data=%d\n ” , p l a c e a t , k , pck da ta−>data [ p l a c e a t+k ] ) ;ok=0;break ;

} ;#else

i f ( r t da t a ( table , row idx , r t da t a ( rows data , 2 , row idx )+k)&&pck data−>data [ p l a c e a t+k] !=0) {

// p r i n t f ( ” p l a c e a t=%d k=%d data=%d\n ” , p l a c e a t , k , pck da ta−>data [ p l a c e a t+k ] ) ;ok=0;break ;

} ;#endif

} ;i f ( pck data−>method&1)

for ( k=0;k<table−>h&&ok ; k++){// l i n e s a d d e di f ( r t da t a (&pck data−>d i sp lace rows , 0 , k )==0x f e f e f e f e ) // not d e f i n e d y e t

continue ;// p r i n t f ( ”k=%d d i s p l a c e r ow s , 0 , k )=%d p l a c e a t −( rows data , 2 , r ow id x )=%d\n ” , k ,

r t d a t a (&pck da ta−>d i s p l a c e r ow s , 0 , k ) , p l a c e a t−r t d a t a ( rows data , 2 , r ow id x ) ) ;i f ( r t da t a (&pck data−>d i sp lace rows , 0 , k )==place a t−r t da t a ( rows data , 2 , row idx ) ){

// p r i n t f ( ”SAME INDEX k=%d %d\n ” , r t d a t a (&pck da ta−>d i s p l a c e r ow s , 0 , k ) , p l a c e a t−r t d a t a ( rows data , 2 , r ow id x ) ) ;

// p r i n t f ( ”Same index \n ”) ;ok=0;break ;

} ;} ;

i f ( ok ){// p r i n t f ( ” found p l a c e a t %d t a l l y=%d\n ” , p l a c e a t , r ows da ta [ r ow id x ] [ 1 ] ) ;for ( k=0;k<r t da t a ( rows data , 1 , row idx ) ; k++){

i f ( r t da t a ( table , row idx , r t da t a ( rows data , 2 , row idx )+k) !=0){pck data−>data [ p l a c e a t+k]= r t da t a ( table , row idx , r t da t a ( rows data , 2 , row idx )+k)

;// p r i n t f ( ” w r i t i n g data i d x=%d d=%d\n ” , p l a c e a t+k , pck da ta−>data [ p l a c e a t+k ] ) ;// pck da ta−>c h e c k d a t a [ p l a c e a t+k ]= rows da ta [ r ow id x ] [ 2 ]+ k ;i f ( pck data−>method&1)

pck data−>check data [ p l a c e a t+k]= r t da t a ( rows data , 2 , row idx )+k ;else

pck data−>check data [ p l a c e a t+k]= row idx ;} ;

} ;i f ( p l a c e a t+r t da t a ( rows data , 1 , row idx )>pck data−>end data )

pck data−>end data=p l a c e a t+r t da t a ( rows data , 1 , row idx ) ;

return p lace a t−r t da t a ( rows data , 2 , row idx ) ;} ;

Page 68: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

58 Poglavje B: izvorna koda zgoscevanje redke tabele

} ;} ;

void add tables RDS ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data , struct dyn tab le∗ r ow l i s t , int row count , struct RDS data ∗pck data ){

int cnt ;

for ( cnt=0; cnt<row count ; cnt++){int idx , j , found=0;int f ound idx ;int t ab l e i nd ex=r t da t a ( r ow l i s t , 0 , cnt ) ;

i f ( pck data−>method&1){for ( j =0; j<cnt ; j++){

int tmpval=r t da t a ( r ow l i s t , 0 , j ) ;// p r i n t f ( ” t a b l e i n d e x=%d r o w l i s t=%d\n ” , t a b l e i n d e x , tmpva l ) ;i f ( t ab l e i nd ex !=tmpval&&match row ( table , rows data , r ow l i s t , t ab l e index , tmpval ) ){

// p r i n t f ( ”FOund=%d %d\n ” , tmpval , t a b l e i n d e x ) ;found++;found idx=r t da t a (&pck data−>d i sp lace rows , 0 , tmpval ) ;break ;

} ;// i f ( t a b l e i n d e x != r o w l i s t [ j ] ) //&&match row ( t a b l e , rows data , r o w l i s t , t a b l e i n d e x ,

r o w l i s t [ j ] )// found++;

} ;} ;

i f ( r t da t a ( rows data , 0 , t ab l e i nd ex )>0){// p r i n t f ( ” add ing row %d\n ” , t a b l e i n d e x ) ;i f ( found ){

// p r i n t f ( ” ! ! ! v r s t i c a se pona v l j a i d x=%d cnt=%d\n ” , t a b l e i n d e x , cn t ) ;found=found idx ;// abo r t ( ) ;

}else{

found=pack row RDS ( table , rows data , pck data , t ab l e i nd ex ) ;} ;s e t da t a (&pck data−>d i sp lace rows , 0 , t ab l e index , found ) ;// p r i n t f ( ” i d x=%d found=%d\n ” , t a b l e i n d e x , found ) ;

}else {

// empty row// s e t d a t a (&pck da ta−>d i s p l a c e r ow s , 0 , t a b l e i n d e x ,100000) ;s e t da t a (&pck data−>d i sp lace rows , 0 , t ab l e index , 0 x f e f e f e f e ) ;

} ;} ;

} ;

int che ck tab l e ( struct dyn tab le ∗ t ab l e /∗ [WH] [WW] ∗/ , struct RDS data ∗pck data ){int i , j ;for ( i =0; i<table−>h ; i++){

for ( j =0; j<table−>w; j++){int va l =0;int idx ;int chk dat ;idx=r t da t a (&pck data−>d i sp lace rows , 0 , i )+j ;i f ( idx>=0&&idx<pck data−>end data ){

// c h e c k d a t achk dat=pck data−>check data [ idx ] ;i f ( pck data−>method&1){

i f ( chk dat==j ) // jva l=pck data−>data [ idx ] ;

}else {

i f ( chk dat==i ) // jva l=pck data−>data [ idx ] ;

} ;} ;

i f ( va l != r t da t a ( table , i , j ) ){p r i n t f ( ”False data va l=%d tab=%d chk dat=%d i=%d , j=%d idx=%d\n” , val , r t da t a ( table ,

i , j ) , chk dat , i , j , idx ) ;return −1;

} ;} ;

} ;return 0 ;

} ;

Page 69: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

59

void print data RDS ( struct RDS data ∗pck data ){int i ;int tmp ;

p r i n t f ( ”DISPLACE INDEX\n”) ;for ( i =0; i<pck data−>d i sp l a c e r ows .w; i++){

tmp=r t da t a (&pck data−>d i sp lace rows , 0 , i ) ;i f (tmp<−0 x f f f f f f )

p r i n t f ( ”NA ”) ;else

p r i n t f ( ”%2d ” , r t da t a (&pck data−>d i sp lace rows , 0 , i ) ) ;} ;p r i n t f ( ”\n”) ;

p r i n t f ( ”DATA TABLE\n”) ;for ( i =0; i<pck data−>end data ; i++){

p r i n t f ( ”%2d ” , pck data−>data [ i ] ) ;} ;p r i n t f ( ”\n”) ;p r i n t f ( ”CHECK TABLE\n”) ;for ( i =0; i<pck data−>end data ; i++){

i f ( pck data−>check data [ i ]<0)p r i n t f ( ”NA ”) ;elsep r i n t f ( ”%2d ” , pck data−>check data [ i ] ) ;

} ;p r i n t f ( ”\n”) ;

} ;

void add tables RCS ( struct dyn tab le ∗ table , struct RCS data ∗pck data ){int i , j ;pck data−>row ptr [ 0 ]=0 ;pck data−>number of rows=1;for ( j =0; j<table−>h ; j++){

for ( i =0; i<table−>w; i++){int tmp val=r t da t a ( table , j , i ) ;i f ( tmp val ){

i f ( pck data−>va l u e s s i z e <pck data−>number o f va lue s in ∗ s izeof ( int )+s izeof ( int ) ){// p r i n t f ( ” a l l o c i n g new v a l u e s \n ”) ;a l loc data RCS ( pck data , pck data−>v a l u e s s i z e ∗2 , pck data−>r ow s i z e ) ;

} ;∗( pck data−>va lues+pck data−>number o f va lue s in )=tmp val ;pck data−>column index [ pck data−>number o f va lue s in ]= i ;// p r i n t f ( ”Adding va l u e %d i=%d , j=%d numb e r o f v a l u e s i n=%d\n ” , tmp va l , i , j , p ck da ta

−>numb e r o f v a l u e s i n ) ;pck data−>number o f va lue s in++;

} ;} ;// p r i n t f ( ” number o f rows=%d i n v a l u e s=%d v a l=%d\n ” , pck da ta−>number o f rows , pck da ta−>

numbe r o f v a l u e s i n , pck da ta−>r ow p t r [ 1 ] ) ;∗( pck data−>row ptr+pck data−>number of rows )=pck data−>number o f va lue s in ;pck data−>number of rows++;

} ;} ;

int return RCS val ( struct RCS data ∗pck data , int x , int y ){int i ;i f (y>pck data−>number of rows ){

p r i n t f ( ” e r r req\n”) ;return 0 ;

} ;for ( i=pck data−>row ptr [ y ] ; i<pck data−>row ptr [ y+1] ; i++){

// p r i n t f ( ” i=%d\n ” , i ) ;// p r i n t f ( ” pck da ta−>co lumn index [ i ]=%d\n ” , pck da ta−>co lumn index [ i ] ) ;i f ( pck data−>column index [ i ]==x)

return pck data−>va lues [ i ] ;} ;return 0 ;

} ;

void test RCS data ( struct dyn tab le ∗ table , struct RCS data ∗pck data ){int i , j ;for ( i =0; i<table−>h ; i++)

for ( j =0; j<table−>w; j++){int tmp val ;tmp val=return RCS val ( pck data , j , i ) ;i f ( tmp val != r t da t a ( table , i , j ) ){

p r i n t f ( ” r e s u l t f a l s e tmp val=%d data=%d i=%d , j=%d\n” , tmp val , r t da t a ( table , i , j ) , i ,j ) ;

abort ( ) ;

Page 70: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

60 Poglavje B: izvorna koda zgoscevanje redke tabele

} ;} ;

} ;

int LES scan l ine ( struct dyn tab le ∗ table , int l i n e , int ∗ r va lue , struct dyn tab le ∗removed column ){

unsigned int i , p a r s e d l i n e =0;int value=0;for ( i =0; i<table−>w; i++){

i f ( r t da t a ( removed column , 0 , i ) )continue ;

p a r s e d l i n e++;i f ( r t da t a ( table , l i n e , i ) ){

i f ( value==0){value=r t da t a ( table , l i n e , i ) ;

}else {

i f ( value != r t da t a ( table , l i n e , i ) )return 0 ;

} ;} ;

} ;i f ( pa r s ed l i n e <=1)

return 0 ;i f ( value==0)

return −1;∗ r v a l u e=value ;return 1 ;

} ;

int LES scan co l ( struct dyn tab le ∗ table , int column , int ∗ r va lue , struct dyn tab le ∗removed rows ){

unsigned int i , p a r s ed co l =0;int value=0;for ( i =0; i<table−>h ; i++){

i f ( r t da t a ( removed rows , 0 , i ) )continue ;

p a r s ed co l++;i f ( r t da t a ( table , i , column ) ){

i f ( value==0){value=r t da t a ( table , i , column ) ;

}else {

i f ( value != r t da t a ( table , i , column ) )return 0 ;

} ;} ;

} ;i f ( pa r s ed co l <=1)

return 0 ;i f ( value==0)

return −1;∗ r v a l u e=value ;return 1 ;

} ;

void add tables LES ( struct dyn tab le ∗ table , struct LES data ∗pck data ){struct dyn tab le row in fo ={0};struct dyn tab le c o l i n f o ={0};

int col added , row added ;unsigned int i , j ;int value , r e t ;unsigned int scan=0;

a l l o c d yn t a b l e (&row info , table−>h , 1 ) ;a l l o c d yn t a b l e (& c o l i n f o , table−>w, 1 ) ;

do{row added=co l added=0;scan++;for ( i =0; i<table−>h ; i++){

i f ( r t da t a (&row info , 0 , i ) ) // a l r e a d y d id t h a t rowcontinue ;

r e t=LES scan l ine ( table , i ,&value ,& c o l i n f o ) ;// p r i n t f ( ” l i n e i=%d r e t=%d va l u e=%d\n ” , i , r e t , v a l u e ) ;i f ( r e t==−1){

// empty l i n e// p r i n t f ( ”empty l i n e \n ”) ;s e t da t a (&row info , 0 , i , 1 ) ; // l i n e removed

Page 71: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

61

pck data−>dr p t r [ i ]= scan ;pck data−>r p t r [ i ]=0;row added++;break ;

}elsei f ( r e t ){

s e t da t a (&row info , 0 , i , 1 ) ; // l i n e removedpck data−>dr p t r [ i ]= scan ;pck data−>r p t r [ i ]= value ;row added++;break ;

} ;} ;

scan++;for ( i =0; i<table−>w; i++){

i f ( r t da t a (& c o l i n f o , 0 , i ) ) // a l r e ad y d id t h a t rowcontinue ;

r e t=LES scan co l ( table , i ,&value ,& row in fo ) ;// p r i n t f ( ” co l u i=%d r e t=%d va l u e=%d\n ” , i , r e t , v a l u e ) ;i f ( r e t==−1){

// empty l i n e// p r i n t f ( ”empty column\n ”) ;s e t da t a (& c o l i n f o , 0 , i , 1 ) ; // column removedpck data−>dc pt r [ i ]= scan ;pck data−>c p t r [ i ]=0;co l added++;break ;

}elsei f ( r e t ){

s e t da t a (& c o l i n f o , 0 , i , 1 ) ; // column removedpck data−>dc pt r [ i ]= scan ;pck data−>c p t r [ i ]= value ;co l added++;break ;

} ;

} ;// p r i n t f ( ” row added=%d co l a d d e d=%d scan=%d\n ” , row added , co l added , scan ) ;

}while ( row added | | co l added ) ;scan++;int new w=0,new h=0;for ( i =0; i<table−>h ; i++){// count h e i g h t f o r new t a b l e

i f ( ! r t da t a (&row info , 0 , i ) ){// p r i n t f ( ”new scan row=%d new h=%d\n ” , i , new h ) ;pck data−>dr p t r [ i ]= scan ;pck data−>r p t r [ i ]=new h ;new h++;

} ;} ;for ( i =0; i<table−>w; i++){// count h e i g h t f o r new t a b l e

i f ( ! r t da t a (& c o l i n f o , 0 , i ) ){// p r i n t f ( ”new scan c o l=%d new w=%d\n ” , i , new w ) ;pck data−>dc pt r [ i ]= scan ;pck data−>c p t r [ i ]=new w ;new w++;

} ;} ;// p r i n t f ( ”new t a b l e i s %d,%d\n ” , new w , new h ) ;i f ( new w&&new h ){

a l l o c d yn t a b l e (&pck data−>new table , new h , new w) ;

new h=0;for ( i =0; i<table−>w; i++){

i f ( ! r t da t a (& c o l i n f o , 0 , i ) ){new w=0;for ( j =0; j<table−>h ; j++)

i f ( ! r t da t a (&row info , 0 , j ) ){int va l=r t da t a ( table , j , i ) ;// p r i n t f ( ”new w=%d , new h=%d va l=%d\n ” , new w , new h , v a l ) ;s e t da t a (&pck data−>new table , new h , new w , va l ) ;new w++;

} ;new h++;

} ;} ;

} ;

Page 72: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

62 Poglavje B: izvorna koda zgoscevanje redke tabele

f r e e d yn t ab l e (& row in fo ) ;f r e e d yn t ab l e (& c o l i n f o ) ;

} ;

void te s t LES data ( struct dyn tab le ∗ table , struct LES data ∗pck data ){unsigned int i , j ;

#i f 0// p r i n t t a b l e ( t a b l e ) ;for ( i =0; i<table−>h ; i++){

p r i n t f ( ” i=%d r=%d dr=%d\n” , i , pck data−>r p t r [ i ] , pck data−>dr p t r [ i ] ) ;} ;for ( i =0; i<table−>w; i++){

p r i n t f ( ” i=%d c=%d dc=%d\n” , i , pck data−>c p t r [ i ] , pck data−>dc pt r [ i ] ) ;} ;p r i n t t a b l e (&pck data−>new table ) ;

#endiffor ( i =0; i<table−>h ; i++)

for ( j =0; j<table−>w; j++){int va l=r t da t a ( table , i , j ) ;i f ( va l ){// as sigmap

// p r i n t f ( ” pck da ta−>d r p t r [ i ]=%d pck da ta−>d c p t r [ j ]=%d i=%d , j=%d\n ” , pck da ta−>d r p t r [ i ] , p ck da ta−>d c p t r [ j ] , i , j ) ;

i f ( pck data−>dr p t r [ i ]<pck data−>dc pt r [ j ] ) {i f ( va l !=pck data−>r p t r [ i ] ) {

p r i n t f ( ”here i t s value =%d val=%d\n” , pck data−>r p t r [ i ] , va l ) ;abort ( ) ;

} ;}else i f ( pck data−>dr p t r [ i ]>pck data−>dc pt r [ j ] ) {

i f ( pck data−>c p t r [ j ] != va l ){p r i n t f ( ”here i t s value2 =%d val=%d\n” , pck data−>c p t r [ j ] , va l ) ;abort ( ) ;

} ;}else {

int val1=r t da t a (&pck data−>new table , pck data−>c p t r [ j ] , pck data−>r p t r [ i ] ) ;i f ( va l != val1 ){

p r i n t f ( ” tab l e value pck data−>r p t r [ i ]=%d c p t r [ j ]=%d val=%d val1=%d\n” ,pck data−>r p t r [ i ] , pck data−>c p t r [ j ] , val , va l1 ) ;

abort ( ) ;} ;

} ;} ;

} ;} ;

struct adj{int max size ;int cur e lem ;unsigned int ∗ptr ;int c o l o r ;unsigned int c o l l i s i o n c o u n t ;

} ;

int l ine compare ( struct dyn tab le ∗ table , int l1 , int l 2 ){unsigned int i ;i f ( l 1==l2 )

abort ( ) ;for ( i =0; i<table−>w; i++){

int va l=r t da t a ( table , l1 , i ) ;int val1=r t da t a ( table , l2 , i ) ;i f ( va l&&val1&&val != val1 )

return 0 ;} ;return 1 ;

} ;

int row compare ( struct dyn tab le ∗ table , int l1 , int l 2 ){unsigned int i ;i f ( l 1==l2 )

abort ( ) ;for ( i =0; i<table−>h ; i++){

int va l=r t da t a ( table , i , l 1 ) ;int val1=r t da t a ( table , i , l 2 ) ;i f ( va l&&val1&&val != val1 )

return 0 ;} ;return 1 ;

} ;

Page 73: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

63

void c h e c k ad j d a t a s i z e ( struct adj ∗adj , int new s i z e ){i f ( new s i z e==0)

new s i z e =1024;i f ( new s ize>adj−>max size ){

i f ( adj−>max size ){adj−>ptr=malloc ( new s i z e ) ;memset ( adj−>ptr , 0 , new s i z e ) ;

}else{

adj−>ptr=r e a l l o c ( adj−>ptr , new s i z e ) ;memset ( ( ( char ∗) adj−>ptr )+adj−>max size , 0 , new s ize−adj−>max size ) ;

} ;adj−>max size=new s i z e ;

} ;} ;

void f r e e r ow da ta ( struct adj ∗data , int s i z e ){unsigned int i ;for ( i =0; i<s i z e ; i++){

i f ( data [ i ] . ptr )f r e e ( data [ i ] . ptr ) ;

} ;f r e e ( data ) ;

} ;

void q s o r t ad j ( struct adj ∗graph , struct dyn tab le ∗ table , int l , int r ){

int i , j , p ivot ;i = l ;j = r ;p ivot = graph [ r t da t a ( table , 0 , ( l+r ) /2) ] . c o l l i s i o n c o u n t ;do {

while ( graph [ r t da t a ( table , 0 , i ) ] . c o l l i s i o n c o u n t > pivot ) i++;while ( graph [ r t da t a ( table , 0 , j ) ] . c o l l i s i o n c o u n t < pivot ) j−−;

i f ( i <= j ) {// s t r u c t ad j h e l p ;int he lp idx ;// h e l p = graph+i ;//memcpy(&he lp , graph+i , s i z e o f ( s t r u c t ad j ) ) ;//memmove( graph+i , graph+j , s i z e o f ( s t r u c t ad j ) ) ;//memcpy( graph+j ,& he lp , s i z e o f ( s t r u c t ad j ) ) ;// graph [ i ] = graph [ j ] ;// graph [ j ] = he l p ;he lp idx=r t da t a ( table , 0 , i ) ;s e t da t a ( table , 0 , i , r t da t a ( table , 0 , j ) ) ;s e t da t a ( table , 0 , j , h e l p i dx ) ;i++;j−−;

} ;}while ( i <= j ) ;

i f ( l < j ) q s o r t ad j ( graph , table , l , j ) ;i f ( i < r ) q s o r t ad j ( graph , table , i , r ) ;

}

struct adj ∗ get row data ( struct dyn tab le ∗ table , struct dyn tab le ∗ s o r t ed index ){unsigned int i , j ;struct adj ∗data ;

data=malloc ( s izeof ( struct adj )∗ table−>h) ;i f ( ! data )

abort ( ) ;memset ( data , 0 , s izeof ( struct adj )∗ table−>h) ;a l l o c d yn t a b l e ( so r t ed index , table−>h , 1 ) ;for ( i =0; i<table−>h ; i++){

c h e c k ad j d a t a s i z e ( data+i , s izeof ( int )∗ table−>h) ;data [ i ] . c o l o r=−1;s e t da t a ( so r t ed index , 0 , i , i ) ;

} ;

for ( i =0; i<table−>h ; i++){for ( j =0; j<i ; j++){// t a b l e−>h

// i f ( i==j )// con t inue ;

i f ( ! l ine compare ( table , i , j ) ){// p r i n t f ( ” i=%d adding j=%d\n ” , i , j ) ;i f ( ! data [ i ] . max s ize | | data [ i ] . max size<data [ i ] . cur e lem+s izeof ( int ) ){

Page 74: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

64 Poglavje B: izvorna koda zgoscevanje redke tabele

abort ( ) ;// c h e c k a d j d a t a s i z e ( data+i , da ta [ i ] . max s i z e ∗2) ;

} ;data [ i ] . ptr [ data [ i ] . cur e lem ]= j ;data [ i ] . cur e lem++;data [ i ] . c o l l i s i o n c o u n t++;

data [ j ] . ptr [ data [ j ] . cur e lem ]= i ;data [ j ] . cur e lem++;data [ j ] . c o l l i s i o n c o u n t++;

} ;} ;

} ;

q s o r t ad j ( data , so r t ed index , 0 , table−>h−1) ;/∗ f o r ( i =0; i<t a b l e−>h ; i++){

i n t i d x=r t d a t a ( s o r t e d i n d e x , 0 , i ) ;p r i n t f ( ” data i=%d xa=%d id x=%d\n ” , idx , da ta [ i d x ] . c o l l i s i o n c o u n t , i ) ;

} ; ∗/return data ;

} ;

unsigned int co l o r r ows ( struct adj ∗data , struct dyn tab le ∗ so r t ed index , unsigned int s i z e ){

unsigned int max color=0;unsigned int i , j ;for ( i =0; i<s i z e ; i++){

int idx=r t da t a ( so r t ed index , 0 , i ) ;int c o l l i s i o n ;unsigned int c u r c o l o r ;// p r i n t f ( ” ! ! ! da ta [ i d x ] . cu r e l em=%d\n ” , data [ i d x ] . cu r e l em ) ;for ( c u r c o l o r =0; cu r co l o r<=max color ; c u r c o l o r++){

c o l l i s i o n =0;for ( j =0; j<data [ idx ] . cur e lem ; j++){

int new idx=data [ idx ] . ptr [ j ] ;// p r i n t f ( ” ! ! ! j=%d i d x=%d\n ” , j , new idx ) ;i f ( data [ new idx ] . c o l o r==cu r c o l o r ){

// p r i n t f ( ” c o l l i s i o n inc c o l o r and c o l o r i t i d x=%d wi th=%d c u r c o l o r=%d\n ” , idx ,new idx , c u r c o l o r ) ;

c o l l i s i o n++;break ;

}else {} ;

} ;i f ( ! c o l l i s i o n ){

// p r i n t f ( ”we go t c o l o r=%d f o r i d x=%d\n ” , max co lor , i d x ) ;data [ idx ] . c o l o r=cu r c o l o r ;break ;

} ;} ;i f ( c o l l i s i o n ){

max color++;// p r i n t f ( ” c o l l i s o n c o l o r i n g i t i d x=%d max co lor=%d \n ” , idx , max co lo r ) ;data [ idx ] . c o l o r=max color ;

} ;} ;return max color ;

} ;

void f i l l t emp t a b l e ( struct dyn tab le ∗ table , struct dyn tab le ∗ new table , struct adj ∗data , struct GCS data ∗pck data ){

int i ;a l l o c d yn t a b l e (&pck data−>row info , table−>h , 1 ) ;for ( i =0; i<table−>h ; i++){

int new idx=data [ i ] . c o l o r ;i f ( new idx>=0){

int j ;s e t da t a (&pck data−>row info , 0 , i , new idx ) ;for ( j =0; j<table−>w; j++){

int va l=r t da t a ( table , i , j ) ;i f ( va l )

s e t da t a ( new table , new idx , j , va l ) ;} ;

}else {

s e t da t a (&pck data−>row info , 0 , i ,−1) ;} ;

} ;

Page 75: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

65

} ;

struct adj ∗ g e t c o l d a t a ( struct dyn tab le ∗ table , struct dyn tab le ∗ s o r t ed index ){unsigned int i , j ;struct adj ∗data ;

data=malloc ( s izeof ( struct adj )∗ table−>w) ;i f ( ! data )

abort ( ) ;memset ( data , 0 , s izeof ( struct adj )∗ table−>w) ;a l l o c d yn t a b l e ( so r t ed index , table−>w, 1 ) ;for ( i =0; i<table−>w; i++){

c h e c k ad j d a t a s i z e ( data+i , s izeof ( int )∗ table−>w) ;data [ i ] . c o l o r=−1;s e t da t a ( so r t ed index , 0 , i , i ) ;

} ;

for ( i =0; i<table−>w; i++){for ( j =0; j<i ; j++){// t a b l e−>h

// i f ( i==j )// con t inue ;

i f ( ! row compare ( table , i , j ) ){// p r i n t f ( ” i=%d adding j=%d\n ” , i , j ) ;i f ( ! data [ i ] . max s ize | | data [ i ] . max size<data [ i ] . cur e lem+s izeof ( int ) ){

abort ( ) ;// c h e c k a d j d a t a s i z e ( data+i , da ta [ i ] . max s i z e ∗2) ;

} ;data [ i ] . ptr [ data [ i ] . cur e lem ]= j ;data [ i ] . cur e lem++;data [ i ] . c o l l i s i o n c o u n t++;

data [ j ] . ptr [ data [ j ] . cur e lem ]= i ;data [ j ] . cur e lem++;data [ j ] . c o l l i s i o n c o u n t++;

} ;} ;

} ;

q s o r t ad j ( data , so r t ed index , 0 , table−>w−1) ;/∗ f o r ( i =0; i<t a b l e−>h ; i++){

i n t i d x=r t d a t a ( s o r t e d i n d e x , 0 , i ) ;p r i n t f ( ” data i=%d xa=%d id x=%d\n ” , idx , da ta [ i d x ] . c o l l i s i o n c o u n t , i ) ;

} ; ∗/return data ;

} ;

void f i l l f i n a l t a b l e ( struct dyn tab le ∗ table , struct adj ∗data , struct GCS data ∗pck data){

int i ;a l l o c d yn t a b l e (&pck data−>c o l i n f o , table−>w, 1 ) ;for ( i =0; i<table−>w; i++){

int new idx=data [ i ] . c o l o r ;i f ( new idx>=0){

int j ;s e t da t a (&pck data−>c o l i n f o , 0 , i , new idx ) ;for ( j =0; j<table−>h ; j++){

int va l=r t da t a ( table , j , i ) ;i f ( va l )

s e t da t a (&pck data−>table , j , new idx , va l ) ;} ;

}else{

s e t da t a (&pck data−>row info , 0 , i ,−1) ;} ;

} ;} ;

void add tables GCS ( struct dyn tab le ∗ table , struct GCS data ∗pck data ){struct dyn tab le c o l i n f o ={0};unsigned int i , j ;struct adj ∗ a d j i n f o ;struct dyn tab le temp table ={0};unsigned t emp tab l e l en ;

// a l l o c d y n t a b l e (& row in fo , t a b l e−>h , 1 ) ;a d j i n f o=get row data ( table ,& c o l i n f o ) ;t emp tab l e l en=co l o r r ows ( ad j i n f o ,& c o l i n f o , table−>h) ;a l l o c d yn t a b l e (&temp table , table−>w, t emp tab l e l en+1) ;

Page 76: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

66 Poglavje B: izvorna koda zgoscevanje redke tabele

f i l l t emp t a b l e ( table ,& temp table , ad j i n f o , pck data ) ;f r e e d yn t ab l e (& c o l i n f o ) ;f r e e r ow da ta ( ad j i n f o , table−>h) ;

#i f 0p r i n t f ( ” a f t e r row co l o r i n g \n”) ;p r i n t t a b l e (&temp table ) ;

#endif

a d j i n f o=g e t c o l d a t a (&temp table ,& c o l i n f o ) ;t emp tab l e l en=co l o r r ows ( ad j i n f o ,& c o l i n f o , temp table .w) ;a l l o c d yn t a b l e (&pck data−>table , t emp tab l e l en +1, temp table . h) ;f i l l f i n a l t a b l e (&temp table , ad j i n f o , pck data ) ;

#i f 0p r i n t f ( ” a f t e r column co l o r i n g \n”) ;p r i n t t a b l e (&pck data−>t ab l e ) ;

#endif

f r e e d yn t ab l e (& c o l i n f o ) ;f r e e r ow da ta ( ad j i n f o , temp table .w) ;f r e e d yn t ab l e (&temp table ) ;

} ;

void test GCS data ( struct dyn tab le ∗ table , struct GCS data ∗pck data ){unsigned int i , j ;for ( i =0; i<table−>h ; i++)

for ( j =0; j<table−>w; j++){int va l=r t da t a ( table , i , j ) ;i f ( va l ){// as sigmap

int r idx , c i dx ;int val1 ;r i d x=r t da t a (&pck data−>row info , 0 , i ) ;c i dx=r t da t a (&pck data−>c o l i n f o , 0 , j ) ;va l1=r t da t a (&pck data−>table , r idx , c i dx ) ;i f ( va l1 != va l ){

p r i n t f ( ” r i d x=%d c idx=%d val=%d val1=%d\n” , r idx , c idx , val , va l1 ) ;abort ( ) ;

} ;} ;

} ;} ;

int main ( ) {// i n t t a b l e [WH] [WW] ;// i n t t a b l e d a t a [WH] [ 4 ] ;// i n t r o w l i s t [WH] ;int width=15;int he ight =10;struct dyn tab le t ab l e ={0};struct dyn tab le t ab l e da ta ={0};struct dyn tab le r ow l i s t ={0};

int row count ;int rep ;int e lement count ;

srand ( time (0) ) ;

#ifde f REPORT#define WANTRDS#define WANTRDS1//#d e f i n e WANT GCS//#d e f i n e WANT LES//#d e f i n e WANT RCS

int f d r e p o r t ;

f d r e p o r t=open ( ”repor t . txt ” ,O CREAT|OWRONLY|O TRUNC,S IRWXU) ;

// f o r ( w id th =50; width <=500; w id th+=50)// f o r ( h e i g h t =100; h e i g h t <=500; h e i g h t +=50)width=100;he ight =50;

#ifde f WANTRDS#ifde f WANTRDS1

// wid th =500;// h e i g h t =50;

Page 77: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

67

width=500;he ight =50;

#endifstruct RDS data packed={0};packed . method=1;a l l o c d yn t a b l e (&tab l e data , t ab l e . h , 4 ) ;a l loc data RDS(&packed ,1024) ;reset data RDS(&packed , t ab l e . h) ;

#ifde f WANTRDS1int fd1 , fd2 , fd3 ;char wr i t e s t r [ 2 5 6 ] ;// a l l o c d y n t a b l e (& r ow l i s t , t a b l e . h , 1 ) ;fd1=open ( ”repor t1 . txt ” ,O CREAT|OWRONLY|O TRUNC,S IRWXU) ;fd2=open ( ”repor t2 . txt ” ,O CREAT|OWRONLY|O TRUNC,S IRWXU) ;fd3=open ( ”repor t3 . txt ” ,O CREAT|OWRONLY|O TRUNC,S IRWXU) ;

#endif#endif#i fde f WANTGCS

struct GCS data packed GCS={0};#endif#i fde f WANT LES

struct LES data packed LES={0};a l l o c data LES(&packed LES , he ight ∗ s izeof ( int ) , width∗ s izeof ( int ) ) ;

#endif#i fde f WANTRCS

struct RCS data packed RCS={0};a l loc data RCS(&packed RCS ,1024 , ( he ight+1)∗ s izeof ( int ) ) ;

#endif// a l l o c da t a RDS (&packed ,1024) ;

#ifde f WANTRDS1element count =2500;

#elsefor ( e lement count =10; e lement count <=1000; e lement count+=10)

#endif{

int repeat ;int r e s u l t =0;int min val ;int max val ;// e l emen t coun t=( i n t ) (DGOSTOTA∗( f l o a t ) (WW∗WH) ) ;// p r i n t f ( ”Element count = %d\n ” , e l emen t coun t ) ;

//memset ( packed . d i s p l a c e r ow s , 0 , s i z e o f ( packed . d i s p l a c e r ow s ) ) ;

// f o r ( rep =0; rep <1000; rep++){#ifndef WANTRDS1

for ( repeat =0; repeat <10; repeat++)#endif

{int tmp re su l t ;a l l o c d yn t a b l e (&table , width , he ight ) ;a l l o c d yn t a b l e (&tab l e data , height , 4 ) ;a l l o c d yn t a b l e (& r ow l i s t , height , 1 ) ;f i l l t a b l e (&table , e lement count ) ;

#ifde f WANTRDSreset data RDS(&packed , he ight ) ;check rows(&table ,& tab l e da ta ) ;row count=so r t r ows (&tab l e data ,& r ow l i s t , packed . method ) ;// i f ( h e i g h t ==500)

#ifde f WANTRDS1{

int cnt , cnt1 ;int dada ;int data=0;

do{cnt1=0;for ( cnt=0; cnt<t ab l e . h ; cnt++){

int tmp ;int t ab l e i nd ex=r t da t a (& row l i s t , 0 , cnt ) ;tmp=r t da t a (&tab le data , 0 , t ab l e i nd ex ) ;i f (tmp>data )

cnt1+=tmp ;} ;s p r i n t f ( wr i t e s t r , ”%d %d\n” , data+1, cnt1 ) ; // /( doub l e ) e l emen t coun t ( doub l e )wr i te ( fd1 , wr i t e s t r , s t r l e n ( w r i t e s t r ) ) ;s p r i n t f ( wr i t e s t r , ”{%d,% f } , ” , data , ( double ) cnt1 /(double ) e lement count ) ; //wr i te ( fd3 , wr i t e s t r , s t r l e n ( w r i t e s t r ) ) ;s p r i n t f ( wr i t e s t r , ”{%d,% f } , ” , data , ( double ) e lement count /(double ) ( data+1) ) ;wr i t e ( fd2 , wr i t e s t r , s t r l e n ( w r i t e s t r ) ) ;

Page 78: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

68 Poglavje B: izvorna koda zgoscevanje redke tabele

data++;}while ( cnt1>0) ;

} ;#endif

add tables RDS(&table ,& tab l e data ,& r ow l i s t , row count ,&packed ) ;i f ( che ck tab l e (&table ,&packed ) ){

// check f a i l e dp r i n t f ( ”BUG CHECK FAILED\n”) ;// p r i n t t a b l e (& t a b l e ) ;// pr in t da ta RDS (&packed ) ;// break ;abort ( ) ;

}tmp re su l t=packed . end data ; //−e l emen t coun t

#endif#i fde f WANTGCS

add tables GCS(&table ,&packed GCS ) ;test GCS data(&table ,&packed GCS ) ;

tmp re su l t=packed GCS . tab l e .w∗packed GCS . tab l e . h ; //−e l emen t coun t

free GCS(&packed GCS ) ;#endif#i fde f WANT LES

reset data LES(&packed LES ) ;add tables LES(&table ,&packed LES ) ;te s t LES data (&table ,&packed LES ) ;tmp re su l t=packed LES . new table .w∗packed LES . new table . h ;

#endif#i fde f WANTRCS

reset data RCS(&packed RCS ) ;add tables RCS(&table ,&packed RCS ) ;test RCS data(&table ,&packed RCS ) ;// p r i n t f ( ” reduced s i z e data l en=%d r ow s i z e=%d / t o t a l l e n=%d \n ” , packed RCS .

numbe r o f v a l u e s i n , packed RCS . number o f rows , t a b l e .w∗ t a b l e . h ) ;tmp re su l t=packed RCS . number o f va lue s in∗2+packed RCS . number of rows ;

#endifr e s u l t+=tmp resu l t ;i f ( repeat==0){

min val=max val=tmp resu l t ;}else{

i f ( tmp resu l t<min val )min val=tmp resu l t ;

i f ( tmp resu l t>max val )max val=tmp resu l t ;

} ;// p r i n t f ( ” packed . end da ta=%d\n ” , packed . end da ta ) ;

} ;p r i n t f ( ”avg=%f min val=%d maxval=%d element count=%d\n” , ( f loat ) r e s u l t /( f loat ) repeat ,

min val , max val , e lement count ) ;// } ;// s p r i n t f ( w r i t e s t r ,”{%d,%d,% f } , ” , width , h e i g h t , ( doub l e ) r e s u l t /5 . 0 ) ;// s p r i n t f ( w r i t e s t r ,”{%d,%d,%d } , ” , width , h e i g h t , r e s u l t ) ;// s p r i n t f ( w r i t e s t r ,”{%d,%d } , ” , width , r e s u l t ) ;s p r i n t f ( wr i t e s t r , ”%d %f %d %d\n” , e lement count , ( f loat ) r e s u l t /( f loat ) repeat , min val ,

max val ) ;wr i t e ( f d r epo r t , wr i t e s t r , s t r l e n ( w r i t e s t r ) ) ;f r e e d yn t a b l e (& tab l e ) ;f r e e d yn t a b l e (& tab l e da ta ) ;f r e e d yn t a b l e (& r ow l i s t ) ;

} ;#else

// e l emen t coun t=( i n t ) (DGOSTOTA∗( f l o a t ) ( w id th ∗WH) ) ;#define WANTRDS//#d e f i n e WANT RDS1#define WANT LES#define WANTGCS#define WANTRCS

width=5;he ight =5;e lement count=5;p r i n t f ( ”Element count = %d\n” , e lement count ) ;

//memset ( packed . d i s p l a c e r ow s , 0 , s i z e o f ( packed . d i s p l a c e r ow s ) ) ;

// f o r ( rep =0; rep <1000; rep++){

Page 79: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

69

#i f 1// l o a d d a t a f r om f i l e ( ” t a b l e . t 1 ”,& t a b l e ) ;l o a d d a t a f r om f i l e ( ”pasca l . t1 ”,& tab l e ) ;p r i n t f ( ” tab l e .w=%d tab l e . h=%d t o t a l s i z e=%d\n” , t ab l e .w, t ab l e . h , t ab l e .w∗ t ab l e . h) ;

#i f 0struct dyn tab le d e f v a l ={0};p r i n t f ( ”Removed va lues=%d\n” , g e t r emove de f au l t s (&table ,& d e f v a l ) ) ;// p r i n t t a b l e (& t a b l e ) ;

#endif#else

a l l o c d yn t a b l e (&table , width , he ight ) ;f i l l t a b l e (&table , e lement count ) ;

#endif#i fde f WANTRDS

struct RDS data packed={0};packed . method=0;a l l o c d yn t a b l e (&tab l e data , t ab l e . h , 4 ) ;a l l o c d yn t a b l e (& r ow l i s t , t ab l e . h , 1 ) ;a l loc data RDS(&packed ,1024) ;reset data RDS(&packed , t ab l e . h) ;

check rows(&table ,& tab l e da ta ) ;row count=so r t r ows (&tab l e data ,& r ow l i s t , packed . method ) ;

add tables RDS(&table ,& tab l e data ,& r ow l i s t , row count ,&packed ) ;i f ( che ck tab l e (&table ,&packed ) ){

// check f a i l e dp r i n t f ( ”BUG CHECK FAILED\n”) ;p r i n t t a b l e (& tab l e ) ;print data RDS(&packed ) ;// break ;abort ( ) ;

}else {

#ifde f REPORTsp r i n t f ( wr i t e s t r , ”%d , ” , packed . end data ) ;wr i t e ( f d r epo r t , wr i t e s t r , s t r l e n ( w r i t e s t r ) ) ;

#endif} ;// pr in t da ta RDS (&packed ) ;p r i n t f ( ”RDS1 reduced s i z e data l en=%d t o t a l l en=%d \n” , packed . end data∗2+packed .

d i sp l a c e r ows .w, tab l e .w∗ t ab l e . h) ;p r i n t f ( ”RDS1 t o t a l d a t a l=%d che ck l=%d d i s p l a c e=%d\n” , packed . end data , packed . end data ,

packed . d i s p l a c e r ows .w) ;packed . method=1;reset data RDS(&packed , t ab l e . h) ;check rows(&table ,& tab l e da ta ) ;row count=so r t r ows (&tab l e data ,& r ow l i s t , packed . method ) ;

add tables RDS(&table ,& tab l e data ,& r ow l i s t , row count ,&packed ) ;i f ( che ck tab l e (&table ,&packed ) ){

// check f a i l e dp r i n t f ( ”BUG CHECK FAILED\n”) ;p r i n t t a b l e (& tab l e ) ;print data RDS(&packed ) ;// break ;abort ( ) ;

}p r i n t f ( ”RDS2 reduced s i z e data l en=%d t o t a l l en=%d \n” , packed . end data∗2+packed .

d i sp l a c e r ows .w, tab l e .w∗ t ab l e . h) ;p r i n t f ( ”RDS2 t o t a l d a t a l=%d che ck l=%d d i s p l a c e=%d\n” , packed . end data , packed . end data ,

packed . d i s p l a c e r ows .w) ;#endif#i f 0

p r i n t t a b l e (& tab l e ) ;#endif

// } ;

#ifde f WANTRCSstruct RCS data packed RCS={0};a l loc data RCS(&packed RCS ,1024 , ( t ab l e . h+1)∗ s izeof ( int ) ) ;

#i f 0struct dyn tab le d e f v a l ={0};p r i n t f ( ”RCS Removed va lues=%d\n” , g e t r emove de f au l t s (&table ,& d e f v a l ) ) ;// p r i n t t a b l e (& t a b l e ) ;

#endifadd tables RCS(&table ,&packed RCS ) ;test RCS data(&table ,&packed RCS ) ;

Page 80: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

70 Poglavje B: izvorna koda zgoscevanje redke tabele

p r i n t f ( ”RCS reduced s i z e data l en=%d / t o t a l l en=%d \n” , packed RCS . number o f va lue s in∗2+packed RCS . number of rows , t ab l e .w∗ t ab l e . h) ;

p r i n t f ( ”RCS v a l u e s l=%d che ck l=%d rows l=%d\n” , packed RCS . number o f va lue s in ,packed RCS . number o f va lue s in , packed RCS . number of rows ) ;

#endif

// p r i n t f ( ” f u l l matr ix l e n %d,%d=%d d a t a s i z e=%d\n ” ,WW,WH,WH∗WW,WH∗WW∗ s i z e o f ( i n t ) ) ;

#ifde f WANT LESstruct LES data packed LES={0};a l l o c data LES(&packed LES , tab l e . h∗ s izeof ( int ) , t ab l e .w∗ s izeof ( int ) ) ;add tables LES(&table ,&packed LES ) ;te s t LES data (&table ,&packed LES ) ;int l e s r ow s i z e =(packed LES . r s i z e / s izeof ( int ) ) ;int l e s c o l s i z e =(packed LES . c s i z e / s izeof ( int ) ) ;p r i n t f ( ”LES reduced s i z e data l en=%d\n” , l e s r ow s i z e ∗2+ l e s c o l s i z e ∗2+packed LES .

new table .w∗packed LES . new table . h) ;p r i n t f ( ”LES row data=%d c o l s i z e=%d newtable w=%d newtable h=%d\n” , l e s r ow s i z e ,

l e s c o l s i z e , packed LES . new table .w, packed LES . new table . h) ;#endif

#i fde f WANTGCSstruct GCS data packed GCS={0};// a l l o c da t a GCS (&packed GCS , t a b l e . h∗ s i z e o f ( i n t ) , t a b l e .w∗ s i z e o f ( i n t ) ) ;add tables GCS(&table ,&packed GCS ) ;test GCS data(&table ,&packed GCS ) ;int g c s d a t a s i z e=packed GCS . c o l i n f o .w+packed GCS . row in fo .w;int g c s b i t f i e l d =(( tab l e .w∗ t ab l e . h) /( s izeof ( int ) ∗8) ) ;int gc s new data l en=packed GCS . tab l e .w∗packed GCS . tab l e . h ;p r i n t f ( ”GCS reduced s i z e data l en=%d,%d,%d b i t f=%d new tab l e l en=%d,%d,%d \n” , packed GCS

. c o l i n f o .w, packed GCS . row in fo .w, g c s d a t a s i z e , g c s b i t f i e l d , packed GCS . tab l e .w,packed GCS . tab l e . h , g c s new data l en ) ;

p r i n t f ( ”GCS TOTAL=%d\n” , g c s d a t a s i z e+g c s b i t f i e l d+gc s new data l en ) ;free GCS(&packed GCS ) ;

#endif

#endif

f r e e d yn t ab l e (& tab l e ) ;f r e e d yn t ab l e (& tab l e da ta ) ;f r e e d yn t ab l e (& r ow l i s t ) ;return 0 ;

} ;

Page 81: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Dodatek C

izvorna koda analize in uporabeBison tabele

#include <s t d i o . h>#include <s t d l i b . h>#include <s t r i n g . h>

#i f de f ined ( STDC ) | | de f ined ( c p l u s p l u s )typedef signed char yys igned char ;

#elsetypedef short int yys igned char ;

#endif

#i fde f YYTYPE UINT8typedef YYTYPE UINT8 yytype u int8 ;#elsetypedef unsigned char yytype u int8 ;#endif#i fde f YYTYPE INT8typedef YYTYPE INT8 yytype in t8 ;#e l i f ( de f ined STDC | | de f ined C99 FUNC \

| | de f ined c p l u s p l u s | | de f ined MSC VER)typedef signed char yytype in t8 ;#elsetypedef short int yytype in t8 ;#endif

#define YYDEBUG 1

/∗ YYFINAL −− S t a t e number o f t h e t e rm ina t i on s t a t e . ∗/#define YYFINAL 7/∗ YYLAST −− Last index in YYTABLE. ∗/#define YYLAST 11

/∗ YYNTOKENS −− Number o f t e rm ina l s . ∗/#define YYNTOKENS 8/∗ YYNNTS −− Number o f non te rmina l s . ∗/#define YYNNTS 4/∗ YYNRULES −− Number o f r u l e s . ∗/#define YYNRULES 7/∗ YYNRULES −− Number o f s t a t e s . ∗/#define YYNSTATES 13

#i f YYDEBUG | | YYERRORVERBOSE | | YYTOKENTABLE/∗ YYTNAME[SYMBOL−NUM] −− S t r i n g name o f t h e symbol SYMBOL−NUM.

F i r s t , t h e t e rmina l s , then , s t a r t i n g a t YYNTOKENS, non te rmina l s . ∗/stat ic const char ∗const yytname [ ] ={

”$end ” , ” e r r o r ” , ”$undef ined ” , ” id ” , ” ’+ ’ ” , ” ’∗ ’ ” , ” ’ ( ’ ” , ” ’ ) ’ ” ,”$accept ” , ”exp ” , ”term ” , ” f a c t o r ” , 0

} ;#endif

71

Page 82: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

72 Poglavje C: izvorna koda analize in uporabe Bison tabele

/∗ YYDEFACT[STATE−NAME] −− De f au l t r u l e to reduce w i th in s t a t eSTATE−NUM when YYTABLE doesn ’ t s p e c i f y someth ing e l s e to do . Zeromeans t h e d e f a u l t i s an e r r o r . ∗/

/∗ YYR1[YYN] −− Symbol number o f symbol t h a t r u l e YYN d e r i v e s . ∗/stat ic const yytype u int8 yyr1 [ ] ={

0 , 8 , 9 , 9 , 10 , 10 , 11 , 11} ;

/∗ YYR2[YYN] −− Number o f symbo l s composing r i g h t hand s i d e o f r u l e YYN. ∗/stat ic const yytype u int8 yyr2 [ ] ={

0 , 2 , 3 , 1 , 3 , 1 , 3 , 1} ;

stat ic const yytype u int8 yyde fact [ ] ={

0 , 7 , 0 , 0 , 3 , 5 , 0 , 1 , 0 , 0 ,6 , 2 , 4

} ;

/∗ YYDEFGOTO[NTERM−NUM] . ∗/stat ic const yytype in t8 yydefgoto [ ] ={

−1, 3 , 4 , 5} ;

/∗ YYPACT[STATE−NUM] −− Index in YYTABLE o f t h e po r t i on d e s c r i b i n gSTATE−NUM. ∗/

#define YYPACT NINF −5stat ic const yytype in t8 yypact [ ] ={

−1, −5, −1, 0 , −4, −5, 2 , −5, −1, −1,−5, −4, −5

} ;

/∗ YYPGOTO[NTERM−NUM] . ∗/stat ic const yytype in t8 yypgoto [ ] ={

−5, 1 , 3 , −2} ;

/∗ YYTABLE[YYPACT[STATE−NUM] ] . What to do in s t a t e STATE−NUM. I fp o s i t i v e , s h i f t t h a t token . I f n e ga t i v e , reduce t h e r u l e whichnumber i s t h e o p p o s i t e . I f zero , do what YYDEFACT says .I f YYTABLE NINF, syn tax e r r o r . ∗/

#define YYTABLE NINF −1stat ic const yytype u int8 yytable [ ] ={

7 , 9 , 1 , 6 , 8 , 2 , 8 , 12 , 0 , 10 ,0 , 11

} ;

stat ic const yytype in t8 yycheck [ ] ={

0 , 5 , 3 , 2 , 4 , 6 , 4 , 9 , −1, 7 ,−1, 8

} ;

struct dyn tab le {int w;int h ;int ∗data ;

} ;

int r t da t a ( struct dyn tab le ∗ tbl , int y , int x ){i f (y>=tbl−>h | | y<0) abort ( ) ;i f (x>=tbl−>w | | x<0) abort ( ) ;return tbl−>data [ ( tbl−>w∗y )+x ] ;

} ;

int s e t da t a ( struct dyn tab le ∗ tbl , int y , int x , int va l ){i f (y>=tbl−>h | | y<0) abort ( ) ;i f (x>=tbl−>w | | x<0) abort ( ) ;tb l−>data [ ( tbl−>w∗y )+x]= val ;return 0 ;

} ;

void f r e e d yn t a b l e ( struct dyn tab le ∗ tb l ){

Page 83: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

73

i f ( tbl−>data )f r e e ( tbl−>data ) ;

tbl−>data=NULL;tbl−>w=tbl−>h=0;

} ;

int a l l o c d yn t a b l e ( struct dyn tab le ∗ tbl , int w, int h){f r e e d yn t a b l e ( tb l ) ;tb l−>data=malloc ( s izeof ( int )∗w∗h) ;memset ( tbl−>data , 0 , s izeof ( int )∗w∗h) ;tbl−>w=w;tbl−>h=h ;

} ;

int s e t dyn t ab l e ( struct dyn tab le ∗ tb l ){memset ( tbl−>data , 0 xfe , s izeof ( int )∗ tbl−>w∗ tbl−>h) ;

} ;

void main ( ) {int sym , s t a t e ;for ( s t a t e =0; s tate<YYNTOKENS; s t a t e++)

p r i n t f ( ”%s ” , yytname [ s t a t e ] ) ;p r i n t f ( ”\n”) ;for ( s t a t e =0; s tate<YYNSTATES; s t a t e++){

p r i n t f ( ” s t a t e %2d ” , s t a t e ) ;for (sym=0;sym<YYNTOKENS; sym++){

i f ( yypact [ s t a t e ]==YYPACT NINF){i f ( yyde fact [ s t a t e ]==0)p r i n t f ( ” e ”) ;elsep r i n t f ( ” r ”) ;

}else {

int yyn ;yyn=yypact [ s t a t e ]+sym ;i f ( yyn < 0 | | YYLAST < yyn | | yycheck [ yyn ] != sym){

i f ( yyde fact [ s t a t e ]==0)p r i n t f ( ” E ”) ;elsep r i n t f ( ” D ”) ;

}else{

p r i n t f ( ”%2d ” , yytable [ yyn ] ) ;} ;

} ;} ;p r i n t f ( ”\n”) ;

} ;

for ( s t a t e=YYNTOKENS; state<YYNTOKENS+YYNNTS; s t a t e++)p r i n t f ( ”%d %s ” , s tate , yytname [ s t a t e ] ) ;

p r i n t f ( ”\n”) ;

for ( s t a t e =0; s tate<YYNSTATES; s t a t e++){p r i n t f ( ” s t a t e %2d ” , s t a t e ) ;for (sym=0;sym<YYNNTS; sym++){

int yystate ;yys tate=yypgoto [ sym]+ s t a t e ;i f (0 <= yystate && yystate <= YYLAST && yycheck [ yystate ] == s ta t e ){

p r i n t f ( ”%2d ” , yytab le [ yys tate ] ) ;}else {

p r i n t f ( ”%2d ” , yydefgoto [ sym ] ) ;} ;

} ;p r i n t f ( ”\n”) ;

} ;

{//LR PARSER BEGINstruct dyn tab le input={0};struct dyn tab le s tack ={0};int s t a c k s i z e ;int e r r o r =0;int ccc=0;int c u r r s t a t e ;int cu r r i npu t =0;a l l o c d yn t a b l e (&input , 4 , 1 ) ;a l l o c d yn t a b l e (&stack , 256 , 1 ) ;s e t da t a (&input , 0 , 0 , 3 ) ; // i d

Page 84: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

74 Poglavje C: izvorna koda analize in uporabe Bison tabele

s e t da t a (&input , 0 , 1 , 5 ) ; //∗s e t da t a (&input , 0 , 2 , 3 ) ; // i ds e t da t a (&input , 0 , 3 , 0 ) ; //+

s e t da t a (&stack , 0 , 0 , 0 ) ;s t a c k s i z e =1;// s t a r t indexwhile ( ! e r r o r&&s t a c k s i z e >0&&ccc <15){

ccc++;int ac t i on=−1;

c u r r s t a t e=r t da t a (&stack , 0 , s t a c k s i z e −1) ;{

int i ;p r i n t f ( ”stack s i z e=%d ( ” , s t a c k s i z e ) ;for ( i =0; i<s t a c k s i z e ; i++)

p r i n t f ( ”%d ” , r t da t a (&stack , 0 , i ) ) ;p r i n t f ( ”)\n”) ;

} ;p r i n t f ( ” c u r r s t a t e=%d\n” , c u r r s t a t e ) ;

int rule num=0;i f ( yypact [ c u r r s t a t e ]==YYPACT NINF){

ac t i on =3;p r i n t f ( ”YYPACT NINF de f au l t ac t i on yypact [ c u r r s t a t e ]=%d YYPACT NINF=%d\n” , yypact [

c u r r s t a t e ] ,YYPACT NINF) ;// d e f a u l t a c t i on

}else{

int yyn ;int next input ;i f ( cur r input<input .w){

next input=r t da t a (&input , 0 , cu r r i npu t ) ;}else {

p r i n t f ( ”no input cu r r i np=%d w=%d\n” , cur r input , input .w) ;i f ( s t a c k s i z e >=1)

s t a c k s i z e −=1;}

yyn=yypact [ c u r r s t a t e ]+ next input ;i f ( yyn < 0 | | YYLAST < yyn | | yycheck [ yyn ] != next input ){

ac t i on =3;// d e f a u l t a c t i on}else {

i f ( yytab le [ yyn]<=0){int value=yytable [ yyn ] ;i f ( value == 0 | | value == YYTABLE NINF){

p r i n t f ( ”got e r r o r \n”) ;e r r o r =1;break ;

} ;p r i n t f ( ”reduce ac t i on value=%d\n”,−value ) ;rule num=−value ;ac t i on =2;

} else {ac t i on =1;// s h i f trule num=yytable [ yyn ] ;

} ;} ;

} ;

i f ( ac t i on==3){rule num=yydefact [ c u r r s t a t e ] ;a c t i on =2;

} ;

i f ( ac t i on==1){p r i n t f ( ” s h i f t to s t a t e %2d\n” , rule num ) ;i f ( rule num==YYFINAL){

p r i n t f ( ” input accepted\n”) ;break ;

} ;s e t da t a (&stack , 0 , s t a c k s i z e++,rule num ) ; // s t a t e

cu r r i npu t++;} elsei f ( ac t i on==2){

p r i n t f ( ”reduce by ru l e %d\n” , rule num ) ;s t a c k s i z e−=yyr2 [ rule num ] ;int o l d s t a t e=r t da t a (&stack , 0 , s t a c k s i z e −1) ;

Page 85: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

75

int sym ;int sym f ix ;

sym=yyr1 [ rule num ] ;sym f ix=sym−YYNTOKENS;i f (sym<YYNTOKENS){

p r i n t f ( ” e r r \n”) ;break ;

} ;int yystate=yypgoto [ sym f ix ]+ o l d s t a t e ;p r i n t f ( ”REDUCE BY sym=%d sym f ix=%d yystate=%d o l d s t a t e=%d yycheck [ yystate ]=%d\n”

,sym , sym fix , yystate , o l d s t a t e , yycheck [ yys tate ] ) ;i f (0 <= yystate && yystate <= YYLAST && yycheck [ yystate ] == o l d s t a t e ){

p r i n t f ( ”1−%2d\n” , yytab le [ yys tate ] ) ;s e t da t a (&stack , 0 , s t a c k s i z e++,yytable [ yys tate ] ) ; // s t a t e// s e t d a t a (& s tack , 0 , s t a c k s i z e ++,yyr1 [ ru le num ] ) ;// symbol v a l u e

}else{

p r i n t f ( ”2−%2d\n” , yydefgoto [ sym f ix ] ) ;// i f ( y y d e f g o t o [ s ym f i x ] ) {s e t da t a (&stack , 0 , s t a c k s i z e++,yydefgoto [ sym f ix ] ) ; // s t a t e

// s e t d a t a (& s tack , 0 , s t a c k s i z e ++,yyr1 [ ru le num ] ) ;// symbol v a l u e//}// e l s e {// p r i n t f ( ”WHATT\n ”) ;// a bo r t ( ) ;// s e t d a t a (& s tack , 0 , s t a c k s i z e −1, yyr1 [ ru le num ] ) ;// s ym f i x// } ;

} ;

}// e l s e// i f ( a c t i on==3){// // d e f a u l t a c t i on// p r i n t f ( ” d e f a u l t a c t i on \n ”) ;// i f ( y y d e f a c t [ c u r r s t a t e ]==0){// p r i n t f ( ” e r r o r \n ”) ;// e r r o r =1;// }// e l s e {

// } ;// } ;

} ;

} ;} ;

Page 86: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

Dodatek D

izvorna koda uporabe patenta

#include <s t d i o . h>#include <s t d l i b . h>#include <s t r i n g . h>

#ifde f REPORT#include < f c n t l . h>#include <sys / s t a t . h>#endif

int width=15;int he ight =10;//#d e f i n e WW 15//#d e f i n e WH 10#define DGOSTOTA 0.1#define WW width#define WH height

struct dyn tab le {int w;int h ;int ∗data ;

} ;

struct packed data{// i n t d i s p l a c e r ow s [WH] ;struct dyn tab le d i sp l a c e r ows ;int ∗data ;int ∗ check data ;int da ta l en ;int end data ;int end check ;

} ;

struct LR par s e r s t a t e {// i n t c u r r s t a t e ;int cu r r i npu t ;int c u r r t a b l e ; // term t a b l e or nonterm// i n t s t a r t i n d e x ;struct dyn tab le s tack ;int s t a c k s i z e ;

} ;

int match row ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data , struct dyn tab le ∗r ow l i s t , int srow , int crow ) ;

int r t da t a ( struct dyn tab le ∗ tbl , int y , int x ){i f (y>=tbl−>h | | y<0) abort ( ) ;i f (x>=tbl−>w | | x<0) abort ( ) ;return tbl−>data [ ( tbl−>w∗y )+x ] ;

} ;

int s e t da t a ( struct dyn tab le ∗ tbl , int y , int x , int va l ){i f (y>=tbl−>h | | y<0) abort ( ) ;i f (x>=tbl−>w | | x<0) abort ( ) ;

76

Page 87: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

77

tbl−>data [ ( tbl−>w∗y )+x]= val ;return 0 ;

} ;

void f r e e d yn t a b l e ( struct dyn tab le ∗ tb l ){i f ( tbl−>data )

f r e e ( tbl−>data ) ;tbl−>data=NULL;tbl−>w=tbl−>h=0;

} ;

int a l l o c d yn t a b l e ( struct dyn tab le ∗ tbl , int w, int h){f r e e d yn t a b l e ( tb l ) ;tb l−>data=malloc ( s izeof ( int )∗w∗h) ;memset ( tbl−>data , 0 , s izeof ( int )∗w∗h) ;tbl−>w=w;tbl−>h=h ;

} ;

int s e t dyn t ab l e ( struct dyn tab le ∗ tb l ){memset ( tbl−>data , 0 xfe , s izeof ( int )∗ tbl−>w∗ tbl−>h) ;

} ;

void pr i n t da ta ( struct packed data ∗pck data ) ;

void a l l o c d a t a ( struct packed data ∗pck , int s i z e ){i f ( ! pck ) return ;int o l d d a t a s i z e=pck−>data l en ;i f ( pck−>data ){

pck−>data=r e a l l o c ( pck−>data , s i z e ) ;memset ( ( ( char ∗) pck−>data )+o l d da t a s i z e , 0 , s i z e−o l d d a t a s i z e ) ;

} else {pck−>data=malloc ( s i z e ) ;memset ( pck−>data , 0 , s i z e ) ;

} ;i f ( pck−>check data ){

pck−>check data=r e a l l o c ( pck−>check data , s i z e ) ;memset ( ( ( char ∗) pck−>check data )+o l d da t a s i z e , 0 xfe , s i z e−o l d d a t a s i z e ) ;

} else {pck−>check data=malloc ( s i z e ) ;memset ( pck−>check data , 0 xfe , s i z e ) ;

} ;pck−>da ta l en=s i z e ;

} ;

void r e s e t d a t a ( struct packed data ∗pck data ){i f ( pck data−>data ){

bzero ( pck data−>data , pck data−>da ta l en ) ;} ;i f ( pck data−>check data ){

// b z e ro ( pck da ta−>check da ta , pck da ta−>d a t a l e n ) ;memset ( pck data−>check data , 0 xfe , pck data−>da ta l en ) ;

} ;// b z e ro ( pck da ta−>d i s p l a c e r ow s , s i z e o f ( pck da ta−>d i s p l a c e r ow s ) ) ;a l l o c d yn t a b l e (&pck data−>d i sp lace rows ,WH, 1 ) ;s e t dyn t ab l e (&pck data−>d i sp l a c e r ows ) ;pck data−>end data=0;pck data−>end check=0;

} ;

void p r i n t t a b l e ( struct dyn tab le ∗ t ab l e ){int i , j ;for ( i =0; i<table−>h ; i++){

for ( j =0; j<table−>w; j++){

p r i n t f ( ”%2d ” , r t da t a ( table , i , j ) ) ;}p r i n t f ( ”\n”) ;

}} ;

void f i l l t a b l e ( struct dyn tab le ∗ table , int ∗ temp table , int count ){// i n t count ;int c ;for ( c=0;c<count ; c++){

// p r i n t f ( ”a=%d b=%d c=%d\n ” , c/ t a b l e−>w, c%t a b l e−>w, t emp t a b l e [ c ] ) ;s e t da t a ( table , c/ table−>w, c%table−>w, temp table [ c ] ) ;

} ;

Page 88: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

78 Poglavje D: izvorna koda uporabe patenta

// } ;} ;

void check rows ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data ){// [WH] [ 4 ]int col , row ;int s ta r t , end , count ;for ( row=0;row<table−>h ; row++){

end=s t a r t=−1;count=0;for ( c o l =0; co l<table−>w; co l++){

i f ( r t da t a ( table , row , c o l ) !=0){// p r i n t f (”%d,%d\n ” , row , c o l ) ;i f ( s ta r t <0){

s t a r t=co l ;end=s t a r t +1;

}else {

end=co l +1;} ;count++;

} ;} ;s e t da t a ( rows data , 0 , row , count ) ;s e t da t a ( rows data , 1 , row , end−s t a r t ) ;s e t da t a ( rows data , 2 , row , s t a r t ) ;s e t da t a ( rows data , 3 , row , end ) ;// p r i n t f ( ” s e t t i n g row da ta=%d c=%d t a l=%d s t a r t=%d end=%d\n ” , row , count , end−s t a r t , s t a r t

, end ) ;} ;

} ;

void check columns ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data , struct dyn tab le∗ column data ){// , s t r u c t d y n t a b l e ∗ r o w l i s t

int i i , co l , row ;int count ;struct dyn tab le temp table ={0};int matches count=0;

a l l o c d yn t a b l e ( column data , table−>w, 2 ) ;a l l o c d yn t a b l e (&temp table , table−>w, 2 ) ;

for ( c o l =0; co l<table−>h ; c o l++)// f o r ( i i =0; i i <t a b l e−>h ; i i ++){

for ( row=0;row<table−>h ; row++)i f ( row!= co l ){

int matched=0;int k ;for ( k=0;k<matches count ; k++){

int tmpval=r t da t a (&temp table , 0 , k ) ;i f ( tmpval==co l | | row==tmpval )

matched++;} ;

i f ( ! matched&&match row ( table , rows data ,NULL, col , row ) ){// p r i n t f ( ” found match row=%d co l=%d\n ” , row , c o l ) ;s e t da t a (&temp table , 0 , matches count , row ) ;s e t da t a (&temp table , 0 , matches count , c o l ) ;matches count++;

} ;} ;

} ;

for ( c o l =0; co l<table−>w; co l++){int k ;int f i r s t h =−1;count=0;//match f o r r e p ea tfor ( row=0;row<table−>h ; row++)// f o r ( i i =0; i i <t a b l e−>h ; i i ++){

int found=0;// row=r t d a t a ( r o w l i s t , 0 , i i ) ;// p r i n t f ( ”row=%d i i=%d\n ” , row , i i ) ;

i f ( row<0) continue ;for ( k=0;k<matches count ; k++){

int tmpval=r t da t a (&temp table , 0 , k ) ;int tmpval1=r t da t a (&temp table , 1 , k ) ;

Page 89: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

79

i f ( row==tmpval ){// p r i n t f ( ”MATCH found match tmpva l=%d row=%d co l=%d\n ” , tmpva l +1,row+1, c o l +1) ;found++;

} ;} ;i f ( ! found&&rt da ta ( table , row , co l ) !=0){

// p r i n t f (”%d,%d count=%d\n ” , row , co l , count ) ;// i f ( f i r s t h <0)

f i r s t h=row ;// f i r s t h=i i ;

count++;} ;

} ;s e t da t a ( column data , 0 , co l , count ) ;s e t da t a ( column data , 1 , co l , f i r s t h ) ;// p r i n t f ( ” c l \n ” , row , s t a r t , end , count ) ;

} ;

f r e e d yn t a b l e (&temp table ) ;

} ;

void g e t t e rm i n a l d e f a u l t s ( struct dyn tab le ∗ table , struct dyn tab le ∗ d e f a u l t r e du c t i o n s ){

int k , i , j ;struct dyn tab le temp table ={0};int count=0;

a l l o c d yn t a b l e (&temp table , table−>w, 2 ) ;

for ( k=0;k<table−>h ; k++){int cn t =0;

for ( i =0; i<table−>w; i++){s e t da t a (&temp table , 0 , i , 0 ) ;s e t da t a (&temp table , 1 , i , 0 ) ;

} ;

for ( i =0; i<table−>w; i++){int cu r r educ t i on=r t da t a ( table , k , i ) ;i f ( cur r educt ion <0){

int index=−1;

for ( j =0; j< cn t ; j++){int tmp val=r t da t a (&temp table , 0 , j ) ;i f ( tmp val <0){

i f ( tmp val==cur r educ t i on ){index=j ;s e t da t a (&temp table , 1 , j , r t da t a (&temp table , 1 , j )+1) ;break ;

} ;} ;

} ;i f ( index <0){

index= cnt ;s e t da t a (&temp table , 0 , j , cu r r educ t i on ) ;s e t da t a (&temp table , 1 , j , r t da t a (&temp table , 1 , j )+1) ;cn t++;

} ;} ;

} ;

int idx max=0;int max val=r t da t a (&temp table , 1 , 0 ) ;

for ( i =1; i< cn t ; i++){i f ( max val<r t da t a (&temp table , 1 , i ) ){

idx max=i ;max val=r t da t a (&temp table , 1 , i ) ;

} ;} ;s e t da t a ( d e f au l t r educ t i on s , 0 , k , r t da t a (&temp table , 0 , idx max ) ) ;

// p r i n t f ( ” v r s t i c a k=%d max va l=%d v a l=%d\n ” , k , r t d a t a (& t emp ta b l e , 1 , idx max ) , r t d a t a (&t emp ta b l e , 0 , idx max ) ) ;

} ;

// remove d e f a u l t r e d u c t i o n s fromd datafor ( k=0;k<table−>h ; k++){

Page 90: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

80 Poglavje D: izvorna koda uporabe patenta

int de f r educ t i on=r t da t a ( d e f au l t r educ t i on s , 0 , k ) ;for ( i =0; i<table−>w; i++){

i f ( r t da t a ( table , k , i )==de f r educ t i on ){s e t da t a ( table , k , i , 0 ) ;

} ;} ;

} ;f r e e d yn t ab l e (&temp table ) ;

} ;

void g e t n on t e rm i n a l d e f a u l t s ( struct dyn tab le ∗ table , struct dyn tab le ∗d e f a u l t r e du c t i o n s ){

int k , i , j ;struct dyn tab le temp table ={0};int count=0;

a l l o c d yn t a b l e (&temp table , table−>h , 2 ) ;

for ( k=0;k<table−>w; k++){int cn t =0;

for ( i =0; i<table−>h ; i++){s e t da t a (&temp table , 0 , i , 0 ) ;s e t da t a (&temp table , 1 , i , 0 ) ;

} ;

for ( i =0; i<table−>h ; i++){int cu r a c t i on=r t da t a ( table , i , k ) ;i f ( cu r a c t i on !=0){

int index=−1;

for ( j =0; j< cn t ; j++){int tmp val=r t da t a (&temp table , 0 , j ) ;i f ( tmp val==cu r a c t i on ){

int va l=r t da t a (&temp table , 1 , j ) ;index=j ;s e t da t a (&temp table , 1 , j , va l+1) ; // bug+1break ;

} ;} ;i f ( index <0){

int va l=r t da t a (&temp table , 1 , j ) ;index= cnt ;s e t da t a (&temp table , 0 , j , c u r a c t i on ) ;s e t da t a (&temp table , 1 , j , va l+1) ;cn t++;

} ;} ;

} ;

// f o r ( i =0; i< c n t ; i++){// p r i n t f ( ” i=%d va l 1=%d va l 2=%d\n ” , i , r t d a t a (& t emp ta b l e , 0 , i ) , r t d a t a (& t emp ta b l e , 1 , i

) ) ;// } ;

int idx max=0;int max val=r t da t a (&temp table , 1 , 0 ) ;

for ( i =1; i< cn t ; i++){i f ( max val<r t da t a (&temp table , 1 , i ) ){

idx max=i ;max val=r t da t a (&temp table , 1 , i ) ;

} ;} ;s e t da t a ( d e f au l t r educ t i on s , 0 , k , r t da t a (&temp table , 0 , idx max ) ) ;

// p r i n t f ( ” v r s t i c a k=%d max va l=%d v a l=%d cn t=%d\n ” , k , r t d a t a (& t emp ta b l e , 1 , idx max ) ,r t d a t a (& t emp ta b l e , 0 , idx max ) , c n t ) ;

} ;

// remove d e f a u l t r e d u c t i o n s fromd datafor ( k=0;k<table−>w; k++){

int d e f a c t i o n=r t da t a ( d e f au l t r educ t i on s , 0 , k ) ;for ( i =0; i<table−>h ; i++){

i f ( r t da t a ( table , i , k )==de f a c t i o n ){s e t da t a ( table , i , k , 0 ) ;

} ;} ;

} ;f r e e d yn t ab l e (&temp table ) ;

Page 91: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

81

} ;

void g row te rm ina l t ab l e ( struct dyn tab le ∗ table , struct dyn tab le ∗ de f au l t r educ t i on s ,int r u l e s c oun t ){

struct dyn tab le temp table ={0};

int i , j ;int old w=table−>w;int o ld h=table−>h ;a l l o c d yn t a b l e (&temp table , table−>w, table−>h) ;memcpy( temp table . data , table−>data , s izeof ( int )∗ table−>w∗ table−>h) ;

f r e e d yn t a b l e ( t ab l e ) ;a l l o c d yn t a b l e ( table , old w+1, o ld h ) ;

for ( i =0; i<table−>h ; i++){int de f r ed=r t da t a ( d e f au l t r educ t i on s , 0 , i ) ;i f ( de f r ed <0){

s e t da t a ( table , i , 0 , d e f r e d ) ;}else{

s e t da t a ( table , i , 0 , r u l e s c oun t+2) ; // t h i s i s s p e c i a l s t a t u s e r r o r} ;

} ;

for ( i =0; i<old w ; i++)for ( j =0; j<o ld h ; j++){

s e t da t a ( table , j , i +1, r t da t a (&temp table , j , i ) ) ;} ;

f r e e d yn t a b l e (&temp table ) ;} ;

void r e o r d e r f i e l d s ( struct dyn tab le ∗ table , struct dyn tab le ∗ column data , structdyn tab le ∗ t e rm ina l t r an s l a t e , int s tar tx , struct dyn tab le ∗ r e o r d e r t a b l e ){

int i , pos , j , k ;// s t r u c t d y n t a b l e t emp t a b l e ={0};struct dyn tab le copy tab l e ={0};int count=0;

a l l o c d yn t a b l e ( r e o rd e r t ab l e , column data−>w, 1 ) ;p r i n t f ( ”REORDER CALLED\n”) ;// s o r t f i r s tfor ( i=s t a r t x ; i<column data−>w; i++){

int rowcount=r t da t a ( column data , 0 , i ) ;pos=count−1;while ( pos>=0&&rt da ta ( column data , 0 , r t da t a ( r e o rd e r t ab l e , 0 , pos ) ) < rowcount )

pos−−;while ( pos>=0&& rowcount==r t da ta ( column data , 0 , r t da t a ( r e o rd e r t ab l e , 0 , pos ) ) &&

r t da ta ( column data , 1 , r t da t a ( r e o rd e r t ab l e , 0 , pos ) ) < r t da t a ( column data , 1 , i ) )// wh i l e ( pos>=0&& rowcount==r t d a t a ( co lumn data , 0 , r t d a t a (& t emp ta b l e , 0 , pos ) ) &&

r t d a t a ( co lumn data , 1 , r t d a t a (& t emp ta b l e , 0 , pos ) ) > r t d a t a ( co lumn data , 1 , i ) )pos−−;

for ( j=count−1; j>pos ; j−−){s e t da t a ( r e o rd e r t ab l e , 0 , j +1, r t da t a ( r e o rd e r t ab l e , 0 , j ) ) ;

} ;// r o w l i s t [ pos+1]= i ;s e t da t a ( r e o rd e r t ab l e , 0 , pos+1, i ) ;count++;

} ;/∗ f o r ( i =0; i<count ; i++){

p r i n t f (”(%d,%d;%d ) ” , r t d a t a ( r e o r d e r t a b l e , 0 , i ) , r t d a t a ( co lumn data , 0 , r t d a t a (r e o r d e r t a b l e , 0 , i ) ) , r t d a t a ( co lumn data , 1 , r t d a t a ( r e o r d e r t a b l e , 0 , i ) ) ) ;

} ;p r i n t f ( ”\ n ”) ; ∗/

a l l o c d yn t a b l e (&copy tab le , table−>w, table−>h) ;for ( k=0;k<count ; k++){

int column index=r t da t a ( r e o rd e r t ab l e , 0 , k ) ;// p r i n t f ( ” copy k=%d co lumn index=%d t a b l e−>h=%d\n ” , k , co lumn index , t a b l e−>h ) ;for ( i =0; i<table−>h ; i++){

s e t da t a (&copy tab le , i , k+startx , r t da t a ( table , i , column index ) ) ;} ;// s e t d a t a ( t e rm i n a l t r a n s l a t e , 0 , co lumn index ,

} ;i f ( s t a r t x )

for ( i =0; i<table−>h ; i++){s e t da t a (&copy tab le , i , 0 , r t da t a ( table , i , 0 ) ) ;

} ;// p r i n t t a b l e (& c o p y t a b l e ) ;

Page 92: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

82 Poglavje D: izvorna koda uporabe patenta

// p r i n t f ( ”end p r i n t \n ”) ;memcpy( table−>data , copy tab l e . data , s izeof ( int )∗ table−>w∗ table−>h) ;// f r e e d y n t a b l e (& t emp t a b l e ) ;f r e e d yn t ab l e (&copy tab l e ) ;

} ;

void r e o rd e r non t e rm de f au l t t ab l e ( struct dyn tab le ∗ r e o rd e r t ab l e , struct dyn tab le ∗d e f a u l t t a b l e ){

struct dyn tab le temp table ={0};int i ;

a l l o c d yn t a b l e (&temp table , d e f a u l t t ab l e−>w, 1 ) ;

for ( i =0; i<de f au l t t ab l e−>w; i++){int r e o rd e r i ndex=r t da t a ( r e o rd e r t ab l e , 0 , i ) ;// p r i n t f ( ” r eo rd e r index=%d\n ” , r e o r d e r i n d e x ) ;s e t da t a (&temp table , 0 , i , r t da t a ( d e f au l t t ab l e , 0 , r e o rd e r i ndex ) ) ;

} ;

memcpy( d e f au l t t ab l e−>data , temp table . data , s izeof ( int )∗ de f au l t t ab l e−>w∗ de f au l t t ab l e−>h) ;

f r e e d yn t ab l e (&temp table ) ;} ;

int s o r t r ows ( struct dyn tab le ∗ rows data , struct dyn tab le ∗ r ow l i s t , int f l a g s ){// [WH] [ 4 ] [WH]

int count=0;int i , j ;int pos ;for ( i =0; i<rows data−>w; i++)

s e t da t a ( r ow l i s t , 0 , i ,−1) ;for ( i =0; i<rows data−>w; i++){

int rowcount=r t da t a ( rows data , 0 , i ) ;// p r i n t f ( ”row %d l en=%d\n ” , i , rowcount ) ;i f ( rowcount>0){

pos=count−1;while ( pos>=0&&rt da ta ( rows data , 0 , r t da t a ( r ow l i s t , 0 , pos ) ) < rowcount )

pos−−;// wh i l e ( pos>=0&& rowcount==r t d a t a ( rows data , 0 , r t d a t a ( r o w l i s t , 0 , pos ) ) && r t d a t a (

rows data , 1 , r t d a t a ( r o w l i s t , 0 , pos ) ) < r t d a t a ( rows data , 1 , i ) )i f ( f l a g s )while ( pos>=0&& rowcount==r t da ta ( rows data , 0 , r t da t a ( r ow l i s t , 0 , pos ) ) && r t da ta (

rows data , 3 , r t da t a ( r ow l i s t , 0 , pos ) ) < r t da t a ( rows data , 3 , i ) )pos−−;

// p r i n t f ( ” s e t t i n g row=%d to pos=%d l en=%d a l t=%d\n ” , i , pos , rowcount , r t d a t a ( rows data, 3 , i ) ) ;

for ( j=count−1; j>pos ; j−−){s e t da t a ( r ow l i s t , 0 , j +1, r t da t a ( r ow l i s t , 0 , j ) ) ;

} ;// r o w l i s t [ pos+1]= i ;s e t da t a ( r ow l i s t , 0 , pos+1, i ) ;count++;

} ;} ;// p r i n t f ( ” s o r t r ow s c a l l e d \n ”) ;// p r i n t t a b l e ( r o w l i s t ) ;// f o r ( i =0; i<count ; i++)// p r i n t f (”%d count=%d t a l l y=%d\n ” , r o w l i s t [ i ] , r ows da ta [ r o w l i s t [ i ] ] [ 0 ] , r ows da ta [

r o w l i s t [ i ] ] [ 1 ] ) ;return count ;

} ;

int match row ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data , struct dyn tab le ∗r ow l i s t , int srow , int crow ){

// p r i n t f ( ”match row crow=%d srow=%d\n ” , crow , srow ) ;i f ( r t da t a ( rows data , 0 , srow )>0&&r t da ta ( rows data , 0 , srow )==r t da ta ( rows data , 0 , crow )&&

r t da ta ( rows data , 1 , srow )==r t da ta ( rows data , 1 , crow ) ){int c ;for ( c=r t da t a ( rows data , 2 , srow ) ; c<r t da t a ( rows data , 2 , srow )+r t da t a ( rows data , 1 , srow ) ;

c++){i f ( r t da t a ( table , srow , c ) != r t da t a ( table , crow , c ) )

return 0 ;} ;// p r i n t f ( ” rows da ta [ srow ] [ 2 ] =%d s i z e=%d c=%d srow=%d crow=%d\n ” , rows da ta [ srow ] [ 2 ] ,

r ows da ta [ srow ] [ 1 ] , c , srow , crow ) ;// p r i n t f ( ” t a b l e [ srow ] [ c]=%d t a b l e [ crow ] [ c]=%d\n ” , t a b l e [ srow ] [ c ] , t a b l e [ crow ] [ c ] ) ;// p r i n t f ( ”ROW MATCHES crow=%d srow=%d\n ” , crow , srow ) ;return 1 ;

}return 0 ;

Page 93: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

83

} ;

int pack row ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data /∗ [WH] [ 4 ] ∗/ , structpacked data ∗pck data , int row idx , int l i n e s added ){

int d i s p l a c e i d x=r t da t a ( rows data , 2 , row idx ) ;int i ;int p l a c e a t =0;int ok ;

i f ( r t da t a ( rows data , 1 , row idx )<=0){abort ( ) ;return −1;

} ;for ( ; ; p l a c e a t++){

int k ;// p r i n t f ( ” p l a c e a t=%d id x=%d\n ” , p l a c e a t , r ow id x ) ;ok=1;i f ( ( p l a c e a t+table−>w+1)∗ s izeof ( int )>=pck data−>da ta l en ){

// p r i n t d a t a ( p c k da t a ) ;int da ta l en=pck data−>data l en ∗2 ;i f ( data len<=(+table−>w∗ s izeof ( int ) ) )

da ta l en+=(+table−>w∗ s izeof ( int )∗ s izeof ( int ) ) ∗2 ;a l l o c d a t a ( pck data , da ta l en ) ;

} ;

for ( k=0;k<table−>w&&ok ; k++){// r t d a t a ( rows data , 1 , r ow id x )#i f 0

i f ( pck data−>data [ p l a c e a t+k ] !=0) {// p r i n t f ( ” p l a c e a t=%d k=%d data=%d\n ” , p l a c e a t , k , pck da ta−>data [ p l a c e a t+k ] ) ;ok=0;break ;

} ;#else

// p r i n t f ( ” row id x=%d k=%d p l a c e a t=%d data=%d l o c=%d\n ” , row idx , k , p l a c e a t , r t d a t a (t a b l e , row idx , k ) , pck da ta−>data [ p l a c e a t+k ] ) ;

i f ( r t da t a ( table , row idx , k )&&pck data−>data [ p l a c e a t+k ] ) {// r t d a t a ( rows data , 2 ,r ow id x )+

// p r i n t f ( ” p l a c e a t=%d k=%d data=%d\n ” , p l a c e a t , k , pck da ta−>data [ p l a c e a t+k ] ) ;ok=0;break ;

} ;#endif

} ;#i f 1

for ( k=0;k<table−>h&&ok ; k++){// l i n e s a d d e d// p r i n t f ( ” l i n e s a d d e d=%d k=%d\n ” , l i n e s a d d e d , k ) ;// p r i n t f ( ” r t d a t a (&pck da ta−>d i s p l a c e r ow s , 0 , k )=%d p l a c e a t−r t d a t a ( rows data , 2 ,

r ow id x )=%d\n ” , r t d a t a (&pck da ta−>d i s p l a c e r ow s , 0 , k ) , p l a c e a t−r t d a t a ( rows data, 2 , r ow id x ) ) ;

i f ( r t da t a (&pck data−>d i sp lace rows , 0 , k )==p l a c e a t ){// p r i n t f ( ”SAME INDEX k=%d %d\n ” , r t d a t a (&pck da ta−>d i s p l a c e r ow s , 0 , k ) , p l a c e a t−

r t d a t a ( rows data , 2 , r ow id x ) ) ;// p r i n t f ( ”Same index \n ”) ;ok=0;break ;

} ;} ;

#endifi f ( ok ){

// p r i n t f ( ” found p l a c e a t %d t a l l y=%d\n ” , p l a c e a t , r t d a t a ( rows data , 1 , r ow id x ) ) ;int ww=0;int wc=0;for ( k=0;k<table−>w; k++){// r t d a t a ( rows data , 1 , r ow id x )

i f ( r t da t a ( table , row idx , k ) !=0){// r t d a t a ( rows data , 2 , r ow id x )+pck data−>data [ p l a c e a t+k]= r t da t a ( table , row idx , k ) ; // r t d a t a ( rows data , 2 ,

r ow id x )+// p r i n t f ( ” w r i t i n g data i d x=%d d=%d\n ” , p l a c e a t+k , pck da ta−>data [ p l a c e a t+k ] ) ;// pck da ta−>c h e c k d a t a [ p l a c e a t+k ]= row idx ;pck data−>check data [ p l a c e a t+k]=k ; // r t d a t a ( rows data , 2 , r ow id x )+ww=k ;

}else{

wc=k ;i f ( pck data−>check data [ p l a c e a t+k]<0)pck data−>check data [ p l a c e a t+k ]=0;// pck da ta−>c h e c k d a t a [ p l a c e a t+k ]=0;

} ;} ;// i f ( p l a c e a t+r t d a t a ( rows data , 1 , r ow id x )+k>pck da ta−>end da ta )// pck da ta−>end da ta=p l a c e a t+r t d a t a ( rows data , 1 , r ow id x )+k ;

Page 94: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

84 Poglavje D: izvorna koda uporabe patenta

i f ( p l a c e a t+ww>pck data−>end data )pck data−>end data=p l a c e a t+ww;

i f ( p l a c e a t+wc>pck data−>end check )pck data−>end check=p l a c e a t+wc ;

return p l a c e a t ; //−r t d a t a ( rows data , 2 , r ow id x )} ;

} ;} ;

void add tab l e s ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data , struct dyn tab le ∗r ow l i s t , int row count , struct packed data ∗pck data ){

int cnt ;int l i n e s added =0;

for ( cnt=0; cnt<row count ; cnt++){int idx , j , found=0;int t ab l e i nd ex=r t da t a ( r ow l i s t , 0 , cnt ) ;

// p r i n t f ( ” add ing row =%d\n ” , t a b l e i n d e x ) ;for ( j =0; j<cnt ; j++){

// p r i n t f ( ” t a b l e i n d e x=%d r t d a t a ( r o w l i s t , 0 , j )=%d\n ” , t a b l e i n d e x , r t d a t a ( r o w l i s t , 0 ,j ) ) ;

// t a b l e i n d e x != r t d a t a ( r o w l i s t , 0 , j )&&i f (match row ( table , rows data , r ow l i s t , t ab l e index , r t da t a ( r ow l i s t , 0 , j ) ) ){// r o w l i s t

[ j ] ) //&&found++;break ;

} ;} ;

i f ( r t da t a ( rows data , 0 , t ab l e i nd ex )>0){// p r i n t f ( ” add ing row %d\n ” , t a b l e i n d e x ) ;i f ( found ){

// p r i n t f ( ” v r s t i c a se pona v l j a i d x=%d\n ” , t a b l e i n d e x ) ;// found=t a b l e i n d e x ;found=r t da t a (&pck data−>d i sp lace rows , 0 , r t da t a ( r ow l i s t , 0 , j ) ) ;

}else{

found=pack row ( table , rows data , pck data , tab l e index , l i n e s added ) ;l i n e s added++;

} ;// p r i n t f ( ” add ing row %d found=%d\n ” , t a b l e i n d e x +1, found+1) ;s e t da t a (&pck data−>d i sp lace rows , 0 , t ab l e index , found ) ;// p r i n t f ( ” i d x=%d found=%d\n ” , t a b l e i n d e x , found ) ;

} ;} ;

} ;

int pack row nonterm ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data /∗ [WH] [ 4 ] ∗/ ,struct packed data ∗pck data , int row idx , int l i ne s added , struct packed data ∗t e rm tab l e ){

int d i s p l a c e i d x=r t da t a ( rows data , 2 , row idx ) ;int i ;int p l a c e a t =0;int ok ;

// i f ( r t d a t a ( rows data , 1 , r ow id x )<=0){// abo r t ( ) ;// r e t u rn −1;// } ;for ( ; ; p l a c e a t++){

int k ;// p r i n t f ( ” p l a c e a t=%d id x=%d\n ” , p l a c e a t , r ow id x ) ;ok=1;i f ( ( p l a c e a t+table−>w+1)∗ s izeof ( int )>=pck data−>data l en ){

// p r i n t d a t a ( p c k da t a ) ;int da ta l en=pck data−>da ta l en ∗2 ;i f ( data len<=(+table−>w∗ s izeof ( int ) ) )

da ta l en+=(+table−>w∗ s izeof ( int )∗ s izeof ( int ) ) ∗2 ;a l l o c d a t a ( pck data , da ta l en ) ;

} ;

i f ( pck data−>data [ p l a c e a t ] )ok=0;

for ( k=0;k<table−>w&&ok ; k++){// r t d a t a ( rows data , 1 , r ow id x )// p r i n t f ( ” row id x=%d k=%d p l a c e a t=%d data=%d l o c=%d\n ” , row idx , k , p l a c e a t , r t d a t a (

t a b l e , row idx , k ) , pck da ta−>data [ p l a c e a t+k ] ) ;

Page 95: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

85

i f ( r t da t a ( table , row idx , k )&&pck data−>data [ p l a c e a t+k+1]){// r t d a t a ( rows data , 2 ,r ow id x )+

// p r i n t f ( ” p l a c e a t=%d k=%d data=%d\n ” , p l a c e a t , k , pck da ta−>data [ p l a c e a t+k ] ) ;ok=0;break ;

} ;} ;i f ( ok ){

int ww=0;int wc=0;// p r i n t f ( ”row=%d found p l a c e a t %d t a l l y=%d\n ” , row idx , p l a c e a t , r t d a t a ( rows data , 1 ,

r ow id x ) ) ;pck data−>data [ p l a c e a t ]= r t da t a (&term table−>d i sp lace rows , 0 , row idx )+1;// r t d a t a (

rows data , 2 , r ow id x )+// p r i n t f ( ” S e t t i n g to term index to %d\n ” , pck da ta−>data [ p l a c e a t ] ) ;pck data−>check data [ p l a c e a t ]=0; // r t d a t a ( rows data , 2 , r ow id x )+for ( k=0;k<table−>w; k++){// r t d a t a ( rows data , 1 , r ow id x )

i f ( r t da t a ( table , row idx , k ) !=0){// r t d a t a ( rows data , 2 , r ow id x )+pck data−>data [ p l a c e a t+k+1]= r t da t a ( table , row idx , k ) ; // r t d a t a ( rows data , 2 ,

r ow id x )+pck data−>check data [ p l a c e a t+k+1]=k+1;// r t d a t a ( rows data , 2 , r ow id x )+// p r i n t f ( ” w r i t i n g data p l a c e a t=%d id x=%d d=%d chk=%d\n ” , p l a c e a t , k , pck da ta−>

data [ p l a c e a t+k+1] , pck da ta−>c h e c k d a t a [ p l a c e a t+k+1]) ;// pck da ta−>c h e c k d a t a [ p l a c e a t+k ]= row idx ;ww=k ;

}else{

i f ( pck data−>check data [ p l a c e a t+k+1]<0)pck data−>check data [ p l a c e a t+k+1]=0;wc=k ;

} ;} ;i f ( p l a c e a t+ww+1>pck data−>end data )

pck data−>end data=p l a c e a t+ww+1;i f ( p l a c e a t+wc+1>pck data−>end check )

pck data−>end check=p l a c e a t+wc+1;// p r i n t f ( ”Sending enddata=%d p l a c e a t=%d k=%d\n ” , pck da ta−>end data , p l a c e a t , k ) ;s e t da t a (&pck data−>d i sp lace rows , 0 , row idx , p l a c e a t ) ;// i f ( p l a c e a t+r t d a t a ( rows data , 1 , r ow id x )>pck da ta−>end da ta )// pck da ta−>end da ta=p l a c e a t+r t d a t a ( rows data , 1 , r ow id x ) ;

return p l a c e a t ; //−r t d a t a ( rows data , 2 , r ow id x )} ;

} ;} ;

void f i x n on t e rm de f a u l t t a b l e ( struct packed data ∗nonterm packed , struct packed data ∗term packed , struct dyn tab le ∗ de f t ab l e , int r u l e s c n t ){

int i ;for ( i =0; i<de f t ab l e−>w; i++){

int value=r t da t a ( d e f t ab l e , 0 , i )−1;// p r i n t f ( ”Got v a l u e=%d\n ” , v a l u e ) ;i f ( value >0){

int newvalue=r t da t a (&nonterm packed−>d i sp lace rows , 0 , va lue ) ;// p r i n t f ( ”new va l u e=%d\n ” , newva lue+r u l e s c n t ) ;s e t da t a ( d e f t ab l e , 0 , i , newvalue+r u l e s c n t ) ;

} ;} ;

} ;

void add tables nonterm ( struct dyn tab le ∗ table , struct dyn tab le ∗ rows data , structdyn tab le ∗ r ow l i s t , int row count , struct packed data ∗pck data , struct packed data ∗term table , int r u l e s c oun t ){

int cnt ;int l i n e s added =0;

for ( cnt=0; cnt<row count ; cnt++){int idx , j , found=0;int t ab l e i nd ex=r t da t a ( r ow l i s t , 0 , cnt ) ;

found=pack row nonterm ( table , rows data , pck data , tab l e index , l ine s added , t e rm tab l e ) ;l i n e s added++;// p r i n t f ( ” add ing row %d found=%d\n ” , t a b l e i n d e x +1, found+1) ;// s e t d a t a (&pck da ta−>d i s p l a c e r ow s , 0 , t a b l e i n d e x , found ) ;// p r i n t f ( ” i d x=%d found=%d\n ” , t a b l e i n d e x , found ) ;

} ;// add unadded rowsp r i n t f ( ”ADDING EMPTY ROWS\n”) ;for ( cnt=0; cnt<table−>h ; cnt++){

int found=0;

Page 96: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

86 Poglavje D: izvorna koda uporabe patenta

// p r i n t f ( ” cnt=%d\n ” , cn t ) ;for ( l i n e s added =0; l ine s added<table−>h ; l i n e s added++){

i f ( r t da t a ( r ow l i s t , 0 , l i n e s added )==cnt ){// p r i n t f ( ” l i n e =%d in l i s t \n ” , cnt ) ;found++;

} ;} ;i f ( found )

continue ;pack row nonterm ( table , rows data , pck data , cnt , 0 , t e rm tab l e ) ;// p r i n t f ( ” add ing row %d found=%d\n ” , cn t +1, found+1) ;

} ;

// t r a n s l a t e a l l da tap r i n t f ( ” t r a n s l a t e data\n”) ;for ( cnt=0; cnt<pck data−>end data ; cnt++){

int found=0;// p r i n t f ( ” cnt=%d\n ” , cn t ) ;for ( l i n e s added =0; l ine s added<table−>h ; l i n e s added++){

i f ( r t da t a (&pck data−>d i sp lace rows , 0 , l i n e s added )==cnt ){// p r i n t f ( ” l i n e =%d in l i s t \n ” , cnt ) ;found++;

} ;} ;i f ( found )

continue ;int data=pck data−>data [ cnt ] ;i f ( data>0){

int tdata ;tdata=r t da t a (&pck data−>d i sp lace rows , 0 , data−1)+ru l e s c oun t ;pck data−>data [ cnt ]= tdata ;// p r i n t f ( ” S e t t i n g data=%d t da t a=%d\n ” , data , t d a t a ) ;

}else {

pck data−>data [ cnt]=−data ;} ;

} ;} ;

void f i x t e rm i n a l t a b l e ( struct packed data ∗ te rmina l data , struct packed data ∗nonterminal data , int r u l e s c n t ){

int i ;

for ( i =0; i<te rmina l data−>end data ; i++){int value=termina l data−>data [ i ] ;i f ( value>r u l e s c n t ){

int to=nonterminal data−>end data+r u l e s c n t+(value−r u l e s c n t )−1;// p r i n t f ( ” conve r t e r r o r c ond i t i o n va l u e=%d i=%d to=%d\n ” , va lue , i , t o ) ;te rmina l data−>data [ i ]= to ;

}elsei f ( value >0){

int to=r t da t a (&nonterminal data−>d i sp lace rows , 0 , value−1)+r u l e s c n t ;// p r i n t f ( ” v a l u e=%d s e t t o=%d\n ” , va lue , r t d a t a (&non te rmina l da ta−>d i s p l a c e r ow s , 0 ,

va lue −1)+r u l e s c n t ) ;te rmina l data−>data [ i ]= to ;

}else i f ( value <0){

// i n t to=r t d a t a (&non te rmina l da ta−>d i s p l a c e r ow s ,0 ,(− va l u e )−1)+r u l e s c n t ;int to=−value ;// p r i n t f ( ”unk s t u f f v a l u e=%d to=%d\n ” , va lue , t o ) ;te rmina l data−>data [ i ]= to ;

} ;

} ;} ;

int che ck tab l e ( struct dyn tab le ∗ table , struct packed data ∗pck data ){int i , j ;for ( i =0; i<table−>h ; i++){

for ( j =0; j<table−>w; j++){int va l =0;int chk=0;int idx ;idx=r t da t a (&pck data−>d i sp lace rows , 0 , i )+j ;i f ( idx>=0&&idx<pck data−>end data ){

// c h e c k d a t achk=pck data−>check data [ idx ] ;

Page 97: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

87

i f ( chk==j ) // jva l=pck data−>data [ idx ] ;

} ;

i f ( va l != r t da t a ( table , i , j ) ){p r i n t f ( ”False data va l=%d chk=%d tab=%d i=%d , j=%d idx=%d d i s p l a c e=%d\n” , val , chk ,

r t da t a ( table , i , j ) , i , j , idx , r t da t a (&pck data−>d i sp lace rows , 0 , i ) ) ;return −1;

} ;} ;

} ;return 0 ;

} ;

void pr i n t da ta ( struct packed data ∗pck data ){int i ;int tmp ;

p r i n t f ( ”DISPLACE INDEX\n”) ;for ( i =0; i<WH; i++){

tmp=r t da t a (&pck data−>d i sp lace rows , 0 , i ) ;i f (tmp<−0 x f f f f f f )

p r i n t f ( ”NA ”) ;else

p r i n t f ( ”%2d ” , r t da t a (&pck data−>d i sp lace rows , 0 , i ) ) ;} ;p r i n t f ( ”\n”) ;

p r i n t f ( ”DATA TABLE\n”) ;for ( i =0; i<pck data−>end data ; i++){

p r i n t f ( ”%2d ” , pck data−>data [ i ] ) ;} ;p r i n t f ( ”\n”) ;p r i n t f ( ”CHECK TABLE\n”) ;for ( i =0; i<pck data−>end check ; i++){

i f ( pck data−>check data [ i ]<0)p r i n t f ( ”NA ”) ;elsep r i n t f ( ”%2d ” , pck data−>check data [ i ] ) ;

} ;p r i n t f ( ”\n”) ;

} ;

int main ( ) {// i n t t a b l e [WH] [WW] ;// i n t t a b l e d a t a [WH] [ 4 ] ;// i n t r o w l i s t [WH] ;struct dyn tab le t ab l e ={0};struct dyn tab le t ab l e da ta ={0};struct dyn tab le r ow l i s t ={0};struct dyn tab le c o l umn l i s t ={0};struct dyn tab le t r a n s l a t e t e rm i n a l ={0};struct dyn tab le t e rm i n a l d e f a u l t s ={0};struct dyn tab le non t e rm ina l d e f au l t s ={0};struct dyn tab le non t e rm ina l r e o rde r t ab l e ={0};struct dyn tab le t e rm ina l r e o r d e r t ab l e ={0};

int row count ;int rep ;int e lement count ;

struct packed data packed ;struct packed data nonterm packed ;

srand ( time (0) ) ;bzero ( ( void ∗) &packed , s izeof ( struct packed data ) ) ;bzero ( ( void ∗) &nonterm packed , s izeof ( struct packed data ) ) ;a l l o c d a t a (&packed ,1024) ;a l l o c d a t a (&nonterm packed ,1024) ;width=6;he ight =12;

#define TERMINALCOUNT 6#define NONTERMINALCOUNT 5#define STATES COUNT 12

int t e rm tab l e [STATES COUNT∗TERMINALCOUNT]={5 ,6 ,0 , 3 , 0 , 0 ,0 ,0 ,0 ,7 ,0 ,STATES COUNT+1,5 ,6 , 0 , 0 , 0 , 0 ,0 ,0 ,−1 ,−1 ,9 ,−1 ,0 ,6 ,−8 ,−8 ,−8 ,−8 ,

Page 98: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

88 Poglavje D: izvorna koda uporabe patenta

5 ,6 ,0 , 3 , 0 , 0 ,5 , 6 , 0 , 0 , 0 , 0 ,0 ,0 ,−2 ,−2 ,9 ,−2 ,5 ,6 , 0 , 0 , 0 , 0 ,0 ,0 ,12 ,7 ,0 ,0 ,0 ,0 ,−3 ,−3 ,9 ,−3 ,0 ,6 ,−10 ,−10 ,−10 ,−10

} ;

int nonterm table [STATES COUNT∗NONTERMINALCOUNT]={2 ,4 ,−4 ,−6 ,−7 ,0 ,0 ,0 ,0 ,0 ,0 ,8 ,−4 ,−6 ,−7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,−9 ,10 ,4 ,−4 ,−6 ,−7 ,0 ,11 ,−4 ,−6 ,−7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,−5 ,−6 ,−7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,−11

} ;#define RULES COUNT 12

a l l o c d yn t a b l e (&table ,WW,WH) ;a l l o c d yn t a b l e (&tab l e data ,WH, 4 ) ;a l l o c d yn t a b l e (& r ow l i s t ,WH, 1 ) ;// a l l o c d y n t a b l e (& c o l umn l i s t ,WW,1 ) ;a l l o c d yn t a b l e (& t e rm ina l d e f au l t s ,STATES COUNT, 1 ) ;a l l o c d yn t a b l e (& t r an s l a t e t e rm ina l ,TERMINALCOUNT, 1 ) ;

//memset ( packed . d i s p l a c e r ow s , 0 , s i z e o f ( packed . d i s p l a c e r ow s ) ) ;

// f o r ( rep =0; rep <1000; rep++){r e s e t d a t a (&packed ) ;// f i l l t a b l e (& t a b l e , e l emen t coun t ) ;f i l l t a b l e (&table , term table ,STATES COUNT∗TERMINALCOUNT) ;// check rows (& t a b l e ,& t a b l e d a t a ) ;// check co lumns (& t a b l e ,& t a b l e d a t a ,& c o l umn l i s t ) ;g e t t e rm i n a l d e f a u l t s (&table ,& t e rm i n a l d e f a u l t s ) ;// p r i n t t a b l e (& t e rm i n a l d e f a u l t s ) ;// p r i n t f ( ” t e rm ina l d e f a u l t s \n ”) ;g row te rm ina l t ab l e (&table ,& t e rm ina l d e f au l t s ,RULES COUNT) ;check rows(&table ,& tab l e da ta ) ;row count=so r t r ows (&tab l e data ,& r ow l i s t , 0 ) ;check columns(&table ,& tab le data ,& co l umn l i s t ) ; // ,& r o w l i s t// p r i n t t a b l e (& t a b l e ) ;// p r i n t f ( ” a f t e r check \n ”) ;r e o r d e r f i e l d s (&table ,& co lumn l i s t ,& t r an s l a t e t e rm ina l ,1 ,& t e rm ina l r e o r d e r t ab l e ) ;// p r i n t t a b l e (& t a b l e ) ;// p r i n t f ( ” a f t e r r eo rd e r \n ”) ;check rows(&table ,& tab l e da ta ) ;// p r i n t t a b l e (& t a b l e ) ;// p r i n t f ( ” a f t e r r eo rd e r \n ”) ;// row count=s o r t r ow s (& t a b l e d a t a ,& r o w l i s t ) ;add tab l e s (&table ,& tab l e data ,& r ow l i s t , row count ,&packed ) ;// i f ( c h e c k t a b l e (& t a b l e ,& packed ) ) {// // check f a i l e d// p r i n t f ( ”BUG CHECK FAILED\n ”) ;// // p r i n t t a b l e (& t a b l e ) ;// p r i n t d a t a (&packed ) ;// // break ;//}// e l s e {

// } ;// p r i n t t a b l e (& t a b l e ) ;pr in t da ta (&packed ) ;

p r i n t f ( ”DOING NONTERM TABLE\n”) ;f r e e d yn t ab l e (& tab l e ) ;f r e e d yn t ab l e (& tab l e da ta ) ;f r e e d yn t ab l e (& r ow l i s t ) ;f r e e d yn t ab l e (& co l umn l i s t ) ;

a l l o c d yn t a b l e (&table ,NON TERMINAL COUNT,STATES COUNT) ;a l l o c d yn t a b l e (&tab l e data ,STATES COUNT, 4 ) ;a l l o c d yn t a b l e (& r ow l i s t ,STATES COUNT, 1 ) ;

Page 99: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

89

a l l o c d yn t a b l e (&nonte rmina l de f au l t s ,NON TERMINAL COUNT, 1 ) ;

f i l l t a b l e (&table , nonterm table ,STATES COUNT∗NONTERMINALCOUNT) ;// p r i n t t a b l e (& t a b l e ) ;g e t n on t e rm i n a l d e f a u l t s (&table ,& nont e rm ina l d e f au l t s ) ;// p r i n t t a b l e (& n on t e rm i n a l d e f a u l t s ) ;// p r i n t f ( ” n o n t e rm i n a l d e f a u l t s d e f a u l t s \n ”) ;// p r i n t t a b l e (& t a b l e ) ;// p r i n t f ( ”DOING SORT\n ”) ;check rows(&table ,& tab l e da ta ) ;row count=so r t r ows (&tab l e data ,& r ow l i s t , 1 ) ;check columns(&table ,& tab le data ,& co l umn l i s t ) ; // ,& r o w l i s t// p r i n t t a b l e (& t a b l e ) ;// p r i n t f ( ” a f t e r SORT\n ”) ;r e o r d e r f i e l d s (&table ,& co lumn l i s t ,& t r an s l a t e t e rm ina l ,0 ,& nont e rm ina l r e o rde r t ab l e ) ;r e o rd e r non t e rm de f au l t t ab l e (&nonte rmina l r eo rde r tab l e ,& nont e rm ina l d e f au l t s ) ;// p r i n t t a b l e (& t a b l e ) ;check rows(&table ,& tab l e da ta ) ;row count=so r t r ows (&tab l e data ,& r ow l i s t , 1 ) ;r e s e t d a t a (&nonterm packed ) ;p r i n t t a b l e (& tab l e ) ;// p r i n t f ( ”BEFORE PACK\n ”) ;add tables nonterm(&table ,& tab l e data ,& r ow l i s t , row count ,&nonterm packed ,&packed ,

RULES COUNT) ;f i x n on t e rm de f a u l t t a b l e (&nonterm packed ,&packed ,& nonte rmina l de f au l t s ,RULES COUNT) ;p r i n t da ta (&nonterm packed ) ;p r i n t f ( ” f i x i n g term data\n”) ;p r i n t da ta (&packed ) ;f i x t e rm i n a l t a b l e (&packed ,&nonterm packed ,RULES COUNT) ;p r i n t f ( ” f ixedterm data\n”) ;p r i n t da ta (&packed ) ;{//LR PARSER BEGIN

struct LR par s e r s t a t e LRp={0};struct dyn tab le input={0};int r educ e t ab l e [RULES COUNT]={1 ,2 ,3 , 1 , 3 , 1 , 1 , 1 , 2 , 3 , 4} ;int reduce symb tab le [RULES COUNT]={4 ,4 ,4 , 2 , 2 , 3 , 3 , 5 , 5 , 1 , 1} ;char ∗ r u l e s s t r i n g s [ ]={ ”E: :=T” , ”E::=+T” , ”E: :=E+T” , ”T: :=F” , ”T: :=T∗F” , ”F: :=V” , ”F: :=R” , ”V

: := id ” , ”V: := idR” , ”R: :=(E) ” , ”R: :=(E)R”} ;char ∗ t e rm s t r i n g s [ ]={ ”( ” , ”∗” , ”+” , ” id ” , ”) ” , ” eo f ”} ; // s o r t e dchar ∗ nonte rm st r ings [ ]={ ”R” , ”T” , ”F” , ”E” , ”V”} ; // s o r t e dint e r r o r =0;int ccc=0;a l l o c d yn t a b l e (&LRp. stack , 128 , 1 ) ; // s t a c k s i z ea l l o c d yn t a b l e (&input , 6 , 1 ) ;s e t da t a (&input , 0 , 0 , 4 ) ; // i ds e t da t a (&input , 0 , 1 , 2 ) ; //∗s e t da t a (&input , 0 , 2 , 4 ) ; // i ds e t da t a (&input , 0 , 3 , 3 ) ; //+s e t da t a (&input , 0 , 4 , 4 ) ; // i ds e t da t a (&input , 0 , 5 , 6 ) ; // eo fs e t da t a (&LRp. stack ,0 ,0 ,19−RULES COUNT) ;s e t da t a (&LRp. stack , 0 , 1 , 0 ) ;LRp . s t a c k s i z e =2;// s t a r t indexLRp. c u r r t a b l e =0;while ( ! e r r o r&&LRp. s t a c k s i z e >0){//LRp . cu r r i n pu t <i npu t .w&&

int next input =0;int c u r r s t a t e=−1;/∗{

i n t i ;p r i n t f ( ” s t a c k s i z e=%d (” ,LRp . s t a c k s i z e ) ;f o r ( i =0; i<LRp . s t a c k s i z e ; i++)

p r i n t f (”%d ” , r t d a t a (&LRp . s tack , 0 , i ) ) ;p r i n t f ( ”) \n ”) ;

} ; ∗/c u r r s t a t e=r t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e −2) ;// p r i n t f ( ”Current s t a t e=%d s t a c k s i z e=%d c u r t a b l e=%d\n ” , c u r r s t a t e , LRp . s t a c k s i z e ,

LRp . c u r r t a b l e ) ;i f (LRp . c u r r t a b l e ){// cur r en t s ymbo l <0

int current symbol=r t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e −1) ;// i n t non t e rm index=packed . data [ c u r r s t a t e ] ;int non term index=cu r r s t a t e ;// p r i n t f ( ”NONTERM GOT CURRENT SYMBOL %d index=%d\n ” , cu r r en t s ymbo l , non t e rm index )

;i f ( non term index <0 | | non term index>nonterm packed . end data ){

p r i n t f ( ”over f low1 \n”) ;e r r o r =1;break ;

} ;

i f ( non term index+(−current symbol )>nonterm packed . end data ){

Page 100: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

90 Poglavje D: izvorna koda uporabe patenta

e r r o r =1;p r i n t f ( ”over f low2 nonterm packed . end data=%d\n” , nonterm packed . end data ) ;break ;

} ;int symbol=−(current symbol ) ;int r u l e r edu c e =0;// p r i n t f ( ” ! ! ! ! ! nonterm packed . c h e c k d a t a [ non t e rm index+symbol ]=%d va l u e=%d symbol

=%d d e f v a l=%d\n ” , nonterm packed . c h e c k d a t a [ non t e rm index+symbol ] ,nonterm packed . data [ non t e rm index+symbol ] , symbol , nonterm packed . data [non t e rm index ] ) ;

i f ( nonterm packed . check data [ non term index+symbol]==symbol ){r u l e r edu c e=nonterm packed . data [ non term index+symbol ] ;i f ( ru l e r educe<RULES COUNT)

ru l e r edu c e=−r u l e r edu c e ;// p r i n t f ( ”NONTERM GOT SPECIFIC REDUCE f=%d\n ” , r u l e r e d u c e ) ;

}else {

r u l e r edu c e=r t da t a (&nonte rmina l de f au l t s , 0 , symbol−1) ;// p r i n t f ( ”NONTERM GOT DEFAULT REDUCE f=%d cu r r en t s ymbo l=%s \n ” , r u l e r e du c e ,

n on t e rm s t r i n g s [ symbol −1]) ;} ;i f ( r u l e r edu c e==0){

e r r o r =1;break ;

}else

i f ( ru l e r educe >0){// i n t n ew s t a t e=nonterm packed . data [ r u l e r e du c e−RULES COUNT ] ;p r i n t f ( ”NONTERMI GOTO idx=%d\n” , ru l e r educe−RULES COUNT) ;// p r i n t f ( ”SHIFT check ok new new va l u e=%d\n ” , newva lue1 ) ;s e t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e++,ru l e r educe−RULES COUNT) ; // s t a t e ,

new s ta t e −1s e t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e ++,0) ; // symbolLRp. c u r r t a b l e =0;// sw i t c h t a b l e

}else {

int rule number=−(r u l e r edu c e+1) ;int reduced symbol=reduce symb tab le [ rule number ] ;//LRp . s t a c k s i z e−=r e d u c e t a b l e [ ru l e number ]∗ 2 ;// p r i n t f ( ”NONTERM REDUCE c u r r s t a t e=%d new symbol=%d r u l e=%s \n ” , c u r r s t a t e ,−

reduced symbo l , r u l e s s t r i n g s [ ru l e number ] ) ;p r i n t f ( ”NONTERMI REDUCE ru l e=%s new symbol=%d \n” , r u l e s s t r i n g s [ rule number ] ,−

reduced symbol ) ;s e t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e −1,−reduced symbol ) ;

} ;}else{

i f (LRp . cur r input<input .w){next input=r t da t a (&input , 0 ,LRp . cu r r i npu t ) ;

}else {

p r i n t f ( ”no input cu r r i np=%d w=%d\n” ,LRp . cur r input , input .w) ;i f (LRp . s t a c k s i z e >=2)

LRp . s t a c k s i z e −=2;}int next index=nonterm packed . data [ c u r r s t a t e ]−1; //+n e x t i n p u tint value=packed . data [ next index+next input ] ;// p r i n t f ( ” n e x t i n p u t=%d check=%d symbol=%s va l u e=%d index=%d\n ” , n e x t i n pu t , packed .

c h e c k d a t a [ n e x t i n d e x+n e x t i n p u t ] , t e rm s t r i n g s [ n e x t i n pu t −1] , va lue , n e x t i n d e x );

i f ( next input==packed . check data [ next index+next input ] ) {// i n t new va lue=va lue−RULES COUNT;// p r i n t f ( ”FOUND NEXT SHIFT\n ”) ;// i n t newva lue1=nonterm packed . data [ new va lue ]−1;p r i n t f ( ”TERMINAL SHIFT symbol=%s newstate va lue=%d \n” , t e rm s t r i n g s [ next input

−1] , va lue ) ;i f ( ( value−RULES COUNT)>=nonterm packed . end data ){

int d i f f =(value−RULES COUNT)−nonterm packed . end data ;i f ( d i f f ==0)

p r i n t f ( ”INPUT ACCEPTED\n”) ;else

p r i n t f ( ”EOF ENDING REASON arg=%d\n” , d i f f ) ;break ;

}s e t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e++,value−RULES COUNT) ; // s t a t es e t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e ++,0) ; // symbol v a l u e

LRp. cu r r i npu t++;} else {

// i f ( va lue<RULES COUNT) {

Page 101: Zgo s cevanje redkih (LR) tabeleprints.fri.uni-lj.si/1092/1/Štangar_D.-VS.pdf · Check tabela: Tabela pri metodi RDS, v kateri preverjamo, veljavnost elementa. Data table: Tabela

91

// i n t v v a l=packed . data [ c u r r s t a t e ]−1;int vval=packed . data [ next index ]−1;// p r i n t f ( ”TERMINAL GOT DEFAULT REDUCTION va l u e=%d v v a l=%d c u r r s t a t e=%d\n ” , va lue

, vva l , c u r r s t a t e ) ;i f ( vval<RULES COUNT){

int reduced symbol=−reduce symb tab le [ vval ] ;int r e du c e s i z e=r educ e t ab l e [ vval ] ∗ 2 ;LRp . s t a c k s i z e−=redu c e s i z e ;// p r i n t f ( ”TERMINAL REDUCE v v a l=%d r e d u c e s i z e=%d c u r r s t a t e=%d s i z e=%d

reduced symbo l=%d r u l e=%s \n ” , vva l , r e d u c e s i z e , c u r r s t a t e , r e d u c e t a b l e [ v v a l] , r educed symbo l , r u l e s s t r i n g s [ v v a l ] ) ;

p r i n t f ( ”TERMINAL REDUCE ru l e=%s reduced symbol=%d\n” , r u l e s s t r i n g s [ vval ] ,reduced symbol ) ;

// s e t d a t a (&LRp . s tack , 0 ,LRp . s t a c k s i z e −2, c u r r s t a t e ) ;i f ( r t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e −2)==0)

s e t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e −2, c u r r s t a t e ) ;s e t da t a (&LRp. stack , 0 ,LRp . s t a c k s i z e −1, reduced symbol ) ;LRp . c u r r t a b l e++;// sw i t c h t a b l e

} else {p r i n t f ( ”ERROR value=%d vval=%d\n” , value , vval ) ;e r r o r =1;

} ;} ;

} ;} ;

} ;

f r e e d yn t a b l e (& tab l e ) ;f r e e d yn t a b l e (& tab l e da ta ) ;f r e e d yn t a b l e (& r ow l i s t ) ;f r e e d yn t a b l e (& t r a n s l a t e t e rm i n a l ) ;f r e e d yn t a b l e (& t e rm i n a l d e f a u l t s ) ;// p r i n t f ( ” f u l l matr ix l e n %d,%d=%d d a t a s i z e=%d\n ” ,WW,WH,WH∗WW,WH∗WW∗ s i z e o f ( i n t ) ) ;// p r i n t f ( ” reduced s i z e data l en=%d s i z e=%d check i s same t o t a l l e n=%d s i z e=%d\n ” , packed .

end data , packed . end da ta ∗ s i z e o f ( i n t ) , packed . end da ta ∗2 , packed . end da ta ∗ s i z e o f ( i n t )∗2) ;

return 0 ;} ;