| 117 | |
| 118 | |
| 119 | void 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 | |
| 171 | inline RARPPM_CONTEXT* ModelPPM::CreateSuccessors(bool Skip,RARPPM_STATE* p1) |
nothing calls this directly
no test coverage detected