Hi,

I think that the patches for scheduling.cc and taskintervals.cc are safe enough to include in 1.3.2, too. They just change the type of some intermediate-result variables from 'int' to 'long long' (reason for this is that the ints overflow in some cases, causing the propagators to fail when they shouldn't).

Cheers,
Filip

Index: platform/emulator/libfd/taskintervals.cc
===================================================================
RCS file: /services/mozart/CVS/mozart/platform/emulator/libfd/taskintervals.cc,v
retrieving revision 1.30
diff -u -r1.30 taskintervals.cc
--- platform/emulator/libfd/taskintervals.cc    4 Feb 2002 20:23:09 -0000       
1.30
+++ platform/emulator/libfd/taskintervals.cc    15 Apr 2006 10:10:48 -0000
@@ -556,14 +556,15 @@
 //-----------------------------------------------------------------------------
 
 struct Interval {
-  int left, right, use;
+  int left, right;
+  long long use;
 };
 
 
 class Order_StartDurUseTerms_By_CompareDursUse {
 public:
   Bool operator()(const StartDurUseTerms& a, const StartDurUseTerms& b) {
-    return a.dur * a.use > b.dur * b.use;
+    return ((long long)a.dur) * a.use > ((long long)b.dur) * b.use;
   }
 };
 
@@ -687,7 +688,7 @@
   int &ts      = reg_sz;
   int * dur    = reg_offset;
   int * use    = reg_use;
-  int capacity = reg_capacity;
+  long long capacity = reg_capacity;
 
   // if we have no tasks the prop returns trivially true
   if (ts == 0) return PROCEED;
@@ -722,7 +723,7 @@
   }
 
   int set0Size;
- int compSet0Size;
+  int compSet0Size;
   int outSideSize;
   int mysup = OZ_getFDSup();
   
@@ -733,7 +734,8 @@
 
 
   struct TISet {
-    int low, up, dur, size, min, max, empty, ect, lst, overlap;
+    int low, up, dur, min, max, empty, ect, lst;
+    long long size, overlap;
     // extension for tasks inside task intervals
   };
 
@@ -772,11 +774,11 @@
       cset->min        = MinMax[right].min;
 
       int cdur = 0;
-      int csize = 0;
+      long long csize = 0;
       int empty = 1;
       int clst = 0;
       int cect = OZ_getFDSup();
-      int overlap=0;
+      long long overlap=0;
       if ( (cset->low <= MinMax[right].min)
           && (MinMax[left].max + dur[left] <= cset->up)
           ) 
@@ -790,7 +792,7 @@
                 && (dueL <= cset->up) ) {
              empty = 0;
              cdur += durL;
-             csize += use[l]*durL;
+             csize += use[l]*((long long)durL);
              clst = intMax(clst, dueL-durL);
              cect = intMin(cect, releaseL+durL);
 
@@ -802,7 +804,7 @@
            }
            else {
              // add the overlapping amount of tasks
-             int overlapTmp = intMin(intMax(0,releaseL+durL-cset->low),
+             long long overlapTmp = intMin(intMax(0,releaseL+durL-cset->low),
                                      intMin(intMax(0,cset->up-dueL+durL),
                                             intMin(durL,cset->up-cset->low)));
              overlap += overlapTmp*use[l];
@@ -842,13 +844,13 @@
          int useI     = use[i];
          int releaseI = MinMax[i].min;
          int dueI     = maxI + durI;
-         int sizeAll, tsizeTI, treleaseTI, tdueTI;
+         long long sizeAll, tsizeTI, treleaseTI, tdueTI;
          int contained = 0;
          if ( (releaseI >= releaseTI) && (dueI <= dueTI) ) {
            // I is in TI
            contained = 1;
            sizeAll = sizeTI;
-           tsizeTI = sizeTI - durI*useI; 
+           tsizeTI = sizeTI - ((long long)durI)*useI; 
            if (i==left) {
              treleaseTI = cset->min;
              tdueTI = dueTI;
@@ -869,14 +871,14 @@
            treleaseTI = releaseTI;
            tdueTI     = dueTI;
            tsizeTI     = sizeTI;
-           sizeAll     = durI*useI + sizeTI;
+           sizeAll     = ((long long)durI)*useI + sizeTI;
          }
 
          int overlapI = intMin(intMax(0,releaseI+durI-treleaseTI),
                                intMin(intMax(0,tdueTI-dueI+durI),
                                       intMin(durI,tdueTI-treleaseTI)))*use[i];
-         int OS = sizeAll;
-         int OT = tsizeTI;
+         long long OS = sizeAll;
+         long long OT = tsizeTI;
 
 
          // if task i is contained, this does not work!
@@ -888,7 +890,7 @@
 
          if ( ((tdueTI - treleaseTI) * capacity < sizeAll) &&
               ((dueI - treleaseTI) * capacity < sizeAll) ) {
-           int delta = tsizeTI - (tdueTI - treleaseTI) * (capacity - useI);
+           long long delta = tsizeTI - (tdueTI - treleaseTI) * (capacity - 
useI);
            if (delta > 0) {
              // l must be first
              int val = tdueTI - (int) ceil((double) delta / (double) useI);
@@ -914,7 +916,7 @@
            int delta = tsizeTI - (tdueTI - treleaseTI) * (capacity - useI);
            if (delta > 0) {
              // l must be last
-             int val = treleaseTI + (int) ceil((double) delta / (double) useI);
+             long long val = treleaseTI + (int) ceil((double) delta / (double) 
useI);
              if (releaseI < val) {
                tiFlag = 1;
                FailOnEmpty(*x[i] >= val);
@@ -984,11 +986,11 @@
     //////////
     int min_left = mysup;
     int max_right = 0;
-    int sum = 0;
+    long long sum = 0;
     for (i=0; i<ts; i++) {
       int iMin = MinMax[i].min;
       int iDue = MinMax[i].max + dur[i];
-      sum = sum + use[i] * dur[i];
+      sum = sum + use[i] * ((long long)dur[i]);
       if (iMin < min_left) min_left = iMin;
       if (iDue > max_right) max_right = iDue;
     }
@@ -1087,7 +1089,7 @@
       int dur_i = dur[i];
       for (j=0; j<exclusion_nb; j++) {
        Interval Exclusion = ExclusionIntervals[j];
-       int span = Exclusion.right - Exclusion.left;
+       long long span = Exclusion.right - Exclusion.left;
        if (Exclusion.use + span * use_i > span * capacity) {
          int left = Exclusion.left;
          int right = Exclusion.right;
Index: platform/emulator/libfd/scheduling.cc
===================================================================
RCS file: /services/mozart/CVS/mozart/platform/emulator/libfd/scheduling.cc,v
retrieving revision 1.42.10.1
diff -u -r1.42.10.1 scheduling.cc
--- platform/emulator/libfd/scheduling.cc       30 Jan 2005 10:42:35 -0000      
1.42.10.1
+++ platform/emulator/libfd/scheduling.cc       15 Apr 2006 10:10:44 -0000
@@ -148,13 +148,14 @@
 
 //
 struct Interval {
-  int left, right, use;
+  int left, right;
+  long long use;
 };
 // for cpIterateCap
 struct StartDurUseTerms {
   OZ_Term start;
   int dur;
-  int use;
+  long long use;
 };
 
 //
@@ -1009,7 +1010,8 @@
 
 
 struct Set2 {
-  int dSi, sUp, sLow, extSize, overlap;
+  long long dSi, overlap;
+  int sUp, sLow, extSize;
   int * ext;
 };
 
@@ -1030,7 +1032,7 @@
   int &ts      = reg_sz;
   int * dur    = reg_offset;
   int * use    = reg_use;
-  int capacity = reg_capacity;
+  long long capacity = reg_capacity;
 
   // if we have no tasks the prop returns trivially true
   if (ts == 0) return PROCEED;
@@ -1143,16 +1145,16 @@
 
     kUp = MinMax[upTask].max + dur[upTask];
     kDown = MinMax[upTask].min;
-    int use0 = 0;
+    long long use0 = 0;
     set0Size = 0;
     compSet0Size = 0;
     outSideSize = 0;
-    int overlap=0;
+    long long overlap=0;
 
     // compute set S0 
     int l;
     for (l=0; l<ts; l++) {
-      int dl = dur[l];
+      long long dl = dur[l];
       int xlMin = MinMax[l].min;
       int xlMaxDL = MinMax[l].max + dl;
       if (( kDown <= xlMin) && ( xlMaxDL <= kUp)) {
@@ -1161,7 +1163,7 @@
       }
       else {
        // overlaps for failure reasoning only
-       int overlapTmp = intMin(intMax(0,xlMin+dl-kDown),
+       long long overlapTmp = intMin(intMax(0,xlMin+dl-kDown),
                                intMin(intMax(0,kUp-xlMaxDL+dl),
                                       intMin(dl,kUp-kDown)));
        overlap += overlapTmp*use[l];
@@ -1213,7 +1215,7 @@
       if (MinMax[realL].max+dur[realL] <= kUp) {
        struct Set2 *bset = &Sets[setSize];     
        setSize++;
-       int dSi = bset->dSi + dur[realL]*use[realL];
+       long long dSi = bset->dSi + ((long long)dur[realL])*use[realL];
        int minL = MinMax[realL].min;
        if ( (kUp - minL)*capacity < dSi) {
          goto failure;
@@ -1238,10 +1240,10 @@
       struct Set2 *s = &Sets[setCount];
       int minL = MinMax[l].min;
       int maxL = MinMax[l].max;
-      int durL = dur[l];
+      long long durL = dur[l];
       int useL = use[l];
 
-      int sizeAll = s->dSi + durL*useL;
+      long long sizeAll = s->dSi + durL*useL;
 
       if (maxL+durL > s->sUp) {
        if ( (s->sUp - s->sLow)*capacity >= sizeAll) {
@@ -1262,7 +1264,7 @@
            lCount++;
          }
          else {
-           int rest = s->dSi - (s->sUp - s->sLow)*(capacity - useL);
+           long long rest = s->dSi - (s->sUp - s->sLow)*(capacity - useL);
            if (rest > 0) {
              // l must be last
              int val = s->sLow + (int) ceil((double) rest / (double) useL);
@@ -1309,18 +1311,18 @@
     
     kUp = MinMax[downTask].max + dur[downTask];
     kDown = MinMax[downTask].min;
-    int use0 = 0;
+    long long use0 = 0;
     set0Size = 0;
     compSet0Size = 0;
     outSideSize = 0;
-    int overlap=0;
+    long long overlap=0;
 
     //////////
     // compute set S0 
     //////////
     int l;
     for (l=0; l<ts; l++) {
-      int dl = dur[l];
+      long long dl = dur[l];
       int xlMin = MinMax[l].min;
       int xlMaxDL = MinMax[l].max + dl;
       if (( kDown <= xlMin) && ( xlMaxDL <= kUp)) {
@@ -1328,7 +1330,7 @@
        set0[set0Size++] = l;
       }
       else {
-       int overlapTmp = intMin(intMax(0,xlMin+dl-kDown),
+       long long overlapTmp = intMin(intMax(0,xlMin+dl-kDown),
                                intMin(intMax(0,kUp-xlMaxDL+dl),
                                       intMin(dl,kUp-kDown)));
        overlap += overlapTmp*use[l];
@@ -1379,10 +1381,10 @@
        if (MinMax[realL].min >= kDown) {
          int setSizeBefore = setSize;  
          struct Set2 *bset = &Sets[setSizeBefore];     
-         int durL = dur[realL];
+         long long durL = dur[realL];
          setSize++;
-         int dSi = bset->dSi + durL*use[realL];
-         int maxL = MinMax[realL].max+durL;
+         long long dSi = bset->dSi + durL*use[realL];
+         long long maxL = MinMax[realL].max+durL;
          if ( (maxL - kDown)*capacity < dSi)
            {
              goto failure;
@@ -1408,9 +1410,9 @@
       struct Set2 *s = &Sets[setCount];
       int minL = MinMax[l].min;
       int maxL = MinMax[l].max;
-      int durL = dur[l];
+      long long durL = dur[l];
       int useL = use[l];
-      int sizeAll = s->dSi + durL*useL;
+      long long sizeAll = s->dSi + durL*useL;
       
 
       if (minL < s->sLow) {
@@ -1432,7 +1434,7 @@
            lCount++;
          }
          else {
-           int rest = s->dSi - (s->sUp - s->sLow)*(capacity - useL);
+           long long rest = s->dSi - (s->sUp - s->sLow)*(capacity - useL);
            if (rest > 0) {
              int val = s->sUp - (int) ceil( (double) rest / (double) useL);
              // l must be first
@@ -1542,11 +1544,11 @@
     //////////
     int min_left = mysup;
     int max_right = 0;
-    int sum = 0;
+    long long sum = 0;
     for (i=0; i<ts; i++) {
       int iMin = MinMax[i].min;
       int iDue = MinMax[i].max + dur[i];
-      sum = sum + use[i] * dur[i];
+      sum = sum + use[i] * ((long long)dur[i]);
       if (iMin < min_left) min_left = iMin;
       if (iDue > max_right) max_right = iDue;
     }
@@ -1594,8 +1596,8 @@
       while ((right_pt < double_nb) && (IntervalBounds[right_pt] == left_val))
        right_pt++;
       if (right_pt == double_nb)  break;
-      int right_val = IntervalBounds[right_pt];
-      int cum = 0;
+      long long right_val = IntervalBounds[right_pt];
+      long long cum = 0;
 
       for (i=low_counter; i<interval_nb; i++) {
 
@@ -1630,10 +1632,10 @@
       int lst = MinMax[i].max;
       int ect = MinMax[i].min + dur[i];
       int use_i = use[i];
-      int dur_i = dur[i];
+      long long dur_i = dur[i];
       for (j=0; j<exclusion_nb; j++) {
        Interval Exclusion = ExclusionIntervals[j];
-       int span = Exclusion.right - Exclusion.left;
+       long long span = Exclusion.right - Exclusion.left;
        if (Exclusion.use + span * use_i > span * capacity) {
          int left = Exclusion.left;
          int right = Exclusion.right;
@@ -1810,7 +1812,7 @@
   int &ts      = reg_sz;
   int * dur    = reg_offset;
   int * use    = reg_use;
-  int capacity = reg_capacity;
+  long long capacity = reg_capacity;
 
   // if we have no tasks the prop returns trivially true
   if (ts == 0) return PROCEED;
@@ -1895,7 +1897,7 @@
       if (right_pt == double_nb)  break;
       int right_val = IntervalBounds[right_pt];
       // cum is the amount of possible usage
-      int cum = 0;
+      long long cum = 0;
       for (i=low_counter; i<interval_nb; i++) {
        int leftInt = Intervals[i].left;
        int rightInt = Intervals[i].right;
@@ -1923,7 +1925,7 @@
       int dur_i = dur[i];
       for (j=0; j<inclusion_nb; j++) {
        Interval Inclusion = InclusionIntervals[j];
-       int span = Inclusion.right - Inclusion.left;
+       long long span = Inclusion.right - Inclusion.left;
        if (Inclusion.use - span * use_i < span * capacity) {
          int left = Inclusion.left;
          int right = Inclusion.right;
_________________________________________________________________________________
mozart-hackers mailing list                           
[email protected]      
http://www.mozart-oz.org/mailman/listinfo/mozart-hackers

Reply via email to