public int decodeChar(LZMA.RangeCoder.Decoder decoder) { if (minContext.NumStats != 1) { State s = tempState1.Initialize(Heap); s.Address = minContext.FreqData.GetStats(); int i; int count, hiCnt; if ((count = (int)decoder.GetThreshold((uint)minContext.FreqData.SummFreq)) < (hiCnt = s.Freq)) { byte symbol; decoder.Decode(0, (uint)s.Freq); symbol = (byte)s.Symbol; minContext.update1_0(this, s.Address); nextContext(); return(symbol); } prevSuccess = 0; i = minContext.NumStats - 1; do { s.IncrementAddress(); if ((hiCnt += s.Freq) > count) { byte symbol; decoder.Decode((uint)(hiCnt - s.Freq), (uint)s.Freq); symbol = (byte)s.Symbol; minContext.update1(this, s.Address); nextContext(); return(symbol); } } while (--i > 0); if (count >= minContext.FreqData.SummFreq) { return(-2); } hiBitsFlag = HB2Flag[foundState.Symbol]; decoder.Decode((uint)hiCnt, (uint)(minContext.FreqData.SummFreq - hiCnt)); for (i = 0; i < 256; i++) { charMask[i] = -1; } charMask[s.Symbol] = 0; i = minContext.NumStats - 1; do { s.DecrementAddress(); charMask[s.Symbol] = 0; } while (--i > 0); } else { State rs = tempState1.Initialize(Heap); rs.Address = minContext.getOneState().Address; hiBitsFlag = getHB2Flag()[foundState.Symbol]; int off1 = rs.Freq - 1; int off2 = minContext.getArrayIndex(this, rs); int bs = binSumm[off1][off2]; if (decoder.DecodeBit((uint)bs, 14) == 0) { byte symbol; binSumm[off1][off2] = (bs + INTERVAL - minContext.getMean(bs, PERIOD_BITS, 2)) & 0xFFFF; foundState.Address = rs.Address; symbol = (byte)rs.Symbol; rs.IncrementFreq((rs.Freq < 128) ? 1 : 0); prevSuccess = 1; incRunLength(1); nextContext(); return(symbol); } bs = (bs - minContext.getMean(bs, PERIOD_BITS, 2)) & 0xFFFF; binSumm[off1][off2] = bs; initEsc = PPMContext.ExpEscape[Utility.URShift(bs, 10)]; int i; for (i = 0; i < 256; i++) { charMask[i] = -1; } charMask[rs.Symbol] = 0; prevSuccess = 0; } for (;;) { State s = tempState1.Initialize(Heap); int i; int freqSum, count, hiCnt; SEE2Context see; int num, numMasked = minContext.NumStats; do { orderFall++; minContext.Address = minContext.getSuffix(); if (minContext.Address <= subAlloc.PText || minContext.Address > subAlloc.HeapEnd) { return(-1); } } while (minContext.NumStats == numMasked); hiCnt = 0; s.Address = minContext.FreqData.GetStats(); i = 0; num = minContext.NumStats - numMasked; do { int k = charMask[s.Symbol]; hiCnt += s.Freq & k; minContext.ps[i] = s.Address; s.IncrementAddress(); i -= k; } while (i != num); see = minContext.makeEscFreq(this, numMasked, out freqSum); freqSum += hiCnt; count = (int)decoder.GetThreshold((uint)freqSum); if (count < hiCnt) { byte symbol; State ps = tempState2.Initialize(Heap); for (hiCnt = 0, i = 0, ps.Address = minContext.ps[i]; (hiCnt += ps.Freq) <= count; i++, ps.Address = minContext.ps[i]) { ; } s.Address = ps.Address; decoder.Decode((uint)(hiCnt - s.Freq), (uint)s.Freq); see.update(); symbol = (byte)s.Symbol; minContext.update2(this, s.Address); updateModel(); return(symbol); } if (count >= freqSum) { return(-2); } decoder.Decode((uint)hiCnt, (uint)(freqSum - hiCnt)); see.Summ = see.Summ + freqSum; do { s.Address = minContext.ps[--i]; charMask[s.Symbol] = 0; } while (i != 0); } }
private void updateModel() { //System.out.println("ModelPPM.updateModel()"); // STATE fs = *FoundState, *p = NULL; StateRef fs = tempStateRef1; fs.Values = foundState; State p = tempState3.Initialize(Heap); State tempState = tempState4.Initialize(Heap); PPMContext pc = tempPPMContext3.Initialize(Heap); PPMContext successor = tempPPMContext4.Initialize(Heap); int ns1, ns, cf, sf, s0; pc.Address = minContext.getSuffix(); if (fs.Freq < MAX_FREQ / 4 && pc.Address != 0) { if (pc.NumStats != 1) { p.Address = pc.FreqData.GetStats(); if (p.Symbol != fs.Symbol) { do { p.IncrementAddress(); } while (p.Symbol != fs.Symbol); tempState.Address = p.Address - State.Size; if (p.Freq >= tempState.Freq) { State.PPMDSwap(p, tempState); p.DecrementAddress(); } } if (p.Freq < MAX_FREQ - 9) { p.IncrementFreq(2); pc.FreqData.IncrementSummFreq(2); } } else { p.Address = pc.getOneState().Address; if (p.Freq < 32) { p.IncrementFreq(1); } } } if (orderFall == 0) { foundState.SetSuccessor(createSuccessors(true, p)); minContext.Address = foundState.GetSuccessor(); maxContext.Address = foundState.GetSuccessor(); if (minContext.Address == 0) { updateModelRestart(); return; } return; } subAlloc.Heap[subAlloc.PText] = (byte)fs.Symbol; subAlloc.incPText(); successor.Address = subAlloc.PText; if (subAlloc.PText >= subAlloc.FakeUnitsStart) { updateModelRestart(); return; } // // Debug // subAlloc.dumpHeap(); if (fs.GetSuccessor() != 0) { if (fs.GetSuccessor() <= subAlloc.PText) { fs.SetSuccessor(createSuccessors(false, p)); if (fs.GetSuccessor() == 0) { updateModelRestart(); return; } } if (--orderFall == 0) { successor.Address = fs.GetSuccessor(); if (maxContext.Address != minContext.Address) { subAlloc.decPText(1); } } } else { foundState.SetSuccessor(successor.Address); fs.SetSuccessor(minContext); } // // Debug // subAlloc.dumpHeap(); ns = minContext.NumStats; s0 = minContext.FreqData.SummFreq - (ns) - (fs.Freq - 1); for (pc.Address = maxContext.Address; pc.Address != minContext.Address; pc.Address = pc.getSuffix()) { if ((ns1 = pc.NumStats) != 1) { if ((ns1 & 1) == 0) { //System.out.println(ns1); pc.FreqData.SetStats(subAlloc.expandUnits(pc.FreqData.GetStats(), Utility.URShift(ns1, 1))); if (pc.FreqData.GetStats() == 0) { updateModelRestart(); return; } } // bug fixed // int sum = ((2 * ns1 < ns) ? 1 : 0) + // 2 * ((4 * ((ns1 <= ns) ? 1 : 0)) & ((pc.getFreqData() // .getSummFreq() <= 8 * ns1) ? 1 : 0)); int sum = ((2 * ns1 < ns) ? 1 : 0) + 2 * (((4 * ns1 <= ns) ? 1 : 0) & ((pc.FreqData.SummFreq <= 8 * ns1) ? 1 : 0)); pc.FreqData.IncrementSummFreq(sum); } else { p.Address = subAlloc.allocUnits(1); if (p.Address == 0) { updateModelRestart(); return; } p.SetValues(pc.getOneState()); pc.FreqData.SetStats(p); if (p.Freq < MAX_FREQ / 4 - 1) { p.IncrementFreq(p.Freq); } else { p.Freq = MAX_FREQ - 4; } pc.FreqData.SummFreq = (p.Freq + initEsc + (ns > 3 ? 1 : 0)); } cf = 2 * fs.Freq * (pc.FreqData.SummFreq + 6); sf = s0 + pc.FreqData.SummFreq; if (cf < 6 * sf) { cf = 1 + (cf > sf ? 1 : 0) + (cf >= 4 * sf ? 1 : 0); pc.FreqData.IncrementSummFreq(3); } else { cf = 4 + (cf >= 9 * sf ? 1 : 0) + (cf >= 12 * sf ? 1 : 0) + (cf >= 15 * sf ? 1 : 0); pc.FreqData.IncrementSummFreq(cf); } p.Address = pc.FreqData.GetStats() + ns1 * State.Size; p.SetSuccessor(successor); p.Symbol = fs.Symbol; p.Freq = cf; pc.NumStats = ++ns1; } int address = fs.GetSuccessor(); maxContext.Address = address; minContext.Address = address; //TODO-----debug // int pos = minContext.getFreqData().getStats(); // State a = new State(getHeap()); // a.Address=pos); // pos+=State.size; // a.Address=pos); //--dbg end return; }
private int createSuccessors(bool Skip, SharpCompress.Compressor.PPMd.H.State p1) { StateRef firstState = this.tempStateRef2; SharpCompress.Compressor.PPMd.H.State pStats = this.tempState1.Initialize(this.Heap); PPMContext context = this.tempPPMContext1.Initialize(this.Heap); context.Address = this.minContext.Address; PPMContext context2 = this.tempPPMContext2.Initialize(this.Heap); context2.Address = this.foundState.GetSuccessor(); SharpCompress.Compressor.PPMd.H.State state2 = this.tempState2.Initialize(this.Heap); int num = 0; bool flag = false; if (!Skip) { this.ps[num++] = this.foundState.Address; if (context.getSuffix() == 0) { flag = true; } } if (flag) { goto Label_01E0; } bool flag2 = false; if (p1.Address != 0) { state2.Address = p1.Address; context.Address = context.getSuffix(); flag2 = true; } Label_00F2: if (!flag2) { context.Address = context.getSuffix(); if (context.NumStats != 1) { state2.Address = context.FreqData.GetStats(); if (state2.Symbol != this.foundState.Symbol) { do { state2.IncrementAddress(); }while (state2.Symbol != this.foundState.Symbol); } } else { state2.Address = context.getOneState().Address; } } flag2 = false; if (state2.GetSuccessor() != context2.Address) { context.Address = state2.GetSuccessor(); } else { this.ps[num++] = state2.Address; if (context.getSuffix() != 0) { goto Label_00F2; } } Label_01E0: if (num != 0) { firstState.Symbol = this.Heap[context2.Address]; firstState.SetSuccessor((int)(context2.Address + 1)); if (context.NumStats != 1) { if (context.Address <= this.subAlloc.PText) { return(0); } state2.Address = context.FreqData.GetStats(); if (state2.Symbol != firstState.Symbol) { do { state2.IncrementAddress(); }while (state2.Symbol != firstState.Symbol); } int num2 = state2.Freq - 1; int num3 = (context.FreqData.SummFreq - context.NumStats) - num2; firstState.Freq = 1 + (((2 * num2) <= num3) ? (((5 * num2) > num3) ? 1 : 0) : ((((2 * num2) + (3 * num3)) - 1) / (2 * num3))); } else { firstState.Freq = context.getOneState().Freq; } do { pStats.Address = this.ps[--num]; context.Address = context.createChild(this, pStats, firstState); if (context.Address == 0) { return(0); } }while (num != 0); } return(context.Address); }
private int createSuccessors(bool Skip, State p1) { //State upState = tempState1.Initialize(null); StateRef upState = tempStateRef2; State tempState = tempState1.Initialize(Heap); // PPM_CONTEXT* pc=MinContext, * UpBranch=FoundState->Successor; PPMContext pc = tempPPMContext1.Initialize(Heap); pc.Address = minContext.Address; PPMContext upBranch = tempPPMContext2.Initialize(Heap); upBranch.Address = foundState.GetSuccessor(); // STATE * p, * ps[MAX_O], ** pps=ps; State p = tempState2.Initialize(Heap); int pps = 0; bool noLoop = false; if (!Skip) { ps[pps++] = foundState.Address; // *pps++ = FoundState; if (pc.getSuffix() == 0) { noLoop = true; } } if (!noLoop) { bool loopEntry = false; if (p1.Address != 0) { p.Address = p1.Address; pc.Address = pc.getSuffix(); // =pc->Suffix; loopEntry = true; } do { if (!loopEntry) { pc.Address = pc.getSuffix(); // pc=pc->Suffix; if (pc.NumStats != 1) { p.Address = pc.FreqData.GetStats(); // p=pc->U.Stats if (p.Symbol != foundState.Symbol) { do { p.IncrementAddress(); } while (p.Symbol != foundState.Symbol); } } else { p.Address = pc.getOneState().Address; // p=&(pc->OneState); } } // LOOP_ENTRY: loopEntry = false; if (p.GetSuccessor() != upBranch.Address) { pc.Address = p.GetSuccessor(); // =p->Successor; break; } ps[pps++] = p.Address; } while (pc.getSuffix() != 0); } // NO_LOOP: if (pps == 0) { return(pc.Address); } upState.Symbol = Heap[upBranch.Address]; // UpState.Symbol=*(byte*) // UpBranch; // UpState.Successor=(PPM_CONTEXT*) (((byte*) UpBranch)+1); upState.SetSuccessor(upBranch.Address + 1); //TODO check if +1 necessary if (pc.NumStats != 1) { if (pc.Address <= subAlloc.PText) { return(0); } p.Address = pc.FreqData.GetStats(); if (p.Symbol != upState.Symbol) { do { p.IncrementAddress(); } while (p.Symbol != upState.Symbol); } int cf = p.Freq - 1; int s0 = pc.FreqData.SummFreq - pc.NumStats - cf; // UpState.Freq=1+((2*cf <= s0)?(5*cf > s0):((2*cf+3*s0-1)/(2*s0))); upState.Freq = 1 + ((2 * cf <= s0) ? (5 * cf > s0 ? 1 : 0) : ((2 * cf + 3 * s0 - 1) / (2 * s0))); } else { upState.Freq = pc.getOneState().Freq; // UpState.Freq=pc->OneState.Freq; } do { // pc = pc->createChild(this,*--pps,UpState); tempState.Address = ps[--pps]; pc.Address = pc.createChild(this, tempState, upState); if (pc.Address == 0) { return(0); } } while (pps != 0); return(pc.Address); }
private void updateModel() { StateRef ref2 = this.tempStateRef1; ref2.Values = this.foundState; SharpCompress.Compressor.PPMd.H.State state = this.tempState3.Initialize(this.Heap); SharpCompress.Compressor.PPMd.H.State state2 = this.tempState4.Initialize(this.Heap); PPMContext context = this.tempPPMContext3.Initialize(this.Heap); PPMContext successor = this.tempPPMContext4.Initialize(this.Heap); context.Address = this.minContext.getSuffix(); if ((ref2.Freq < 0x1f) && (context.Address != 0)) { if (context.NumStats != 1) { state.Address = context.FreqData.GetStats(); if (state.Symbol != ref2.Symbol) { do { state.IncrementAddress(); }while (state.Symbol != ref2.Symbol); state2.Address = state.Address - 6; if (state.Freq >= state2.Freq) { SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state, state2); state.DecrementAddress(); } } if (state.Freq < 0x73) { state.IncrementFreq(2); context.FreqData.IncrementSummFreq(2); } } else { state.Address = context.getOneState().Address; if (state.Freq < 0x20) { state.IncrementFreq(1); } } } if (this.orderFall == 0) { this.foundState.SetSuccessor(this.createSuccessors(true, state)); this.minContext.Address = this.foundState.GetSuccessor(); this.maxContext.Address = this.foundState.GetSuccessor(); if (this.minContext.Address == 0) { this.updateModelRestart(); } } else { this.subAlloc.Heap[this.subAlloc.PText] = (byte)ref2.Symbol; this.subAlloc.incPText(); successor.Address = this.subAlloc.PText; if (this.subAlloc.PText >= this.subAlloc.FakeUnitsStart) { this.updateModelRestart(); } else { if (ref2.GetSuccessor() != 0) { if (ref2.GetSuccessor() <= this.subAlloc.PText) { ref2.SetSuccessor(this.createSuccessors(false, state)); if (ref2.GetSuccessor() == 0) { this.updateModelRestart(); return; } } if (--this.orderFall == 0) { successor.Address = ref2.GetSuccessor(); if (this.maxContext.Address != this.minContext.Address) { this.subAlloc.decPText(1); } } } else { this.foundState.SetSuccessor(successor.Address); ref2.SetSuccessor(this.minContext); } int numStats = this.minContext.NumStats; int num5 = (this.minContext.FreqData.SummFreq - numStats) - (ref2.Freq - 1); context.Address = this.maxContext.Address; while (context.Address != this.minContext.Address) { int number = context.NumStats; if (number != 1) { if ((number & 1) == 0) { context.FreqData.SetStats(this.subAlloc.expandUnits(context.FreqData.GetStats(), Utility.URShift(number, 1))); if (context.FreqData.GetStats() == 0) { this.updateModelRestart(); return; } } int num6 = (((2 * number) < numStats) ? 1 : 0) + (2 * ((((4 * number) <= numStats) ? 1 : 0) & ((context.FreqData.SummFreq <= (8 * number)) ? 1 : 0))); context.FreqData.IncrementSummFreq(num6); } else { state.Address = this.subAlloc.allocUnits(1); if (state.Address == 0) { this.updateModelRestart(); return; } state.SetValues(context.getOneState()); context.FreqData.SetStats(state); if (state.Freq < 30) { state.IncrementFreq(state.Freq); } else { state.Freq = 120; } context.FreqData.SummFreq = (state.Freq + this.initEsc) + ((numStats > 3) ? 1 : 0); } int dSummFreq = (2 * ref2.Freq) * (context.FreqData.SummFreq + 6); int num4 = num5 + context.FreqData.SummFreq; if (dSummFreq < (6 * num4)) { dSummFreq = (1 + ((dSummFreq > num4) ? 1 : 0)) + ((dSummFreq >= (4 * num4)) ? 1 : 0); context.FreqData.IncrementSummFreq(3); } else { dSummFreq = ((4 + ((dSummFreq >= (9 * num4)) ? 1 : 0)) + ((dSummFreq >= (12 * num4)) ? 1 : 0)) + ((dSummFreq >= (15 * num4)) ? 1 : 0); context.FreqData.IncrementSummFreq(dSummFreq); } state.Address = context.FreqData.GetStats() + (number * 6); state.SetSuccessor(successor); state.Symbol = ref2.Symbol; state.Freq = dSummFreq; context.NumStats = ++number; context.Address = context.getSuffix(); } int num7 = ref2.GetSuccessor(); this.maxContext.Address = num7; this.minContext.Address = num7; } } }