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