]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - doc/InformeTP3.lyx
aporto un poco al informe, cuando se me ocurra algo mas lo meto
[z.facultad/75.06/jacu.git] / doc / InformeTP3.lyx
1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
2 \lyxformat 221
3 \textclass book
4 \language spanish
5 \inputencoding auto
6 \fontscheme palatino
7 \graphics default
8 \paperfontsize default
9 \spacing single 
10 \papersize a4paper
11 \paperpackage widemarginsa4
12 \use_geometry 0
13 \use_amsmath 0
14 \use_natbib 0
15 \use_numerical_citations 0
16 \paperorientation portrait
17 \secnumdepth 3
18 \tocdepth 3
19 \paragraph_separation indent
20 \defskip medskip
21 \quotes_language english
22 \quotes_times 2
23 \papercolumns 1
24 \papersides 1
25 \paperpagestyle default
26
27 \layout Title
28
29 Organización de Datos (75.06)
30 \newline 
31 Trabajo Práctico 3
32 \newline 
33 JACU
34 \layout Author
35
36
37 \series bold 
38 Grupo 11
39 \series default 
40
41 \newline 
42 Nicolás Dimov (77624)
43 \newline 
44 Alan Kennedy (78907)
45 \newline 
46 Leandro Lucarella (77891)
47 \newline 
48 Ricardo Markiewicz (78226)
49 \layout Date
50
51 Primera Entrega, 28 de Junio del 2004
52 \layout Standard
53
54
55 \begin_inset LatexCommand \tableofcontents{}
56
57 \end_inset 
58
59
60 \layout Chapter
61
62 Introducción
63 \layout Section
64
65 Método de compresión utilizado
66 \layout Standard
67
68 Dada la asignación de confeccionar un compresor de archivos de cualquier
69  índole, con alguna optimización particular para archivos de texto, hemos
70  optado por la implementación del esquema: 
71 \series bold 
72 Block Sorting + Move to front + Huffman Estático.
73  
74 \layout Standard
75
76 Si bien un compresor estadístico final más robusto como el 
77 \series bold 
78 PPMC
79 \series default 
80  o bien un 
81 \series bold 
82 Huffman Dinámico
83 \series default 
84  podrían producir niveles de compresión un tanto mejores, a fines de resguardar
85  la confección de un compresor estable y poseer tiempo suficiente para realizar
86  pruebas y optimizaciones, se optó por el 
87 \series bold 
88 Huffman Estático
89 \series default 
90 .
91  No obstante, se comparó con una implementación de 
92 \series bold 
93 Huffman Dinámico
94 \series default 
95  de ejemplo obtenida de Internet y se observaron que los resultados eran
96  muy similares, a veces obteniendo un mejor nivel de compresión y a veces
97  obteniendo uno peor, descartando luego de estas pruebas la posibilidad
98  de extender el estático al dinámico.
99 \layout Standard
100
101 Además de la capacidad natural de todo compresor (esto es, de comprimir/descompr
102 imir), la implementación que describiremos a continuación cuenta con característ
103 icas especiales que se verán detallados en la 
104 \series bold 
105 sección 
106 \begin_inset LatexCommand \ref{sec:Features-Especiales}
107
108 \end_inset 
109
110
111 \series default 
112 .
113  Dichas características se resumen a:
114 \layout Itemize
115
116 Persistencia del Modelo Orden-0 de 
117 \series bold 
118 Huffman Estático
119 \series default 
120  (
121 \series bold 
122 Huffman Canónico
123 \series default 
124 )
125 \layout Itemize
126
127
128 \series bold 
129 Zero Grouping
130 \series default 
131  (Agrupación de Ceros, aplicado a la salida del 
132 \series bold 
133 MTF
134 \series default 
135 )
136 \layout Itemize
137
138
139 \series bold 
140 Word-Scaping
141 \series default 
142  (Optimización para textos detallada posteriormente)
143 \layout Section
144
145 Modo de uso
146 \layout Standard
147
148 Antes de pasar a la descripción de la implementación de nuestro compresor,
149  detallaremos el modo de uso.
150 \layout Subsection
151
152 Invocación simple
153 \layout Paragraph
154
155
156 \series medium 
157 Como hemos ancitipado anteriormente, el compresor cuenta con features especiales
158  que pueden ser utilizados a través de opciones en la invocación del programa.
159  Antes de pasar a su descripción, notamos la invocación general para comprimir
160  y descomprimir un archivo como se pidió en el enunciado
161 \begin_inset Foot
162 collapsed true
163
164 \layout Standard
165
166 Nótese que 
167 \family typewriter 
168 grupo11
169 \family default 
170  es un enlace simbólico a 
171 \family typewriter 
172 jacu
173 \family default 
174 , nombre real del ejecutable.
175 \end_inset 
176
177 .
178 \layout Paragraph*
179
180 Compresión:
181 \layout Standard
182
183
184 \family typewriter 
185 \series medium 
186 ./grupo11 -c [-t volsize] sourcefile targetfile
187 \layout Standard
188
189
190 \series medium 
191 Siendo 
192 \family typewriter 
193 sourcefile
194 \family default 
195  el nombre del archivo a comprimir y 
196 \family typewriter 
197 targetfile
198 \family default 
199  el nombre del archivo comprimido.
200 \layout Paragraph*
201
202 Descompresión:
203 \layout Standard
204
205
206 \family typewriter 
207 \series medium 
208 ./grupo11 -d sourcefile targetfile
209 \layout Standard
210
211
212 \series medium 
213 Siendo 
214 \family typewriter 
215 sourcefile
216 \family default 
217  el nombre del archivo a descomprimir y 
218 \family typewriter 
219 targetfile
220 \family default 
221  el nombre del archivo descomprimido.
222 \layout Paragraph*
223
224 Nota:
225 \layout Standard
226
227 La opción 
228 \family typewriter 
229 -t
230 \family default 
231  pcional que permite generar un archivo comprimido multivolumen, donde volsize
232  será el tamaño en kbytes de cada volúmen, excepto el último que podrá ser
233  menor.
234 \layout Subsection
235
236
237 \begin_inset LatexCommand \label{sub:Execution-Flags}
238
239 \end_inset 
240
241 Opciones adicionales
242 \layout Standard
243
244 Ademas de los flags standards que hemos visto recién, nuestro compresor
245  cuenta con otra serie de ellos para la utilización de los features especiales
246  que veremos más adelante.
247  A fines de documentar la totalidad de los flags de ejecución, detallamos
248  los anteriores y los adicionales a continuación:
249 \layout List
250 \labelwidthstring 00.00.0000
251
252
253 \family typewriter 
254 -c
255 \family default 
256  Indica que se desea comprimir un archivo (mutualmente exclusivo con 
257 \family typewriter 
258 -d
259 \family default 
260 , al menos uno debe estar presente).
261 \layout List
262 \labelwidthstring 00.00.0000
263
264
265 \family typewriter 
266 -d
267 \family default 
268  Indica que se desea descomprimir un archivo (mutualmente exclusivo con
269  
270 \family typewriter 
271 -c
272 \family default 
273 , al menos uno debe estar presente).
274 \layout List
275 \labelwidthstring 00.00.0000
276
277
278 \family typewriter 
279 -t
280 \family default 
281  Indica que se desea un archivo comprimido en multivolumenes.
282  Seguido a dicho flag se debe indicar el tamaño en KBytes que se desea para
283  los volúmenes.
284 \layout List
285 \labelwidthstring 00.00.0000
286
287
288 \family typewriter 
289 -z
290 \family default 
291  Puede ser utilizado únicamente en una compresión y activa el feature de
292  
293 \series bold 
294 Zero Grouping
295 \series default 
296 .
297 \layout List
298 \labelwidthstring 00.00.0000
299
300
301 \family typewriter 
302 -s
303 \family default 
304  Puede ser utilizado únicamente en una compresión y graba el modelo de orden-0
305  de 
306 \series bold 
307 Huffman
308 \series default 
309  generado durante la compresión del archivo (en un archivo de extensión
310  
311 \family typewriter 
312 \series bold 
313 .
314 \series default 
315 ftb
316 \family default 
317 ), para que luego pueda ser reutilizado en otra compresión.
318 \layout List
319 \labelwidthstring 00.00.0000
320
321
322 \family typewriter 
323 -m
324 \family default 
325  Puede ser utilizado únicamente en una compresión y carga un modelo de orden-0
326  de 
327 \series bold 
328 Huffman
329 \series default 
330  para ser utilizado en la compresión del archivo especificado, evitando
331  el escaneado del archivo a comprimir.
332  Deberá ser sucedido por el nombre del archivo que posee el modelo.
333 \layout List
334 \labelwidthstring 00.00.0000
335
336
337 \family typewriter 
338 -q
339 \family default 
340  Especifica la calidad (nivel) de compresión.
341  Puede ser un valor entre 0 y 9, siendo 0 el menor nivel de compresión (más
342  rápido) y 9 el máximo (más lento).
343  Por omisión se utiliza un nivel de compresión 5.
344 \layout Subsubsection*
345
346 Ejemplos
347 \layout Standard
348
349 Damos a continuación unos breves ejemplos de invocación utilizando diferentes
350  opciones:
351 \layout Itemize
352
353 Compresión multivolumen (de 1024KB, cada uno):
354 \family typewriter 
355
356 \newline 
357 ./grupo11 -c -t 1024 libro.txt libro.j
358 \layout Itemize
359
360 Compresión con 
361 \series bold 
362 Zero Grouping
363 \series default 
364
365 \newline 
366
367 \family typewriter 
368 ./grupo11 -cz libro.txt libro.j
369 \layout Itemize
370
371 Compresión grabando modelo de 
372 \series bold 
373 Huffman Canónico
374 \series default 
375
376 \newline 
377
378 \family typewriter 
379 ./grupo11 -cs libro.txt libro.j
380 \layout Itemize
381
382 Compresión con carga de 
383 \series bold 
384 Huffman Canónico
385 \series default 
386
387 \newline 
388
389 \family typewriter 
390 ./grupo11 -c libro.txt libro.j -m modelo.ftb
391 \layout Itemize
392
393 Compresión de máxima calidad y volúmenes de 100KB: 
394 \newline 
395
396 \family typewriter 
397 ./grupo11 -czt100 -q9 libro.txt libro.j
398 \layout Itemize
399
400 Descompresión de cualquiera de los anteriores: 
401 \newline 
402
403 \family typewriter 
404 ./grupo11 -d libro.j libro_descomprimido.txt
405 \layout Chapter
406
407 Implementación
408 \layout Section
409
410 Especificaciones
411 \layout Subsection
412
413 Block Sorting
414 \layout Subsection
415
416 Move to Front
417 \layout Standard
418
419 La idea básica del move to front es mantener una lista que represente los
420  símbolos del archivo o bloque a procesar, y a su vez coloca los símbolos
421  mas frecuentes al frente de esta lista.
422 \layout Standard
423
424 Un símbolo es codificado como el índice (ó posición) en la lista de símbolos
425  inicial (la cual contiene a todos los símbolos diferentes del archivo o
426  bloque de datos).
427  Al comenzar el proceso, se leen uno por uno los símbolos del archivo o
428  bloque original y este mismo símbolo es promovido hacia el frente de la
429  lista, de esta los símbolos mas frecuentes tienden a posicionarse al frente
430  de la lista.
431 \layout Subsection
432
433 Huffman Estático
434 \layout Standard
435
436 Si bien no ahondaremos en detalles de implementación que pueden observarse
437  en la documentación generada por doxygen que acompaña este informe, pasamos
438  a presentar la interfaz a través de la cual el usuario podrá utilizar este
439  compresor.
440  Antes, es necesario comentar que el estado del compresor, se mantiene a
441  través de una estructura definida como 
442 \series bold 
443 HUFF_STATE
444 \series default 
445 , en la cual se especificarán cosas tales como si el compresor actua sobre
446  archivos o chunks de datos, si es un huffman canonico o standard, archivo
447  a comprimir, archivo destino, etc.
448 \layout Paragraph
449
450
451 \series medium 
452 El compresor y/o descompresor Huffman Estático, será inicializado y desinicializ
453 ado utilizando las rutinas:
454 \layout Itemize
455
456
457 \family typewriter 
458 \noun on 
459 HUFF_STATE *shuff_init_encoder_byfile(char *inputfile, char *outputfile,
460  long volsize);
461 \layout Itemize
462
463
464 \family typewriter 
465 \noun on 
466 HUFF_STATE *shuff_init_encoder_bychunk(char *outputfile, long volsize);
467 \layout Itemize
468
469
470 \family typewriter 
471 \noun on 
472 HUFF_STATE *shuff_init_decoder(char *inputfile, char *outputfile);
473 \layout Itemize
474
475
476 \family typewriter 
477 \noun on 
478 void shuff_deinit_encoder(HUFF_STATE *shuff);
479 \layout Itemize
480
481
482 \family typewriter 
483 \noun on 
484 void shuff_deinit_decoder(HUFF_STATE *shuff);
485 \layout Standard
486
487 Para llevar a cabo la compresión efectiva de un archivo o chunks de datos,
488  se cuentan con las siguientes rutinas:
489 \layout Itemize
490
491
492 \family typewriter 
493 int shuff_encode_file(HUFF_STATE *shuff);
494 \layout Itemize
495
496
497 \family typewriter 
498 int shuff_decode_file(HUFF_STATE *shuff);
499 \layout Itemize
500
501
502 \family typewriter 
503 int shuff_scanfreq_chunk(HUFF_STATE *shuff, char* chunk, int chunksize);
504 \layout Itemize
505
506
507 \family typewriter 
508 int shuff_decode_chunk(HUFF_STATE *shuff, char *chunk, int chunksize, int
509  *decodedbytes);
510 \layout Paragraph
511
512 Operación sobre archivos o chunks
513 \layout Paragraph
514
515
516 \series medium 
517 Dado que se requería la utilización de este compresor en la etapa final
518  de un BS+MTF, el mismo proporciona funcionalidad para comprimir directamente
519  un archivo especificado, o bien para realizar la compresión de chunks de
520  datos, que en nuestro caso serán las salidas del Move to Front.
521 \layout Paragraph
522
523 Persistencia del Modelo Estadístico de Orden 0
524 \layout Paragraph
525
526
527 \series medium 
528 A fines de poder grabar o cargar un modelo de orden-0 el cual simplemente
529  consiste en una tabla de frecuencias/probabilidades de los 255 symbolos
530  posibles en un archivo, dando lugar al Huffman Canónico que será explicado
531  posteriormente, se cuenta con dos funciones: 
532 \family typewriter 
533 shuff_save_model()
534 \family default 
535 , y 
536 \family typewriter 
537 shuff_load_model()
538 \layout Section
539
540
541 \begin_inset LatexCommand \label{sec:Features-Especiales}
542
543 \end_inset 
544
545 Optimizaciones y Características adicionales
546 \layout Standard
547
548 Como fue anticipado al inicio de este documento, nuestro compresor cuenta
549  con funcionalidad extra que permite en ciertos casos obtener mejores niveles
550  de compresión.
551  Pasamos a describir las mismas una por una, terminando por último con una
552  optimización específica para textos.
553 \layout Subsection
554
555 Huffman Canónico
556 \layout Standard
557
558 Dada la naturaleza del Huffman Estático que hemos implementado como el compresor
559  estadístico final de la cadena 
560 \series bold 
561 BS+MTF+Compresor
562 \series default 
563 , el mismo se vale de un modelo estadístico de orden-0, el cual es obtenido
564  realizando una pasada inicial al archivo a comprimir, en la cual obtiene
565  una tabla de frecuencias/probabilidades, y la cual es utilizada para generar
566  el árbol de Huffman, que a su vez da origen a una tabla de códigos prefijos
567  que finalmente es utilizada en el compresor, para codificar los símbolos
568  o caracteres del archivo original.
569 \layout Standard
570
571 Dicho esto, destacamos la extensión que hemos realizado a nuestro compresor
572  de Huffman para que pueda guardar y/o cargar un modelo estadístico de orden-0
573  y el usuario pueda por ejemplo utilizar para comprimir cualquier archivo
574  de texto, un modelo que él crea óptimo para la compresión de dichos archivos,
575  en vez de generar un modelo diferente para cada archivo que comprime.
576 \layout Standard
577
578 Esta capacidad de un compresor de Huffman, se la conoce como Huffman Canónico,
579  y se encuentra presente en nuestro compresor.
580  Para saber más sobre su modo de uso, dirigirse a la sección
581 \series bold 
582  
583 \begin_inset LatexCommand \ref{sub:Execution-Flags}
584
585 \end_inset 
586
587
588 \series default 
589 .
590 \layout Subsection
591
592 Zero Grouping
593 \layout Standard
594
595 Este algoritmo se aplica a la salida del 
596 \series bold 
597 MTF
598 \series default 
599  que, gracias al 
600 \series bold 
601 BS
602 \series default 
603  que aumenta la localidad, genera estadísticamente muchas secuencias de
604  ceros repetidos.
605  Como el Huffman Estático no aprovecha esta característica (comprime igual
606  
607 \family typewriter 
608 000001234
609 \family default 
610  que 
611 \family typewriter 
612 010203040
613 \family default 
614 ), se buscó un método que sí la explote para optimizar el compresor y se
615  llegó a un algoritmo muy simple que bautizamos 
616 \series bold 
617 Zero Grouping
618 \series default 
619 .
620 \layout Standard
621
622 Cada secuencia de ceros se codifica con 2 bytes, el primero es siempre 0
623  (
624 \family typewriter 
625 0x00
626 \family default 
627 ) y el segundo indica la cantidad de ceros que le siguen.
628  En el caso de haber un byte de valor cero aislado, también se codifica
629  con 2 bytes (
630 \family typewriter 
631 0x00 0x00
632 \family default 
633 , que indica que viene un cero y luego de ese cero no viene ningún cero
634  más), expandiendo la salida, pero estos son casos aislados que estadísticamente
635  se ven superados por la cantidad de secuencias largas de ceros que son
636  comprimidas a sólo 2 bytes.
637  Además, la salida del 
638 \series bold 
639 ZG
640 \series default 
641  (Zero Grouping) es comprimida con Huffman por lo que en casos extremos
642  la expansión no se manifiesta en forma notoria.
643 \layout Standard
644
645 Como la cantidad de ceros que le siguen al primero en una secuencia es expresada
646  con un byte, sólo se pueden comprimir a 2 bytes secuencias de hasta 256
647  ceros (el primer cero más los 0-255 siguientes).
648  De haber secuencias con mayor cantidad de ceros, simplemente se generan
649  
650 \family typewriter 
651 N
652 \family default 
653  
654 \emph on 
655 grupos
656 \emph default 
657  (siendo 
658 \family typewriter 
659 N
660 \family default 
661  la cantidad de ceros en la secuencia dividido 256, redondeando hacia arriba)
662  de 2 bytes cada uno.
663  Por ejemplo, una secuencia de 257 ceros será expresada como 
664 \family typewriter 
665 0x00 0xFF 0x00 0x00
666 \family default 
667  (2 grupos) y una de 525 como 
668 \family typewriter 
669 0x00 0xFF 0x00 0xFF 0x00 0x0B
670 \family default 
671  (3 grupos).
672  Nuevamente, se comprobó estadísticamente que las secuencias de ceros rara
673  vez superan los 50 ceros seguidos, por lo que de utilizar más de un byte
674  para expresar la cantidad de ceros que siguen al primero se obtendrían
675  peores resultados.
676 \layout Subsubsection*
677
678 Ejemplo:
679 \layout LyX-Code
680
681
682 \size scriptsize 
683 Salida de MTF: 0 0 0 0 0 0 1 5 3 0 0 0 0 12 0   1 0 0 0 0 0 0 0 0 0 1 1
684  4 0 0 1 0   2
685 \layout LyX-Code
686
687
688 \size scriptsize 
689 Salida de ZG:  0 5         1 5 3 0 3     12 0 0 1 0 8               1 1
690  4 0 1 1 0 0 2
691 \layout LyX-Code
692
693
694 \size scriptsize 
695                                             |                          
696          |
697 \layout LyX-Code
698
699
700 \size scriptsize 
701                                          expandió                      
702       expandió
703 \layout Standard
704
705 Como se puede ver, la salida del MTF es de 33 bytes, mientras que la del
706  
707 \series bold 
708 ZG
709 \series default 
710  es de 22 (incluso cuando hubieron expansiones).
711  Como se podrá ver en las pruebas del capítulo 
712 \begin_inset LatexCommand \vref{cha:Benchmarks}
713
714 \end_inset 
715
716 , en la mayoría de los casos se logra una mejora introduciendo este algoritmo,
717  y en casos extremos esta mejora llega obtener resultados con la mitad de
718  bpb (bits por byte) que la salida original del 
719 \series bold 
720 MTF
721 \series default 
722 .
723 \layout Subsection
724
725 Word-Scaping
726 \layout Standard
727
728 Esta optimización se ha realizado específicamente para mejorar la compresión
729  de archivos de texto.
730  La base de esta técnica es la previa confección de un diccionario de palabras
731  (en nuestro caso 255 palabras máximo), a través del cual aplicando un pre-proce
732 samiento al archivo a comprimir, reemplazamos las palabras de ese diccionario
733  que se encuentren en el archivo, por un código de escape sucedido por el
734  índice en el diccionario de la palabra que se abrevia.
735 \layout Standard
736
737 Es decir, si tenemos el siguiente diccionario de 4 palabras: 
738 \family typewriter 
739 padre
740 \family default 
741
742 \family typewriter 
743 él
744 \family default 
745
746 \family typewriter 
747 nos
748 \family default 
749
750 \family typewriter 
751 superman
752 \family default 
753 ; y poseemos el texto: 
754 \emph on 
755
756 \begin_inset Quotes eld
757 \end_inset 
758
759 El 
760 \family typewriter 
761 padre
762 \family default 
763  de 
764 \family typewriter 
765 superman
766 \family default 
767  es el hombre araña
768 \begin_inset Quotes erd
769 \end_inset 
770
771
772 \emph default 
773 , luego del pre-procesamiento tendremos: 
774 \emph on 
775
776 \begin_inset Quotes eld
777 \end_inset 
778
779 El 
780 \family typewriter 
781 [escape][
782 \backslash 
783 0x00]
784 \family default 
785  de 
786 \family typewriter 
787 [escape][
788 \backslash 
789 0x03]
790 \family default 
791  es el hombre araña
792 \begin_inset Quotes erd
793 \end_inset 
794
795
796 \emph default 
797 .
798 \layout Standard
799
800 Para la confección de un buen diccionario, hemos desarrollado una utilidad
801  que contabiliza las 255 palabras que más aparecen dentro de una fuente
802  especificada, y luego del análisis de varios textos en castellano de toda
803  índole (informáticos, novelas, noticias), se obtiene el diccionario que
804  será entregado con el software.
805 \layout Section
806
807 Documentación de la API
808 \layout Standard
809
810 Para obtener una documentación de la API, se incluye en formato HTML en
811  el CD-ROM la documentación generada con Doxygen para los distintos componentes
812  del compresor.
813  Esta documentación se encuentra en el directorio 
814 \family typewriter 
815 doc/api/html
816 \family default 
817 .
818 \layout Chapter
819
820
821 \begin_inset LatexCommand \label{cha:Benchmarks}
822
823 \end_inset 
824
825 Benchmarks
826 \layout Section
827
828 Prueba Calgary Corpus
829 \layout Standard
830
831 El set de prueba Calgary Corpus Test es utilizado internacionalmente para
832  la prueba y comparación de compresores, contando con archivos diseñados
833  especificamente para estos fines.
834  Es por ello que hemos utilizado dicho set y a continuación exponemos los
835  resultados:
836 \layout Paragraph
837
838 Bench 1) JACU vs GZIP vs BZIP2
839 \layout Standard
840
841 Se prueba el set de Calgary utilizando nuestro compresor, y enfrentandolo
842  al GZIP y BZIP2 en términos de tiempo utilizado para la compresion y nivel
843  de compresión (Bits per Byte).
844  Los resultados a continuación:
845 \layout Standard
846
847 \the_end