예제 #1
0
파일: piplib-wrapper.c 프로젝트: Ced/candl
/**
 * pip_matrix2relation function :
 * This function is used to keep the compatibility with Piplib
 */
osl_relation_p pip_matrix2relation(PipMatrix* in) {
  int i, j, precision;
  osl_relation_p out;
  osl_int_t temp;
  
  if (in == NULL)
    return NULL;
  
  #if defined(CANDL_LINEAR_VALUE_IS_INT)
    precision = OSL_PRECISION_SP;
  #elif defined(CANDL_LINEAR_VALUE_IS_LONGLONG)
    precision = OSL_PRECISION_DP;
  #elif defined(CANDL_LINEAR_VALUE_IS_MP)
    precision = OSL_PRECISION_MP;
  #endif
  
  out = osl_relation_pmalloc(precision, in->NbRows, in->NbColumns);
  osl_int_init(precision, &temp);

  for (i = 0 ; i < in->NbRows ; i++) {
    for (j = 0 ; j < in->NbColumns ; j++) {
      #ifdef CANDL_LINEAR_VALUE_IS_INT
        temp.sp = in->p[i][j];
      #elif defined(CANDL_LINEAR_VALUE_IS_LONGLONG)
        temp.dp = in->p[i][j];
      #elif defined(CANDL_LINEAR_VALUE_IS_MP)
        mpz_set(*((mpz_t*)temp.mp), in->p[i][j]);
      #endif
      osl_int_assign(precision, &out->m[i][j], temp);
    }
  }
  
  osl_int_clear(precision, &temp);
  return out;
}
예제 #2
0
파일: relation.c 프로젝트: periscop/clay
void clay_relation_substitute(osl_relation_p relation,
                              int original_col,
                              int target_col,
                              int factor) {
  int row;
  osl_int_t tmp;

  // Do not allow substituting e/i flag or the constant and
  // do not allow substituting by e/i flag (but allow by constant).
  if (original_col <= 0 || original_col > relation->nb_columns - 1 ||
      target_col <= 0 || target_col > relation->nb_columns)
    return;

  osl_int_init(relation->precision, &tmp);
  for (row = 0; row < relation->nb_rows; row++) {
    if (osl_int_zero(relation->precision, relation->m[row][original_col])) {
      continue;
    }
    osl_int_mul_si(relation->precision, &tmp, relation->m[row][original_col],
                   factor);
    osl_int_add(relation->precision, &relation->m[row][target_col],
                relation->m[row][target_col], tmp);
  }

  osl_int_clear(relation->precision, &tmp);
}
예제 #3
0
파일: relation.c 프로젝트: periscop/clay
void clay_relation_normalize_alpha(osl_relation_p relation) {
  int row, col;
  osl_int_t gcd;

  osl_int_init(relation->precision, &gcd);

  // Normalize equalities.
  clay_relation_output_form(relation);

  // Normalize inequalities.
  for (row = 0; row < relation->nb_rows; row++) {
    if (osl_int_zero(relation->precision, relation->m[row][0])) {
      continue; // ignore equalities
    }
    gcd = clay_relation_line_gcd(relation, row, 1, relation->nb_columns);
    for (col = 1; col < relation->nb_columns; col++) {
      if (col >= 1 && col < relation->nb_output_dims + 1 && (col % 2) == 1) {
        continue; // ignore beta dimensions
      }
      osl_int_div_exact(relation->precision, &relation->m[row][col],
                        relation->m[row][col], gcd);
    }
  }

  clay_relation_sort_rows(relation);

  osl_int_clear(relation->precision, &gcd);
}
예제 #4
0
파일: relation.c 프로젝트: periscop/clay
// aware of beta structure
osl_int_t clay_relation_line_gcd(osl_relation_p relation, int line, int column_start, int column_end) {
  osl_int_t gcd, tmp;
  int i;
  int gcd_assigned = 0;

  osl_int_init(relation->precision, &gcd);
  osl_int_init(relation->precision, &tmp);

  if (column_end - column_start < 1 ||
      column_start >= relation->nb_columns ||
      column_end > relation->nb_columns) {
    osl_int_set_si(relation->precision, &gcd, 0);
    return gcd;
  } else if (column_end - column_start == 1) {
    osl_int_assign(relation->precision, &gcd, relation->m[line][column_start]);
    return gcd;
  }

  for (i = column_start; i < column_end; i++) {
    if (i >= 1 && i < relation->nb_output_dims + 1 && (i % 2) == 1) {
      continue; // ignore betas
    }
    if (osl_int_zero(relation->precision, relation->m[line][i])) {
      continue; // ignore zeros
    }
    osl_int_abs(relation->precision, &tmp, relation->m[line][i]);

    if (!gcd_assigned) {
      osl_int_assign(relation->precision, &gcd, tmp);
      gcd_assigned = 1;
    } else {
      osl_int_gcd(relation->precision, &gcd, gcd, tmp);
    }
  }

  if (!gcd_assigned) { // if gcd zero or not found, default to 1.
    osl_int_set_si(relation->precision, &gcd, 1);
  }

  osl_int_clear(relation->precision, &tmp);
  return gcd;
}
예제 #5
0
파일: relation.c 프로젝트: periscop/clay
// assumes beta-structure; depth 1-based
// TODO: do not return, possible leak
osl_int_t clay_relation_gcd(osl_relation_p relation, int depth) {
  osl_int_t gcd;
  int row, col;
  int gcd_assigned = 0;
  int column = 2*depth;

  osl_int_init(relation->precision, &gcd);
  if (depth < -1 || depth == 0 || depth > relation->nb_output_dims / 2) {
  CLAY_debug("Called clay_relation_gcd with column outside bounds");
    osl_int_set_si(relation->precision, &gcd, 0);
    return gcd;
  }

  for (row = 0; row < relation->nb_rows; row++) {
    if (depth != -1 && osl_int_zero(relation->precision, relation->m[row][column])) {
      continue;
    }

    for (col = 2; col < relation->nb_columns; col++) {
      // if beta, ignore
      if (col >= 1 && col < relation->nb_output_dims + 1 && (col % 2) == 1) {
        continue;
      }
      if (col == column) {
        continue;
      }
      if (gcd_assigned) {
        osl_int_gcd(relation->precision, &gcd, gcd, relation->m[row][col]);
      } else {
        if (!osl_int_zero(relation->precision, relation->m[row][col])) {
          osl_int_assign(relation->precision, &gcd, relation->m[row][col]);
          gcd_assigned = 1;
        }
      }
    }
  }
  return gcd;
}
예제 #6
0
int main(int argc, char** argv)
{
  if (argc > 1) { printf("argv are ignored\n"); }
  
  unsigned int nb_fail = 0;
  
  #ifdef OSL_GMP_IS_HERE
  
  int i;
  for (i = SCHAR_MIN; i <= SCHAR_MAX; ++i) {
    osl_int_t a_sp; osl_int_init_set_si(OSL_PRECISION_SP, &a_sp, i);
    osl_int_t a_dp; osl_int_init_set_si(OSL_PRECISION_DP, &a_dp, i);
    osl_int_t a_mp; osl_int_init_set_si(OSL_PRECISION_MP, &a_mp, i);
    
    int j;
    for (j = SCHAR_MIN; j <= SCHAR_MAX; ++j) {
      int error = 0;
      
      osl_int_t b_sp; osl_int_init_set_si(OSL_PRECISION_SP, &b_sp, j);
      osl_int_t b_dp; osl_int_init_set_si(OSL_PRECISION_DP, &b_dp, j);
      osl_int_t b_mp; osl_int_init_set_si(OSL_PRECISION_MP, &b_mp, j);
      
      osl_int_t c_sp; osl_int_init(OSL_PRECISION_SP, &c_sp);
      osl_int_t c_dp; osl_int_init(OSL_PRECISION_DP, &c_dp);
      osl_int_t c_mp; osl_int_init(OSL_PRECISION_MP, &c_mp);
      
      int const a_sp_i = osl_int_get_si(OSL_PRECISION_SP, a_sp);
      int const a_dp_i = osl_int_get_si(OSL_PRECISION_DP, a_dp);
      int const a_mp_i = osl_int_get_si(OSL_PRECISION_MP, a_mp);
      
      int const b_sp_i = osl_int_get_si(OSL_PRECISION_SP, b_sp);
      int const b_dp_i = osl_int_get_si(OSL_PRECISION_DP, b_dp);
      int const b_mp_i = osl_int_get_si(OSL_PRECISION_MP, b_mp);
      
      // osl_int_init_set_si & osl_int_init & osl_int_get_si
      if (!error) {
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
      
        if (a_sp_i != a_dp_i || a_sp_i != a_mp_i) {
          error++; printf("Error osl_int_init_set_si or osl_int_get_si\n");
        }
        if (b_sp_i != b_dp_i || b_sp_i != b_mp_i) {
          error++; printf("Error osl_int_init_set_si or osl_int_get_si\n");
        }
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i || c_sp_i != 0) {
          error++; printf("Error osl_int_init or osl_int_get_si\n");
        }
      }
      
      // osl_int_assign
      if (!error) {
        osl_int_assign(OSL_PRECISION_SP, &c_sp, b_sp);
        osl_int_assign(OSL_PRECISION_DP, &c_dp, b_dp);
        osl_int_assign(OSL_PRECISION_MP, &c_mp, b_mp);
        
        if (osl_int_ne(OSL_PRECISION_SP, c_sp, b_sp)) {
          error++; printf("Error osl_int_assign\n");
        }
        if (osl_int_ne(OSL_PRECISION_DP, c_dp, b_dp)) {
          error++; printf("Error osl_int_assign\n");
        }
        if (osl_int_ne(OSL_PRECISION_MP, c_mp, b_mp)) {
          error++; printf("Error osl_int_assign\n");
        }
      }
      
      // osl_int_swap
      
      // osl_int_increment
      if (!error) {
        osl_int_increment(OSL_PRECISION_SP, &c_sp, a_sp);
        osl_int_increment(OSL_PRECISION_DP, &c_dp, a_dp);
        osl_int_increment(OSL_PRECISION_MP, &c_mp, a_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i || c_sp_i != a_sp_i + 1) {
          error++; printf("Error osl_int_increment\n");
        }
      }
      
      // osl_int_decrement
      if (!error) {
        osl_int_decrement(OSL_PRECISION_SP, &c_sp, a_sp);
        osl_int_decrement(OSL_PRECISION_DP, &c_dp, a_dp);
        osl_int_decrement(OSL_PRECISION_MP, &c_mp, a_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i || c_sp_i != a_sp_i - 1) {
          error++; printf("Error osl_int_decrement\n");
        }
      }
      
      // osl_int_add
      if (!error) {
        osl_int_add(OSL_PRECISION_SP, &c_sp, a_sp, b_sp);
        osl_int_add(OSL_PRECISION_DP, &c_dp, a_dp, b_dp);
        osl_int_add(OSL_PRECISION_MP, &c_mp, a_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i || c_sp_i != a_sp_i + b_sp_i) {
          error++; printf("Error osl_int_add\n");
        }
      }
      
      // osl_int_add_si
      
      // osl_int_sub
      if (!error) {
        osl_int_sub(OSL_PRECISION_SP, &c_sp, a_sp, b_sp);
        osl_int_sub(OSL_PRECISION_DP, &c_dp, a_dp, b_dp);
        osl_int_sub(OSL_PRECISION_MP, &c_mp, a_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i || c_sp_i != a_sp_i - b_sp_i) {
          error++; printf("Error osl_int_add\n");
        }
      }
      
      // osl_int_mul
      if (!error) {
        osl_int_mul(OSL_PRECISION_SP, &c_sp, a_sp, b_sp);
        osl_int_mul(OSL_PRECISION_DP, &c_dp, a_dp, b_dp);
        osl_int_mul(OSL_PRECISION_MP, &c_mp, a_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i || c_sp_i != a_sp_i * b_sp_i) {
          error++; printf("Error osl_int_mul\n");
        }
      }
      
      // osl_int_mul_si
      if (!error) {
        osl_int_mul_si(OSL_PRECISION_SP, &c_sp, a_sp, b_sp_i);
        osl_int_mul_si(OSL_PRECISION_DP, &c_dp, a_dp, b_dp_i);
        osl_int_mul_si(OSL_PRECISION_MP, &c_mp, a_mp, b_mp_i);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i || c_sp_i != a_sp_i * b_sp_i) {
          error++; printf("Error osl_int_mul_si\n");
        }
      }
      
      // osl_int_div_exact
      if (!error && b_sp_i != 0 && a_sp_i % b_sp_i == 0) {
        osl_int_div_exact(OSL_PRECISION_SP, &c_sp, a_sp, b_sp);
        osl_int_div_exact(OSL_PRECISION_DP, &c_dp, a_dp, b_dp);
        osl_int_div_exact(OSL_PRECISION_MP, &c_mp, a_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i || c_sp_i != a_sp_i / b_sp_i) {
          error++; printf("Error osl_int_div_exact\n");
        }
      }
      
      // osl_int_floor_div_q
      if (!error && b_sp_i != 0) {
        osl_int_floor_div_q(OSL_PRECISION_SP, &c_sp, a_sp, b_sp);
        osl_int_floor_div_q(OSL_PRECISION_DP, &c_dp, a_dp, b_dp);
        osl_int_floor_div_q(OSL_PRECISION_MP, &c_mp, a_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i) {
          error++; printf("Error osl_int_floor_div_q\n");
        }
      }
      
      // osl_int_floor_div_r
      if (!error && b_sp_i != 0) {
        osl_int_floor_div_r(OSL_PRECISION_SP, &c_sp, a_sp, b_sp);
        osl_int_floor_div_r(OSL_PRECISION_DP, &c_dp, a_dp, b_dp);
        osl_int_floor_div_r(OSL_PRECISION_MP, &c_mp, a_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i) {
          error++; printf("Error osl_int_floor_div_r\n");
        }
      }
      
      // osl_int_floor_div_q_r
      if (!error && b_sp_i != 0) {
        osl_int_t q_sp; osl_int_init(OSL_PRECISION_SP, &q_sp);
        osl_int_t q_dp; osl_int_init(OSL_PRECISION_DP, &q_dp);
        osl_int_t q_mp; osl_int_init(OSL_PRECISION_MP, &q_mp);
        
        osl_int_t r_sp; osl_int_init(OSL_PRECISION_SP, &r_sp);
        osl_int_t r_dp; osl_int_init(OSL_PRECISION_DP, &r_dp);
        osl_int_t r_mp; osl_int_init(OSL_PRECISION_MP, &r_mp);
      
        osl_int_floor_div_q_r(OSL_PRECISION_SP, &q_sp, &r_sp, a_sp, b_sp);
        osl_int_floor_div_q_r(OSL_PRECISION_DP, &q_dp, &r_dp, a_dp, b_dp);
        osl_int_floor_div_q_r(OSL_PRECISION_MP, &q_mp, &r_mp, a_mp, b_mp);
        
        int q_sp_i = osl_int_get_si(OSL_PRECISION_SP, q_sp);
        int q_dp_i = osl_int_get_si(OSL_PRECISION_DP, q_dp);
        int q_mp_i = osl_int_get_si(OSL_PRECISION_MP, q_mp);
        
        int r_sp_i = osl_int_get_si(OSL_PRECISION_SP, r_sp);
        int r_dp_i = osl_int_get_si(OSL_PRECISION_DP, r_dp);
        int r_mp_i = osl_int_get_si(OSL_PRECISION_MP, r_mp);
        
        if (q_sp_i != q_dp_i || q_sp_i != q_mp_i) {
          error++; printf("Error osl_int_floor_div_q_r\n");
        }
        if (r_sp_i != r_dp_i || r_sp_i != r_mp_i) {
          error++; printf("Error osl_int_floor_div_q_r\n");
        }
      }
      
      // osl_int_mod
      if (!error && b_sp_i != 0) {
        osl_int_mod(OSL_PRECISION_SP, &c_sp, a_sp, b_sp);
        osl_int_mod(OSL_PRECISION_DP, &c_dp, a_dp, b_dp);
        osl_int_mod(OSL_PRECISION_MP, &c_mp, a_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i) {
          error++; printf("Error osl_int_mod\n");
        }
      }
      
      // osl_int_gcd
      if (!error) {
        osl_int_gcd(OSL_PRECISION_SP, &c_sp, a_sp, b_sp);
        osl_int_gcd(OSL_PRECISION_DP, &c_dp, a_dp, b_dp);
        osl_int_gcd(OSL_PRECISION_MP, &c_mp, a_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i) {
          error++; printf("Error osl_int_gcd\n");
        }
      }
      
      // osl_int_oppose
      if (!error) {
        osl_int_oppose(OSL_PRECISION_SP, &c_sp, b_sp);
        osl_int_oppose(OSL_PRECISION_DP, &c_dp, b_dp);
        osl_int_oppose(OSL_PRECISION_MP, &c_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i) {
          error++; printf("Error osl_int_oppose\n");
        }
      }
      
      // osl_int_abs
      if (!error) {
        osl_int_abs(OSL_PRECISION_SP, &c_sp, b_sp);
        osl_int_abs(OSL_PRECISION_DP, &c_dp, b_dp);
        osl_int_abs(OSL_PRECISION_MP, &c_mp, b_mp);
        
        int c_sp_i = osl_int_get_si(OSL_PRECISION_SP, c_sp);
        int c_dp_i = osl_int_get_si(OSL_PRECISION_DP, c_dp);
        int c_mp_i = osl_int_get_si(OSL_PRECISION_MP, c_mp);
        
        if (c_sp_i != c_dp_i || c_sp_i != c_mp_i) {
          error++; printf("Error osl_int_abs\n");
        }
      }
      
      // osl_int_size_in_base_2
      if (!error) {
        size_t r_sp = osl_int_size_in_base_2(OSL_PRECISION_SP, b_sp);
        size_t r_dp = osl_int_size_in_base_2(OSL_PRECISION_DP, b_dp);
        size_t r_mp = osl_int_size_in_base_2(OSL_PRECISION_MP, b_mp);
        
        osl_int_set_si(OSL_PRECISION_SP, &c_sp, r_sp);
        osl_int_set_si(OSL_PRECISION_DP, &c_dp, r_dp);
        osl_int_set_si(OSL_PRECISION_MP, &c_mp, r_mp);
        
        if (r_sp != r_dp || r_sp != r_mp) {
          error++; printf("Error osl_int_size_in_base_2\n");
        }
      }
      
      // osl_int_size_in_base_10
//       if (!error) {
//         size_t r_sp = osl_int_size_in_base_10(OSL_PRECISION_SP, b_sp);
//         size_t r_dp = osl_int_size_in_base_10(OSL_PRECISION_DP, b_dp);
//         size_t r_mp = osl_int_size_in_base_10(OSL_PRECISION_MP, b_mp);
//         
//         osl_int_set_si(OSL_PRECISION_SP, &c_sp, r_sp);
//         osl_int_set_si(OSL_PRECISION_DP, &c_dp, r_dp);
//         osl_int_set_si(OSL_PRECISION_MP, &c_mp, r_mp);
//         
//         if (r_sp != r_dp || r_sp != r_mp)
//           { error++; printf("Error osl_int_size_in_base_10\n"); }
//       }
      
      // osl_int_eq
      
      // osl_int_ne
      
      // osl_int_pos
      
      // osl_int_neg
      
      // osl_int_zero
      
      // osl_int_one
      
      // osl_int_mone
      
      // osl_int_divisible
      
      if (error) {
        printf("Error with:\n");
        printf("\n");
        
        printf("a_sp = "); osl_int_print(stdout, OSL_PRECISION_SP, a_sp);
        printf("\n");
        printf("a_dp = "); osl_int_print(stdout, OSL_PRECISION_DP, a_dp);
        printf("\n");
        printf("a_mp = "); osl_int_print(stdout, OSL_PRECISION_MP, a_mp);
        printf("\n");
        printf("\n");
        
        printf("b_sp = "); osl_int_print(stdout, OSL_PRECISION_SP, b_sp);
        printf("\n");
        printf("b_dp = "); osl_int_print(stdout, OSL_PRECISION_DP, b_dp);
        printf("\n");
        printf("b_mp = "); osl_int_print(stdout, OSL_PRECISION_MP, b_mp);
        printf("\n");
        printf("\n");
        
        printf("c_sp = "); osl_int_print(stdout, OSL_PRECISION_SP, c_sp);
        printf("\n");
        printf("c_dp = "); osl_int_print(stdout, OSL_PRECISION_DP, c_dp);
        printf("\n");
        printf("c_mp = "); osl_int_print(stdout, OSL_PRECISION_MP, c_mp);
        printf("\n");
        printf("\n");
        
        nb_fail += error;
      }
    }
  }
  
  printf("%s ", argv[0]);
  printf("fails = %d\n", nb_fail);
  
  #else
  
  printf("%s ", argv[0]);
  printf("works only with GMP\n");
  
  #endif
  
  return nb_fail;
}
예제 #7
0
파일: relation.c 프로젝트: periscop/clay
// make i-th coefficient in the row_i zero by subtracting row_j multiplied by
// a constant factor from row_i.
void clay_relation_zero_coefficient(osl_relation_p relation,
                                    int row_i, int row_j, int col) {
  int k;
  osl_int_t lcm, multiplier_i, multiplier_j;

  osl_int_init(relation->precision, &lcm);
  osl_int_init(relation->precision, &multiplier_i);
  osl_int_init(relation->precision, &multiplier_j);

  // If the target coefficient is already zero,
  if (osl_int_zero(relation->precision, relation->m[row_j][col])) {
    // do nothing.
  }
  // If the source coefficient is zero, but the target one is not,
  else if (osl_int_zero(relation->precision, relation->m[row_i][col])) {
    // swap lines.
    for (k = 1; k < relation->nb_columns; k++) {
      osl_int_swap(relation->precision, &relation->m[row_i][k],
                   &relation->m[row_j][k]);
    }
  } else {
    osl_int_lcm(relation->precision, &lcm,
                relation->m[row_i][col], relation->m[row_j][col]);
    osl_int_div_exact(relation->precision, &multiplier_i,
                      lcm, relation->m[row_i][col]);
    osl_int_div_exact(relation->precision, &multiplier_j,
                      lcm, relation->m[row_j][col]);
    for (k = 1; k < relation->nb_columns; k++) {
      if (k < relation->nb_output_dims + 1 && (k % 2) == 1) {
        // ignore beta dimensions
        continue;
      }
      osl_int_mul(relation->precision, &relation->m[row_i][k],
                  relation->m[row_i][k], multiplier_i);
      osl_int_mul(relation->precision, &relation->m[row_j][k],
                  relation->m[row_j][k], multiplier_j);
      osl_int_sub(relation->precision, &relation->m[row_j][k],
                  relation->m[row_j][k], relation->m[row_i][k]);
    }
  }
  // Divide by constant factor if possible (similar to densify transformation).
  multiplier_i = clay_relation_line_gcd(relation, row_i, 1,
                                        relation->nb_columns);
  multiplier_j = clay_relation_line_gcd(relation, row_j, 1,
                                        relation->nb_columns);
  for (k = 1; k < relation->nb_columns; k++) {
    if (k < relation->nb_output_dims + 1 && (k % 2) == 1) {
      // ignore beta dimensions
      continue;
    }
    if (!osl_int_zero(relation->precision, multiplier_i)) {
      osl_int_div_exact(relation->precision, &relation->m[row_i][k],
                        relation->m[row_i][k], multiplier_i);
    }
    if (!osl_int_zero(relation->precision, multiplier_j)) {
      osl_int_div_exact(relation->precision, &relation->m[row_j][k],
                        relation->m[row_j][k], multiplier_j);
    }
  }

  osl_int_clear(relation->precision, &lcm);
  osl_int_clear(relation->precision, &multiplier_i);
  osl_int_clear(relation->precision, &multiplier_j);
}