static void _FASTCALL StartModelRare(int MaxOrder) { int i, k, m, Step; ::MaxOrder=OrderFall=MaxOrder; InitSubAllocator(); MinContext = MaxContext = (PPM_CONTEXT*) AllocContext(); MinContext->Suffix=NULL; MinContext->NumStats=255; FoundState = MinContext->Stats = (PPM_CONTEXT::STATE*) AllocUnits(256/2); for (i=MinContext->SummFreq=MinContext->EscFreq=0;i < 256;i++) { MinContext->Stats[i].Symbol=i; MinContext->Stats[i].Freq=0; MinContext->Stats[i].Successor=NULL; } for (i=0;i < UP_FREQ;i++) QTable[i]=i; for (m=i=UP_FREQ, k=Step=1;i < 260;i++) { QTable[i]=m; if ( !--k ) { k = ++Step; m++; } } }
static void RestartModel(PPMdModelVariantI *self) { InitSubAllocator(self->core.alloc); memset(self->core.CharMask,0,sizeof(self->core.CharMask)); self->core.PrevSuccess=0; self->core.OrderFall=self->MaxOrder; self->core.RunLength=self->core.InitRL=-((self->MaxOrder<12)?self->MaxOrder:12)-1; self->MaxContext=NewPPMdContext(&self->core); self->MaxContext->LastStateIndex=255; self->MaxContext->SummFreq=257; self->MaxContext->States=AllocUnits(self->core.alloc,256/2); PPMdState *maxstates=PPMdContextStates(self->MaxContext,&self->core); for(int i=0;i<256;i++) { maxstates[i].Symbol=i; maxstates[i].Freq=1; maxstates[i].Successor=0; } static const uint16_t InitBinEsc[8]={0x3cdd,0x1f3f,0x59bf,0x48f3,0x64a1,0x5abc,0x6632,0x6051}; int i=0; for(int m=0;m<25;m++) { while(self->QTable[i]==m) i++; for(int k=0;k<8;k++) self->BinSumm[m][k]=BIN_SCALE-InitBinEsc[k]/(i+1); for(int k=8;k<64;k+=8) memcpy(&self->BinSumm[m][k],&self->BinSumm[m][0],8*sizeof(uint16_t)); } i=0; for(int m=0;m<24;m++) { while(self->QTable[i+3]==m+3) i++; for(int k=0;k<32;k++) self->SEE2Cont[m][k]=MakeSEE2(2*i+5,7); } }