@@ -43,4 +43,77 @@ namespace ratio
4343 values.push_back (ev_ptr);
4444 return values;
4545 };
46+
47+ riddle::arith_expr solver_core::new_negation (riddle::arith_expr xpr)
48+ {
49+ if (xpr->get_type ().get_name () == riddle::int_kw)
50+ return std::make_shared<riddle::arith_item>(static_cast <riddle::int_type &>(get_type (riddle::int_kw)), -static_cast <const riddle::arith_item &>(*xpr).get_lin ());
51+ else if (xpr->get_type ().get_name () == riddle::real_kw)
52+ return std::make_shared<riddle::arith_item>(static_cast <riddle::real_type &>(get_type (riddle::real_kw)), -static_cast <const riddle::arith_item &>(*xpr).get_lin ());
53+ else
54+ throw std::runtime_error (" Invalid type" );
55+ }
56+
57+ riddle::arith_expr solver_core::new_sum (std::vector<riddle::arith_expr> &&xprs)
58+ {
59+ assert (xprs.size () > 1 );
60+ utils::lin sum;
61+ for (const riddle::arith_expr &xpr : xprs)
62+ sum += static_cast <const riddle::arith_item &>(*xpr).get_lin ();
63+ auto &tp = type_promotion (xprs);
64+ if (tp.get_name () == riddle::int_kw)
65+ return std::make_shared<riddle::arith_item>(static_cast <riddle::int_type &>(get_type (riddle::int_kw)), std::move (sum));
66+ else if (tp.get_name () == riddle::real_kw)
67+ return std::make_shared<riddle::arith_item>(static_cast <riddle::real_type &>(get_type (riddle::real_kw)), std::move (sum));
68+ else
69+ throw std::runtime_error (" Invalid type" );
70+ }
71+ riddle::arith_expr solver_core::new_subtraction (std::vector<riddle::arith_expr> &&xprs)
72+ {
73+ assert (xprs.size () > 1 );
74+ utils::lin sub = static_cast <const riddle::arith_item &>(*xprs[0 ]).get_lin ();
75+ for (size_t i = 1 ; i < xprs.size (); i++)
76+ sub -= static_cast <const riddle::arith_item &>(*xprs[i]).get_lin ();
77+ auto &tp = type_promotion (xprs);
78+ if (tp.get_name () == riddle::int_kw)
79+ return std::make_shared<riddle::arith_item>(static_cast <riddle::int_type &>(get_type (riddle::int_kw)), std::move (sub));
80+ else if (tp.get_name () == riddle::real_kw)
81+ return std::make_shared<riddle::arith_item>(static_cast <riddle::real_type &>(get_type (riddle::real_kw)), std::move (sub));
82+ else
83+ throw std::runtime_error (" Invalid type" );
84+ }
85+ riddle::arith_expr solver_core::new_product (std::vector<riddle::arith_expr> &&xprs)
86+ {
87+ assert (xprs.size () > 1 );
88+ utils::lin prod;
89+ for (const riddle::arith_expr &xpr : xprs)
90+ if (static_cast <const riddle::arith_item &>(*xpr).get_lin ().vars .empty ())
91+ prod *= static_cast <const riddle::arith_item &>(*xpr).get_lin ().known_term ;
92+ else
93+ throw std::runtime_error (" Non-linear arithmetic not supported" );
94+ auto &tp = type_promotion (xprs);
95+ if (tp.get_name () == riddle::int_kw)
96+ return std::make_shared<riddle::arith_item>(static_cast <riddle::int_type &>(get_type (riddle::int_kw)), std::move (prod));
97+ else if (tp.get_name () == riddle::real_kw)
98+ return std::make_shared<riddle::arith_item>(static_cast <riddle::real_type &>(get_type (riddle::real_kw)), std::move (prod));
99+ else
100+ throw std::runtime_error (" Invalid type" );
101+ }
102+ riddle::arith_expr solver_core::new_division (std::vector<riddle::arith_expr> &&xprs)
103+ {
104+ assert (xprs.size () > 1 );
105+ utils::lin div = static_cast <const riddle::arith_item &>(*xprs[0 ]).get_lin ();
106+ for (size_t i = 1 ; i < xprs.size (); i++)
107+ if (static_cast <const riddle::arith_item &>(*xprs[i]).get_lin ().vars .empty ())
108+ div /= static_cast <const riddle::arith_item &>(*xprs[i]).get_lin ().known_term ;
109+ else
110+ throw std::runtime_error (" Non-linear arithmetic not supported" );
111+ auto &tp = type_promotion (xprs);
112+ if (tp.get_name () == riddle::int_kw)
113+ return std::make_shared<riddle::arith_item>(static_cast <riddle::int_type &>(get_type (riddle::int_kw)), std::move (div));
114+ else if (tp.get_name () == riddle::real_kw)
115+ return std::make_shared<riddle::arith_item>(static_cast <riddle::real_type &>(get_type (riddle::real_kw)), std::move (div));
116+ else
117+ throw std::runtime_error (" Invalid type" );
118+ }
46119} // namespace ratio
0 commit comments