X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/d47d44b2ed067c834ef210ad544512e7581a1c8e..20ee10ed13aee7d9fb9c844648d5159ed4a054d2:/cost_func.cpp diff --git a/cost_func.cpp b/cost_func.cpp index bdea62e..4248c56 100644 --- a/cost_func.cpp +++ b/cost_func.cpp @@ -1,57 +1,46 @@ #include -#include -#include +#include #include #include +#include + #include "cost_func.h" -cost_func::cost_func(const char *param) +cost_func::cost_func(const char* param) { - int len = strlen(param); - char tmpbuf[len + 1]; - char *tmp = tmpbuf; - memcpy(tmp, param, len + 1); - degree = std::count(tmp, tmp + len, ','); - factor = new double[degree + 1]; - for (int i = degree ; i > 0 ; i--) { - char *next = strchr(tmp, ','); - *next++ = '\0'; - factor[i] = atof(tmp); - tmp = next; + std::istringstream paramstream(param); + std::string token; + while (std::getline(paramstream, token, ',')) { + std::istringstream str(token); + double f; + if ((str >> f) && str.eof()) + factors.push_back(f); + else + throw std::invalid_argument("cost_func(): " + "cannot parse \"" + token + "\""); } - factor[0] = atof(tmp); + if (factors.empty()) + throw std::invalid_argument("cost_func(): no factor"); } cost_func::~cost_func() { - delete[] factor; -} - -cost_func& cost_func::operator=(const cost_func& ref) -{ - if (&ref != this) { - degree = ref.degree; - delete[] factor; - factor = new double[degree + 1]; - memcpy(factor, ref.factor, (degree + 1) * sizeof *factor); - } - return *this; } double cost_func::operator()(double amount) const { - double ret = factor[degree]; - for (int i = degree - 1; i >= 0 ; i--) - ret = amount * ret + factor[i]; - return ret; + return std::accumulate(++factors.begin(), factors.end(), factors.front(), + [&amount](double a, double b) { + return amount * a + b; + }); } std::string cost_func::to_string() { std::ostringstream oss; - std::reverse_copy(factor + 1, factor + degree + 1, - std::ostream_iterator(oss, ", ")); - oss << factor[0]; + std::copy(factors.begin(), --factors.end(), + std::ostream_iterator(oss, ", ")); + oss << factors.back(); return oss.str(); }