internal int createChild(ModelPPM model, State pStats, StateRef firstState) { PPMContext pc = getTempPPMContext(model.SubAlloc.Heap); pc.Address = model.SubAlloc.allocContext(); if (pc != null) { pc.NumStats = 1; pc.setOneState(firstState); pc.setSuffix(this); pStats.SetSuccessor(pc); } return(pc.Address); }
private void restartModelRare() { Utility.Fill(charMask, 0); subAlloc.initSubAllocator(); initRL = -(maxOrder < 12 ? maxOrder : 12) - 1; int addr = subAlloc.allocContext(); minContext.Address = addr; maxContext.Address = addr; minContext.setSuffix(0); orderFall = maxOrder; minContext.NumStats = 256; minContext.FreqData.SummFreq = minContext.NumStats + 1; addr = subAlloc.allocUnits(256 / 2); foundState.Address = addr; minContext.FreqData.SetStats(addr); State state = new State(subAlloc.Heap); addr = minContext.FreqData.GetStats(); runLength = initRL; prevSuccess = 0; for (int i = 0; i < 256; i++) { state.Address = addr + i * State.Size; state.Symbol = i; state.Freq = 1; state.SetSuccessor(0); } for (int i = 0; i < 128; i++) { for (int k = 0; k < 8; k++) { for (int m = 0; m < 64; m += 8) { binSumm[i][k + m] = BIN_SCALE - InitBinEsc[k] / (i + 2); } } } for (int i = 0; i < 25; i++) { for (int k = 0; k < 16; k++) { SEE2Cont[i][k].Initialize(5 * i + 10); } } }
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 void restartModelRare() { Utility.Fill(charMask, 0); subAlloc.initSubAllocator(); initRL = -(maxOrder < 12 ? maxOrder : 12) - 1; int addr = subAlloc.allocContext(); minContext.Address = addr; maxContext.Address = addr; minContext.setSuffix(0); orderFall = maxOrder; minContext.NumStats = 256; minContext.FreqData.SummFreq = minContext.NumStats + 1; addr = subAlloc.allocUnits(256/2); foundState.Address = addr; minContext.FreqData.SetStats(addr); State state = new State(subAlloc.Heap); addr = minContext.FreqData.GetStats(); runLength = initRL; prevSuccess = 0; for (int i = 0; i < 256; i++) { state.Address = addr + i*State.Size; state.Symbol = i; state.Freq = 1; state.SetSuccessor(0); } for (int i = 0; i < 128; i++) { for (int k = 0; k < 8; k++) { for (int m = 0; m < 64; m += 8) { binSumm[i][k + m] = BIN_SCALE - InitBinEsc[k]/(i + 2); } } } for (int i = 0; i < 25; i++) { for (int k = 0; k < 16; k++) { SEE2Cont[i][k].Initialize(5*i + 10); } } }
internal int createChild(ModelPPM model, State pStats, StateRef firstState) { PPMContext pc = getTempPPMContext(model.SubAlloc.Heap); pc.Address = model.SubAlloc.allocContext(); if (pc != null) { pc.NumStats = 1; pc.setOneState(firstState); pc.setSuffix(this); pStats.SetSuccessor(pc); } return pc.Address; }