]> AND Private Git Repository - loba.git/blob - cost_func.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Wip++...
[loba.git] / cost_func.cpp
1 #include <algorithm>
2 #include <cstdlib>
3 #include <cstring>
4 #include <iterator>
5 #include <sstream>
6 #include "cost_func.h"
7
8 cost_func::cost_func(const char *param)
9 {
10     int len = strlen(param);
11     char tmpbuf[len + 1];
12     char *tmp = tmpbuf;
13     memcpy(tmp, param, len + 1);
14     degree = std::count(tmp, tmp + len, ',');
15     factor = new double[degree + 1];
16     for (int i = degree ; i > 0 ; i--) {
17         char *next = strchr(tmp, ',');
18         *next++ = '\0';
19         factor[i] = atof(tmp);
20         tmp = next;
21     }
22     factor[0] = atof(tmp);
23 }
24
25 cost_func::~cost_func()
26 {
27     delete[] factor;
28 }
29
30 cost_func& cost_func::operator=(const cost_func& ref)
31 {
32     if (&ref != this) {
33         degree = ref.degree;
34         delete[] factor;
35         factor = new double[degree + 1];
36         memcpy(factor, ref.factor, (degree + 1) * sizeof *factor);
37     }
38     return *this;
39 }
40
41 double cost_func::operator()(double amount) const
42 {
43     double ret = factor[degree];
44     for (int i = degree - 1; i >= 0 ; i--)
45         ret = amount * ret + factor[i];
46     return ret;
47 }
48
49 std::string cost_func::to_string()
50 {
51     std::ostringstream oss;
52     std::reverse_copy(factor + 1, factor + degree + 1,
53                       std::ostream_iterator<double>(oss, ", "));
54     oss << factor[0];
55     return oss.str();
56 }
57
58 // Local Variables:
59 // mode: c++
60 // End: