mirror of
https://github.com/Z3Prover/z3
synced 2025-04-13 04:28:17 +00:00
* introduce int_solver.h Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * add int_solver class Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * track which var is an integer Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * add queries for integrality of vars Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * resurrect lp_tst in its own director lp Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * add file Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * add_constraint has got a body Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * fix add_constraint and substitute_terms_in_linear_expression Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * after merge with Z3Prover Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * adding stub check_int_feasibility() Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * Dev (#50) * initial skeletons for nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * initial skeletons for nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * small fix in lar_solver.cpp Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * adding some content to the new check_int_feasibility() Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * Dev (#51) * initial skeletons for nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * initial skeletons for nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding more nlsat Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * nlsat integration Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding constraints Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add missing initialization Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * test Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * Dev (#53) * change in a comment Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * Disabled debug output * removing FOCI2 interface from interp * remove foci reference from cmakelist.txt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * initial skeletons for nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * initial skeletons for nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding more nlsat Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * nlsat integration Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding constraints Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add missing initialization Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding nra Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * debugging nra Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * updates to nra_solver integration to call it directly from theory_lra instead of over lar_solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * n/a Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * integrate nlsat Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * tidy Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * preserve is_int flag Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * remove a debug printout Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * Dev (#54) * change in a comment Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * Disabled debug output * removing FOCI2 interface from interp * remove foci reference from cmakelist.txt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * initial skeletons for nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * initial skeletons for nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding more nlsat Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * nlsat integration Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding constraints Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add missing initialization Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding nra solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding nra Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * debugging nra Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * updates to nra_solver integration to call it directly from theory_lra instead of over lar_solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * n/a Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * integrate nlsat Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * tidy Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use integer test from lra solver, updated it to work on term variables Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix equality check in assume-eq Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix model_is_int_feasible Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * untested gcd_test() Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * call fill_explanation_from_fixed_columns() Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * add the call to pivot_fixed_vars_from_basis() to int_solver.cpp::check() Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * port more of theory_arith_int.h Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * use statistics of lar_solver by theory_lra.cpp Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * port more code to int_solver.cpp Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * add an assert Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * more int porting Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * fix a bug in pivot_fixed_vars_from_basis Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * small change Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * implement find_inf_int_base_column() Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * catch unregistered vars in add_var_bound Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * add a file Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * compile for vs2012 Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * fix asserts in add_var_bound Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * fix the lp_solver init when workig on an mps file Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * towards int_solver::check() Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * change in int_solver::check() signature Signed-off-by: Lev Nachmanson <levnach@microsoft.com> * add handlers for lia moves Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * spacing Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
145 lines
4.6 KiB
C++
145 lines
4.6 KiB
C++
/*
|
|
Copyright (c) 2013 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
|
|
Author: Lev Nachmanson
|
|
*/
|
|
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
#include <string>
|
|
#include <set>
|
|
#include <iostream>
|
|
|
|
namespace lean {
|
|
class argument_parser {
|
|
std::unordered_map<std::string, std::string> m_options;
|
|
std::unordered_map<std::string, std::string> m_options_with_after_string;
|
|
std::set<std::string> m_used_options;
|
|
std::unordered_map<std::string, std::string> m_used_options_with_after_string;
|
|
std::vector<std::string> m_free_args;
|
|
std::vector<std::string> m_args;
|
|
|
|
public:
|
|
std::string m_error_message;
|
|
argument_parser(unsigned argn, char * const* args) {
|
|
for (unsigned i = 0; i < argn; i++) {
|
|
m_args.push_back(std::string(args[i]));
|
|
}
|
|
}
|
|
|
|
void add_option(std::string s) {
|
|
add_option_with_help_string(s, "");
|
|
}
|
|
|
|
void add_option_with_help_string(std::string s, std::string help_string) {
|
|
m_options[s]=help_string;
|
|
}
|
|
|
|
void add_option_with_after_string(std::string s) {
|
|
add_option_with_after_string_with_help(s, "");
|
|
}
|
|
|
|
void add_option_with_after_string_with_help(std::string s, std::string help_string) {
|
|
m_options_with_after_string[s]=help_string;
|
|
}
|
|
|
|
|
|
bool parse() {
|
|
bool status_is_ok = true;
|
|
for (unsigned i = 0; i < m_args.size(); i++) {
|
|
std::string ar = m_args[i];
|
|
if (m_options.find(ar) != m_options.end() )
|
|
m_used_options.insert(ar);
|
|
else if (m_options_with_after_string.find(ar) != m_options_with_after_string.end()) {
|
|
if (i == m_args.size() - 1) {
|
|
m_error_message = "Argument is missing after "+ar;
|
|
return false;
|
|
}
|
|
i++;
|
|
m_used_options_with_after_string[ar] = m_args[i];
|
|
} else {
|
|
if (starts_with(ar, "-") || starts_with(ar, "//"))
|
|
status_is_ok = false;
|
|
|
|
m_free_args.push_back(ar);
|
|
}
|
|
}
|
|
return status_is_ok;
|
|
}
|
|
|
|
bool contains(std::unordered_map<std::string, std::string> & m, std::string s) {
|
|
return m.find(s) != m.end();
|
|
}
|
|
|
|
bool contains(std::set<std::string> & m, std::string s) {
|
|
return m.find(s) != m.end();
|
|
}
|
|
|
|
bool option_is_used(std::string option) {
|
|
return contains(m_used_options, option) || contains(m_used_options_with_after_string, option);
|
|
}
|
|
|
|
std::string get_option_value(std::string option) {
|
|
auto t = m_used_options_with_after_string.find(option);
|
|
if (t != m_used_options_with_after_string.end()){
|
|
return t->second;
|
|
}
|
|
return std::string();
|
|
}
|
|
|
|
bool starts_with(std::string s, char const * prefix) {
|
|
return starts_with(s, std::string(prefix));
|
|
}
|
|
|
|
bool starts_with(std::string s, std::string prefix) {
|
|
return s.substr(0, prefix.size()) == prefix;
|
|
}
|
|
|
|
std::string usage_string() {
|
|
std::string ret = "";
|
|
std::vector<std::string> unknown_options;
|
|
for (auto t : m_free_args) {
|
|
if (starts_with(t, "-") || starts_with(t, "\\")) {
|
|
unknown_options.push_back(t);
|
|
}
|
|
}
|
|
if (unknown_options.size()) {
|
|
ret = "Unknown options:";
|
|
}
|
|
for (auto unknownOption : unknown_options) {
|
|
ret += unknownOption;
|
|
ret += ",";
|
|
}
|
|
ret += "\n";
|
|
ret += "Usage:\n";
|
|
for (auto allowed_option : m_options)
|
|
ret += allowed_option.first + " " + (allowed_option.second.size() == 0 ? std::string("") : std::string("/") + allowed_option.second) + std::string("\n");
|
|
for (auto s : m_options_with_after_string) {
|
|
ret += s.first + " " + (s.second.size() == 0? " \"option value\"":("\""+ s.second+"\"")) + "\n";
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void print() {
|
|
if (m_used_options.size() == 0 && m_used_options_with_after_string.size() == 0 && m_free_args.size() == 0) {
|
|
std::cout << "no options are given" << std::endl;
|
|
return;
|
|
}
|
|
std::cout << "options are: " << std::endl;
|
|
for (std::string s : m_used_options) {
|
|
std::cout << s << std::endl;
|
|
}
|
|
for (auto & t : m_used_options_with_after_string) {
|
|
std::cout << t.first << " " << t.second << std::endl;
|
|
}
|
|
if (m_free_args.size() > 0) {
|
|
std::cout << "free arguments are: " << std::endl;
|
|
for (auto & t : m_free_args) {
|
|
std::cout << t << " " << std::endl;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|