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 <ext/hash_map>
00030 #include <map>
00031 #include <set>
00032 #include "safe_vectors.h"
00033 #include "gnodederived.h"
00034 #include "gnodesetderived.h"
00035 #include "gnodestuff.h"
00036
00037 namespace matvec {
00038
00039 inline int CutSet::getOldKey(void) {
00040
00041
00042
00043 CutSet::iterator it;
00044 int key = 0;
00045 CutSet::iterator beginIt = begin();
00046 CutSet::iterator endIt = end();
00047 unsigned i=0;
00048 for (it=beginIt;it!=endIt;it++){
00049 key += ((*it)->getOldState())*keyMultiplicationCode[i];
00050 i++;
00051 }
00052 return key;
00053 }
00054
00055
00056
00057
00058
00059 double CutSet::getOldValue(void) {
00060
00061
00062
00063 int key = getOldKey();
00064 return valueVector[key];
00065 }
00066
00067
00068
00069
00070 inline int CutSet::getKey(void) {
00071
00072
00073
00074 CutSet::iterator it;
00075 int key = 0;
00076 CutSet::iterator beginIt = begin();
00077 CutSet::iterator endIt = end();
00078 unsigned i=0;
00079 for (it=beginIt;it!=endIt;it++){
00080 key += ((*it)->getState())*keyMultiplicationCode[i];
00081 i++;
00082 }
00083 return key;
00084 }
00085
00086
00087
00088
00089
00090 double CutSet::getValue(void) {
00091
00092
00093
00094 int key = getKey();
00095 if(key > valueVector.size()){
00096 cout << "key > size in CutSet::getValue\n";
00097 exit(1);
00098 }
00099 return valueVector[key];
00100 }
00101
00102
00103
00104
00105 void CutSet::putValue(double x) {
00106
00107
00108
00109 int key = getKey();
00110 if(key > valueVector.size()){
00111 cout << "key > size in CutSet::putValue\n";
00112 exit(1);
00113 }
00114 valueVector[key] = x;
00115 }
00116
00117
00118
00119
00120 void CutSet::setKeyMultiplicationCode(void){
00121
00122
00123
00124 unsigned mySize = (size()) ? size():1;
00125 keyMultiplicationCode.resize(mySize);
00126 CutSet::iterator it;
00127 CutSet::iterator beginIt = begin();
00128 CutSet::iterator endIt = end();
00129 unsigned state = 1;
00130 unsigned i = 0;
00131 for (it=beginIt;it!=endIt;it++){
00132 keyMultiplicationCode[i] = (*it)->sampled ? 0 : state;
00133 i++;
00134 state *= (*it)->sampled ? 1 : (*it)->getWeight();
00135 }
00136 valueVector.resize(state,0.0);
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 GNode* CutSet::getLocation(void){
00149
00150
00151
00152 CutSet::iterator it;
00153 set<GNodeSet*>::iterator itFound;
00154 CutSet::iterator beginIt = begin();
00155 CutSet::iterator endIt = end();
00156 for (it=beginIt;it!=endIt;it++){
00157 itFound = (*it)->SetofGNsts.find(this);
00158 if(itFound!=(*it)->SetofGNsts.end()){
00159 return *it;
00160 }
00161 }
00162 }
00163
00164 void CutSet::normalize(){
00165
00166
00167
00168 double sum = 0.0;
00169 double temp= 1.0;
00170 for(unsigned i=0;i!=valueVector.size();i++){
00171
00172 sum+=valueVector[i];
00173 }
00174 if(sum!=0.0){
00175 temp = 1/sum;
00176 }
00177
00178 if(sum>1e-20){
00179
00180
00181 for(unsigned i=0;i!=valueVector.size();i++){
00182 valueVector[i]*=temp;
00183 }
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 }
00194 else if(sum==0.0){
00195 throw matvec::InvalidSample();
00196 }
00197 else{
00198 cout << "Sum used for scaling = " << sum << endl;
00199 CutSet::iterator itC;
00200 cout << "CutSet Members: [";
00201 for (itC=begin();itC!=end();itC++){
00202 cout << (*itC)->id << " ";
00203 }
00204 cout << "]" << endl;
00205 displayValues();
00206 cerr << " Need scaling in CutSet::normalize(), sum = " << sum << endl;
00207 exit(1);
00208 }
00209 }
00210
00211 void CutSet::displayValues(void){
00212
00213
00214
00215 for(unsigned i=0;i!=valueVector.size();i++){
00216 cout << valueVector[i] << endl;
00217 }
00218 }
00219
00220
00221
00222
00223 void CutSet::replaceMeWith(CutSet& A){
00224
00225
00226
00227 GNodeSet::iterator it;
00228 connectFlag = A.connectFlag;
00229 numberOfCuts = A.numberOfCuts;
00230 prior = A.prior;
00231 currentLocus = A.currentLocus;
00232 clear();
00233 for (it=A.begin();it!=A.end();it++){
00234 insert(*it);
00235 }
00236 keyMultiplicationCode = A.keyMultiplicationCode;
00237 valueVector = A.valueVector;
00238 }
00239
00240 CutSet& CutSet::operator= (GNodeSet* A){
00241
00242
00243
00244 reset();
00245 do{
00246 double Atemp = A->getValue();
00247 (*this).putValue(Atemp);
00248 } while(incr());
00249 return *this;
00250 }
00251
00252
00253
00254
00255
00256 CutSet& CutSet::operator+= (GNodeSet* A){
00257
00258
00259
00260 A->reset();
00261 do{
00262
00263 unsigned key = getKey();
00264 double Atemp = A->getValue();
00265
00266 valueVector[key] += Atemp;
00267 } while(A->incr());
00268
00269 normalize();
00270 return *this;
00271 }
00272
00273
00274
00275
00276
00277 CutSet& CutSet::operator*= (GNodeSet* A){
00278
00279
00280
00281 reset();
00282 do{
00283 unsigned key = getKey();
00284
00285 double Atemp = A->getValue();
00286
00287 valueVector[key] *= Atemp;
00288 } while(incr());
00289 normalize();
00290 return *this;
00291 }
00292
00293
00294
00295
00296
00297 bool AlleleStateNode::incr(void){
00298
00299
00300
00301
00302 alleleState++;
00303 if (alleleState==alleleStateVector.size()){
00304 alleleState=0;
00305 return 0;
00306 }
00307 else {
00308 return 1;
00309 }
00310 }
00311
00312
00313
00314
00315
00316 bool AlleleOriginNode::incr(void){
00317
00318
00319
00320
00321 alleleOrigin++;
00322 if (alleleOrigin==alleleOriginVector.size()){
00323 alleleOrigin=0;
00324 return 0;
00325 }
00326 else {
00327 return 1;
00328 }
00329 }
00330
00331
00332
00333
00334
00335 bool GenotypeNode::incr(){
00336
00337
00338
00339
00340 genotypeState++;
00341 if (genotypeState==genotypeVector.size()){
00342 genotypeState=0;
00343 return 0;
00344 }
00345 else {
00346 return 1;
00347 }
00348 }
00349
00350
00351
00352
00353 }
00354
00355