int main(int argc, char** argv) { if (argc != 2) std::cout << "Usage: ./application_name.exe scattered_data_filename.csv" << std::endl; else { run_visualization(argv[1]); } return 0; }
int process_main(OpenSMTContext & ctx, config const & config, vector<Enode *> const & costs, unordered_map<string, Enode*> var_map, vector<Enode *> const & ctrs_X) { // minimize cost_i(x) // satisfying ctr_j(x) // // exists x. ctr(x) /\ forall y. [ctr(y) -> (cost(x) <= cost(y))] // exists x. ctr(x) /\ forall y. [!ctr(y) \/ (cost(x) <= cost(y))] // exists x, min_1, ..., min_n. // /\ cost_i(x) = min_i // i // // /\ ctr_j(x) // j // // /\ forall y. [\/ !ctr_j(y) \/ min_i <= cost_i(y))] // j i vector<Enode *> or_ctrs; for (Enode * ctr_X : ctrs_X) { Enode * ctr_not_Y = ctx.mkNot(ctx.mkCons(subst_exist_vars_to_univerally_quantified(ctx, var_map, ctr_X))); // ctr(y) or_ctrs.push_back(ctr_not_Y); } vector<Enode*> eq_costs; for (unsigned i = 0; i < costs.size(); ++i) { Enode * min_var_i = make_min_var(ctx, var_map, i); // min Enode * eq_cost = make_eq_cost(ctx, costs[i], min_var_i); // cost_i(x) = min_i Enode * leq_cost = make_leq_cost(ctx, var_map, costs[i], min_var_i); // min <= costs[0](y) eq_costs.push_back(eq_cost); or_ctrs.push_back(leq_cost); } // !ctr_1(y) \/ ... \/ !ctr_m(y) \/ (min_1 <= costs_1(y) ... \/ (min_n <= costs_n(y) Enode * or_term = ctx.mkOr(make_vec_to_list(ctx, or_ctrs)); vector<pair<string, Snode *>> sorted_var_list; for (Enode * e : or_term->get_forall_vars()) { pair<string, Snode *> p = make_pair(e->getCar()->getName(), e->getSort()); sorted_var_list.push_back(p); } Enode * quantified = ctx.mkForall(sorted_var_list, or_term); cout << "Precision : " << ctx.getPrecision() << endl; for (auto var : var_map) { cout << "Variable : " << var.first << " in [" << var.second->getDomainLowerBound() << ", " << var.second->getDomainUpperBound() << "]" << endl; } for (Enode * cost : costs) { cout << "Minimize : " << cost << endl; } for (Enode * ctr_X : ctrs_X) { cout << "Constraint : " << ctr_X << endl; } for (Enode * eq_cost : eq_costs) { ctx.Assert(eq_cost); } for (Enode * ctr_X : ctrs_X) { ctx.Assert(ctr_X); } ctx.Assert(quantified); auto result = ctx.CheckSAT(); cout << "Result : "; if (result == l_True) { cout << "delta-sat" << endl; print_result(var_map); if (config.get_save_visualization()) { string vis_filename = config.get_filename() + ".py"; ofstream of(vis_filename); // TODO(soonhok): generalize for a multi-obj case save_visualization_code(of, costs[0], var_map, config.get_vis_cell(), "min_0"); cout << "Visualization Code is saved at " << vis_filename << endl; } if (config.get_run_visualization()) { // TODO(soonhok): generalize for a multi-obj case run_visualization(costs[0], var_map, config.get_vis_cell(), "min_0"); } } else { cout << "unsat" << endl; } return 0; }