int main(int n_args, char** args)
{
  double intersection = 0.5;
  double n_rfs = 9;
  string fa_name = string(args[1]);
  string directory = string(args[2]);
  if (n_args>3)
    intersection = atof(args[3]);
  if (n_args>4)
    n_rfs = atoi(args[4]);
  
  // Load training data 
  MatrixXd inputs;
  MatrixXd targets;
  directory += "/";
  if (!loadMatrix(directory+"inputs.txt", inputs)) return -1;
  if (!loadMatrix(directory+"targets.txt", targets)) return -1;
  int input_dim = inputs.cols();

  // Initialize function approximator
  FunctionApproximator* fa;
  if (fa_name.compare("LWR")==0)
  {
    MetaParametersLWR* meta_params = new MetaParametersLWR(input_dim,n_rfs,intersection);
    fa = new FunctionApproximatorLWR(meta_params);
  }
  else
  {
    MetaParametersRBFN* meta_params = new MetaParametersRBFN(input_dim,n_rfs,intersection);
    fa = new FunctionApproximatorRBFN(meta_params);
  }

  // Train function approximator with data
  bool overwrite = true;
  fa->train(inputs,targets,directory,overwrite);

  // Make predictions for the targets
  MatrixXd outputs(inputs.rows(),fa->getExpectedOutputDim());
  fa->predict(inputs,outputs);
  saveMatrix(directory,"outputs.txt",outputs,overwrite);

  VectorXd min(1); min << 0.0;
  VectorXd max(1); max << 2.0;
  VectorXi n_samples_grid(1); n_samples_grid << 201;
  fa->saveGridData(min, max, n_samples_grid, directory, overwrite);

  delete fa;
  
  return 0;
}