MCPcopy Create free account
hub / github.com/abbeycode/UnrarKit / rescale

Method rescale

Libraries/unrar/model.cpp:119–168  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

117
118
119void RARPPM_CONTEXT::rescale(ModelPPM *Model)
120{
121 int OldNS=NumStats, i=NumStats-1, Adder, EscFreq;
122 RARPPM_STATE* p1, * p;
123 for (p=Model->FoundState;p != U.Stats;p--)
124 _PPMD_SWAP(p[0],p[-1]);
125 U.Stats->Freq += 4;
126 U.SummFreq += 4;
127 EscFreq=U.SummFreq-p->Freq;
128 Adder=(Model->OrderFall != 0);
129 U.SummFreq = (p->Freq=(p->Freq+Adder) >> 1);
130 do
131 {
132 EscFreq -= (++p)->Freq;
133 U.SummFreq += (p->Freq=(p->Freq+Adder) >> 1);
134 if (p[0].Freq > p[-1].Freq)
135 {
136 RARPPM_STATE tmp=*(p1=p);
137 do
138 {
139 p1[0]=p1[-1];
140 } while (--p1 != U.Stats && tmp.Freq > p1[-1].Freq);
141 *p1=tmp;
142 }
143 } while ( --i );
144 if (p->Freq == 0)
145 {
146 do
147 {
148 i++;
149 } while ((--p)->Freq == 0);
150 EscFreq += i;
151 if ((NumStats -= i) == 1)
152 {
153 RARPPM_STATE tmp=*U.Stats;
154 do
155 {
156 tmp.Freq-=(tmp.Freq >> 1);
157 EscFreq>>=1;
158 } while (EscFreq > 1);
159 Model->SubAlloc.FreeUnits(U.Stats,(OldNS+1) >> 1);
160 *(Model->FoundState=&OneState)=tmp; return;
161 }
162 }
163 U.SummFreq += (EscFreq -= (EscFreq >> 1));
164 int n0=(OldNS+1) >> 1, n1=(NumStats+1) >> 1;
165 if (n0 != n1)
166 U.Stats = (RARPPM_STATE*) Model->SubAlloc.ShrinkUnits(U.Stats,n0,n1);
167 Model->FoundState=U.Stats;
168}
169
170
171inline RARPPM_CONTEXT* ModelPPM::CreateSuccessors(bool Skip,RARPPM_STATE* p1)

Callers

nothing calls this directly

Calls 3

_PPMD_SWAPFunction · 0.85
FreeUnitsMethod · 0.80
ShrinkUnitsMethod · 0.80

Tested by

no test coverage detected