Commit 7f982ea62aaac9de6a72455eb7e43ad484908594
1 parent
c643e466ce
Exists in
master
Updated MyOrder.cpp. So it can calculate factorial of 100.
Showing
1 changed file
with
115 additions
and
86 deletions
 
Show diff stats
MyOrder.cpp
| ... | ... | @@ -10,15 +10,23 @@ | 
| 10 | 10 | #include <boost/math/special_functions.hpp> | 
| 11 | 11 | #include <boost/lexical_cast.hpp> | 
| 12 | 12 | #include <boost/algorithm/string/replace.hpp> | 
| 13 | +#include <boost/multiprecision/cpp_int.hpp> | |
| 13 | 14 | |
| 14 | 15 | #include <stdio.h> | 
| 15 | 16 | #include <math.h> | 
| 16 | 17 | #include <algorithm> // std::find | 
| 17 | 18 | #include <map> | 
| 18 | 19 | #include <iterator> | 
| 19 | -using namespace std; | |
| 20 | +#include <bits/stdc++.h> | |
| 21 | +#include <tuple> | |
| 20 | 22 | |
| 23 | +using namespace std; | |
| 21 | 24 | |
| 25 | +//Function for calculating the binomial coefficient | |
| 26 | +boost::multiprecision::cpp_int BinomialCoefficient(unsigned int n, unsigned int k) { | |
| 27 | + if (k == 0) { return 1; } | |
| 28 | + else { return (n * BinomialCoefficient(n - 1, k - 1)) / k; } | |
| 29 | +} | |
| 22 | 30 | struct compare { | 
| 23 | 31 | bool operator()(const std::string& first, const std::string& second) { | 
| 24 | 32 | if(first.size() == second.size()) | 
| ... | ... | @@ -105,6 +113,13 @@ void findAndReplaceAll(std::string & data, std::string toSearch, std::string rep | 
| 105 | 113 | } | 
| 106 | 114 | } | 
| 107 | 115 | |
| 116 | +string findMB(string structures, string variable){ | |
| 117 | + string MB; | |
| 118 | + | |
| 119 | + | |
| 120 | + return MB; | |
| 121 | +} | |
| 122 | + | |
| 108 | 123 | int main() { | 
| 109 | 124 | /* | 
| 110 | 125 | //TEMPORARY INPUT FILE | 
| ... | ... | @@ -225,15 +240,16 @@ int main() { | 
| 225 | 240 | for (int col = 0; col<COLS; col++) { | 
| 226 | 241 | file >> DAT[row][col]; // fill the row with col elements | 
| 227 | 242 | } | 
| 228 | - row++; // Keep track of actual row | |
| 243 | + row++; // Keep track of actual row | |
| 229 | 244 | } | 
| 230 | 245 | } | 
| 231 | 246 | else cout << "Unable to open file" << endl; | 
| 232 | 247 | file.close(); | 
| 248 | + DAT.erase(DAT.end()); | |
| 233 | 249 | |
| 234 | 250 | size_t totvars = DAT[1].size(); //column number | 
| 235 | 251 | size_t tottuples = DAT.size();//row number | 
| 236 | - | |
| 252 | + | |
| 237 | 253 | |
| 238 | 254 | |
| 239 | 255 | |
| ... | ... | @@ -282,6 +298,11 @@ int main() { | 
| 282 | 298 | std::cin >> PERCENT; | 
| 283 | 299 | std::cout << endl; | 
| 284 | 300 | |
| 301 | + string filepath; | |
| 302 | + std::cout << "What is the output file name?: "; | |
| 303 | + std::cin >> filepath; | |
| 304 | + std::cout << endl; | |
| 305 | + | |
| 285 | 306 | //Time that program begins | 
| 286 | 307 | time_t start = time(0); | 
| 287 | 308 | char* dt_start = ctime(&start); | 
| ... | ... | @@ -312,7 +333,7 @@ int main() { | 
| 312 | 333 | std::cout << endl; | 
| 313 | 334 | |
| 314 | 335 | //Total Families Ui,alpha for a particular variable in the order | 
| 315 | - vector <unsigned long long> families;//is vector, first element is the number of parentset for the first variabel...... | |
| 336 | + vector <boost::multiprecision::cpp_int> families; | |
| 316 | 337 | for (unsigned int i = 0; i < totvars; ++i) { | 
| 317 | 338 | int numparents = i; | 
| 318 | 339 | if (numparents == 0) { | 
| ... | ... | @@ -320,7 +341,7 @@ int main() { | 
| 320 | 341 | } | 
| 321 | 342 | else { | 
| 322 | 343 | |
| 323 | - unsigned long long numfams = 0; | |
| 344 | + boost::multiprecision::cpp_int numfams = 0; | |
| 324 | 345 | for (unsigned int j = 0; j <= i; ++j) { | 
| 325 | 346 | if (j <= maxparents) { | 
| 326 | 347 | unsigned long long jFactorial = 1; | 
| ... | ... | @@ -344,7 +365,7 @@ int main() { | 
| 344 | 365 | ijFactorial *= g; | 
| 345 | 366 | } | 
| 346 | 367 | } | 
| 347 | - numfams += (iFactorial) / (jFactorial * ijFactorial); | |
| 368 | + numfams += BinomialCoefficient(i,j); | |
| 348 | 369 | } | 
| 349 | 370 | else { | 
| 350 | 371 | break; | 
| ... | ... | @@ -354,7 +375,7 @@ int main() { | 
| 354 | 375 | } | 
| 355 | 376 | } | 
| 356 | 377 | |
| 357 | - | |
| 378 | + | |
| 358 | 379 | //How many parent combinations for each step? As well as there counts | 
| 359 | 380 | vector< vector <int> > ParentCombos; | 
| 360 | 381 | vector< vector <int> > fullNijkvector; | 
| ... | ... | @@ -364,7 +385,8 @@ int main() { | 
| 364 | 385 | if (i == 0) { | 
| 365 | 386 | vector <int> tmp,Nijkovercombos1; | 
| 366 | 387 | vector <string> tempstring; | 
| 367 | - tempstring.push_back("[0]"); | |
| 388 | +// tempstring.push_back("[0]"); | |
| 389 | + tempstring.push_back("[" + int_to_str(order[0])+ "]"); | |
| 368 | 390 | tmp.push_back(1); | 
| 369 | 391 | ParentCombos.push_back(tmp); | 
| 370 | 392 | //counting the amount of times that a value of the first variable in the order occurs | 
| ... | ... | @@ -387,7 +409,8 @@ int main() { | 
| 387 | 409 | else { | 
| 388 | 410 | vector <int> tmp,Nijkovercombos1; | 
| 389 | 411 | vector <string> tempstring; | 
| 390 | - string tempa = "[" + int_to_str(i) +"]"; | |
| 412 | +// string tempa = "[" + int_to_str(i) +"]"; | |
| 413 | + string tempa = "[" + int_to_str(order[i]) +"]"; | |
| 391 | 414 | tempstring.push_back(tempa); | 
| 392 | 415 | tmp.push_back(1); | 
| 393 | 416 | int numparnts = i; | 
| ... | ... | @@ -405,11 +428,12 @@ int main() { | 
| 405 | 428 | Nijkovercombos1.push_back(Nijk1); | 
| 406 | 429 | } | 
| 407 | 430 | fullNijkvector.push_back(Nijkovercombos1); | 
| 408 | - | |
| 431 | + | |
| 409 | 432 | //j representing the number of parents | 
| 410 | 433 | for (int it = 1; it <= numparnts; ++it) { | 
| 411 | 434 | //(333)Creating a vector that uses the right combination | 
| 412 | - double Nloopy = 0, NcolFactorial = 1, iFactorial = 1, NiFactorial = 1; | |
| 435 | + boost::multiprecision::cpp_int Nloopy = 0; | |
| 436 | + //, NcolFactorial = 1, iFactorial = 1, NiFactorial = 1; | |
| 413 | 437 | /*std::cout << "This is for " << numparnts << " choose " << it << endl; | 
| 414 | 438 | std::cout << "The iteration number is: " << it << endl;*/ | 
| 415 | 439 | //Accounting for the limit of parent quantity | 
| ... | ... | @@ -421,7 +445,7 @@ int main() { | 
| 421 | 445 | for (int p = 0; p < it; ++p) { | 
| 422 | 446 | NewMat[p] = 1; | 
| 423 | 447 | } | 
| 424 | - for (int g = 2; g <= numparnts; ++g) { | |
| 448 | + /*for (int g = 2; g <= numparnts; ++g) { | |
| 425 | 449 | NcolFactorial *= g; | 
| 426 | 450 | } | 
| 427 | 451 | for (int g = 2; g <= it; ++g) { | 
| ... | ... | @@ -429,9 +453,9 @@ int main() { | 
| 429 | 453 | } | 
| 430 | 454 | for (int g = 2; g <= (numparnts - it); ++g) { | 
| 431 | 455 | NiFactorial *= g; | 
| 432 | - } | |
| 456 | + }*/ | |
| 433 | 457 | //Nloopy represents the result of numparnts choose i e.g. numparnts choose 1 equals numparnts | 
| 434 | - Nloopy = NcolFactorial / (iFactorial * NiFactorial); | |
| 458 | + Nloopy = BinomialCoefficient(numparnts,it); | |
| 435 | 459 | for (int iNloopy = 0; iNloopy < Nloopy; ++iNloopy) { | 
| 436 | 460 | int combsparents = 1; | 
| 437 | 461 | vector <int> parsetv; | 
| ... | ... | @@ -445,13 +469,16 @@ int main() { | 
| 445 | 469 | |
| 446 | 470 | for (int par2 = 0; par2 < parsetv.size(); ++par2){ | 
| 447 | 471 | if(par2+1==parsetv.size()){ | 
| 448 | - tempstring2 = tempstring2 + int_to_str(parsetv[par2]); | |
| 472 | + // tempstring2 = tempstring2 + int_to_str(parsetv[par2]); | |
| 473 | + tempstring2 = tempstring2 + int_to_str(order[parsetv[par2]]); | |
| 449 | 474 | //tempstring2 = tempstring2 +","+"|" + int_to_str(i); | 
| 450 | - tempstring2 = "[" + int_to_str(i)+"|"+tempstring2 +"]"; | |
| 475 | + // tempstring2 = "[" + int_to_str(i)+"|"+tempstring2 +"]"; | |
| 476 | + tempstring2 = "[" + int_to_str(order[i])+"|"+tempstring2 +"]"; | |
| 451 | 477 | } | 
| 452 | 478 | else{ | 
| 453 | 479 | //tempstring2 = tempstring2 + int_to_str(parsetv[par2])+","; | 
| 454 | - tempstring2 = tempstring2 + int_to_str(parsetv[par2])+":"; | |
| 480 | +// tempstring2 = tempstring2 + int_to_str(parsetv[par2])+":"; | |
| 481 | + tempstring2 = tempstring2 + int_to_str(order[parsetv[par2]])+":"; | |
| 455 | 482 | } | 
| 456 | 483 | |
| 457 | 484 | |
| ... | ... | @@ -512,7 +539,7 @@ int main() { | 
| 512 | 539 | vector <int> hvect; | 
| 513 | 540 | //hvect tells us which variables are being considered always the last variable is being considered | 
| 514 | 541 | //e.g if ABC is our order and we are on i equals 1 then we are looking at relationships between A and B only | 
| 515 | - //continued: A is the only one that is either a parent or isn't a parent so hvect will be < 0 1 > | |
| 542 | + //continued: A is the only one that is either a parent or isn't a parent so hvect will be < 0 1 > | |
| 516 | 543 | //for A C hvect will be < 0 2 > | 
| 517 | 544 | for (int h = 0; h < i; ++h) { | 
| 518 | 545 | if (NewMat[h] == 1) { | 
| ... | ... | @@ -581,7 +608,7 @@ int main() { | 
| 581 | 608 | //Nijkovercombos displays data as follows | 
| 582 | 609 | //it starts with the smallest value for the last variable in hvect | 
| 583 | 610 | //and the largest values in the first n-1 variables in hvect | 
| 584 | - //max,max-1,max-2,max-3 e.g. 2, 1, 0, 2, 1, 0 | |
| 611 | + //max,max-1,max-2,max-3 e.g. 2, 1, 0, 2, 1, 0 | |
| 585 | 612 | //count,count,count,count e.g. 13, 2, 2, 3, 4, 10 | 
| 586 | 613 | Nijkovercombos.push_back(Nijk); | 
| 587 | 614 | //(666)Now that the values have been calculated find out what the next combination of variables should be | 
| ... | ... | @@ -619,7 +646,7 @@ int main() { | 
| 619 | 646 | //If all except one of the 1's are found in the last it - 1 columns | 
| 620 | 647 | for (int x = 0; x < numparnts; ++x) { | 
| 621 | 648 | if (((x <= (NxtOne + SumOnes3)) & (x > NxtOne)) | (x == (FrstOne + 1))) { | 
| 622 | - //If | |
| 649 | + //If | |
| 623 | 650 | NewMat[x] = 1; | 
| 624 | 651 | } | 
| 625 | 652 | else { | 
| ... | ... | @@ -630,7 +657,7 @@ int main() { | 
| 630 | 657 | else { | 
| 631 | 658 | for (int x = 0; x < numparnts; ++x) { | 
| 632 | 659 | if (((x <= (NxtOne + SumOnes3)) & (x > NxtOne)) | (x == FrstOne)) { | 
| 633 | - //If the position is that of the first 1 or it falls between the changed number one and the total | |
| 660 | + //If the position is that of the first 1 or it falls between the changed number one and the total | |
| 634 | 661 | //amount of ones that are on that side of the zero 10111 | 
| 635 | 662 | NewMat[x] = 1; | 
| 636 | 663 | } | 
| ... | ... | @@ -773,7 +800,7 @@ int main() { | 
| 773 | 800 | |
| 774 | 801 | //Calculate sumovUialpha based on the logsumexp concept | 
| 775 | 802 | if (Uialpha + 1 == families[varinorder]) { | 
| 776 | - | |
| 803 | + | |
| 777 | 804 | for (size_t que = 0; que < vec2ndlastgamma.size(); ++que) { | 
| 778 | 805 | //change the value of maxseclastgamma if new value is larger than the previous value | 
| 779 | 806 | if (que == 0) { | 
| ... | ... | @@ -791,7 +818,7 @@ int main() { | 
| 791 | 818 | //add info on parent set scores for each variable to this vector of vectors | 
| 792 | 819 | vecvarparset.push_back(vec2ndlastgamma); | 
| 793 | 820 | } | 
| 794 | - | |
| 821 | + | |
| 795 | 822 | /*std::cout << endl; | 
| 796 | 823 | std::cout << seclastgamma; | 
| 797 | 824 | std::cout << endl;*/ | 
| ... | ... | @@ -872,85 +899,58 @@ int main() { | 
| 872 | 899 | |
| 873 | 900 | sort(sortedStru.begin(),sortedStru.end(),compareDe); | 
| 874 | 901 | |
| 902 | + vector <double> strP; | |
| 903 | + double s = exp(bestScore); | |
| 875 | 904 | |
| 876 | - | |
| 877 | -/* for (unsigned l = 1; l< parSetScoreSorted.size(); ++l){ //l means each variable | |
| 878 | - for (unsigned m = contl; m < parSetScoreSorted[l].size(); ++m){ //m means the number of parents sets | |
| 879 | - contl =m; | |
| 880 | - vector < pair <string, double > > delta; // store the different of the highest score and the second highest score | |
| 881 | - for (unsigned i = l; i < parSetScoreSorted.size(); ++i){ | |
| 882 | - map <double, string> :: iterator itr0, itr1; | |
| 883 | - double tempDeltaS; | |
| 884 | - string tempDeltaL; | |
| 885 | - itr0 = parSetScoreSorted[i].begin(); | |
| 886 | - itr1 = itr0; | |
| 887 | - for (int kr = 0; kr < contl; ++kr){ | |
| 888 | - itr1 = itr0++; | |
| 889 | - } | |
| 890 | - tempDeltaS = (itr1->first)-(itr0->first); | |
| 891 | - tempDeltaL = int_to_str(i); | |
| 892 | - delta.push_back(make_pair(tempDeltaL, tempDeltaS)); | |
| 893 | - } | |
| 894 | - | |
| 895 | - sort(delta.begin(),delta.end(),compareI); | |
| 896 | - | |
| 897 | - double const stopLimit = PERCENT; | |
| 898 | - double tempbeforeS = bestStrScore.first, temafterS; | |
| 899 | - | |
| 900 | - for (unsigned i = 0; i < delta.size(); ++i){ | |
| 901 | - pair <double, string > temppair; | |
| 902 | - double tempLime; | |
| 903 | - int ind = str_to_int(delta[i].first); | |
| 904 | - string s = parSetScoreSorted[ind].begin()->second; | |
| 905 | - string sRep = (++parSetScoreSorted[ind].begin())->second; | |
| 906 | - temppair = bestStrScore; | |
| 907 | - findAndReplaceAll(temppair.second, s, sRep); | |
| 908 | - temppair.first = temppair.first - delta[i].second; | |
| 909 | - | |
| 910 | - temafterS = logAB(tempbeforeS, temppair.first); | |
| 911 | - | |
| 912 | - tempLime = persentageXofY(temafterS, tempbeforeS) ; | |
| 913 | - | |
| 914 | - tempbeforeS = temafterS; | |
| 915 | - | |
| 916 | - if(tempLime > stopLimit){ | |
| 917 | - goto finish; | |
| 918 | - } | |
| 919 | - | |
| 920 | - sortedStru.push_back(temppair); | |
| 921 | - | |
| 922 | - // std::cout << ind << " "<< s << " "<< sRep << " "<< temppair.first << " " << temppair.second <<endl; | |
| 923 | - // std::cout << temppair.first << " " << temppair.second <<endl; | |
| 924 | - // std::cout << std::endl; | |
| 925 | - | |
| 926 | - } | |
| 927 | - | |
| 928 | - } | |
| 905 | + for(unsigned i=0; i< sortedStru.size(); ++i ){ | |
| 906 | + double s0 = s; | |
| 907 | + s = s + exp(sortedStru[i].first); | |
| 908 | + double te = s0/s*100; | |
| 909 | + strP.push_back(te); | |
| 929 | 910 | |
| 930 | 911 | } | 
| 931 | 912 | |
| 932 | - finish:*/ | |
| 933 | - | |
| 913 | +/* double fi = s/exp(finlogscore)*100; | |
| 914 | + strP.push_back(fi);*/ | |
| 934 | 915 | |
| 935 | 916 | std::cout << std::endl; | 
| 936 | 917 | std::cout << "Total Score: "<< boost::lexical_cast<string>(finlogscore) << std::endl; | 
| 937 | 918 | std::cout << std::endl; | 
| 938 | 919 | |
| 939 | 920 | |
| 921 | + vector < pair <double, string> > bestorders; | |
| 922 | + double struPer = 0; | |
| 923 | + | |
| 940 | 924 | cout << "Best several structures are:" << endl; | 
| 941 | 925 | cout << bestScore << " : " << bestLable << endl; | 
| 942 | 926 | |
| 927 | + bestorders.push_back(make_pair(bestScore, bestLable)); | |
| 928 | + struPer = struPer + exp(bestScore); | |
| 929 | + | |
| 943 | 930 | for (unsigned i=0; i< sortedStru.size(); ++i ) | 
| 944 | 931 | { | 
| 945 | 932 | cout << sortedStru[i].first << " : " << sortedStru[i].second << endl; | 
| 933 | + bestorders.push_back(make_pair(sortedStru[i].first, sortedStru[i].second)); | |
| 934 | + struPer = struPer + exp(sortedStru[i].first); | |
| 935 | + if(strP[i+1] > PERCENT){ | |
| 936 | + break; | |
| 937 | + } | |
| 938 | + } | |
| 939 | + | |
| 940 | +/* cout << "Best several structures are:" << endl; | |
| 941 | + cout << bestScore << " : " << bestLable << " " << endl; | |
| 942 | + | |
| 943 | + for (unsigned i=0; i< sortedStru.size(); ++i ) | |
| 944 | + { | |
| 945 | + cout << sortedStru[i].first << " : " << sortedStru[i].second << " "<< endl; | |
| 946 | 946 | } | 
| 947 | 947 | |
| 948 | 948 | std::cout << std::endl; | 
| 949 | - std::cout << std::endl; | |
| 949 | + std::cout << std::endl;*/ | |
| 950 | 950 | |
| 951 | - for(unsigned i=0; i< parSetScoreSorted.size(); ++i){ | |
| 951 | +/* for(unsigned i=0; i< parSetScoreSorted.size(); ++i){ | |
| 952 | 952 | map <double, string> :: iterator itr; | 
| 953 | - std::cout << "For variable "<< i <<":"<< endl; | |
| 953 | + std::cout << "For variable "<< order[i] <<":"<< endl; | |
| 954 | 954 | for (itr = parSetScoreSorted[i].begin(); itr != parSetScoreSorted[i].end(); ++itr) | 
| 955 | 955 | { | 
| 956 | 956 | cout << itr->second << " : " << itr->first << "; "; | 
| ... | ... | @@ -958,23 +958,50 @@ int main() { | 
| 958 | 958 | cout << endl; | 
| 959 | 959 | cout << endl; | 
| 960 | 960 | |
| 961 | + }*/ | |
| 962 | + | |
| 963 | + | |
| 964 | + string orderstring; | |
| 965 | + for (unsigned i=0; i< order.size(); ++i){ | |
| 966 | + orderstring.append(int_to_str(order[i])+" "); | |
| 961 | 967 | } | 
| 962 | 968 | |
| 969 | + ofstream myfile; | |
| 970 | + myfile.open( filepath.c_str()); | |
| 963 | 971 | |
| 964 | -/* ofstream myfile; | |
| 965 | - myfile.open("/home/zgong001/Documents/SprinklerDataset/bestStructure.txt"); | |
| 966 | 972 | if (myfile.is_open()) | 
| 967 | 973 | { | 
| 968 | - myfile << bestLable << " : " << bestScore << sortedStru.size(); | |
| 974 | + myfile << "The order is:" << orderstring << " " << boost::lexical_cast<string>(finlogscore); | |
| 975 | + myfile << "\n"; | |
| 976 | + myfile << bestLable << " " << bestScore << " " << exp(bestScore) << " "<< (exp(bestScore)/struPer)*100; | |
| 969 | 977 | myfile << "\n"; | 
| 970 | 978 | |
| 971 | 979 | for(unsigned i=0; i< sortedStru.size(); ++i){ | 
| 972 | - myfile << sortedStru[i].second << " : " << sortedStru[i].first; | |
| 980 | + myfile << sortedStru[i].second << " " << sortedStru[i].first << " " << exp(sortedStru[i].first) << " "<< (exp(sortedStru[i].first)/struPer)*100; | |
| 973 | 981 | myfile << "\n"; | 
| 982 | + if(strP[i+1] > PERCENT){ | |
| 983 | + break; | |
| 984 | + } | |
| 974 | 985 | } | 
| 975 | 986 | } | 
| 976 | 987 | else cout << "Unable to open file"; | 
| 977 | - myfile.close();*/ | |
| 988 | + myfile.close(); | |
| 989 | + | |
| 990 | +/* ofstream myfile; | |
| 991 | + myfile.open("/home/zgong001/Documents/Alarm/D50S9v2/D50S9v2RO.txt"); | |
| 992 | + if (myfile.is_open()) | |
| 993 | + { | |
| 994 | + for(unsigned i=0; i< parSetScoreSorted.size(); ++i){ | |
| 995 | + map <double, string> :: iterator itr; | |
| 996 | + for (itr = parSetScoreSorted[i].begin(); itr != parSetScoreSorted[i].end(); ++itr){ | |
| 997 | + myfile << itr->second << " : " << itr->first << "; " ; | |
| 998 | + } | |
| 999 | + myfile << "\n"; | |
| 1000 | + | |
| 1001 | + } | |
| 1002 | + } | |
| 1003 | + else cout << "Unable to open file"; | |
| 1004 | + myfile.close();*/ | |
| 978 | 1005 | |
| 979 | 1006 | |
| 980 | 1007 | //time after completion | 
| ... | ... | @@ -991,3 +1018,5 @@ int main() { | 
| 991 | 1018 | std::cin.get(); | 
| 992 | 1019 | return 0; | 
| 993 | 1020 | } | 
| 1021 | + | |
| 1022 | + |