00001
00002
00003
00004
00005
00006
00007
00008 #ifndef RELAX_H
00009 #define RELAX_H
00010
00011 #include "standard.h"
00012 #include "param.h"
00013 #include "func.h"
00014 #include "problem.h"
00015 #include "opt.h"
00016 #include "decomp.h"
00017 #include "sampling.h"
00018
00019
00033 class Convexify {
00034 private:
00035 Pointer<Param> param;
00036
00038 Sampling sampling;
00039 vector<vector<dvector> > sample_set;
00040
00041 Decomposition decomp;
00042
00043 double very_large, cgu_eps;
00044
00047 pair<Pointer<UserVector<double> >, Pointer<UserVector<double> > > convexify_a;
00050 pair<Pointer<UserVector<double> >, Pointer<UserVector<double> > > convexify_b;
00051
00054 vector<bool> convexified_by_cgu;
00055
00060 void convexify_cgu(SepQcFunc& f, int k);
00067 pair<double, double> convexify_alpha(SepQcFunc& f, int k, const dvector& low, const dvector& up, Pointer<set<int> > i_quad, Pointer<set<int> > i_nonquadlin);
00068 pair<double, double> convexify_alpha(SepQcFunc& f, int k, const dvector& low, const dvector& up);
00069 pair<double, double> convexify_alpha2(SepQcFunc& f, int k, const dvector& low, const dvector& up);
00070 public:
00073 vector<pair<double, double> > convexify_c;
00074
00078 map<int, double> characteristica1, characteristica2;
00079
00080 Convexify(Pointer<Param> param_)
00081 : param(param_), sampling(param_, "Convexify"), decomp(param)
00082 { very_large=param->get_d("Relax very large", 1E+99);
00083 cgu_eps=param->get_d("Relax CGU epsilon", 0.);
00084 }
00085
00091 void new_sampleset(UserVector<double>& lower, UserVector<double>& upper, SepQcFunc& f);
00092
00103 double convexify(SepQcFunc& f, bool eq, vector<double>& min_eigval, vector<double>& max_eigval, UserVector<double>& lower, UserVector<double>& upper);
00104
00109 void get_decomposed_functions(pair<Pointer<SepQcFunc>, Pointer<SepQcFunc> >& f);
00110
00111 void check_convex2(vector<double>& min_eigval, vector<double>& max_eigval, SepQcFunc& f, const vector<vector<dvector> >& sample_set);
00112
00120 void check_convexification(MinlpProblem& conv_prob, MinlpProblem& orig_prob, const ivector& ineq_index, int test_pts=20);
00121 };
00122
00123 #endif