00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00028 #include <coconut_config.h>
00029 #include <search_node.h>
00030 #include <dbtools.h>
00031 #include <int_evaluator.h>
00032
00033 namespace coco {
00034
00035 bool point_check_feasibility::operator() () const
00036 {
00037 typedef expression_walker nodeptr;
00038 const std::vector<double>* x;
00039 const double* f;
00040
00041 bool error;
00042 const vdbl::col& _ca(_r->get_col(x_ci, error));
00043 if(error) return false;
00044 _ca.get_ptr(x);
00045
00046 const vdbl::col& _cb(_r->get_col(f_ci, error));
00047 if(error) return false;
00048 _cb.get_ptr(f);
00049
00050 const work_node *wn = wnc->wn();
00051 const model* __mod = wn->get_model_ptr();
00052
00053
00054
00055 if(__mod->number_of_variables() > (*x).size())
00056 return false;
00057 variable_indicator v_i(__mod->number_of_variables());
00058 v_i.set(0, __mod->number_of_variables());
00059
00060 std::vector<interval> xi;
00061 std::copy((*x).begin(), (*x).end(), std::back_inserter(xi));
00062 interval fi;
00063 interval_eval ie(xi, v_i, *__mod, NULL, false);
00064
00065 std::vector<nodeptr>::const_iterator __b, __e(__mod->constraints.end());
00066 for(__b = __mod->constraints.begin(); __b != __e; ++__b)
00067 {
00068 fi = evaluate(ie, (model::const_walker) *__b);
00069 if(!fi.subset((*__b)->f_bounds))
00070 return false;
00071 }
00072 return true;
00073 }
00074
00075 bool box_check_intersection::operator() () const
00076 {
00077 typedef expression_walker nodeptr;
00078 const std::vector<interval>* x;
00079
00080 bool error;
00081 const vdbl::col& _ca(_r->get_col(x_ci, error));
00082 if(error) return false;
00083 _ca.get_ptr(x);
00084
00085 const work_node *wn = wnc->wn();
00086 const model* __mod = wn->get_model_ptr();
00087 const std::vector<interval>& ranges(wn->node_ranges);
00088
00089 unsigned int e(x->size());
00090 for(unsigned int i = 0; i < e; ++i)
00091 {
00092 if((*x)[i].disjoint(ranges[__mod->var(i)->node_num]))
00093 return false;
00094 }
00095 return true;
00096 }
00097
00098 }