Developer documentation

sign_variation.hpp
Go to the documentation of this file.
1 /********************************************************************
2  * This file is part of the source code of the realroot kernel.
3  * Author(s): B. Mourrain, GALAAD, INRIA
4  * Fernando Carreras, Univ. Santander
5  * $Id: sign.h,v 1.2 2005/09/28 06:40:43 mourrain Exp $
6  ********************************************************************/
7 #ifndef mmx_sign_variation_hpp
8 #define mmx_sign_variation_hpp
9 /********************************************************************/
10 #include <iterator>
11 
12 namespace mmx {
13 
14 #ifndef MMX_SIGN_FCT
15 #define MMX_SIGN_FCT
16 template<typename T> inline
17 int sign(const T& x)
18 {
19  return ( x < T(0) ? -1 : (T(0) < x ? 1 : 0) );
20 }
21 #endif
22 
23 //--------------------------------------------------------------------
26 template<typename Iterator>
27 unsigned sign_variation( Iterator b, Iterator e )
28 {
29  unsigned c = 0;
30 
31  while ( *b == 0 && b != e ) b++;
32 
33  if ( b != e )
34  {
35  //Iterator p = b;
36  bool v = (*b<0);
37  for( ++b; b != e; ++b )
38  if ( (*b != 0) && ( (*b<0) != v ) ) { c++; v = !v; };
39  };
40 
41  return c;
42 }
43 
44 template<typename Iterator>
45 unsigned sign_variation( Iterator b, Iterator e, unsigned maxv )
46 {
47  unsigned c = 0;
48 
49  while ( *b == 0 && b != e ) b++;
50 
51  if ( b != e )
52  {
53  //Iterator p = b;
54  bool v = (*b<0);
55  for( ++b; c < maxv && b != e; ++b ) {
56  if ( (*b != 0) && ( (*b<0) != v ) ) {
57  c++; v = !v; };
58  }
59  };
60 
61  return c;
62 }
63 
64 template<typename Vector>
65 unsigned sign_variation_n( const Vector& t, unsigned l, unsigned maxv )
66 {
67 
68  unsigned c = 0, i=0;
69 
70  while ( t[i] == 0 && i< l ) i++;
71  if ( i<l )
72  {
73  //unsigned p = i;
74  bool v = (t[i]<0);
75  for( ++i; c < maxv && i<l; ++i ) {
76  if ( (t[i] != 0) && ( (t[i]<0) != v ) ) {
77  c++; v = !v; };
78  }
79  };
80  return c;
81 }
82 
83 template<typename Iterator>
84 bool has_sign_variation( Iterator b, Iterator e)
85 {
86  return (sign_variation(b,e,1)>0);
87 }
88 
89 template<typename Iterator>
90 bool has_no_strict_sign_variation( Iterator b, Iterator e )
91 {
92  bool no_var = true;
93 
94  //while ( *b == 0 && b != e ) b++;
95 
96  if(*b==0) return false;
97 
98  if ( b != e )
99  {
100  bool v = (*b<0);
101  for( ++b; b != e && no_var; ++b )
102  if ( (*b<0) != v ) { no_var=false; };
103  };
104 
105  return no_var;
106 }
107 
108 template<typename Vector>
109 bool has_sign_variation( const Vector& t)
110 {
111  return (sign_variation_n(t,t.size(),1)>0);
112 }
113 
114 
115 template<typename Vector>
116 int sign_of( const Vector& t) {
117  int i;
118  for (i=0; (i<t.size() && t[i]==0); i++) ;
119  if(i==t.size()) return 0;
120 
121  bool ng;
122  for (ng=(t[i]<=0); i<t.size(); i++)
123  if(ng !=(t[i]<=0)) return 0;
124 
125  return (ng?-1:1);
126 }
127 
128 //--------------------------------------------------------------------
133 template<typename T> inline
134 int sign_variation(const T &v)
135 { return sign_variation(v.begin(),v.end()); }
136 template<typename T> inline
137 int sign_variation(const T &v, unsigned maxv )
138 { return sign_variation(v.begin(),v.end(),maxv); };
139 
140 template<typename C, unsigned N>
141 inline unsigned sign_variation( const C (&t)[N] )
142 { return sign_variation(t,t+N); };
143 
144 template<typename C, unsigned N> inline
145 unsigned sign_variation( const C (&t)[N], unsigned maxv )
146 { return sign_variation(t,t+N,maxv); };
147 
148 template<typename C> inline
149 unsigned sign_variation( const C * t, unsigned size )
150 { return sign_variation(t,t+size); };
151 
152 template<typename C> inline
153 unsigned sign_variation( const C * t, unsigned size, unsigned maxv )
154 { return sign_variation(t,t+size,maxv); };
155 
156 /********************************************************************/
160 template<typename T>
161 int Var(const T &v) { return sign_variation(v); }
162 
163 
165 template<typename T>
166 int Per(const T &v)
167 {
168  typedef typename T::const_iterator iter;
169  int per=0;
170  iter it0=v.begin(),it1=it0;++it1;
171  for(;it1!=v.end();++it0,++it1)
172  {
173  if(sign(*it0)*sign(*it1)>0) per++;
174  }
175  return (per);
176 }
177 
178 
179 template<typename T>
180 int Eps(const T &v)
181 {
182  typedef typename T::const_iterator iter;
183  int result=0;
184  iter iti, itj=v.begin()+1;
185  iti=itj;
186  // std::cout<<(*iti)<<" "<<(*itj)<<std::endl;
187  while (itj!=v.end())
188  {
189  // std::cout<<"L "<<(*iti)<<" "<<(*itj)<<std::endl;
190  if ((*itj)==0)
191  {
192  iti=itj+1;
193  while(iti!=v.end() && (*iti==0)) ++iti;
194  if (iti!=v.end())
195  {
196  // std::cout<<*iti<<" "<<*itj<<std::endl;
197  if (std::distance(itj,iti)%2==0)
198  {
199  int val;
200  if (sign(*(itj-1))*sign(*iti)>0) val=1; else val=-1;
201  result += val*pow(-1,std::distance(itj,iti)/2);
202  }
203  itj=iti+1;
204  }
205  else
206  return result;
207  }
208  else ++itj;
209  }
210  return result;
211 }
212 
213 
214 template<typename T>
215 int Count(const T &v)
216 {
217  return (Per(v)-Var(v)+Eps(v));
218 }
219 
220 
221 template<typename C, typename Iterator>
222 C min_value( Iterator b, Iterator e )
223 {
224  C r = *b;
225  for (Iterator i=b; i != e; i++) r = min(r,*i);
226  return r;
227 }
228 
229 template<typename C, typename Iterator>
230 C max_value( Iterator b, Iterator e )
231 {
232  C r = *b;
233  for (Iterator i=b; i != e; i++) r = max(r,*i);
234  return r;
235 }
236 
237 } // namespace mmx
238 
239 #endif // realroot_ARITHM_SIGN_H_
240 
int sign_of(const Vector &t)
Definition: sign_variation.hpp:116
T pow(const T &a, int i)
Definition: binomials.hpp:12
const C & b
Definition: Interval_glue.hpp:25
int Count(const T &v)
Definition: sign_variation.hpp:215
TMPL int N(const MONOMIAL &v)
Definition: monomial_glue.hpp:60
int Per(const T &v)
Per is computing the number of equal consecutive signs -1 to 1.
Definition: sign_variation.hpp:166
unsigned sign_variation_n(const Vector &t, unsigned l, unsigned maxv)
Definition: sign_variation.hpp:65
C min_value(Iterator b, Iterator e)
Definition: sign_variation.hpp:222
int Eps(const T &v)
Definition: sign_variation.hpp:180
Interval< T, r > min(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:130
ZZ size(const ZZ &z)
Definition: GMPXX.hpp:67
bool has_no_strict_sign_variation(Iterator b, Iterator e)
Definition: sign_variation.hpp:90
const C & c
Definition: Interval_glue.hpp:45
double C
Definition: solver_mv_fatarcs.cpp:16
int sign(const QQ &a)
Definition: GMP.hpp:60
unsigned sign_variation(Iterator b, Iterator e)
Definition: sign_variation.hpp:27
int Var(const T &v)
Definition: sign_variation.hpp:161
C max_value(Iterator b, Iterator e)
Definition: sign_variation.hpp:230
bool has_sign_variation(Iterator b, Iterator e)
Definition: sign_variation.hpp:84
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
Definition: array.hpp:12
Home