Changeset 74279bb3 in tol
- Timestamp:
- Sep 4, 2009, 5:35:09 PM (17 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- b8a0836
- Parents:
- 9efcb47
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tol/stdlib/math/stat/models/bayesian/bysMcmc/bsr/gibbs/_sigmaBlock.tol
r9efcb47 r74279bb3 3 3 // MODULE: Stat (Statistics) 4 4 // FILE: _sigmaBlock.tol 5 // PURPOSE: Declares method BysMcmc::Bsr::Gibbs::SigmaBlock5 // PURPOSE: Declares Class BysMcmc::Bsr::Gibbs::BlockSigma 6 6 ///////////////////////////////////////////////////////////////////////////// 7 8 //-------------------------------------------------------------------------- 9 Struct BlockSigma.PartialIndex 10 //-------------------------------------------------------------------------- 11 { 12 Real idxFixed; 13 Real idxReload 14 }; 7 15 8 16 ///////////////////////////////////////////////////////////////////////////// … … 31 39 //-------------------------------------------------------------------------- 32 40 NameBlock _.ws = [[ Real unused_=? ]]; 41 Set _.segment.partial.index = Copy(Empty); 33 42 34 43 //-------------------------------------------------------------------------- 35 44 //Methods 36 45 //-------------------------------------------------------------------------- 46 47 //////////////////////////////////////////////////////////////////////////// 48 Real initialize(Real unused) 49 //////////////////////////////////////////////////////////////////////////// 50 { 51 //WriteLn("TRACE "+_MID+" initialize 1 "); 52 Real hasFixed = _.partialSampler::_.fixedParamNum > 0; 53 //WriteLn("TRACE "+_MID+" initialize hasFixed="<<hasFixed); 54 Real hasReload = _.partialSampler::_.reloadParamNum > 0; 55 //WriteLn("TRACE "+_MID+" initialize hasReload="<<hasReload); 56 Real hasPartial = hasFixed | hasReload; 57 //WriteLn("TRACE "+_MID+" initialize hasPartial="<<hasPartial); 58 Set If(hasPartial, 59 { 60 Set _.segment.partial.index := 61 EvalSet(_.sigmaBlockVar,Set(BSR.NoiseDistrib segment) 62 { 63 Real idxFixed = 0; 64 Real idxReload = 0; 65 Text name = ToName(segment->SigmaName); 66 Real If(hasFixed, 67 { 68 idxFixed:=FindIndexByName(_.partialSampler::_.fixedParam, name) 69 }); 70 Real If(hasReload & !idxFixed, 71 { 72 idxReload:=FindIndexByName(_.partialSampler::_.reloadParam, name) 73 }); 74 BysMcmc::Bsr::Gibbs::BlockSigma.PartialIndex(idxFixed, idxReload) 75 }) 76 }); 77 1 78 }; 79 37 80 //////////////////////////////////////////////////////////////////////////// 38 81 Real _buildWorkSpace(VMatrix residuals_) … … 78 121 79 122 //////////////////////////////////////////////////////////////////////////// 123 Real draw.invRandChisq.segment( 124 Real numSim, 125 VMatrix residuals, 126 BSR.NoiseDistrib segment) 127 //////////////////////////////////////////////////////////////////////////// 128 { 129 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.1 "+segment->Name); 130 NameBlock sumSqr = sumOfSquares(numSim, residuals, segment); 131 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2 "); 132 Case( 133 StructName(segment->SigmaPrior)=="Bsr.Sigma.Prior.InverseGamma", 134 { 135 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.1 "); 136 Real s2 = segment->SigmaPrior->Sigma2; 137 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.2 "); 138 Real w = segment->SigmaPrior->Weight; 139 //WriteLn("TRACE ["+_MID+"] draw.invRandChisq("<<s2+","<<w+")"); 140 Case( 141 w==1, 142 { 143 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.1 "); 144 s2 145 }, 146 w==0, 147 { 148 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.2 "); 149 sumSqr::rss/RandChisq(sumSqr::m) 150 }, 151 LT(0,w,1), 152 { 153 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.3 "); 154 //w = m0/(m0+m); m0*(w-1)=-m*w; m0 = m*w/(1-w) 155 Real m0 = Max(1,Round(sumSqr::m*w/(1-w))); 156 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.4 "); 157 Real rss = sumSqr::rss + m0 * s2; 158 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.5 "); 159 Real m = sumSqr::m + m0; 160 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.6 "); 161 Real S2 = rss/RandChisq(m); 162 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.7 "); 163 /* 164 //WriteLn("TRACE "+_MID+" draw.invRandChisq ("+segment->Name+") "+ 165 " s2="<<s2+ 166 " w="<<w+ 167 " m0="<<m0+ 168 " sumSqr::m="<<sumSqr::m+ 169 " sumSqr::rss="<<sumSqr::rss+ 170 " m="<<m+ 171 " S2="<<S2); */ 172 S2 173 }, 174 1==1, 175 { 176 WriteLn(_MID+" Weigtht of prior sigma is not in [0,1] " 177 "for segment "+segment->Name,"E"); 178 ? 179 }) 180 181 }, 182 1==1, 183 { 184 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.3 "); 185 sumSqr::rss/RandChisq(sumSqr::m) 186 }) 187 }; 188 189 //////////////////////////////////////////////////////////////////////////// 80 190 Text _.autodoc.member.draw.invRandChisq = 81 191 "Method of generation of sigma block containing draws of all variant " … … 85 195 { 86 196 //WriteLn("TRACE "+_MID+" draw.invRandChisq 1 "); 87 Set v = EvalSet(_.sigmaBlockVar,Real(BSR.NoiseDistrib segment) 88 { 89 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.1 "+segment->Name); 90 NameBlock sumSqr = sumOfSquares(numSim, residuals, segment); 91 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2 "); 92 Case( 93 StructName(segment->SigmaPrior)=="Bsr.Sigma.Prior.InverseGamma", 94 { 95 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.1 "); 96 Real s2 = segment->SigmaPrior->Sigma2; 97 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.2 "); 98 Real w = segment->SigmaPrior->Weight; 99 //WriteLn("TRACE ["+_MID+"] draw.invRandChisq("<<s2+","<<w+")"); 100 Case( 101 w==1, 102 { 103 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.1 "); 104 s2 197 198 Set v = If(!Card(_.segment.partial.index), 199 { 200 EvalSet(_.sigmaBlockVar,Real(BSR.NoiseDistrib segment) 201 { 202 draw.invRandChisq.segment(numSim, residuals, segment) 203 }) 204 }, 205 { 206 For(1,Card(_.sigmaBlockVar),Real(Real k) 207 { 208 Set partial = _.segment.partial.index[k]; 209 Real Case(partial->idxFixed, 210 { 211 VMatDat(_.partialSampler::_.fixedValues,partial->idxFixed,1) 105 212 }, 106 w==0, 107 { 108 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.2 "); 109 sumSqr::rss/RandChisq(sumSqr::m) 213 { 214 VMatDat(_.partialSampler::_.reloadValues,partial->idxreload,1) 110 215 }, 111 LT(0,w,1), 112 { 113 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.3 "); 114 //w = m0/(m0+m); m0*(w-1)=-m*w; m0 = m*w/(1-w) 115 Real m0 = Max(1,Round(sumSqr::m*w/(1-w))); 116 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.4 "); 117 Real rss = sumSqr::rss + m0 * s2; 118 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.5 "); 119 Real m = sumSqr::m + m0; 120 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.6 "); 121 Real S2 = rss/RandChisq(m); 122 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.2.3.7 "); 123 /* 124 //WriteLn("TRACE "+_MID+" draw.invRandChisq ("+segment->Name+") "+ 125 " s2="<<s2+ 126 " w="<<w+ 127 " m0="<<m0+ 128 " sumSqr::m="<<sumSqr::m+ 129 " sumSqr::rss="<<sumSqr::rss+ 130 " m="<<m+ 131 " S2="<<S2); */ 132 S2 133 }, 134 1==1, 135 { 136 WriteLn(_MID+" Weigtht of prior sigma is not in [0,1] " 137 "for segment "+segment->Name,"E"); 138 ? 216 { 217 draw.invRandChisq.segment(numSim, residuals, _.sigmaBlockVar[k]) 139 218 }) 140 141 },142 1==1,143 {144 //WriteLn("TRACE "+_MID+" draw.invRandChisq 2.3 ");145 sumSqr::rss/RandChisq(sumSqr::m)146 219 }) 147 220 });
Note: See TracChangeset
for help on using the changeset viewer.
