Changeset 43274223 in tol
- Timestamp:
- Oct 20, 2008, 8:11:38 AM (18 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- ada82ec
- Parents:
- f22ae37
- File:
-
- 1 edited
-
tol/btol/vmatrix_type/vmat_stats.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tol/btol/vmatrix_type/vmat_stats.cpp
rf22ae37 r43274223 436 436 BVMat& b, 437 437 BVMat& z) 438 // Generates z as a truncated standard multinormal439 // b<= d440 // b = D*z438 // Generates a set of standarized multibormal z constrained to 439 // D*z <= d 440 // Value od d-D*z is stored in b and must be initialized by the caller function 441 441 //////////////////////////////////////////////////////////////////////////////// 442 442 { … … 621 621 }; 622 622 623 624 /* 625 //////////////////////////////////////////////////////////////////////////////// 626 int BVMat::constrained_multivariate(const BVMat& D, 627 const BVMat& d, 628 BVMat& b, 629 BVMat& z, 630 const BArray<BTruncatedDist*>& dist) 631 // Generates a set of independent multivariate z constrained to 632 // D*z <= d 633 // given a truncated univariate distribution 634 // Value od d-D*z is stored in b and must be initialized by the caller function 635 //////////////////////////////////////////////////////////////////////////////// 636 { 637 int i, j, k, h, hj; 638 double aux; 639 bool sp = D.code_ == ESC_chlmRsparse; 640 int n = z.s_.blasRdense_->nrow; 641 int r = d.s_.blasRdense_->nrow; 642 int k0 = 0; 643 int k1 = r; 644 double* zx = (double*)z.s_.blasRdense_->x; 645 double* dx = (double*)d.s_.blasRdense_->x; 646 double* bx = (double*)b.s_.blasRdense_->x; 647 double* Dx = (double*)(sp?D.s_.chlmRsparse_->x:D.s_.blasRdense_->x); 648 int* Di = (int* )(sp?D.s_.chlmRsparse_->i:NULL); 649 int* Dp = (int* )(sp?D.s_.chlmRsparse_->p:NULL); 650 double negInf = BDat::NegInf(); 651 double posInf = BDat::PosInf(); 652 double lower = BDat::NegInf(); 653 double upper = BDat::PosInf(); 654 int nnz = D.NonNullCells(); 655 double drop = nnz*DEpsilon(); 656 for(h=hj=j=0; j<n; j++) 657 { 658 double& zj = zx[j]; 659 //Std(BText("\nj=")<<j); 660 lower=negInf; 661 upper=posInf; 662 if(sp) 663 { 664 k0 = Dp[j]; 665 k1 = Dp[j+1]; 666 } 667 else 668 { 669 hj = h; 670 } 671 for(k=k0; k<k1; k++) 672 { 673 i = sp?Di[k]:k; 674 const double& Dij = sp?Dx[k]:Dx[h++]; 675 int Dij_sign = gsl_fcmp(Dij+1.0,1.0,DBL_EPSILON); 676 if(Dij_sign!=0) 677 { 678 bx[i] += Dij*zj; 679 //Std(BText("\nD[")+i+","+j+"]="+Dij+"\tz["+j+"]="+zj+"\tb["+i+"]="+bx[i]+"\td["+i+"]="+dx[i]); 680 if(Dij_sign<0) 681 { 682 aux = bx[i]/Dij; 683 if(lower<aux) { lower = aux; } 684 //Std(BText("\naux=")+aux+"\tlower="<<lower); 685 } 686 else //if(Dij_sign>0) 687 { 688 aux = bx[i]/Dij; 689 if(upper>aux) { upper = aux; } 690 //Std(BText("\naux=")+aux+"\tupper="<<upper); 691 } 692 } 693 } 694 //Std(BText("\nlower=")<<lower<<"\tupper="<<upper); 695 double length = lower-upper; 696 int length_sign = gsl_fcmp(length+1.0,1.0,DBL_EPSILON); 697 if(length_sign>=0) 698 { 699 if(length_sign==0) 700 { 701 lower = upper; 702 } 703 else 704 { 705 err_cannot_apply("TruncStdGaussian", 706 I2("(empty interval", 707 "(intervalo vacio")+" ["+lower+","+upper+"])",z); 708 //return(-1); 709 } 710 } 711 //if((j>=2)&&(lower<0)&&(upper>0)) printf(""); 712 dist[j]->SetBounds(lower, upper); 713 zj = dist[j]->Random().Value(); 714 Std(BText("\nTRACE constrained_multivariate ")+lower+"<=z["+j+"]="+zj+"<="+upper); 715 assert((lower<=zj) && (zj<=upper)); 716 if(!sp) { h=hj; } 717 for(k=k0; k<k1; k++) 718 { 719 i = sp?Di[k]:k; 720 const double& Dij = sp?Dx[k]:Dx[h++]; 721 bx[i] -= Dij*zj; 722 //Std(BText("\nD[")+i+","+j+"]="+Dij+"\tz["+j+"]="+zj+"\tb["+i+"]="+bx[i]); 723 } 724 } 725 return(0); 726 }; 727 728 729 //////////////////////////////////////////////////////////////////////////////// 730 int BVMat::FindFeasiblePoint(const BVMat& D, const BVMat& d_, BVMat& z0) 731 //////////////////////////////////////////////////////////////////////////////// 732 { 733 z0.Delete(); 734 static char* fName = "FindFeasiblePoint"; 735 if(!D .CheckDefined(fName)) { return(-1); } 736 if(!d_.CheckDefined(fName)) { return(-2); } 737 BVMat d(d_,ESC_blasRdense); 738 int Dr = D.Rows(); 739 int Dc = D.Columns(); 740 int dr = d.Rows(); 741 int dc = d.Columns(); 742 if((Dr!=dr)||(dc!=1)|| 743 !Dc||!Dr||!dc||!dr) 744 { 745 err_invalid_dimensions(fName,D,d_,z0); 746 return(-3); 747 } 748 BVMat Ir, DI, u, b; 749 BArray<BTruncatedDist*> dist(Dc+Dr); 750 int i,j,k,iter; 751 int cm = 0; 752 bool isFeasible = false; 753 switch(D.code_) { 754 case(ESC_blasRdense ) : 755 case(ESC_chlmRsparse ) : 756 z0.Zeros(Dc,1,ESC_blasRdense); 757 Ir.Eye(Dr,Dr); 758 DI = D | Ir; 759 u = z0 << d; 760 //for(k=0; k<Dc; k++) { dist[k] = new BClosestInsideDist(-1,1,0); } 761 //for(k=Dc; k<Dc+Dr; k++) { dist[k] = new BClosestInsideDist(-1,1,0); } 762 for(k=0; k<Dc; k++) { dist[k] = new BTruncatedNormalDist(-1,1,0,1); } 763 for(k=Dc; k<Dc+Dr; k++) { dist[k] = new BTruncatedNormalDist(-1,1,0,1); } 764 b = d-DI*u; 765 for(iter=0; !isFeasible && (iter<10*(Dr+Dc)); iter++) 766 { 767 Std(BText("\nTRACE constrained_multivariate iteration ")+iter); 768 cm = constrained_multivariate(DI,d,b,u,dist); 769 if(cm!=0) 770 { return(-4); } 771 isFeasible = true; 772 k=Dc; 773 for(i=0; isFeasible && (i<Dr); i++, k++) 774 { 775 BDat uk = u.GetCell(k,0); 776 isFeasible = (uk>=0.0); 777 } 778 for(k=Dc; k<Dc+Dr; k++) 779 { 780 BDat s = BDat(0.5)^iter; 781 delete dist[k]; 782 dist[k] = new BTruncatedNormalDist(-1,1,0,s); 783 } 784 } 785 for(k=0; k<dist.Size(); k++) { delete dist[k]; } 786 break; 787 default: 788 err_cannot_create(fName,D.code_); return(-5); } 789 if(!isFeasible) 790 { return(-6); } 791 u.Sub(0, 0, Dc, 1, z0); 792 return(0); 793 } 794 795 //////////////////////////////////////////////////////////////////////////////// 796 int BVMat::TruncStdGaussian(const BVMat& D, const BVMat& d_, 797 const BVMat& z0, int ncol, int burnin) 798 //Matrix instances 799 //////////////////////////////////////////////////////////////////////////////// 800 { 801 static char* fName = "TruncStdGaussian"; 802 if(!D .CheckDefined(fName)) { return(-1); } 803 if(!d_.CheckDefined(fName)) { return(-2); } 804 if(!z0.CheckDefined(fName)) { return(-3); } 805 int Dr = D.Rows(); 806 int Dc = D.Columns(); 807 int dr = d_.Rows(); 808 int dc = d_.Columns(); 809 int zr = z0.Rows(); 810 int zc = z0.Columns(); 811 if((Dr!=dr)||(dc!=1)|| 812 (Dc!=zr)||(zc!=1)|| 813 !Dc||!Dr||!dc||!dr||!zc||!zr) 814 { 815 err_invalid_dimensions(fName,D,d_,z0); 816 return(-4); 817 } 818 double* aux; 819 int k, nrow = Dc; 820 BVMat d(d_,ESC_blasRdense); 821 BVMat z(z0,ESC_blasRdense); 822 BVMat Dz = D*z; 823 BVMat b = d-Dz; 824 double bMin = b.Min(); 825 int nnz = D.NonNullCells(); 826 double drop = nnz*DEpsilon(); 827 if(bMin<-drop) 828 { 829 err_cannot_apply(fName, 830 I2("(non feasible initial point)", 831 "(valor inicial no factible)"),z0); 832 return(-5); 833 } 834 if(burnin<=0 ) { burnin = 1; } 835 BVMat burn; 836 burn.Zeros(nrow, burnin, ESC_blasRdense); 837 Zeros(nrow, ncol, ESC_blasRdense); 838 int size_row = nrow*sizeof(double); 839 switch(D.code_) { 840 case(ESC_blasRdense ) : 841 case(ESC_chlmRsparse ) : 842 aux = (double*)burn.s_.blasRdense_->x; 843 for(k=0; k<burnin; k++, aux+=nrow) 844 { 845 if(trunc_std_gaussian(D, d, b, z)!=0) { return(-6); } 846 memcpy(aux, z.s_.blasRdense_->x, size_row); 847 } 848 aux = (double*)s_.blasRdense_->x; 849 for(k=0; k<ncol; k++, aux+=nrow) 850 { 851 if(trunc_std_gaussian(D, d, b, z)!=0) { return(-7); } 852 memcpy(aux, z.s_.blasRdense_->x, size_row); 853 } 854 break; 855 default: 856 err_cannot_create(fName,D.code_); return(-8); } 857 return(0); 858 }; 859 623 860 /* */
Note: See TracChangeset
for help on using the changeset viewer.
