]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - doc/InformeTP3.lyx
Agrego el Mitico y Enigmatico Word Scaping al block sorting. Para usarlo usar parame...
[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 Subsection
418
419 Huffman Estático
420 \layout Standard
421
422 Si bien no ahondaremos en detalles de implementación que pueden observarse
423  en la documentación generada por doxygen que acompaña este informe, pasamos
424  a presentar la interfaz a través de la cual el usuario podrá utilizar este
425  compresor.
426  Antes, es necesario comentar que el estado del compresor, se mantiene a
427  través de una estructura definida como 
428 \series bold 
429 HUFF_STATE
430 \series default 
431 , en la cual se especificarán cosas tales como si el compresor actua sobre
432  archivos o chunks de datos, si es un huffman canonico o standard, archivo
433  a comprimir, archivo destino, etc.
434 \layout Paragraph
435
436
437 \series medium 
438 El compresor y/o descompresor Huffman Estático, será inicializado y desinicializ
439 ado utilizando las rutinas:
440 \layout Itemize
441
442
443 \family typewriter 
444 \noun on 
445 HUFF_STATE *shuff_init_encoder_byfile(char *inputfile, char *outputfile,
446  long volsize);
447 \layout Itemize
448
449
450 \family typewriter 
451 \noun on 
452 HUFF_STATE *shuff_init_encoder_bychunk(char *outputfile, long volsize);
453 \layout Itemize
454
455
456 \family typewriter 
457 \noun on 
458 HUFF_STATE *shuff_init_decoder(char *inputfile, char *outputfile);
459 \layout Itemize
460
461
462 \family typewriter 
463 \noun on 
464 void shuff_deinit_encoder(HUFF_STATE *shuff);
465 \layout Itemize
466
467
468 \family typewriter 
469 \noun on 
470 void shuff_deinit_decoder(HUFF_STATE *shuff);
471 \layout Standard
472
473 Para llevar a cabo la compresión efectiva de un archivo o chunks de datos,
474  se cuentan con las siguientes rutinas:
475 \layout Itemize
476
477
478 \family typewriter 
479 int shuff_encode_file(HUFF_STATE *shuff);
480 \layout Itemize
481
482
483 \family typewriter 
484 int shuff_decode_file(HUFF_STATE *shuff);
485 \layout Itemize
486
487
488 \family typewriter 
489 int shuff_scanfreq_chunk(HUFF_STATE *shuff, char* chunk, int chunksize);
490 \layout Itemize
491
492
493 \family typewriter 
494 int shuff_decode_chunk(HUFF_STATE *shuff, char *chunk, int chunksize, int
495  *decodedbytes);
496 \layout Paragraph
497
498 Operación sobre archivos o chunks
499 \layout Paragraph
500
501
502 \series medium 
503 Dado que se requería la utilización de este compresor en la etapa final
504  de un BS+MTF, el mismo proporciona funcionalidad para comprimir directamente
505  un archivo especificado, o bien para realizar la compresión de chunks de
506  datos, que en nuestro caso serán las salidas del Move to Front.
507 \layout Paragraph
508
509 Persistencia del Modelo Estadístico de Orden 0
510 \layout Paragraph
511
512
513 \series medium 
514 A fines de poder grabar o cargar un modelo de orden-0 el cual simplemente
515  consiste en una tabla de frecuencias/probabilidades de los 255 symbolos
516  posibles en un archivo, dando lugar al Huffman Canónico que será explicado
517  posteriormente, se cuenta con dos funciones: 
518 \family typewriter 
519 shuff_save_model()
520 \family default 
521 , y 
522 \family typewriter 
523 shuff_load_model()
524 \layout Section
525
526
527 \begin_inset LatexCommand \label{sec:Features-Especiales}
528
529 \end_inset 
530
531 Optimizaciones y Características adicionales
532 \layout Standard
533
534 Como fue anticipado al inicio de este documento, nuestro compresor cuenta
535  con funcionalidad extra que permite en ciertos casos obtener mejores niveles
536  de compresión.
537  Pasamos a describir las mismas una por una, terminando por último con una
538  optimización específica para textos.
539 \layout Subsection
540
541 Huffman Canónico
542 \layout Standard
543
544 Dada la naturaleza del Huffman Estático que hemos implementado como el compresor
545  estadístico final de la cadena 
546 \series bold 
547 BS+MTF+Compresor
548 \series default 
549 , el mismo se vale de un modelo estadístico de orden-0, el cual es obtenido
550  realizando una pasada inicial al archivo a comprimir, en la cual obtiene
551  una tabla de frecuencias/probabilidades, y la cual es utilizada para generar
552  el árbol de Huffman, que a su vez da origen a una tabla de códigos prefijos
553  que finalmente es utilizada en el compresor, para codificar los símbolos
554  o caracteres del archivo original.
555 \layout Standard
556
557 Dicho esto, destacamos la extensión que hemos realizado a nuestro compresor
558  de Huffman para que pueda guardar y/o cargar un modelo estadístico de orden-0
559  y el usuario pueda por ejemplo utilizar para comprimir cualquier archivo
560  de texto, un modelo que él crea óptimo para la compresión de dichos archivos,
561  en vez de generar un modelo diferente para cada archivo que comprime.
562 \layout Standard
563
564 Esta capacidad de un compresor de Huffman, se la conoce como Huffman Canónico,
565  y se encuentra presente en nuestro compresor.
566  Para saber más sobre su modo de uso, dirigirse a la sección
567 \series bold 
568  
569 \begin_inset LatexCommand \ref{sub:Execution-Flags}
570
571 \end_inset 
572
573
574 \series default 
575 .
576 \layout Subsection
577
578 Zero Grouping
579 \layout Standard
580
581 Este algoritmo se aplica a la salida del 
582 \series bold 
583 MTF
584 \series default 
585  que, gracias al 
586 \series bold 
587 BS
588 \series default 
589  que aumenta la localidad, genera estadísticamente muchas secuencias de
590  ceros repetidos.
591  Como el Huffman Estático no aprovecha esta característica (comprime igual
592  
593 \family typewriter 
594 000001234
595 \family default 
596  que 
597 \family typewriter 
598 010203040
599 \family default 
600 ), se buscó un método que sí la explote para optimizar el compresor y se
601  llegó a un algoritmo muy simple que bautizamos 
602 \series bold 
603 Zero Grouping
604 \series default 
605 .
606 \layout Standard
607
608 Cada secuencia de ceros se codifica con 2 bytes, el primero es siempre 0
609  (
610 \family typewriter 
611 0x00
612 \family default 
613 ) y el segundo indica la cantidad de ceros que le siguen.
614  En el caso de haber un byte de valor cero aislado, también se codifica
615  con 2 bytes (
616 \family typewriter 
617 0x00 0x00
618 \family default 
619 , que indica que viene un cero y luego de ese cero no viene ningún cero
620  más), expandiendo la salida, pero estos son casos aislados que estadísticamente
621  se ven superados por la cantidad de secuencias largas de ceros que son
622  comprimidas a sólo 2 bytes.
623  Además, la salida del 
624 \series bold 
625 ZG
626 \series default 
627  (Zero Grouping) es comprimida con Huffman por lo que en casos extremos
628  la expansión no se manifiesta en forma notoria.
629 \layout Standard
630
631 Como la cantidad de ceros que le siguen al primero en una secuencia es expresada
632  con un byte, sólo se pueden comprimir a 2 bytes secuencias de hasta 256
633  ceros (el primer cero más los 0-255 siguientes).
634  De haber secuencias con mayor cantidad de ceros, simplemente se generan
635  
636 \family typewriter 
637 N
638 \family default 
639  
640 \emph on 
641 grupos
642 \emph default 
643  (siendo 
644 \family typewriter 
645 N
646 \family default 
647  la cantidad de ceros en la secuencia dividido 256, redondeando hacia arriba)
648  de 2 bytes cada uno.
649  Por ejemplo, una secuencia de 257 ceros será expresada como 
650 \family typewriter 
651 0x00 0xFF 0x00 0x00
652 \family default 
653  (2 grupos) y una de 525 como 
654 \family typewriter 
655 0x00 0xFF 0x00 0xFF 0x00 0x0B
656 \family default 
657  (3 grupos).
658  Nuevamente, se comprobó estadísticamente que las secuencias de ceros rara
659  vez superan los 50 ceros seguidos, por lo que de utilizar más de un byte
660  para expresar la cantidad de ceros que siguen al primero se obtendrían
661  peores resultados.
662 \layout Subsubsection*
663
664 Ejemplo:
665 \layout LyX-Code
666
667
668 \size scriptsize 
669 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
670  4 0 0 1 0   2
671 \layout LyX-Code
672
673
674 \size scriptsize 
675 Salida de ZG:  0 5         1 5 3 0 3     12 0 0 1 0 8               1 1
676  4 0 1 1 0 0 2
677 \layout LyX-Code
678
679
680 \size scriptsize 
681                                             |                          
682          |
683 \layout LyX-Code
684
685
686 \size scriptsize 
687                                          expandió                      
688       expandió
689 \layout Standard
690
691 Como se puede ver, la salida del MTF es de 33 bytes, mientras que la del
692  
693 \series bold 
694 ZG
695 \series default 
696  es de 22 (incluso cuando hubieron expansiones).
697  Como se podrá ver en las pruebas del capítulo 
698 \begin_inset LatexCommand \vref{cha:Benchmarks}
699
700 \end_inset 
701
702 , en la mayoría de los casos se logra una mejora introduciendo este algoritmo,
703  y en casos extremos esta mejora llega obtener resultados con la mitad de
704  bpb (bits por byte) que la salida original del 
705 \series bold 
706 MTF
707 \series default 
708 .
709 \layout Subsection
710
711 Word-Scaping
712 \layout Standard
713
714 Esta optimización se ha realizado específicamente para mejorar la compresión
715  de archivos de texto.
716  La base de esta técnica es la previa confección de un diccionario de palabras
717  (en nuestro caso 255 palabras máximo), a través del cual aplicando un pre-proce
718 samiento al archivo a comprimir, reemplazamos las palabras de ese diccionario
719  que se encuentren en el archivo, por un código de escape sucedido por el
720  índice en el diccionario de la palabra que se abrevia.
721 \layout Standard
722
723 Es decir, si tenemos el siguiente diccionario de 4 palabras: 
724 \family typewriter 
725 padre
726 \family default 
727
728 \family typewriter 
729 él
730 \family default 
731
732 \family typewriter 
733 nos
734 \family default 
735
736 \family typewriter 
737 superman
738 \family default 
739 ; y poseemos el texto: 
740 \emph on 
741
742 \begin_inset Quotes eld
743 \end_inset 
744
745 El 
746 \family typewriter 
747 padre
748 \family default 
749  de 
750 \family typewriter 
751 superman
752 \family default 
753  es el hombre araña
754 \begin_inset Quotes erd
755 \end_inset 
756
757
758 \emph default 
759 , luego del pre-procesamiento tendremos: 
760 \emph on 
761
762 \begin_inset Quotes eld
763 \end_inset 
764
765 El 
766 \family typewriter 
767 [escape][
768 \backslash 
769 0x00]
770 \family default 
771  de 
772 \family typewriter 
773 [escape][
774 \backslash 
775 0x03]
776 \family default 
777  es el hombre araña
778 \begin_inset Quotes erd
779 \end_inset 
780
781
782 \emph default 
783 .
784 \layout Standard
785
786 Para la confección de un buen diccionario, hemos desarrollado una utilidad
787  que contabiliza las 255 palabras que más aparecen dentro de una fuente
788  especificada, y luego del análisis de varios textos en castellano de toda
789  índole (informáticos, novelas, noticias), se obtiene el diccionario que
790  será entregado con el software.
791 \layout Section
792
793 Documentación de la API
794 \layout Standard
795
796 Para obtener una documentación de la API, se incluye en formato HTML en
797  el CD-ROM la documentación generada con Doxygen para los distintos componentes
798  del compresor.
799  Esta documentación se encuentra en el directorio 
800 \family typewriter 
801 doc/api/html
802 \family default 
803 .
804 \layout Chapter
805
806
807 \begin_inset LatexCommand \label{cha:Benchmarks}
808
809 \end_inset 
810
811 Benchmarks
812 \layout Section
813
814 Prueba Calgary Corpus
815 \layout Standard
816
817 El set de prueba Calgary Corpus Test es utilizado internacionalmente para
818  la prueba y comparación de compresores, contando con archivos diseñados
819  especificamente para estos fines.
820  Es por ello que hemos utilizado dicho set y a continuación exponemos los
821  resultados:
822 \layout Paragraph
823
824 Bench 1) JACU vs GZIP vs BZIP2
825 \layout Standard
826
827 Se prueba el set de Calgary utilizando nuestro compresor, y enfrentandolo
828  al GZIP y BZIP2 en términos de tiempo utilizado para la compresion y nivel
829  de compresión (Bits per Byte).
830  Los resultados a continuación:
831 \layout Standard
832
833 \the_end