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
00032 #include <coconut_config.h>
00033 #include <coconut_vect.h>
00034 #include <interval_set.h>
00035
00036 #include <stdlib.h>
00037 #include <cstring>
00038
00039 namespace coco {
00040
00041 static int sortint(const void *a, const void *b)
00042 {
00043 if(((const interval*)a)->sup() < ((const interval*)b)->inf())
00044 return -1;
00045 else if(((const interval*)a)->inf() > ((const interval*)b)->sup())
00046 return 1;
00047 else
00048 return 0;
00049 }
00050
00051 void interval_set::sort(){
00052 if (length>1)
00053 qsort((void*)data, length, sizeof(interval), sortint);
00054 }
00055
00056 interval_set& interval_set::operator=(const interval_set &a){
00057 if(this != &a){
00058 length=a.length;
00059 maxlength=a.maxlength;extension=a.extension;
00060 sorting=a.sorting;
00061 if(data) delete [] data;
00062 data = new interval[maxlength];
00063 for(int i=0;i<length;i++)
00064 data[i]=a.data[i];
00065 }
00066 return (*this);
00067 }
00068
00069 void interval_set::setSorting (bool s){
00070 if (!sorting && s && length>1)
00071 sort();
00072 sorting=s;
00073 }
00074
00075 bool interval_set::is_subset(const interval_set &a) const{
00076 for(int i=0;i<a.getLength();i++){
00077 bool subs=false;
00078 for(int j=0;j<length;j++){
00079 if (data[j].subset(a[i])){
00080 subs=true;break;
00081 }
00082 }
00083 if (!subs) return false;
00084
00085 }
00086 return true;
00087 }
00088
00089 bool interval_set::is_subset(const interval &a) const{
00090 return is_subset(interval_set(a));
00091 }
00092
00093 void interval_set::add(const interval &a)
00094 {
00095 int ainfin(-1), asupin(-1), i, j;
00096 for(i=0;i<length;i++){
00097 if (data[i].contains(a))
00098 return;
00099 else if (a.contains(data[i]))
00100 remove(i--);
00101 else if (data[i].contains(a.inf()))
00102 ainfin=i;
00103 else if (data[i].contains(a.sup())){
00104 if(sorting)
00105 {
00106 if(ainfin > 0)
00107 data[ainfin]=interval(data[ainfin].inf(),
00108 data[i].sup());
00109 else
00110 data[i]=interval(a.inf(),data[i].sup());
00111 return;
00112 }
00113 else
00114 asupin=i;
00115 }
00116 else if(sorting && ainfin > 0 && data[i].inf() > a.sup())
00117 {
00118 data[ainfin]=interval(data[ainfin].inf(), a.sup());
00119 return;
00120 }
00121 }
00122 if(ainfin > 0)
00123 {
00124 if(asupin > 0)
00125 {
00126 data[ainfin]=interval(data[ainfin].inf(),data[asupin].sup());
00127 remove(asupin);
00128 }
00129 else
00130 data[ainfin]=interval(data[ainfin].inf(),a.sup());
00131 return;
00132 }
00133 else if(asupin > 0)
00134 {
00135 data[asupin]=interval(a.inf(), data[asupin].sup());
00136 return;
00137 }
00138 if (length==maxlength){
00139 interval *data2=new interval[maxlength+extension];
00140 for (i=0;i<maxlength;i++)
00141 data2[i]=data[i];
00142 if(data) delete[] data;
00143 data=data2;
00144 maxlength+=extension;
00145 }
00146 int pos=length;
00147 if (sorting){
00148 pos=0;
00149 while(pos<length){
00150 if(a < data[pos])
00151 break;
00152 pos++;
00153 }
00154 if (pos<length && length>0){
00155 for(int pcp=length-1; pcp>pos; --pcp)
00156 data[pcp]=data[pcp-1];
00157 }
00158 }
00159 data[pos]=a;
00160 if((unsigned int)length == MAXLEN)
00161 {
00162 if(!sorting) sort();
00163 typedef std::pair<double,int> pair_double_int;
00164 __vectgen(pair_double_int,gaps,fillextension);
00165 for(i=0; i<(int)fillextension; ++i)
00166 gaps[i].first = -COCO_INF;
00167 for(i=0; i<length; ++i)
00168 {
00169 double thisgap = data[i+1].inf()-data[i].sup();
00170 for(j=0; j<(int)fillextension; ++j)
00171 if(thisgap > gaps[j].first)
00172 break;
00173 if(j<(int)fillextension)
00174 {
00175 for(int k=fillextension-1; k>j; --k)
00176 gaps[k]=gaps[k-1];
00177 gaps[j]=std::make_pair(thisgap,i);
00178 }
00179 }
00180 __vectgen(int,removeit,length);
00181 memset(removeit, 0, length*sizeof(int));
00182 for(i=0; i<(int)fillextension; ++i)
00183 {
00184 if(gaps[i].first == -COCO_INF)
00185 break;
00186 removeit[gaps[i].second]=1;
00187 }
00188 length -= i;
00189 for(i=0, j=0; i<length; ++i, ++j)
00190 {
00191 if(removeit[j])
00192 {
00193 data[i]=interval(data[j].inf(),data[j+1].sup());
00194 ++j;
00195 }
00196 else if(i != j)
00197 data[i]=data[j];
00198 }
00199 }
00200 length++;
00201 }
00202
00203 interval interval_set::remove (int pos)
00204 {
00205 if(pos<0 || pos>=length)
00206 return interval(NAN,NAN);
00207 interval r(data[pos]);
00208 if (length==maxlength-extension && length > 0)
00209 {
00210 maxlength-=extension;
00211 interval *data2=new interval[maxlength];
00212 for (int i=0;i<pos;i++){
00213 data2[i]=data[i];
00214 }
00215 for (int i=pos+1;i<length;i++){
00216 data2[i-1]=data[i];
00217 }
00218 if(data) delete[] data;
00219 data=data2;
00220 }
00221 else
00222 {
00223 for(int i=pos+1; i<length; ++i)
00224 data[i-1]=data[i];
00225 }
00226 --length;
00227 return r;
00228 }
00229
00230 interval_set interval_set::remove (const interval &a){
00231 interval_set rem;
00232 for (int i=0;i<length;i++){
00233 if(a.contains(data[i])){
00234 rem.add(data[i]);
00235 remove(i--);
00236 }
00237 else if (data[i].contains(a)){
00238 rem.add(a);
00239 if(data[i].inf() < a.inf())
00240 {
00241 data[i]=interval(data[i].inf(),a.inf());
00242 if(data[i].sup() > a.sup())
00243 add(interval(a.sup(),data[i].sup()));
00244 }
00245 else
00246 data[i]=interval(a.sup(),data[i].sup());
00247 return rem;
00248 }
00249 else if (data[i].inf() < a.inf() && data[i].sup() > a.inf()){
00250 rem.add(interval(a.inf(),data[i].sup()));
00251 data[i]=interval(data[i].inf(),a.inf());
00252 }
00253 else if (data[i].inf() < a.sup() && data[i].sup() > a.sup()){
00254 rem.add(interval(data[i].inf(),a.sup()));
00255 data[i]=interval(a.sup(),data[i].sup());
00256 }
00257 }
00258 return rem;
00259 }
00260
00261 interval interval_set::minimum() const{
00262 if(length==0)
00263 return 0;
00264 else if (sorting)
00265 return data[0];
00266 else{
00267 interval m(COCO_INF);
00268 for(int i=0;i<length;i++){
00269 if (data[i]<m)
00270 m=data[i];
00271 }
00272 return m;
00273 }
00274 }
00275
00276 interval interval_set::maximum() const{
00277 if(length==0)
00278 return 0;
00279 else if (sorting)
00280 return data[length-1];
00281 else{
00282 interval m(-COCO_INF);
00283 for(int i=0;i<length;i++){
00284 if (m<data[i])
00285 m=data[i];
00286 }
00287 return m;
00288 }
00289 }
00290
00291 interval interval_set::hull() const{
00292 if(length==0)
00293 return interval::EMPTY();
00294 else
00295 return interval(minimum().inf(),maximum().sup());
00296 }
00297
00298 double interval_set::width() const{
00299 return hull().width();
00300 }
00301
00303 interval_set& interval_set::round_to_integer()
00304 {
00305 int i, j;
00306 for (i=0, j=-1; i<length; ++i)
00307 {
00308 data[i].round_to_integer();
00309 if(!data[i].is_empty())
00310 {
00311 ++j;
00312 if(i != j)
00313 data[j] = data[i];
00314 }
00315 }
00316 length = j+1;
00317 return *this;
00318 }
00319
00320 interval_set& interval_set::intersectwith(const interval_set &a){
00321 interval_set i2;
00322 for (int i=0;i<length;i++){
00323 for (int j=0;j<a.getLength();j++){
00324 interval I(data[i]);
00325 I.intersectwith(a[j]);
00326 if (!I.empty())
00327 i2.add(I);
00328 }
00329 }
00330 return *this=i2;
00331 }
00332
00333 void interval_set::intersect_power(const interval_set &a, int n){
00334 interval_set i2;
00335 for (int i=0;i<length;i++){
00336 for (int j=0;j<a.getLength();j++){
00337 interval I(data[i]);
00338 I.intersect_power(a[j],n);
00339 if (!I.empty())
00340 i2.add(I);
00341 }
00342 }
00343 *this=i2;
00344 }
00345
00346 void interval_set::intersect_div(const interval_set &a, const interval_set &b){
00347 interval_set i2;
00348 for (int j=0;j<a.getLength();j++){
00349 for (int k=0;k<b.getLength();k++){
00350 interval_set J(divide(a[j],b[k]));
00351 J.intersectwith(*this);
00352 if (!J.is_empty())
00353 i2.add(J);
00354 }
00355 }
00356 *this=i2;
00357 }
00358
00359 void interval_set::intersect_invsqr_wc(const interval_set &a, double b, double c){
00360 interval_set i2;
00361 for (int i=0;i<length;i++){
00362 for (int j=0;j<a.getLength();j++){
00363 interval_set up, lo;
00364 up = interval_set((sqrt(a[j]) - c)/b);
00365 lo = interval_set((-sqrt(a[j]) - c)/b);
00366 up.intersectwith(*this);
00367 lo.intersectwith(*this);
00368 if (!up.is_empty())
00369 i2.add(up);
00370 if (!lo.is_empty())
00371 i2.add(lo);
00372 }
00373 }
00374 *this=i2;
00375 }
00376
00377 void interval_set::intersect_invpower_wc(const interval_set &a, double b, int n){
00378 interval_set i2;
00379 for (int i=0;i<length;i++){
00380 for (int j=0;j<a.getLength();j++){
00381 interval I(data[i]);
00382 I.intersect_invpower_wc(a[j],b,n);
00383 if (!I.empty())
00384 i2.add(I);
00385 }
00386 }
00387 *this=i2;
00388 }
00389
00390 void interval_set::intersect_invsin_wc(const interval_set &a, double b, double c){
00391 interval_set i2;
00392 for (int i=0;i<length;i++){
00393 for (int j=0;j<a.getLength();j++){
00394 interval I(data[i]);
00395 I.intersect_invsin_wc(a[j],b,c);
00396 if (!I.empty())
00397 i2.add(I);
00398 }
00399 }
00400 *this=i2;
00401 }
00402
00403 void interval_set::intersect_invcos_wc(const interval_set &a, double b, double c){
00404 interval_set i2;
00405 for (int i=0;i<length;i++){
00406 for (int j=0;j<a.getLength();j++){
00407 interval I(data[i]);
00408 I.intersect_invcos_wc(a[j],b,c);
00409 if (!I.empty())
00410 i2.add(I);
00411 }
00412 }
00413 *this=i2;
00414 }
00415
00416 void interval_set::intersect_invgauss_wc(const interval_set &a, double b, double c, double d){
00417 interval_set i2;
00418 for (int i=0;i<length;i++){
00419 for (int j=0;j<a.getLength();j++){
00420 interval I(data[i]);
00421 I.intersect_invgauss_wc(a[j],b,c,d);
00422 if (!I.empty())
00423 i2.add(I);
00424 }
00425 }
00426 *this=i2;
00427 }
00428
00429 interval_set& interval_set::operator +=(const interval_set &a){
00430 *this=*this+a;
00431 return *this;
00432 }
00433
00434 interval_set& interval_set::operator -=(const interval_set &a){
00435 *this=*this-a;
00436 return *this;
00437 }
00438
00439 interval_set& interval_set::operator *=(const interval_set &a){
00440 *this=*this*a;
00441 return *this;
00442 }
00443
00444 interval_set& interval_set::operator /=(const interval_set &a){
00445 *this=*this/a;
00446 return *this;
00447 }
00448
00449 double width(const interval_set& a){return a.width();}
00450
00451
00452 interval_set divide(const interval &a,const interval &b)
00453 {
00454 interval_set c;
00455 bool x2_used;
00456 c.add(division_part1(a, b, x2_used));
00457 if(x2_used){
00458 c.add(division_part2(a, b));
00459 }
00460 return c;
00461 }
00462
00463 bool operator== (const interval_set &a,const interval_set &b){
00464 for(int i=0;i<a.getLength();i++){
00465 for(int j=0;j<b.getLength();j++){
00466 if (a[i] != b[j])
00467 return false;
00468 }
00469 }
00470 return true;
00471 }
00472
00473
00474 interval_set imin(const interval_set &a, const interval_set &b){
00475 interval_set i2;
00476 for (int i=0;i<a.getLength();i++){
00477 for (int j=0;j<b.getLength();j++){
00478 interval I=imin(a[i],b[j]);
00479 if (!I.empty())
00480 i2.add(I);
00481 }
00482 }
00483 return i2;
00484 }
00485 interval_set imax(const interval_set &a, const interval_set &b){
00486 interval_set i2;
00487 for (int i=0;i<a.getLength();i++){
00488 for (int j=0;j<b.getLength();j++){
00489 interval I=imax(a[i],b[j]);
00490 if (!I.empty())
00491 i2.add(I);
00492 }
00493 }
00494 return i2;
00495 }
00496 interval_set power(const interval_set &a, int n){
00497 interval_set i2;
00498 for (int i=0;i<a.getLength();i++){
00499 interval I=power(a[i],n);
00500 if (!I.empty())
00501 i2.add(I);
00502 }
00503 return i2;
00504 }
00505
00506 interval_set sqr(const interval_set &a){
00507 interval_set i2;
00508 for (int i=0;i<a.getLength();i++){
00509 interval I=sqr(a[i]);
00510 if (!I.empty())
00511 i2.add(I);
00512 }
00513 return i2;
00514 }
00515 interval_set sqrt(const interval_set &a){
00516 interval_set i2;
00517 for (int i=0;i<a.getLength();i++){
00518 interval I=sqrt(a[i]);
00519 if (!I.empty())
00520 i2.add(I);
00521 }
00522 return i2;
00523 }
00524 interval_set exp(const interval_set &a){
00525 interval_set i2;
00526 for (int i=0;i<a.getLength();i++){
00527 interval I=exp(a[i]);
00528 if (!I.empty())
00529 i2.add(I);
00530 }
00531 return i2;
00532 }
00533 interval_set log(const interval_set &a){
00534 interval_set i2;
00535 for (int i=0;i<a.getLength();i++){
00536 interval I=log(a[i]);
00537 if (!I.empty())
00538 i2.add(I);
00539 }
00540 return i2;
00541 }
00542 interval_set abs(const interval_set &a){
00543 interval_set i2;
00544 for (int i=0;i<a.getLength();i++){
00545 interval I=abs(a[i]);
00546 if (!I.empty())
00547 i2.add(I);
00548 }
00549 return i2;
00550 }
00551 interval_set sin(const interval_set &a){
00552 interval_set i2;
00553 for (int i=0;i<a.getLength();i++){
00554 interval I=sin(a[i]);
00555 if (!I.empty())
00556 i2.add(I);
00557 }
00558 return i2;
00559 }
00560 interval_set cos(const interval_set &a){
00561 interval_set i2;
00562 for (int i=0;i<a.getLength();i++){
00563 interval I=cos(a[i]);
00564 if (!I.empty())
00565 i2.add(I);
00566 }
00567 return i2;
00568 }
00569 interval_set pow(const interval_set &a, const interval_set &b){
00570 interval_set i2;
00571 for (int i=0;i<a.getLength();i++){
00572 for (int j=0;j<b.getLength();j++){
00573 interval I=pow(a[i],b[j]);
00574 if (!I.empty())
00575 i2.add(I);
00576 }
00577 }
00578 return i2;
00579 }
00580 interval_set atan2(const interval_set &a, const interval_set &b){
00581 interval_set i2;
00582 for (int i=0;i<a.getLength();i++){
00583 for (int j=0;j<b.getLength();j++){
00584 interval I=atan2(a[i],b[j]);
00585 if (!I.empty())
00586 i2.add(I);
00587 }
00588 }
00589 return i2;
00590 }
00591
00592 interval_set round_to_integer(const interval_set &a){
00593 interval_set i2(a);
00594 i2.round_to_integer();
00595 return i2;
00596 }
00597
00598 }
00599
00600 namespace std {
00601 ostream& operator<< (ostream &s, const coco::interval_set &a){
00602 if (a.getLength() == 0)
00603 s<< "{ empty }";
00604 else{
00605 bool first(true);
00606 s<< "{";
00607 for (int i=0;i<a.getLength();i++)
00608 {
00609 if(first) first=false; else s << ",";
00610 s << a[i];
00611 }
00612 s<< "}";
00613 }
00614 return s;
00615 }
00616
00617 }