示例#1
0
        public static AutoStatePredictor loadFromFile(string file)
        {
            byte[] saveArray = System.IO.File.ReadAllBytes(file);

            AutoStatePredictor load = null;

            //version check
            if (saveArray[0] == 0)
            {
                int symbolSize = BitConverter.ToInt32(saveArray, 1);
                int stateSize  = BitConverter.ToInt32(saveArray, 5);
                load = new AutoStatePredictor(symbolSize, stateSize);
                load.trainingDepth = BitConverter.ToInt32(saveArray, 9);
                for (int i = 0; i < load.table.Length; i++)
                {
                    load.table[i] = saveArray[13 + i];
                }
            }
            else
            {
                throw new Exception("Invalid file version.");
            }

            return(load);
        }
示例#2
0
        public static void leapOverride(AutoStatePredictor destination, AutoStatePredictor original, Random rdm, double intensity)
        {
            destination.reset();
            //Copy original to destination
            original.table.CopyTo(destination.table, 0);

            destination.trainingDepth = original.trainingDepth + 1;

            //Choose the number of changes to make to the original based on intensity
            //not very optimal
            int changeCount = rdm.Next(2 + (int)(original.table.Length * intensity));

            destination.lastLeapCount = changeCount;

            //Make changes
            int index;

            for (int i = 0; i < changeCount; i++)
            {
                //Choose random table index for change
                index = rdm.Next(destination.table.Length);

                //Check if index is prediction image or state image
                destination.table[index] = (byte)rdm.Next(destination.symbolSize); //New random prediction at index
            }

            destination.computeStateTransitionsTable();
        }
示例#3
0
        public void train(SymbolCorpus trainSet, int cycles)
        {
            Random rdm = new Random();

            AutoStatePredictor predictor = new AutoStatePredictor(symbolSize, stateSize);

            //Make copy of current
            copyInto(this, predictor);

            if (predictor.trainingDepth == 0)
            {
                randomOverride(predictor, rdm);

                //Read and predict analysis
                predictor.testPredict(trainSet);

                //TODO Generate some more randoms and choose best - might not be needed since leap Intensity is so high at the beginning
            }

            //Initialize training variables
            AutoStatePredictor testTable = new AutoStatePredictor(predictor.symbolSize, predictor.stateSize);
            AutoStatePredictor temp;

            double leapIntensity = predictor.lastLeapIntensity * 2;

            if (leapIntensity > 0.9)
            {
                leapIntensity = 0.9;
            }
            for (int i = 0; i < cycles; i++)
            {
                //Mutation
                leapOverride(testTable, predictor, rdm, leapIntensity);

                //Read and predict analysis
                testTable.testPredict(trainSet);

                if (testTable.accuracy > predictor.accuracy)
                {
                    //Best predictor found

                    //Soft change with memory for sucessful mutations intensity (x2 because of random average behaviour)
                    leapIntensity = 0.8 * leapIntensity + 0.2 * (2 * testTable.lastLeapIntensity);

                    if (leapIntensity > 0.9)
                    {
                        leapIntensity = 0.9; //maximum allowed mutation intensity
                    }
                    //Swap predictors for memory usage
                    temp      = predictor;
                    predictor = testTable;
                    testTable = temp;
                }
            }

            copyInto(predictor, this);
        }
示例#4
0
        public static void randomOverride(AutoStatePredictor destination, Random rdm)
        {
            destination.reset();
            destination.trainingDepth = 0;


            for (int i = 0; i < destination.table.Length; i++)
            {
                destination.table[i] = (byte)rdm.Next(destination.symbolSize); //New random prediction at index
            }

            destination.computeStateTransitionsTable();
        }
示例#5
0
 public static void copyInto(AutoStatePredictor original, AutoStatePredictor destination)
 {
     original.table.CopyTo(destination.table, 0);
     destination.errorCount      = original.errorCount;
     destination.lastLeapCount   = original.lastLeapCount;
     destination.predictionCount = original.predictionCount;
     destination.state           = original.state;
     destination.stateSize       = original.stateSize;
     destination.symbolSize      = original.symbolSize;
     destination.tableStride     = original.tableStride;
     destination.trainingDepth   = original.trainingDepth;
     original.stateMetrics.CopyTo(destination.stateMetrics, 0);
     destination.stateStride = original.stateStride;
     original.stateTransitionTable.CopyTo(destination.stateTransitionTable, 0);
     destination.lossCount = original.lossCount;
     original.lossTransitionTable.CopyTo(destination.lossTransitionTable, 0);
 }