I encounter some issues when I tried to apply my "parameter learning code" to a number of simulated data samples using a loop. Here is my code.
My simulated data was saved in a .csv file, which include 3000 x 90 binary values and are for 3 data sample. I read it into c++ and then did a loop to make sure each time I will select the 3000 x 30 data file I need and then do the parameter learning.
My code could read in and devide my data correctly. However once I included staticEM() into the main() funciton, things did not work.It shows "Cannot read data file...exiting". The data file (LIN_4.txt) I tried to saved for parameter learning became like below. I do not where the first 0 line came from.
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1
1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
After taking the staticEM() out, everything looks normal and the data file is just like it's supposed to be...
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30
1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1
1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1
0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1
Any helps or suggestions will be appreciated.
Sincerely,
Bo
Code: Select all
#include "stdafx.h"
#define _SECURE_SCL 0
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include "smile.h"
#include "smilearn.h"
using namespace std;
void CreateNetwork(void) {
DSL_network LIN_4T;
int x1 = LIN_4T.AddNode(DSL_CPT, "x1");
int x2 = LIN_4T.AddNode(DSL_CPT, "x2");
....
int x30 = LIN_4T.AddNode(DSL_CPT, "x30");
int A = LIN_4T.AddNode(DSL_CPT, "A");
int B = LIN_4T.AddNode(DSL_CPT, "B");
int C = LIN_4T.AddNode(DSL_CPT, "C");
int D = LIN_4T.AddNode(DSL_CPT, "D");
LIN_4T.AddArc(A, x1);
LIN_4T.AddArc(B, x2);
.....
LIN_4T.AddArc(D, x30);
LIN_4T.AddArc(B, A);
LIN_4T.AddArc(C, B);
LIN_4T.AddArc(D, C);
LIN_4T.WriteFile("LIN_4T.xdsl");
}
void staticEM() {
DSL_dataset LT;
if (LT.ReadFile("C:\\Users\\Bo\\Desktop\\C++\\LIN_4.txt") != DSL_OKAY) {
cout << "Cannot read data file...exiting" << endl;
exit(1);
}
DSL_network LIN_4T;
if (LIN_4T.ReadFile("LIN_4T.xdsl", DSL_XDSL_FORMAT) != DSL_OKAY) {
cout << "Cannot read network...exiting." << endl;
exit(1);
}
vector<DSL_datasetMatch> matches;
string err;
if (LT.MatchNetwork(LIN_4T, matches, err) != DSL_OKAY) {
cout << "Cannot match network...exiting." << endl;
exit(1);
}
double loglik;
DSL_em em;
if (em.Learn(LT, LIN_4T, matches, &loglik) != DSL_OKAY) {
cout << "Cannot learn parameters...exiting." << endl;
exit(1);
}
LIN_4T.UpdateBeliefs();
//extracting results and saving into cp_table and then into output.txt
//this part of code wes deleted to save space
std::vector<double> cp_table(arr, arr + 207);
ofstream output;
output.open("C:\\Users\\Bo\\Desktop\\C++\\output.txt", std::ofstream::out|std::ofstream::app);
output << "\n";
for (size_t i = 0; i < cp_table.size(); i++) {
output << cp_table[i];
output.close();
}
}
int main(int argc, char* const argv[]) {
CreateNetwork();
static int data[3000][90];
std::ifstream file("C:\\Users\\Bo\\Desktop\\Data\\datal1.csv");
ofstream test("C:\\Users\\Bo\\Desktop\\C++\\test.txt");
for (int row = 0; row < 3000; row++) {
std::string line;
std::getline(file, line);
if (!file.good())
break;
std::stringstream iss(line);
for (int col = 0; col < 90; col++) {
std::string val;
std::getline(iss, val, ',');
if (!iss)
break;
std::stringstream convertor(val);
convertor >> data[row][col];
}
}
static int dat[3000][30];
std::vector<std::string> name = {"x1","x2","x3","x4","x5","x6","x7","x8","x9","x10",
"x11","x12","x13","x14","x15","x16","x17","x18","x19","x20",
"x21","x22","x23","x24","x25","x26","x27","x28","x29","x30"};
for (int k = 0; k < 3; k++) {
ofstream LIN_4("C:\\Users\\Bo\\Desktop\\C++\\LIN_4.txt");
std::ostream_iterator<std::string> output_iterator(LIN_4, " ");
std::copy(name.begin(), name.end(), output_iterator);
LIN_4 << "\n";
for (int i = 0; i < 3000; i++) {
for (int j = (k - 1) * 30; j < (k - 1) * 30 + 30; j++) {
dat[i][j] = data[i][j];
LIN_4 << dat[i][j] << " ";
}
LIN_4 << "\n";
}
LIN_4.close();
staticEM();
}
}