Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }