Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Tim King, 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 : : * Implementation of utilities for non-linear constraints. 14 : : */ 15 : : 16 : : #include "theory/arith/nl/ext/constraint.h" 17 : : 18 : : #include "theory/arith/arith_msum.h" 19 : : #include "theory/arith/arith_utilities.h" 20 : : #include "theory/arith/nl/ext/monomial.h" 21 : : 22 : : using namespace cvc5::internal::kind; 23 : : 24 : : namespace cvc5::internal { 25 : : namespace theory { 26 : : namespace arith { 27 : : namespace nl { 28 : : 29 : 31314 : ConstraintDb::ConstraintDb(MonomialDb& mdb) : d_mdb(mdb) {} 30 : : 31 : 249495 : void ConstraintDb::registerConstraint(Node atom) 32 : : { 33 : 249495 : if (std::find(d_constraints.begin(), d_constraints.end(), atom) 34 [ + + ]: 498990 : != d_constraints.end()) 35 : : { 36 : 212361 : return; 37 : : } 38 : 37134 : d_constraints.push_back(atom); 39 [ + - ]: 37134 : Trace("nl-ext-debug") << "Register constraint : " << atom << std::endl; 40 : 74268 : std::map<Node, Node> msum; 41 [ + - ]: 37134 : if (ArithMSum::getMonomialSumLit(atom, msum)) 42 : : { 43 [ + - ]: 37134 : Trace("nl-ext-debug") << "got monomial sum: " << std::endl; 44 [ - + ]: 37134 : if (TraceIsOn("nl-ext-debug")) 45 : : { 46 : 0 : ArithMSum::debugPrintMonomialSum(msum, "nl-ext-debug"); 47 : : } 48 : 37134 : unsigned max_degree = 0; 49 : 74268 : std::vector<Node> all_m; 50 : 74268 : std::vector<Node> max_deg_m; 51 [ + + ]: 115821 : for (std::map<Node, Node>::iterator itm = msum.begin(); itm != msum.end(); 52 : 78687 : ++itm) 53 : : { 54 [ + + ]: 78687 : if (!itm->first.isNull()) 55 : : { 56 : 60910 : all_m.push_back(itm->first); 57 : 60910 : d_mdb.registerMonomial(itm->first); 58 [ + - ]: 121820 : Trace("nl-ext-debug2") 59 : 60910 : << "...process monomial " << itm->first << std::endl; 60 : 60910 : unsigned d = d_mdb.getDegree(itm->first); 61 [ + + ]: 60910 : if (d > max_degree) 62 : : { 63 : 46728 : max_degree = d; 64 : 46728 : max_deg_m.clear(); 65 : : } 66 [ + + ]: 60910 : if (d >= max_degree) 67 : : { 68 : 60415 : max_deg_m.push_back(itm->first); 69 : : } 70 : : } 71 : : } 72 : : // isolate for each maximal degree monomial 73 [ + + ]: 98044 : for (unsigned i = 0; i < all_m.size(); i++) 74 : : { 75 : 121820 : Node m = all_m[i]; 76 : 121820 : Node rhs, coeff; 77 : 60910 : int res = ArithMSum::isolate(m, msum, coeff, rhs, atom.getKind()); 78 [ + + ]: 60910 : if (res != 0) 79 : : { 80 : 60901 : Kind type = atom.getKind(); 81 [ + + ]: 60901 : if (res == -1) 82 : : { 83 : 13504 : type = reverseRelationKind(type); 84 : : } 85 [ + - ]: 60901 : Trace("nl-ext-constraint") << "Constraint : " << atom << " <=> "; 86 [ + + ]: 60901 : if (!coeff.isNull()) 87 : : { 88 [ + - ]: 5255 : Trace("nl-ext-constraint") << coeff << " * "; 89 : : } 90 [ + - ]: 121802 : Trace("nl-ext-constraint") 91 : 60901 : << m << " " << type << " " << rhs << std::endl; 92 : 60901 : ConstraintInfo& ci = d_c_info[atom][m]; 93 : 60901 : ci.d_rhs = rhs; 94 : 60901 : ci.d_coeff = coeff; 95 : 60901 : ci.d_type = type; 96 : : } 97 : : } 98 [ + + ]: 86999 : for (unsigned i = 0; i < max_deg_m.size(); i++) 99 : : { 100 : 49865 : Node m = max_deg_m[i]; 101 : 49865 : d_c_info_maxm[atom][m] = true; 102 : : } 103 : : } 104 : : else 105 : : { 106 [ - - ]: 0 : Trace("nl-ext-debug") << "...failed to get monomial sum." << std::endl; 107 : : } 108 : : } 109 : : 110 : : const std::map<Node, std::map<Node, ConstraintInfo> >& 111 : 2082 : ConstraintDb::getConstraints() 112 : : { 113 : 2082 : return d_c_info; 114 : : } 115 : : 116 : 435707 : bool ConstraintDb::isMaximal(Node atom, Node x) const 117 : : { 118 : : std::map<Node, std::map<Node, bool> >::const_iterator itcm = 119 : 435707 : d_c_info_maxm.find(atom); 120 [ - + ][ - + ]: 435707 : Assert(itcm != d_c_info_maxm.end()); [ - - ] 121 : 435707 : return itcm->second.find(x) != itcm->second.end(); 122 : : } 123 : : 124 : : } // namespace nl 125 : : } // namespace arith 126 : : } // namespace theory 127 : : } // namespace cvc5::internal