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); }
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(); }
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); }
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(); }
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); }