diff --git a/work/week6/series/homework2/src/CMakeLists.txt b/work/week6/series/homework2/src/CMakeLists.txt index a713c44..08f7b90 100644 --- a/work/week6/series/homework2/src/CMakeLists.txt +++ b/work/week6/series/homework2/src/CMakeLists.txt @@ -1,10 +1,10 @@ add_executable(main main.cc arithmetic.cc pi.cc series.hh print.cc - print.hh - + dumper.hh + write.cc ) diff --git a/work/week6/series/homework2/src/arithmetic.cc b/work/week6/series/homework2/src/arithmetic.cc index 1cc72a5..4a15c1c 100644 --- a/work/week6/series/homework2/src/arithmetic.cc +++ b/work/week6/series/homework2/src/arithmetic.cc @@ -1,11 +1,17 @@ #include #include "arithmetic.hh" double ComputeArithmetic::compute(unsigned int N) { double sum = 0; for (float k = 1; k < N + 1; k++){ sum += k; } return sum; } + + +std::string ComputeArithmetic::getName() { + return "ComputeArithmetic"; +} + diff --git a/work/week6/series/homework2/src/arithmetic.hh b/work/week6/series/homework2/src/arithmetic.hh index f5c712f..dea9495 100644 --- a/work/week6/series/homework2/src/arithmetic.hh +++ b/work/week6/series/homework2/src/arithmetic.hh @@ -1,16 +1,17 @@ #ifndef ARITHMETIC_HH #define ARITHMETIC_HH #include "series.hh" class ComputeArithmetic: public Series { public: ComputeArithmetic() : Series() {}; // Constructor virtual ~ComputeArithmetic() {}; // Destructor public: double compute(unsigned int N) override; // Defined compute method + std::string getName() override; }; #endif \ No newline at end of file diff --git a/work/week6/series/homework2/src/dumper.hh b/work/week6/series/homework2/src/dumper.hh index dabe774..d74e766 100644 --- a/work/week6/series/homework2/src/dumper.hh +++ b/work/week6/series/homework2/src/dumper.hh @@ -1,20 +1,23 @@ #ifndef DUMPER_HH #define DUMPER_HH + #include "series.hh" class DumperSeries{ public: // Constructor DumperSeries(Series & s) : series(s){}; - // Destructor - virtual ~DumperSeries(){}; + virtual ~DumperSeries() {}; + // virtual dump method virtual void dump() = 0; protected: - // attributes + Series & series; + }; + #endif \ No newline at end of file diff --git a/work/week6/series/homework2/src/main.cc b/work/week6/series/homework2/src/main.cc index 2ed4899..bce39b5 100644 --- a/work/week6/series/homework2/src/main.cc +++ b/work/week6/series/homework2/src/main.cc @@ -1,61 +1,58 @@ #include #include #include #include #include #include "arithmetic.hh" #include "pi.hh" #include "series.hh" #include "print.hh" +#include "write.hh" +#include "dumper.hh" /* -------------------------------------------------------------------------- */ int main(int argc, char ** argv) { // Parse method type std::string method = "ar"; // default value if (argc > 1) { method = argv[1]; } // Parse number of iterations unsigned int N = 10; // default value if (argc > 2) { N = atoi(argv[2]); } // Parse frequency unsigned int freq = 1; // default value if (argc > 3) { freq= atoi(argv[3]); } - // Instanciate appropriate series object - std::string method_label; std::unique_ptr series; // doesn't point to anything yet if (method == "ar") { series.reset(new ComputeArithmetic); - method_label = "ComputeArithmetic"; } else if (method == "pi") { series.reset(new ComputePi); - method_label = "ComputePi"; } - - // Compute series - std::cout << method_label << "(" << N << ") = " << series->compute(N) << std::endl; - - Print printer(*series); - printer.dump(method_label.c_str(),N,freq); - + std::cout << series->getName() << "(" << N << ") = " << series->compute(N) << std::endl; + // Print series values from 1 to N onto screen (with specific frequency) + PrintSeries printer(*series,N,freq); + printer.dump(); - //Print(); - //Print(series->compute(N));//, N, freq); + // Dump series values from 1 to N into file + WriteSeries dumper(*series); + std::string separator = ","; + dumper.dump(separator, N); return EXIT_SUCCESS; } diff --git a/work/week6/series/homework2/src/pi.cc b/work/week6/series/homework2/src/pi.cc index b58ad13..3375604 100644 --- a/work/week6/series/homework2/src/pi.cc +++ b/work/week6/series/homework2/src/pi.cc @@ -1,16 +1,20 @@ -//Computes the series converging towards pi: #include #include #include #include #include "pi.hh" double ComputePi::compute(unsigned int N) { float sum = 0; for (double k = 1; k < N + 1; k++){ sum = sum + 1 / (k * k); } double pi = sqrt(6 * sum); return pi; } + + +std::string ComputePi::getName() { + return "ComputePi"; +} diff --git a/work/week6/series/homework2/src/pi.hh b/work/week6/series/homework2/src/pi.hh index eaa9527..f934fbd 100644 --- a/work/week6/series/homework2/src/pi.hh +++ b/work/week6/series/homework2/src/pi.hh @@ -1,15 +1,15 @@ #ifndef PI_HH #define PI_HH #include "series.hh" class ComputePi : public Series { -public: - ComputePi() : Series() {}; // Constructor - virtual ~ComputePi() {}; // Destructor - - double compute(unsigned int N) override; + public: + ComputePi() : Series() {}; // Constructor + virtual ~ComputePi() {}; // Destructor + double compute(unsigned int N) override; + std::string getName() override; }; #endif diff --git a/work/week6/series/homework2/src/plot_results.py b/work/week6/series/homework2/src/plot_results.py new file mode 100644 index 0000000..2365dbf --- /dev/null +++ b/work/week6/series/homework2/src/plot_results.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# @Author: Theo Lemaire +# @Date: 2018-10-16 11:52:15 +# @Last Modified by: Theo Lemaire +# @Last Modified time: 2018-10-23 18:57:39 + +import os +from argparse import ArgumentParser +import matplotlib.pyplot as plt +import numpy as np + + +def plotSeries(iterations, values, fs=15, lw=2): + + fig, ax = plt.subplots(figsize=(10, 6)) + ax.set_xlabel('# iterations', fontsize=fs) + ax.set_ylabel('value', fontsize=fs) + ax.plot(iterations, values, label='series', linewidth=lw) + for item in ax.get_xticklabels() + ax.get_yticklabels(): + item.set_fontsize(fs) + return fig + + +def main(): + + # Define argument parser + ap = ArgumentParser() + ap.add_argument('-i', '--inputfile', type=str, help='Input filename') + + # Parse arguments + args = ap.parse_args() + filepath = args.inputfile + + # Infer separator character from file extension + filename = os.path.basename(filepath) + filecode, ext = os.path.splitext(filename) + print(filecode, ext) + if ext == '.csv': + separator = ',' + elif ext == '.txt': + separator = ' ' + elif ext == '.psv': + separator = '|' + + # Load data + data = np.genfromtxt(filepath, delimiter=separator) + iterations = data[1:, 0] + values = data[1:, 1] + + # Plot series + fs = 20 + fig = plotSeries(iterations, values, fs=fs) + fig.suptitle('{} evolution'.format(filecode), fontsize=fs) + plt.show() + + +if __name__ == '__main__': + main() diff --git a/work/week6/series/homework2/src/print.cc b/work/week6/series/homework2/src/print.cc index 6606eb6..4bc7391 100644 --- a/work/week6/series/homework2/src/print.cc +++ b/work/week6/series/homework2/src/print.cc @@ -1,30 +1,20 @@ //Computes the series converging towards pi: #include #include #include #include #include "dumper.hh" #include "print.hh" - - -void Print::dump(const char* method_label, unsigned int maxiter, unsigned int frequency) { - - float sum = 0; - - for (double k = 1; k < maxiter + 1; k+=frequency){ - sum = sum + 1; - std::cout << method_label << ": maxiteration " << maxiter << " iteration number:" << sum << std::endl; - } - - - +PrintSeries::PrintSeries(Series & series, unsigned int maxiter, unsigned int frequency) : DumperSeries (series) { + this->maxiter = maxiter; + this->frequency = frequency; } -void Print::dump(){ - unsigned int maxiter = 10; - unsigned int freq=1; - this->dump("ComputeArithmetic", maxiter, freq); +void PrintSeries::dump() { + std::cout << this->series.getName() << ": maxiteration " << this->maxiter << std::endl; + for (double k = 1; k < maxiter + 1; k+=this->frequency){ + std::cout << " N = " << k << ", value = " << this->series.compute(k) << std::endl; + } } - diff --git a/work/week6/series/homework2/src/print.hh b/work/week6/series/homework2/src/print.hh index 8677ded..c515aa2 100644 --- a/work/week6/series/homework2/src/print.hh +++ b/work/week6/series/homework2/src/print.hh @@ -1,15 +1,18 @@ #ifndef PRINT_HH #define PRINT_HH #include "dumper.hh" -class Print : public DumperSeries { +class PrintSeries : public DumperSeries { public: // Constructor - Print(Series & series) : DumperSeries (series) {}; // Constructor - virtual ~Print() {}; // Destructor + PrintSeries(Series & series, unsigned int maxiter, unsigned int frequency); // Constructor + virtual ~PrintSeries() {}; // Destructor void dump() override; - void dump(const char* method_label, unsigned int maxiter, unsigned int frequency); + +private: + unsigned int maxiter; + unsigned int frequency; }; #endif \ No newline at end of file diff --git a/work/week6/series/homework2/src/series.hh b/work/week6/series/homework2/src/series.hh index 6f7b2fb..efaa7a5 100644 --- a/work/week6/series/homework2/src/series.hh +++ b/work/week6/series/homework2/src/series.hh @@ -1,13 +1,14 @@ #ifndef SERIES_HH #define SERIES_HH class Series { public: Series() {}; // Constructor virtual ~Series() {}; // Destructor public: virtual double compute(unsigned int N) = 0; // Virtual compute method + virtual std::string getName() = 0; // Virtual getName method }; #endif \ No newline at end of file diff --git a/work/week6/series/homework2/src/write.cc b/work/week6/series/homework2/src/write.cc new file mode 100644 index 0000000..720460a --- /dev/null +++ b/work/week6/series/homework2/src/write.cc @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +#include "write.hh" + + +void WriteSeries::dump(std::string separator, unsigned int maxiter) { + // write sequential iterations to file + std::string sname = this->series.getName(); + std::transform(sname.begin(), sname.end(), sname.begin(), ::tolower); + std::string ext; + if (separator == ",") { + ext = ".csv"; + } else if (separator == " " || separator == "\t") { + ext = ".txt"; + } else if (separator == "|") { + ext = ".psv"; + } + std::string filename = sname + ext; + std::cout << filename << std::endl; + + std::ofstream fout(filename.c_str()); + fout << "iteration" << separator << "value" << std::endl; + for (unsigned int N = 1; N < maxiter + 1; ++N) { + fout << N << separator << this->series.compute(N) << std::endl; + } + fout.close(); +} + +void WriteSeries::dump() { + this->dump(" ", 10); +} diff --git a/work/week6/series/homework2/src/write.hh b/work/week6/series/homework2/src/write.hh new file mode 100644 index 0000000..3e01065 --- /dev/null +++ b/work/week6/series/homework2/src/write.hh @@ -0,0 +1,19 @@ +#ifndef WRITE_HH +#define WRITE_HH + +#include "dumper.hh" + +class WriteSeries: public DumperSeries { + public: + // Constructor + WriteSeries(Series& series) : DumperSeries(series) {}; + + // Destructor + virtual ~WriteSeries() {}; + + // Dump methods + void dump(std::string separator, unsigned int maxiter); + void dump() override; +}; + +#endif \ No newline at end of file