void pdbm_diagonalExtrapolateLUBounds( PDBM &pdbm, cindex_t dim, int32_t *lower, int32_t *upper) { assert(pdbm && dim); int32_t *rates = pdbm_rates(pdbm); for (uint32_t i = 1; i < dim; i++) { // if (rates[i] < 0) // { // lower[i] = dbm_INFINITY; // } // else if (rates[i] > 0) // { // upper[i] = dbm_INFINITY; // } if (rates[i] != 0) { lower[i] = dbm_INFINITY; upper[i] = dbm_INFINITY; } } pdbm_prepare(pdbm, dim); dbm_diagonalExtrapolateLUBounds(pdbm_matrix(pdbm), dim, lower, upper); }
/* test the 4 extrapolations */ static void test(uint32_t size) { ADBM(dbm1); ADBM(dbm2); ADBM(dbm3); ADBM(dbm4); ADBM(dbm5); ADBM(dbm6); ADBM(dbm7); ADBM(dbm8); ADBM(dbm9); ADBM(dbm10); AVECT(lower); AVECT(upper); AVECT(max); uint32_t k, l; printf("*** Testing size=%u\n", size); for (k = 0; k < 2000; ++k) { PROGRESS(); max[0] = lower[0] = upper[0] = 0; for (l = 1; l < size; l++) { int32_t low = RANGE() - (MAXRANGE / 2); int32_t up = RANGE() - (MAXRANGE / 2); /* low + RANGE()/2; */ lower[l] = (low < 0 ? -dbm_INFINITY : low); upper[l] = (up < 0 ? -dbm_INFINITY : up); max[l] = (lower[l] < upper[l] ? upper[l] : lower[l]); } DBM_GEN(dbm1); dbm_copy(dbm10, dbm1, size); dbm_copy(dbm9, dbm1, size); dbm_copy(dbm8, dbm1, size); dbm_copy(dbm7, dbm1, size); dbm_copy(dbm6, dbm1, size); dbm_copy(dbm5, dbm1, size); dbm_copy(dbm4, dbm1, size); dbm_copy(dbm3, dbm1, size); dbm_copy(dbm2, dbm1, size); assert(dbm_isClosed(dbm1, size)); dbm_extrapolateMaxBounds(dbm2, size, max); dbm_extrapolateLUBounds(dbm3, size, max, max); dbm_extrapolateLUBounds(dbm4, size, lower, upper); dbm_diagonalExtrapolateMaxBounds(dbm5, size, max); test_diagonalExtrapolateMaxBounds(dbm8, size, max); dbm_diagonalExtrapolateLUBounds(dbm6, size, max, max); test_diagonalExtrapolateLUBounds(dbm9, size, max, max); dbm_diagonalExtrapolateLUBounds(dbm7, size, lower, upper); test_diagonalExtrapolateLUBounds(dbm10, size, lower, upper); assert(dbm_areEqual(dbm5, dbm8, size)); assert(dbm_areEqual(dbm6, dbm9, size)); assert(dbm_areEqual(dbm7, dbm10, size)); /* 1 <= 2 == 3 <= 4 <= 7, 1 <= 2 == 3 <= 5 == 6 <= 7 */ assert(dbm_relation(dbm1, dbm2, size) & base_SUBSET); assert(dbm_relation(dbm2, dbm3, size) == base_EQUAL); assert(dbm_relation(dbm3, dbm4, size) & base_SUBSET); assert(dbm_relation(dbm4, dbm7, size) & base_SUBSET); assert(dbm_relation(dbm3, dbm5, size) & base_SUBSET); assert(dbm_relation(dbm5, dbm6, size) == base_EQUAL); assert(dbm_relation(dbm6, dbm7, size) & base_SUBSET); /* further checks */ assert(dbm_isValid(dbm2, size)); assert(dbm_isValid(dbm3, size)); assert(dbm_isValid(dbm4, size)); assert(dbm_isValid(dbm5, size)); assert(dbm_isValid(dbm6, size)); assert(dbm_isValid(dbm7, size)); } ENDL; free(lower); free(upper); free(max); free(dbm10); free(dbm9); free(dbm8); free(dbm7); free(dbm6); free(dbm5); free(dbm4); free(dbm3); free(dbm2); free(dbm1); }
void Clocks::extrapolate() { dbm_diagonalExtrapolateLUBounds( data, dim, &bounds[ 0 ], &bounds[ dim ] ); }