void expr2linear_pol(expr * t, mpq_buffer & as, var_buffer & xs) { mpq c_mpq_val; if (m_util.is_add(t)) { rational c_val; unsigned num = to_app(t)->get_num_args(); for (unsigned i = 0; i < num; i++) { expr * mon = to_app(t)->get_arg(i); expr * c, * x; if (m_util.is_mul(mon, c, x) && m_util.is_numeral(c, c_val)) { nm.set(c_mpq_val, c_val.to_mpq()); as.push_back(c_mpq_val); xs.push_back(mk_var(x)); } else { as.push_back(mpq(1)); xs.push_back(mk_var(mon)); } } } else { as.push_back(mpq(1)); xs.push_back(mk_var(t)); } nm.del(c_mpq_val); }
mpq GingerCoinUnits::factor(int unit) { switch(unit) { case uFRC: return mpq("100/1"); case mFRC: return mpq("100000/1"); default: case FRC: return mpq("100000000/1"); } }
mpq applebycoinUnits::factor(int unit) { switch(unit) { case uFRC: return mpq("100/1"); case mFRC: return mpq("100000/1"); default: case ACC: return mpq("100000000/1"); } }
mpq DixiecoinUnits::factor(int unit) { switch(unit) { case uDXC: return mpq("100/1"); case mDXC: return mpq("100000/1"); default: case DXC: return mpq("100000000/1"); } }
mpq BitcoinUnits::factor(int unit) { switch(unit) { case BTC: return mpq("100000000/1"); case mBTC: return mpq("100000/1"); case uBTC: return mpq("100/1"); default: return mpq("100000000/1"); } }
mpq to_mpq_ext(lua_State * L, int idx) { switch (lua_type(L, idx)) { case LUA_TNUMBER: return mpq(lua_tonumber(L, idx)); case LUA_TSTRING: return mpq(lua_tostring(L, idx)); case LUA_TUSERDATA: if (is_mpz(L, idx)) { return mpq(to_mpz(L, idx)); } else { return *static_cast<mpq*>(luaL_checkudata(L, idx, mpq_mt)); } default: throw exception(sstream() << "arg #" << idx << " must be a number, string, mpz or mpq"); } }
static mpq const & to_mpq(lua_State * L) { static LEAN_THREAD_LOCAL mpq arg; switch (lua_type(L, idx)) { case LUA_TNUMBER: arg = lua_tonumber(L, idx); return arg; case LUA_TSTRING: arg = mpq(lua_tostring(L, idx)); return arg; case LUA_TUSERDATA: if (is_mpz(L, idx)) { arg = mpq(to_mpz(L, idx)); return arg; } else { return *static_cast<mpq*>(luaL_checkudata(L, idx, mpq_mt)); } default: throw exception(sstream() << "arg #" << idx << " must be a number, string, mpz or mpq"); } }
a_var mk_linear_pol(expr * t) { a_var x; if (m_expr2var.find(t, x)) return x; x = mk_var(t); if (m_util.is_add(t)) { m_num_buffer.reset(); m_var_buffer.reset(); expr2linear_pol(t, m_num_buffer, m_var_buffer); m_num_buffer.push_back(mpq(-1)); m_var_buffer.push_back(x); bp.mk_eq(m_num_buffer.size(), m_num_buffer.c_ptr(), m_var_buffer.c_ptr()); } return x; }
mpq lar_solver::get_infeasibility_of_constraint(const lar_normalized_constraint & norm_constr, std::unordered_map<std::string, mpq> & solution) { auto kind = norm_constr.m_kind; mpq left_side_val = get_canonic_left_side_val(norm_constr.m_canonic_left_side, solution); switch (kind) { case LT: case LE: return std::max(left_side_val - norm_constr.m_right_side, numeric_traits<mpq>::zero()); case GT: case GE: return std::max(- (left_side_val - norm_constr.m_right_side), numeric_traits<mpq>::zero()); case EQ: return abs(left_side_val - norm_constr.m_right_side); default: lean_unreachable(); } return mpq(0); // it is unreachable }
equation * mk_eq(unsigned num, mpz const * as, var const * xs, mpz const & c, unsigned num_js, mpq const * bs, justification const * js, bool sort = true) { equation * new_eq = alloc(equation); for (unsigned i = 0; i < num; i++) { m().set(m_as_buffer[xs[i]], as[i]); new_eq->m_as.push_back(mpz()); new_eq->m_xs.push_back(xs[i]); } sort_core(new_eq->m_as, new_eq->m_xs, m_as_buffer); m().set(new_eq->m_c, c); for (unsigned i = 0; i < num_js; i++) { m().set(m_bs_buffer[js[i]], bs[i]); new_eq->m_bs.push_back(mpq()); new_eq->m_js.push_back(js[i]); } if (sort) sort_core(new_eq->m_bs, new_eq->m_js, m_bs_buffer); return new_eq; }
mpq read_mpq(deserializer & d) { return mpq(d.read_string().c_str()); }