d_sampler[a].find(tn);
if (its == d_sampler[a].end())
{
- d_sampler[a][tn].initializeSygus(d_tds, nv, options::sygusSamples());
+ d_sampler[a][tn].initializeSygus(
+ d_tds, nv, options::sygusSamples(), false);
its = d_sampler[a].find(tn);
}
Node bvr_sample_ret;
if (its == d_sampler.end())
{
d_sampler[prog].initializeSygusExt(
- d_qe, prog, options::sygusSamples());
+ d_qe, prog, options::sygusSamples(), true);
its = d_sampler.find(prog);
}
- Node solb = sygusDb->sygusToBuiltin(sol, prog.getType());
- Node eq_sol = its->second.registerTerm(solb);
+ Node eq_sol = its->second.registerTerm(sol);
// eq_sol is a candidate solution that is equivalent to sol
- if (eq_sol != solb)
+ if (eq_sol != sol)
{
++(cei->d_statistics.d_candidate_rewrites);
if (!eq_sol.isNull())
{
- // Terms solb and eq_sol are equivalent under sample points but do
- // not rewrite to the same term. Hence, this indicates a candidate
- // rewrite.
- out << "(candidate-rewrite " << solb << " " << eq_sol << ")"
- << std::endl;
+ // The analog of terms sol and eq_sol are equivalent under sample
+ // points but do not rewrite to the same term. Hence, this indicates
+ // a candidate rewrite.
+ Printer* p = Printer::getPrinter(options::outputLanguage());
+ out << "(candidate-rewrite ";
+ p->toStreamSygus(out, sol);
+ out << " ";
+ p->toStreamSygus(out, eq_sol);
+ out << ")" << std::endl;
++(cei->d_statistics.d_candidate_rewrites_print);
// debugging information
if (Trace.isOn("sygus-rr-debug"))
{
ExtendedRewriter* er = sygusDb->getExtRewriter();
+ Node solb = sygusDb->sygusToBuiltin(sol);
Node solbr = er->extendedRewrite(solb);
- Node eq_solr = er->extendedRewrite(eq_sol);
+ Node eq_solb = sygusDb->sygusToBuiltin(eq_sol);
+ Node eq_solr = er->extendedRewrite(eq_solb);
Trace("sygus-rr-debug")
<< "; candidate #1 ext-rewrites to: " << solbr << std::endl;
Trace("sygus-rr-debug")
return Node::null();
}
-SygusSampler::SygusSampler() : d_tds(nullptr), d_is_valid(false) {}
+SygusSampler::SygusSampler()
+ : d_tds(nullptr), d_use_sygus_type(false), d_is_valid(false)
+{
+}
void SygusSampler::initialize(TypeNode tn,
std::vector<Node>& vars,
unsigned nsamples)
{
d_tds = nullptr;
+ d_use_sygus_type = false;
d_is_valid = true;
d_tn = tn;
d_ftn = TypeNode::null();
initializeSamples(nsamples);
}
-void SygusSampler::initializeSygus(TermDbSygus* tds, Node f, unsigned nsamples)
+void SygusSampler::initializeSygus(TermDbSygus* tds,
+ Node f,
+ unsigned nsamples,
+ bool useSygusType)
{
d_tds = tds;
+ d_use_sygus_type = useSygusType;
d_is_valid = true;
d_ftn = f.getType();
Assert(d_ftn.isDatatype());
{
if (d_is_valid)
{
- Assert(n.getType() == d_tn);
- return d_trie.add(n, this, 0, d_samples.size(), forceKeep);
+ Node bn = n;
+ // if this is a sygus type, get its builtin analog
+ if (d_use_sygus_type)
+ {
+ Assert(!d_ftn.isNull());
+ bn = d_tds->sygusToBuiltin(n);
+ bn = Rewriter::rewrite(bn);
+ d_builtin_to_sygus[bn] = n;
+ }
+ Assert(bn.getType() == d_tn);
+ Node res = d_trie.add(bn, this, 0, d_samples.size(), forceKeep);
+ if (d_use_sygus_type)
+ {
+ Assert(d_builtin_to_sygus.find(res) == d_builtin_to_sygus.end());
+ res = res != bn ? d_builtin_to_sygus[res] : n;
+ }
+ return res;
}
return n;
}
void SygusSamplerExt::initializeSygusExt(QuantifiersEngine* qe,
Node f,
- unsigned nsamples)
+ unsigned nsamples,
+ bool useSygusType)
{
- SygusSampler::initializeSygus(qe->getTermDatabaseSygus(), f, nsamples);
+ SygusSampler::initializeSygus(
+ qe->getTermDatabaseSygus(), f, nsamples, useSygusType);
// initialize the dynamic rewriter
std::stringstream ss;
/** initialize sygus
*
* tds : pointer to sygus database,
- * f : a term of some SyGuS datatype type whose (builtin) values we will be
+ * f : a term of some SyGuS datatype type whose values we will be
* testing under the free variables in the grammar of f,
- * nsamples : number of sample points this class will test.
+ * nsamples : number of sample points this class will test,
+ * useSygusType : whether we will register terms with this sampler that have
+ * the same type as f. If this flag is false, then we will be registering
+ * terms of the analog of the type of f, that is, the builtin type that
+ * f's type encodes in the deep embedding.
*/
- void initializeSygus(TermDbSygus* tds, Node f, unsigned nsamples);
+ void initializeSygus(TermDbSygus* tds,
+ Node f,
+ unsigned nsamples,
+ bool useSygusType);
/** register term n with this sampler database
*
* forceKeep is whether we wish to force that n is chosen as a representative
TypeNode d_tn;
/** the sygus type for this sampler (if applicable). */
TypeNode d_ftn;
+ /** whether we are registering terms of type d_ftn */
+ bool d_use_sygus_type;
+ /** map from builtin terms to the sygus term they correspond to */
+ std::map<Node, Node> d_builtin_to_sygus;
/** all variables we are sampling values for */
std::vector<Node> d_vars;
/** type variables
{
public:
/** initialize extended */
- void initializeSygusExt(QuantifiersEngine* qe, Node f, unsigned nsamples);
+ void initializeSygusExt(QuantifiersEngine* qe,
+ Node f,
+ unsigned nsamples,
+ bool useSygusType);
/** register term n with this sampler database
*
* This returns either null, or a term ret with the same guarantees as