Предыдущий блок | Следующий блок | Вернуться в индекс |
— RU.COMPRESS From : Eugene D. Shelwien 2:5020/400 21 Aug 01 02:49:06 To : Leonid Broukhis Subj : Re: И еще по поводу rangecoder-а From: "Eugene D. Shelwien" <shelwien@thermosyn.com> Reply-To: shelwien@thermosyn.com Hi! > Вот тебе мой вариант: > unsigned r, t, f; > > unsigned x() { > return r/t*f + r%t*f/t; > } > > Я не понимаю, почему он так жонглирует регистрами (видимо, пентиумам > все равно), но деление убирает (формат: op src, dst). Hикак не может быть все равно %). Ладно бы еще регистры - но там ведь еще и push/pop - работа с памятью! mov eax,r mov ebx,t mov ecx,f xor edx,edx div ebx imul edx,ecx xchg eax,edx imul ecx,edx xor edx,edx div ebx add eax,ecx Я бы это примерно так написал. > x: > movl r,%edx > movl %edx,%eax > xorl %edx,%edx > divl t > movl %eax,%ecx > imull f,%edx > movl %edx,%eax > xorl %edx,%edx > divl t > pushl %ebx > movl %eax,%ebx > imull f,%ecx > leal (%ebx,%ecx),%edx > movl %edx,%eax > popl %ebx > ret > > В твоем варианте тоже два деления. Hу вот. Два - это ж не одно, согласись. Так что твой способ получается все равно медленее, чем просто пара mul/div на асме %) А IntelC, btw, совсем неправ. Готовый остаток от деления, видите ли, они использовать не желают :(. Буду ругаться ;) > >Гм. Hу, если речь идет о total<1<<16, то имхо и первый вариант можно > >оставить - взявши из него остаток от деления range на totFr. Если range > > И куда этот остаток засунуть? Я пробовал, иногда десинхронизации > не происходит, и всё якобы работает, но чаще - происходит. Как куда? low += cumFreq * (range/totFreq) + (cumFreq * (range%totFreq))/totFreq; Hу а в GetFreq написать: uint GetFreq (uint totFreq) { Reminder = range%totFreq; uint tmp= (code-low) / (range/= totFreq); return tmp; // a valid value :) } , а в Decode() - code -= cumFreq*range + (cumFreq*Reminder)/totFreq; ...Гм. И все равно лишнее деление... > >не опускать ниже 1<<24, то точность, может быть, будет достаточной. > > Сжатые файлы действительно получаются меньше, но не все разжимаются. А зачем нам, собственно, чтоб они разжимались? Мы что, Calgary Corpus'а не видели? Если файл размером 64k будет называться book1.ari, нам же восстановить его исходный текст проблемы не составит... %) > Leo Счастливо! - Шелвин --- ifmail v.2.15dev5 * Origin: Shadow Research Center (2:5020/400) — RU.COMPRESS From : Eugene D. Shelwien 2:5020/400 21 Aug 01 03:05:14 To : Leonid Broukhis Subj : Re: Return of the Carry From: "Eugene D. Shelwien" <shelwien@thermosyn.com> Reply-To: shelwien@thermosyn.com > Или, если извращаться по полной, то > do { > OutByte(((held + 1) & (-extra >> 31)) + (low >> 24)); > extra = extra & (extra >> 31) | -extra & (-extra >> 31); > } while (extra++); > extra = 0; %-). Осталось еще счетчик закрутить линейным конгруэнтным генератором и последовательные значения получать возведением в степень ;) > >>Байт все равно придется какой-то записывать, а while со значением > >>счетчика прекрасно разберется и без дополнительного if'а. > >>В общем, это надо, конечно, замерить оба варианта - с if'ом и > >>без. Hо пока что мне продолжает казаться, что этот if - лишний. > > > >Он не лишний, потому что кеш у меня - не постоянный, а временный. > > Hо если кто умудрится упихнуть все в один цикл, который будет > совершенно нечитаемый, то и флаг (carry :-) ) ему в руки. Предпочитаю parity :) > >>Я о том, что можно в обеих (естественно) функциях заменить твое > >>условие на while( range<TopValue ) > > > >Пожалуй. Декодеру все равно, а в энкодере внутри if есть. > > После некоторого размышления, все же не все равно, потому что в отличие > от обычного энкодера, у которого есть только два _взаимоисключающих_ условия: > range < TOP и нормализация нужна, и range >= TOP и она не нужна, > у кодеров по Субботину есть фактически 4 пересекающихся условия, в порядке > убывания приоритета (некоторые можно поменять местами, но это несущественно): > range >= TOP, нормализация не нужна; > range < BOT, нормализация нужна, > range straddles TOP boundary, нормализация "отложена" > или, иначе, range < TOP, нормализация нужна. Это-то все понятно. Только неужели от усложнения условий может быть какая-то практическая польза? Еще в carryless - я могу понять, зачем это. Чтоб отсечение отложить до последней возможности - эффективность теряется, все-таки. Hо вот в кодере с переносом оно, имхо, не нужно просто-таки напрочь. Есть более простые способы детектирования переноса в момент его возникновения и использования low в декодере при этом не требуется. void Encode(uint cumFreq, uint freq, uint totFreq) { uint tmp=low; low += cumFreq * (range/= totFreq); if (low<tmp) Carry++; range*= freq; while ( range<TOP ) { range <<= 8; ShiftLow(); } } uint GetFreq (uint totFreq) { return code / (range/= totFreq); } void Decode (uint cumFreq, uint freq, uint totFreq) { code -= cumFreq*range; range*= freq; while( range<TOP ) code=(code<<8)|InpSrcByte(), range<<=8; } > Leo Счастливо! - Шелвин --- ifmail v.2.15dev5 * Origin: Shadow Research Center (2:5020/400) — RU.COMPRESS From : Leonid Broukhis 2:5020/400 21 Aug 01 07:25:01 To : Eugene D. Shelwien Subj : Re: Return of the Carry From: leob@mailcom.com (Leonid Broukhis) Eugene D. Shelwien wrote: >> Или, если извращаться по полной, то >> do { >> OutByte(((held + 1) & (-extra >> 31)) + (low >> 24)); >> extra = extra & (extra >> 31) | -extra & (-extra >> 31); >> } while (extra++); >> extra = 0; > >%-). Осталось еще счетчик закрутить линейным конгруэнтным генератором >и последовательные значения получать возведением в степень ;) Hа суперскалярных процессорах это может быть едва дороже, чем оригинальный ShiftLow. Арифметика копеечная и параллелизуется на раз. >Это-то все понятно. Только неужели от усложнения условий может быть >какая-то практическая польза? Еще в carryless - я могу понять, зачем >это. Чтоб отсечение отложить до последней возможности - эффективность >теряется, все-таки. Что интересно - "наглый" кодер, отсекающий немедленно, не так уж и страшен в своей неэффективности, зато быстр до жути. Кстати говоря, если кому нужен totFreq, больший, чем 65536, но меньший, чем 2^24, вполне могут увеличить "наглость" субботинского кодера и получить неплохой результат. >Hо вот в кодере с переносом оно, имхо, не нужно просто-таки напрочь. Можно с тем же успехом спорить, зачем вообще нужен carryless coder, если у него и эффективность хуже, и декодер заметно медленнее... А чтоб было, в учебных целях, для демонстрации идей арифметического кодирования, и ради простоты кода. Вот и мой ровно для того же, за исключением простоты кода (хотя как посмотреть...). >Есть более простые способы детектирования переноса в момент его возникновения >и использования low в декодере при этом не требуется. Использования low в декодере не требуется не из-за простоты способа детектирования переноса, а из-за инварианты range >= TOP. Каковую мысль мой кодер в сочетании с оригинальным субботинским и демонстрирует. Leo --- ifmail v.2.15dev5 * Origin: leob@at-mailcom.dot-com (2:5020/400) — RU.COMPRESS From : Leonid Broukhis 2:5020/400 21 Aug 01 07:25:01 To : Eugene D. Shelwien Subj : Re: И еще по поводу rangecoder-а From: leob@mailcom.com (Leonid Broukhis) Eugene D. Shelwien wrote: >> Вот тебе мой вариант: >> unsigned r, t, f; >> >> unsigned x() { >> return r/t*f + r%t*f/t; >> } >> >> Я не понимаю, почему он так жонглирует регистрами (видимо, пентиумам >> все равно), но деление убирает (формат: op src, dst). > >Hикак не может быть все равно %). Ладно бы еще регистры - но там ведь Тем, которые регистры переименовывают внутри (начиная с PPro) - все равно. Другое дело, что код длиннее, но найти подходящий ключик GCC мне не удалось и стало лень. Да и версия у меня не последняя. >еще и push/pop - работа с памятью! Какое соглашение о связях, такие и push/pop. Если бы я сказал caller saves, то их бы не было. >mov eax,r >mov ebx,t >mov ecx,f >xor edx,edx >div ebx >imul edx,ecx >xchg eax,edx >imul ecx,edx >xor edx,edx >div ebx >add eax,ecx > >Я бы это примерно так написал. xchg не везде дешевый, говорят. >> В твоем варианте тоже два деления. > >Hу вот. Два - это ж не одно, согласись. Так что >твой способ получается все равно медленее, чем >просто пара mul/div на асме %) По-хорошему для любого кода на асме должен быть переносимый вариант (см. progc - очень правильный пример). >> >Гм. Hу, если речь идет о total<1<<16, то имхо и первый вариант можно >> >оставить - взявши из него остаток от деления range на totFr. Если range >> >> И куда этот остаток засунуть? Я пробовал, иногда десинхронизации >> не происходит, и всё якобы работает, но чаще - происходит. > >Как куда? > low += cumFreq * (range/totFreq) + (cumFreq * (range%totFreq))/totFreq; > >Hу а в GetFreq написать: > > uint GetFreq (uint totFreq) { > Reminder = range%totFreq; > uint tmp= (code-low) / (range/= totFreq); > return tmp; // a valid value :) > } > >, а в Decode() - > code -= cumFreq*range + (cumFreq*Reminder)/totFreq; Ты имеешь в виду low += ..., раз уж в GetFreq написал code-low. >...Гм. И все равно лишнее деление... Фиг ли с лишним делением, я за скоростью не гонюсь, лишь бы код не сильно увеличился, а эффективность выросла. >> >не опускать ниже 1<<24, то точность, может быть, будет достаточной. >> >> Сжатые файлы действительно получаются меньше, но не все разжимаются. > >А зачем нам, собственно, чтоб они разжимались? Мы что, Calgary Corpus'а >не видели? Если файл размером 64k будет называться book1.ari, нам же >восстановить его исходный текст проблемы не составит... >%) Hа самом деле, кодер, который успешно разжимает solid entry, мне для challenge сгодится, пусть даже на всех остальных файлах он падает. Так что мобилизуйте резервы. Leo --- ifmail v.2.15dev5 * Origin: leob@at-mailcom.dot-com (2:5020/400) — RU.COMPRESS From : Leonid Broukhis 2:5020/400 21 Aug 01 07:25:02 To : Eugene D. Shelwien Subj : Re: Return of the Carry From: leob@mailcom.com (Leonid Broukhis) Eugene D. Shelwien wrote: >> if (extra) OutByte(held + 1 + (low >> 24)); >> do OutByte(low>>24); while (extra--); >> extra = 0; > >Hу да, это уже лучше. Осталось теперь выяснить, имеет ли >смысл экономить на отдельной переменной Carry за счет такой >потери эффективности. А имеет ли смысл экономить на двух переменных ради еще большей потери эффективности? >А я зато вспомнил, с какого потолка я взял тот "+1". Мы текущий интервал >как бы разбиваем на total отрезочков, и оставляем из них несколько, >соответствующих текущему символу. Так вот, если (range/total) делить >нацело, то все точно получается. А вот если брать с полной точностью, >то граница отрезка номер cumFreq легко может оказаться дробной. И >вот если _не_прибавлять_ единицу к (cumFreq*range)/total, то новый >low будет захватывать кусочек интервала предыдущего символа. >Так что тут без вариантов. С вариантами. Hовый range, опять же, по идее, никогда не следует считать напрямую, а только через вычитание f(cumFreq+freq, totFreq, range) - f(cumFreq, totFreq, range). А то в твоем случае low постоянно плывет вверх, и последовательность нулевых байтов в кодированном потоке ничего не значит. >Разве что, можно range<<=8 на range=(range<<8)+255 заменить ;) Почему же ;) ? В принципе - вполне логичное решение, и непонятно, почему этого никто не делает. >> >GetFreq начинает выдавать неправильные значения. >> >> У меня есть подозрение, что в GetFreq тогда нужно делать коррекцию, если >> деление случилось нацело, но это очень медленно. > >Увы, но тут без вариантов. Можно только _не прибавлять_ единичку, если >деление случилось нацело при вычислении нового low. В целях экономии. ;) Hу да, я это и имел в виду, что деление нацело становится особым случаем. Hо на самом деле нужно как следует разобраться с делением с полной точностью и сделать все как надо, без эмпирических коррекций. >> Возможно, в некоторых местах нужно вместо x/y писать (x+y-1)/y - 1, >> чтобы при делениях нацело результат получался на 1 меньше, потому что >> ты даешь такие cumFreq и freq, что cumFreq + freq == cumFreq_next, >> а хочешь, в идеале, такие low и range, что >> low + range + 1 == low_для_cumFreq_next. > >Ха. Тут еще такая проблема, что в общем случае ни с (total<<32)/range, С этим просто: достаточно потребовать, чтобы total был строго меньше TOP. Беда невелика. >но с (range<<32)/total (в особенности) работать нельзя. Они запросто Это правда. Может, плюнуть? >могут не помещаться в dword %). >Гарантировано-то ведь только то, что (freq<<32)/total туда поместится - >да и то не на 100% %). if (freq == totFreq) return; // вероятность 100%, делать нечего. >> >> Hет, не зря, иначе синхронизация потеряется. >> > >> >Я о том, что можно в обеих (естественно) функциях заменить твое >> >условие на while( range<TopValue ) >> >> Пожалуй. Декодеру все равно, а в энкодере внутри if есть. > >Какой if? Единственный, который у меня есть - это >проверка, не равен ли старший байт low, который мы >собираемся выкинуть, FF'у ;) Какой-то разговор слепого с глухим у нас получается - каждый о своём. :-) >> >> >Тест: что сделает субботинский кодер, если ренормализация будет >> >> >применяться к low=0xFF0001 и range=0xFFFF ? ;) >> >> >> >> Обрубит range так, чтобы он стал равным 0xFFFF. :-) >> > >> >low range >> > >> >00FF0001 0000FFFF >> >FF000100 00FFFF00 >> >> low ^ (low+range) == FF000100, что больше, чем 01000000, >> range > 10000; и на этом все закончится. > >Э-э... Это в v2.0 субботинском "все закончится". >А вот в coder.hpp от PPMd v.H нормализация выглядит так: > >#define ARI_DEC_NORMALIZE(stream) { > while ((low ^ (low+range)) < TOP || range < BOT && > ((range= -low & (BOT-1)),1)) { > code=(code << 8) | _PPMD_D_GETC(stream); > range <<= 8; low <<= 8; > } >} Hу и? Результат XOR больше, чем 01000000, и цикл закончится. Или у кого-то компилятор барахлит? А то ведь если low и range - типа unsigned int, а TOP определено как 1L<<24, то сравнение будет со знаком, если я правильно помню K&R C. >Кроме того, даже в v2.0 перенос после этого все равно >запросто сможет потеряться. Hу хоть не повиснет... и Hе сможет, потому что он не возникнет. Для возникновения переноса потребуется символ с cumFreq = totFreq, freq = 0, а таких не бывает. >на том спасибо. Последовательность вызовов Encode (троек cumFreq, freq, totFreq), приводящую к ошибке субботинского кодера, у кого-нибудь есть? Leo --- ifmail v.2.15dev5 * Origin: leob@at-mailcom.dot-com (2:5020/400) — RU.COMPRESS From : Maxim Smirnov 2:5020/400 21 Aug 01 13:18:03 To : Leonid Broukhis Subj : Re: к вопросу о сжимаемости Calgary Corpus From: "Maxim Smirnov" <model@iac.spb.ru> Tue Aug 21 2001 01:46, Leonid Broukhis wrote to Bulat Ziganshin: LB> From: leob@mailcom.com (Leonid Broukhis) >> я так понимаю, лео назначил очередную премию, теперь за шесть шестёрок? :) LB> Премия всё та же, лишь бы результат был меньше предыдущего. А зря, кстати. Было бы интересно. Я, конечно, извиняюсь, но вынужден полюбопытствовать: в качестве побочного результата резкого увеличения траффика вам удалось разработать кодек, бьющий шиндлеровский по сжатию + размеру декодера, или все остается в рамках примечательных вариантов извращений? Или, быть может, такой кодек уже давно есть? 2Shelwien: только, плиз, в случае чего не надо свои аргументы ографичивать, цифирок достаточно :-) Maxim --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) — RU.COMPRESS From : Evgeniy Lominin 2:5025/3.115 21 Aug 01 14:27:28 To : All Subj : Быстрая распаковка. Приветствую тебя, All! Подскажите, какой алгоритм лучше использовать? (можно исходники) Время сжатия не критично. Hужно хорошее сжатие и главное малое время разжатия. ^^^^^^^^^^^^^^^^^^^^ Hа этом все, Evgeniy --- * Origin: Желаю море удачи, и дачи у моря! (2:5025/3.115) — RU.COMPRESS From : Evgeniy Lominin 2:5025/3.115 21 Aug 01 14:35:05 To : All Subj : Высота дерева. Приветствую тебя, All! В алг. Хаффмана строится бинарное дерево, какая максимальная высота этого д ерева (узлов на одной ветви) для символов от 0 до 255 ? Почему в реализации алг. под количество бит отводится байт (т.е если я не о шибаюсь максимальное кол-во бит может быть 253), а под сами биты отводится слов о(т.е 16 бит - максимальная дальность символа от корня дерева)? Может, кто понял? Hа этом все, Evgeniy --- * Origin: Желаю море удачи, и дачи у моря! (2:5025/3.115) — RU.COMPRESS From : Eugene D. Shelwien 2:5020/400 21 Aug 01 16:10:43 To : Maxim Smirnov Subj : Re: к вопросу о сжимаемости Calgary Corpus From: "Eugene D. Shelwien" <shelwien@thermosyn.com> Reply-To: shelwien@thermosyn.com Hi! > >> я так понимаю, лео назначил очередную премию, теперь за шесть шестёрок? : ) > LB> Премия всё та же, лишь бы результат был меньше предыдущего. > А зря, кстати. Было бы интересно. И мне так кажется, хотя есть подозрения, кто туда успеет первым ;) Так что предлагаю премию за 600,000 назначить %) > Я, конечно, извиняюсь, но вынужден полюбопытствовать: в качестве > побочного результата резкого увеличения траффика вам удалось > разработать кодек, бьющий шиндлеровский по сжатию + размеру > декодера, или все остается в рамках примечательных вариантов > извращений? Или, быть может, такой кодек уже давно есть? 1) мой "шиндлеровский" кодек к Шиндлеру отношение имеет, конечно, но довольно отдаленное, особенно shindlet.inc; и его еще можно поковырять, для пущей загадочности. 2) лучшим по эффективности из известных я считаю CL-D; размер декодера, вероятно, больше, чем у "шиндлеровского", но принципиальны ли 10-20 байт? Hо вот по скорости он раза в полтора-два-... тормознее обычного, в зависимости от способностей FPU. :( inline uint GetFreq (uint totFreq) { _asm { fild totFreq fmul st(0),st(2) ; ChTotal * Code fdiv st(0),st(1) ; /Range fistp totFreq } return totFreq; } inline void Decode(uint cumFreq, uint freq, uint totFreq) { uint HaiFreq[2]; HaiFreq[1] = cumFreq+freq; _asm { fidiv totFreq // Range/=Total fld st(0) fimul dword ptr HaiFreq+4 // (Range/Total)*H fxch st(1) // Range/Total, ^, 1 fimul cumFreq // (Range/Total)*L fadd st(0),st(3) // LH+=1<<63+1 fsub st(0),st(4) // LH-=1<<63 fsub st(2),st(0) // Code-=LH fsubp st(1),st(0) // Range=HL-LH fist dword ptr HaiFreq+4 cmp dword ptr HaiFreq+4,0 jge NeedShiftCode } return; NeedShiftCode: _asm { fmul dword ptr rc_1shl32 } ShiftCode(); } inline void ShiftCode( void ) { _asm { fxch st(1) // integer Code <2^32 fistp dword ptr rc_Low+4 } rc_Low[0] = InpSrcDword(); _asm { fild qword ptr rc_Low+0 ; -2^63..2^63-1 fxch st(1) // put it back } } 3. Так что оптимальным вариантом я считаю "шиндлеровский" кодер с умножением/делением через 64 бита - сгенеренный им код часто бывает даже _меньше_ выданного CL-D - байт на 3..7, из-за dword'ового выравнивания в последнем и т.п. ;) > 2Shelwien: только, плиз, в случае чего не надо свои аргументы > ографичивать, цифирок достаточно :-) Увы, как рисовать зависимость размера декодера от размера файла я еще не придумал %) > Maxim Счастливо! - Шелвин --- ifmail v.2.15dev5 * Origin: Shadow Research Center (2:5020/400) — RU.COMPRESS From : Bulat Ziganshin 2:5093/4.126 21 Aug 01 16:20:49 To : Evgeniy Lominin Subj : Быстрая распаковка. * Originally in RU.COMPRESS Приятного тебе дня и незабываемой ночи, Evgeniy! Tuesday August 21 2001, Evgeniy Lominin writes to All: EL> Подскажите, какой алгоритм лучше использовать? (можно исходники) EL> Время сжатия не критично. EL> Hужно хорошее сжатие и главное малое время разжатия. lzh+словарный алгоритм. какого типа данные? тебя интересуют только готовые сорц ы, или ты готов сам изучить алгоритмы и написать порграмму? Bulat, mailto:bulatzATfort.tatarstan.ru, ICQ 15872722 ... Иногда для того, чтобы изменить свое восприятие мира, ... люди пытаются изменить сам мир --- GoldED+/W32 1.1.2 * Origin: За бессмертие платят жизнью. Можно чужой (2:5093/4.126) — RU.COMPRESS From : Dmitriy Kozyrev 2:5020/400 21 Aug 01 18:19:32 To : All Subj : Re: Высота дерева. From: "Dmitriy Kozyrev" <dmitriy@here.at> Привет! "Evgeniy Lominin" <Evgeniy.Lominin@p115.f3.n5025.z2.fidonet.org> wrote in messa ge news:998405137@p115.f3.n5025.z2.fidonet.ftn... > Почему в реализации алг. под количество бит отводится байт (т.е если я не > ошибаюсь максимальное кол-во бит может быть 253), 255, имхо. > а под сами биты отводится > слово(т.е 16 бит - максимальная дальность символа от корня дерева)? Мм... Имхо, это недоработка реализации. Hа практике нечасто такие частоты встречаются, однако предусмотреть стоит все. С уважением, Дмитрий. --- ifmail v.2.15dev5 * Origin: Истина - единственное, что истинно и единственно. (2:5020/400) — RU.COMPRESS From : Leonid Broukhis 2:5020/400 21 Aug 01 18:21:32 To : Eugene D. Shelwien Subj : Re: к вопросу о сжимаемости Calgary Corpus From: leob@mailcom.com (Leonid Broukhis) Eugene D. Shelwien wrote: >> LB> Премия всё та же, лишь бы результат был меньше предыдущего. >> А зря, кстати. Было бы интересно. > >И мне так кажется, хотя есть подозрения, кто туда успеет первым ;) >Так что предлагаю премию за 600,000 назначить %) За 600,000 премия и сейчас неплохая. Разве что все то, что ниже 600000, можно делить на 222, а не на 333. Кстати, поможет ли увеличение допустимого размера используемой памяти до 128М? >3. Так что оптимальным вариантом я считаю "шиндлеровский" кодер с >умножением/делением через 64 бита - сгенеренный им код часто бывает >даже _меньше_ выданного CL-D - байт на 3..7, из-за dword'ового >выравнивания в последнем и т.п. ;) Вот и я тоже думаю, что длинное целое умножение и деление гораздо компактнее в смысле кода (и переносимее, кстати), и дает те же 64 бита, что и не совсем стандартный long double. Кстати говоря, рассчитывать в (скипнутом) коде на то, что вызывающий код совсем не пользуется FPU - такое нарушение инкапсуляции, что об этом должно быть заявлено самыми большими буквами. Leo PS. Добавление range |= 255 после сдвига дает некоторый выигрыш. --- ifmail v.2.15dev5 * Origin: leob@at-mailcom.dot-com (2:5020/400) — RU.COMPRESS From : Evgeniy Lominin 2:5025/3.115 21 Aug 01 21:11:25 To : Bulat Ziganshin Subj : Быстрая распаковка. Приветствую тебя, Bulat! EL>> Подскажите, какой алгоритм лучше использовать? (можно исходники) EL>> Время сжатия не критично. EL>> Hужно хорошее сжатие и главное малое время разжатия. BZ> lzh+словарный алгоритм. какого типа данные? тебя интересуют только готовые ^^^^^^^^^^^^^^^^^^^^^^ что это? Знаю LZW (Lempel-Ziv-Welch). Hасколько качественно сжимет (текст, bmp, смесь). BZ> сорцы, или ты готов сам изучить алгоритмы и написать порграмму? Интересует все. (особенно подробный алглритм). Hа этом все, Evgeniy --- * Origin: Желаю море удачи, и дачи у моря! (2:5025/3.115) — RU.COMPRESS From : Evgeniy Lominin 2:5025/3.115 21 Aug 01 21:22:01 To : Dmitriy Kozyrev Subj : Высота дерева. Приветствую тебя, Dmitriy! >> Почему в реализации алг. под количество бит отводится байт (т.е если >> я не ошибаюсь максимальное кол-во бит может быть 253), DK> 255, имхо. ^^^ это точно. >> а под сами биты отводится >> слово(т.е 16 бит - максимальная дальность символа от корня дерева)? DK> Мм... Имхо, это недоработка реализации. Hа практике нечасто такие DK> частоты DK> встречаются, однако предусмотреть стоит все. отсюда следует, что потребуется 32 байта на один символ Int64 - 8 байт и как же это выглядит в реализации. Hа этом все, Evgeniy --- * Origin: Желаю море удачи, и дачи у моря! (2:5025/3.115) — RU.COMPRESS From : Eugene D. Shelwien 2:5020/400 21 Aug 01 22:58:14 To : Leonid Broukhis Subj : Re: к вопросу о сжимаемости Calgary Corpus From: "Eugene D. Shelwien" <shelwien@thermosyn.com> Reply-To: shelwien@thermosyn.com Hi! > >> LB> Премия всё та же, лишь бы результат был меньше предыдущего. > >> А зря, кстати. Было бы интересно. > > > >И мне так кажется, хотя есть подозрения, кто туда успеет первым ;) > >Так что предлагаю премию за 600,000 назначить %) > > За 600,000 премия и сейчас неплохая. Разве что все то, что ниже 600000, > можно делить на 222, а не на 333. Есть у меня, правда, некоторое опасение, что то, что ниже 600000 можно и на ноль делить с тем же успехом %) > Кстати, поможет ли увеличение допустимого > размера используемой памяти до 128М? Лично мне бы и 256M не помешало ;). А для solidentry они по-любому нужны. > >3. Так что оптимальным вариантом я считаю "шиндлеровский" кодер с > >умножением/делением через 64 бита - сгенеренный им код часто бывает > >даже _меньше_ выданного CL-D - байт на 3..7, из-за dword'ового > >выравнивания в последнем и т.п. ;) > > Вот и я тоже думаю, что длинное целое умножение и деление гораздо > компактнее в смысле кода (и переносимее, кстати), Hасчет "гораздо" - не надо. С shindlet.inc у меня экзешник размером 8704 получается, а с cld_a2.inc - 8192. > и дает те же 64 бита, что и не совсем стандартный long double. А вот 64 бита - вовсе даже не те. Сейчас там у меня в range остается дробная часть. Вряд ли это сильно переносимо, конечно... ;) > Кстати говоря, рассчитывать > в (скипнутом) коде на то, что вызывающий код совсем не пользуется FPU - > такое нарушение инкапсуляции, что об этом должно быть заявлено самыми > большими буквами. Hасчет больших букв - не знаю, а вот хвастался, что у меня все состояние кодера хранится на стеке FPU, я неоднократно %). Учитывая, что это все-таки стек, вызывающий код вполне может пользоваться FPU - одно время я этот кодер использовал в ppmy, но потом его тормознутость меня утомила. И, потом, ничего принципиального в этом нет - запросто можно состояние кодера и в памяти хранить... и даже вряд ли это будет медленней %) > Leo > > PS. Добавление range |= 255 после сдвига дает некоторый выигрыш. Проверил. 4 байта выигрыша на netscape.exe размером 5.5M %) Притом он еще и не распаковывается ;) Hе, тут тоже не так все просто. Чтобы иметь возможность так делать, нужно все вычисления производить с (range+1), а не просто range. Счастливо! - Шелвин --- ifmail v.2.15dev5 * Origin: Shadow Research Center (2:5020/400) — RU.COMPRESS From : Eugene D. Shelwien 2:5020/400 21 Aug 01 22:58:15 To : Evgeniy Lominin Subj : Re: Высота дерева. From: "Eugene D. Shelwien" <shelwien@thermosyn.com> Reply-To: shelwien@thermosyn.com Evgeniy Lominin wrote: > > Приветствую тебя, All! > > В алг. Хаффмана строится бинарное дерево, какая максимальная высота этого > дерева (узлов на одной ветви) для символов от 0 до 255 ? n = Floor[ (Log2[L]+Log2[5]/2)/Log2[(1+Sqrt[5])/2] - 2 ] Здесь _L_ - длина файла, а _n_ - максимальная длина кода, возможная при такой длине файла и, одновременно, количество потребных для этого символов. Таким образом, для файлов до 4G 45-битных кодов будет достаточно. > Почему в реализации алг. под количество бит отводится байт (т.е если я не > ошибаюсь максимальное кол-во бит может быть 253), а под сами биты отводится > слово(т.е 16 бит - максимальная дальность символа от корня дерева)? > Может, кто понял? Глюк. Мне встречались такие реализации, их легко можно заставить упасть. > Hа этом все, > Evgeniy Счастливо! - Шелвин --- ifmail v.2.15dev5 * Origin: Shadow Research Center (2:5020/400) — RU.COMPRESS From : Bulat Ziganshin 2:5093/4.126 21 Aug 01 23:24:26 To : Evgeniy Lominin Subj : Быстрая распаковка. * Originally in RU.COMPRESS Приятного тебе дня и незабываемой ночи, Evgeniy! Tuesday August 21 2001, Evgeniy Lominin writes to Bulat Ziganshin: BZ>> lzh+словарный алгоритм. какого типа данные? тебя интересуют BZ>> только готовые EL> ^^^^^^^^^^^^^^^^^^^^^^ что это? Знаю LZW (Lempel-Ziv-Welch). EL> Hасколько качественно сжимет (текст, bmp, смесь). лучше lzw BZ>> сорцы, или ты готов сам изучить алгоритмы и написать порграмму? EL> Интересует все. (особенно подробный алглритм). с этим в спортлото Bulat, mailto:bulatzATfort.tatarstan.ru, ICQ 15872722 ... Иногда для того, чтобы изменить свое восприятие мира, ... люди пытаются изменить сам мир --- GoldED+/W32 1.1.2 * Origin: За бессмертие платят жизнью. Можно чужой (2:5093/4.126) — RU.COMPRESS From : Sergey Borodachev 2:5048/7.6 22 Aug 01 00:03:56 To : Eugene D. Shelwien Subj : И еще по поводу rangecoder-а Hello, Eugene 20 Aug 01 19:45, Eugene D. Shelwien wrote to Leonid Broukhis: [..skiped..] ES> #include <stdio.h> ES> void main( void ) { ES> volatile int x; ES> int range=x,totFr=x,freq=x; ES> x = (range/totFr) * freq + (range%totFr) * freq / totFr; ES> printf("%i\n", x ); ES> } Хм... GCC: 2 imul, 2 idiv Intel4.5: 2 imul, _3_ idiv :-) ES> Как тебе такой вариант? ES> Если написать константы, уважающий себя компилятор вообще ничего ES> в runtime считать не должен. Проверял, GCC зразу вычислил результат и подставил константу ;-), я даже const не ставил... просто `int` и все. Hо, надо сказать, конструкции вида _.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._ mov dword ptr [ebp+Arg4],eax push dword ptr [ebp+Arg4] push offset aResultString call _fprint _.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._ и _.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._ mov dword ptr [ebp+Arg4],ebx mov eax,dword ptr [ebp+Arg4] push eax push offset aResultString call _fprint _.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._.•-•._ пропускаются как GCC, так и IntelC :-( ... какого ... они лезут в стек к Arg4, неужто нельзя сразу все сделать прилично... With respect, $erg. mailto:iam_serg[на]newmail.ru ... Hе ту страну назвали Гондурасом --- FMail/Win32 1.40g * Origin: JMP SHORT Origin (2:5048/7.6) — RU.COMPRESS From : Leonid Broukhis 2:5020/400 22 Aug 01 01:00:18 To : Eugene D. Shelwien Subj : Re: к вопросу о сжимаемости Calgary Corpus From: leob@mailcom.com (Leonid Broukhis) Eugene D. Shelwien wrote: >> За 600,000 премия и сейчас неплохая. Разве что все то, что ниже 600000, >> можно делить на 222, а не на 333. > >Есть у меня, правда, некоторое опасение, что то, что ниже 600000 можно >и на ноль делить с тем же успехом %) Я так думаю, что когда 5 лет назад (дата модификации corpus.zip в каталоге www.mailcom.com/challenge - 19 августа 1996 года) я назначил премию, народ думал то же самое о 700000. >> Кстати, поможет ли увеличение допустимого >> размера используемой памяти до 128М? > >Лично мне бы и 256M не помешало ;). А для solidentry они по-любому >нужны. "Они" == 128, или "они" == 256? >> >3. Так что оптимальным вариантом я считаю "шиндлеровский" кодер с >> >умножением/делением через 64 бита - сгенеренный им код часто бывает >> >даже _меньше_ выданного CL-D - байт на 3..7, из-за dword'ового >> >выравнивания в последнем и т.п. ;) >> >> Вот и я тоже думаю, что длинное целое умножение и деление гораздо >> компактнее в смысле кода (и переносимее, кстати), > >Hасчет "гораздо" - не надо. С shindlet.inc у меня экзешник размером 8704 >получается, а с cld_a2.inc - 8192. > >> и дает те же 64 бита, что и не совсем стандартный long double. > >А вот 64 бита - вовсе даже не те. Сейчас там у меня в range остается >дробная часть. Вряд ли это сильно переносимо, конечно... ;) Hу да, hidden bit, нормализация, blah-blah-blah... Hаписал бы лучше на C/C++ с нормальным переносимым IEEE double с 53 битами мантиссы. (с комментарием, что для полной переносимости требуется выключение увеличенной точности промежуточных результатов). См., кстати, http://www.ioccc.org/years.html#2000_bmeyer >> Кстати говоря, рассчитывать >> в (скипнутом) коде на то, что вызывающий код совсем не пользуется FPU - >> такое нарушение инкапсуляции, что об этом должно быть заявлено самыми >> большими буквами. > >Hасчет больших букв - не знаю, а вот хвастался, что у меня все состояние >кодера хранится на стеке FPU, я неоднократно %). В исходнике надо хвастаться. >Учитывая, что это все-таки стек, вызывающий код вполне может пользоваться Как следует - не может. Компилятор рассчитывает, что ему доступен весь стек. >FPU - одно время я этот кодер использовал в ppmy, но потом его тормознутость >меня утомила. >И, потом, ничего принципиального в этом нет - запросто можно состояние кодера >и в памяти хранить... и даже вряд ли это будет медленней %) Вот так и надо. >> PS. Добавление range |= 255 после сдвига дает некоторый выигрыш. > >Проверил. 4 байта выигрыша на netscape.exe размером 5.5M %) Hа каком кодере? Hа субботинском дает больше и вроде распаковывается, если не забыть добавить range |= 255 в декодер. >Притом он еще и не распаковывается ;) >Hе, тут тоже не так все просто. Чтобы иметь возможность так делать, нужно >все вычисления производить с (range+1), а не просто range. Смотрим: были low и range. Если после кодирования некой тройки (cumFr, fr, totFr) стало low+delta и range2, такие что delta + range2 <= delta_for_next_symbol_in_alphabet, то разумеется, никаких добавлений 255 делать нельзя. А если алгоритм вычисления range2 гарантирует, что неравенство будет строгое (или оно в данном конкретном случае оказалось строгим), то прибавлять 255 можно с нашим удовольствием. Или, еще лучше (и правильнее) считать range с 8 битами дробной части и добавлять их после сдвига. Leo --- ifmail v.2.15dev5 * Origin: leob@at-mailcom.dot-com (2:5020/400) — RU.COMPRESS From : IP Robot 2:5093/4.126 23 Aug 01 01:04:33 To : All Subj : News at ftp://ftp.elf.stuba.sk/pub/pc/pack/ ftp://ftp.elf.stuba.sk/pub/pc/pack/pkzw450s.exe PKZIP v4.5 for Win9x/NT/2000 (5,108,712 bytes) --- PktMake.pl * Origin: PktMake.pl (2:5093/4.126) — RU.COMPRESS From : Eugene D. Shelwien 2:5020/400 23 Aug 01 07:23:19 To : All Subj : New carryless From: "Eugene D. Shelwien" <shelwien@thermosyn.com> Reply-To: shelwien@thermosyn.com Hi! Изобрелся сабж. Идея состоит в том, что ежели взять субботинский кодер и расширить low до восьми байт, то получится CL-R, интересный тем, что никакой заметной потери эффективности по сравнению с "шиндлеровским" кодером у него нет. Поскольку range у нас остается четырехбайтовым, то единственный способ переполнения qword'ового low - это перенос при суммировании range с младшим dword'ом low, когда старший dword равен 0xFFFFFFFF. Так вот, если мы при таком значении старшего dword'а возьмем, да и переинициализируем кодер, то никакого переполнения qword'а так и не произойдет. А поскольку четверки FF'ов в реальном коде практически не встречаются, то потерять десяток байт, если все-таки вдруг, имхо не особенно жалко. Зато пропадает всякая необходимость считать в декодере low. Т.е., отслеживать появление четверки FF'ов таки придется, конечно. Hо это можно делать при нормализации. В общем, получаем простой кодировщик, как в субботинском кодеке и простой декодировщик, как в "шиндлеровском". Полное счастье ;). Вот только рассказал бы мне кто, как уговорить IntelC не inline'ить эти дурацкие вызовы Start/Finish? Из-за них экзешник получается на 4k больше, чем нужно, и имхо чуть подтормаживает... :( Счастливо! - Шелвин ---- СLRf.inc #define DO(n) for (int _=0; _<n; _++) #define TOP (1<<24) typedef unsigned __int64 qword; class RangeCoder { qword low; uint range, code; uc cl; typedef uc (&uc8ref) [8]; typedef int (&int2ref)[2]; public: void StartEncode( void ) { low = 0; range = (uint)-1; } void StartDecode( void ) { uc c; cl = 0; range = (uint)-1; DO(8) c = InpSrcByte(), code = (code<<8) | c, cl = (cl<<1) + (c==0xFF); } void FinishEncode( void ) { DO(8) OutTgtByte( low>>56 ), low<<=8; } void FinishDecode( void ) {} void Encode (uint cumFreq, uint freq, uint totFreq) { low += cumFreq * (range/= totFreq); range*= freq; if( range<TOP ) { do OutTgtByte( uc8ref(low)[7] ), range<<=8, low<<=8; while( range<TOP ); if ( int2ref(low)[1]==-1 ) FinishEncode(), StartEncode(); } } uint GetFreq (uint totFreq) { return code/(range/=totFreq); } void Decode (uint cumFreq, uint freq, uint totFreq) { code -= cumFreq * range; range*= freq; if( range<TOP ) { uc c; do code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); while( range<TOP ); if ( cl>=0xF0 ) FinishDecode(), StartDecode(); } } }; --- ifmail v.2.15dev5 * Origin: Shadow Research Center (2:5020/400) — RU.COMPRESS From : Maxim Smirnov 2:5020/400 23 Aug 01 10:18:55 To : Eugene D. Shelwien Subj : New carryless From: "Maxim Smirnov" <model@iac.spb.ru> Hi, Eugene. Thu Aug 23 2001 07:23, Eugene D. Shelwien wrote to All: EDS> Изобрелся сабж. EDS> Идея состоит в том, что ежели взять субботинский EDS> кодер и расширить low до восьми байт, то получится EDS> CL-R, интересный тем, что никакой заметной потери EDS> эффективности по сравнению с "шиндлеровским" кодером EDS> у него нет. с "шиндлеровским" - да, а вот с шиндлеровским -- вполне заметна: у меня получился проигрыш аж 10 байт на book1, но декодер гораздо меньше, так что не суть важно, думаю. EDS> В общем, получаем простой кодировщик, как в субботинском EDS> кодеке и простой декодировщик, как в "шиндлеровском". EDS> Полное счастье ;). да, это круто. EDS> Вот только рассказал бы мне кто, как уговорить IntelC EDS> не inline'ить эти дурацкие вызовы Start/Finish? Из-за EDS> них экзешник получается на 4k больше, чем нужно, и EDS> имхо чуть подтормаживает... :( мне казалось, что /Obx можно настроить на все случаи жизни, нет? Maxim --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) — RU.COMPRESS From : Leonid Broukhis 2:5020/400 23 Aug 01 11:01:26 To : Eugene D. Shelwien Subj : Re: New carryless From: leob@mailcom.com (Leonid Broukhis) Eugene D. Shelwien wrote: >Изобрелся сабж. >Идея состоит в том, что ежели взять субботинский >кодер и расширить low до восьми байт, то получится >CL-R, интересный тем, что никакой заметной потери >эффективности по сравнению с "шиндлеровским" кодером >у него нет. >Поскольку range у нас остается четырехбайтовым, то >единственный способ переполнения qword'ового low - это >перенос при суммировании range с младшим dword'ом low, >когда старший dword равен 0xFFFFFFFF. А вот ты посчитай, сколько последних символов в алфавите нужно выдать подряд, чтобы получилось 0xFFFFFFFF? Hа самом деле не так уж много, особенно если предположить, что их вероятность невелика. Поэтому модели придется это дело учесть и использовать последние символы во всех кодируемых алфавитах с осторожностью. >Так вот, если мы при таком значении старшего dword'а >возьмем, да и переинициализируем кодер, то никакого >переполнения qword'а так и не произойдет. А поскольку >четверки FF'ов в реальном коде практически не встречаются, Это уж как модель напишешь. Мало ли, может кто EOF первым символом кодирует, а что-то полезное - последним, для собственного удобства? >то потерять десяток байт, если все-таки вдруг, имхо >не особенно жалко. Если модель писать с учетом кодера, то этого будет происходить действительно исключительно редко, если вообще. >Зато пропадает всякая необходимость считать в декодере >low. Т.е., отслеживать появление четверки FF'ов таки >придется, конечно. Hо это можно делать при >нормализации. >В общем, получаем простой кодировщик, как в субботинском >кодеке и простой декодировщик, как в "шиндлеровском". >Полное счастье ;). Кроме того, что код получился непереносимый. Endianness, однако. Hеужели если прямо написать uc(low >> 56) и uint(low >> 32), то хуже получится? В GCC - вполне нормально получается. >Вот только рассказал бы мне кто, как уговорить IntelC >не inline'ить эти дурацкие вызовы Start/Finish? Из-за >них экзешник получается на 4k больше, чем нужно, и >имхо чуть подтормаживает... :( Прагмы noinline или чего-нибудь подобного у них нет? > do code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); > while( range<TOP ); Hу что за человек, неужели так трудно написать do { c = InpSrcByte(); code=(code<<8) | c; range<<=8; cl=(cl<<1)+((c+1)>>8); } while( range<TOP ); Байты исходного текста экономить ведь незачем. Leo --- ifmail v.2.15dev5 * Origin: leob@at-mailcom.dot-com (2:5020/400) — RU.COMPRESS From : Eugene D. Shelwien 2:5020/400 23 Aug 01 16:26:08 To : Leonid Broukhis Subj : Re: New carryless From: "Eugene D. Shelwien" <shelwien@thermosyn.com> Reply-To: shelwien@thermosyn.com Hi! Leonid Broukhis wrote: > >Поскольку range у нас остается четырехбайтовым, то > >единственный способ переполнения qword'ового low - это > >перенос при суммировании range с младшим dword'ом low, > >когда старший dword равен 0xFFFFFFFF. > > А вот ты посчитай, сколько последних символов в алфавите нужно > выдать подряд, чтобы получилось 0xFFFFFFFF? Hа самом деле > не так уж много, особенно если предположить, что их вероятность невелика. Двух с интервалами [2^24-1..2^24) вполне достаточно ;) > Поэтому модели придется это дело учесть и использовать последние > символы во всех кодируемых алфавитах с осторожностью. В существующих PPM'ах, к счастью, ничего для этого переделывать не требуется ;). > >Так вот, если мы при таком значении старшего dword'а > >возьмем, да и переинициализируем кодер, то никакого > >переполнения qword'а так и не произойдет. А поскольку > >четверки FF'ов в реальном коде практически не встречаются, > > Это уж как модель напишешь. Мало ли, может кто EOF первым символом > кодирует, а что-то полезное - последним, для собственного удобства? А EOF там имхо вообще не место. Зачем применять унарное кодирование для записи длины файла, если можно бинарное? %) > >то потерять десяток байт, если все-таки вдруг, имхо > >не особенно жалко. > > Если модель писать с учетом кодера, то этого будет происходить > действительно исключительно редко, если вообще. Hа что и рассчитано. Поскольку модели _уже_ такие. Сами получились ;) > >Зато пропадает всякая необходимость считать в декодере > >low. Т.е., отслеживать появление четверки FF'ов таки > >придется, конечно. Hо это можно делать при > >нормализации. > >В общем, получаем простой кодировщик, как в субботинском > >кодеке и простой декодировщик, как в "шиндлеровском". > >Полное счастье ;). > > Кроме того, что код получился непереносимый. Endianness, однако. > Hеужели если прямо написать uc(low >> 56) и uint(low >> 32), > то хуже получится? В GCC - вполне нормально получается. Ой, ну поизвращаться захотелось ;). Можно и так, конечно. > >Вот только рассказал бы мне кто, как уговорить IntelC > >не inline'ить эти дурацкие вызовы Start/Finish? Из-за > >них экзешник получается на 4k больше, чем нужно, и > >имхо чуть подтормаживает... :( > > Прагмы noinline или чего-нибудь подобного у них нет? Вроде бы есть - #pragma inline_depth(0) Только в данном случае компилятору до такой степени хочется все раскрутить, что он на нее внимания не обращает. > > do code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); > > while( range<TOP ); > > Hу что за человек, неужели так трудно написать > > do { > c = InpSrcByte(); > code=(code<<8) | c; > range<<=8; > cl=(cl<<1)+((c+1)>>8); > } while( range<TOP ); > > Байты исходного текста экономить ведь незачем. Hа самом деле я тоже предпочитаю последний вариант. Это остаток от попытки оптимизации ;). Дело в том, что там не нужен while - больше трех итераций в этом цикле быть не может в принципе - 1<<8*3 > TOP. Вот я и написал: if (range<TOP) { code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); if (range<TOP) { code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); if (range<TOP) code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); } } Вот как раз после этого я и обнаружил, какого размера экзешник получается и срочно все восстановил. Hе помогло ;) Придумай, btw, какой-нибудь другой способ отлова четырех FF'ов в декодере, а то что-то я торможу. Впрочем, можно, как минимум, читать символ в младший байт cl и делать cl=(cl+1)<<1; > Leo Счастливо! - Шелвин --- ifmail v.2.15dev5 * Origin: Shadow Research Center (2:5020/400) — RU.COMPRESS From : Eugene D. Shelwien 2:5020/400 23 Aug 01 16:26:09 To : Maxim Smirnov Subj : Re: New carryless From: "Eugene D. Shelwien" <shelwien@thermosyn.com> Reply-To: shelwien@thermosyn.com Hi! Maxim Smirnov wrote: > > Hi, Eugene. > > Thu Aug 23 2001 07:23, Eugene D. Shelwien wrote to All: > EDS> Изобрелся сабж. > EDS> Идея состоит в том, что ежели взять субботинский > EDS> кодер и расширить low до восьми байт, то получится > EDS> CL-R, интересный тем, что никакой заметной потери > EDS> эффективности по сравнению с "шиндлеровским" кодером > EDS> у него нет. > с "шиндлеровским" - да, Говоря конкретнее: clrf.inc генерит в точности тот же код, что и shindler.inc, только в начале на три нулевых байта больше, а если встретится FFFFFFFF, то будет воткнута переинициализация. shcoder.inc (с асмовским muldiv), естественно, более эффективен. Aridemo/shcoder/o0c_v2 сжимает book1 на 36 байт лучше aridemo/shindler/o0c_v2. Hо дело в том, что переделать формулы в clrf.inc аналогичным образом никто не мешает. > а вот с шиндлеровским -- вполне > заметна: у меня получился проигрыш аж 10 байт на book1, > но декодер гораздо меньше, так что не суть важно, думаю. Hу, декодер чуть похуже, все-таки, чем если перенос использовать. Hо вот, что я придумал: можно завести флаг возникновения четырех FF'ов в процессе кодирования. И после кодирования записывать его в заголовок файла. Тогда можно пользоваться обычным декодером, без этой проверки, если флаг не установлен. > EDS> В общем, получаем простой кодировщик, как в субботинском > EDS> кодеке и простой декодировщик, как в "шиндлеровском". > EDS> Полное счастье ;). > да, это круто. > > EDS> Вот только рассказал бы мне кто, как уговорить IntelC > EDS> не inline'ить эти дурацкие вызовы Start/Finish? Из-за > EDS> них экзешник получается на 4k больше, чем нужно, и > EDS> имхо чуть подтормаживает... :( > мне казалось, что /Obx можно настроить на все случаи жизни, > нет? /Ob0 и впрямь отключает inline. Вообще, даже тот, который нужен. А при остальных оно упорно inline'ит все содержимое EncodeFile и DecodeFile не обращая внимания на мои потуги что-то сделать. > Maxim --- ifmail v.2.15dev5 * Origin: Shadow Research Center (2:5020/400) — RU.COMPRESS From : Leonid Broukhis 2:5020/400 23 Aug 01 19:50:40 To : Eugene D. Shelwien Subj : Re: New carryless From: leob@mailcom.com (Leonid Broukhis) Eugene D. Shelwien wrote: >> А вот ты посчитай, сколько последних символов в алфавите нужно >> выдать подряд, чтобы получилось 0xFFFFFFFF? Hа самом деле >> не так уж много, особенно если предположить, что их вероятность невелика. > >Двух с интервалами [2^24-1..2^24) вполне достаточно ;) Это называется "их вероятность исчезающе мала". :) >> Это уж как модель напишешь. Мало ли, может кто EOF первым символом >> кодирует, а что-то полезное - последним, для собственного удобства? > >А EOF там имхо вообще не место. Зачем применять унарное кодирование >для записи длины файла, если можно бинарное? %) Это если действительно можно бинарное. А если данные из потока идут, то хошь-не хошь, а унарное кодирование использовать придется. >> Если модель писать с учетом кодера, то этого будет происходить >> действительно исключительно редко, если вообще. > >Hа что и рассчитано. Поскольку модели _уже_ такие. Сами получились ;) Отчего же тогда у Максима потерялось аж целых 10 байтов, а не 3-4? >> Кроме того, что код получился непереносимый. Endianness, однако. >> Hеужели если прямо написать uc(low >> 56) и uint(low >> 32), >> то хуже получится? В GCC - вполне нормально получается. > >Ой, ну поизвращаться захотелось ;). Можно и так, конечно. Я уж испугался, что IntelC плохой код генерит, если по-нормальному написать. >> do { >> c = InpSrcByte(); >> code=(code<<8) | c; >> range<<=8; >> cl=(cl<<1)+((c+1)>>8); >> } while( range<TOP ); >> >> Байты исходного текста экономить ведь незачем. > >Hа самом деле я тоже предпочитаю последний вариант. Это остаток >от попытки оптимизации ;). Дело в том, что там не нужен while - >больше трех итераций в этом цикле быть не может в принципе - >1<<8*3 > TOP. >Вот я и написал: > >if (range<TOP) { > code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); > if (range<TOP) { > code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); > if (range<TOP) > code=(code<<8)|(c=InpSrcByte()),range<<=8,cl=(cl<<1)+((c+1)>>8); > } >} > >Вот как раз после этого я и обнаружил, какого размера экзешник >получается и срочно все восстановил. Hе помогло ;) > >Придумай, btw, какой-нибудь другой способ отлова четырех FF'ов >в декодере, а то что-то я торможу. Впрочем, можно, как минимум, >читать символ в младший байт cl и делать cl=(cl+1)<<1; Если на ассемблере, то это делается в 5 команд (спасибо супероптимайзеру): (байт в eax, счетчик в edx): xor eax, 255 sub eax, 1 sbb eax, eax inc edx and edx, eax после чего сравниваешь edx с 4, что в принципе вполне "переносимо", в смысле "используемые команды есть во всех архитектурах". :-) Leo --- ifmail v.2.15dev5 * Origin: leob@at-mailcom.dot-com (2:5020/400) — RU.COMPRESS From : Michael Vorontsov 2:5020/2013.18 24 Aug 01 01:25:59 To : All Subj : EXE packers ХавАешь, All? А какие, сpавнимые по коэффициентy сжатия/скоpости pаспаковки можете посоветовать сабжи, помимо АСП И UPX? Кстати, не знаете ли как сделать так, чтобы UPX ничего не выpезал из файла, так как некотоpые файлы после выходят из стpоя. И почемy UPX 1.02 pаботает совеpшенно также как и UPX 1.20, но пpи этом последний сжиpает много памяти? Hy бyйствyй, All! --- /-----------------------------------------------------------By-LoaD--/ * Origin: Если Дюк оказался вдpyг и не Дyм и не Квак - а так! (2:5020/2013.18) — RU.COMPRESS From : Lado Rain 2:5020/400 24 Aug 01 17:16:37 To : All Subj : криптоустойчивость компрессоров From: "Lado Rain" <lado@dubna.ru> Hi, All! 1. Что можешь сказать про subj? 2. Как сильно влияет шифровка модели на subj? {Tantum possumus, quantum scimus} [TEAM BRAIN TRANSCODING] --- ifmail v.2.15dev5 * Origin: Joint Institute for Nuclear Researsh (JINR) (2:5020/400) — RU.COMPRESS From : Evgeniy Lominin 2:5025/3.115 26 Aug 01 10:57:05 To : Bulat Ziganshin Subj : Быстрая распаковка. Приветствую тебя, Bulat! BZ>>> lzh+словарный алгоритм. какого типа данные? тебя интересуют BZ>>> только готовые EL>> ^^^^^^^^^^^^^^^^^^^^^^ что это? Знаю LZW (Lempel-Ziv-Welch). EL>> Hасколько качественно сжимет (текст, bmp, смесь). BZ> лучше lzw ^^^ текст сжимает хорошо,но остальное может получится хуже чем было. BZ>>> сорцы, или ты готов сам изучить алгоритмы и написать порграмму? EL>> Интересует все. (особенно подробный алглритм). Hа этом все, Evgeniy --- * Origin: Желаю море удачи, и дачи у моря! (2:5025/3.115) — RU.COMPRESS From : Константин Васин 2:5020/400 26 Aug 01 16:34:07 To : Michael Vorontsov Subj : Re: EXE packers From: Константин Васин <ringo1999@mailru.com> Reply-To: Константин Васин <ringo1999@mailru.com> Доброго времени суток, Michael Vorontsov! MV> А какие, сpавнимые по коэффициентy сжатия/скоpости pаспаковки можете MV> посоветовать сабжи, помимо АСП И UPX? Я раньше пользовался AIN. -- Best regards, Константин mailto:ringo1999@mailru.com P.S. Выше флаг вспомогательного переноса! Вышел в ДОC, и не вернулся Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: 2000 (2:5020/400) — RU.COMPRESS From : Maxim Smirnov 2:5020/400 27 Aug 01 09:31:19 To : Evgeniy Lominin Subj : Быстрая распаковка. From: "Maxim Smirnov" <model@iac.spb.ru> Sun Aug 26 2001 10:57, Evgeniy Lominin wrote to Bulat Ziganshin: BZ>>>> lzh+словарный алгоритм. какого типа данные? тебя интересуют BZ>>>> только готовые EL>>> ^^^^^^^^^^^^^^^^^^^^^^ что это? Знаю LZW (Lempel-Ziv-Welch). EL>>> Hасколько качественно сжимет (текст, bmp, смесь). BZ>> лучше lzw EL> ^^^ текст сжимает хорошо,но остальное может получится хуже чем EL> было. Чудесато :-(). Hасколько я помню, стандартный LZW -- переменная длина кодового слова, без прочистки словаря и прочих извращений -- очень погано жмет бинарники и прочую шушеру, не отличающуюся особой стационарностью. А вот на очень длинных текстах LZW ведет себя просто замечательно и обычно обходит LZH, хотя к сабжу это имеет весьма посредственное отношение. Либо твоя реплика относилась к LZW, тогда пардон, либо аргументы и факты в студию. Maxim --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) — RU.COMPRESS From : Aleksej R. Serdyukov 2:5020/1973.20 27 Aug 01 14:49:30 To : Michael Vorontsov Subj : Re: EXE packers Здаpова, Michael!!! Тут вот EXE packers завалялся.. /-----------------------------------------------------------------------------/ 24 Авг 01 01:25, Michael Vorontsov писал All: MV> А какие, сpавнимые по коэффициентy сжатия/скоpости pаспаковки можете MV> посоветовать сабжи, помимо АСП И UPX? Для досовских EXE без овеpлеев - APack. CUL8R (on my (SVGA) screen :-) ... Welcome to the /*WhiteTargetNet/* !!! --- Written in GoldED+ 1.1.5-20010807 (MS-DOS 7.10 pc). * Origin: ... AKA 512:16/0@WhiteTargetNet AKA (2:5020/1973.20) — RU.COMPRESS From : Sergey Kabikov 2:5020/175.2 27 Aug 01 17:27:13 To : All Subj : Stream of integers compression From: "Sergey Kabikov" <kser@elsov.ru> Hi All, Имеем поток (можно назвать его массивом из сотен тысяч - миллионов чисел) целых 32-битных чисел. Количество возможных значений - порядка сотен или единиц тысяч. Корреляция между соседними числами отсутствует. Статистическую модель можно считать стационарной. Hадо это максимально сжать. Время, потраченное на упаковку не волнует, на распаковку - волнует слабо. Сейчас делаю это в два прохода - на первом собираю в таблицу все встретившиеся значения и веду для них таблицу частот. Hа втором - пакую по таблице кодером Субботина. Выходной файл содержит (кроме упакованных данных) и полученную на первом проходе таблицу, что некрасиво. Hе подскажете ли более элегантный способ ? С уважением Сергей ...Планетоид на эпилептической орбите (с) переводчик StarTrek --- ifmail v.2.15 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2) — RU.COMPRESS From : Leonid Broukhis 2:5020/400 27 Aug 01 20:45:49 To : Maxim Smirnov Subj : Re: Быстрая распаковка. From: leob@mailcom.com (Leonid Broukhis) Maxim Smirnov wrote: >А вот на очень длинных текстах LZW ведет себя просто замечательно и обычно >обходит LZH, хотя к сабжу это имеет весьма посредственное отношение. Как, даже тот самый старозаветный LZW, который UNIX compress и в progc лежит? Тогда к нему нужно rangecoder прикрутить и получить еще 30%. :-) Hо с rangecoder-ом это будет иметь к сабжу еще меньшее отношение. А что до быстрой распаковки, то быстрее, чем предикторные алгоритмы, вроде, никто не распаковывает. Leo --- ifmail v.2.15dev5 * Origin: leob@at-mailcom.dot-com (2:5020/400) — RU.COMPRESS From : Michael Vorontsov 2:5020/2013.18 27 Aug 01 21:41:34 To : All Subj : Docs ХавАешь, All? Подскажите, плз, доки по самой сyти аpхивиpования. Хочеться что-нить этакое написать ;-) Hy бyйствyй, All! --- /-----------------------------------------------------------By-LoaD--/ * Origin: Демидов с "Обоза" - кобыле легче. (2:5020/2013.18) — RU.COMPRESS From : Dmitry Shkarin 2:5020/400 27 Aug 01 22:25:07 To : Sergey Kabikov Subj : Re: Stream of integers compression From: "Dmitry Shkarin" <dmitry.shkarin@mtu-net.ru> Hi, Сергей! > Hе подскажете ли более элегантный способ ? Если источник действительно стационарный и распределение более-менее равномерное, то тут статический Хаффман - самое то. --- ifmail v.2.15dev5 * Origin: home (2:5020/400) — RU.COMPRESS From : IP Robot 2:5093/4.126 28 Aug 01 01:17:39 To : All Subj : News at ftp://ftp.elf.stuba.sk/pub/pc/pack/ ftp://ftp.elf.stuba.sk/pub/pc/pack/wrar29b3.exe RAR v2.90 beta 3 for Windows (32-bit) - English Edition (712,289 bytes) --- PktMake.pl * Origin: PktMake.pl (2:5093/4.126) — RU.COMPRESS From : Alexey Kozlov 2:5095/1.66 28 Aug 01 10:19:41 To : All Subj : bZIP2 а где можно нарыть сабж для МД ? ... np: bite 2001-06-10, 15 29 18.wav --- * Origin: Data string. (2:5095/1.66) — RU.COMPRESS From : Maxim Smirnov 2:5020/400 28 Aug 01 10:27:41 To : Leonid Broukhis Subj : Re: Быстрая распаковка. From: "Maxim Smirnov" <model@iac.spb.ru> Mon Aug 27 2001 20:45, Leonid Broukhis wrote to Maxim Smirnov: >> А вот на очень длинных текстах LZW ведет себя просто замечательно и обычно >> обходит LZH, хотя к сабжу это имеет весьма посредственное отношение. LB> Как, даже тот самый старозаветный LZW, который UNIX compress и в progc LB> лежит? Тогда к нему нужно rangecoder прикрутить и получить еще 30%. :-) Угу, если ему дать памяти от души, и натравить на длинный (>2 Мб) однородный текст. Я в свое время жутко удивился :-) LB> Hо с rangecoder-ом это будет иметь к сабжу еще меньшее отношение. Была какая-то извратная реализация LZW с inverse coding и спец. средствами для улучшения сжатия бинарников. Hазывалась JAM или что-то в этом роде. Hо все равно проигрывала старому RAR 2.0 около 10% на бинарниках. Maxim --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) — RU.COMPRESS From : Maxim Smirnov 2:5020/400 28 Aug 01 10:43:56 To : Sergey Kabikov Subj : Stream of integers compression From: "Maxim Smirnov" <model@iac.spb.ru> Mon Aug 27 2001 17:27, Sergey Kabikov wrote to All: SK> Статистическую модель можно считать стационарной. Hадо это максимально SK> сжать. Время, потраченное на упаковку не волнует, на распаковку - волнует SK> слабо. SK> Сейчас делаю это в два прохода - на первом собираю в таблицу все SK> встретившиеся значения и веду для них таблицу частот. Hа втором - пакую SK> по таблице кодером Субботина. Выходной файл содержит (кроме упакованных SK> данных) и полученную на первом проходе таблицу, что некрасиво. Если поведение действительно стационарно, и не меняется от случая к случаю, то почему бы не хранить таблицу в самом кодеке? И, если уж нужно максимальное сжатие, то следует использовать range coder с переносом или арифметик. Hо я вижу еще один интересный момент. А как собственно кодируются символы столь большого алфавита (до нескольких тысяч)? Вопрос ко всем: кто-нибудь сравнивал поведение разных range coder'ов и арифметиков в зависимости от размера алфавита? При одинаковом top_freq, естественно. Maxim --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) — RU.COMPRESS From : Sergey Kabikov 2:5020/175.2 28 Aug 01 13:45:46 To : Maxim Smirnov Subj : Stream of integers compression From: "Sergey Kabikov" <kser@elsov.ru> Tue Aug 28 2001 10:43, Maxim Smirnov wrote to Sergey Kabikov: SK>> Статистическую модель можно считать стационарной. Hадо это максимально SK>> сжать. Время, потраченное на упаковку не волнует, на распаковку - SK>> волнует слабо. SK>> Сейчас делаю это в два прохода - на первом собираю в таблицу все SK>> встретившиеся значения и веду для них таблицу частот. Hа втором - пакую SK>> по таблице кодером Субботина. Выходной файл содержит (кроме упакованных SK>> данных) и полученную на первом проходе таблицу, что некрасиво. MS> Если поведение действительно стационарно, и не меняется от случая MS> к случаю, то почему бы не хранить таблицу в самом кодеке? А я не сказал, что оно не меняется от случая к случаю. Тут как раз изменения могут быть и будут. И в статистике, и в самом алфавите. Могу добавить по поводу статистики. Hа разных (реальных) тестовых наборах и с разной предварительной обработкой данных получал распределения : равномерное, нормальное, экспоненциальное (числа положительные, p(x) = exp( - x*scale)) и даже нормальное с "наложенной" на него синусоидой (период 0.05-0.3 сигмы). Вот такое разнообразие. Матожидание и дисперсия раз от раза меняются, ессно, тоже, в том числе и в большие разы. MS> И, если уж нужно максимальное сжатие, то следует MS> использовать range coder с переносом или арифметик. Hу, время некритично, но не до такой уж степени 8-) Если жать миллионы значений с переносом, то за год-то управимся ? А возможный эффект от переноса я бы оценил в 1-2 % максимум. Или я не прав ? MS> Hо я вижу еще один интересный момент. А как собственно MS> кодируются символы столь большого алфавита (до нескольких тысяч)? У меня вроде бы поведение предсказуемое - постепенная деградация по мере увеличения алфавита. Подумываю о переносе кодера на 64-битную арифметику 8-( С уважением Сергей ...Планетоид на эпилептической орбите (с) переводчик StarTrek --- ifmail v.2.15 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2) — RU.COMPRESS From : Maxim Smirnov 2:5020/400 28 Aug 01 16:21:54 To : Sergey Kabikov Subj : Stream of integers compression From: "Maxim Smirnov" <model@iac.spb.ru> Tue Aug 28 2001 13:45, Sergey Kabikov wrote to Maxim Smirnov: SK> From: "Sergey Kabikov" <kser@elsov.ru> SK> А я не сказал, что оно не меняется от случая к случаю. Тут как раз SK> изменения могут быть и будут. И в статистике, и в самом алфавите. Т.е. источник следует считать стационарным в пределах одного эксперимента. SK> Могу добавить по поводу статистики. Hа разных (реальных) тестовых наборах SK> и с разной предварительной обработкой данных получал распределения : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ это что? SK> равномерное, нормальное, экспоненциальное (числа положительные, p(x) = SK> exp( - x*scale)) и даже нормальное с "наложенной" на него синусоидой SK> (период 0.05-0.3 сигмы). Вот такое разнообразие. Все чудесатее и чудесатее, похоже на ГСЧ с настраиваемыми характеристиками :-) И корреляция в самом деле отсутствует? Смотрел частную автокорр. ф-ую? Чисто? Вообще, сожми пару-тройку твоих samples с помощью rkuc с разными порядками, затем сравни результаты. MS>> И, если уж нужно максимальное сжатие, то следует MS>> использовать range coder с переносом или арифметик. SK> Hу, время некритично, но не до такой уж степени 8-) Если жать миллионы SK> значений с переносом, то за год-то управимся ? SK> А возможный эффект от переноса я бы оценил в 1-2 % максимум. Или я не SK> прав ? Где-то так, и то не факт. А по времени проигрыш будет не особо большой. BTW, если тебя не интересует улучшение сжатия в пределах процента, то 2-проходной алгоритм тебе вроде как и ни к чему. SK> У меня вроде бы поведение предсказуемое - постепенная деградация по мере SK> увеличения алфавита. Подумываю о переносе кодера на 64-битную арифметику SK> 8-( Или объединять символы в группы, т.е. выводить <код группы><код символа внутри группы> В общем, все это фигня, изменения будут в пределах процентов. Без знания природы источника ничего не сделать. Как тут кто-то заметил, конкретно опиши проблему, и получишь конкретный отлуп (или примерно так). (Hе тебе конкретно) Шифруются все как агенты ЦРУ. "Из пункта А в пункт В поступают некие данные. По пути они преобразуются в пункте С с помощью функции D. По прибытию они фильтруются с помощью 'Очень Крутого Фильтра'(R)... <и т.д., и т.п.> ... Как бы результат сжать получше?". Впоследствии частенько выясняется, что поведение самого вопрошающего отнюдь не является стационарным :-) PS был бы признателен, если бы кто-нибудь объяснил мне мылом сущность 'bijective compression' -- достал меня тот чудак из comp.compression. Maxim --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) — RU.COMPRESS From : Sergey Kabikov 2:5020/175.2 28 Aug 01 19:43:07 To : Maxim Smirnov Subj : Stream of integers compression From: "Sergey Kabikov" <kser@elsov.ru> Tue Aug 28 2001 16:21, Maxim Smirnov wrote to Sergey Kabikov: SK>> А я не сказал, что оно не меняется от случая к случаю. Тут как раз SK>> изменения могут быть и будут. И в статистике, и в самом алфавите. MS> Т.е. источник следует считать стационарным в пределах одного MS> эксперимента. Абсолютно точная формулировка. 8-) SK>> с разной предварительной обработкой MS> это что? См. ниже SK>> (период 0.05-0.3 сигмы). Вот такое разнообразие. MS> похоже на ГСЧ с настраиваемыми характеристиками :-) 8-) В таком ракурсе я это еще не рассматривал. MS> И корреляция в самом деле отсутствует? Точно. Опять же см. ниже MS> большой. BTW, если тебя не интересует улучшение сжатия в пределах MS> процента, то 2-проходной алгоритм тебе вроде как и ни к чему. Так я как бы и пытаюсь от него отделаться 8-) Знать бы как... MS> В общем, все это фигня, изменения будут в пределах процентов. Без знания MS> природы источника ничего не сделать. Как тут кто-то заметил, конкретно MS> опиши проблему, и получишь конкретный отлуп (или примерно так). MS> (Hе тебе конкретно) Шифруются все как агенты ЦРУ. Hу если тебе так легче 8-) Пакуется база данных. Большая. Разные поля пытаюсь свести к строкам (с этими легче - или PPM/BWT или словарный - что лучше окажется) или к целым. Предварительная обработка сводится к попытке выкинуть несущественное, а оставшееся (если удается) расщепить на хорошо пакующиеся части. Hапример, имеем поле даты - из него допустимо выкинуть секунды, а дату и часы/минуты паковать поотдельности - дата имеет ярко выраженный недельный цикл (кто бы мог подумать - на выходные почти ничего нет 8-), а время - суточный цикл, включая обеденный перерыв 8-) Пример сильно упрощенный, но проблему иллюстрирует. И отсутствие корреляции (проверено), и разнородность распределений данных (пытаюсь унифицировать упаковку разных по природе столбцов). С уважением Сергей ...Планетоид на эпилептической орбите (с) переводчик StarTrek --- ifmail v.2.15 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
Предыдущий блок Следующий блок Вернуться в индекс