Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Aina Niemetz 4 : : * 5 : : * This file is part of the cvc5 project. 6 : : * 7 : : * Copyright (c) 2009-2024 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 : : * Shared solver in the distributed architecture. 14 : : */ 15 : : 16 : : #include "theory/shared_solver_distributed.h" 17 : : 18 : : #include "theory/theory_engine.h" 19 : : 20 : : namespace cvc5::internal { 21 : : namespace theory { 22 : : 23 : 47593 : SharedSolverDistributed::SharedSolverDistributed(Env& env, TheoryEngine& te) 24 : 47593 : : SharedSolver(env, te) 25 : : { 26 : 47593 : } 27 : : 28 : 47593 : bool SharedSolverDistributed::needsEqualityEngine(theory::EeSetupInfo& esi) 29 : : { 30 : 47593 : return d_sharedTerms.needsEqualityEngine(esi); 31 : : } 32 : : 33 : 47593 : void SharedSolverDistributed::setEqualityEngine(eq::EqualityEngine* ee) 34 : : { 35 : 47593 : d_sharedTerms.setEqualityEngine(ee); 36 : 47593 : } 37 : : 38 : 1621360 : void SharedSolverDistributed::preRegisterSharedInternal(TNode t) 39 : : { 40 [ + + ]: 1621360 : if (t.getKind() == Kind::EQUAL) 41 : : { 42 : : // When sharing is enabled, we propagate from the shared terms manager also 43 : 792035 : d_sharedTerms.addEqualityToPropagate(t); 44 : : } 45 : 1621360 : } 46 : : 47 : 1848580 : EqualityStatus SharedSolverDistributed::getEqualityStatus(TNode a, TNode b) 48 : : { 49 : : // if we're using a shared terms database, ask its status if a and b are 50 : : // shared. 51 : 1848580 : if (d_sharedTerms.isShared(a) && d_sharedTerms.isShared(b)) 52 : : { 53 [ + + ]: 1827100 : if (d_sharedTerms.areEqual(a, b)) 54 : : { 55 : 39025 : return EQUALITY_TRUE_AND_PROPAGATED; 56 : : } 57 [ + + ]: 1788070 : else if (d_sharedTerms.areDisequal(a, b)) 58 : : { 59 : 5437 : return EQUALITY_FALSE_AND_PROPAGATED; 60 : : } 61 : : } 62 : : // otherwise, ask the theory, which may depend on the uninterpreted sort owner 63 : : TheoryId tid = 64 : 1804110 : Theory::theoryOf(a.getType(), d_env.getUninterpretedSortOwner()); 65 : 1804110 : return d_te.theoryOf(tid)->getEqualityStatus(a, b); 66 : : } 67 : : 68 : 453898 : TrustNode SharedSolverDistributed::explain(TNode literal, TheoryId id) 69 : : { 70 : 453898 : TrustNode texp; 71 [ + + ]: 453898 : if (id == THEORY_BUILTIN) 72 : : { 73 : : // explanation using the shared terms database 74 : 150778 : texp = d_sharedTerms.explain(literal); 75 [ + - ]: 301556 : Trace("shared-solver") 76 : 0 : << "\tTerm was propagated by THEORY_BUILTIN. Explanation: " 77 [ - + ][ - - ]: 150778 : << texp.getNode() << std::endl; 78 : : } 79 : : else 80 : : { 81 : : // By default, we ask the individual theory for the explanation. 82 : : // It is possible that a centralized approach could preempt this. 83 : 303120 : texp = d_te.theoryOf(id)->explain(literal); 84 [ + - ]: 606240 : Trace("shared-solver") << "\tTerm was propagated by owner theory: " << id 85 [ - + ][ - - ]: 303120 : << ". Explanation: " << texp.getNode() << std::endl; 86 : : } 87 : 453898 : return texp; 88 : : } 89 : : 90 : 9866030 : void SharedSolverDistributed::assertShared(TNode n, bool polarity, TNode reason) 91 : : { 92 : 9866030 : d_sharedTerms.assertShared(n, polarity, reason); 93 : 9866030 : } 94 : : 95 : : } // namespace theory 96 : : } // namespace cvc5::internal