void load_data(const char* fpath, real_2d_array& data, int readrows=-1) {
    int numrows = (readrows < 0)? get_file_numlines(fpath): readrows;
    int numcols = get_file_numcols(fpath);
    if (numrows <= 0 || numcols <= 0) {
    	throw "Failed to read data!";
    }
    data.setlength(numrows, numcols);

    char line[1000000];
    double rowvals[100000];
    FILE* f = fopen(fpath, "r");
    if (!f) throw "[load_data] Failed opening file!";
    for (int row=0; row<numrows; ++row) {
    	fgets (line, 1000000, f);

        int numvals = parse_row(line, rowvals);
        if (numcols != numvals) {
        	cerr<<"[load_data] numcols != numvals in row="<<row<<endl;
        	cerr<<"[load_data] numcols = "<<numcols<<endl;
        	cerr<<"[load_data] numvals = "<<numvals<<endl;
        	cerr<<"[load_data] line =["<<line<<"]"<<endl;
        	throw "Inconsistent data in input file!";
        }
        for (int col=0; col<numcols; ++col) {
        	data[row][col] = rowvals[col];
        }
    }
    fclose(f);
}
void fill_matrix(real_2d_array& dstm, int size) {
	dstm.setlength(size,size);
	for (int i=0; i<size; ++i) {
		//cout<<"[fill_matrix] row = "<<i<<endl;
		for (int j=i; j<size; ++j) {
			//cout<<"[fill_matrix] col = "<<j<<endl;
			dstm[i][j] = i*j+j;
			dstm[j][i] = dstm[i][j];
		}
	}
}
void move_to_alglib_matrix(DataMatrix<T>& datam, real_2d_array& dstm) {
	cout<<"Setting dimensions to:"<<datam.numrows<<"x"<<datam.numcols<<endl;
	dstm.setlength(datam.numrows,datam.numcols);
	cout<<"Moving..."<<endl;
	for (int r=0; r<datam.numrows; ++r) {
		if (r%100==0) {	cout<<(r*100/datam.numrows)<<"% moved..."<<endl; }
		for (int c=0; c<datam.numcols; ++c) {
			dstm[r][c] = datam.data[r][c];
		}
		delete[] datam.data[r]; //freeing src data!
	}
	delete[] datam.data; //freeing src data!
	cout<<"Done..."<<endl;
}
int main(int argc, char **argv)
{
  printf("HELLO!");
       // Set measured indices --URI
       for(int i=0; i<NMEA; i++)
	 measIdx[i] = 2*i;

    //
    // using LBFGS method.
    //
	Ydata.setlength(NT,NX);
	real_1d_array X0,grad_a;
	X0.setlength(NT*NX);
	grad_a.setlength(NT*NX);
	real_2d_array result;
	result.setlength(NBETA,(3+NT*NX));
	double act;
    	int i,j;
	int beta = 1, ipath;

	void *ptr;

    	double epsg = 1e-8;
    	double epsf = 1e-8;
    	double epsx = 1e-8;
	FILE *fp_output;
	char filename[50];

   	ae_int_t maxits = 10000;

	readdata(Ydata);
	
	minlbfgsstate state;
	minlbfgsreport rep;

	// Make Initial paths - Load Later. URI
	if(generate_paths == true){
	  
	  ofstream initpaths("initpaths.txt");
	  for(ipath=0;ipath<NPATH;ipath++){
	    for(i=0;i<NX*NT;i++) 
	      X0[i]=20*randomreal()-10;

	    if(initpaths.is_open()){
	      for(i=0;i<NX*NT;i++) 
		initpaths << X0[i] << " ";
	      initpaths << endl;	      
	    }
	    else{
	      printf("ERROR FILE WAS NOT OPENED");
	    }
	  }	  
	  initpaths.close();
	  cout << "Last entry in initpaths.txt: " << X0[NT*NX-1];
	}


	//load init paths file --Needed for all loop iterations
	// either loadpaths or lastpath will be used depending on BETASTART	

	//loadpaths must be declared before ipath loop, because all
	//paths are contained in the loadpaths file, so it has to
	//persist through each iteration.
	ifstream loadpaths("initpaths.txt");

	int nans = 0;       

	for(ipath=0;ipath<NPATH;ipath++){
	     string taustr("Ntd%d_");

	     for(i=0; i<NTD;i++)
		  taustr = taustr + std::to_string(taus[i]) + "-";

	     string temp("pathNoise/D%d_M%d_PATH%d_"+taustr+"dt%e.dat");
	     sprintf(filename, temp.c_str(), NX,NMEA,ipath,NTD,DT);

		//lastpath is the filename used to continue from a
		//non-zero BETASTART. It must occur within ipath loop,
		//because each path is contained in different file
		ifstream lastpath(filename);

		//Make BETASTART variable to continue old thing
		//load in initial paths --URI
		if(BETASTART ==0){
		  fp_output = fopen(filename,"w"); 		
		  if(loadpaths.is_open()){
		    for(i=0;i<NX*NT;i++)
		      loadpaths >> X0[i];			  
		    cout << "Last entry loaded from initpaths.txt: " << X0[NT*NX-1];
		  }
		  else{
		    printf("ERROR INIT PATHS NOT FOUND!");
		  }
		}