예제 #1
0
파일: priced.cpp 프로젝트: osankur/udbml
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);
}
예제 #2
0
/* 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);
}
예제 #3
0
void Clocks::extrapolate() {
   dbm_diagonalExtrapolateLUBounds( data, dim, &bounds[ 0 ], &bounds[ dim ] );
}