frac add(frac f1, frac f2) //+ { lcf(&f1, &f2); f1.num = f1.num + f2.num; return f1; }
frac sub(frac f1, frac f2) //- { lcf(&f1, &f2); f1.num = f1.num - f2.num; return f1; }
void Solver::make_problem_discrete() { if (problem_quantized == 0) throw logic_error("Quantized problem doesn't exist."); if (problem_discrete != 0) delete problem_discrete; problem_discrete = new Problem(); // add variables for (size_t i = 0; i < Problem::VARS_GROUPS_TOTAL; ++i) { Problem::Vars_group group = Problem::Vars_group(i); for (size_t j = 0; j < problem_quantized->get_variables_num(group); ++j) { Variable& v = problem_quantized->get_variable(group, j); if (v.get_type() == Variable::INTEGER) problem_discrete->add_variable(group, v); } } // add constraints for (size_t i = 0; i < Problem::CONSTRS_GROUPS_TOTAL; ++i) { Problem::Constrs_group group = Problem::Constrs_group(i); size_t real_vars_num = 0; size_t vars_num = problem_quantized->get_constraints_vars_num(group); for (size_t j = 0; j < vars_num; ++j) { Variable& v = problem_quantized->get_constraints_var(group, j); if (v.get_type() == Variable::REAL) ++real_vars_num; } eliminate_variables(group, real_vars_num, problem_quantized, problem_discrete); for (size_t j = 0; j < problem_discrete->get_constraints_num(group); ++j) { Constraint& c = problem_discrete->get_constraint(group, j); vector<int_t> nums; for (size_t k = 0; k < problem_discrete->get_constraints_vars_num(group); ++k) { Variable& v = problem_discrete->get_constraints_var(group, k); real_t coeff = c.get_coeff(v); if (coeff != 0) nums.push_back(coeff.get_den()); } real_t free_member = c.get_free_member(); if (free_member != 0) nums.push_back(free_member.get_den()); int_t lcf_num = lcf(nums); c.mult(lcf_num); } } }