00001 #include "Adaptive1D.hpp"
00002
00003 extern int debugRefine ;
00004
00005
00006
00007
00008
00009
00010
00011 IndexSet::IndexSet() {a=e=NULL ;nr=0 ;}
00012 IndexSet::IndexSet(int Size) {a=e=NULL ;nr=0 ;Init(Size);}
00013 IndexSet::~IndexSet() {delete []a; delete []e;}
00014
00015
00016
00017 int IndexSet::Init(int Size) {
00018 Size=min(Size,_MAX_INDEXSET_) ;
00019 if (a==NULL) {
00020 a=new int[Size+1] ;
00021 e=new int[Size+1] ;
00022 for (int i=0; i<=Size; i++) a[i]=e[i]=0 ;
00023 }
00024 nr=0 ;
00025 return 1 ;
00026 }
00027
00028 int IndexSet::Print(char *st)
00029 { int c=0 ;
00030 if (st) std::cout <<st ;
00031 std::cout << "nr: "<<nr<<' '<<a<<','<<e<<'\n';
00032 for (int i=0; i<nr; i++) {
00033 if (st) std::cout <<st ;
00034 std::cout << "r "<<i<<": "<<a[i]<<' '<<e[i]<<'\n';
00035 c+=(e[i]-a[i]+1) ;
00036 }
00037 return c ;
00038 }
00039
00040
00041 void IndexSet::Print(char *st,int l,int Level0)
00042 { int si = (l==Level0) ? 1<<l : 1<<(l-1) ;
00043 for (int r=0; r<nr; r++)
00044 for (int i=a[r];i<=e[r];i++)
00045 std::cout<<st<<' '<<((double)i)/si<<' '<<l<<'\n' ;
00046 }
00047
00048 size_t IndexSet::Size() {
00049 size_t s=0 ;
00050 for (int r=0; r<nr; r++) s += (size_t)(e[r]-a[r]+1) ;
00051 return s ;
00052 }
00053
00054 void IndexSet::Copy(IndexSet *F)
00055 {
00056 if (this==F) return ;
00057 nr=F->nr ; assert(nr<_MAX_INDEXSET_) ;
00058 for (int i=0;i<nr;i++) a[i]=F->a[i] , e[i]=F->e[i] ;
00059 }
00060
00061
00062
00063
00064
00065
00066 void IndexSet::CopyWithBounds(IndexSet *B,int l, int *BC, Wavelets *W) {
00067 int *Ba=B->a , *Be=B->e ,Bn=B->nr , r, iend=(1<<l) ;
00068 int K0=-1,NKW1=iend+1 ;
00069
00070 assert(Bn<_MAX_INDEXSET_) ;
00071
00072 if (BC[1]!=PERIODIC) { K0=W->K0 , NKW1=iend-W->K1 ;}
00073
00074 nr=0 ;
00075 if (Bn==0) return ;
00076
00077 r=0 ;
00078
00079 if (Ba[0]<K0) {
00080 a[0]=0 ; e[0]=K0-1 ;
00081 while ((r<Bn)&&(Ba[r]<K0)) { e[0]=max(e[0],Be[r]) ;r++;}
00082 nr=1 ;
00083 }
00084
00085 for (;r<Bn;r++) { a[nr]=Ba[r] ; e[nr++]=Be[r] ; }
00086
00087
00088 r=nr-1 ;
00089 while ((r>=0) && (e[r]>NKW1)) r-- ;
00090
00091 if (r+1<nr) {
00092 a[r+1]=min(a[r+1],NKW1) ;
00093 e[r+1]=iend;
00094 nr=r+2 ;
00095 }
00096
00097
00098 if (nr>1)
00099 if (a[nr-1]==e[nr-2]+1) { e[nr-2]=e[nr-1] ; nr--;}
00100 }
00101
00102
00103 void IndexSet::InducedByWavelets(IndexSet *B,int l, int *BC, Wavelets *W)
00104 {
00105 if(l==W->Level0) { CopyWithBounds(B,W->Level0,BC,W) ;return ;}
00106
00107
00108 struct MatrixShape H ;
00109 W->GtJ.GetShape(l,&H) ;
00110 H.Transpose() ;
00111 CAM(B,BC,&H,TransformMatrixTransposeFirstNZEP , TransformMatrixTransposeLastNZEP ,
00112 TransformMatrixTransposeFirstNZE , TransformMatrixTransposeLastNZE) ;
00113
00114 assert(nr<_MAX_INDEXSET_) ;
00115 }
00116
00117
00118 void IndexSet::InducedByCoarseScalings(IndexSet *B,int l, int *BC, Wavelets *W)
00119 {
00120 struct MatrixShape H ;
00121 W->HJ.GetShape(l,&H) ;
00122 H.Transpose() ;
00123 CAM(B,BC,&H,TransformMatrixTransposeFirstNZEP , TransformMatrixTransposeLastNZEP ,
00124 TransformMatrixTransposeFirstNZE , TransformMatrixTransposeLastNZE) ;
00125
00126 assert(nr<_MAX_INDEXSET_) ;
00127 }
00128
00129
00130 void IndexSet::InducedByFineScalings(IndexSet *S,int l, int *BC, Wavelets *W) {
00131 struct MatrixShape H ;
00132 W->HJ.GetShape(l,&H) ;
00133 CAM(S,BC,&H,TransformMatrixFirstNZEP , TransformMatrixLastNZEP ,
00134 TransformMatrixFirstNZE , TransformMatrixLastNZE) ;
00135 }
00136
00137
00138 void IndexSet::InducedByFineDualScalings(IndexSet *S,int l, int *BC, Wavelets *W) {
00139 struct MatrixShape H ;
00140 W->HtJ.GetShape(l,&H) ;
00141 CAM(S,BC,&H,TransformMatrixFirstNZEP , TransformMatrixLastNZEP ,
00142 TransformMatrixFirstNZE , TransformMatrixLastNZE) ;
00143
00144 assert(nr<_MAX_INDEXSET_) ;
00145 }
00146
00147
00148 void IndexSet::WaveletsInducedByFineScalings(IndexSet *S,int l, int *BC, Wavelets *W) {
00149 struct MatrixShape H ;
00150
00151 if(l==W->Level0) { Copy(S) ;return ;}
00152 W->GJ.GetShape(l,&H) ;
00153 CAM(S,BC,&H,TransformMatrixFirstNZEP , TransformMatrixLastNZEP ,
00154 TransformMatrixFirstNZE , TransformMatrixLastNZE) ;
00155
00156 assert(nr<_MAX_INDEXSET_) ;
00157 }
00158
00159
00160 void IndexSet::WaveletsInducedByFineDualScalings(IndexSet *B,int l, int *BC, Wavelets *W) {
00161 struct MatrixShape H ;
00162 if(l==W->Level0) { Copy(B) ;return ;}
00163 W->GtJ.GetShape(l,&H) ;
00164
00165 CAM(B,BC,&H,TransformMatrixFirstNZEP , TransformMatrixLastNZEP ,
00166 TransformMatrixFirstNZE , TransformMatrixLastNZE) ;
00167
00168
00169
00170
00171
00172 assert(nr<_MAX_INDEXSET_) ;
00173 }
00174
00175
00176 void IndexSet::InducedByOperatorMatrix(IndexSet *S,int l, int *BC, OperatorMatrix *W) {
00177 struct MatrixShape H ;
00178 W->GetShape(l,&H) ;
00179 CAM(S,BC,&H,OperatorMatrixFirstNZEP , OperatorMatrixLastNZEP ,
00180 OperatorMatrixFirstNZE , OperatorMatrixLastNZE) ;
00181
00182 assert(nr<_MAX_INDEXSET_) ;
00183 }
00184
00185
00186 void IndexSet::ScalingsInducedByLifting(IndexSet *S,int l, int *BC, Wavelets *W) {
00187 struct MatrixShape H ;
00188 W->Q.GetShape(l-1,&H) ;
00189 CAM(S,BC,&H,LiftingMatrixTransposeFirstNZEP , LiftingMatrixTransposeLastNZEP ,
00190 LiftingMatrixTransposeFirstNZE , LiftingMatrixTransposeLastNZE) ;
00191
00192 assert(nr<_MAX_INDEXSET_) ;
00193 }
00194
00195
00196 void IndexSet::IndexSetForTypeIII(IndexSet *S,int l, int *BC, Wavelets *W) {
00197 struct MatrixShape H ;
00198 W->HtJ.GetShape(l,&H) ;
00199 EAM(S,BC,&H,TransformMatrixFirst2NZEP , TransformMatrixLast2NZEP ,
00200 TransformMatrixFirst2NZE , TransformMatrixLast2NZE) ;
00201
00202 assert(nr<_MAX_INDEXSET_) ;
00203 }
00204
00205
00206
00207 void IndexSet::ForBoundaryWavelets(bool left, bool right, IndexSet *I, int level,Wavelets *W) {
00208 int *Ia=I->a , *Ie=I->e , n=I->nr ,r ,KW0=W->KW0 , NKW1=(1<<(level-1))-1-W->KW1 ;
00209 bool flag ;
00210
00211 nr=0 ;
00212 if (left)
00213 for (r=0; r<n ;r++) if (Ia[r]<KW0) { a[nr]=Ia[r] ; e[nr++]=min(Ie[r],KW0-1) ; }
00214 else r=n ;
00215
00216 if (right) {
00217 r=n-1 ;
00218 flag=true ;
00219 while ((r>=0)&&flag) {
00220 if (Ie[r]>NKW1) r-- ;
00221 else flag=false ;
00222 }
00223
00224 for (r=r+1; r<n; r++) { a[nr]=max(Ia[r],NKW1+1) ; e[nr++]=Ie[r] ;}
00225 }
00226
00227 assert(nr<_MAX_INDEXSET_) ;
00228 }
00229
00230
00231
00232 void IndexSet::CAM(IndexSet *S, int *BC,
00233 MatrixShape *H,
00234 int (*FirstNZEP)(int,MatrixShape *) , int (*LastNZEP )(int,MatrixShape *) ,
00235 int (*FirstNZE )(int,MatrixShape *) , int (*LastNZE )(int,MatrixShape *))
00236 {
00237 int *Sa=S->a , *Se=S->e , Sn=S->nr ;
00238 int aa,ee,a2,e2,r ;
00239
00240 nr=0 ;
00241 if (Sn==0) return ;
00242
00243 if (BC[1]==PERIODIC) {
00244 int M=H->M ;
00245 M=(M+1)&0xfffe ;
00246 int a3=M ;
00247
00248 aa=FirstNZEP(Sa[0],H) , ee=min(LastNZEP(Se[0],H) , M-1) ;
00249
00250 if (aa<0) { a3=aa+M , aa=0 ; }
00251
00252 e2=LastNZEP(Se[Sn-1],H) ;
00253 if (e2>=M) {
00254 e2-=M ;
00255 if (e2+1 < aa) { a[nr]=0 , e[nr++]=e2 ; }
00256 else aa=0 ;
00257 }
00258
00259 for (r=1; r<Sn; r++) {
00260 a2=max(FirstNZEP(Sa[r],H),0) , e2=min(LastNZEP(Se[r],H) , M-1) ;
00261 if (ee+1 < a2) { a[nr]=aa , e[nr++]=ee , aa=a2 ;}
00262 ee=e2 ;
00263 }
00264
00265 if (ee+1<a3) {
00266 a[nr]=aa , e[nr++]=ee ;
00267 if (a3<M) { a[nr]=a3 , e[nr++]=M-1 ; }
00268 } else {
00269 a[nr]=aa , e[nr++]=M-1 ;
00270 }
00271 return ;
00272 }
00273
00274
00275 aa=FirstNZE(Sa[0],H) ;
00276 ee=LastNZE (Se[0],H) ;
00277
00278 for (r=1; r< Sn ;r++) {
00279 a2=FirstNZE(Sa[r],H) ;
00280 e2=LastNZE (Se[r],H) ;
00281
00282 if (a2<=ee+1) ee=e2 ;
00283 else a[nr]=aa , e[nr]=ee , nr++ , aa=a2 , ee=e2 ;
00284 }
00285 if(aa<=ee) a[nr]=aa , e[nr]=ee , nr++ ;
00286 }
00287
00288
00289
00290 void IndexSet::EAM(IndexSet *S, int *BC,
00291 MatrixShape *H,
00292 int (*FirstNZEP)(int,MatrixShape *) , int (*LastNZEP )(int,MatrixShape *) ,
00293 int (*FirstNZE )(int,MatrixShape *) , int (*LastNZE )(int,MatrixShape *)) {
00294
00295 int *Sa=S->a , *Se=S->e , Sn=S->nr ;
00296 int a2,e2,a3=-MAXINT,e3=-MAXINT,r=0 ;
00297 bool flag=false ;
00298
00299 int M=H->M,N=H->N ;
00300 M=(M+1)&0xfffe ;
00301 N=(N+1)&0xfffe ;
00302
00303 nr=0 ;
00304 if (Sn==0) return ;
00305
00306 if (BC[1]==PERIODIC) {
00307
00308
00309
00310 if ((Sa[0]==0) && (Se[Sn-1]>=N-1)) {
00311 e2=FirstNZEP(Se[0 ],H) ;
00312 a2=LastNZEP (Sa[Sn-1],H)-M ;
00313
00314 if (a2<=e2) {
00315 if ((a2<0) && (e2< 0)) { a3=a2+M, e3=e2+M, flag=true; } else
00316 if ((a2<0) && (e2>=0)) { a3=a2+M, e3=M-1 , flag=true; a[0]=0, e[nr++]=e2; } else
00317 if (a2>=0) { a[0]=a2, e[nr++]=e2 ; }
00318 }
00319 r=1 ;
00320 Sn-- ;
00321 }
00322
00323
00324 for (;r<Sn;r++) {
00325 a2=LastNZEP (Sa[r],H) ;
00326 e2=FirstNZEP(Se[r],H) ;
00327 if (a2<=e2) { a[nr]=a2, e[nr++]=e2 ;}
00328 }
00329
00330 if (flag) { a[nr]=a3, e[nr++]=e3 ;}
00331 return ;
00332 }
00333
00334
00335 for (r=0; r<Sn; r++) {
00336 a2=LastNZE (Sa[r],H) ;
00337 e2=FirstNZE(Se[r],H) ;
00338 if (a2<=e2) { a[nr]=a2, e[nr++]=e2 ;}
00339 }
00340
00341 assert(nr<_MAX_INDEXSET_) ;
00342 }
00343
00344
00345
00346
00347 void IndexSet::Union(IndexSet *A,IndexSet *B)
00348 {
00349 int i,a1,e1 ;
00350 int *Aa=A->a , *Ae=A->e , Ai ;
00351 int *Ba=B->a , *Be=B->e , Bi ;
00352
00353 assert(this!=A) ;
00354 assert(this!=B) ;
00355
00356 Ai=Bi=i=0 ;
00357 while ((Bi<B->nr) && (Ai<A->nr)) {
00358
00359
00360 if (Ba[Bi] < Aa[Ai]) a1=Ba[Bi] , e1=Be[Bi] , Bi++ ;
00361 else a1=Aa[Ai] , e1=Ae[Ai] , Ai++ ;
00362
00363 int cond;
00364 while ( (cond=(Ai<A->nr) && (e1>=Aa[Ai]-1)) || ((Bi<B->nr)&&(e1>=Ba[Bi]-1)) )
00365 {
00366 if (cond) {
00367 if (e1<Ae[Ai]) e1=Ae[Ai] ;
00368 Ai++ ;
00369 } else {
00370 if(e1<Be[Bi]) e1=Be[Bi] ;
00371 Bi++ ;
00372 }
00373 }
00374
00375
00376
00377 a[i]=a1 , e[i]=e1 , i++ ;
00378 }
00379
00380 if(Bi==B->nr)
00381 while (Ai<A->nr) a[i]=Aa[Ai] , e[i++]=Ae[Ai++] ;
00382 else
00383 while (Bi<B->nr) a[i]=Ba[Bi] , e[i++]=Be[Bi++] ;
00384
00385 nr =i ;
00386 assert(nr<_MAX_INDEXSET_) ;
00387 }
00388
00389
00390 void IndexSet::Difference(IndexSet *A,IndexSet *B)
00391 {
00392 int Ai,Bi ;
00393 int *Aa=A->a , *Ae=A->e , An=A->nr ;
00394 int *Ba=B->a , *Be=B->e , Bn=B->nr ;
00395
00396 assert(this!=A) ;
00397 assert(this!=B) ;
00398
00399 Ai=Bi=nr=0 ;
00400 for (Ai=0; Ai<An; Ai++) {
00401
00402 while((Bi<Bn)&&(Be[Bi]<Aa[Ai])) Bi++ ;
00403
00404 if (Bi>=Bn) { a[nr]=Aa[Ai] , e[nr++]=Ae[Ai] ; }
00405 else {
00406
00407 if (Aa[Ai]<Ba[Bi]) { a[nr]=Aa[Ai] , e[nr++]=min(Ae[Ai],Ba[Bi]-1) ;}
00408
00409 while((Be[Bi]<Ae[Ai])&&(Bi<Bn)) {
00410 a[nr ]=Be[Bi]+1 ;
00411 e[nr++]=(Bi+1<Bn) ? min(Ae[Ai],Ba[Bi+1]-1) : Ae[Ai] ;
00412 Bi++ ;
00413 }
00414 }
00415 }
00416
00417 assert(nr<_MAX_INDEXSET_) ;
00418 }
00419
00420 bool IndexSet::IsSame(IndexSet *I) {
00421 if (this==I) return true;
00422 int *aa=I->a , *ee=I->e , n=I->nr ;
00423 if (n!=nr) return false ;
00424
00425 for (int r=0;r<n ;r++) {
00426 if (aa[r]!=a[r]) return false ;
00427 if (ee[r]!=e[r]) return false ;
00428 }
00429 return true ;
00430 }
00431
00432
00433 bool IndexSet::Contains(int i,int *rr) {
00434 int r=(rr) ? *rr : 0 ;
00435 if (nr==0) return false ;
00436 if (r>=nr) r=0 ;
00437 if (a[r]>i) r=0 ;
00438
00439 if (a[0]>i) return false ;
00440
00441 do {
00442 if (i<=e[r]) {
00443 if (rr) *rr=r;
00444 return true ;
00445 }
00446
00447 r++ ;
00448 } while ((r<nr) && (a[r]<=i)) ;
00449
00450 return false ;
00451 }
00452
00453 double IndexSet::VecMaxAbs (double *t) {
00454 double mx=-1 ;
00455 int r,i ;
00456 for (r=0; r<nr; r++)
00457 for (i=a[r]; i<=e[r]; i++) mx = (fabs(t[i]) > mx) ? fabs(t[i]) : mx ;
00458 return mx ;
00459 }
00460
00461 double IndexSet::VecMax (double *t) {
00462 double mx=-HUGE ;
00463 int r,i ;
00464 for (r=0; r<nr; r++)
00465 for (i=a[r]; i<=e[r]; i++) mx = (t[i] > mx) ? t[i] : mx ;
00466 return mx ;
00467 }
00468
00469 double IndexSet::VecInnerProd(double *v1,double *v2) {
00470 int r,i ;
00471 double s=0.0 ;
00472 for (r=0; r<nr; r++)
00473 for (i=a[r]; i<=e[r]; i++) s+=v1[i]*v2[i] ;
00474 return s ;
00475 }
00476
00477 void IndexSet::VecAdd (double *t,double *p,double *q) {
00478 int r,i ;
00479 for (r=0; r<nr; r++)
00480 for (i=a[r]; i<=e[r]; i++) t[i] =q[i]+p[i] ;
00481 }
00482
00483 void IndexSet::VecSub (double *t,double *p,double *q) {
00484 int r,i ;
00485 for (r=0; r<nr; r++)
00486 for (i=a[r]; i<=e[r]; i++) t[i] =p[i]-q[i] ;
00487 }
00488
00489 void IndexSet::VecPlus(double *t,double *p) {
00490 int r,i ;
00491 for (r=0; r<nr; r++)
00492 for (i=a[r]; i<=e[r]; i++) t[i] +=p[i] ;
00493 }
00494
00495 void IndexSet::VecMinus(double *t,double p) {
00496 int r,i ;
00497 for (r=0; r<nr; r++)
00498 for (i=a[r]; i<=e[r]; i++) t[i] -=p ;
00499 }
00500
00501 void IndexSet::VecMinus(double *t,double *p) {
00502 int r,i ;
00503 for (r=0; r<nr; r++)
00504 for (i=a[r]; i<=e[r]; i++) t[i] -=p[i] ;
00505 }
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517 void IndexSet::VecCopy(double *t,double *p) {
00518 int r,i,er,n,n4,n2 ;
00519
00520 for (r=0; r<nr; r++) {
00521 n=e[r]-a[r]+1 ;
00522 n4=n/4 ; er=n4*4 ; n=n-er ; er +=a[r] ;
00523 n2=n/2 ; n=n-(n2*2) ;
00524
00525 for (i=a[r]; i<er; i+=4 ) {
00526 t[i ]=p[i ] ;
00527 t[i+1]=p[i+1] ;
00528 t[i+2]=p[i+2] ;
00529 t[i+3]=p[i+3] ;
00530 }
00531
00532 if (n2>0) {
00533 t[i ]=p[i ];
00534 t[i+1]=p[i+1];
00535 i+=2 ;
00536 }
00537 if (n>0) t[i]=p[i] ;
00538 }
00539 }
00540
00541 void IndexSet::VecMul(double *t, const double f) {
00542 int r,i ;
00543 for (r=0; r<nr; r++)
00544 for (i=a[r]; i<=e[r]; i++) t[i] *= f ;
00545 }
00546
00547 void IndexSet::VecFill(double *t,const double f) {
00548 int r,i ;
00549 for (r=0; r<nr; r++)
00550 for (i=a[r]; i<=e[r]; i++) t[i]=f ;
00551 }
00552
00553 void IndexSet::VecClear(double *t) { VecFill(t,0) ;}
00554
00555 void IndexSet::VecPrint(const char *st,double *t) {
00556 int r,i ;
00557 for (r=0; r<nr; r++)
00558 for (i=a[r]; i<=e[r]; i++) std::cout<<st<<' '<<i<<' '<<t[i]<<'\n' ;
00559 }
00560
00561
00562
00563
00564
00565
00566 void IndexSet::Load(AdaptiveLE *al) {
00567 int ee,i ;
00568 AdaptiveLE::iterator alit,alend=(*al).end() ;
00569
00570 nr=0 ;
00571 ee=-10000000 ;
00572 for (alit=(*al).begin();alit!=alend ;alit++) {
00573 i=(*alit).first ;
00574 if (ee<i-1) { a[nr]=i ; ee=e[nr]=i ; nr++ ;}
00575 else ee=e[nr-1]=i ;
00576 }
00577 }
00578
00579 void IndexSet::Load(AdaptiveLE *al, vector<double> *v, double *d) {
00580 int ee,i ;
00581 long j ;
00582 AdaptiveLE::iterator alit,alend=(*al).end() ;
00583
00584 nr=0 ;
00585 ee=-10000000 ;
00586 for (alit=(*al).begin();alit!=alend ;alit++) {
00587 i=(*alit).first ;
00588 j=(*alit).second ;
00589 if (ee<i-1) { a[nr]=i ; ee=e[nr]=i ; nr++ ;}
00590 else ee=e[nr-1]=i ;
00591 d[i] = (j<0) ? (*v)[1-j] : (*v)[j] ;
00592 }
00593 }
00594
00595 void IndexSet::LoadIS(AdaptiveLE *al) {
00596 int ee,i ;
00597 long j ;
00598 AdaptiveLE::iterator alit,alend=(*al).end() ;
00599
00600 nr=0 ;
00601 ee=-MAXINT ;
00602 for (alit=(*al).begin();alit!=alend ;alit++) {
00603 i=(*alit).first ;
00604 j=(*alit).second ;
00605 if (j>=0) {
00606 if (ee<i-1) { a[nr]=i ; ee=e[nr]=i ; nr++ ;}
00607 else ee=e[nr-1]=i ;
00608 }
00609 }
00610 }
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631 void IndexSet::Store(AdaptiveLE *al, vector<double> *v, double *d, bool add) {
00632 int i ;
00633 long j ;
00634 AdaptiveLE::iterator alit,alend=(*al).end() ;
00635
00636 for (alit=(*al).begin();alit!=alend ;alit++) {
00637 i=(*alit).first ;
00638 j=(*alit).second ;
00639 if (j>=0)
00640 if (add) (*v)[j] +=d[i] ;
00641 else (*v)[j] =d[i] ;
00642 }
00643 }
00644
00645
00646
00647 void IndexSet::LoadBoundary(AdaptiveLE *al, vector<double> *v, double *d,int l,int r) {
00648 int i ;
00649 long j ;
00650 AdaptiveLE::iterator alit ;
00651 AdaptiveLE::reverse_iterator ralit ;
00652
00653 nr=0 ;
00654 if ((*al).empty()) return;
00655
00656 alit=(*al).begin();
00657 i=(*alit).first ;
00658
00659 if (i<l) {
00660 assert(i==0) ;
00661 nr=1 ;
00662 a[0]=0;e[0]=l-1;
00663 j=(*alit).second ;
00664 d[0]=(*v)[j] ;
00665 alit++ ;
00666 for (; i<l-1; alit++) {
00667 i=(*alit).first ;
00668 j=(*alit).second ;
00669 d[i] = (j<0) ? (*v)[1-j] : (*v)[j] ;
00670 }
00671 }
00672
00673 ralit=(*al).rbegin();
00674 i=(*ralit).first ;
00675
00676 if (i>r) {
00677 a[nr]=r+1;e[nr]=i;
00678 nr++ ;
00679 j=(*ralit).second ;
00680 d[i]=(*v)[j] ;
00681 ralit++ ;
00682 for (; i>r+1; ralit++) {
00683 i=(*ralit).first ;
00684 j=(*ralit).second ;
00685 d[i] = (j<0) ? (*v)[1-j] : (*v)[j] ;
00686 }
00687 }
00688 }
00689
00690
00691 void IndexSet::LoadBoundaryIS(AdaptiveLE *al , int l,int r) {
00692 int i ;
00693 AdaptiveLE::iterator alit ;
00694 AdaptiveLE::reverse_iterator ralit ;
00695
00696 nr=0 ;
00697 if ((*al).empty()) return;
00698
00699 alit=(*al).begin();
00700 i=(*alit).first ;
00701 if (i<l) {
00702 assert(i==0) ;
00703 nr=1 ;
00704 a[0]=0;e[0]=l-1;
00705 alit++ ;
00706 for (; i<l-1; alit++) i=(*alit).first ;
00707 }
00708
00709 ralit=(*al).rbegin();
00710 i=(*ralit).first ;
00711 if (i>r) {
00712 a[nr]=r+1;e[nr]=i;
00713 nr++ ;
00714 ralit++ ;
00715 for (; i>r+1; ralit++) i=(*ralit).first ;
00716 }
00717 }
00718
00719
00720 void IndexSet::StoreBoundary(AdaptiveLE *al, vector<double> *v, double *d,int l,int r,bool add) {
00721 int i ;
00722 long j ;
00723 AdaptiveLE::iterator alit ;
00724 AdaptiveLE::reverse_iterator ralit ;
00725
00726 if ((*al).empty()) {assert(nr==0); return;}
00727
00728 alit=(*al).begin();
00729 i=(*alit).first ;
00730 if (i<l) {
00731 j=(*alit).second ;
00732 if (add) (*v)[j]+=d[i]; else (*v)[j]=d[i] ;
00733 alit++ ;
00734 for (; i<l-1; alit++) {
00735 i=(*alit).first ;
00736 j=(*alit).second ;
00737 if (add) (*v)[j]+=d[i]; else (*v)[j]=d[i] ;
00738 }
00739 }
00740
00741 ralit=(*al).rbegin();
00742 i=(*ralit).first ;
00743 if (i>r) {
00744 j=(*ralit).second ;
00745 if (add) (*v)[j]+=d[i]; else (*v)[j]=d[i] ;
00746 ralit++ ;
00747 for (; i>r+1; ralit++) {
00748 i=(*ralit).first ;
00749 j=(*ralit).second ;
00750 if (add) (*v)[j]+=d[i]; else (*v)[j]=d[i] ;
00751 }
00752 }
00753 }
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785 void IndexSet::GenerateRandom(bool boundflag , int KW , int J , bool isW , bool dorandom) {
00786 int i,r,m ;
00787 int nJ=1<<J , M= isW ? nJ-1 : nJ ;
00788
00789
00790 if (!dorandom) {
00791 M = (!boundflag) ? nJ-1 : nJ ;
00792 if (isW) M=nJ-1 ;
00793 nr=1 ;
00794 a[0]=0;
00795 e[0]=M ;
00796 return ;
00797 }
00798
00799
00800 m=(int)(mydrand()*8) ;
00801 nr=0 ;
00802 a[0]=(int)(mydrand()*8) ;
00803 for (i=0; i<m ;i++) {
00804 e[nr]=min(a[nr] + (int)(mydrand()*10) , M) ;
00805 if (e[nr] >= a[nr]) {
00806 nr++ ;
00807 a[nr] = e[nr-1] + (int)(mydrand()*10) + 1 ;
00808 }
00809 }
00810
00811 if (boundflag && (nr>0)) {
00812 r=0 ;
00813 while ((r<nr) && (a[r]<KW)) r++ ;
00814 if (r>0) {
00815 r-- ;
00816 for (i=r; i<nr ;i++) a[i-r]=a[i] , e[i-r]=e[i] ;
00817 a[0]=0 ;
00818 nr=nr-r ;
00819 }
00820
00821 if (e[0]<KW-1) {
00822 e[0]=KW-1 ;
00823 if ( (nr>1) && (a[1]==KW) ) {
00824 for (i=1; i<nr ;i++) a[i-1]=a[i] , e[i-1]=e[i] ;
00825 a[0]=0 ;
00826 nr-- ;
00827 }
00828 }
00829
00830 r=nr-1 ;
00831 while ((r>=0) && (e[r]>M-KW)) r-- ;
00832
00833 if (r<nr-1) {
00834 r++ ;
00835 e[r]=M ;
00836 nr=r+1 ;
00837
00838 if (a[nr-1]>M-KW+1) {
00839 a[nr-1]=M-KW+1 ;
00840 if ((nr>1)&&(e[nr-2]==M-KW)) {
00841 e[nr-2]=M ;
00842 nr-- ;
00843 }
00844 }
00845 }
00846 }
00847 }