Loading...
Searching...
No Matches
msymenginepoly.cpp
1#include <symengine/polys/msymenginepoly.h>
2
3namespace SymEngine
4{
5
6RCP<const Basic> MIntPoly::as_symbolic() const
7{
8 vec_basic args;
9 for (const auto &p : get_poly().dict_) {
10 RCP<const Basic> res = integer(p.second);
11 int whichvar = 0;
12 for (auto sym : get_vars()) {
13 if (0 != p.first[whichvar])
14 res = SymEngine::mul(res, pow(sym, integer(p.first[whichvar])));
15 whichvar++;
16 }
17 args.push_back(res);
18 }
19 return SymEngine::add(args);
20}
21
22hash_t MIntPoly::__hash__() const
23{
24 hash_t seed = SYMENGINE_MINTPOLY;
25 for (auto var : get_vars())
26 hash_combine<std::string>(seed, var->__str__());
27
28 for (auto &p : get_poly().dict_) {
29 hash_t t = vec_hash<vec_uint>()(p.first);
30 hash_combine<hash_t>(t, mp_get_si(p.second));
31 seed ^= t;
32 }
33 return seed;
34}
35
36integer_class MIntPoly::eval(
37 std::map<RCP<const Basic>, integer_class, RCPBasicKeyLess> &vals) const
38{
39 // TODO : handle missing values
40 integer_class ans(0), temp, term;
41 for (auto bucket : get_poly().dict_) {
42 term = bucket.second;
43 unsigned int whichvar = 0;
44 for (auto sym : get_vars()) {
45 mp_pow_ui(temp, vals.find(sym)->second, bucket.first[whichvar]);
46 term *= temp;
47 whichvar++;
48 }
49 ans += term;
50 }
51 return ans;
52}
53
54RCP<const Basic> MExprPoly::as_symbolic() const
55{
56 vec_basic args;
57 for (const auto &p : get_poly().dict_) {
58 RCP<const Basic> res = (p.second.get_basic());
59 int whichvar = 0;
60 for (auto sym : get_vars()) {
61 if (0 != p.first[whichvar])
62 res = SymEngine::mul(res, pow(sym, integer(p.first[whichvar])));
63 whichvar++;
64 }
65 args.push_back(res);
66 }
67 return SymEngine::add(args);
68}
69
70hash_t MExprPoly::__hash__() const
71{
72 hash_t seed = SYMENGINE_MEXPRPOLY;
73 for (auto var : get_vars())
74 hash_combine<std::string>(seed, var->__str__());
75
76 for (auto &p : get_poly().dict_) {
77 hash_t t = vec_hash<vec_int>()(p.first);
78 hash_combine<Basic>(t, *(p.second.get_basic()));
79 seed ^= t;
80 }
81 return seed;
82}
83
84Expression MExprPoly::eval(
85 std::map<RCP<const Basic>, Expression, RCPBasicKeyLess> &vals) const
86{
87 // TODO : handle missing values
88 Expression ans(0);
89 for (auto bucket : get_poly().dict_) {
90 Expression term = bucket.second;
91 unsigned int whichvar = 0;
92 for (auto sym : get_vars()) {
93 term *= pow(vals.find(sym)->second, bucket.first[whichvar]);
94 whichvar++;
95 }
96 ans += term;
97 }
98 return ans;
99}
100
101unsigned int reconcile(vec_uint &v1, vec_uint &v2, set_basic &s,
102 const set_basic &s1, const set_basic &s2)
103{
104 auto i = s1.begin();
105 auto j = s2.begin();
106 unsigned int pos = 0;
107
108 // Performs a merge of s1 and s2, and builds up v1 and v2 as translators
109 // v1[i] and v2[i] is the position of the ith symbol in the new set
110
111 // set union
112 s = s1;
113 s.insert(s2.begin(), s2.end());
114
115 for (auto &it : s) {
116 if (i != s1.end() and eq(*it, **i)) {
117 v1.push_back(pos);
118 i++;
119 }
120 if (j != s2.end() and eq(*it, **j)) {
121 v2.push_back(pos);
122 j++;
123 }
124 pos++;
125 }
126 // return size of the new symbol set
127 return pos;
128}
129
130} // namespace SymEngine
hash_t __hash__() const override
hash_t __hash__() const override
Main namespace for SymEngine package.
Definition add.cpp:19
bool eq(const Basic &a, const Basic &b)
Checks equality for a and b
Definition basic-inl.h:21
void hash_combine(hash_t &seed, const T &v)
Definition basic-inl.h:95
RCP< const Basic > mul(const RCP< const Basic > &a, const RCP< const Basic > &b)
Multiplication.
Definition mul.cpp:352
RCP< const Basic > add(const RCP< const Basic > &a, const RCP< const Basic > &b)
Adds two objects (safely).
Definition add.cpp:425
std::enable_if< std::is_integral< T >::value, RCP< constInteger > >::type integer(T i)
Definition integer.h:197
T pow(T... args)
Our less operator (<):
Definition basic.h:228