void LoadBalancing::lp_create_model() { int Ncol=3*num_using_nodes_+(num_using_nodes_-1)*(num_quantiles_+2); int i,j; int *colno=(int*)malloc((Ncol+1)*sizeof(int)); REAL *row=(REAL*)malloc((Ncol+1)*sizeof(REAL)); int *sosvars=(int*)malloc((num_quantiles_+2)*sizeof(int)); int ret; lp = make_lp(0,Ncol); if(lp == NULL) { fprintf(stderr, "Unable to create new LP model\n"); // return(-1); } resize_lp(lp, 6*num_using_nodes_-3, Ncol); //Set objective function set_obj(lp,num_using_nodes_+1,1); //Add constraints: set_add_rowmode(lp, TRUE); // D*x + E*ip - t <= -G for(i=0;i<num_using_nodes_;i++){ for(j=0;j<num_using_nodes_;j++){ colno[j]=POS_Xi(j); row[j]=lp_D[i*num_using_nodes_+j]; } colno[j]=POS_IPi(i); //ip(i); row[j]=Mopt_*lp_E[i]; colno[j+1]=POS_T; row[j+1]=-1;// -t add_constraintex(lp,j+2,row,colno,LE,-lp_G[i]); } //Increasing constraints, considering the overlap, (x[n]-x[n+1]<=-2*overlap_) for(i=0;i<num_using_nodes_-2;i++){ colno[0]=POS_Xi(i); row[0]=1; colno[1]=POS_Xi(i+1); row[1]=-1; add_constraintex(lp,2,row,colno,LE,-2*overlap_); } colno[0]=POS_Xi(i); row[0]=1; colno[1]=POS_Xi(i+1); row[1]=-1; add_constraintex(lp,2,row,colno,LE,-overlap_); //And the last cut must be 1: (x[num_using_nodes_]=1) colno[0]=POS_Xi(num_using_nodes_-1); row[0]=1; add_constraintex(lp,1,row,colno,EQ,1); //And now we define the number of interest points for each cut (ip1, ip2,...) // ip1=f1 // ip2=f2-f1 // ip3=f3-f2 // ipN=1-f3 //ip1: colno[0]=POS_IPi(0); //ip1 row[0]=-1; colno[1]=POS_Fi(0); //f1 row[1]=1; add_constraintex(lp,2,row,colno,EQ,0); //ip2 to ip(N-1): for(i=1;i<num_using_nodes_-1;i++){ colno[0]=POS_IPi(i); //ip(i) row[0]=-1; colno[1]=POS_Fi(i); //f(i) row[1]=1; colno[2]=POS_Fi(i-1); //f(i-1) row[2]=-1; add_constraintex(lp,3,row,colno,EQ,0); } //ipN: colno[0]=POS_IPi(num_using_nodes_-1); //ipN row[0]=1; colno[1]=POS_Fi(num_using_nodes_-2); //f(N-1) row[1]=1; add_constraintex(lp,2,row,colno,EQ,1); //SOS variables: // d10+d11+d12+d13+...=1 for(i=0;i<num_using_nodes_-1;i++){ for(j=0;j<num_quantiles_+2;j++){ colno[j]=POS_Dij(i,j); row[j]=1; sosvars[j]=POS_Dij(i,j); } char sosName[] = "SOS"; //Gives a warning otherwise... add_SOS(lp, sosName, 2, 1, num_quantiles_+2, sosvars, NULL); add_constraintex(lp,num_quantiles_+2,row,colno,EQ,1); } //So now we define the piecewise functions f (number of interest points left of x) for(i=0;i<num_using_nodes_-1;i++){ colno[0]=POS_Fi(i); //fi row[0]=-1; for(j=0;j<num_quantiles_;j++){ colno[j+1]=POS_Dij(i,j+1); row[j+1]=(j+1.0)/num_quantiles_; } colno[j+1]=POS_Dij(i,j+1); row[j+1]=1; add_constraintex(lp,num_quantiles_+2,row,colno,EQ,0); } // Now x1=q1*d11 + q2*d12 + ... for(i=0;i<num_using_nodes_-1;i++){ colno[0]=POS_Xi(i); row[0]=-1; for(j=0;j<num_quantiles_;j++){ colno[j+1]=POS_Dij(i,j+1); row[j+1]=(float)IPx_quantile_aprox_.at(j)/width_; } colno[j+1]=POS_Dij(i,j+1); row[j+1]=1; add_constraintex(lp,num_quantiles_+2,row,colno,EQ,0); } set_add_rowmode(lp, FALSE); free(colno); free(row); free(sosvars); is_lpmodel_created_=true; }
void LP::resize(const size_t rows) { resize_lp(pimpl_->lp_.get(), rows, row.size()); }