Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Gereon Kremer, 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 : : * Management of a distributed approach for model generation. 14 : : */ 15 : : 16 : : #include "theory/model_manager_distributed.h" 17 : : 18 : : #include "smt/env.h" 19 : : #include "theory/theory_engine.h" 20 : : #include "theory/theory_model.h" 21 : : #include "theory/theory_model_builder.h" 22 : : 23 : : namespace cvc5::internal { 24 : : namespace theory { 25 : : 26 : 47593 : ModelManagerDistributed::ModelManagerDistributed(Env& env, 27 : : TheoryEngine& te, 28 : 47593 : EqEngineManager& eem) 29 : 47593 : : ModelManager(env, te, eem) 30 : : { 31 : 47593 : } 32 : : 33 : 94674 : ModelManagerDistributed::~ModelManagerDistributed() 34 : : { 35 : : // pop the model context which we pushed on initialization 36 : 47337 : d_modelEeContext.pop(); 37 : 94674 : } 38 : : 39 : 47593 : void ModelManagerDistributed::initializeModelEqEngine( 40 : : eq::EqualityEngineNotify* notify) 41 : : { 42 : : // initialize the model equality engine, use the provided notification object, 43 : : // which belongs e.g. to CombinationModelBased 44 : 95186 : EeSetupInfo esim; 45 : 47593 : esim.d_notify = notify; 46 : 47593 : esim.d_name = d_model->getName() + "::ee"; 47 : 47593 : esim.d_constantsAreTriggers = false; 48 : 47593 : d_modelEqualityEngineAlloc.reset( 49 : 47593 : d_eem.allocateEqualityEngine(esim, &d_modelEeContext)); 50 : 47593 : d_modelEqualityEngine = d_modelEqualityEngineAlloc.get(); 51 : : // finish initializing the model 52 : 47593 : d_model->finishInit(d_modelEqualityEngine); 53 : : // We push a context during initialization since the model is cleared during 54 : : // collectModelInfo using pop/push. 55 : 47593 : d_modelEeContext.push(); 56 : 47593 : } 57 : : 58 : 40056 : bool ModelManagerDistributed::prepareModel() 59 : : { 60 [ + - ]: 80112 : Trace("model-builder") << "ModelManagerDistributed: reset model..." 61 : 40056 : << std::endl; 62 : : 63 : : // push/pop to clear the equality engine of the model 64 : 40056 : d_modelEeContext.pop(); 65 : 40056 : d_modelEeContext.push(); 66 : : 67 : : // Collect model info from the theories 68 [ + - ]: 80112 : Trace("model-builder") << "ModelManagerDistributed: Collect model info..." 69 : 40056 : << std::endl; 70 : : // Consult each active theory to get all relevant information concerning the 71 : : // model, which includes both dump their equality information and assigning 72 : : // values. Notice the order of theories here is important and is the same 73 : : // as the list in CVC5_FOR_EACH_THEORY in theory_engine.cpp. 74 : 40056 : const LogicInfo& logicInfo = d_env.getLogicInfo(); 75 [ + + ]: 600752 : for (TheoryId theoryId = theory::THEORY_FIRST; theoryId < theory::THEORY_LAST; 76 : 560696 : ++theoryId) 77 : : { 78 [ + + ]: 560705 : if (!logicInfo.isTheoryEnabled(theoryId)) 79 : : { 80 : : // theory not active, skip 81 : 292909 : continue; 82 : : } 83 : 347908 : Theory* t = d_te.theoryOf(theoryId); 84 [ + + ]: 347908 : if (theoryId == TheoryId::THEORY_BOOL 85 [ + + ]: 307852 : || theoryId == TheoryId::THEORY_BUILTIN) 86 : : { 87 [ + - ]: 160224 : Trace("model-builder") 88 : 0 : << " Skipping theory " << theoryId 89 : 80112 : << " as it does not contribute to the model anyway" << std::endl; 90 : 80112 : continue; 91 : : } 92 [ + - ]: 535592 : Trace("model-builder") << " CollectModelInfo on theory: " << theoryId 93 : 267796 : << std::endl; 94 : : // collect the asserted terms 95 : 267796 : std::set<Node> termSet; 96 : 267796 : t->collectAssertedTermsForModel(termSet); 97 : : // also get relevant terms 98 : 267796 : t->computeRelevantTerms(termSet); 99 [ + + ]: 267796 : if (!t->collectModelInfo(d_model.get(), termSet)) 100 : : { 101 [ + - ]: 18 : Trace("model-builder") 102 : 9 : << "ModelManagerDistributed: fail collect model info" << std::endl; 103 : 9 : return false; 104 : : } 105 : : } 106 : : 107 [ - + ]: 40047 : if (!collectModelBooleanVariables()) 108 : : { 109 [ - - ]: 0 : Trace("model-builder") << "ModelManagerDistributed: fail Boolean variables" 110 : 0 : << std::endl; 111 : 0 : return false; 112 : : } 113 : : 114 : 40047 : return true; 115 : : } 116 : : 117 : 40047 : bool ModelManagerDistributed::finishBuildModel() const 118 : : { 119 : : // do not use relevant terms 120 [ - + ]: 40047 : if (!d_modelBuilder->buildModel(d_model.get())) 121 : : { 122 [ - - ]: 0 : Trace("model-builder") << "ModelManager: fail build model" << std::endl; 123 : 0 : return false; 124 : : } 125 : 40047 : return true; 126 : : } 127 : : 128 : : } // namespace theory 129 : : } // namespace cvc5::internal