예제 #1
0
 public Z3BaseParams(Z3BaseParams z3Parameters)
 {
     _queryAbortFunction = z3Parameters._queryAbortFunction;
 }
예제 #2
0
        internal void Solve(Z3BaseParams parameters, IEnumerable <IGoal> modelGoals,
                            Action <int> addRow, Func <int, ArithExpr> mkGoalRow, Action <Z3Result> setResult)
        {
            _variables.Clear();
            _goals.Clear();

            try
            {
                // Mark that we are in solving phase
                _isSolving = true;

                // Construct Z3
                ConstructSolver(parameters);

                // Add all the variables
                foreach (int vid in _model.VariableIndices)
                {
                    AddVariable(vid);
                }

                // Add all the rows
                foreach (int rid in _model.RowIndices)
                {
                    addRow(rid);
                }

                // Add enabled goals to optimization problem
                foreach (IGoal g in modelGoals)
                {
                    if (!g.Enabled)
                    {
                        continue;
                    }

                    ArithExpr gr = mkGoalRow(g.Index);
                    if (g.Minimize)
                    {
                        _goals.Add(g, _optSolver.MkMinimize(gr));
                    }
                    else
                    {
                        _goals.Add(g, _optSolver.MkMaximize(gr));
                    }
                }

                if (_goals.Any() && parameters.SMT2LogFile != null)
                {
                    Debug.WriteLine("Dumping SMT2 benchmark to log file...");
                    File.WriteAllText(parameters.SMT2LogFile, _optSolver.ToString());
                }

                bool aborted = parameters.QueryAbort();

                if (!aborted)
                {
                    // Start the abort thread
                    AbortWorker abortWorker = new AbortWorker(_context, parameters.QueryAbort);
                    Thread      abortThread = new Thread(abortWorker.Start);
                    abortThread.Start();

                    // Now solve the problem
                    Status status = _optSolver.Check();

                    // Stop the abort thread
                    abortWorker.Stop();
                    abortThread.Join();

                    switch (status)
                    {
                    case Status.SATISFIABLE:
                        Microsoft.Z3.Model model = _optSolver.Model;
                        Debug.Assert(model != null, "Should be able to get Z3 model.");
                        // Remember the solution values
                        foreach (KeyValuePair <int, Expr> pair in _variables)
                        {
                            var value = Utils.ToRational(model.Eval(pair.Value, true));
                            _model.SetValue(pair.Key, value);
                        }
                        // Remember all objective values
                        foreach (var pair in _goals)
                        {
                            var optimalValue = Utils.ToRational(pair.Value.Upper);
                            _model.SetValue(pair.Key.Index, optimalValue);
                        }
                        model.Dispose();
                        setResult(_goals.Any() ? Z3Result.Optimal : Z3Result.Feasible);
                        break;

                    case Status.UNSATISFIABLE:
                        setResult(Z3Result.Infeasible);
                        break;

                    case Status.UNKNOWN:
                        if (abortWorker.Aborted)
                        {
                            Microsoft.Z3.Model subOptimalModel = _optSolver.Model;
                            if (subOptimalModel != null && subOptimalModel.NumConsts != 0)
                            {
                                // Remember the solution values
                                foreach (KeyValuePair <int, Expr> pair in _variables)
                                {
                                    var value = Utils.ToRational(subOptimalModel.Eval(pair.Value, true));
                                    _model.SetValue(pair.Key, value);
                                }
                                // Remember all objective values
                                foreach (var pair in _goals)
                                {
                                    var optimalValue = Utils.ToRational(pair.Value.Upper);
                                    _model.SetValue(pair.Key.Index, optimalValue);
                                }
                                subOptimalModel.Dispose();

                                setResult(Z3Result.LocalOptimal);
                            }
                            else
                            {
                                setResult(Z3Result.Infeasible);
                            }
                        }
                        else
                        {
                            setResult(Z3Result.Interrupted);
                        }
                        break;

                    default:
                        Debug.Assert(false, "Unrecognized Z3 Status");
                        break;
                    }
                }
            }
            finally
            {
                _isSolving = false;
            }

            // Now kill Z3
            DestructSolver(true);
        }
예제 #3
0
        /// <summary>
        /// Constructs a Z3 solver to be used.
        /// </summary>
        internal void ConstructSolver(Z3BaseParams parameters)
        {
            // If Z3 is there already, kill it
            if (_context != null)
            {
                DestructSolver(false);
            }

            _context   = new Context();
            _optSolver = _context.MkOptimize();
            var p = _context.MkParams();

            switch (parameters.OptKind)
            {
            case OptimizationKind.BoundingBox:
                p.Add("priority", _context.MkSymbol("box"));
                break;

            case OptimizationKind.Lexicographic:
                p.Add("priority", _context.MkSymbol("lex"));
                break;

            case OptimizationKind.ParetoOptimal:
                p.Add("priority", _context.MkSymbol("pareto"));
                break;

            default:
                Debug.Assert(false, String.Format("Unknown optimization option {0}", parameters.OptKind));
                break;
            }

            switch (parameters.CardinalityAlgorithm)
            {
            case CardinalityAlgorithm.FuMalik:
                p.Add("maxsat_engine", _context.MkSymbol("fu_malik"));
                break;

            case CardinalityAlgorithm.CoreMaxSAT:
                p.Add("maxsat_engine", _context.MkSymbol("core_maxsat"));
                break;

            default:
                Debug.Assert(false, String.Format("Unknown cardinality algorithm option {0}", parameters.CardinalityAlgorithm));
                break;
            }

            switch (parameters.PseudoBooleanAlgorithm)
            {
            case PseudoBooleanAlgorithm.WeightedMaxSAT:
                p.Add("wmaxsat_engine", _context.MkSymbol("wmax"));
                break;

            case PseudoBooleanAlgorithm.IterativeWeightedMaxSAT:
                p.Add("wmaxsat_engine", _context.MkSymbol("iwmax"));
                break;

            case PseudoBooleanAlgorithm.BisectionWeightedMaxSAT:
                p.Add("wmaxsat_engine", _context.MkSymbol("bwmax"));
                break;

            case PseudoBooleanAlgorithm.WeightedPartialMaxSAT2:
                p.Add("wmaxsat_engine", _context.MkSymbol("wpm2"));
                break;

            default:
                Debug.Assert(false, String.Format("Unknown pseudo-boolean algorithm option {0}", parameters.PseudoBooleanAlgorithm));
                break;
            }

            switch (parameters.ArithmeticStrategy)
            {
            case ArithmeticStrategy.Basic:
                p.Add("engine", _context.MkSymbol("basic"));
                break;

            case ArithmeticStrategy.Farkas:
                p.Add("engine", _context.MkSymbol("farkas"));
                break;

            default:
                Debug.Assert(false, String.Format("Unknown arithmetic strategy option {0}", parameters.ArithmeticStrategy));
                break;
            }

            _optSolver.Parameters = p;
        }
예제 #4
0
파일: Z3BaseSolver.cs 프로젝트: jawline/z3
        /// <summary>
        /// Constructs a Z3 solver to be used.
        /// </summary>
        internal void ConstructSolver(Z3BaseParams parameters)
        {
            // If Z3 is there already, kill it
            if (_context != null)
            {
                DestructSolver(false);
            }

            _context = new Context();
            _optSolver = _context.MkOptimize();
            var p = _context.MkParams();

            switch (parameters.OptKind)
            {
                case OptimizationKind.BoundingBox:
                    p.Add("priority", _context.MkSymbol("box"));
                    break;
                case OptimizationKind.Lexicographic:
                    p.Add("priority", _context.MkSymbol("lex"));
                    break;
                case OptimizationKind.ParetoOptimal:
                    p.Add("priority", _context.MkSymbol("pareto"));
                    break;
                default:
                    Debug.Assert(false, String.Format("Unknown optimization option {0}", parameters.OptKind));
                    break;
            }

            switch (parameters.CardinalityAlgorithm)
            {
                case CardinalityAlgorithm.FuMalik:
                    p.Add("maxsat_engine", _context.MkSymbol("fu_malik"));
                    break;
                case CardinalityAlgorithm.CoreMaxSAT:
                    p.Add("maxsat_engine", _context.MkSymbol("core_maxsat"));
                    break;
                default:
                    Debug.Assert(false, String.Format("Unknown cardinality algorithm option {0}", parameters.CardinalityAlgorithm));
                    break;
            }

            switch (parameters.PseudoBooleanAlgorithm)
            {
                case PseudoBooleanAlgorithm.WeightedMaxSAT:
                    p.Add("wmaxsat_engine", _context.MkSymbol("wmax"));
                    break;
                case PseudoBooleanAlgorithm.IterativeWeightedMaxSAT:
                    p.Add("wmaxsat_engine", _context.MkSymbol("iwmax"));
                    break;
                case PseudoBooleanAlgorithm.BisectionWeightedMaxSAT:
                    p.Add("wmaxsat_engine", _context.MkSymbol("bwmax"));
                    break;
                case PseudoBooleanAlgorithm.WeightedPartialMaxSAT2:
                    p.Add("wmaxsat_engine", _context.MkSymbol("wpm2"));
                    break;
                default:
                    Debug.Assert(false, String.Format("Unknown pseudo-boolean algorithm option {0}", parameters.PseudoBooleanAlgorithm));
                    break;
            }

            switch (parameters.ArithmeticStrategy)
            {
                case ArithmeticStrategy.Basic:
                    p.Add("engine", _context.MkSymbol("basic"));
                    break;
                case ArithmeticStrategy.Farkas:
                    p.Add("engine", _context.MkSymbol("farkas"));
                    break;
                default:
                    Debug.Assert(false, String.Format("Unknown arithmetic strategy option {0}", parameters.ArithmeticStrategy));
                    break;
            }

            _optSolver.Parameters = p;
        }
예제 #5
0
파일: Z3BaseSolver.cs 프로젝트: jawline/z3
        internal void Solve(Z3BaseParams parameters, IEnumerable<IGoal> modelGoals, 
                            Action<int> addRow, Func<int, ArithExpr> mkGoalRow, Action<Z3Result> setResult)
        {
            _variables.Clear();
            _goals.Clear();

            try
            {
                // Mark that we are in solving phase
                _isSolving = true;

                // Construct Z3
                ConstructSolver(parameters);

                // Add all the variables
                foreach (int vid in _model.VariableIndices)
                {
                    AddVariable(vid);
                }

                // Add all the rows
                foreach (int rid in _model.RowIndices)
                {
                    addRow(rid);
                }

                // Add enabled goals to optimization problem
                foreach (IGoal g in modelGoals)
                {
                    if (!g.Enabled) continue;

                    ArithExpr gr = mkGoalRow(g.Index);
                    if (g.Minimize)
                        _goals.Add(g, _optSolver.MkMinimize(gr));
                    else
                        _goals.Add(g, _optSolver.MkMaximize(gr));
                }

                if (_goals.Any() && parameters.SMT2LogFile != null)
                {
                    Debug.WriteLine("Dumping SMT2 benchmark to log file...");
                    File.WriteAllText(parameters.SMT2LogFile, _optSolver.ToString());
                }

                bool aborted = parameters.QueryAbort();

                if (!aborted)
                {
                    // Start the abort thread
                    AbortWorker abortWorker = new AbortWorker(_context, parameters.QueryAbort);
                    Thread abortThread = new Thread(abortWorker.Start);
                    abortThread.Start();

                    // Now solve the problem
                    Status status = _optSolver.Check();

                    // Stop the abort thread
                    abortWorker.Stop();
                    abortThread.Join();

                    switch (status)
                    {
                        case Status.SATISFIABLE:
                            Microsoft.Z3.Model model = _optSolver.Model;
                            Debug.Assert(model != null, "Should be able to get Z3 model.");
                            // Remember the solution values
                            foreach (KeyValuePair<int, Expr> pair in _variables)
                            {
                                var value = Utils.ToRational(model.Eval(pair.Value, true));
                                _model.SetValue(pair.Key, value);
                            }
                            // Remember all objective values
                            foreach (var pair in _goals)
                            {
                                var optimalValue = Utils.ToRational(pair.Value.Upper);
                                _model.SetValue(pair.Key.Index, optimalValue);
                            }
                            model.Dispose();
                            setResult(_goals.Any() ? Z3Result.Optimal : Z3Result.Feasible);
                            break;
                        case Status.UNSATISFIABLE:
                            setResult(Z3Result.Infeasible);
                            break;
                        case Status.UNKNOWN:
                            if (abortWorker.Aborted)
                            {
                                Microsoft.Z3.Model subOptimalModel = _optSolver.Model;
                                if (subOptimalModel != null && subOptimalModel.NumConsts != 0)
                                {
                                    // Remember the solution values
                                    foreach (KeyValuePair<int, Expr> pair in _variables)
                                    {
                                        var value = Utils.ToRational(subOptimalModel.Eval(pair.Value, true));
                                        _model.SetValue(pair.Key, value);
                                    }
                                    // Remember all objective values
                                    foreach (var pair in _goals)
                                    {
                                        var optimalValue = Utils.ToRational(pair.Value.Upper);
                                        _model.SetValue(pair.Key.Index, optimalValue);
                                    }
                                    subOptimalModel.Dispose();

                                    setResult(Z3Result.LocalOptimal);
                                }
                                else
                                    setResult(Z3Result.Infeasible);
                            }
                            else
                                setResult(Z3Result.Interrupted);
                            break;
                        default:
                            Debug.Assert(false, "Unrecognized Z3 Status");
                            break;
                    }
                }
            }
            finally
            {
                _isSolving = false;
            }

            // Now kill Z3
            DestructSolver(true);
        }
예제 #6
0
 public Z3TermParams(Z3BaseParams z3Parameters) : base(z3Parameters)
 {
 }
예제 #7
0
 public Z3TermParams(Z3BaseParams z3Parameters) : base(z3Parameters) { }
예제 #8
0
 public Z3BaseParams(Z3BaseParams z3Parameters)
 {
     _queryAbortFunction = z3Parameters._queryAbortFunction;
 }
예제 #9
0
 public Z3MILPParams(Z3BaseParams z3Parameters) : base(z3Parameters)
 {
 }
예제 #10
0
 public Z3MILPParams(Z3BaseParams z3Parameters) : base (z3Parameters) { }