Main Page   Class Hierarchy   Compound List   File List   Contact   Download   Symbolic Constraints   Examples  

subproblem.cc

00001 #include<scil/scil.h>
00002 #include<scip/objscip.h>
00003 #include"scip_constraint_handler.h"
00004 
00005 namespace SCIL {
00006 
00007   subproblem::subproblem(ILP_Problem* ILP_) 
00008     : ILP(ILP_) {
00009     Subproblem_Data=((ILP_Problem_Data*) ILP->DATA)->scipp;
00010   };
00011 
00012   var subproblem::add_variable(double obj, double lBound, double uBound, Vartype vt, Activation a) {
00013     var_obj* vo=new var_obj(obj, lBound, uBound, vt);
00014     return add_variable(vo, a);
00015   }
00016 
00017   var subproblem::add_continous_variable(double obj, double lBound, double uBound, Activation a) {
00018     return add_variable(obj, lBound, uBound, Vartype_Float, a);
00019   };
00020 
00021 
00022   var subproblem::add_integer_variable(double obj, int lB, int uB, Activation a) {
00023     return add_variable(obj, lB, uB, Vartype_Integer, a);
00024   };
00025   
00026   var subproblem::add_binary_variable(double obj, Activation a) {
00027     return add_variable(obj, 0, 1, Vartype_Integer, a);
00028   };
00029 
00030   var subproblem::add_variable(var_obj* vo, Activation a) {
00031     CHECK_ABORT( SCIPcreateVar((SCIP*) Subproblem_Data, 
00032       &((Variable_Data*) vo->DATA)->varP, "x", 
00033       vo->lower_bound(), vo->upper_bound(), vo->obj(), 
00034       vo->type() == Vartype_Integer ? SCIP_VARTYPE_INTEGER : SCIP_VARTYPE_CONTINUOUS, 
00035       true, a == Static ? false : true, NULL, NULL, NULL, NULL) );
00036     CHECK_ABORT( SCIPaddVar((SCIP*) Subproblem_Data, ((Variable_Data*) vo->DATA)->varP) );
00037     ((ILP_Problem_Data*) ILP->DATA)->VM[SCIPvarGetProbindex(((Variable_Data*) vo->DATA)->varP)]=var(vo);
00038     return var(vo);
00039   }
00040 
00041   cons subproblem::add_basic_constraint(cons_sense s, double rhs, Activation a) {
00042     cons_obj* co=new cons_obj(s,rhs);
00043     return add_basic_constraint(co,a);
00044   };
00045 
00046   cons subproblem::add_basic_constraint(cons_obj* co, Activation a) {
00047     CHECK_ABORT( SCIPcreateEmptyRow((SCIP*) Subproblem_Data, 
00048       &((Basic_Constraint_Data*) co->DATA)->rowp, "c", 
00049       co->sense() == Less ? -SCIPinfinity((SCIP*) Subproblem_Data) : co->rhs(), 
00050       co->sense() == Greater ? SCIPinfinity((SCIP*) Subproblem_Data) : co->rhs(), 
00051       true, false /* true for pricing */, a==Static ? false : true ));
00052     row r;
00053     co->non_zero_entries(r);
00054     row_entry re;
00055     forall(re, r) { // TODO kein NULLPOINTER!
00056       if(re.Var.var_pointer()!=NULL) {
00057         VAR* V=((Variable_Data*) re.Var.var_pointer()->DATA)->varP;
00058         CHECK_ABORT( SCIPaddVarToRow((SCIP*) Subproblem_Data, 
00059          ((Basic_Constraint_Data*) co->DATA)->rowp, V, re.Coeff) );
00060       };
00061     };
00062     CHECK_ABORT( SCIPaddCut((SCIP*) Subproblem_Data, 
00063       ((Basic_Constraint_Data*) co->DATA)->rowp, 
00064       a==Static ? SCIPinfinity((SCIP*) Subproblem_Data) : co->slack(*this)) );
00065     SCIPreleaseRow((SCIP*) Subproblem_Data, &((Basic_Constraint_Data*) co->DATA)->rowp);
00066     ((Basic_Constraint_Data*) co->DATA)->scipp=(SCIP*) Subproblem_Data;
00067     ((ILP_Problem_Data*) ILP->DATA)->CL.append(co);
00068     cons c(co);
00069     return c;
00070   };
00071 
00072   double subproblem::value(var v) {
00073     return SCIPgetVarSol((SCIP*) Subproblem_Data, ((Variable_Data*) v.var_pointer()->DATA)->varP);
00074   };
00075 
00076   double subproblem::value(const row& r) {
00077     row_entry re;
00078     double d=0;
00079     forall(re, r) d+=re.Coeff*value(re.Var);
00080     return d;
00081   };
00082 
00083   double subproblem::value(cons c) {
00084     // TODO as_what. default?
00085     return SCIProwGetDualsol(((Basic_Constraint_Data*) c.cons_pointer()->DATA)->rowp);
00086   }
00087 
00088   bool subproblem::found_constraint() {
00089     return SCIPgetLPSolstat((SCIP*) Subproblem_Data)!=SCIP_LPSOLSTAT_OPTIMAL;
00090   };
00091 
00092   double subproblem::get_obj_value() {
00093     return SCIPgetLPObjval((SCIP*) Subproblem_Data);
00094   };
00095 
00096   subproblem::~subproblem() {
00097   };
00098 
00099   void subproblem::save_solution(solution& s) {
00100     SOL* sol;
00101     CHECK_ABORT( SCIPcreateSol((SCIP*) Subproblem_Data, &sol, NULL) );
00102     
00103     var v;
00104     forall_variables(v, *this) {
00105       CHECK_ABORT( SCIPsetSolVal((SCIP*) Subproblem_Data, sol, 
00106         ((Variable_Data*) v.var_pointer()->DATA)->varP, s.value(v)) );
00107     };
00108 
00109     Bool stored;
00110     CHECK_ABORT( SCIPaddSolFree((SCIP*) Subproblem_Data, &sol, &stored) );
00111   };
00112 
00113   void subproblem::add_sym_constraint(sym_constraint* c) {
00114     ((ILP_Problem_Data*) ILP->DATA)->sconshdlr->addCons((SCIP*) Subproblem_Data, c);
00115   };
00116 
00117   double subproblem::get_solution(var v) {
00118     SOL* sol=SCIPgetBestSol((SCIP*) Subproblem_Data);
00119     if(sol==NULL) return 0;
00120     return SCIPgetSolVal((SCIP*) Subproblem_Data, sol, ((Variable_Data*) v.var_pointer()->DATA)->varP);
00121   };
00122 
00123   double subproblem::get_solution(row& r) {
00124     row_entry re;
00125     double d=0;
00126     forall(re, r) d+=re.Coeff*get_solution(re.Var);
00127     return d;
00128   };
00129 
00130   subproblem::var_item subproblem::first_variable_item() {
00131     if(SCIPgetNOrigVars((SCIP*) Subproblem_Data)==0) return no_var;
00132     return 0;
00133   };
00134 
00135   subproblem::var_item subproblem::next_variable_item(subproblem::var_item vi) {
00136     if(vi>=SCIPgetNOrigVars((SCIP*) Subproblem_Data)-1) return no_var;
00137     return vi+1;
00138   };
00139 
00140   var subproblem::get_variable(subproblem::var_item vi) {
00141     return ((ILP_Problem_Data*) ILP->DATA)->VM[vi];
00142   };
00143 
00144   subproblem::sc_item subproblem::first_sym_constraint_item() {
00145     if(SCIPconshdlrGetNConss(((ILP_Problem_Data*) ILP->DATA)->conshdlr)==0) 
00146       return no_sym_cons;
00147     return 0;
00148   };
00149 
00150   subproblem::sc_item subproblem::next_sym_constraint_item(subproblem::sc_item si) {
00151     if(si>=SCIPconshdlrGetNConss(((ILP_Problem_Data*) ILP->DATA)->conshdlr)-1) 
00152       return no_sym_cons;
00153     return si+1;
00154   };
00155 
00156   sym_constraint* subproblem::get_sym_constraint(subproblem::sc_item si) {
00157     if(si==no_sym_cons) return NULL;
00158     CONSDATA* consdata;
00159     CONS* con;
00160     con=SCIPconshdlrGetConss(((ILP_Problem_Data*) ILP->DATA)->conshdlr)[si];
00161     consdata=SCIPconsGetData(con);
00162     return consdata->sc;
00163   };
00164 
00165   //TODO lower_bound, upper_bound, red_cost
00166 
00167   //TODO Configurations
00168 };

Generated on Tue Nov 16 15:18:22 2004 for SCIL by doxygen1.2.16