Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Aina Niemetz, Gereon Kremer 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 : : * [[ Add one-line brief description here ]] 14 : : * 15 : : * [[ Add lengthier description here ]] 16 : : * \todo document this file 17 : : */ 18 : : 19 : : #include "theory/theory_id.h" 20 : : 21 : : #include <sstream> 22 : : 23 : : #include "base/check.h" 24 : : #include "lib/ffs.h" 25 : : 26 : : namespace cvc5::internal { 27 : : namespace theory { 28 : : 29 : 362421000 : TheoryId& operator++(TheoryId& id) 30 : : { 31 : 362421000 : return id = static_cast<TheoryId>(static_cast<int>(id) + 1); 32 : : } 33 : : 34 : 688813 : const char* toString(TheoryId theoryId) 35 : : { 36 [ + + ][ + + ]: 688813 : switch (theoryId) [ + + ][ + + ] [ + - ][ + + ] [ + + ][ + - ] 37 : : { 38 : 49184 : case THEORY_BUILTIN: return "THEORY_BUILTIN"; break; 39 : 49178 : case THEORY_BOOL: return "THEORY_BOOL"; break; 40 : 49188 : case THEORY_UF: return "THEORY_UF"; break; 41 : 49473 : case THEORY_ARITH: return "THEORY_ARITH"; break; 42 : 49175 : case THEORY_BV: return "THEORY_BV"; break; 43 : 49172 : case THEORY_FF: return "THEORY_FF"; break; 44 : 49172 : case THEORY_FP: return "THEORY_FP"; break; 45 : 49175 : case THEORY_ARRAYS: return "THEORY_ARRAYS"; break; 46 : 49179 : case THEORY_DATATYPES: return "THEORY_DATATYPES"; break; 47 : 0 : case THEORY_SAT_SOLVER: return "THEORY_SAT_SOLVER"; break; 48 : 49172 : case THEORY_SEP: return "THEORY_SEP"; break; 49 : 49173 : case THEORY_SETS: return "THEORY_SETS"; break; 50 : 49172 : case THEORY_BAGS: return "THEORY_BAGS"; break; 51 : 49225 : case THEORY_STRINGS: return "THEORY_STRINGS"; break; 52 : 49175 : case THEORY_QUANTIFIERS: return "THEORY_QUANTIFIERS"; break; 53 : 0 : default: break; 54 : : } 55 : 0 : return "UNKNOWN_THEORY"; 56 : : } 57 : : 58 : 387 : std::ostream& operator<<(std::ostream& out, TheoryId theoryId) 59 : : { 60 : 387 : out << toString(theoryId); 61 : 387 : return out; 62 : : } 63 : : 64 : 4063310 : std::string getStatsPrefix(TheoryId theoryId) 65 : : { 66 [ + + ][ + + ]: 4063310 : switch (theoryId) [ + + ][ + + ] [ + + ][ + + ] [ + + ][ - ] 67 : : { 68 : 286735 : case THEORY_BUILTIN: return "theory::builtin::"; break; 69 : 286729 : case THEORY_BOOL: return "theory::bool::"; break; 70 : 286729 : case THEORY_UF: return "theory::uf::"; break; 71 : 286729 : case THEORY_ARITH: return "theory::arith::"; break; 72 : 286729 : case THEORY_BV: return "theory::bv::"; break; 73 : 335892 : case THEORY_FF: return "theory::ff::"; break; 74 : 286720 : case THEORY_FP: return "theory::fp::"; break; 75 : 286729 : case THEORY_ARRAYS: return "theory::arrays::"; break; 76 : 286720 : case THEORY_DATATYPES: return "theory::datatypes::"; break; 77 : 286720 : case THEORY_SEP: return "theory::sep::"; break; 78 : 286720 : case THEORY_SETS: return "theory::sets::"; break; 79 : 286720 : case THEORY_BAGS: return "theory::bags::"; break; 80 : 286720 : case THEORY_STRINGS: return "theory::strings::"; break; 81 : 286720 : case THEORY_QUANTIFIERS: return "theory::quantifiers::"; break; 82 : : 83 : 0 : default: break; 84 : : } 85 : 0 : return "unknown::"; 86 : : } 87 : : 88 : 112423000 : TheoryId TheoryIdSetUtil::setPop(TheoryIdSet& set) 89 : : { 90 : 112423000 : uint32_t i = ffs(set); // Find First Set (bit) 91 [ + + ]: 112423000 : if (i == 0) 92 : : { 93 : 17391000 : return THEORY_LAST; 94 : : } 95 : 95031700 : TheoryId id = static_cast<TheoryId>(i - 1); 96 : 95031700 : set = setRemove(id, set); 97 : 95031700 : return id; 98 : : } 99 : : 100 : 0 : size_t TheoryIdSetUtil::setSize(TheoryIdSet set) 101 : : { 102 : 0 : size_t count = 0; 103 [ - - ]: 0 : while (setPop(set) != THEORY_LAST) 104 : : { 105 : 0 : ++count; 106 : : } 107 : 0 : return count; 108 : : } 109 : : 110 : 6799280 : size_t TheoryIdSetUtil::setIndex(TheoryId id, TheoryIdSet set) 111 : : { 112 [ - + ][ - + ]: 6799280 : Assert(setContains(id, set)); [ - - ] 113 : 6799280 : size_t count = 0; 114 [ + + ]: 14243100 : while (setPop(set) != id) 115 : : { 116 : 7443800 : ++count; 117 : : } 118 : 6799280 : return count; 119 : : } 120 : : 121 : 173199000 : TheoryIdSet TheoryIdSetUtil::setInsert(TheoryId theory, TheoryIdSet set) 122 : : { 123 : 173199000 : return set | (1 << theory); 124 : : } 125 : : 126 : 97312500 : TheoryIdSet TheoryIdSetUtil::setRemove(TheoryId theory, TheoryIdSet set) 127 : : { 128 : 97312500 : return setDifference(set, setInsert(theory)); 129 : : } 130 : : 131 : 412581000 : bool TheoryIdSetUtil::setContains(TheoryId theory, TheoryIdSet set) 132 : : { 133 : 412581000 : return set & (1 << theory); 134 : : } 135 : : 136 : 0 : TheoryIdSet TheoryIdSetUtil::setComplement(TheoryIdSet a) 137 : : { 138 : 0 : return (~a) & AllTheories; 139 : : } 140 : : 141 : 67468600 : TheoryIdSet TheoryIdSetUtil::setIntersection(TheoryIdSet a, TheoryIdSet b) 142 : : { 143 : 67468600 : return a & b; 144 : : } 145 : : 146 : 17493900 : TheoryIdSet TheoryIdSetUtil::setUnion(TheoryIdSet a, TheoryIdSet b) 147 : : { 148 : 17493900 : return a | b; 149 : : } 150 : : 151 : 307422000 : TheoryIdSet TheoryIdSetUtil::setDifference(TheoryIdSet a, TheoryIdSet b) 152 : : { 153 : 307422000 : return (~b) & a; 154 : : } 155 : : 156 : 0 : std::string TheoryIdSetUtil::setToString(TheoryIdSet theorySet) 157 : : { 158 : 0 : std::stringstream ss; 159 : 0 : ss << "["; 160 [ - - ]: 0 : for (unsigned theoryId = 0; theoryId < THEORY_LAST; ++theoryId) 161 : : { 162 : 0 : TheoryId tid = static_cast<TheoryId>(theoryId); 163 [ - - ]: 0 : if (setContains(tid, theorySet)) 164 : : { 165 : 0 : ss << tid << " "; 166 : : } 167 : : } 168 : 0 : ss << "]"; 169 : 0 : return ss.str(); 170 : : } 171 : : 172 : : } // namespace theory 173 : : } // namespace cvc5::internal