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
00028
00029
00030
00031 #ifndef __INTERVAL_SET_H__
00032 #define __INTERVAL_SET_H__
00033
00034 #include <math.h>
00035 #include "interval.h"
00036
00037 #define SET_BASE_LENGTH 5
00038 #define SET_EXT 5
00039 #define SET_DEF_MAX_LENGTH 20
00040 #define SET_DEF_FILL 2
00041
00042
00043 namespace coco{
00044
00045
00046 class interval_set
00047 {
00048 private:
00049 interval *data;
00050 int length;
00051 mutable int maxlength,extension;
00052 bool sorting;
00053 unsigned int MAXLEN,fillextension;
00054
00055 void sort();
00056 public:
00057
00058 inline interval_set(void);
00059 inline interval_set(double a);
00060 inline interval_set(double a, double b);
00061 inline interval_set(const interval &a);
00062 inline interval_set(const interval &a,const interval &b);
00063 inline interval_set(const interval_set &a);
00064 virtual ~interval_set();
00065 interval_set& operator=(const interval_set &a);
00066
00067 void setSorting(bool s);
00068 inline bool getSorting() const;
00069 inline int getLength() const;
00070
00071 inline unsigned int get_maxlen() const;
00072 inline void set_maxlen(unsigned int m);
00073 inline unsigned int get_fillext() const;
00074 inline void set_fillext(unsigned int m);
00075
00076 inline unsigned int num_of_gaps() const;
00077
00078 inline bool is_empty() const;
00079 bool is_subset(const interval_set &a) const;
00080 bool is_subset(const interval &a) const;
00081
00082 inline interval &operator[](int pos) const;
00083 void add(const interval &a);
00084 inline void add(const interval_set &a);
00085 interval remove(int pos);
00086 inline interval removeFirst ();
00087 inline void trimToSize();
00088 inline void trimintervaloSize();
00089
00090
00091 inline int find(const interval &a);
00092
00093 inline bool contains(double a) const;
00094 inline bool contains(const interval &a) const;
00095
00096 inline void conc(const interval &a);
00097
00098 interval_set remove(const interval &a);
00099
00100
00101 interval minimum() const;
00102 interval maximum() const;
00103
00104 interval hull() const;
00105 double width() const;
00106
00108 interval_set& round_to_integer();
00109
00110 interval_set& intersectwith(const interval_set &a);
00111 void intersect_power(const interval_set &a, int n);
00112 void intersect_div(const interval_set &a, const interval_set &b);
00113 void intersect_invsqr_wc(const interval_set &a, double b, double c);
00114 void intersect_invpower_wc(const interval_set &a, double b, int n);
00115 void intersect_invsin_wc(const interval_set &a, double b, double c);
00116 void intersect_invcos_wc(const interval_set &a, double b, double c);
00117 void intersect_invgauss_wc(const interval_set &a, double b, double c, double d);
00118 interval_set& operator +=(const interval_set &a);
00119 interval_set& operator -=(const interval_set &a);
00120 interval_set& operator *=(const interval_set &a);
00121 interval_set& operator /=(const interval_set &a);
00122 };
00123
00124 double width(const interval_set& a);
00125
00126 inline interval_set operator +(const interval_set &a, const interval_set &b);
00127 inline interval_set operator +(const interval_set &a,const interval &b);
00128 inline interval_set operator +(const interval &a,const interval_set &b);
00129 inline interval_set operator +(const interval_set &a,double b);
00130 inline interval_set operator +(double a,const interval_set &b);
00131
00132 inline interval_set operator -(const interval_set &a,const interval_set &b);
00133 inline interval_set operator -(const interval_set &a,const interval &b);
00134 inline interval_set operator -(const interval &a,const interval_set &b);
00135 inline interval_set operator -(const interval_set &a, double b);
00136 inline interval_set operator -(double a,const interval_set &b);
00137 inline interval_set operator -(const interval_set &a);
00138
00139 inline interval_set operator *(const interval_set &a,const interval_set &b);
00140 inline interval_set operator *(const interval_set &a,const interval &b);
00141 inline interval_set operator *(const interval &a,const interval_set &b);
00142 inline interval_set operator *(const interval_set &a, double b);
00143 inline interval_set operator *(double a,const interval_set &b);
00144
00145 interval_set divide(const interval &a,const interval &b);
00146 inline interval_set divide(const interval &a,double b);
00147 inline interval_set divide(double a,const interval &b);
00148
00149 inline interval_set operator /(const interval_set &a,const interval_set &b);
00150 inline interval_set operator /(const interval_set &a,const interval &b);
00151 inline interval_set operator /(const interval &a,const interval_set &b);
00152 inline interval_set operator /(const interval_set &a, double b);
00153 inline interval_set operator /(double a,const interval_set &b);
00154
00155 bool operator ==(const interval_set &a,const interval_set &b);
00156
00157
00158 interval_set imin(const interval_set &a, const interval_set &b);
00159 interval_set imax(const interval_set &a, const interval_set &b);
00160 interval_set power(const interval_set &a, int n);
00161 interval_set sqr(const interval_set &a);
00162 interval_set sqrt(const interval_set &a);
00163 interval_set exp(const interval_set &a);
00164 interval_set log(const interval_set &a);
00165 interval_set abs(const interval_set &a);
00166 interval_set sin(const interval_set &a);
00167 interval_set cos(const interval_set &a);
00168 interval_set pow(const interval_set &a, const interval_set &b);
00169 interval_set atan2(const interval_set &a, const interval_set &b);
00170
00172 interval_set round_to_integer(const interval_set &a);
00173
00174
00175 inline interval_set::interval_set()
00176 :length(0), maxlength(SET_BASE_LENGTH), extension(SET_EXT), sorting(true), MAXLEN(SET_DEF_MAX_LENGTH), fillextension(SET_DEF_FILL)
00177 {
00178 data=new interval[extension];
00179 }
00180 inline interval_set::interval_set(double a)
00181 :length(1), maxlength(SET_BASE_LENGTH), extension(SET_EXT), sorting(true), MAXLEN(SET_DEF_MAX_LENGTH), fillextension(SET_DEF_FILL)
00182 {
00183 data=new interval[extension];
00184 data[0]=interval(a);
00185 }
00186 inline interval_set::interval_set(double a, double b)
00187 :length(1), maxlength(SET_BASE_LENGTH), extension(SET_EXT), sorting(true), MAXLEN(SET_DEF_MAX_LENGTH), fillextension(SET_DEF_FILL)
00188 {
00189 data=new interval[extension];
00190 data[0]=interval(a,b);
00191 }
00192 inline interval_set::interval_set(const interval &a)
00193 :length(1), maxlength(SET_BASE_LENGTH), extension(SET_EXT), sorting(true), MAXLEN(SET_DEF_MAX_LENGTH), fillextension(SET_DEF_FILL)
00194 {
00195 data=new interval[extension];
00196 data[0]=a;
00197 }
00198 inline interval_set::interval_set(const interval &a, const interval &b)
00199 :length(2), maxlength(SET_BASE_LENGTH), extension(SET_EXT), sorting(true), MAXLEN(SET_DEF_MAX_LENGTH), fillextension(SET_DEF_FILL)
00200 {
00201 data=new interval[extension];
00202 data[0]=a;data[1]=b;
00203 }
00204 inline interval_set::interval_set(const interval_set &a)
00205 :length(a.length), maxlength(a.maxlength), extension(a.extension), sorting(a.sorting), MAXLEN(a.MAXLEN), fillextension(a.fillextension)
00206 {
00207 data=new interval[maxlength];
00208 for (int i=0;i<length;i++)
00209 data[i]=a.data[i];
00210 }
00211 inline interval_set::~interval_set()
00212 {
00213 if(data) delete[] data;
00214 }
00215
00216 inline int interval_set::getLength() const
00217 {
00218 return length;
00219 }
00220
00221 inline bool interval_set::getSorting () const{
00222 return sorting;
00223 }
00224
00225 inline unsigned int interval_set::get_maxlen () const{
00226 return MAXLEN;
00227 }
00228
00229 inline void interval_set::set_maxlen (unsigned int m) {
00230 MAXLEN = m;
00231 }
00232
00233 inline unsigned int interval_set::get_fillext () const{
00234 return fillextension;
00235 }
00236
00237 inline void interval_set::set_fillext (unsigned int m) {
00238 fillextension = m;
00239 }
00240
00241 inline bool interval_set::is_empty() const{
00242 return length==0;
00243 }
00244
00245 inline interval &interval_set::operator[] (int pos) const {
00246 if(pos<length)
00247 return data[pos];
00248 std::cerr <<__FILE__<< " : " <<__LINE__ << " : " <<__COCONUT_PRETTY_FUNCTION__
00249 <<" index out of bounds: "<< pos << " >= " << length <<" ";
00250 abort();
00251 }
00252
00253
00254 inline void interval_set::add(const interval_set &a)
00255 {
00256 for(int i=0;i<a.length;i++)
00257 add(a.data[i]);
00258 }
00259
00260 inline interval interval_set::removeFirst ()
00261 {
00262 return remove(0);
00263 }
00264 inline void interval_set::trimToSize(){
00265 maxlength=length;
00266 interval *data2=new interval[maxlength];
00267 for (int i=0;i<maxlength;i++)
00268 data2[i]=data[i];
00269 data=data2;
00270 }
00271
00272 inline int interval_set::find(const interval &a)
00273 {
00274 for(int i=0;i<length;i++){
00275 if(data[i]==a)
00276 return i;
00277 }
00278 return -1;
00279 }
00280 inline bool interval_set::contains(const interval &a) const{
00281 for (int i=0;i<length;i++)
00282 if (data[i].contains(a)) return true;
00283 return false;
00284 }
00285
00286 inline bool interval_set::contains(double a) const{
00287 for (int i=0;i<length;i++)
00288 if (data[i].contains(a)) return true;
00289 return false;
00290 }
00291 inline void interval_set::conc(const interval &a){
00292 for (int i=0;i<length;i++){
00293 if (a.sup()<data[i].inf() || data[i].sup()<a.inf())
00294 remove(i--);
00295 else
00296 data[i]=interval(std::max(a.inf(),data[i].inf()),
00297 std::min(a.sup(),data[i].sup()));
00298 }
00299 }
00300 inline unsigned int interval_set::num_of_gaps() const {
00301 return length > 0 ? length-1 : 0;
00302 }
00303
00304 inline interval_set operator +(const interval_set &a,const interval_set &b)
00305 {
00306 interval_set c;
00307 for(int i=0;i<a.getLength();i++)
00308 for(int j=0;j<b.getLength();j++)
00309 c.add(a[i]+b[j]);
00310 return c;
00311 }
00312 inline interval_set operator +(const interval_set &a,const interval &b)
00313 {
00314 interval_set c;
00315 for(int i=0;i<a.getLength();i++)
00316 c.add(a[i]+b);
00317 return c;
00318 }
00319 inline interval_set operator +(const interval &a,const interval_set &b)
00320 {
00321 interval_set c;
00322 for(int i=0;i<b.getLength();i++)
00323 c.add(a+b[i]);
00324 return c;
00325 }
00326 inline interval_set operator +(const interval_set &a,double b)
00327 {
00328 interval_set c;
00329 for(int i=0;i<a.getLength();i++)
00330 c.add(a[i]+b);
00331 return c;
00332 }
00333 inline interval_set operator +(double a,const interval_set &b)
00334 {
00335 interval_set c;
00336 for(int i=0;i<b.getLength();i++)
00337 c.add(a+b[i]);
00338 return c;
00339 }
00340
00341 inline interval_set operator -(const interval_set &a,const interval_set &b)
00342 {
00343 interval_set c;
00344 for(int i=0;i<a.getLength();i++)
00345 for(int j=0;j<b.getLength();j++)
00346 c.add(a[i]-b[j]);
00347 return c;
00348 }
00349 inline interval_set operator -(const interval_set &a,const interval &b)
00350 {
00351 interval_set c;
00352 for(int i=0;i<a.getLength();i++)
00353 c.add(a[i]-b);
00354 return c;
00355 }
00356 inline interval_set operator -(const interval &a,const interval_set &b)
00357 {
00358 interval_set c;
00359 for(int i=0;i<b.getLength();i++)
00360 c.add(a-b[i]);
00361 return c;
00362 }
00363 inline interval_set operator -(const interval_set &a,double b)
00364 {
00365 interval_set c;
00366 for(int i=0;i<a.getLength();i++)
00367 c.add(a[i]-b);
00368 return c;
00369 }
00370 inline interval_set operator -(double a,const interval_set &b)
00371 {
00372 interval_set c;
00373 for(int i=0;i<b.getLength();i++)
00374 c.add(a-b[i]);
00375 return c;
00376 }
00377 inline interval_set operator -(const interval_set &a)
00378 {
00379 interval_set c=-1*a;
00380 return c;
00381 }
00382
00383 inline interval_set operator *(const interval_set &a,const interval_set &b)
00384 {
00385 interval_set c;
00386 for(int i=0;i<a.getLength();i++)
00387 for(int j=0;j<b.getLength();j++)
00388 c.add(a[i]*b[j]);
00389 return c;
00390 }
00391 inline interval_set operator *(const interval_set &a,const interval &b)
00392 {
00393 interval_set c;
00394 for(int i=0;i<a.getLength();i++)
00395 c.add(a[i]*b);
00396 return c;
00397 }
00398 inline interval_set operator *(const interval &a,const interval_set &b)
00399 {
00400 interval_set c;
00401 for(int i=0;i<b.getLength();i++)
00402 c.add(a*b[i]);
00403 return c;
00404 }
00405 inline interval_set operator *(const interval_set &a,double b)
00406 {
00407 interval_set c;
00408 for(int i=0;i<a.getLength();i++)
00409 c.add(a[i]*b);
00410 return c;
00411 }
00412 inline interval_set operator *(double a,const interval_set &b)
00413 {
00414 interval_set c;
00415 for(int i=0;i<b.getLength();i++)
00416 c.add(a*b[i]);
00417 return c;
00418 }
00419
00420
00421 inline interval_set divide(const interval &a,double b)
00422 {
00423 return divide(a,interval(b,b));
00424 }
00425 inline interval_set divide(double a,const interval &b)
00426 {
00427 return divide(interval(a,a),b);
00428 }
00429
00430 inline interval_set operator /(const interval_set &a,const interval_set &b)
00431 {
00432 interval_set c;
00433 for(int i=0;i<a.getLength();i++)
00434 for(int j=0;j<b.getLength();j++)
00435 c.add(divide(a[i],b[j]));
00436 return c;
00437 }
00438 inline interval_set operator /(const interval_set &a,const interval &b)
00439 {
00440 interval_set c;
00441 for(int i=0;i<a.getLength();i++)
00442 c.add(divide(a[i],b));
00443 return c;
00444 }
00445 inline interval_set operator /(const interval &a,const interval_set &b)
00446 {
00447 interval_set c;
00448 for(int i=0;i<b.getLength();i++)
00449 c.add(divide(a,b[i]));
00450 return c;
00451 }
00452 inline interval_set operator /(const interval_set &a,double b)
00453 {
00454 interval_set c;
00455 for(int i=0;i<a.getLength();i++)
00456 c.add(divide(a[i],b));
00457 return c;
00458 }
00459 inline interval_set operator /(double a,const interval_set &b)
00460 {
00461 interval_set c;
00462 for(int i=0;i<b.getLength();i++)
00463 c.add(divide(a,b[i]));
00464 return c;
00465 }
00466
00467 }
00468
00469 namespace std {
00470
00471 ostream& operator<< (ostream &s, const coco::interval_set &a);
00472
00473 }
00474
00475 #endif //__INTERVAL_SET_H__
00476