GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/quantifiers/expr_miner.cpp Lines: 32 37 86.5 %
Date: 2021-11-07 Branches: 37 98 37.8 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Andrew Reynolds, Andres Noetzli, Aina Niemetz
4
 *
5
 * This file is part of the cvc5 project.
6
 *
7
 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8
 * in the top-level source directory and their institutional affiliations.
9
 * All rights reserved.  See the file COPYING in the top-level source
10
 * directory for licensing information.
11
 * ****************************************************************************
12
 *
13
 * Implementation of expr_miner.
14
 */
15
16
#include "theory/quantifiers/expr_miner.h"
17
18
#include "expr/skolem_manager.h"
19
#include "options/quantifiers_options.h"
20
#include "theory/quantifiers/term_util.h"
21
#include "theory/rewriter.h"
22
23
using namespace std;
24
using namespace cvc5::kind;
25
26
namespace cvc5 {
27
namespace theory {
28
namespace quantifiers {
29
30
71
void ExprMiner::initialize(const std::vector<Node>& vars, SygusSampler* ss)
31
{
32
71
  d_sampler = ss;
33
71
  d_vars.insert(d_vars.end(), vars.begin(), vars.end());
34
71
}
35
36
16378
Node ExprMiner::convertToSkolem(Node n)
37
{
38
16378
  if (d_skolems.empty())
39
  {
40
42
    NodeManager* nm = NodeManager::currentNM();
41
42
    SkolemManager* sm = nm->getSkolemManager();
42
140
    for (const Node& v : d_vars)
43
    {
44
196
      Node sk = sm->mkDummySkolem("rrck", v.getType());
45
98
      d_skolems.push_back(sk);
46
98
      d_fv_to_skolem[v] = sk;
47
    }
48
  }
49
  return n.substitute(
50
16378
      d_vars.begin(), d_vars.end(), d_skolems.begin(), d_skolems.end());
51
}
52
53
378
void ExprMiner::initializeChecker(std::unique_ptr<SolverEngine>& checker,
54
                                  Node query)
55
{
56
378
  initializeChecker(checker, query, options(), logicInfo());
57
378
}
58
59
4420
void ExprMiner::initializeChecker(std::unique_ptr<SolverEngine>& checker,
60
                                  Node query,
61
                                  const Options& opts,
62
                                  const LogicInfo& logicInfo)
63
{
64
4420
  Assert (!query.isNull());
65
4420
  if (options().quantifiers.sygusExprMinerCheckTimeoutWasSetByUser)
66
  {
67
    initializeSubsolver(checker,
68
                        opts,
69
                        logicInfo,
70
                        true,
71
                        options().quantifiers.sygusExprMinerCheckTimeout);
72
  }
73
  else
74
  {
75
4420
    initializeSubsolver(checker, opts, logicInfo);
76
  }
77
  // also set the options
78
4420
  checker->setOption("sygus-rr-synth-input", "false");
79
4420
  checker->setOption("input-language", "smt2");
80
  // Convert bound variables to skolems. This ensures the satisfiability
81
  // check is ground.
82
8840
  Node squery = convertToSkolem(query);
83
4420
  checker->assertFormula(squery);
84
4420
}
85
86
124
Result ExprMiner::doCheck(Node query)
87
{
88
248
  Node queryr = rewrite(query);
89
124
  if (queryr.isConst())
90
  {
91
    if (!queryr.getConst<bool>())
92
    {
93
      return Result(Result::UNSAT);
94
    }
95
    else
96
    {
97
      return Result(Result::SAT);
98
    }
99
  }
100
248
  std::unique_ptr<SolverEngine> smte;
101
124
  initializeChecker(smte, query);
102
124
  return smte->checkSat();
103
}
104
105
}  // namespace quantifiers
106
}  // namespace theory
107
31137
}  // namespace cvc5