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 , a==Static ? false : true ));
00052 row r;
00053 co->non_zero_entries(r);
00054 row_entry re;
00055 forall(re, r) {
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
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
00166
00167
00168 };