Code freeze for Mozart 1.3.2

Filip Konvička filip.konvicka.removethisantispamtoken at logis.cz
Fri Jun 2 08:54:25 CEST 2006


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

-------------- next part --------------
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;
-------------- next part --------------
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;


More information about the mozart-hackers mailing list