static void ValidateModel(MarkovChain model, Dictionary <string, double> passwords, int guesses, bool hashed) //passwords here is not used... { Console.Write("Validating on {0} guesses... ", guesses); PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(guesses, hashed); var results = eval.Validate(model); Console.WriteLine("Accounts: {0} Uniques: {1}", results._fitness, results._alternativeFitness); }
static void ValidateForest(List <MarkovChain> models, Dictionary <string, PasswordInfo> passwords, int guesses, bool hashed) //passwords here is not used... { Console.WriteLine("Number of champion models: {0}", models.Count); Console.WriteLine("Validating All-Star Team on {0} guesses each...", guesses); PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(guesses, hashed); eval.ValidatePopulation(models); double accounts = eval.FoundValidationPasswords.Sum(s => PasswordCrackingEvaluator.Passwords[s].Accounts); double uniques = eval.FoundValidationPasswords.Count; Console.WriteLine("Accounts: {0} Uniques: {1}", accounts, uniques); }
public NeatEvolutionAlgorithm <NeatGenome> CreateEvolutionAlgorithm(IGenomeFactory <NeatGenome> genomeFactory, List <NeatGenome> genomeList, IGenomeListEvaluator <NeatGenome> eval = null) { // Create distance metric. Mismatched genes have a fixed distance of 10; for matched genes the distance is their weigth difference. IDistanceMetric distanceMetric = new ManhattanDistanceMetric(1.0, 0.0, 10.0); ISpeciationStrategy <NeatGenome> speciationStrategy = new ParallelKMeansClusteringStrategy <NeatGenome>(distanceMetric, _parallelOptions); // Create complexity regulation strategy. IComplexityRegulationStrategy complexityRegulationStrategy = new NullComplexityRegulationStrategy();// ExperimentUtils.CreateComplexityRegulationStrategy(_complexityRegulationStr, _complexityThreshold); // Create the evolution algorithm. NeatEvolutionAlgorithm <NeatGenome> ea = new NeatEvolutionAlgorithm <NeatGenome>(_eaParams, speciationStrategy, complexityRegulationStrategy); // Create the MC evaluator PasswordCrackingEvaluator.Passwords = _passwords; // Create genome decoder. IGenomeDecoder <NeatGenome, MarkovChain> genomeDecoder = CreateGenomeDecoder(); // If we're running specially on Condor, skip this if (eval == null) { _evaluator = new PasswordCrackingEvaluator(_guesses, Hashed); // Create a genome list evaluator. This packages up the genome decoder with the genome evaluator. // IGenomeListEvaluator<NeatGenome> innerEvaluator = new ParallelGenomeListEvaluator<NeatGenome, MarkovChain>(genomeDecoder, _evaluator, _parallelOptions); IGenomeListEvaluator <NeatGenome> innerEvaluator = new ParallelNEATGenomeListEvaluator <NeatGenome, MarkovChain>(genomeDecoder, _evaluator, this); /* * // Wrap the list evaluator in a 'selective' evaulator that will only evaluate new genomes. That is, we skip re-evaluating any genomes * // that were in the population in previous generations (elite genomes). This is determiend by examining each genome's evaluation info object. * IGenomeListEvaluator<NeatGenome> selectiveEvaluator = new SelectiveGenomeListEvaluator<NeatGenome>( * innerEvaluator, * SelectiveGenomeListEvaluator<NeatGenome>.CreatePredicate_OnceOnly()); */ // Initialize the evolution algorithm. ea.Initialize(innerEvaluator, genomeFactory, genomeList); } else { // Initialize the evolution algorithm. ea.Initialize(eval, genomeFactory, genomeList); } // Finished. Return the evolution algorithm return(ea); }
/// <summary> /// Construct with the provided IGenomeDecoder, IPhenomeEvaluator, ParalleOptions and enablePhenomeCaching flag. /// </summary> public SerialGenomeListEvaluator(IGenomeDecoder <NeatGenome, MarkovChain> genomeDecoder, PasswordCrackingEvaluator passwordCrackingEvaluator, bool hashed = false) { _genomeDecoder = genomeDecoder; _passwordCrackingEvaluator = passwordCrackingEvaluator; }
/// <summary> /// Construct with the provided IGenomeDecoder and IPhenomeEvaluator. /// Phenome caching is enabled by default. /// The number of parallel threads defaults to Environment.ProcessorCount. /// </summary> public SerialGenomeListEvaluator(IGenomeDecoder <NeatGenome, MarkovChain> genomeDecoder, PasswordCrackingEvaluator passwordCrackingEvaluator) : this(genomeDecoder, passwordCrackingEvaluator, true) { }
// Runs a comparison of the two model types. static void RunAllMarkovModelPairs(object special) { const string EXPERIMENT_OFFSET = @"..\..\..\experiments\intermediate\"; string[] models = new string[] { "first-order", "8-layer" }; // For every dataset, create a model for (int i = 0; i < _datasetFilenames.Length; i++) { if (i != (int)special) { continue; } for (int m = 0; m < 2; m++) { int outputs; string seedFile = EXPERIMENT_OFFSET + "seed-" + models[m] + "-" + _datasetFilenames[i].Name + ".xml"; Console.Write("Building {0} Markov model...", models[m]); if (m == 0) { outputs = MarkovFilterCreator.GenerateFirstOrderMarkovFilter(seedFile, _passwords[i]); } else { outputs = MarkovFilterCreator.GenerateLayeredMarkovFilter(seedFile, _passwords[i], 8); } Console.WriteLine("Done! Outputs: {0}", outputs); _experiment.OutputCount = outputs; Console.WriteLine("Loading seed..."); var seed = _experiment.LoadPopulation(XmlReader.Create(seedFile))[0]; Console.WriteLine("Creating model..."); var model = _experiment.CreateGenomeDecoder().Decode(seed); // For every dataset, test the model for (int j = 0; j < _datasetFilenames.Length; j++) { Console.Write("Validating {0} {1} model on {2} with {3} guesses... ", models[m], _datasetFilenames[i].Name, _datasetFilenames[j].Name, VALIDATION_GUESSES); PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(VALIDATION_GUESSES, false); var results = eval.Validate(model, _passwords[j], EXPERIMENT_OFFSET + models[m] + "-" + _datasetFilenames[i].Name + "-" + _datasetFilenames[j].Name + ".csv", 10000); // Console.WriteLine("Accounts: {0} Uniques: {1}", results._fitness, results._alternativeFitness); Console.WriteLine("Total Score: {0} Uniques: {1}", results._fitness, results._alternativeFitness); lock (_writerLock) using (TextWriter writer = new StreamWriter(@"..\..\..\experiments\summary_results.csv", true)) writer.WriteLine("{0},{1},{2},{3},{4}%,{5}%", _datasetFilenames[i].Name, _datasetFilenames[j].Name, results._fitness, results._alternativeFitness, results._fitness / (double)_passwords[j].Sum(kv => kv.Value) * 100, results._alternativeFitness / (double)_passwords[j].Count * 100); } } } }
//static IGenomeDecoder<NeatGenome, MarkovChain> _genomeDecoder; //static PasswordCrackingEvaluator _passwordCrackingEvaluator; public static void Evaluate(IGenomeDecoder <NeatGenome, MarkovChain> genomeDecoder, PasswordCrackingEvaluator passwordCrackingEvaluator, PasswordEvolutionExperiment experiment) { string[] genomeFiles = Directory.GetFiles(@"..\..\..\experiments\genomes\", "*.xml"); XmlDocument doc = new XmlDocument(); int genomeNumber; foreach (string genomeFile in genomeFiles) { // Read in genome doc.Load(genomeFile); //NeatGenome genome = NeatGenomeXmlIO.LoadGenome(doc, false); //NeatGenomeFactory genomeFactory = (NeatGenomeFactory)CreateGenomeFactory(); NeatGenome genome = experiment.LoadPopulation(XmlReader.Create(genomeFile))[0]; MarkovChain phenome = experiment.CreateGenomeDecoder().Decode(genome);//genomeDecoder.Decode(genome); string[] filePath = genomeFile.Split('\\'); string[] fileName = (filePath[filePath.Length - 1]).Split('-'); String fileNumber = (fileName[1]).Split('.')[0]; genomeNumber = Convert.ToInt32(fileNumber); //FileStream fs = File.Open(@"..\..\..\experiments\genomes\genome-results\genome-"+genomeNumber+"-results.txt", FileMode.CreateNew, FileAccess.Write); TextWriter tw = new StreamWriter(@"..\..\..\experiments\genomes\genome-results\genome-" + genomeNumber + "-results.txt"); // Evaluate if (null == phenome) { // Non-viable genome. tw.WriteLine("0.0 0.0"); } else { FitnessInfo fitnessInfo = passwordCrackingEvaluator.Evaluate(phenome); double val = fitnessInfo._fitness; double val2 = fitnessInfo._alternativeFitness; tw.WriteLine(fitnessInfo._fitness + " " + fitnessInfo._alternativeFitness); } tw.Close(); File.Create(@"..\..\..\experiments\genomes\genome-finished\genome-" + genomeNumber + "-finished.txt"); } // Write results?? -> genome_#_results // Write finished flag -> genome_#_finished }
/// <summary> /// Construct with the provided IGenomeDecoder and IPhenomeEvaluator. /// Phenome caching is enabled by default. /// The number of parallel threads defaults to Environment.ProcessorCount. /// </summary> public ParallelNEATGenomeListEvaluator(IGenomeDecoder <NeatGenome, MarkovChain> genomeDecoder, PasswordCrackingEvaluator passwordCrackingEvaluator, PasswordEvolutionExperiment experiment) : this(genomeDecoder, passwordCrackingEvaluator, true) { this.experiment = experiment; }