void Rational::mpqInit(mpq_t& mpq) const { mpz_t num, den; numerator.mpzInit(num); denominator.mpzInit(den); mpq_init(mpq); mpq_set_num(mpq, num); mpq_set_den(mpq, den); mpz_clear(num); mpz_clear(den); }
void ddd_mpq_set_si(mytype a,signed long b) { mpz_t nz, dz; mpz_init(nz); mpz_init(dz); mpz_set_si(nz, b); mpz_set_ui(dz, 1U); mpq_set_num(a, nz); mpq_set_den(a, dz); mpz_clear(nz); mpz_clear(dz); }
/* Function to generate the hypergeometric pdf */ void hypergeometricpdf(mpfr_t *out,mpz_t mu, mpz_t d,unsigned int mi,unsigned int conns,unsigned int phi, mpz_t bc_b_ai[], mpz_t mu_bc[]) { unsigned int dini=(unsigned int)conns; unsigned int dmax=(unsigned int)conns; mpz_t bcm_b_ai; mpz_init(bcm_b_ai); mpq_t quotient; mpq_init(quotient); unsigned int odex=0; unsigned int di; // unsigned int phi; unsigned int bi; unsigned int ai_cnt; //loop over d, phi and beta for(di=dini;di<=dmax;di=di++) { //for(phi=1;phi<=di;phi++) //{ for(bi=0;bi<=mi;bi++) { for(ai_cnt=phi;ai_cnt<=di;ai_cnt++) { if((mi-bi)<=0) //Then the number of successful picks is the number of draws with probability 1 { if(ai_cnt==di) mpq_set_d(quotient,1); else mpq_set_d(quotient,0); } else { mpz_mul(bcm_b_ai,bc_b_ai[bi*(dmax+1)+(ai_cnt)],bc_b_ai[(mi-bi)*(dmax+1)+(di-ai_cnt)]); mpq_set_num(quotient, bcm_b_ai); mpq_set_den(quotient, mu_bc[di-1]); mpq_canonicalize(quotient); } mpfr_set_q(*(out+odex),quotient,MPFR_RNDN); odex++; //Address array with simple counter increment; } } //} } mpz_clear(bcm_b_ai); mpq_clear(quotient); }
bool Rational::isInteger(const Rational& tolerance) const { // if denominator is 1, then it is an integer for sure if (mpz_cmp_ui(mpq_denref(number), 1) == 0) return true; // otherwise, we must check w.r.t. the given tolerance // first calculate the fractional part Rational viol(*this); viol.abs(); mpz_t r; mpz_init(r); mpz_fdiv_r(r, mpq_numref(viol.number), mpq_denref(viol.number)); mpq_set_num(viol.number, r); mpz_clear(r); // then integrality violation if( viol > Rational(1, 2) ) sub(viol, Rational(1,1), viol); return !(viol > tolerance); }
static CRATIONAL *_powf(CRATIONAL *a, double f, bool invert) { ulong p; mpz_t num, den; mpq_t n; if (invert || (double)(int)f != f) return NULL; if (f < 0) { f = (-f); invert = TRUE; } p = (ulong)f; mpz_init(num); mpz_pow_ui(num, mpq_numref(a->n), p); mpz_init(den); mpz_pow_ui(den, mpq_denref(a->n), p); mpq_init(n); if (invert) mpz_swap(num, den); if (mpz_cmp_si(den, 0) == 0) { GB.Error(GB_ERR_ZERO); return NULL; } mpq_set_num(n, num); mpq_set_den(n, den); mpz_clear(num); mpz_clear(den); mpq_canonicalize(n); return RATIONAL_create(n); }
void Rational::integralityViolation(Rational& violation) const { // if denominator is 1, then there is no integrality violation for sure if( mpz_cmp_ui(mpq_denref(number), 1) == 0 ) { violation.toZero(); return; } // otherwise, we must check w.r.t. the given tolerance // first calculate the fractional part violation = (*this); violation.abs(); mpz_t r; mpz_init(r); mpz_fdiv_r(r, mpq_numref(violation.number), mpq_denref(violation.number)); mpq_set_num(violation.number, r); mpz_clear(r); // then integrality violation if( violation > Rational(1, 2) ) sub(violation, Rational(1,1), violation); }
void __rat_approx_step(mpq_t res, mpz_t num, mpz_t den, mpz_t a, mpz_t pnm2, mpz_t pnm1, mpz_t qnm2, mpz_t qnm1, mpz_t pn, mpz_t qn) { mpz_tdiv_qr(a,num,num,den); /* pn = an pn-1 + pn-2 * qn = an qn-1 + qn-2 */ mpz_mul(pn,a,pnm1); mpz_add(pn,pn,pnm2); mpz_mul(qn,a,qnm1); mpz_add(qn,qn,qnm2); mpq_set_num(res,pn); mpq_set_den(res,qn); mpq_canonicalize(res); /* Advance: pn-1 -> pn-2, pn -> pn-1, and for q */ mpz_set(pnm2,pnm1); mpz_set(qnm2,qnm1); mpz_set(pnm1,pn); mpz_set(qnm1,qn); mpz_swap(num,den); }
static void solve(char* file_name) { ppl_Constraint_System_t ppl_cs; #ifndef NDEBUG ppl_Constraint_System_t ppl_cs_copy; #endif ppl_Generator_t optimum_location; ppl_Linear_Expression_t ppl_le; int dimension, row, num_rows, column, nz, i, j, type; int* coefficient_index; double lb, ub; double* coefficient_value; mpq_t rational_lb, rational_ub; mpq_t* rational_coefficient; mpq_t* objective; ppl_Linear_Expression_t ppl_objective_le; ppl_Coefficient_t optimum_n; ppl_Coefficient_t optimum_d; mpq_t optimum; mpz_t den_lcm; int optimum_found; glp_mpscp glpk_mpscp; glpk_lp = glp_create_prob(); glp_init_mpscp(&glpk_mpscp); if (verbosity == 0) { /* FIXME: find a way to suppress output from glp_read_mps. */ } #ifdef PPL_LPSOL_SUPPORTS_TIMINGS if (print_timings) start_clock(); #endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */ if (glp_read_mps(glpk_lp, GLP_MPS_FILE, &glpk_mpscp, file_name) != 0) fatal("cannot read MPS file `%s'", file_name); #ifdef PPL_LPSOL_SUPPORTS_TIMINGS if (print_timings) { fprintf(stderr, "Time to read the input file: "); print_clock(stderr); fprintf(stderr, " s\n"); start_clock(); } #endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */ glpk_lp_num_int = glp_get_num_int(glpk_lp); if (glpk_lp_num_int > 0 && !no_mip && !use_simplex) fatal("the enumeration solving method can not handle MIP problems"); dimension = glp_get_num_cols(glpk_lp); /* Read variables constrained to be integer. */ if (glpk_lp_num_int > 0 && !no_mip && use_simplex) { if (verbosity >= 4) fprintf(output_file, "Integer variables:\n"); integer_variables = (ppl_dimension_type*) malloc((glpk_lp_num_int + 1)*sizeof(ppl_dimension_type)); for (i = 0, j = 0; i < dimension; ++i) { int col_kind = glp_get_col_kind(glpk_lp, i+1); if (col_kind == GLP_IV || col_kind == GLP_BV) { integer_variables[j] = i; if (verbosity >= 4) { ppl_io_fprint_variable(output_file, i); fprintf(output_file, " "); } ++j; } } } coefficient_index = (int*) malloc((dimension+1)*sizeof(int)); coefficient_value = (double*) malloc((dimension+1)*sizeof(double)); rational_coefficient = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t)); ppl_new_Constraint_System(&ppl_cs); mpq_init(rational_lb); mpq_init(rational_ub); for (i = 1; i <= dimension; ++i) mpq_init(rational_coefficient[i]); mpz_init(den_lcm); if (verbosity >= 4) fprintf(output_file, "\nConstraints:\n"); /* Set up the row (ordinary) constraints. */ num_rows = glp_get_num_rows(glpk_lp); for (row = 1; row <= num_rows; ++row) { /* Initialize the least common multiple computation. */ mpz_set_si(den_lcm, 1); /* Set `nz' to the number of non-zero coefficients. */ nz = glp_get_mat_row(glpk_lp, row, coefficient_index, coefficient_value); for (i = 1; i <= nz; ++i) { set_mpq_t_from_double(rational_coefficient[i], coefficient_value[i]); /* Update den_lcm. */ mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_coefficient[i])); } lb = glp_get_row_lb(glpk_lp, row); ub = glp_get_row_ub(glpk_lp, row); set_mpq_t_from_double(rational_lb, lb); set_mpq_t_from_double(rational_ub, ub); mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb)); mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub)); ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension); for (i = 1; i <= nz; ++i) { mpz_mul(tmp_z, den_lcm, mpq_numref(rational_coefficient[i])); mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_coefficient[i])); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); ppl_Linear_Expression_add_to_coefficient(ppl_le, coefficient_index[i]-1, ppl_coeff); } type = glp_get_row_type(glpk_lp, row); add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs); ppl_delete_Linear_Expression(ppl_le); } free(coefficient_value); for (i = 1; i <= dimension; ++i) mpq_clear(rational_coefficient[i]); free(rational_coefficient); free(coefficient_index); #ifndef NDEBUG ppl_new_Constraint_System_from_Constraint_System(&ppl_cs_copy, ppl_cs); #endif /* FIXME: here we could build the polyhedron and minimize it before adding the variable bounds. */ /* Set up the columns constraints, i.e., variable bounds. */ for (column = 1; column <= dimension; ++column) { lb = glp_get_col_lb(glpk_lp, column); ub = glp_get_col_ub(glpk_lp, column); set_mpq_t_from_double(rational_lb, lb); set_mpq_t_from_double(rational_ub, ub); /* Initialize the least common multiple computation. */ mpz_set_si(den_lcm, 1); mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb)); mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub)); ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, den_lcm); ppl_Linear_Expression_add_to_coefficient(ppl_le, column-1, ppl_coeff); type = glp_get_col_type(glpk_lp, column); add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs); ppl_delete_Linear_Expression(ppl_le); } mpq_clear(rational_ub); mpq_clear(rational_lb); /* Deal with the objective function. */ objective = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t)); /* Initialize the least common multiple computation. */ mpz_set_si(den_lcm, 1); mpq_init(objective[0]); set_mpq_t_from_double(objective[0], glp_get_obj_coef(glpk_lp, 0)); for (i = 1; i <= dimension; ++i) { mpq_init(objective[i]); set_mpq_t_from_double(objective[i], glp_get_obj_coef(glpk_lp, i)); /* Update den_lcm. */ mpz_lcm(den_lcm, den_lcm, mpq_denref(objective[i])); } /* Set the ppl_objective_le to be the objective function. */ ppl_new_Linear_Expression_with_dimension(&ppl_objective_le, dimension); /* Set value for objective function's inhomogeneous term. */ mpz_mul(tmp_z, den_lcm, mpq_numref(objective[0])); mpz_divexact(tmp_z, tmp_z, mpq_denref(objective[0])); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); ppl_Linear_Expression_add_to_inhomogeneous(ppl_objective_le, ppl_coeff); /* Set values for objective function's variable coefficients. */ for (i = 1; i <= dimension; ++i) { mpz_mul(tmp_z, den_lcm, mpq_numref(objective[i])); mpz_divexact(tmp_z, tmp_z, mpq_denref(objective[i])); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); ppl_Linear_Expression_add_to_coefficient(ppl_objective_le, i-1, ppl_coeff); } if (verbosity >= 4) { fprintf(output_file, "Objective function:\n"); if (mpz_cmp_si(den_lcm, 1) != 0) fprintf(output_file, "("); ppl_io_fprint_Linear_Expression(output_file, ppl_objective_le); } for (i = 0; i <= dimension; ++i) mpq_clear(objective[i]); free(objective); if (verbosity >= 4) { if (mpz_cmp_si(den_lcm, 1) != 0) { fprintf(output_file, ")/"); mpz_out_str(output_file, 10, den_lcm); } fprintf(output_file, "\n%s\n", (maximize ? "Maximizing." : "Minimizing.")); } ppl_new_Coefficient(&optimum_n); ppl_new_Coefficient(&optimum_d); ppl_new_Generator_zero_dim_point(&optimum_location); optimum_found = use_simplex ? solve_with_simplex(ppl_cs, ppl_objective_le, optimum_n, optimum_d, optimum_location) : solve_with_generators(ppl_cs, ppl_objective_le, optimum_n, optimum_d, optimum_location); ppl_delete_Linear_Expression(ppl_objective_le); if (glpk_lp_num_int > 0) free(integer_variables); if (optimum_found) { mpq_init(optimum); ppl_Coefficient_to_mpz_t(optimum_n, tmp_z); mpq_set_num(optimum, tmp_z); ppl_Coefficient_to_mpz_t(optimum_d, tmp_z); mpz_mul(tmp_z, tmp_z, den_lcm); mpq_set_den(optimum, tmp_z); if (verbosity == 1) fprintf(output_file, "Optimized problem.\n"); if (verbosity >= 2) fprintf(output_file, "Optimum value: %.10g\n", mpq_get_d(optimum)); if (verbosity >= 3) { fprintf(output_file, "Optimum location:\n"); ppl_Generator_divisor(optimum_location, ppl_coeff); ppl_Coefficient_to_mpz_t(ppl_coeff, tmp_z); for (i = 0; i < dimension; ++i) { mpz_set(mpq_denref(tmp1_q), tmp_z); ppl_Generator_coefficient(optimum_location, i, ppl_coeff); ppl_Coefficient_to_mpz_t(ppl_coeff, mpq_numref(tmp1_q)); ppl_io_fprint_variable(output_file, i); fprintf(output_file, " = %.10g\n", mpq_get_d(tmp1_q)); } } #ifndef NDEBUG { ppl_Polyhedron_t ph; unsigned int relation; ppl_new_C_Polyhedron_recycle_Constraint_System(&ph, ppl_cs_copy); ppl_delete_Constraint_System(ppl_cs_copy); relation = ppl_Polyhedron_relation_with_Generator(ph, optimum_location); ppl_delete_Polyhedron(ph); assert(relation == PPL_POLY_GEN_RELATION_SUBSUMES); } #endif maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED, mpq_get_d(optimum)); mpq_clear(optimum); } ppl_delete_Constraint_System(ppl_cs); ppl_delete_Coefficient(optimum_d); ppl_delete_Coefficient(optimum_n); ppl_delete_Generator(optimum_location); glp_delete_prob(glpk_lp); }
/* Function to calculate the expected number of unique codes within each input success class */ void uniquecodes(mpfr_t *ucodes, int psiz, mpz_t n, unsigned long int mu, mpz_t ncodes ,mpfr_t *pdf,mpfr_prec_t prec) { //200 bits precision gives log[2^200] around 60 digits decimal precision mpfr_t unity; mpfr_init2(unity,prec); mpfr_set_ui(unity,(unsigned long int) 1,MPFR_RNDN); mpfr_t nunity; mpfr_init2(nunity,prec); mpfr_set_si(nunity,(signed long int) -1,MPFR_RNDN); mpz_t bcnum; mpz_init(bcnum); mpfr_t bcnumf; mpfr_init2(bcnumf,prec); mpq_t cfrac; mpq_init(cfrac); mpfr_t cfracf; mpfr_init2(cfracf,prec); mpfr_t expargr; mpfr_init2(expargr,prec); mpfr_t r1; mpfr_init2(r1,prec); mpfr_t r2; mpfr_init2(r2,prec); // mpfr_t pdf[mu]; unsigned long int i; int pdex; int addr; // for(i=0;i<=mu;i++) // mpfr_init2(pdf[i],prec); // inpdf(pdf,n,pin,mu,bcs,prec); for(pdex=0;pdex<=psiz-1;pdex++) { for(i=0;i<=mu;i++) { addr=pdex*(mu+1)+i; mpz_bin_ui(bcnum,n,i); mpq_set_num(cfrac,ncodes); mpq_set_den(cfrac,bcnum); mpq_canonicalize(cfrac); mpfr_set_q(cfracf,cfrac,MPFR_RNDN); mpfr_mul(expargr,cfracf,*(pdf+addr),MPFR_RNDN); mpfr_mul(expargr,expargr,nunity,MPFR_RNDN); mpfr_exp(r1,expargr,MPFR_RNDN); mpfr_sub(r1,unity,r1,MPFR_RNDN); mpfr_set_z(bcnumf,bcnum,MPFR_RNDN); mpfr_mul(r2,bcnumf,r1,MPFR_RNDN); mpfr_set((*ucodes+addr),r2,MPFR_RNDN); mpfr_round((*ucodes+addr),(*ucodes+addr)); } } mpfr_clear(unity); mpfr_clear(nunity); mpz_clear(bcnum); mpfr_clear(bcnumf); mpq_clear(cfrac); mpfr_clear(cfracf); mpfr_clear(expargr); mpfr_clear(r1); mpfr_clear(r2); // for(i=0;i<=mu;i++) // mpfr_clear(pdf[i]); }