/****************************************************************************** * Top contributors (to current version): * Andrew Reynolds, Aina Niemetz, Haniel Barbosa * * This file is part of the cvc5 project. * * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS * in the top-level source directory and their institutional affiliations. * All rights reserved. See the file COPYING in the top-level source * directory for licensing information. * **************************************************************************** * * Implementation of sygus_unif. */ #include "theory/quantifiers/sygus/sygus_unif.h" #include "theory/datatypes/sygus_datatype_utils.h" #include "theory/quantifiers/sygus/term_database_sygus.h" #include "theory/quantifiers/term_util.h" #include "util/random.h" using namespace std; using namespace cvc5::kind; namespace cvc5 { namespace theory { namespace quantifiers { SygusUnif::SygusUnif() : d_tds(nullptr), d_enableMinimality(false) {} SygusUnif::~SygusUnif() {} void SygusUnif::initializeCandidate( TermDbSygus* tds, Node f, std::vector& enums, std::map>& strategy_lemmas) { d_tds = tds; d_candidates.push_back(f); // initialize the strategy d_strategy[f].initialize(tds, f, enums); } Node SygusUnif::getMinimalTerm(const std::vector& terms) { unsigned minSize = 0; Node minTerm; std::map::iterator it; for (const Node& n : terms) { it = d_termToSize.find(n); unsigned ssize = 0; if (it == d_termToSize.end()) { ssize = datatypes::utils::getSygusTermSize(n); d_termToSize[n] = ssize; } else { ssize = it->second; } if (minTerm.isNull() || ssize < minSize) { minTerm = n; minSize = ssize; } } return minTerm; } Node SygusUnif::constructBestSolvedTerm(Node e, const std::vector& solved) { Assert(!solved.empty()); if (d_enableMinimality) { return getMinimalTerm(solved); } return solved[0]; } Node SygusUnif::constructBestConditional(Node ce, const std::vector& conds) { Assert(!conds.empty()); double r = Random::getRandom().pickDouble(0.0, 1.0); unsigned cindex = r * conds.size(); if (cindex > conds.size()) { cindex = conds.size() - 1; } return conds[cindex]; } Node SygusUnif::constructBestStringToConcat( const std::vector& strs, const std::map& total_inc, const std::map>& incr) { Assert(!strs.empty()); std::vector strs_tmp = strs; std::shuffle(strs_tmp.begin(), strs_tmp.end(), Random::getRandom()); // prefer one that has incremented by more than 0 for (const Node& ns : strs_tmp) { const std::map::const_iterator iti = total_inc.find(ns); if (iti != total_inc.end() && iti->second > 0) { return ns; } } return strs_tmp[0]; } void SygusUnif::indent(const char* c, int ind) { if (Trace.isOn(c)) { for (int i = 0; i < ind; i++) { Trace(c) << " "; } } } void SygusUnif::print_val(const char* c, std::vector& vals, bool pol) { if (Trace.isOn(c)) { for (unsigned i = 0; i < vals.size(); i++) { Trace(c) << ((pol ? vals[i].getConst() : !vals[i].getConst()) ? "1" : "0"); } } } } // namespace quantifiers } // namespace theory } // namespace cvc5