00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "cpsp/gecode/GC_ValNearCenter.hh"
00021
00022 #include <gecode/iter.hh>
00023
00024 namespace cpsp
00025 {
00026 namespace gecode
00027 {
00028
00029
00030 const biu::LatticeFrame* GC_ValNearCenter::latFrame = NULL;
00031
00032 int
00033 GC_ValNearCenter::val(const Gecode::Space* home, Gecode::Int::IntView x) const
00034 {
00035 using namespace Gecode::Int;
00036 using namespace Gecode::Iter::Ranges;
00037
00038 int retVal = x.min();
00039
00040
00041 ToValues< ViewRanges< IntView > > it;
00042 ViewRanges< IntView > r(x);
00043 it.init( r );
00044
00045
00046 biu::IntPoint center = latFrame->getCenter();
00047 double actDist = DBL_MAX, minDist = actDist;
00048
00049 unsigned int c = 0;
00050 while ( it() ) {
00051 c++;
00052
00053 actDist = latFrame->getPoint(it.val()).distance(center);
00054
00055 if (actDist < minDist) {
00056 minDist = actDist;
00057 retVal = it.val();
00058 }
00059
00060 ++it;
00061 }
00062 assert(c == x.size());
00063
00064 return retVal;
00065 }
00066
00067 Gecode::ModEvent
00068 GC_ValNearCenter::tell( Gecode::Space* home, unsigned int a,
00069 Gecode::Int::IntView x, int n)
00070 {
00071 assert((a == 0) || (a == 1));
00072 return (a == 0) ? x.eq(home,n) : x.nq(home,n);
00073 }
00074
00075 }
00076 }