//=====================================================
// File   :  regularize.cxx
// Author :  L. Plagne <laurent.plagne@edf.fr)>
// Copyright (C) EDF R&D,  lun sep 30 14:23:15 CEST 2002
//=====================================================
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
#include "utilities.h"
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include "bench_parameter.hh"
#include <set>

using namespace std;

void read_xy_file(const string &filename, vector<int> &tab_sizes, vector<double> &tab_mflops);
void regularize_curve(const string &filename, const vector<double> &tab_mflops, const vector<int> &tab_sizes,
                      int start_cut_size, int stop_cut_size);
/////////////////////////////////////////////////////////////////////////////////////////////////

int main(int argc, char *argv[]) {
  // input data

  if (argc < 4) {
    INFOS("!!! Error ... usage : main filename start_cut_size stop_cut_size regularize_filename");
    exit(0);
  }
  INFOS(argc);

  int start_cut_size = atoi(argv[2]);
  int stop_cut_size = atoi(argv[3]);

  string filename = argv[1];
  string regularize_filename = argv[4];

  INFOS(filename);
  INFOS("start_cut_size=" << start_cut_size);

  vector<int> tab_sizes;
  vector<double> tab_mflops;

  read_xy_file(filename, tab_sizes, tab_mflops);

  // regularizeing

  regularize_curve(regularize_filename, tab_mflops, tab_sizes, start_cut_size, stop_cut_size);
}

//////////////////////////////////////////////////////////////////////////////////////

void regularize_curve(const string &filename, const vector<double> &tab_mflops, const vector<int> &tab_sizes,
                      int start_cut_size, int stop_cut_size) {
  int size = tab_mflops.size();
  ofstream output_file(filename.c_str(), ios::out);

  int i = 0;

  while (tab_sizes[i] < start_cut_size) {
    output_file << tab_sizes[i] << " " << tab_mflops[i] << endl;
    i++;
  }

  output_file << endl;

  while (tab_sizes[i] < stop_cut_size) {
    i++;
  }

  while (i < size) {
    output_file << tab_sizes[i] << " " << tab_mflops[i] << endl;
    i++;
  }

  output_file.close();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void read_xy_file(const string &filename, vector<int> &tab_sizes, vector<double> &tab_mflops) {
  ifstream input_file(filename.c_str(), ios::in);

  if (!input_file) {
    INFOS("!!! Error opening " << filename);
    exit(0);
  }

  int nb_point = 0;
  int size = 0;
  double mflops = 0;

  while (input_file >> size >> mflops) {
    nb_point++;
    tab_sizes.push_back(size);
    tab_mflops.push_back(mflops);
  }
  SCRUTE(nb_point);

  input_file.close();
}
