//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 }
// 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 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); }
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; }
static void Main(string[] args) { if (args.Length < 7) { Console.WriteLine("Usage: ModelEvaluator.exe <results_file> <model_id> <model_file> <finished_flag> <passwords_found_file> <config_file> <outputs> [passwords] [pw_length]"); return; } Console.WriteLine("Starting"); PasswordEvolutionExperiment experiment = new PasswordEvolutionExperiment(); int curArg = 0; string resultsFile = args[curArg++]; int modelId = int.Parse(args[curArg++]); string modelFile = args[curArg++]; string finishedFlag = args[curArg++]; string passwordsFoundFile = args[curArg++]; string configFile = args[curArg++]; int outputs = int.Parse(args[curArg++]); experiment.OutputCount = outputs; // Load the XML configuration file XmlDocument xmlConfig = new XmlDocument(); xmlConfig.Load(configFile); experiment.Initialize("evaluation", xmlConfig.DocumentElement); // Optionally load the passwords from somewhere besides the file specified // in the experiment config file. if (args.Length > curArg) { Console.WriteLine("Passwords file: {0}", args[curArg]); string passwordFile = args[curArg++]; int?pwLength = null; if (args.Length > curArg) { Console.WriteLine("Password Length: {0}", args[curArg]); pwLength = int.Parse(args[curArg++]); } // Load the passwords to evaluate with experiment.Passwords = PasswordUtil.LoadPasswords(passwordFile, pwLength); Console.WriteLine("Passwords loaded"); } PasswordCrackingEvaluator.Passwords = experiment.Passwords; PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(experiment.GuessesPerIndividual, experiment.Hashed); var modelGenome = experiment.LoadPopulation(XmlReader.Create(modelFile))[0]; var model = experiment.CreateGenomeDecoder().Decode(modelGenome); using (TextWriter tw = new StreamWriter(resultsFile)) { // Evaluate if (model == null) { // Non-viable genome. tw.WriteLine("0.0 0.0"); } else { FitnessInfo fitnessInfo = eval.Evaluate(model); tw.WriteLine(fitnessInfo._fitness + " " + fitnessInfo._alternativeFitness); } } using (TextWriter writer = new StreamWriter(passwordsFoundFile)) foreach (var pw in eval.FoundPasswords) { writer.WriteLine(pw); } File.Create(finishedFlag); }
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); }
static void Main(string[] args) { if (args.Length < 7) { Console.WriteLine("Usage: ModelEvaluator.exe <results_file> <model_id> <model_file> <finished_flag> <passwords_found_file> <config_file> <outputs> [passwords] [pw_length]"); return; } Console.WriteLine("Starting"); PasswordEvolutionExperiment experiment = new PasswordEvolutionExperiment(); int curArg = 0; string resultsFile = args[curArg++]; int modelId = int.Parse(args[curArg++]); string modelFile = args[curArg++]; string finishedFlag = args[curArg++]; string passwordsFoundFile = args[curArg++]; string configFile = args[curArg++]; int outputs = int.Parse(args[curArg++]); experiment.OutputCount = outputs; // Load the XML configuration file XmlDocument xmlConfig = new XmlDocument(); xmlConfig.Load(configFile); experiment.Initialize("evaluation", xmlConfig.DocumentElement); // Optionally load the passwords from somewhere besides the file specified // in the experiment config file. if (args.Length > curArg) { Console.WriteLine("Passwords file: {0}", args[curArg]); string passwordFile = args[curArg++]; int? pwLength = null; if (args.Length > curArg) { Console.WriteLine("Password Length: {0}", args[curArg]); pwLength = int.Parse(args[curArg++]); } // Load the passwords to evaluate with experiment.Passwords = PasswordUtil.LoadPasswords(passwordFile, pwLength); Console.WriteLine("Passwords loaded"); } PasswordCrackingEvaluator.Passwords = experiment.Passwords; PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(experiment.GuessesPerIndividual, experiment.Hashed); var modelGenome = experiment.LoadPopulation(XmlReader.Create(modelFile))[0]; var model = experiment.CreateGenomeDecoder().Decode(modelGenome); using (TextWriter tw = new StreamWriter(resultsFile)) { // Evaluate if (model == null) { // Non-viable genome. tw.WriteLine("0.0 0.0"); } else { FitnessInfo fitnessInfo = eval.Evaluate(model); tw.WriteLine(fitnessInfo._fitness + " " + fitnessInfo._alternativeFitness); } } using(TextWriter writer = new StreamWriter(passwordsFoundFile)) foreach(var pw in eval.FoundPasswords) writer.WriteLine(pw); File.Create(finishedFlag); }