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

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