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 "Octagonal_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_octagonal_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 Coefficient& c_term) {
00040
00041 assert(c.space_dimension() == c_space_dim);
00042 assert(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
00043
00044 dimension_type non_zero_index[2] = { 0, 0 };
00045
00046 for (dimension_type i = c_space_dim; i-- > 0; )
00047 if (c.coefficient(Variable(i)) != 0) {
00048 if (c_num_vars <= 1)
00049 non_zero_index[c_num_vars++] = i;
00050 else
00051
00052 return false;
00053 }
00054
00055
00056
00057
00058
00059
00060 c_term = c.inhomogeneous_term();
00061 switch (c_num_vars) {
00062 case 2:
00063 {
00064 const Coefficient& c0 = c.coefficient(Variable(non_zero_index[0]));
00065 const Coefficient& c1 = c.coefficient(Variable(non_zero_index[1]));
00066 if (c0 != c1 && c0 != -c1)
00067
00068 return false;
00069 c_first_var = non_zero_index[0];
00070 c_second_var = non_zero_index[1];
00071 c_first_var *= 2;
00072 if (sgn(c0) < 0)
00073 ++c_first_var;
00074 c_second_var *= 2;
00075 if (sgn(c1) > 0)
00076 ++c_second_var;
00077 c_coeff = c0;
00078 }
00079 break;
00080 case 1:
00081 {
00082 c_term *= 2;
00083 c_first_var = non_zero_index[0];
00084 c_first_var *= 2;
00085 if (sgn(c.coefficient(Variable(non_zero_index[0]))) < 0) {
00086 c_second_var = c_first_var;
00087 ++c_first_var;
00088 }
00089 else
00090 c_second_var = c_first_var + 1;
00091 c_coeff = c.coefficient(Variable(non_zero_index[0]));
00092 }
00093 break;
00094 default:
00095 assert(c_num_vars == 0);
00096 break;
00097 }
00098 return true;
00099 }
00100