diff options
author | Mathias Preiner <mathias.preiner@gmail.com> | 2021-11-01 13:59:47 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-01 20:59:47 +0000 |
commit | 9cae42243a4c0be14fd72f5379ee4eb9f4bc88e9 (patch) | |
tree | 0a9cfac9b3ec68737955d3b05c3ae69088eeaa7b /src/theory/bv/abstraction.h | |
parent | 77416fa5f7cd004bbec3fb4901f47908d1e8fdd4 (diff) |
bv: Remove layered solver. (#7455)
This commit removes the old bit-vector solver code.
Diffstat (limited to 'src/theory/bv/abstraction.h')
-rw-r--r-- | src/theory/bv/abstraction.h | 248 |
1 files changed, 0 insertions, 248 deletions
diff --git a/src/theory/bv/abstraction.h b/src/theory/bv/abstraction.h deleted file mode 100644 index 7eea90cdc..000000000 --- a/src/theory/bv/abstraction.h +++ /dev/null @@ -1,248 +0,0 @@ -/****************************************************************************** - * Top contributors (to current version): - * Liana Hadarean, Tim King, Mathias Preiner - * - * 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. - * **************************************************************************** - * - * Bitvector theory. - */ - -#include "cvc5_private.h" - -#ifndef CVC5__THEORY__BV__ABSTRACTION_H -#define CVC5__THEORY__BV__ABSTRACTION_H - -#include <unordered_map> -#include <unordered_set> - -#include "expr/node.h" -#include "theory/substitutions.h" -#include "util/statistics_stats.h" - -namespace cvc5 { -namespace theory { -namespace bv { - -typedef std::vector<TNode> ArgsVec; - -class AbstractionModule { - using NodeVecMap = std::unordered_map<Node, std::vector<Node>>; - using NodeTNodeMap = std::unordered_map<Node, TNode>; - using TNodeTNodeMap = std::unordered_map<TNode, TNode>; - using NodeNodeMap = std::unordered_map<Node, Node>; - using TNodeNodeMap = std::unordered_map<Node, TNode>; - using TNodeSet = std::unordered_set<TNode>; - using IntNodeMap = std::unordered_map<unsigned, Node>; - using IndexMap = std::unordered_map<unsigned, unsigned>; - using SkolemMap = std::unordered_map<unsigned, std::vector<Node> >; - using SignatureMap = std::unordered_map<TNode, unsigned>; - - struct Statistics { - SizeStat<NodeNodeMap> d_numFunctionsAbstracted; - IntStat d_numArgsSkolemized; - TimerStat d_abstractionTime; - Statistics(const std::string& name, const NodeNodeMap& functionsAbstracted); - }; - - - class ArgsTableEntry { - std::vector<ArgsVec> d_data; - unsigned d_arity; - public: - ArgsTableEntry(unsigned n) - : d_arity(n) - {} - ArgsTableEntry() - : d_arity(0) - {} - void addArguments(const ArgsVec& args); - typedef std::vector<ArgsVec>::iterator iterator; - - iterator begin() { return d_data.begin(); } - iterator end() { return d_data.end(); } - unsigned getArity() { return d_arity; } - unsigned getNumEntries() { return d_data.size(); } - ArgsVec& getEntry(unsigned i) - { - Assert(i < d_data.size()); - return d_data[i]; - } - }; - - class ArgsTable { - std::unordered_map<TNode, ArgsTableEntry> d_data; - bool hasEntry(TNode signature) const; - public: - typedef std::unordered_map<TNode, ArgsTableEntry>::iterator iterator; - ArgsTable() {} - void addEntry(TNode signature, const ArgsVec& args); - ArgsTableEntry& getEntry(TNode signature); - iterator begin() { return d_data.begin(); } - iterator end() { return d_data.end(); } - }; - - /** - * Checks if one pattern is a generalization of the other - * - * @param s - * @param t - * - * @return 1 if s :> t, 2 if s <: t, 0 if they equivalent and -1 if they are incomparable - */ - static int comparePatterns(TNode s, TNode t); - - class LemmaInstantiatior { - std::vector<TNode> d_functions; - std::vector<int> d_maxMatch; - ArgsTable& d_argsTable; - context::Context* d_ctx; - theory::SubstitutionMap d_subst; - TNode d_conflict; - std::vector<Node> d_lemmas; - - void backtrack(std::vector<int>& stack); - int next(int val, int index); - bool isConsistent(const std::vector<int>& stack); - bool accept(const std::vector<int>& stack); - void mkLemma(); - public: - LemmaInstantiatior(const std::vector<TNode>& functions, ArgsTable& table, TNode conflict) - : d_functions(functions) - , d_argsTable(table) - , d_ctx(new context::Context()) - , d_subst(d_ctx) - , d_conflict(conflict) - , d_lemmas() - { - Debug("bv-abstraction-gen") << "LemmaInstantiator conflict:" << conflict << "\n"; - // initializing the search space - for (unsigned i = 0; i < functions.size(); ++i) { - TNode func_op = functions[i].getOperator(); - // number of matches for this function - unsigned maxCount = table.getEntry(func_op).getNumEntries(); - d_maxMatch.push_back(maxCount); - } - } - - void generateInstantiations(std::vector<Node>& lemmas); - - }; - - ArgsTable d_argsTable; - - // mapping between signature and uninterpreted function symbol used to - // abstract the signature - NodeNodeMap d_signatureToFunc; - NodeNodeMap d_funcToSignature; - - NodeNodeMap d_assertionToSignature; - SignatureMap d_signatures; - NodeNodeMap d_sigToGeneralization; - TNodeSet d_skolems; - - // skolems maps - IndexMap d_signatureIndices; - SkolemMap d_signatureSkolems; - - void collectArgumentTypes(TNode sig, std::vector<TypeNode>& types, TNodeSet& seen); - void collectArguments(TNode node, TNode sig, std::vector<Node>& args, TNodeSet& seen); - void finalizeSignatures(); - Node abstractSignatures(TNode assertion); - Node computeSignature(TNode node); - - bool isConjunctionOfAtoms(TNode node, TNodeSet& seen); - - TNode getGeneralization(TNode term); - void storeGeneralization(TNode s, TNode t); - - // signature skolem stuff - Node getGeneralizedSignature(Node node); - Node getSignatureSkolem(TNode node); - - unsigned getBitwidthIndex(unsigned bitwidth); - void resetSignatureIndex(); - Node computeSignatureRec(TNode, NodeNodeMap&); - void storeSignature(Node signature, TNode assertion); - bool hasSignature(Node node); - - Node substituteArguments(TNode signature, TNode apply, unsigned& i, TNodeTNodeMap& seen); - - // crazy instantiation methods - void generateInstantiations(unsigned current, - std::vector<ArgsTableEntry>& matches, - std::vector<std::vector<ArgsVec> >& instantiations, - std::vector<std::vector<ArgsVec> >& new_instantiations); - - Node tryMatching(const std::vector<Node>& ss, const std::vector<TNode>& tt, TNode conflict); - void makeFreshArgs(TNode func, std::vector<Node>& fresh_args); - void makeFreshSkolems(TNode node, SubstitutionMap& map, SubstitutionMap& reverse_map); - - void skolemizeArguments(std::vector<Node>& assertions); - Node reverseAbstraction(Node assertion, NodeNodeMap& seen); - - TNodeSet d_addedLemmas; - TNodeSet d_lemmaAtoms; - TNodeSet d_inputAtoms; - void storeLemma(TNode lemma); - - Statistics d_statistics; - -public: - AbstractionModule(const std::string& name) - : d_argsTable(), - d_signatureToFunc(), - d_funcToSignature(), - d_assertionToSignature(), - d_signatures(), - d_sigToGeneralization(), - d_skolems(), - d_signatureIndices(), - d_signatureSkolems(), - d_addedLemmas(), - d_lemmaAtoms(), - d_inputAtoms(), - d_statistics(name + "abstraction::", d_signatureToFunc) - { - } - /** - * returns true if there are new uninterepreted functions symbols in the output - * - * @param assertions - * @param new_assertions - * - * @return - */ - bool applyAbstraction(const std::vector<Node>& assertions, std::vector<Node>& new_assertions); - /** - * Returns true if the node represents an abstraction predicate. - * - * @param node - * - * @return - */ - bool isAbstraction(TNode node); - /** - * Returns the interpretation of the abstraction predicate. - * - * @param node - * - * @return - */ - Node getInterpretation(TNode node); - Node simplifyConflict(TNode conflict); - void generalizeConflict(TNode conflict, std::vector<Node>& lemmas); - void addInputAtom(TNode atom); - bool isLemmaAtom(TNode node) const; -}; - -} -} -} // namespace cvc5 - -#endif |