Exemple #1
0
        public object Next()
        {
            ILineHandler rootHandler = CreateLineHandler();

            while (!builder.CanBuild)
            {
                string line = reader.ReadLine();
                if (line == null)
                {
                    return(null);
                }
                rootHandler.Handle(line);
            }
            return(builder.Build());
        }
        static void Main(string[] args)
        {
            if (null == args || args.Length == 0)
            {
                args = new[] { "vpm2.mps", "lpa.mps", "lpa2.mps", "lpa_ilp.mps", "afiro.mps", "noswot.mps", "bell5.mps", "gen-ip054.mps" };
            }

            foreach (var filename in args)
            {
                var lines = File.ReadAllLines(filename);

                var n = 0;

                var          matrix       = new Dictionary <Row, List <VariableInRow> >();
                var          constraints  = new Dictionary <string, Row>();
                var          variables    = new Dictionary <string, Variable>();
                var          problemName  = "Generic Problem";
                ILineHandler curreHandler = null;
                for (int i = 0; i < lines.Length; i++)
                {
                    var line = lines[i];
                    if (line.StartsWith("*") || string.IsNullOrWhiteSpace(line))
                    {
                        continue;
                    }
                    switch (line.Split(" ")[0])
                    {
                    case "NAME":
                        curreHandler = null;
                        problemName  = new string(line.Replace("NAME", "").SkipWhile(c => c == ' ').ToArray()).Replace(" ", "_").Replace("-", "_");
                        continue;

                    case "ROWS":
                        curreHandler = new RowLineHandler();
                        continue;

                    case "COLUMNS":
                        curreHandler = new ColumnLineHandler();
                        continue;

                    case "RHS":
                        curreHandler = new RHSLineHandler();
                        continue;

                    case "ENDATA":
                        curreHandler = null;
                        continue;

                    case "BOUNDS":
                        curreHandler = new BoundsLineHandler();
                        continue;

                    default:
                        curreHandler.HandleLine(line, matrix, constraints, variables);
                        break;
                    }
                }

                var bbMode = variables.Values.Any(v => v.VariableType == Variable.VariableTypes.Boolean || v.VariableType == Variable.VariableTypes.Integer);

                var sb = new StringBuilder();
                n = variables.Count;
                var p = constraints.Values.Count(c => c.RowType != Row.RowTypes.N);

                sb.AppendLine($"int {(bbMode ? "i" : "")}lp_{problemName.Replace(" ", "_")}({(bbMode ? "const idxint branching_strategy" : "")})");
                sb.AppendLine("{");

                sb.AppendLine($"idxint n = {n};");
                sb.AppendLine($"idxint m = {n};");
                sb.AppendLine($"idxint p = {p};");
                sb.AppendLine($"idxint l = {n};");
                sb.AppendLine("idxint nCones = 0;");
                sb.AppendLine();
                sb.AppendLine("// cost function");
                var costFunction = matrix[constraints.First(c => c.Value.RowType == Row.RowTypes.N).Value];

                sb.AppendLine($@"pfloat c[{n}] = {{{
                    string.Join(", ",
                        variables.Values.Select(variable =>
                        {
                            return costFunction.FirstOrDefault(v => v.Variable.Equals(variable))?.Coefficient ?? 0.0;
                        })
                    )}}};");

                sb.AppendLine();
                sb.AppendLine("//cone");
                sb.AppendLine($"idxint Gjc[{n + 1}] = {{{string.Join(", ", Enumerable.Range(0, n + 1))}}};");
                sb.AppendLine($"idxint Gir[{n}] = {{{string.Join(", ", Enumerable.Range(0, n))}}};");
                sb.AppendLine($"pfloat Gpr[{n}] = {{{string.Join(", ", Enumerable.Range(0, n).Select(_ => "-1.0"))}}};");
                sb.AppendLine($"pfloat h[{n}] = {{{string.Join(", ", Enumerable.Range(0, n).Select(_ => "0.0"))}}};");
                sb.AppendLine("idxint *q = NULL;");
                sb.AppendLine();
                sb.AppendLine("//lp matrix");

                var ajc = new List <int>();
                var air = new List <int>();
                var apr = new List <double>();

                foreach (var variable in variables.Values)
                {
                    ajc.Add(apr.Count);
                    int i = 0;
                    foreach (var constr in constraints.Values.Where(c => c.RowType != Row.RowTypes.N))
                    {
                        var varCoefficient = matrix[constr].FirstOrDefault(varInRow => varInRow.Variable.Equals(variable))?.Coefficient;
                        if (varCoefficient == null)
                        {
                            i++;
                            continue;
                        }

                        apr.Add(varCoefficient.Value);
                        air.Add(i);
                        i++;
                    }
                }

                ajc.Add(apr.Count);

                sb.AppendLine($@"idxint Ajc[{n + 1}] = {{{string.Join(", ", ajc)}}};");
                sb.AppendLine($@"idxint Air[{apr.Count}] = {{{string.Join(", ", air)}}};");
                sb.AppendLine($@"pfloat Apr[{apr.Count}] = {{{string.Join(", ", apr)}}};");
                sb.AppendLine($"pfloat b[{p}] = {{{string.Join(", ", constraints.Values.Where(c => c.RowType != Row.RowTypes.N).Select(c => c.B))}}};");

                if (bbMode)
                {
                    {
                        // add bool
                        var num_bool = variables.Values.Count(v => v.VariableType == Variable.VariableTypes.Boolean);
                        sb.AppendLine($"idxint num_bool = {num_bool};");
                        if (num_bool == 0)
                        {
                            sb.AppendLine("idxint *bool_idx = NULL;");
                        }
                        else
                        {
                            var boolIdx = new List <int>();
                            for (int i = 0; i < variables.Values.Count; i++)
                            {
                                if (variables.Values.ElementAt(i).VariableType == Variable.VariableTypes.Boolean)
                                {
                                    boolIdx.Add(i);
                                }
                            }

                            sb.AppendLine($"idxint bool_idx[{num_bool}] = {{{string.Join(", ", boolIdx)}}};");
                        }
                    }
                    {
                        // same code for int
                        var num_int = variables.Values.Count(v => v.VariableType == Variable.VariableTypes.Integer);
                        sb.AppendLine($"idxint num_int = {num_int};");
                        if (num_int == 0)
                        {
                            sb.AppendLine("idxint *int_idx = NULL;");
                        }
                        else
                        {
                            var intIdx = new List <int>();
                            for (int i = 0; i < variables.Values.Count; i++)
                            {
                                if (variables.Values.ElementAt(i).VariableType == Variable.VariableTypes.Integer)
                                {
                                    intIdx.Add(i);
                                }
                            }

                            sb.AppendLine($"idxint int_idx[{num_int}] = {{{string.Join(", ", intIdx)}}};");
                        }
                    }
                }

                var workName = problemName.Split(" ")[0];
                if (bbMode)
                {
                    sb.Append($"ecos_bb_pwork *{workName};");
                }
                else
                {
                    sb.AppendLine($"pwork *{workName};");
                }

                sb.AppendLine("idxint exitFlag;");

                if (bbMode)
                {
                    sb.AppendLine("settings_bb * settings = get_default_ECOS_BB_settings();");
                    sb.AppendLine("settings->branching_strategy = branching_strategy;");
                    sb.AppendLine($"{workName} = ECOS_BB_setup(n, m, p, l, nCones, q, 0, Gpr, Gjc, Gir, Apr, Ajc, Air, c, h, b, num_bool, bool_idx, num_int, int_idx, settings);");
                    sb.AppendLine($"exitFlag = ECOS_BB_solve({workName});");
                    sb.AppendLine("PRINTTEXT(\"exit flag: % d\\n\", exitFlag);");
                    sb.AppendLine($"PRINTTEXT(\"cost: %f\\n\", eddot({workName}->ecos_prob->n, {workName}->ecos_prob->x, {workName}->ecos_prob->c));");
                }
                else
                {
                    sb.AppendLine($"{workName} = ECOS_setup(n, m, p, l, nCones, q, 0, Gpr, Gjc, Gir, Apr, Ajc, Air, c, h, b);");
                    sb.AppendLine($"exitFlag = ECOS_solve({workName});");
                }

                sb.AppendLine($"for ( int i = 0; i < n; i++) {{ PRINTTEXT(\"X %d: %f\\n\", i, {workName}->x[i]); }}");

                if (bbMode)
                {
                    sb.AppendLine($"PRINTTEXT(\"UB: %f\\n\", {workName}->nodes->U);");
                    sb.AppendLine($"PRINTTEXT(\"LB: %f\\n\", {workName}->nodes->L);");
                    sb.AppendLine($"ECOS_BB_cleanup({workName}, 0);");
                }
                else
                {
                    sb.AppendLine($"PRINTTEXT(\"Objective: %f\\n\", {workName}->best_info->pcost);");
                    sb.AppendLine($"ECOS_cleanup({workName}, 0);");
                }

                sb.AppendLine("return exitFlag;");
                sb.AppendLine("}");
                File.WriteAllText($"{problemName}.c", sb.ToString());
            }
        }