Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Gereon Kremer, Mathias Preiner 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 : : * Arithmetic substitution utility. 14 : : */ 15 : : 16 : : #include "theory/arith/arith_subs.h" 17 : : 18 : : #include "theory/arith/arith_utilities.h" 19 : : 20 : : namespace cvc5::internal { 21 : : namespace theory { 22 : : namespace arith { 23 : : 24 : 14967 : void ArithSubs::addArith(const Node& v, const Node& s) 25 : : { 26 [ - + ][ - + ]: 14967 : Assert(v.getType().isRealOrInt()); [ - - ] 27 [ - + ][ - + ]: 14967 : Assert(s.getType().isRealOrInt()); [ - - ] 28 : 14967 : d_vars.push_back(v); 29 : 14967 : d_subs.push_back(s); 30 : 14967 : } 31 : : 32 : 1213420 : Node ArithSubs::applyArith(const Node& n, bool traverseNlMult) const 33 : : { 34 : 1213420 : NodeManager* nm = NodeManager::currentNM(); 35 : 2426840 : std::unordered_map<TNode, Node> visited; 36 : 1213420 : std::vector<TNode> visit; 37 : 1213420 : visit.push_back(n); 38 : 9541420 : do 39 : : { 40 : 21509700 : TNode cur = visit.back(); 41 : 10754800 : visit.pop_back(); 42 : 10754800 : auto it = visited.find(cur); 43 : : 44 [ + + ]: 10754800 : if (it == visited.end()) 45 : : { 46 : 7159500 : visited[cur] = Node::null(); 47 : 7159500 : Kind ck = cur.getKind(); 48 : 14319000 : auto s = find(cur); 49 [ + + ]: 7159500 : if (s) 50 : : { 51 : 1890090 : visited[cur] = *s; 52 : : } 53 [ + + ]: 5269400 : else if (cur.getNumChildren() == 0) 54 : : { 55 : 2294300 : visited[cur] = cur; 56 : : } 57 : : else 58 : : { 59 : 2975100 : TheoryId ctid = theory::kindToTheoryId(ck); 60 [ + + ]: 55797 : if ((ctid != THEORY_ARITH && ctid != THEORY_BOOL 61 [ + + ]: 23938 : && ctid != THEORY_BUILTIN) 62 [ + + ]: 2972460 : || isTranscendentalKind(ck) 63 [ + + ][ + + ]: 8711510 : || (!traverseNlMult [ + + ] 64 [ + + ][ + + ]: 2761310 : && (ck == Kind::NONLINEAR_MULT || ck == Kind::IAND))) 65 : : { 66 : : // Do not traverse beneath applications that belong to another theory 67 : : // besides (core) arithmetic. Notice that transcendental function 68 : : // applications are also not traversed here. 69 : 9022 : visited[cur] = cur; 70 : : } 71 : : else 72 : : { 73 : 2966080 : visit.push_back(cur); 74 [ + + ]: 9541420 : for (const Node& cn : cur) 75 : : { 76 : 6575340 : visit.push_back(cn); 77 : : } 78 : : } 79 : : } 80 : : } 81 [ + + ]: 3595340 : else if (it->second.isNull()) 82 : : { 83 : 5932150 : Node ret = cur; 84 : 2966080 : bool childChanged = false; 85 : 5932150 : std::vector<Node> children; 86 [ + + ]: 2966080 : if (cur.getMetaKind() == kind::metakind::PARAMETERIZED) 87 : : { 88 : 9253 : children.push_back(cur.getOperator()); 89 : : } 90 [ + + ]: 9541420 : for (const Node& cn : cur) 91 : : { 92 : 6575340 : it = visited.find(cn); 93 [ - + ][ - + ]: 6575340 : Assert(it != visited.end()); [ - - ] 94 [ - + ][ - + ]: 6575340 : Assert(!it->second.isNull()); [ - - ] 95 [ + + ][ + + ]: 6575340 : childChanged = childChanged || cn != it->second; 96 : 6575340 : children.push_back(it->second); 97 : : } 98 [ + + ]: 2966080 : if (childChanged) 99 : : { 100 : 2913620 : ret = nm->mkNode(cur.getKind(), children); 101 : : } 102 : 2966080 : visited[cur] = ret; 103 : : } 104 [ + + ]: 10754800 : } while (!visit.empty()); 105 [ - + ][ - + ]: 1213420 : Assert(visited.find(n) != visited.end()); [ - - ] 106 [ - + ][ - + ]: 1213420 : Assert(!visited.find(n)->second.isNull()); [ - - ] 107 : 2426840 : return visited[n]; 108 : : } 109 : : 110 : : } // namespace arith 111 : : } // namespace theory 112 : : } // namespace cvc5::internal