void TopicModel::saveTopicData(QString qname, int k) {

    DataManager *datamanager = new DataManager();

    sleep(1);

    connect(datamanager, SIGNAL(saveTick(int)), this, SIGNAL(saveTick(int)));

    emit changeStatus("Saving");

    /*************************************/
    // Save parameters
    /*************************************/

    datamanager->saveInt(qname, "M", "M", M);

    /*************************************/
    // Save Theta
    /*************************************/

    if(k == 0) {
        datamanager->saveArray(qname, "Theta", "feature", "probability", Theta0);
    } else {
        datamanager->saveArray(qname, "Theta", "feature", "probability", Theta[k-1]);
    }

    emit changeStatus("Ready");
    disconnect(datamanager, SIGNAL(loadTick(int)), this, SIGNAL(loadTick(int)));
    delete datamanager;
}
void TopicModel::saveData(QString qname) {

    int i, j;
    vector < double > storage1;
    vector < vector < double > > storage2;
    vector < vector < vector < double > > > storage3;
    DataManager *datamanager = new DataManager();

    sleep(1);

    connect(datamanager, SIGNAL(saveTick(int)), this, SIGNAL(saveTick(int)));

    emit changeStatus("Saving");

    /*************************************/
    // Save parameters
    /*************************************/

    datamanager->saveInt(qname, "K", "K", K);
    datamanager->saveInt(qname, "M", "M", M);
    datamanager->saveDouble(qname, "Theta_MIN", "Theta_MIN", Theta_MIN);
    datamanager->saveDouble(qname, "Log_Likelihood", "likelihood", ll);;

    cout << "Saving Omega values...\n";
    /*************************************/
    // Save P0
    /*************************************/
    storage1.resize(K+1);

    storage1[0] = -1;
    for(i=1; i < K+1; i++) {

        storage1[i] = P0[i-1];
    }

    datamanager->saveArray(qname, "P0", "category", "probability", storage1);

    /*************************************/
    // Save Omega
    /*************************************/
    storage2.resize(K+1);

    for(i=0; i < K+1; i++) {

        storage2[i].resize(K+1);

        for(j=0; j < K+1; j++) {

            if(j == 0) {
                storage2[i][j] = -1.0;
            } else if(i == 0) {
                storage2[i][j] = Omega0[j-1];
            } else {
                storage2[i][j] = Omega[j-1][i-1];
            }
        }
    }

    vector < QString > keyNames;
    keyNames.resize(3);
    keyNames[0] = "cause";
    keyNames[1] = "effect";
    keyNames[2] = "probability";

    datamanager->saveArray(qname, "Omega", keyNames, storage2);

    /*************************************/
    // Save Theta
    /*************************************/

    storage2.resize(K+1);

    for(i=0; i < K+1; i++) {

        storage2[i].resize(M);

        for(j=0; j < M; j++) {

            if(i == 0) {
                storage2[i][j] = Theta0[j];
            } else {
                storage2[i][j] = Theta[i-1][j];
            }
        }
    }

    keyNames.resize(3);
    keyNames[0] = "category";
    keyNames[1] = "feature";
    keyNames[2] = "probability";

    datamanager->saveArray(qname, "Theta", keyNames, storage2);

    /*************************************/
    // Save Sigma
    /*************************************/

    storage1.resize(K+1);

    storage1[0] = Sigma0;

    for(i=1; i < K+1; i++) {

        storage1[i] = Sigma[i-1];
    }

    datamanager->saveArray(qname, "Sigma", "category", "proportion", storage1);

    /*************************************/
    // Cleanup
    /*************************************/

    emit changeStatus("Ready");
    disconnect(datamanager, SIGNAL(loadTick(int)), this, SIGNAL(loadTick(int)));
    delete datamanager;
}