00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include "FirstFailValueHeuristic.hh"
00025 
00026 int** FirstFailValue::subSet(Implicative* home,int var,int* nbRanges) {
00027     switch (home->type_of_v[var]) {
00028         case VTYPE_INT : {
00029             IntVar* curVar = getIntVar(home,whichSpaceOwns(home,var),var);
00030             for (int scope=whichSpaceOwns(home,var)+1;scope<nbSpaces(home);scope++) {
00031                 if (!scopeDefined(home,scope)) {
00032                     int zeValue = getIntVar(home,whichSpaceOwns(home,var),var)->min();
00033                     *nbRanges = 1;
00034                     int** ret = new int*[2];
00035                     ret[0]=new int[1];
00036                     ret[1]=new int[1];
00037                     ret[0][0]=zeValue;
00038                     ret[1][0]=zeValue;
00039                     return ret;
00040                 }
00041                 
00042                 IntVarValues it(*curVar);
00043                 for (;it();++it) {
00044                     int val = it.val();
00045                     if (!getIntVar(home,scope,var)->in(val)) {
00046                         int zeValue = val;
00047                         *nbRanges = 1;
00048                         int** ret = new int*[2];
00049                         ret[0]=new int[1];
00050                         ret[1]=new int[1];
00051                         ret[0][0]=zeValue;
00052                         ret[1][0]=zeValue;
00053                         return ret;
00054                     }
00055                 }
00056             }
00057             
00058             int zeValue = getIntVar(home,whichSpaceOwns(home,var),var)->min();
00059             *nbRanges = 1;
00060             int** ret = new int*[2];
00061             ret[0]=new int[1];
00062             ret[1]=new int[1];
00063             ret[0][0]=zeValue;
00064             ret[1][0]=zeValue;
00065             return ret;
00066         }
00067             break;
00068         case VTYPE_BOOL: {
00069             int zeValue = getBoolVar(home,whichSpaceOwns(home,var),var)->min();
00070             *nbRanges = 1;
00071             int** ret = new int*[2];
00072             ret[0]=new int[1];
00073             ret[1]=new int[1];
00074             ret[0][0]=zeValue;
00075             ret[1][0]=zeValue;
00076             return ret;
00077         }
00078     break;
00079             
00080     }
00081 }
00082