예제 #1
0
        // Debug
        //    public void dumpHeap() {
        //        subAlloc.dumpHeap();
        //    }

        internal bool decodeInit(Stream stream, int maxOrder, int maxMemory)
        {
            if (stream != null)
            {
                coder = new RangeCoder(stream);
            }

            if (maxOrder == 1)
            {
                subAlloc.stopSubAllocator();
                return(false);
            }
            subAlloc.startSubAllocator(maxMemory);
            minContext = new PPMContext(Heap);
            //medContext = new PPMContext(Heap);
            maxContext    = new PPMContext(Heap);
            foundState    = new State(Heap);
            dummySEE2Cont = new SEE2Context();
            for (int i = 0; i < 25; i++)
            {
                for (int j = 0; j < 16; j++)
                {
                    SEE2Cont[i][j] = new SEE2Context();
                }
            }
            startModelRare(maxOrder);

            return(minContext.Address != 0);
        }
예제 #2
0
 public ModelPPM()
 {
     InitBlock();
     minContext = null;
     maxContext = null;
     //medContext = null;
 }
예제 #3
0
 internal bool decodeInit(Stream stream, int maxOrder, int maxMemory)
 {
     if (stream != null)
     {
         this.coder = new RangeCoder(stream);
     }
     if (maxOrder == 1)
     {
         this.subAlloc.stopSubAllocator();
         return(false);
     }
     this.subAlloc.startSubAllocator(maxMemory);
     this.minContext    = new PPMContext(this.Heap);
     this.maxContext    = new PPMContext(this.Heap);
     this.foundState    = new SharpCompress.Compressor.PPMd.H.State(this.Heap);
     this.dummySEE2Cont = new SEE2Context();
     for (int i = 0; i < 0x19; i++)
     {
         for (int j = 0; j < 0x10; j++)
         {
             this.SEE2Cont[i][j] = new SEE2Context();
         }
     }
     this.startModelRare(maxOrder);
     return(this.minContext.Address != 0);
 }
예제 #4
0
        private SEE2Context makeEscFreq2(ModelPPM model, int Diff)
        {
            SEE2Context psee2c;
            int         numStats = NumStats;

            if (numStats != 256)
            {
                PPMContext suff = getTempPPMContext(model.Heap);
                suff.Address = getSuffix();
                int idx1 = model.getNS2Indx()[Diff - 1];
                int idx2 = 0;
                idx2  += ((Diff < suff.NumStats - numStats) ? 1 : 0);
                idx2  += 2 * ((freqData.SummFreq < 11 * numStats) ? 1 : 0);
                idx2  += 4 * ((model.NumMasked > Diff) ? 1 : 0);
                idx2  += model.HiBitsFlag;
                psee2c = model.getSEE2Cont()[idx1][idx2];
                model.Coder.SubRange.Scale = psee2c.Mean;
            }
            else
            {
                psee2c = model.DummySEE2Cont;
                model.Coder.SubRange.Scale = 1;
            }
            return(psee2c);
        }
예제 #5
0
 public ModelPPM()
 {
     InitBlock();
     minContext = null;
     maxContext = null;
     //medContext = null;
 }
예제 #6
0
        internal SEE2Context makeEscFreq(ModelPPM model, int numMasked, out int escFreq)
        {
            SEE2Context psee2c;
            int         numStats  = NumStats;
            int         nonMasked = numStats - numMasked;

            if (numStats != 256)
            {
                PPMContext suff = getTempPPMContext(model.Heap);
                suff.Address = getSuffix();
                int idx1 = model.getNS2Indx()[nonMasked - 1];
                int idx2 = 0;
                idx2   += ((nonMasked < suff.NumStats - numStats) ? 1 : 0);
                idx2   += 2 * ((freqData.SummFreq < 11 * numStats) ? 1 : 0);
                idx2   += 4 * ((numMasked > nonMasked) ? 1 : 0);
                idx2   += model.HiBitsFlag;
                psee2c  = model.getSEE2Cont()[idx1][idx2];
                escFreq = psee2c.Mean;
            }
            else
            {
                psee2c  = model.DummySEE2Cont;
                escFreq = 1;
            }
            return(psee2c);
        }
예제 #7
0
 private PPMContext getTempPPMContext(byte[] Memory)
 {
     if (tempPPMContext == null)
     {
         tempPPMContext = new PPMContext(null);
     }
     return(tempPPMContext.Initialize(Memory));
 }
예제 #8
0
        internal bool decodeInit(Unpack unpackRead, int escChar)
        {
            int  MaxOrder = unpackRead.Char & 0xff;
            bool reset    = ((MaxOrder & 0x20) != 0);

            int MaxMB = 0;

            if (reset)
            {
                MaxMB = unpackRead.Char;
            }
            else
            {
                if (subAlloc.GetAllocatedMemory() == 0)
                {
                    return(false);
                }
            }
            if ((MaxOrder & 0x40) != 0)
            {
                escChar = unpackRead.Char;
                unpackRead.PpmEscChar = escChar;
            }
            coder = new RangeCoder(unpackRead);
            if (reset)
            {
                MaxOrder = (MaxOrder & 0x1f) + 1;
                if (MaxOrder > 16)
                {
                    MaxOrder = 16 + (MaxOrder - 16) * 3;
                }
                if (MaxOrder == 1)
                {
                    subAlloc.stopSubAllocator();
                    return(false);
                }
                subAlloc.startSubAllocator((MaxMB + 1) << 20);
                minContext = new PPMContext(Heap);
                //medContext = new PPMContext(Heap);
                maxContext    = new PPMContext(Heap);
                foundState    = new State(Heap);
                dummySEE2Cont = new SEE2Context();
                for (int i = 0; i < 25; i++)
                {
                    for (int j = 0; j < 16; j++)
                    {
                        SEE2Cont[i][j] = new SEE2Context();
                    }
                }
                startModelRare(MaxOrder);
            }
            return(minContext.Address != 0);
        }
예제 #9
0
        internal int getArrayIndex(ModelPPM Model, SharpCompress.Compressor.PPMd.H.State rs)
        {
            PPMContext context = this.getTempPPMContext(Model.SubAlloc.Heap);

            context.Address = this.getSuffix();
            int num = 0;

            num += Model.PrevSuccess;
            num += Model.getNS2BSIndx()[context.NumStats - 1];
            num += Model.HiBitsFlag + (2 * Model.getHB2Flag()[rs.Symbol]);
            return(num + (Utility.URShift(Model.RunLength, 0x1a) & 0x20));
        }
예제 #10
0
 public PPMContext(byte[] Memory) : base(Memory)
 {
     this.tempState1     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState2     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState3     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState4     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState5     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempPPMContext = null;
     this.ps             = new int[0x100];
     this.oneState       = new SharpCompress.Compressor.PPMd.H.State(Memory);
     this.freqData       = new SharpCompress.Compressor.PPMd.H.FreqData(Memory);
 }
예제 #11
0
        internal int getArrayIndex(ModelPPM Model, State rs)
        {
            PPMContext tempSuffix = getTempPPMContext(Model.SubAlloc.Heap);

            tempSuffix.Address = getSuffix();
            int ret = 0;

            ret += Model.PrevSuccess;
            ret += Model.getNS2BSIndx()[tempSuffix.NumStats - 1];
            ret += Model.HiBitsFlag + 2 * Model.getHB2Flag()[rs.Symbol];
            ret += ((Utility.URShift(Model.RunLength, 26)) & 0x20);
            return(ret);
        }
예제 #12
0
 public PPMContext(byte[] Memory)
     : base(Memory)
 {
     this.tempState1 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState2 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState3 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState4 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState5 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempPPMContext = null;
     this.ps = new int[0x100];
     this.oneState = new SharpCompress.Compressor.PPMd.H.State(Memory);
     this.freqData = new SharpCompress.Compressor.PPMd.H.FreqData(Memory);
 }
예제 #13
0
        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);
        }
예제 #14
0
        internal int createChild(ModelPPM model, SharpCompress.Compressor.PPMd.H.State pStats, StateRef firstState)
        {
            PPMContext successor = this.getTempPPMContext(model.SubAlloc.Heap);

            successor.Address = model.SubAlloc.allocContext();
            if (successor != null)
            {
                successor.NumStats = 1;
                successor.setOneState(firstState);
                successor.setSuffix(this);
                pStats.SetSuccessor(successor);
            }
            return(successor.Address);
        }
예제 #15
0
        internal bool decodeInit(Unpack unpackRead, int escChar)
        {
            int  maxOrder = unpackRead.Char & 0xff;
            bool flag     = (maxOrder & 0x20) != 0;
            int  num2     = 0;

            if (flag)
            {
                num2 = unpackRead.Char;
            }
            else if (this.subAlloc.GetAllocatedMemory() == 0)
            {
                return(false);
            }
            if ((maxOrder & 0x40) != 0)
            {
                escChar = unpackRead.Char;
                unpackRead.PpmEscChar = escChar;
            }
            this.coder = new RangeCoder(unpackRead);
            if (flag)
            {
                maxOrder = (maxOrder & 0x1f) + 1;
                if (maxOrder > 0x10)
                {
                    maxOrder = 0x10 + ((maxOrder - 0x10) * 3);
                }
                if (maxOrder == 1)
                {
                    this.subAlloc.stopSubAllocator();
                    return(false);
                }
                this.subAlloc.startSubAllocator((num2 + 1) << 20);
                this.minContext    = new PPMContext(this.Heap);
                this.maxContext    = new PPMContext(this.Heap);
                this.foundState    = new SharpCompress.Compressor.PPMd.H.State(this.Heap);
                this.dummySEE2Cont = new SEE2Context();
                for (int i = 0; i < 0x19; i++)
                {
                    for (int j = 0; j < 0x10; j++)
                    {
                        this.SEE2Cont[i][j] = new SEE2Context();
                    }
                }
                this.startModelRare(maxOrder);
            }
            return(this.minContext.Address != 0);
        }
예제 #16
0
        private SEE2Context makeEscFreq2(ModelPPM model, int Diff)
        {
            SEE2Context context;
            int         numStats = this.NumStats;

            if (numStats != 0x100)
            {
                PPMContext context2 = this.getTempPPMContext(model.Heap);
                context2.Address = this.getSuffix();
                int index = model.getNS2Indx()[Diff - 1];
                int num3  = 0;
                num3   += (Diff < (context2.NumStats - numStats)) ? 1 : 0;
                num3   += 2 * ((this.freqData.SummFreq < (11 * numStats)) ? 1 : 0);
                num3   += 4 * ((model.NumMasked > Diff) ? 1 : 0);
                num3   += model.HiBitsFlag;
                context = model.getSEE2Cont()[index][num3];
                model.Coder.SubRange.Scale = context.Mean;
                return(context);
            }
            context = model.DummySEE2Cont;
            model.Coder.SubRange.Scale = 1L;
            return(context);
        }
예제 #17
0
        internal SEE2Context makeEscFreq(ModelPPM model, int numMasked, out int escFreq)
        {
            SEE2Context context;
            int         numStats = this.NumStats;
            int         num2     = numStats - numMasked;

            if (numStats != 0x100)
            {
                PPMContext context2 = this.getTempPPMContext(model.Heap);
                context2.Address = this.getSuffix();
                int index = model.getNS2Indx()[num2 - 1];
                int num4  = 0;
                num4   += (num2 < (context2.NumStats - numStats)) ? 1 : 0;
                num4   += 2 * ((this.freqData.SummFreq < (11 * numStats)) ? 1 : 0);
                num4   += 4 * ((numMasked > num2) ? 1 : 0);
                num4   += model.HiBitsFlag;
                context = model.getSEE2Cont()[index][num4];
                escFreq = context.Mean;
                return(context);
            }
            context = model.DummySEE2Cont;
            escFreq = 1;
            return(context);
        }
예제 #18
0
 public virtual void SetSuccessor(PPMContext successor)
 {
     SetSuccessor(successor.Address);
 }
예제 #19
0
 public virtual void SetSuccessor(PPMContext successor)
 {
     SetSuccessor(successor.Address);
 }
예제 #20
0
 internal bool decodeInit(Unpack unpackRead, int escChar)
 {
     int maxOrder = unpackRead.Char & 0xff;
     bool flag = (maxOrder & 0x20) != 0;
     int num2 = 0;
     if (flag)
     {
         num2 = unpackRead.Char;
     }
     else if (this.subAlloc.GetAllocatedMemory() == 0)
     {
         return false;
     }
     if ((maxOrder & 0x40) != 0)
     {
         escChar = unpackRead.Char;
         unpackRead.PpmEscChar = escChar;
     }
     this.coder = new RangeCoder(unpackRead);
     if (flag)
     {
         maxOrder = (maxOrder & 0x1f) + 1;
         if (maxOrder > 0x10)
         {
             maxOrder = 0x10 + ((maxOrder - 0x10) * 3);
         }
         if (maxOrder == 1)
         {
             this.subAlloc.stopSubAllocator();
             return false;
         }
         this.subAlloc.startSubAllocator((num2 + 1) << 20);
         this.minContext = new PPMContext(this.Heap);
         this.maxContext = new PPMContext(this.Heap);
         this.foundState = new SharpCompress.Compressor.PPMd.H.State(this.Heap);
         this.dummySEE2Cont = new SEE2Context();
         for (int i = 0; i < 0x19; i++)
         {
             for (int j = 0; j < 0x10; j++)
             {
                 this.SEE2Cont[i][j] = new SEE2Context();
             }
         }
         this.startModelRare(maxOrder);
     }
     return (this.minContext.Address != 0);
 }
예제 #21
0
 internal bool decodeInit(Stream stream, int maxOrder, int maxMemory)
 {
     if (stream != null)
     {
         this.coder = new RangeCoder(stream);
     }
     if (maxOrder == 1)
     {
         this.subAlloc.stopSubAllocator();
         return false;
     }
     this.subAlloc.startSubAllocator(maxMemory);
     this.minContext = new PPMContext(this.Heap);
     this.maxContext = new PPMContext(this.Heap);
     this.foundState = new SharpCompress.Compressor.PPMd.H.State(this.Heap);
     this.dummySEE2Cont = new SEE2Context();
     for (int i = 0; i < 0x19; i++)
     {
         for (int j = 0; j < 0x10; j++)
         {
             this.SEE2Cont[i][j] = new SEE2Context();
         }
     }
     this.startModelRare(maxOrder);
     return (this.minContext.Address != 0);
 }
예제 #22
0
 public ModelPPM()
 {
     this.InitBlock();
     this.minContext = null;
     this.maxContext = null;
 }
예제 #23
0
        // Debug
        //    public void dumpHeap() {
        //        subAlloc.dumpHeap();
        //    }

        internal bool decodeInit(Stream stream, int maxOrder, int maxMemory)
        {
            if (stream != null)
                coder = new RangeCoder(stream);

            if (maxOrder == 1)
            {
                subAlloc.stopSubAllocator();
                return (false);
            }
            subAlloc.startSubAllocator(maxMemory);
            minContext = new PPMContext(Heap);
            //medContext = new PPMContext(Heap);
            maxContext = new PPMContext(Heap);
            foundState = new State(Heap);
            dummySEE2Cont = new SEE2Context();
            for (int i = 0; i < 25; i++)
            {
                for (int j = 0; j < 16; j++)
                {
                    SEE2Cont[i][j] = new SEE2Context();
                }
            }
            startModelRare(maxOrder);

            return (minContext.Address != 0);
        }
예제 #24
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;
        }
예제 #25
0
        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);
        }
예제 #26
0
        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;
                }
            }
        }
예제 #27
0
 public ModelPPM()
 {
     this.InitBlock();
     this.minContext = null;
     this.maxContext = null;
 }
예제 #28
0
파일: PPMContext.cs 프로젝트: nickchal/pash
 private PPMContext getTempPPMContext(byte[] Memory)
 {
     if (tempPPMContext == null)
     {
         tempPPMContext = new PPMContext(null);
     }
     return tempPPMContext.Initialize(Memory);
 }
예제 #29
0
 internal void SetSuccessor(PPMContext successor)
 {
     SetSuccessor(successor.Address);
 }
예제 #30
0
 internal void setSuffix(PPMContext suffix)
 {
     setSuffix(suffix.Address);
 }
예제 #31
0
        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);
        }
예제 #32
0
파일: PPMContext.cs 프로젝트: nickchal/pash
 internal void setSuffix(PPMContext suffix)
 {
     setSuffix(suffix.Address);
 }
예제 #33
0
 internal void SetSuccessor(PPMContext successor)
 {
     SetSuccessor(successor.Address);
 }
예제 #34
0
        internal bool decodeInit(Unpack unpackRead, int escChar)
        {
            int MaxOrder = unpackRead.Char & 0xff;
            bool reset = ((MaxOrder & 0x20) != 0);

            int MaxMB = 0;
            if (reset)
            {
                MaxMB = unpackRead.Char;
            }
            else
            {
                if (subAlloc.GetAllocatedMemory() == 0)
                {
                    return (false);
                }
            }
            if ((MaxOrder & 0x40) != 0)
            {
                escChar = unpackRead.Char;
                unpackRead.PpmEscChar = escChar;
            }
            coder = new RangeCoder(unpackRead);
            if (reset)
            {
                MaxOrder = (MaxOrder & 0x1f) + 1;
                if (MaxOrder > 16)
                {
                    MaxOrder = 16 + (MaxOrder - 16)*3;
                }
                if (MaxOrder == 1)
                {
                    subAlloc.stopSubAllocator();
                    return (false);
                }
                subAlloc.startSubAllocator((MaxMB + 1) << 20);
                minContext = new PPMContext(Heap);
                //medContext = new PPMContext(Heap);
                maxContext = new PPMContext(Heap);
                foundState = new State(Heap);
                dummySEE2Cont = new SEE2Context();
                for (int i = 0; i < 25; i++)
                {
                    for (int j = 0; j < 16; j++)
                    {
                        SEE2Cont[i][j] = new SEE2Context();
                    }
                }
                startModelRare(MaxOrder);
            }
            return (minContext.Address != 0);
        }