//Generate offset of bound bool GEN_C::genofst(OUT CHAR sbuf[], IN RMat & ofst) { ASSERT(m_is_init == true, ("not yet initialized")); if (ofst.size() == 0 || ofst.is_rowequ(0, 0)) { return false; } ASSERT(ofst.is_rowvec(), ("should be only one-dimension for each of loop level")); CHAR tmpbuf[TMP_BUF_LEN]; /* Common low denominator to reduce division e.g: Given expression is i + (3/2)*j + (1/2)*k, then transformed to (2*i + 3*j + k) / 2 CASE: The method may incur integer overflow exception. e.g: i is a larger number, and 1/2*i + 1/30*j will be transformed to (15*i + j)/30, notes that 15*i may cause integer overflow but the old code is not. */ ofst.comden(0, 0); INT comden = ofst.get(0,0).den(); ASSERT(comden > 0, ("unnormalized")); if (comden != 1) { xstrcat(sbuf, m_sbufl, "("); } bool hasv = false; for (UINT j = 0; j < ofst.get_col_size(); j++) { Rational o = ofst.get(0, j); if (o == 0) { continue; } ASSERT(comden == o.den() && o.den() > 0, ("should be equal")); if (hasv) { xstrcat(sbuf, m_sbufl, "+"); } if (o.num() == 1) { xstrcat(sbuf, m_sbufl, "%s", get_newvar_sym(tmpbuf, j)); } else if (o.num() == -1) { xstrcat(sbuf, m_sbufl, "(-%s)", get_newvar_sym(tmpbuf, j)); } else { xstrcat(sbuf, m_sbufl, "(%d*%s)", o.num(), get_newvar_sym(tmpbuf, j)); } hasv = true; } if (comden != 1) { xstrcat(sbuf, m_sbufl, ")/%d", comden); } return hasv; }
//This function demostrate how to use SIX to compute maxmium and minmum solution. void solve_linear_program() { /* Given system has 5 variable, v0, v1, v2, v3, v4. linear inequality: v0 >= 10 v0 + v1 >= 8 v0 + v1 + v2 >= 9 v0 + v1 + v2 + v3 >= 11 v1 + v2 + v3 + v4 >= 13 v2 + v3 + v4 >= 8 v3 + v4 >= 5 v4 >= 3 variable constrain: v0 >= 0 v1 >= 0 v2 >= 0 v3 >= 0 v4 >= 0 target function: min=v0+v1+v2+v3+v4 */ Rational v; //maximum or minimum result value. RMat leq(8,6); //linear inequality. RMat eq; //linear equality. RMat tgtf(1,6); //target function. RMat vc(5,6); //variable constrain. RMat res; //result solution. tgtf.sete(6, //indicate tgtf has 6 elements. 1, 1, 1, 1, 1, 0); // leq.sete(48, -1,0,0,0,0, -10, -1,-1,0,0,0, -8, -1,-1,-1,0,0, -9, -1,-1,-1,-1,0, -11, 0,-1,-1,-1,-1, -13, 0,0,-1,-1,-1, -8, 0,0,0,-1,-1, -5, 0,0,0,0,-1, -3); vc.sete(30, -1,0,0,0,0, 0, 0,-1,0,0,0, 0, 0,0,-1,0,0, 0, 0,0,0,-1,0, 0, 0,0,0,0,-1, 0); SIX<RMat, Rational> six; //Dump to check. tgtf.dumps(); vc.dumps(); eq.dumps(); leq.dumps(); //solution is unbound if (SIX_SUCC != six.maxm(v, res,tgtf,vc,eq,leq)) { printf("\nunbound"); } else { printf("\nmax val:%d/%d",v.num(), v.den()); res.dumps(); } /* min val:23 solution is:v0=10 v1=5 v2=3 v3=2 v4=3 v5=1 */ if (SIX_SUCC != six.minm(v, res,tgtf,vc,eq,leq)) { //res is unbound!! printf("\nunbound"); } else { printf("\nmin val:%d/%d",v.num(), v.den()); res.dumps(); } }