diff options
| author | ziejd2 | 2017-09-14 15:39:41 -0500 |
|---|---|---|
| committer | ziejd2 | 2017-09-14 15:57:50 -0500 |
| commit | c4f926438dcb8abe805e910399940f79ff643c4b (patch) | |
| tree | 3146d05ada5cf4b48d9bdd16c1baa498e8df7192 /sourcecodes/k-best/src/arcToNet.cc | |
| parent | 57ebf49403b75dcf8482d174b59f7fd2a961d98e (diff) | |
| download | BNW-c4f926438dcb8abe805e910399940f79ff643c4b.tar.gz | |
Add files via upload
Diffstat (limited to 'sourcecodes/k-best/src/arcToNet.cc')
| -rw-r--r-- | sourcecodes/k-best/src/arcToNet.cc | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/sourcecodes/k-best/src/arcToNet.cc b/sourcecodes/k-best/src/arcToNet.cc new file mode 100644 index 00000000..b071baab --- /dev/null +++ b/sourcecodes/k-best/src/arcToNet.cc @@ -0,0 +1,233 @@ +#include <iostream> +#include <fstream> +#include <iomanip> +//#include "varpar.h" +#include <stdlib.h> +#include <math.h> +#include <list> +#include <stdio.h> +#include <vector> +//#include "cfg.h" +#include <string.h> +#include <cmath> +//HR +//#define EPSILON 0.001 +#define EPSILON 0.00001 + + +//HR: Add for hash_set +#if __GNUC__ < 3 && __GNUC__ >= 2 && __GNUC_MINOR__ >= 95 +# include <hash_set> +# include <functional> +# define gnu_namespace std +#elif __GNUC__ >= 3 +# include <ext/hash_set> +# if __GNUC_MINOR__ == 0 +# include <functional> +# define gnu_namespace std +# else +# include <ext/functional> +# define gnu_namespace __gnu_cxx +# endif +#else +# include <hash_set.h> +# include <functional.h> +# define gnu_namespace std +#endif +using namespace gnu_namespace; +#include <set> +// + + +using namespace std; + + +//HR: add from Engine.h in BayesNw +#define MARK 9e99 +#define LOG_ZERO -1e101 +//#define LOGMINUS_NEW(logA, logB) if(logA == MARK) logA = logB; else if (logA == LOG_ZERO) logA = logB; else if (logB == LOG_ZERO) logA = logA; else logA = logA + log(1-exp(logB-logA)); +//HR: add from UpdateHR.h in BayesNw to deal with the problem in sum = 0 in comp_post() +//call by reference to the original value +//the log sum result is stored in logA +//may change double into long double; no, use double +void logAddComp(double & logA, double & logB){ + if(logA == MARK){ + logA = logB; + } + else if (logA == LOG_ZERO){ + logA = logB; + } + else if(logB == MARK){ + logA = logA; + } + else if(logB == LOG_ZERO){ + logA = logA; + } + //Nither logA nor logB is MARK/LOG_ZERO + else{ + //1 + if(logA < 0 && logB < 0 ){ + logA = logA + log( 1 + exp(logB-logA) ); + } + //2 + else if(logA > 0 && logB > 0){ + //always make exp(.): . > 0 + //2.1 + if(logA >= logB){ + logA = -( -logA + log( 1 + exp(-logB+logA) ) ); + } + //2.2 + else{ + logA = -( -logB + log( 1 + exp(-logA+logB) ) ); + } + + } + //3 + else if(logA < 0 && logB > 0){ + //3.1 + if(logA + logB > 0){ + //logA = logA + log( 1 - exp(-logB-logA) ); + logA = -logB + log( exp(logA + logB) - 1 ); + + } + //3.2 + else if(logA + logB < 0){ + logA = -( logA + log( exp(-logB-logA) - 1) ); + } + //3.3 + else{ + logA = LOG_ZERO; + } + } + //4 + else if(logA > 0 && logB < 0){ + //4.1 + if(logA + logB > 0){ + logA = -logA + log( exp(logB+logA) - 1); + } + //4.2 + else if(logA + logB < 0){ + //logA = -( -logA + log(1 - exp(logB+logA)) ); + logA = -( logB + log( exp(-logA-logB) - 1) ); + + } + //4.3 + else{ + logA = LOG_ZERO; + } + } + + } + +} + + +//HR: Add +//Will be used for checking edges-based feasure for Engineer in BayesNW +void arcToNet(char * inFeasFileName, char* outFeasFileName){ + + cout << "inFeasFileName: " << inFeasFileName << endl; + + cout << "outFeasFileName: " << outFeasFileName << endl; + + int MAX_VAR_NUM = 32; + + int inFeatureEdges[MAX_VAR_NUM]; + for(int i = 0; i < MAX_VAR_NUM; i++){ + inFeatureEdges[i] = 0; + } + + string str; + str.assign(inFeasFileName); + + + FILE* fp = fopen(str.c_str(), "r"); + + int fromNode; + int toNode; + //int i=0; + while(!feof(fp)){ + char c; + fromNode = -1; + toNode = -1; + + fscanf(fp,"%d",&fromNode); + fscanf(fp,"%d",&toNode); + fscanf(fp,"%c",&c); + + cout << "fromNode = "<< fromNode << endl; + cout << "toNode = "<< toNode << endl; + + inFeatureEdges[toNode] += (1 << fromNode); + + + + } + fclose(fp); + int no_var = toNode; + + for(int i = 0; i < MAX_VAR_NUM; i++){ + cout << "inFeatureEdges[" << i << "] " << inFeatureEdges[i] << endl; + } + + + int outFeatureEdges[MAX_VAR_NUM]; + for(int i = 0; i < MAX_VAR_NUM; i++){ + outFeatureEdges[i] = 0; + } + + string str2; + str2.assign(outFeasFileName); + + + fp=fopen(str2.c_str(), "r"); + + //int fromNode; + //int toNode; + //int i=0; + while(!feof(fp)){ + char c; + fromNode = -1; + toNode = -1; + + fscanf(fp,"%d",&fromNode); + fscanf(fp,"%d",&toNode); + fscanf(fp,"%c",&c); + + cout << "fromNode = "<< fromNode << endl; + cout << "toNode = "<< toNode << endl; + + outFeatureEdges[toNode] += (1 << fromNode); + + + + } + fclose(fp); + //int no_var = toNode; + + + for(int i = 0; i < MAX_VAR_NUM; i++){ + cout << "outFeatureEdges[" << i << "] " << outFeatureEdges[i] << endl; + } + + + + +} + + + +//HR:F +int main(int argc, char* argv[]){ + + if (argc!=3){ + cout << "Please type the correct format: arcToNet inFeatureFileName outFeatureFileName\n" << endl; + return 1; + } + + arcToNet(argv[1], argv[2]); + +} + + + |
