void mpfx_manager::set_core(mpfx & n, mpq_manager<SYNCH> & m, mpq const & v) { if (m.is_int(v)) { set_core(n, m, v.numerator()); } else { allocate_if_needed(n); _scoped_numeral<mpz_manager<SYNCH> > tmp(m); n.m_sign = is_neg(n); m.mul2k(v.numerator(), 8 * sizeof(unsigned) * m_frac_part_sz, tmp); m.abs(tmp); if ((n.m_sign == 1) != m_to_plus_inf && !m.divides(v.denominator(), tmp)) { m.div(tmp, v.denominator(), tmp); m.inc(tmp); } else { m.div(tmp, v.denominator(), tmp); } m_tmp_digits.reset(); m.decompose(tmp, m_tmp_digits); unsigned sz = m_tmp_digits.size(); if (sz > m_total_sz) throw overflow_exception(); unsigned * w = words(n); ::copy(sz, m_tmp_digits.c_ptr(), m_total_sz, w); } SASSERT(check(n)); }
mpz floor(mpq const & a) { if (a.is_integer()) return a.get_numerator(); mpz r; mpz_tdiv_q(mpq::zval(r), mpq_numref(a.m_val), mpq_denref(a.m_val)); if (a.is_neg()) --r; return r; }
mpz ceil(mpq const & a) { if (a.is_integer()) return a.get_numerator(); mpz r; mpz_tdiv_q(mpq::zval(r), mpq_numref(a.m_val), mpq_denref(a.m_val)); if (a.is_pos()) ++r; return r; }
shared_ptr<mat> filtering(const mat& mrating, mpq& msim){ cout<<"collaborative filtering..."<<endl; shared_ptr<mat> pm_predict(new mat(mrating)); mat& m_predict = *pm_predict; int max_row_index = base ? nitem : nuser; for(mpq_i i=msim.begin(); i!=msim.end(); ++i){ cout<<(i->first+1) * 100 / max_row_index<<"%\r"; cout.flush(); // get current row row ri(m_predict, i->first); pq& q = i->second; // pop all sim rows for(;!q.empty(); q.pop()){ int index = q.top().first; double sim = q.top().second; crow rj(mrating, index); switch(sim_summing){ case 0: ri += rj * sim; break; case 1: for(crow::const_iterator j=rj.begin(); j!=rj.end(); ++j){ int col = j.index(); double v = 1 - ( 1 - ri(col) ) * ( 1 - *j * sim ); if(v) ri(col) = v; } break; default: break; } } } cout<<endl; if(vm.count("verbose")) cout<<"prediction matrix:\n"<<m_predict<<endl; return pm_predict; }
void display_decimal(std::ostream & out, mpq const & a, unsigned prec) { mpz n1, d1, v1; numerator(n1, a); denominator(d1, a); if (a.is_neg()) { out << "-"; n1.neg(); } v1 = n1 / d1; out << v1; n1 = rem(n1, d1); if (n1.is_zero()) return; out << "."; for (unsigned i = 0; i < prec; i++) { n1 *= 10; v1 = n1 / d1; lean_assert(v1 < 10); out << v1; n1 = rem(n1, d1); if (n1.is_zero()) return; } out << "?"; }
int cmp(mpq const & a, mpz const & b) { if (a.is_integer()) { return mpz_cmp(mpq_numref(a.m_val), mpq::zval(b)); } else { static LEAN_THREAD_LOCAL mpz tmp; mpz_mul(mpq::zval(tmp), mpq_denref(a.m_val), mpq::zval(b)); return mpz_cmp(mpq_numref(a.m_val), mpq::zval(tmp)); } }
int cmp(mpbq const & a, mpq const & b) { if (a.is_integer() && b.is_integer()) { return -cmp(b, a.m_num); } else { static thread_local mpz tmp1; static thread_local mpz tmp2; // tmp1 <- numerator(a)*denominator(b) denominator(tmp1, b); tmp1 *= a.m_num; // tmp2 <- numerator(b)*denominator(a) numerator(tmp2, b); mul2k(tmp2, tmp2, a.m_k); return cmp(tmp1, tmp2); } }
bool mpq_manager<SYNCH>::rat_lt(mpq const & a, mpq const & b) { mpz const & na = a.numerator(); mpz const & nb = b.numerator(); int sign_a = this->sign(na); int sign_b = this->sign(nb); if (sign_a < 0) { if (sign_b >= 0) return true; } else if (sign_a == 0) { if (sign_b > 0) return true; SASSERT(sign_b <= 0); return false; } else { SASSERT(sign_a > 0); if (sign_b <= 0) return false; } SASSERT((sign_a > 0 && sign_b > 0) || (sign_a < 0 && sign_b < 0)); mpz const & da = a.denominator(); mpz const & db = b.denominator(); if (SYNCH) { mpq tmp1; mpq tmp2; mul(na, db, tmp1); mul(nb, da, tmp2); bool r = lt(tmp1, tmp2); del(tmp1); del(tmp2); return r; } else { mul(na, db, m_lt_tmp1); mul(nb, da, m_lt_tmp2); return lt(m_lt_tmp1, m_lt_tmp2); } }
void refine_lower(mpq const & q, mpbq & l, mpbq & u) { lean_assert(l < q && q < u); lean_assert(!q.get_denominator().is_power_of_two()); mpbq mid; while (true) { mid = l + u; div2(mid); if (mid < q) { swap(l, mid); lean_assert(l < q && q < u); return; } swap(u, mid); } }
bool set(mpbq & a, mpq const & b) { if (b.is_integer()) { numerator(a.m_num, b); a.m_k = 0; return true; } else { static thread_local mpz d; denominator(d, b); unsigned shift; if (d.is_power_of_two(shift)) { numerator(a.m_num, b); a.m_k = shift; lean_assert(a == b); return true; } else { numerator(a.m_num, b); a.m_k = d.log2() + 1; return false; } } }