CTW, Algorytmy specjalizowane cz. 2 Algorytmy kompresji danych Sebastian Deorowicz 2007 04 24
Plan wykładu CTW 1 CTW 2 3
CTW (ang. Context Tree Weighting) Opis Algorytm CTW opublikowany w latach 1993 1995 roku przez Willemsa, Shtarkova i Tjalkensa Jeden z nowszych algorytmów kompresji ogólnego przeznaczenia Dla chętnych w miarę przystępny opis szczegółów CTW: http://www.sps.ele.tue.nl/members/f.m.j.willems/ RESEARCH_files/CTW/reflections.ps
Frans M. J. Willems Internet: http://userver.ftw.at/~jossy/photos/ 0303_NewJersey/dscn5794.jpg Ważne daty 1993 Współtwórca algorytmu CTW
PPM a CTW CTW PPM Prawdopodobieństwo wystąpienia symbolu wyznaczane jest w kontekście pewnego maksymalnego rzędu d Jeśli w tym kontekście symbol jeszcze nie wystąpił, to kodowany jest symbol wyjścia, zmniejszany jest rząd i procedura powtarza się CWT Prawdopodobieństwo wystąpienia symbolu wyznaczane na podstawie statystyk dla wszystkich kontekstów rzędów od 0 do d Oryginalny algorytm działa dla sekwencji binarnej
PPM a CTW CTW PPM Prawdopodobieństwo wystąpienia symbolu wyznaczane jest w kontekście pewnego maksymalnego rzędu d Jeśli w tym kontekście symbol jeszcze nie wystąpił, to kodowany jest symbol wyjścia, zmniejszany jest rząd i procedura powtarza się CWT Prawdopodobieństwo wystąpienia symbolu wyznaczane na podstawie statystyk dla wszystkich kontekstów rzędów od 0 do d Oryginalny algorytm działa dla sekwencji binarnej
Wyznaczanie prawdopodobieństw w algorytmie CTW Algorytm Wyznacz prawdopodobieństwo wystąpienia symbolu w bieżącym kontekście rzędu 0 jako średnią ważoną prawdopodobieństw wyznaczonych na podstawie statystyk dla tego rzędu i wyznaczonego prawdopodobieństwa dla rzędu 1 Prawdopodobieństwo dla rzędu 1 wyznacz jako średnią ważoną prawdopodobieństwa na podstawie statystyk dla rzędu 1 i wyznaczonego prawdopodobieństwa dla rzędu 2 Postępuj podobnie aż do rzędu d, dla którego prawdopodobieństwo wyznacza się tylko na podstawie statystyk występowania symboli dla tego rzędu
Jak kompresować dane nie-binarne? Dekompozycja Dane należy przekształcić na ciąg bitów Możliwe są tu różne sposoby, np.: kompresujemy kolejno wszystkie bity kiepskie wyniki tworzymy 8 niezależnych modeli (dla każdej pozycji w bajcie); kontekst można wyznaczać np. tak: kontekstem są tylko bity z tej pozycji w bajcie z ostatnich d bajtów (zwykle d 20) kontekstem są wszystkie bity z poprzednich bajtów i zakodowane już bity z bieżącego bajta
CTW wyniki praktyczne Współczynnik kompresji Gorszy o kilka-kilkanaście procent od PPMonstr a także gorszy od najlepszych algorytmów opartych na BWT Prędkość Wolny a nawet bardzo wolny kilkadziesiąt KB/s na współczesnych komputerach
Plan wykładu CTW 1 CTW 2 3
Kompresja plików XML Pliki XML Nowoczesny format służący do przechowywania i wymiany danych Dane najczęściej przechowywane w postaci tekstowej Zestaw znaczników opisujących dane nie jest ustalony przez standard a użytkownicy mogą swobodnie stosować własne znaczniki Znaczniki tworzą zagnieżdżoną strukturę, a dokument można przedstawić jako pojedyncze drzewo
Pliki XML przykład <Line> <PKey>15</PKey> <SKey>1</SKey> <Count>1</Count> <Qty>25</Qty> <Price>22875.25</Price> <Discount>0.09</Discount> <Tax>0.05</Tax> <RFlag>A</RFlag> <Status>F</Status> <SDate>1994-06-14</SDate> <CDate>1994-07-20</CDate> <RDate>1994-06-23</RDate> <SI>COLLECT COD</SI> <SM>MAIL</SM> <Comment>hAwAxxiNP6nz7jQkhyNQnjB5yn</Comment> </Line>
Kompresja XML CTW Gdzie tu jest redundancja? Prawie wszystkie znaczniki otwierające mają znaczniki zamykające Teksty zwykle w języku naturalnym Wiodące spacje zwykle odzwierciedlają poziomy zagnieżdżenia Pola numeryczne zapisywane tekstowo; często są one podobne w kolejnych rekordach Daty zapisywane tekstowo, dodatkowo bardzo często daty się powtarzają albo różnią się tylko nieznacznie
Kompresja XML CTW Istniejące algorytmy, cz. 1 Algorytmy ogólnego przeznaczenia dają całkiem dobre wyniki, ale nie wykorzystują one wiedzy o strukturze plików XML XMill (Liefke i Suciu, 2000) rozdziela dokument na trzy oddzielnie kompresowane strumienie: nazwy znaczników i atrybutów tekst układ struktury
Kompresja XML CTW Istniejące algorytmy, cz. 2 XMLPPM (Cheney, 2001) specjalizowana wersja PPMa używająca czterech osobnych modeli dla kompresji różnych części dokumentu (np. znaczników, tekstu) XWRT (Swacha, Grabowski, Skibiński, 2006) preprocesing dokumentu, którego główna idea polega na zamianie najczęstszych słów na kody ze słownika (stworzonego we wstępnym przebiegu) Specjalna wersja transformaty BWT dla plików XML (Ferragina, 2006)
Kompresja XML przykładowe dane Plik Rozmiar [MB] Elementy Atrybuty Max. głęb. DBPL 127.7 3 332 130 404 276 6 NASA 2.1 48 001 1 3 SwissPr 109.5 2 977 031 2 189 859 5 Pliki DBPL dane bibliograficzne o pracach naukowych NASA dane astronomiczne SwissPr dane o strukturach białkowych
Kompresja XML przykładowe wyniki (w bpc) 1 Algorytm DBPL NASA SwissPr bzip2 0.955 0.879 0.608 PPMd 0.694 0.768 0.479 zip 1.463 1.208 0.985 XMill+bzip2 0.942 0.831 0.466 XMill+PPMd 0.926 0.786 0.443 XMLPPM 0.857 0.729 0.465 XWRT+bzip2 0.881 0.731 0.474 XWRT+PPMd 0.732 0.601 0.400 XWRT+zip 0.976 0.783 0.559 1 Wyniki za Sz. Grabowski, prywatna komunikacja
Kompresja baz danych Czy jest potrzebna? Bazy danych osiągają ogromne rozmiary wniosek: jest bardzo potrzebna! Uwaga Różne bazy danych przechowywane są w różnych formatach wniosek: więcej pracy dla informatyków :-)
Kompresja baz danych Czy jest potrzebna? Bazy danych osiągają ogromne rozmiary wniosek: jest bardzo potrzebna! Uwaga Różne bazy danych przechowywane są w różnych formatach wniosek: więcej pracy dla informatyków :-)
Kompresja baz danych Możliwe podejścia Stawiamy na maksymalny współczynnik kompresji np. przy archiwizacji Stawiamy na dobry współczynnik kompresji przy zachowaniu swobody dostępu do danych np. dla danych rzadko używanych, ale takich, które jednak muszą być dostępne w miarę szybko
Kompresja baz danych przykładowa tabela Imię Nazwisko Data ur. Wzrost Miasto Płeć Jan Kowalski 12-04-1968 175 Gliwice M Joachim Nowak 23-02-1971 189 Bytom M Karolina Banach 05-11-1978 162 Gliwice K Zofia Zielna 22-04-1972 170 Zabrze K Tadeusz Żółtko 14-05-1980 172 Skoczów M Joanna Malinowska 30-07-1982 175 Łódź K Sonia Janik 09-08-1975 168 Mysłowice K Stefan Nowakowski 12-12-1972 178 Radzionków M Anna Kalinowska 28-03-1984 171 Katowice K Roman Polny 29-10-1976 180 Zabrze M Monika Tuszyńska 16-06-1982 173 Zabrze K Gizela Sroka 25-05-1977 165 Katowice K Tadeusz Tyczka 01-06-1974 178 Zabrze M Anna Złotopolska 11-05-1971 179 Warszawa K
Kompresja baz danych Gdzie tu jest redundancja? Dane przechowywane jako zbiory rekordów W każdym rekordzie te same typy pól tabela ma określoną strukturę Pola niektórych typów, np. liczbowych, daty, mogą być przechowywane w postaci tekstowej Wartości w polach daty kolejnych rekordów często nie różnią się od siebie za bardzo Często istnieją silne korelacje pomiędzy wartościami pól numerycznych w kolejnych rekordach Pola tekstowe często zawierają sporo spacji kończących (pole jest stałej długości)
Kompresja baz danych Przykładowa idea Bazę danych przekształcamy z zapisu wierszami na zapis kolumnami nie mieszają się wtedy pola numeryczne z tekstowymi itp. Daty kodujemy przyrostowo i binarnie a nie tekstowo Pola numeryczne kodujemy binarnie i ew. także przyrostowo Przekształconą tabelę kompresujemy z użyciem jednego ze znanych uniwersalnych algorytmów Można rozbić bazę danych na kilka plików (np. według typów kolumn) i kompresować każdy z plików osobno
Plan wykładu CTW 1 CTW 2 3
Dwa podejścia 1 Kompresja pliku wykonywalnego w celu archiwizacji 2 Kompresja pliku wykonywalnego do postaci, która da się uruchamiać
Kompresja EXE do archiwum Idea Programy wykonywalne mają określoną strukturę Można przeprowadzić deasemblację kodu binarnego w celu lepszej analizy pliku Instrukcje procesora mają przypisane konkretne kody binarne można próbować to jakoś wykorzystać
Kompresja EXE do pliku wykonywalnego Idea Plik wykonywalny składa się z: krótkiego (kilkaset bajtów kilka kilobajtów) nagłówka, który jest programem dekompresującym w locie skompresowanego oryginalnego pliku wykonywalnego Po uruchomieniu program dekompresujący odtwarza oryginalny program, który jest następnie uruchamiany Dekompresja musi być szybka, ale użytkownik nie odczuwał dyskomfortu
Kompresja EXE do pliku wykonywalnego Po co taka kompresja? Mniejsze pliki wykonywalne, które jednak mogą być uruchamiane Czasami uruchomienie takiego pliku jest szybsze niż oryginalnego, jeśli medium, z którego jest on uruchamiany jest wolne, np. dyskietka Można uruchamiać program bez jego dekompresji (sam w locie się dekompresuje)
Kompresja EXE do pliku wykonywalnego Jedna z istniejących realizacji UPX (http://upx.sourceforge.net/) wydajny kompresor oferujący bardzo szybką dekompresję i bardzo dobry współczynnik kompresji
Plan wykładu CTW 1 CTW 2 3
Po co taka kompresja? Ogromne ilości danych biologicznych Bazy danych biologicznych rosną w bardzo szybkim tempie
Cechy DNA Alfabet 4-znakowy (zasady): A (adenina), C (cytozyna), G (guanina), T (tymina) Cechy białek Alfabet 20-znakowy (aminokwasy): A (alanina), C (cysteina), D (kwas asparaginowy), E (kwas glutaminowy), F (fenyloalanina), G (glicyna), H (histydyna), I (izoleucyna), K (lizyna), L (leucyna), M (metionina), N (asparagina), P (prolina), Q (glutamina), R (arginina), S (seryna), T (treonina), V (walina), W (tryptofan), Y (tyrozyna)
Cechy DNA Alfabet 4-znakowy (zasady): A (adenina), C (cytozyna), G (guanina), T (tymina) Cechy białek Alfabet 20-znakowy (aminokwasy): A (alanina), C (cysteina), D (kwas asparaginowy), E (kwas glutaminowy), F (fenyloalanina), G (glicyna), H (histydyna), I (izoleucyna), K (lizyna), L (leucyna), M (metionina), N (asparagina), P (prolina), Q (glutamina), R (arginina), S (seryna), T (treonina), V (walina), W (tryptofan), Y (tyrozyna)
Struktura DNA i białek Inny typ redundancji niż zakładany przez klasyczne algorytmy Klasyczne algorytmy działają kiepsko
Redundancja w DNA Łańcuchy DNA zawierają niewiele powtórzeń, ale powtórzenia te są zwykle długie a nawet bardzo długie Powtórzenia często występują w bardzo odległych miejscach (nie ma lokalności jak w tekstach) Zasady A i T oraz C i G tworzą pary Często zdarzają się w łańcuchach powtórzenia odwrócone, w których zasady są zamienione, tj. za A jest T a za C jest G, np. AACTGT ACAGTT Powtórzenia są długie ale często zawierają drobne błędy (wynik rozmaitych mutacji)
Istniejące algorytmy BioCompress2 (Grumbach, Tahi, 1994) GenCompress-2 (Chen i in., 2000) DNACompress (Chen i in., 2002) MR2004 (Manzini Rastero, 2004) szybkie AN2006 (Adjeroh Nan, 2006) nowość
Czy naprawdę warto? Wyniki dla DNA są na poziomie 1.6 1.9 bita/znak (tylko sporadycznie jest istotnie lepiej) zważywszy na to, że 4-znakowy alfabet wymaga 2.0 bita/znak bez żadnej kompresji nie jest to osiągnięcie rewelacyjne Wyniki dla białek są na poziomie 2.3 3.4 bita/znak bez kompresji białka wymagają 4.32 bita/znak
Plan wykładu CTW 1 CTW 2 3
Kompresja różnicowa Sytuacja 1 Istnieją różne wersje tego samego pliku, np. na komputerze firmowym wersja aktualna, a na komputerze domowym starsza Chcemy uaktualnić wersję domową do wersji nowej, a prędkość łącza nie zwala z nóg Sytuacja 2 Rozprowadzamy uaktualnienie oprogramowania Uaktualnienie polega na podmianie części plików na nowe wersje, które jednak tylko nieznacznie różnią się od wersji poprzednich Chcemy zminimalizować rozmiar uaktualnienia, żeby użytkownicy mogli wygodnie i szybko ściągnąć dane
Kompresja różnicowa Sytuacja 1 Istnieją różne wersje tego samego pliku, np. na komputerze firmowym wersja aktualna, a na komputerze domowym starsza Chcemy uaktualnić wersję domową do wersji nowej, a prędkość łącza nie zwala z nóg Sytuacja 2 Rozprowadzamy uaktualnienie oprogramowania Uaktualnienie polega na podmianie części plików na nowe wersje, które jednak tylko nieznacznie różnią się od wersji poprzednich Chcemy zminimalizować rozmiar uaktualnienia, żeby użytkownicy mogli wygodnie i szybko ściągnąć dane
Kompresja różnicowa Obserwacje Dwie wersje plików różnią się tylko nieznacznie Obie strony dysponują starszą wersją pliku, więc zamiast przesyłać cały plik można przesłać tylko różnice Problem Jak to zrobić?
Kompresja różnicowa Obserwacje Dwie wersje plików różnią się tylko nieznacznie Obie strony dysponują starszą wersją pliku, więc zamiast przesyłać cały plik można przesłać tylko różnice Problem Jak to zrobić?
Kompresja różnicowa Metoda Do kompresji różnicowej świetnie nadają się algorytmy z rodziny Ziva Lempela Algorytm kompresji pracuje na dwóch plikach: starym i nowym Kompresowany jest tylko nowy plik w następujący sposób: Dla bieżącej pozycji w nowym pliku wyszukaj najdłuższe powtórzenie zarówno w całym starym pliku jak i w zakodowanym już fragmencie nowego pliku Zakoduj informacje o powtórzeniu Odbiorca (dekompresor) zna stary plik, więc nie będzie miał problemu z odkodowaniem takiej sekwencji
Kompresja różnicowa Czy to takie proste? Jeśli pliki są małe to tak Jeśli pliki są duże, to oczywiście w nowym pliku wyszukujemy dopasowania tylko w oknie o rozmiarze np. 32 KB Problemem może być stary plik, bo tam też powinniśmy przesuwać okno niestety nie jest oczywiste jak je przesuwać Istnieją różne heurystyki przesuwania okna w starym pliku
Kompresja różnicowa wyniki eksperymentalne Algorytmy vcdiff (Hunt i in., 1998) xdelta (MacDonald, 2000) zdelta (Trendafilov i in., 2002) Dane testowe gcc 2.7.0 i gcc 2.7.1 emacs 19.28 i emacs 19.29
Kompresja różnicowa wyniki eksperymentalne 2 Algorytm Rozmiar gcc [KB] Rozmiar emacs [KB] Bez kompresji 27 288 27 326 gzip 7 479 8 191 zdelta 250 1 465 2 Wyniki z K. Sayood, Lossless Compression Handbook, 2003
Zdalna synchronizacja plików Problem Dysponujemy jakąś wersją pliku Serwer dysponuje najnowszą wersją pliku Chcemy uaktualnić naszą wersję pliku do wersji, która znajduje się na serwerze Serwer nie dysponuje naszą wersją pliku, bo samodzielnie ją edytowaliśmy
Zdalna synchronizacja plików Obserwacje Duże części naszej wersji pliku i wersji serwera są identyczne Identyczne fragmenty mogą być przesunięte względem siebie (występują w różnych miejscach w plikach) Serwer nie zna naszej wersji pliku
Zdalna synchronizacja plików Algorytm 1 Klient dzieli swój plik na bloki rozmiaru rzędu kilkudziesięciu kilkuset KB 2 Klient dla każdego z bloków oblicza sumę kontrolną 3 Klient wysyła sumy kontrolne do serwera 4 Serwer wyszukuje w swojej wersji pliku takie miejsca, które mają identyczne sumy kontrolne 5 Serwer wysyła informacje o różnicach i nowe fragmenty pliku 6 Klient uaktualnia swoją wersję pliku
Zdalna synchronizacja plików wyniki eksperymentalne 3 Algorytm Rozmiar gcc [KB] Rozmiar emacs [KB] Bez kompresji 27 288 27 326 gzip 7 479 8 191 zdelta 250 1 465 rsync (skompresowany) 876 4 428 3 Wyniki z K. Sayood, Lossless Compression Handbook, 2003
Kompresja zdalnych sesji graficznych Sytuacja Pracujemy zdalnie na oddalonym komputerze np. za pomocą Podłączania pulpitu zdalnego Łącze jest stosunkowo wolne a chcemy pracować graficznie Jeden ekran komputera w rozdzielczości 1024 768 to ok. 2.25MB Wygodna praca wymaga przesyłania kilku takich ekranów na sekundę Kto ma łącze 10MB/s?
Kompresja zdalnych sesji graficznych Gdzie tu jest redundancja? Zwykle mało się zmienia na ekranie w krótkim czasie można przesyłać tylko na początku pełny ekran, a później tylko różnice, np. wynik operacji xor na kolejnych ekranach Okna aplikacji zawierają zwykle tylko kilkanaście kilkadziesiąt różnych kolorów nie potrzeba przesyłać 24bitów/piksel Sąsiednie piksele bardzo często są identyczne
Kompresja zdalnych sesji graficznych Czy to takie proste? Jeśli użytkownik przesuwa okno, to wynik po xor będzie całkiem duży można jednak każde okno przesyłać niezależnie Pulpit może być skomplikowanym obrazkiem można pulpit przesłać tylko raz i nakładać na niego przesyłane okna Nawet pierwsze przesłanie pulpitu może długo trwać na wolnym łączu można zrezygnować z przesyłania pulpitu (może użytkownik się pogodzi z tym dyskomfortem?)
Kompresja zdalnych sesji graficznych Co jeszcze można? Często użytkownik będzie na tyle zadowolony, że ma zdalny dostęp, że pewne niedogodności zaakceptuje Przykładowo można ograniczyć paletę kolorów do 256 na zdalnym pulpicie Przesyłane dane można (należy!) dodatkowo kompresować jakimś algorytmem
Kompresja specjalizowana Czy to już wszystkie możliwości? Zdecydowanie nie! W zasadzie wszystkie algorytmy kompresji obrazów, dźwięków, sekwencji wideo są algorytmami specjalizowanymi W szczególności specjalizowane muszą być algorytmy kompresji stratnej, ale o tym już na kolejnych wykładach...
P1 Kompresor plików w formacie.dbf (2 osoby) Idea Przeanalizować nagłówek pliku.dbf Kompresja kolumnami a nie wierszami (większe podobieństwa) Różne metody kompresji pól różnych typów: tekstowe np. LZSS + RangeCoder logiczne wprost RangeCoder numeryczne binarnie i ew. RangeCoder (pola numeryczne zapisane znakowo!) daty binarnie (pola daty zapisane znakowo!) Można zmienić kolejność kolumn Możliwe, że kodowanie różnic pomiędzy polami (np. daty) pomoże
P2 Kompresja pliku w formacie.dbf z zachowaniem dostępu swobodnego do rekordów (2 osoby) Idea Każdy rekord musi być zakodowany niezależnie od pozostałych: oprócz zakodowanych rekordów skompresowane dane winny zawierać, wspólny dla wszystkich rekordów, opis ich charakterystyki (np. słownik dla pól tekstowych) na podstawie którego poszczególne rekordy kodowane są niezależnie, ponieważ rekordy będą miały różne długości, konieczne będzie utworzenie indeksu (tablicy offsetów początków poszczególnych rekordów w pliku)
P2 Kompresja pliku w formacie.dbf z zachowaniem dostępu swobodnego do rekordów (2 osoby) Idea Operacja modyfikacji rekordu może zmienić jego rozmiar (w postaci skompresowanej): w takim przypadku należy umieścić go na końcu pliku, a jego poprzednią lokalizację oznaczyć jako puste miejsce (lub umieścić w wystarczająco dużym pustym miejscu pozostałym po innym rekordzie) zatem należy przechowywać również indeks/listę pustych miejsc w sposób podobny, jak wyżej, realizujemy usunięcie rekordu zaimplementować operację przebudowy skompresowanego pliku, która polegać będzie na usunięciu pustych miejsc; taka przebudowa powinna być wykonywana na żądanie oraz ewentualnie w sytuacji, gdy puste miejsca zajmują ponad (np.) 10% skompresowanego pliku W danych wspólnych dla wszystkich rekordów konieczna jest okresowa aktualizacja tych danych można ją przeprowadzać co n dodanych rekordów oraz łącznie z przebudową pliku
P3 Kompresja pliku w formacie.ini z zachowaniem dostępu swobodnego do sekcji i kluczy (1 osoba) Idea Temat bardzo podobny do tematu P2
P4 Klasa skompresowanego stringa (1 lub 2 osoby) Wymagania Opracować klasę packedstring funkcjonalnie odpowiadającą klasie string z biblioteki standardowej języka C++, ale potrafiącą wewnętrznie przechowywać łańcuch w postaci skompresowanej. Klasa packedstring przeznaczona jest do zastosowania tam, gdzie prawie wszystkie operacje na łańcuchach to operacja przypisania i operacje we/wy realizowane na całym łańcuchu oraz dopisywanie na końcu łańcucha innego łańcucha lub pojedynczego znaku. Można przyjąć, że typowy rozmiar łańcucha jest odpowiednio duży (kilkaset znaków).
P4 Klasa skompresowanego stringa (1 lub 2 osoby) Idea Rozwiązanie można zrealizować w oparciu o kodowanie słownikowe LZSS (ewentualnie LZSS + koder arytmetyczny ze stałym modelem) Przy dopisaniu, na końcu łańcucha, nowego znaku lub łańcucha, kompresja będzie efektywniejsza, jeżeli cofniemy się do początku ostatnio zakodowanej frazy i spróbujemy czy teraz nie znajdzie się dłuższa fraza (można również koniec łańcucha kodować z opóźnieniem) Poniżej pewnej granicznej długości łańcucha kompresja jest nieefektywna, więc klasa packedstring winna krótkie łańcuchy przechowywać nie skompresowane klasa powinna obsługiwać również pozostałe typowe operacje na łańcuchach (w tym np. swobodne indeksowanie znaków łańcucha, metodę c str(), itp.) niektóre takie operacje wymagać będą przejścia na nie skompresowaną reprezentację łańcucha i pozostawienia łańcucha w takiej postaci (np. spakowany napis[20]= a ); klasa powinna mieć metodę wymuszenia wewnętrznej reprezentacji skompresowanej lub nie
P5 Klasa C++ reprezentująca archiwum ZIP (2 osoby) Idea Standard formatu ZIP dopuszcza dwa algorytmy kompresji, które są implementowane za pomocą poznanych bibliotek: zlib oraz libbzip2 (patrz pierwsze laboratorium) Tematem projektu jest wykorzystanie obu tych bibliotek do stworzenia klasy języka C++ reprezentującej archiwum ZIP
P5 Klasa C++ reprezentująca archiwum ZIP (2 osoby) Wymagania Wymagane metody: Create utworzenie pustego archiwum Open otwarcie archiwum Close zamknięcie archiwum ListContents zwrócenie listy plików (do listy) GetHeader zwrócenie nagłówka konkretnego pliku z archiwum AddFile dodanie pliku do archiwum z kompresją (tu się ustala parametry kompresji) AddFileRaw dodanie do archiwum pliku skompresowanego (przydaje się kiedy trzeba przenosić plik z archiwum do archiwum np. przy wyrzucaniu niektórych plików, bądź zastępowaniu nową wersją) GetFile dekompresja pliku z archiwum GetFileRaw zwrócenie z archiwum pliku skompresowanego Klasa powinna także umożliwiać podpięcie przez użytkownika własnego paska postępu (np. poprzez odziedziczenie po jakiejś klasie bazowej) i własnej obsługi błędów
P6 Klasa C++ reprezentująca automat przechowujący leksykon (2 osoby) Wymagania Źródła automatu reprezentującego leksykon są dostępne na stronie http://www-zo.iinf.polsl.gliwice.pl/~sdeor/pub/cd00abs.htm Należy te źródła przerobić na C++ i dodać funkcjonalność zapisu automatu na dysk w postaci jeszcze bardziej skompresowanej (możliwy jest stopień kompresji 2:1 a nawet trochę więcej) Do kompresji należy wykorzystać RangeCoder Struktura wewnętrzna automatu Automat przechowywany jest wewnętrznie w postaci tablicy Tablica ta zawiera w kolejnych komórkach krawędzie Kilka (od 1 do kilkudziesięciu) kolejnych krawędzi opisuje jeden węzeł Każdy węzeł kończy się krawędzią, która ma ustawiony bit (znacznik)
P6 Klasa C++ reprezentująca automat przechowujący leksykon (2 osoby) Idea Znaczniki końca węzła są ustawione w większości krawędzi na 0, a tylko w tych kończących węzeł na 1 Znaczniki terminalności rzadziej są ustawione na 0 niż na 1 Krawędzie w węźle ułożone są w porządku alfabetycznym (w wersji podstawowej automatu), tj. kontekstem symbolu może być poprzedni symbol Adresy zawsze wskazują na niższe pozycje w tablicy Adres jest potencjalnie liczbą z zakresu [0, 2 22 1], więc należy go efektywnie kodować
P7 Porównanie kilku implementacji kodowania arytmetycznego (1 lub 2* osoby) Wymagania Przeprowadzić porównanie kilku publicznie dostępnych implementacji algorytmu kodowania arytmetycznego, porównywane implementacje ocenić pod względem: uzyskiwanych współczynników kompresji: dla rzeczywistych danych (np. korpusu Calgary) i prostego modelu danych (np. adaptacyjnego probabilistycznego modelu 1 rzędu, własnego lub gotowego); należy porównać wyniki pomiędzy różnymi implementacjami oraz porównać je z efektywnością idealnego kodera arytmetycznego (mierzoną dla użytego modelu danych tak, jak na ćwiczeniu 2) (*) oraz dla danych wygenerowanych przez kilka samodzielnie zaimplementowanych modeli źródeł o znanych entropiach prędkości kodowania i dekodowania (w miarę możliwości prędkości wyznaczyć dla kodowania, a nie kodowania i modelowania; można to zrealizować mierząc czasy (a) modelowania i kodowania oraz (b) tylko modelowania), łatwości użycia i jakości dokumentacji
P8 Porównanie algorytmów LZSS i LZW w zastosowaniu do kompresji dysku (1 osoba) Wymagania Przeprowadzić porównanie algorytmów LZSS i LZW (lub odmiany LZW-AP, tj. takiej, w której po zakodowaniu nowej frazy, do słownika wstawiamy nie tylko poprzednią frazę z dopisanym pierwszym znakiem nowej, ale też frazy złożone z poprzedniej frazy i wszystkich pref. nowej) Algorytmy testujemy w zastosowaniu do kompresji dysku (tj. tak, aby zachowana była możliwość częściowo swobodnego odczytu zakodowanych danych), co realizujemy następująco: skompresowane dane zapisujemy w klastrach o rozmiarze np. 4KB każdy, przy czym każdy klaster może zostać odkodowany niezależnie od pozostałych dla nas oznacza to, iż każdorazowo gdy rozmiar zakodowanych danych osiąga granicę klastra reinicjalizujemy słownik i kolejne dane kodujemy niezależnie od poprzednich aby dostęp był faktycznie swobodny, do zakodowanych danych powinniśmy dołączyć mapę/indeks z informacją jakim offsetom nieskompresowanego pliku odpowiadają początki kolejnych klastrów
P9 Algorytm kompresji oparty na transformacie Burrowsa Wheelera (2 osoby) Wymagania Zaimplementować algorytm kompresji oparty na transformacie Burrowsa Wheelera. Algorytm powinien składać się z następujących etapów: transformata Burrowsa Wheelera dowolna implementacja algorytmu sortowania, może być nawet qsort z języka C; trzeba tylko pamiętać aby nie przechowywać całej macierzy a tylko indeksy pozycji startowych transformata MTF w zupełności wystarcza tu naiwna implementacja, tj. utrzymujemy posortowaną tablicę i wyszukujemy symbol zawsze od początku, po czym przesuwamy go w tej tablicy na początek RangeCoder sposób modelowania można wybrać dowolny: jeden z omówionych na wykładzie bądź dowolny własny Otrzymany algorytm przetestować dla korpusu Calgary i porównać uzyskiwane współczynniki kompresji a także czas przynajmniej z bzip2 oraz gzip
P10 Algorytm kompresji różnicowej (2 osoby) Wymagania Opracować i zaimplementować algorytm kompresji różnicowej oparty na algorytmie LZSS Problem przesuwania okna w starej wersji pliku można rozwiązać na kilka sposobów: założyć, że najdłuższe znalezione dopasowania dla bieżącej pozycji w plikach starym i nowym wyznaczają punkt synchronizacji wyszukiwać w całym starym pliku wtedy trzeba odpowiednio zmodyfikować zapis dopasowania, aby były obsługiwane duże wartości. Pierwszy symbol trójek/par z algorytmu LZSS powinien mieć tu 3 wartości: brak dopasowania, dopasowanie w nowym pliku, dopasowanie w starym pliku. Opisy dopasowania w starym i nowym pliku mogą być kodowane w osobnych kontekstach dla poprawy współczynnika kompresji Przetestować program na kolejnych wersjach kilku (może być 2) dużych plików. Porównać współczynniki kompresji z osiąganymi przez algorytmy uniwersalne
P11 Kompresja plików XML (2 osoby) Wymagania Opracować i zaimplementować algorytm kompresji plików XML oparty na preprocesingu. Należy wykorzystać omówione na wykładzie przykłady redundancji w tych plikach Przetestować program na kilku plikach XML i porównać go z innymi znanymi algorytmami specjalizowanymi oraz z algorytmami uniwersalnymi