00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <ppl-config.h>
00025 #include "BD_Shape.defs.hh"
00026
00027 namespace PPL = Parma_Polyhedra_Library;
00028
00029 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
00030
00031 #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
00032 bool
00033 PPL::extract_bounded_difference(const Constraint& c,
00034 const dimension_type c_space_dim,
00035 dimension_type& c_num_vars,
00036 dimension_type& c_first_var,
00037 dimension_type& c_second_var,
00038 Coefficient& c_coeff) {
00039
00040 PPL_ASSERT(c.space_dimension() == c_space_dim);
00041 PPL_ASSERT(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
00042
00043 dimension_type non_zero_index[2] = { 0, 0 };
00044
00045 for (dimension_type i = c_space_dim; i-- > 0; )
00046 if (c.coefficient(Variable(i)) != 0) {
00047 if (c_num_vars <= 1)
00048 non_zero_index[c_num_vars++] = i + 1;
00049 else
00050
00051 return false;
00052 }
00053
00054
00055
00056
00057
00058
00059 switch (c_num_vars) {
00060 case 2:
00061 {
00062 const Coefficient& c0 = c.coefficient(Variable(non_zero_index[0]-1));
00063 const Coefficient& c1 = c.coefficient(Variable(non_zero_index[1]-1));
00064 if (sgn(c0) == sgn(c1) || c0 != -c1)
00065
00066 return false;
00067 c_coeff = c1;
00068 }
00069 c_first_var = non_zero_index[0];
00070 c_second_var = non_zero_index[1];
00071 break;
00072 case 1:
00073 c_coeff = -c.coefficient(Variable(non_zero_index[0]-1));
00074 c_first_var = non_zero_index[0];
00075 break;
00076 default:
00077 PPL_ASSERT(c_num_vars == 0);
00078 break;
00079 }
00080 return true;
00081 }
00082
00083 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
00084
00085 #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
00086 void
00087 PPL::compute_leader_indices(const std::vector<dimension_type>& predecessor,
00088 std::vector<dimension_type>& indices) {
00089
00090
00091
00092 PPL_ASSERT(indices.size() == 0);
00093 PPL_ASSERT(0 == predecessor[0]);
00094 indices.push_back(0);
00095 for (dimension_type i = 1, p_size = predecessor.size(); i != p_size; ++i)
00096 if (i == predecessor[i])
00097 indices.push_back(i);
00098 }