00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <algorithm>
00023 #include <cstdarg>
00024 #include <cstdlib>
00025 #include <cmath>
00026 #include <fstream>
00027 #include <iomanip>
00028 #include <iostream>
00029 #include <map>
00030 #include <set>
00031 #include "safe_vectors.h"
00032 #include "stat.h"
00033 #include "gnodederived.h"
00034 #include "gnodesetderived.h"
00035 #include "gnodestuff.h"
00036 #include "population.h"
00037 #include "model.h"
00038 using namespace std;
00039
00040 namespace matvec {
00041 GNodeList* GNode::gNodeListPtr;
00042 GeneticDist *GNodeSet::prior;
00043 unsigned GNodeSet::currentLocus;
00044 double GNodeList::logTarget = 0.0;
00045 double GNodeList::logProposal = 0.0;
00046 double GNodeList::logOldProposal = 0.0;
00047 Population *GNodeList::popPtr;
00048 int TransitionSet::transmissionType = 1;
00049
00050
00051
00052 void GNodeList::makealleleGNodeSets(char* infilename,char* outfilename){
00053
00054
00055
00056 ifstream infile(infilename);
00057 ofstream outfile(outfilename);
00058 unsigned ind,mom,dad;
00059 while (infile >> ind >> dad >> mom) {
00060 outfile << "2 " << (ind-1)*2 +1 << setw(5) << (ind-1)*2 +2 << endl;
00061 if(!dad) continue;
00062 outfile << "3 " << (dad-1)*2 +1 << setw(5) << (dad-1)*2 +2 << setw(5) << (ind-1)*2 +1 << endl;
00063 outfile << "3 " << (mom-1)*2 +1 << setw(5) << (mom-1)*2 +2 << setw(5) << (ind-1)*2 +2 << endl;
00064 }
00065 }
00066
00067
00068
00069
00070
00071 void GNodeList::makegenotGNodeSets(char* infilename,char* outfilename){
00072
00073
00074
00075 ifstream infile(infilename);
00076 ofstream outfile(outfilename);
00077 unsigned ind,mom,dad;
00078 while (infile >> ind >> dad >> mom) {
00079 if(!dad) continue;
00080 outfile << "3 " << dad << setw(5) << mom << setw(5) << ind << endl;
00081 }
00082 }
00083
00084
00085
00086
00087
00088 void GNodeList::fill(unsigned n){
00089
00090
00091
00092 resize(n);
00093 for (unsigned i=0;i<n;i++){
00094 GNode* elm_ptr = new GNode;
00095 elm_ptr->peelorder = i+1;
00096 elm_ptr->weight = 1;
00097 (*this)[i] = elm_ptr;
00098 }
00099 }
00100
00101
00102
00103
00104
00105 void GNodeList::inputGNodeSets(char* fname){
00106
00107
00108
00109 ifstream setfile(fname);
00110 unsigned n,member;
00111 lastmember = 0;
00112 while (setfile >> n ) {
00113 for (unsigned i=0;i<n;i++){
00114 setfile >> member;
00115 if (member>lastmember){
00116 lastmember=member;
00117 }
00118 }
00119 }
00120 setfile.close();
00121 ifstream setfile1(fname);
00122 fill(lastmember);
00123 while (setfile1 >> n ) {
00124 GNodeSet* myset = new GNodeSet;
00125 for (unsigned i=0;i<n;i++){
00126 setfile1 >> member;
00127 GNode* elm_ptr = (*this)[member-1];
00128 myset->insert(elm_ptr);
00129 elm_ptr->SetofGNsts.insert(myset);
00130 }
00131 }
00132 }
00133
00134
00135
00136
00137
00138 void GNodeList::displayGNodeSets(){
00139
00140
00141
00142 GNodeList::iterator it;
00143 set< GNodeSet*>::iterator GNodeSetit;
00144 GNodeSet::iterator setit;
00145 for (it=begin();it!=end();it++){
00146 std::cout << (*it)->id << " ";
00147 for (GNodeSetit=(*it)->SetofGNsts.begin();GNodeSetit!=(*it)->SetofGNsts.end();GNodeSetit++){
00148 (*GNodeSetit)->display();
00149 }
00150 std::cout << endl;
00151 }
00152 std::cout << "=========== " << endl;
00153 }
00154
00155
00156
00157
00158
00159 void GNodeList::getPeelOrder(char* fname){
00160
00161
00162
00163 ofstream ordfile(fname);
00164 GNodeList::iterator it1,it2,peel_me;
00165 GNode* temp;
00166 float mag, min;
00167 sum =0.0;
00168 for (it1=begin();it1!=end();it1++){
00169 min = 1e+100;
00170 for (it2=it1;it2!=end();it2++){
00171 mag = (*it2)->getCutsetMagnitude();
00172 if (mag<min){
00173 peel_me = it2;
00174 min=mag;
00175 }
00176 }
00177 sum+=pow(double(4.0),double(min));
00178 ordfile << (*peel_me)->peelorder <<" "<< min << endl;
00179
00180 (*peel_me)->updateMysets();
00181 temp = *it1;
00182 *it1 = *peel_me;
00183 *peel_me = temp;
00184 }
00185 ordfile << "Network size = " << sum << endl;
00186 std::cout << sum << endl;
00187 }
00188
00189
00190
00191
00192
00193 void GNodeList::peelCutAndCompute(unsigned maxCutSetSize, unsigned startBlock, unsigned stopBlock, unsigned sizeBlock){
00194
00195
00196
00197 unsigned sampledCount = 0;
00198 GNodeList::reverse_iterator it;
00199 setGNodeSampleFlags(startBlock, stopBlock, sizeBlock);
00200 if (GNodeSet::prior->chrom()[0].locus[Individual::currentLocus].peelOrder.size()==size()){
00201 sampleGNodePtr = peelAndCutFast();
00202 }
00203 else{
00204
00205 sampleGNodePtr = peelAndCut(maxCutSetSize);
00206 }
00207
00208
00209
00210 while (sampleGNodePtr) {
00211 sampledCount++;
00212
00213 cout << "GNode sampled after " << sampledCount << " 'th peeling: " << sampleGNodePtr->id << endl;
00214 sampleGNodePtr->reComputeGNode();
00215 reinitGNodeList();
00216
00217 sampleGNodePtr = peelAndCut(maxCutSetSize);
00218 }
00219
00220
00221 for (it=rbegin();it!=rend();it++){
00222 if(!(*it)->sampled){
00223 (*it)->reComputeGNode();
00224 }
00225 }
00226 checkSample();
00227
00228
00229
00230
00231
00232 clearGNodeListForNextLocus();
00233 }
00234
00235
00236
00237
00238 void GNodeList::peelCutAndSample(unsigned maxCutSetSize, unsigned startBlock, unsigned stopBlock, unsigned sizeBlock){
00239
00240
00241
00242 unsigned printFlag = popPtr->model->myRSamplerParms.printFlag;
00243 unsigned sampledCount = 0;
00244 Model *modelPtr = popPtr->model;
00245 GNodeList::reverse_iterator it;
00246 setGNodeSampleFlags(startBlock, stopBlock, sizeBlock);
00247 bool cutLoops = GNodeSet::prior->chrom()[0].locus[Individual::currentLocus].cutLoops;
00248 if (GNodeSet::prior->chrom()[0].locus[Individual::currentLocus].peelOrder.size()==size() && !cutLoops){
00249 sampleGNodePtr = peelAndCutFast();
00250 }
00251 else{
00252
00253 popPtr->SimpleGenotypeElimination(Individual::currentLocus);
00254 if (sizeBlock == size() && GNodeSet::prior->chrom()[0].locus[Individual::currentLocus].qtl_ml=='m') {
00255 popPtr->LGGenotypeElimination(Individual::currentLocus);
00256 }
00257 popPtr->setAlleleStateVectors(Individual::currentLocus);
00258 sampleGNodePtr = peelAndCut(maxCutSetSize);
00259 }
00260
00261
00262
00263 while (sampleGNodePtr) {
00264 sampledCount++;
00265
00266 if(printFlag>0) cout << "GNode sampled after " << sampledCount << " 'th peeling: " << sampleGNodePtr->id << endl;
00267 sampleGNodePtr->sampleGNode();
00268 reinitGNodeList();
00269
00270 if (modelPtr->myRSamplerParms.samplerType=="genotypic"){
00271 popPtr->LGGenotypeElimination(Individual::currentLocus);
00272 popPtr->setAlleleStateVectors(Individual::currentLocus);
00273 }
00274 sampleGNodePtr = peelAndCut(maxCutSetSize);
00275 }
00276 if(printFlag>0) cout << "Number of GNodes sampled to break loops = " << sampledCount << endl;
00277
00278 for (it=rbegin();it!=rend();it++){
00279 if(!(*it)->sampled){
00280 (*it)->reverseSampleGNode();
00281 }
00282 }
00283 checkSample();
00284
00285 calculateTargetProb();
00286
00287
00288
00289 clearGNodeListForNextLocus();
00290 }
00291
00292
00293
00294
00295 void GNodeList::peelOrderCutAndSample(unsigned maxCutSetSize, unsigned startBlock, unsigned stopBlock, unsigned sizeBlock){
00296
00297
00298
00299 unsigned printFlag = popPtr->model->myRSamplerParms.printFlag;
00300 Model *modelPtr = popPtr->model;
00301 unsigned sampledCount = 0;
00302 GNodeList::reverse_iterator it;
00303 setGNodeSampleFlags(startBlock, stopBlock, sizeBlock);
00304 sampleGNodePtr = peelAndCut(maxCutSetSize);
00305 GNodeSet::prior->chrom()[0].locus[Individual::currentLocus].cutLoops = false;
00306
00307
00308 while (sampleGNodePtr) {
00309 GNodeSet::prior->chrom()[0].locus[Individual::currentLocus].cutLoops = true;
00310 sampledCount++;
00311
00312 if(printFlag>0) cout << "GNode sampled after " << sampledCount << " 'th peeling: " << sampleGNodePtr->id << endl;
00313 sampleGNodePtr->sampleGNode();
00314 reinitGNodeList();
00315 if (modelPtr->myRSamplerParms.samplerType=="genotypic"){
00316 popPtr->LGGenotypeElimination(Individual::currentLocus);
00317 popPtr->setAlleleStateVectors(Individual::currentLocus);
00318 }
00319
00320 sampleGNodePtr = peelAndCut(maxCutSetSize);
00321 }
00322 if(printFlag>0) cout << "Number of GNodes sampled to break loops = " << sampledCount << endl;
00323
00324 for (it=rbegin();it!=rend();it++){
00325 if(!(*it)->sampled){
00326 (*it)->reverseSampleGNode();
00327 }
00328 }
00329 checkSample();
00330
00331 calculateTargetProb();
00332
00333
00334
00335 clearGNodeListForNextLocus();
00336 }
00337
00338
00339
00340
00341
00342 GNode* GNodeList::peelAndCut(unsigned maxCutSetSize){
00343
00344
00345
00346 unsigned printFlag = popPtr->model->myRSamplerParms.printFlag;
00347 if (!distanceMatDone) makeDistanceMatrix();
00348 cutGNodesVector.clear();
00349 loopSetGNodes.clear();
00350 searchStart = begin();
00351 resetConnectFlags();
00352 sampleGNodePtr=NULL;
00353 maxDist = 0;
00354 GNodeList::iterator it1,it2,peel_me;
00355 GNode* temp;
00356 float mag, min;
00357 sum =0.0;
00358 unsigned count=0;
00359 unsigned loopCount=0;
00360 it1=begin();
00361 while (it1!=end()){
00362 min = 1e+100;
00363 for (it2=it1;it2!=end();it2++){
00364 mag = (*it2)->getCutsetMagnitude();
00365 if (mag<min){
00366 peel_me = it2;
00367 min=mag;
00368 }
00369 }
00370 if(min<=maxCutSetSize){
00371 sum+=min;
00372 (*peel_me)->peelorder = ++count;
00373 (*peel_me)->updateMysets();
00374 if(printFlag>1) cout << "Peeling node " << count << endl;
00375 (*peel_me)->peel();
00376 if(howToSample=="joint"){
00377 GNodeSet::prior->chrom()[0].peelOrder[count-1] = (*peel_me)->id;
00378 }
00379 else{
00380 GNodeSet::prior->chrom()[0].locus[Individual::currentLocus].peelOrder[count-1] = (*peel_me)->id;
00381 }
00382 temp = *it1;
00383 *it1 = *peel_me;
00384 *peel_me = temp;
00385 it1++;
00386 }
00387 else {
00388 if(printFlag>1) cout << "Peeled " << count << " gNodes, now I need to cut ";
00389 searchStart = it1;
00390 sort(searchStart,end(),compareGNodesWeight());
00391 findLoopAndCut();
00392 loopCount++;
00393 }
00394 if(printFlag>2) {
00395 displayGNodeSets();
00396 }
00397 }
00398 if (cutGNodesVector.size()>0){
00399 sampleGNodePtr = findSampleGNode();
00400 }
00401 return sampleGNodePtr;
00402 }
00403
00404
00405
00406
00407 GNode* GNodeList::findSampleGNode(void){
00408
00409
00410
00411 unsigned maxDistance = 0;
00412
00413 GNode* sampleGuy = 0;
00414 set<GNode*>::iterator it;
00415 SafeSTLVector<GNode*>::iterator cutListIter;
00416 for(it=loopSetGNodes.begin();it!=loopSetGNodes.end();it++){
00417 if((*it)->sampled) continue;
00418 unsigned rowId = (*it)->id;
00419 unsigned sumDist = 0;
00420 for(cutListIter=cutGNodesVector.begin();cutListIter!=cutGNodesVector.end();cutListIter++){
00421 unsigned colId = (*cutListIter)->id;
00422 sumDist += distanceMat(rowId,colId);
00423 }
00424 cout << "distance " << sumDist << endl;
00425 if (sumDist>maxDistance){
00426 maxDistance = sumDist;
00427 sampleGuy = (*it);
00428 }
00429 }
00430 if (sampleGuy){
00431 return sampleGuy;
00432 }
00433 else {
00434 throw exception("GNodeList::findSampleGNode: Error- possible bug in code\n");
00435 }
00436 }
00437
00438
00439
00440 void GNodeList::makeDistanceMatrix(void){
00441
00442
00443
00444 unsigned numGnodes = size();
00445 distanceMat.resize(numGnodes,numGnodes);
00446 GNodeList::iterator it;
00447 for (it=begin();it!=end();it++){
00448 calcDistancefrom(*it);
00449 }
00450 distanceMatDone = true;
00451
00452 }
00453
00454
00455
00456 void GNodeList::calcDistancefrom(GNode* refGNode){
00457
00458
00459
00460
00461 vector<unsigned> dist;
00462 unsigned UHUGE = 2*ULONG_MAX;
00463 GNode *gnodePtr;
00464 GNodeList::iterator GNodeListiter;
00465 set<GNodeSet*>::iterator GNodeSetiter;
00466 set<GNode*>::iterator GNodeiter;
00467 vector<GNode*>::iterator GreyListiter;
00468 vector<GNode*> GreyList;
00469
00470 GreyList.clear();
00471 unsigned rowId = refGNode->id;
00472 for(GNodeListiter = begin(); GNodeListiter != end(); GNodeListiter++){
00473 (*GNodeListiter)->connectFlag = ULONG_MAX;
00474 }
00475 refGNode->connectFlag = 0;
00476 GreyList.push_back(refGNode);
00477 distanceMat(rowId,rowId) = 0;
00478 while (GreyList.size() > 0){
00479 gnodePtr = GreyList.back();
00480 GreyList.pop_back();
00481 unsigned uId = gnodePtr->id;
00482 for(GNodeSetiter= gnodePtr->SetofGNsts.begin();GNodeSetiter !=gnodePtr->SetofGNsts.end();GNodeSetiter++){
00483 for(GNodeiter = (*GNodeSetiter)->begin(); GNodeiter!= (*GNodeSetiter)->end(); GNodeiter++){
00484 if ( (*GNodeiter)->connectFlag == ULONG_MAX) {
00485 (*GNodeiter)->connectFlag = 0;
00486 unsigned colId = (*GNodeiter)->id;
00487 distanceMat(rowId,colId) = distanceMat(rowId,uId) + 1;
00488 GreyList.push_back(*GNodeiter);
00489 }
00490 }
00491 }
00492 gnodePtr->connectFlag = UHUGE;
00493 }
00494 }
00495
00496
00497
00498
00499 GNode* GNodeList::peelAndCutFast(){
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509 searchStart = begin();
00510 resetConnectFlags();
00511 sampleGNodePtr=NULL;
00512 maxDist = 0;
00513 GNode* peel_me;
00514 unsigned loopCount=0,idOfPeelGuy=0;
00515 for (int i=0; i<size();i++){
00516 if(howToSample=="joint"){
00517 idOfPeelGuy = GNodeSet::prior->chrom()[0].peelOrder[i]-1;
00518 }
00519 else{
00520 idOfPeelGuy = GNodeSet::prior->chrom()[0].locus[Individual::currentLocus].peelOrder[i]-1;
00521 }
00522 peel_me = (*this)[idOfPeelGuy];
00523
00524
00525
00526 peel_me->updateMysets();
00527 peel_me->peel();
00528 }
00529 sort(begin(),end(),compareGNodesPeelId());
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541 return sampleGNodePtr;
00542
00543 }
00544
00545
00546
00547
00548 void GNodeList::clearGNodeListForNextLocus(void){
00549
00550
00551
00552 set< CutSet*>::iterator GNodeSetit;
00553 for (GNodeSetit=completeSetofCutSets.begin();GNodeSetit!=completeSetofCutSets.end();GNodeSetit++){
00554 delete *GNodeSetit;
00555 }
00556 completeSetofCutSets.clear();
00557 GNodeList::iterator it;
00558 for (it=begin();it!=end();it++){
00559 (*it)->SetofGNsts.clear();
00560 }
00561 }
00562
00563 void GNodeList::releaseGNsts(void){
00564
00565
00566
00567 set< GNodeSet*>::iterator GNodeSetit;
00568 for (GNodeSetit=completeSetofGNsts.begin();GNodeSetit!=completeSetofGNsts.end();GNodeSetit++){
00569 delete *GNodeSetit;
00570 }
00571 completeSetofGNsts.clear();
00572 }
00573
00574
00575
00576
00577
00578 void GNodeList::reinitGNodeList(void){
00579
00580
00581
00582 releaseCutSets();
00583 resetGNodeList();
00584 }
00585
00586
00587
00588
00589 void GNodeList::releaseCutSets(void){
00590
00591
00592
00593 set< CutSet*>::iterator GNodeSetit;
00594 for (GNodeSetit=completeSetofCutSets.begin();GNodeSetit!=completeSetofCutSets.end();GNodeSetit++){
00595 delete *GNodeSetit;
00596 }
00597 completeSetofCutSets.clear();
00598 }
00599
00600
00601
00602
00603
00604 void GNodeList::resetGNodeList(void){
00605
00606
00607
00608 GNodeList::iterator it;
00609 for (it=begin();it!=end();it++){
00610 (*it)->SetofGNsts.clear();
00611 }
00612 set< GNodeSet*>::iterator GNodeSetit;
00613 GNodeSet::iterator setit;
00614 for (GNodeSetit=completeSetofGNsts.begin();GNodeSetit!=completeSetofGNsts.end();GNodeSetit++){
00615 for (setit=(*GNodeSetit)->begin();setit!=(*GNodeSetit)->end();setit++){
00616 (*setit)->SetofGNsts.insert(*GNodeSetit);
00617 }
00618 }
00619 }
00620
00621
00622
00623
00624 void GNodeList::setGNodeSampleFlags(unsigned startBlock, unsigned stopBlock, unsigned sizeBlock){
00625
00626
00627
00628 GNodeList::iterator it;
00629 if ((stopBlock-startBlock)==size()){
00630 for (it=begin();it!=end();it++){
00631 (*it)->sampled = false;
00632 }
00633 return;
00634 }
00635 else {
00636 for (it=begin();it!=end();it++){
00637 if(it>=begin()+startBlock && it<begin()+stopBlock){
00638 (*it)->sampled = false;
00639 }
00640 }
00641 }
00642 }
00643
00644
00645
00646
00647 void GNodeList::findLoopAndCut(void){
00648
00649
00650
00651 unsigned lowFlag;
00652 unsigned highFlag;
00653 GNodeList::iterator it;
00654 set< GNodeSet*>::iterator GNodeSetit, cutGNodeSet;
00655 GNodeSet::iterator setit;
00656 resetConnectFlags();
00657 for (it=searchStart;it!=end();it++){
00658
00659 for (GNodeSetit=(*it)->SetofGNsts.begin();GNodeSetit!=(*it)->SetofGNsts.end();GNodeSetit++){
00660 if((*it)->connectFlag < (*GNodeSetit)->connectFlag){
00661 lowFlag = (*it)->connectFlag;
00662 highFlag= (*GNodeSetit)->connectFlag;
00663 (*GNodeSetit)->connectFlag = (*it)->connectFlag;
00664 propagateFlags(lowFlag,highFlag);
00665
00666 }
00667 else if((*it)->connectFlag > (*GNodeSetit)->connectFlag){
00668 lowFlag = (*GNodeSetit)->connectFlag;
00669 highFlag= (*it)->connectFlag;
00670 (*it)->connectFlag = (*GNodeSetit)->connectFlag;
00671 propagateFlags(lowFlag,highFlag);
00672 }
00673 else{
00674
00675
00676 GNodeList::iterator loopCloser = it;
00677 GNodeList loopList = isolatePureLoop(loopCloser);
00678 cutGNode = loopList.getMinWeightGNode();
00679 cutGNodesVector.push_back(*cutGNode);
00680 cutGNodeSet = loopList.getCutGNodeSet(cutGNode);
00681
00682 cutLoop(cutGNode,cutGNodeSet);
00683 return;
00684 }
00685 }
00686 }
00687 }
00688
00689
00690
00691
00692 set< GNodeSet*>::iterator GNodeList::getCutGNodeSet(GNodeList::iterator cutGNode){
00693
00694
00695
00696 GNodeSet loopGNodesSet;
00697 GNodeList intersectionVector;
00698 GNodeList::iterator it;
00699 for (it=begin();it!=end();it++){
00700 if(it!=cutGNode) loopGNodesSet.insert(*it);
00701 }
00702 set< GNodeSet*>::iterator GNodeSetit;
00703 for (GNodeSetit=(*cutGNode)->SetofGNsts.begin();GNodeSetit!=(*cutGNode)->SetofGNsts.end();GNodeSetit++){
00704 intersectionVector.clear();
00705 set_intersection(loopGNodesSet.begin(), loopGNodesSet.end(),
00706 (*GNodeSetit)->begin(), (*GNodeSetit)->end(),
00707 inserter(intersectionVector,intersectionVector.begin()) );
00708 if (intersectionVector.size()>0) return GNodeSetit;
00709 }
00710 throw exception("GNodeList::getCutGNodeSet: possible error in program");
00711 }
00712
00713
00714
00715
00716
00717 GNodeList::iterator GNodeList::getMinWeightGNode(void){
00718
00719
00720
00721 GNodeList::iterator it, minIt;
00722 unsigned minWeight = ULONG_LONG_MAX;
00723 for(it=begin();it!=end();it++){
00724 unsigned wt = (*it)->sampled ? 1 : (*it)->getWeight();
00725 if(wt < minWeight){
00726 minWeight = wt;
00727 minIt = it;
00728 }
00729 }
00730 return minIt;
00731 }
00732
00733
00734
00735
00736 void GNodeList::propagateFlags(unsigned lowFlag, unsigned highFlag){
00737
00738
00739
00740 if(highFlag==ULONG_MAX){
00741 return;
00742 }
00743 else{
00744 GNodeList::iterator it;
00745 set< GNodeSet*>::iterator GNodeSetit;
00746 for (it=searchStart;it!=end();it++){
00747 if((*it)->connectFlag==highFlag){
00748 (*it)->connectFlag = lowFlag;
00749 }
00750 for (GNodeSetit=(*it)->SetofGNsts.begin();GNodeSetit!=(*it)->SetofGNsts.end();GNodeSetit++){
00751 if((*GNodeSetit)->connectFlag==highFlag){
00752 (*GNodeSetit)->connectFlag=lowFlag;
00753 }
00754 }
00755 }
00756 }
00757 }
00758
00759
00760
00761
00762
00763 void GNodeList::resetConnectFlags(void){
00764
00765
00766
00767
00768 GNodeList::iterator it;
00769 set< GNodeSet*>::iterator GNodeSetit;
00770 for (it=searchStart;it!=end();it++){
00771 (*it)->connectFlag = (*it)->id;
00772 for (GNodeSetit=(*it)->SetofGNsts.begin();GNodeSetit!=(*it)->SetofGNsts.end();GNodeSetit++){
00773 (*GNodeSetit)->connectFlag = ULONG_MAX;
00774 }
00775 }
00776 }
00777
00778
00779
00780
00781
00782 GNodeList GNodeList::isolatePureLoop(GNodeList::iterator loopCloser){
00783
00784
00785
00786 GNodeList LoopList;
00787 GNodeList::iterator it;
00788 set< GNodeSet*>::iterator GNodeSetit;
00789 GNodeSet::iterator setit;
00790
00791 unsigned numberEliminated;
00792 do {
00793 numberEliminated = 0;
00794 for (it=searchStart;it!=loopCloser;it++){
00795 if((*loopCloser)->connectFlag==(*it)->connectFlag){
00796 unsigned GNodeSetcount = 0;
00797 for (GNodeSetit=(*it)->SetofGNsts.begin();GNodeSetit!=(*it)->SetofGNsts.end();GNodeSetit++){
00798 unsigned GNodecount = 0;
00799 for (setit=(*GNodeSetit)->begin();setit!=(*GNodeSetit)->end();setit++){
00800 if((*setit)->id!=(*it)->id && (*setit)->connectFlag==(*loopCloser)->connectFlag){
00801 GNodecount++;
00802 }
00803 }
00804 if(GNodecount!=0) GNodeSetcount++;
00805 }
00806 if(GNodeSetcount<=1){
00807 (*it)->connectFlag = ULONG_MAX;
00808 numberEliminated++;
00809 }
00810 }
00811 }
00812 } while(numberEliminated>0);
00813 for (it=searchStart;it!=end();it++){
00814 if((*loopCloser)->connectFlag==(*it)->connectFlag){
00815 LoopList.push_back(*it);
00816 }
00817 }
00818 for (it=LoopList.begin();it!=LoopList.end();it++){
00819 loopSetGNodes.insert(*it);
00820 }
00821
00822 return LoopList;
00823 }
00824
00825
00826
00827
00828
00829
00830
00831 void GNodeList::cutLoop(GNodeList::iterator cutGNode,set< GNodeSet*>::iterator cutGNodeSet){
00832
00833
00834
00835 unsigned printFlag = popPtr->model->myRSamplerParms.printFlag;
00836 if(printFlag>1){
00837 cout << "cutGNode: "<< (*cutGNode)->id << " cutGNodeSet: ";
00838 (*cutGNodeSet)->display();
00839 cout << endl;
00840 }
00841 GNodeSet::iterator setit;
00842 CutSet* newSet = new CutSet;
00843 completeSetofCutSets.insert(newSet);
00844 for (setit=(*cutGNodeSet)->begin();setit!=(*cutGNodeSet)->end();setit++){
00845 if((*setit)!=(*cutGNode)){
00846 newSet->insert(*setit);
00847 }
00848 }
00849 newSet->setKeyMultiplicationCode();
00850 newSet->connectFlag = (*cutGNode)->connectFlag;
00851 newSet->numberOfCuts++;
00852 (*cutGNode)->numberOfCuts++;
00853 *newSet+=(*cutGNodeSet);
00854 if(dynamic_cast<CutSet*>(*cutGNodeSet)){
00855 ((CutSet*) *cutGNodeSet)->replaceMeWith(*newSet);
00856 (*cutGNode)->SetofGNsts.erase(*cutGNodeSet);
00857 delete newSet;
00858 completeSetofCutSets.erase(newSet);
00859 }
00860 else {
00861 for (setit=(*cutGNodeSet)->begin();setit!=(*cutGNodeSet)->end();setit++){
00862 (*setit)->SetofGNsts.erase(*cutGNodeSet);
00863 if((*setit)!=(*cutGNode)){
00864 (*setit)->SetofGNsts.insert(newSet);
00865 }
00866 }
00867 }
00868 }
00869
00870
00871
00872
00873 void GNodeList::checkSample(void){
00874
00875
00876
00877 set< GNodeSet*>::iterator GNodeSetit;
00878 for (GNodeSetit=completeSetofGNsts.begin();GNodeSetit!=completeSetofGNsts.end();GNodeSetit++){
00879 if(dynamic_cast<TransitionSet*>(*GNodeSetit)){
00880 if((*GNodeSetit)->getValue()==0.0){
00881 throw matvec::InvalidSample();
00882 }
00883 }
00884 else if(dynamic_cast<TransmissionSet*>(*GNodeSetit)){
00885 if((*GNodeSetit)->getValue()==0.0){
00886 throw matvec::InvalidSample();
00887 }
00888 }
00889 }
00890 }
00891
00892 void GNodeList::calculateTargetProb(void){
00893
00894
00895
00896 set< GNodeSet*>::iterator GNodeSetit;
00897 for (GNodeSetit=completeSetofGNsts.begin();GNodeSetit!=completeSetofGNsts.end();GNodeSetit++){
00898 if(dynamic_cast<TransitionSet*>(*GNodeSetit)){
00899
00900 logTarget += std::log((*GNodeSetit)->getTargetValue());
00901 }
00902 else {
00903
00904 logTarget += std::log((*GNodeSetit)->getValue());
00905
00906 }
00907
00908 }
00909 }
00910
00911
00912
00913 GNodeSet::GNodeSet(){
00914
00915
00916
00917 connectFlag = ULONG_MAX;
00918 numberOfCuts= 0;
00919 }
00920
00921
00922
00923
00924 bool GNodeSet::incr(void){
00925
00926
00927
00928
00929 GNodeSet::iterator iter;
00930 for(iter=begin();iter!=end();iter++) {
00931 if((*iter)->sampled) continue;
00932 if((*iter)->incr()) return 1;
00933 }
00934 return 0;
00935 }
00936
00937
00938
00939
00940
00941 void GNodeSet::reset(void) {
00942
00943
00944
00945 GNodeSet::iterator iter;
00946 if(empty())
00947 return;
00948 for(iter = begin();iter != end();iter++) {
00949 if((*iter)->sampled) continue;
00950 (*iter)->reset(0);
00951 }
00952 }
00953
00954
00955
00956
00957 void GNodeSet::attachMeToMyGnodes(void){
00958
00959
00960
00961 GNodeSet::iterator iter;
00962 for(iter = begin();iter != end();iter++) {
00963 (*iter)->SetofGNsts.insert(this);
00964 }
00965 }
00966
00967
00968
00969
00970 void GNodeSet::display(void){
00971 GNodeSet::iterator it;
00972 cout << "(";
00973 for (it=begin();it!=end();it++){
00974 cout << (*it)->id <<" ";
00975 }
00976 cout << ") ";
00977 }
00978
00979
00980
00981 bool GNode::isMyNeighbor(GNode* refGNode){
00982
00983
00984
00985 set< GNodeSet*>::iterator myGNodeSetit;
00986 GNodeSet::iterator setit;
00987 for (myGNodeSetit=SetofGNsts.begin();myGNodeSetit!=SetofGNsts.end();myGNodeSetit++){
00988 for (setit=(*myGNodeSetit)->begin();setit!=(*myGNodeSetit)->end();setit++){
00989 if((*setit)->id==refGNode->id){
00990 return true;
00991 }
00992 }
00993 }
00994 return false;
00995 }
00996
00997
00998
00999
01000
01001
01002 CutSet* GNode::makeNeighSet(void){
01003
01004
01005
01006 set< GNodeSet*>::iterator myGNodeSetit;
01007 GNodeSet::iterator setit;
01008 CutSet* neighSet = new CutSet;
01009 for (myGNodeSetit=SetofGNsts.begin();myGNodeSetit!=SetofGNsts.end();myGNodeSetit++){
01010 for (setit=(*myGNodeSetit)->begin();setit!=(*myGNodeSetit)->end();setit++){
01011 neighSet->insert(*setit);
01012 }
01013 }
01014
01015 return neighSet;
01016 }
01017
01018
01019
01020
01021
01022 float GNode::getCutsetMagnitude(void){
01023
01024
01025
01026 GNodeSet::iterator setit;
01027 CutSet* newSet = makeNeighSet();
01028 newSet->erase(this);
01029 double mag=1.0;
01030 for (setit=newSet->begin();setit!=newSet->end();setit++){
01031 mag *= (*setit)->sampled ? 1 : (*setit)->getWeight();
01032 }
01033
01034 delete newSet;
01035 return mag;
01036 }
01037
01038
01039
01040
01041
01042 void GNode::updateMysets(void){
01043
01044
01045
01046 set< GNodeSet*>::iterator myGNodeSetit;
01047 GNodeSet::iterator setit;
01048 CutSet* newSet = makeNeighSet();
01049 newSet->erase(this);
01050 gNodeListPtr->completeSetofCutSets.insert(newSet);
01051 generatedSet = newSet;
01052 for (myGNodeSetit=SetofGNsts.begin();myGNodeSetit!=SetofGNsts.end();myGNodeSetit++){
01053 for (setit=(*myGNodeSetit)->begin();setit!=(*myGNodeSetit)->end();setit++){
01054 if(*setit!=this){
01055 (*setit)->SetofGNsts.erase(*myGNodeSetit);
01056 }
01057 }
01058 }
01059 for (setit=newSet->begin();setit!=newSet->end();setit++){
01060 (*setit)->SetofGNsts.insert(newSet);
01061 }
01062 }
01063
01064
01065
01066
01067
01068
01069 void GNode::peel() {
01070
01071
01072
01073 CutSet* tempSet = makeNeighSet();
01074 tempSet->setKeyMultiplicationCode();
01075 generatedSet->setKeyMultiplicationCode();
01076 gNodeListPtr->completeSetofCutSets.insert(tempSet);
01077
01078 set< GNodeSet*>::iterator myGNodeSetit;
01079 myGNodeSetit = SetofGNsts.begin();
01080 *tempSet = *myGNodeSetit;
01081 for (myGNodeSetit++;myGNodeSetit!=SetofGNsts.end();myGNodeSetit++){
01082 *tempSet *= *myGNodeSetit;
01083 }
01084 *generatedSet+= tempSet;
01085
01086
01087
01088
01089 delete tempSet;
01090 gNodeListPtr->completeSetofCutSets.erase(tempSet);
01091 }
01092
01093
01094
01095
01096 void GNode::reComputeGNode(void) {
01097
01098
01099
01100
01101
01102
01103 CutSet* tempSet = makeNeighSet();
01104 tempSet->setKeyMultiplicationCode();
01105
01106 gNodeListPtr->completeSetofCutSets.insert(tempSet);
01107 GNodeSet::iterator setit;
01108 CutSet::iterator cutSetit;
01109 CutSet myGNodeProbs;
01110 myGNodeProbs.insert(this);
01111 myGNodeProbs.setKeyMultiplicationCode();
01112 set< GNodeSet*>::iterator myGNodeSetit;
01113 myGNodeSetit = SetofGNsts.begin();
01114 *tempSet = *myGNodeSetit;
01115 for (myGNodeSetit++;myGNodeSetit!=SetofGNsts.end();myGNodeSetit++){
01116 *tempSet *= *myGNodeSetit;
01117 }
01118 myGNodeProbs += tempSet;
01119 delete tempSet;
01120 gNodeListPtr->completeSetofCutSets.erase(tempSet);
01121 myGNodeProbs.normalize();
01122 myGNodeProbs.reset();
01123 double oldProb = myGNodeProbs.getOldValue();
01124 if(oldProb==0) cout << "Zero prob when recalculating value for: "<< id << endl;
01125 GNodeList::logOldProposal += std::log(oldProb);
01126 int oldState = getOldState();
01127 reset(oldState);
01128 sampled = true;
01129
01130
01131
01132
01133
01134 }
01135
01136 void GNode::reverseSampleGNode(void) {
01137
01138
01139
01140
01141 try{
01142 CutSet* tempSet = makeNeighSet();
01143 tempSet->setKeyMultiplicationCode();
01144
01145 gNodeListPtr->completeSetofCutSets.insert(tempSet);
01146 GNodeSet::iterator setit;
01147 CutSet::iterator cutSetit;
01148 CutSet myGNodeProbs;
01149 myGNodeProbs.insert(this);
01150 myGNodeProbs.setKeyMultiplicationCode();
01151 set< GNodeSet*>::iterator myGNodeSetit;
01152 myGNodeSetit = SetofGNsts.begin();
01153 *tempSet = *myGNodeSetit;
01154 for (myGNodeSetit++;myGNodeSetit!=SetofGNsts.end();myGNodeSetit++){
01155 *tempSet *= *myGNodeSetit;
01156 }
01157 myGNodeProbs += tempSet;
01158 delete tempSet;
01159 gNodeListPtr->completeSetofCutSets.erase(tempSet);
01160 myGNodeProbs.normalize();
01161 double u = ranf();
01162 double sum = 0.0;
01163 myGNodeProbs.reset();
01164 unsigned sampledState=0;
01165 do{
01166 double tempProb = myGNodeProbs.getValue();
01167 sum+= tempProb;
01168 if (u<sum){
01169 reset(sampledState);
01170 sampled = true;
01171 GNodeList::logProposal += std::log(tempProb);
01172
01173
01174
01175
01176
01177
01178 return;
01179 }
01180 sampledState++;
01181 } while(incr());
01182 }
01183 catch (...){
01184 cout << "in reverse sample\n";
01185 }
01186 }
01187
01188
01189
01190
01191 void GNode::sampleGNode(void) {
01192
01193
01194
01195
01196 CutSet myBCutSet = calcMyBCutSet();
01197 GNodeSet* myBCutSetPtr = &myBCutSet;
01198 CutSet* tempSet = makeNeighSet();
01199 tempSet->setKeyMultiplicationCode();
01200 gNodeListPtr->completeSetofCutSets.insert(tempSet);
01201 GNodeSet::iterator setit;
01202 CutSet::iterator cutSetit;
01203 CutSet myGNodeProbs;
01204 myGNodeProbs.insert(this);
01205 myGNodeProbs.setKeyMultiplicationCode();
01206 set< GNodeSet*>::iterator myGNodeSetit;
01207 myGNodeSetit = SetofGNsts.begin();
01208 *tempSet = *myGNodeSetit;
01209 for (myGNodeSetit++;myGNodeSetit!=SetofGNsts.end();myGNodeSetit++){
01210 *tempSet *= *myGNodeSetit;
01211 }
01212 *tempSet *= myBCutSetPtr;
01213 myGNodeProbs += tempSet;
01214 delete tempSet;
01215 gNodeListPtr->completeSetofCutSets.erase(tempSet);
01216 myGNodeProbs.normalize();
01217 double u = ranf();
01218 double sum = 0.0;
01219 myGNodeProbs.reset();
01220 unsigned sampledState=0;
01221 do{
01222 double tempProb = myGNodeProbs.getValue();
01223 sum+= tempProb;
01224 if (u<sum){
01225 reset(sampledState);
01226 sampled = true;
01227 GNodeList::logProposal += std::log(tempProb);
01228
01229 return;
01230 }
01231 sampledState++;
01232 } while(incr());
01233 }
01234
01235
01236
01237
01238 CutSet GNode::calcMyBCutSet(void) {
01239
01240
01241
01242 CutSet myBCutSet;
01243 if(generatedSet->size()==0){
01244 myBCutSet.setKeyMultiplicationCode();
01245 myBCutSet.putValue(1.0);
01246 return myBCutSet;
01247 }
01248 else {
01249 GNode* nextGNodePtr = generatedSet->getLocation();
01250 myBCutSet = nextGNodePtr->calcBCutSetForPrevGNode(generatedSet);
01251 return myBCutSet;
01252 }
01253 }
01254
01255
01256
01257
01258
01259 CutSet GNode::calcBCutSetForPrevGNode(CutSet* FCutSetPrevGNode) {
01260
01261
01262
01263 CutSet myBCutSet = calcMyBCutSet();
01264 GNodeSet* myBCutSetPtr = &myBCutSet;
01265 CutSet* tempSet = makeNeighSet();
01266 tempSet->setKeyMultiplicationCode();
01267 gNodeListPtr->completeSetofCutSets.insert(tempSet);
01268 GNodeSet::iterator setit;
01269 CutSet BCutSet;
01270 for (setit=FCutSetPrevGNode->begin();setit!=FCutSetPrevGNode->end();setit++){
01271 BCutSet.insert(*setit);
01272 }
01273 BCutSet.setKeyMultiplicationCode();
01274 set< GNodeSet*>::iterator myGNodeSetit;
01275 myGNodeSetit = SetofGNsts.begin();
01276 if((*myGNodeSetit)==FCutSetPrevGNode){
01277 myGNodeSetit = SetofGNsts.begin()++;
01278 }
01279 *tempSet = *myGNodeSetit;
01280 for (myGNodeSetit++;myGNodeSetit!=SetofGNsts.end();myGNodeSetit++){
01281 if((*myGNodeSetit)!=FCutSetPrevGNode){
01282 *tempSet *= *myGNodeSetit;
01283 }
01284 }
01285 *tempSet *= myBCutSetPtr;
01286 BCutSet += tempSet;
01287 delete tempSet;
01288 gNodeListPtr->completeSetofCutSets.erase(tempSet);
01289 return BCutSet;
01290 }
01291
01292
01293
01294
01295 GNode::GNode(){
01296 generatedSet = 0;
01297 }
01298
01299 void GNode::release(void){
01300
01301 }
01302
01303 void GNodeList::peelOrderCutAndSample(unsigned maxCutSetSize){
01304
01305
01306
01307 unsigned sampledCount = 0;
01308 GNodeList::reverse_iterator it;
01309 setGNodeSampleFlags();
01310 sampleGNodePtr = peelAndCut(maxCutSetSize);
01311
01312
01313 while (sampleGNodePtr) {
01314 sampledCount++;
01315
01316
01317 sampleGNodePtr->sampleGNode();
01318 reinitGNodeList();
01319
01320 sampleGNodePtr = peelAndCut(maxCutSetSize);
01321 }
01322
01323
01324 for (it=rbegin();it!=rend();it++){
01325 if(!(*it)->sampled){
01326 (*it)->reverseSampleGNode();
01327 }
01328 }
01329 checkSample();
01330
01331 calculateTargetProb();
01332
01333
01334
01335 clearGNodeListForNextLocus();
01336 }
01337
01338
01339
01340
01341
01342 void GNodeList::setGNodeSampleFlags(void){
01343
01344
01345
01346 GNodeList::iterator it;
01347 for (it=begin();it!=end();it++){
01348 (*it)->sampled = false;
01349 }
01350 }
01351
01352
01353
01354
01355 void GNodeList::peelCutAndSample(unsigned maxCutSetSize){
01356
01357
01358
01359 unsigned sampledCount = 0;
01360 GNodeList::reverse_iterator it;
01361 setGNodeSampleFlags();
01362 if (GNodeSet::prior->chrom()[0].peelOrder.size()==size()){
01363 sampleGNodePtr = peelAndCutFast();
01364 }
01365 else{
01366
01367 sampleGNodePtr = peelAndCut(maxCutSetSize);
01368 }
01369
01370
01371
01372 while (sampleGNodePtr) {
01373 sampledCount++;
01374
01375
01376 sampleGNodePtr->sampleGNode();
01377 reinitGNodeList();
01378
01379 sampleGNodePtr = peelAndCut(maxCutSetSize);
01380 }
01381 cout << "Number of GNodes sampled to break loops = " << sampledCount << endl;
01382
01383 for (it=rbegin();it!=rend();it++){
01384 if(!(*it)->sampled){
01385 (*it)->reverseSampleGNode();
01386 }
01387 }
01388 checkSample();
01389
01390 calculateTargetProb();
01391
01392
01393
01394 clearGNodeListForNextLocus();
01395 }
01396
01397
01398
01399
01400 }