public bool Generate(string outfile, uint nbest) { d_nbest = nbest; if (File.Exists(outfile)) { System.Console.Error.WriteLine("The file `{0}' already exists...", outfile); Environment.Exit(1); } if (d_args.Length == 0) { System.Console.Error.WriteLine("Please provide input databases"); Environment.Exit(1); } // Determine parameters from first db DbSpec firstSpec = new DbSpec(d_args[0]); Database db = OpenDatabase(firstSpec.Filename); StringBuilder parameterQuery = new StringBuilder(); StringBuilder dbcreate = new StringBuilder(); db.Query("SELECT `name` FROM parameters", delegate(IDataReader reader) { string name = (string)reader[0]; d_parameterColumns.Add(name); if (!String.IsNullOrEmpty(parameterQuery.ToString())) { parameterQuery.Append(", "); dbcreate.Append(", "); } parameterQuery.AppendFormat("`_p_{0}`", name); dbcreate.AppendFormat("`_p_{0}` DOUBLE", name); return(true); }); d_parameterQueryColumns = parameterQuery.ToString(); string[] data = db.ColumnNames("data"); StringBuilder dataQuery = new StringBuilder(); StringBuilder ddcreate = new StringBuilder(); foreach (string column in data) { if (!column.StartsWith("_d_")) { continue; } if (!String.IsNullOrEmpty(dataQuery.ToString())) { dataQuery.Append(", "); ddcreate.Append(", "); } d_dataColumns.Add(column.Substring(3)); dataQuery.AppendFormat("`{0}`", column); ddcreate.AppendFormat("`{0}` TEXT", column); } d_dataQueryColumns = dataQuery.ToString(); d_database = new Database(outfile); d_database.Query("CREATE TABLE `initial_population` (`id` INTEGER PRIMARY KEY, " + dbcreate.ToString() + ")"); d_database.Query("CREATE TABLE `initial_population_data` (`id` INTEGER PRIMARY KEY, " + ddcreate.ToString() + ")"); bool ret = true; for (int i = 0; i < d_args.Length; ++i) { DbSpec spec = new DbSpec(d_args[i]); db = OpenDatabase(spec.Filename); if (!SimilarDatabase(db)) { System.Console.Error.WriteLine("Not all databases have the same parameters"); ret = false; break; } AddPopulation(db, spec); } CloseAll(); d_database.Close(); if (!ret) { File.Delete(d_database.Filename); } else { System.Console.WriteLine("Written initial population to `{0}'", outfile); } return(ret); }
private void AddPopulation(Database db, DbSpec spec) { List <int> iterations = new List <int>(); List <int> solutions = new List <int>(); bool stagepso = false; bool pso = false; db.Query("SELECT name from extensions", (reader) => { string name = (string)reader.GetString(0); if (name == "StagePSO") { stagepso = true; return(false); } return(true); }); db.Query("SELECT name from job", (reader) => { string name = (string)reader.GetString(0); if (name.ToLower() == "pso") { pso = true; return(false); } return(true); }); string q; List <object> pars = new List <object>(); if (spec.Iteration == -1 && spec.Solution == -1) { if (stagepso) { q = "SELECT solution.`iteration`, solution.`index` from solution LEFT JOIN data ON (data.`index` = solution.`index` AND data.`iteration` = solution.`iteration`) ORDER BY data.`_d_StagePSO::stage` DESC, fitness DESC"; } else { q = "SELECT `iteration`, `index` FROM `solution` ORDER BY `fitness` DESC"; } } else if (spec.Iteration == -1) { if (stagepso) { q = "SELECT solution.`iteration`, solution.`index` from solution LEFT JOIN data ON (data.`index` = solution.`index` AND data.`iteration` = solution.`iteration`) WHERE solution.`index` = @0 ORDER BY data.`_d_StagePSO::stage` DESC, fitness DESC"; } else { q = "SELECT `iteration`, `index` FROM solution WHERE `index` = @0 ORDER BY `fitness` DESC"; } pars.Add(spec.Solution); } else if (spec.Solution == -1) { if (stagepso) { q = "SELECT solution.`iteration`, solution.`index` from solution LEFT JOIN data ON (data.`index` = solution.`index` AND data.`iteration` = solution.`iteration`) WHERE solution.`iteration` = @0 ORDER BY data.`_d_StagePSO::stage` DESC, fitness DESC"; } else { q = "SELECT `iteration`, `index` FROM solution WHERE `iteration` = @0 ORDER BY `fitness` DESC"; } pars.Add(spec.Iteration); } else { q = "SELECT `iteration`, `index` FROM solution WHERE `iteration` = @0 AND `index` = @1"; pars.Add(spec.Iteration); pars.Add(spec.Solution); } if (d_nbest == 1) { q += String.Format(" LIMIT 1"); } int numhad = 0; int lastsol = -1; db.Query(q, (reader) => { int cit = (int)reader.GetInt64(0); int csol = (int)reader.GetInt64(1); if (!pso || lastsol != csol) { iterations.Add(cit); solutions.Add(csol); lastsol = csol; ++numhad; } if (numhad >= d_nbest) { return(false); } return(true); }, pars.ToArray()); for (int j = 0; j < iterations.Count; ++j) { int iteration = iterations[j]; int solution = solutions[j]; q = "SELECT " + d_parameterQueryColumns + " FROM `parameter_values` WHERE `iteration` = @0 AND `index` = @1"; object[] rs = db.QueryFirst(q, iteration, solution); // Insert this solution in the initial population table List <string> vall = new List <string>(); for (int i = 0; i < rs.Length; ++i) { vall.Add(String.Format("@{0}", i)); } string valp = String.Join(", ", vall.ToArray()); d_database.Query("INSERT INTO `initial_population` (" + d_parameterQueryColumns + ") VALUES (" + valp + ")", rs); rs = db.QueryFirst("SELECT " + d_dataQueryColumns + " FROM `data` WHERE `iteration` = @0 AND `index` = @1", iteration, solution); vall.Clear(); for (int i = 0; i < rs.Length; ++i) { vall.Add(String.Format("@{0}", i)); } valp = String.Join(", ", vall.ToArray()); d_database.Query("INSERT INTO `initial_population_data` (" + d_dataQueryColumns + ") VALUES (" + valp + ")", rs); } }