internal void rescale(ModelPPM model) { int OldNS = NumStats, i = NumStats - 1, Adder, EscFreq; // STATE* p1, * p; State p1 = new State(model.Heap); State p = new State(model.Heap); State temp = new State(model.Heap); for (p.Address = model.FoundState.Address; p.Address != freqData.GetStats(); p.DecrementAddress()) { temp.Address = p.Address - State.Size; State.PPMDSwap(p, temp); } temp.Address = freqData.GetStats(); temp.IncrementFreq(4); freqData.IncrementSummFreq(4); EscFreq = freqData.SummFreq - p.Freq; Adder = (model.OrderFall != 0) ? 1 : 0; p.Freq = Utility.URShift((p.Freq + Adder), 1); freqData.SummFreq = p.Freq; do { p.IncrementAddress(); EscFreq -= p.Freq; p.Freq = Utility.URShift((p.Freq + Adder), 1); freqData.IncrementSummFreq(p.Freq); temp.Address = p.Address - State.Size; if (p.Freq > temp.Freq) { p1.Address = p.Address; StateRef tmp = new StateRef(); tmp.Values = p1; State temp2 = new State(model.Heap); State temp3 = new State(model.Heap); do { // p1[0]=p1[-1]; temp2.Address = p1.Address - State.Size; p1.SetValues(temp2); p1.DecrementAddress(); temp3.Address = p1.Address - State.Size; }while (p1.Address != freqData.GetStats() && tmp.Freq > temp3.Freq); p1.SetValues(tmp); } }while (--i != 0); if (p.Freq == 0) { do { i++; p.DecrementAddress(); }while (p.Freq == 0); EscFreq += i; NumStats = NumStats - i; if (NumStats == 1) { StateRef tmp = new StateRef(); temp.Address = freqData.GetStats(); tmp.Values = temp; // STATE tmp=*U.Stats; do { // tmp.Freq-=(tmp.Freq >> 1) tmp.DecrementFreq(Utility.URShift(tmp.Freq, 1)); EscFreq = Utility.URShift(EscFreq, 1); }while (EscFreq > 1); model.SubAlloc.freeUnits(freqData.GetStats(), Utility.URShift((OldNS + 1), 1)); oneState.SetValues(tmp); model.FoundState.Address = oneState.Address; return; } } EscFreq -= Utility.URShift(EscFreq, 1); freqData.IncrementSummFreq(EscFreq); int n0 = Utility.URShift((OldNS + 1), 1), n1 = Utility.URShift((NumStats + 1), 1); if (n0 != n1) { freqData.SetStats(model.SubAlloc.shrinkUnits(freqData.GetStats(), n0, n1)); } model.FoundState.Address = freqData.GetStats(); }
internal void Rescale(ModelPpm model) { int oldNs = NumStats, i = NumStats - 1, adder, escFreq; // STATE* p1, * p; State p1 = new State(model.Heap); State p = new State(model.Heap); State temp = new State(model.Heap); for (p.Address = model.FoundState.Address; p.Address != _freqData.GetStats(); p.DecrementAddress()) { temp.Address = p.Address - State.SIZE; State.PpmdSwap(p, temp); } temp.Address = _freqData.GetStats(); temp.IncrementFreq(4); _freqData.IncrementSummFreq(4); escFreq = _freqData.SummFreq - p.Freq; adder = (model.OrderFall != 0) ? 1 : 0; p.Freq = Utility.URShift((p.Freq + adder), 1); _freqData.SummFreq = p.Freq; do { p.IncrementAddress(); escFreq -= p.Freq; p.Freq = Utility.URShift((p.Freq + adder), 1); _freqData.IncrementSummFreq(p.Freq); temp.Address = p.Address - State.SIZE; if (p.Freq > temp.Freq) { p1.Address = p.Address; StateRef tmp = new StateRef(); tmp.Values = p1; State temp2 = new State(model.Heap); State temp3 = new State(model.Heap); do { // p1[0]=p1[-1]; temp2.Address = p1.Address - State.SIZE; p1.SetValues(temp2); p1.DecrementAddress(); temp3.Address = p1.Address - State.SIZE; }while (p1.Address != _freqData.GetStats() && tmp.Freq > temp3.Freq); p1.SetValues(tmp); } }while (--i != 0); if (p.Freq == 0) { do { i++; p.DecrementAddress(); }while (p.Freq == 0); escFreq += i; NumStats = NumStats - i; if (NumStats == 1) { StateRef tmp = new StateRef(); temp.Address = _freqData.GetStats(); tmp.Values = temp; // STATE tmp=*U.Stats; do { // tmp.Freq-=(tmp.Freq >> 1) tmp.DecrementFreq(Utility.URShift(tmp.Freq, 1)); escFreq = Utility.URShift(escFreq, 1); }while (escFreq > 1); model.SubAlloc.FreeUnits(_freqData.GetStats(), Utility.URShift((oldNs + 1), 1)); _oneState.SetValues(tmp); model.FoundState.Address = _oneState.Address; return; } } escFreq -= Utility.URShift(escFreq, 1); _freqData.IncrementSummFreq(escFreq); int n0 = Utility.URShift((oldNs + 1), 1), n1 = Utility.URShift((NumStats + 1), 1); if (n0 != n1) { _freqData.SetStats(model.SubAlloc.ShrinkUnits(_freqData.GetStats(), n0, n1)); } model.FoundState.Address = _freqData.GetStats(); }