Program Listing for File profitmaxprob.hpp

Return to documentation for file (ellip/profitmaxprob.hpp)

#ifndef _PROFIT_MAX_HPP
#define _PROFIX_MAX_HPP
#include "gp_solve.hpp"

template <typename _Tp>
class profit_max : public gp_base<_Tp>
{
  public:
    profit_max();
    ~profit_max();

    void gp_setup()
    {
        using posy = posynomial<_Tp>;
        using mono = monomial<_Tp>;
        auto& M = gp_base<_Tp>::_M;

        // x0^-1
        M.emplace_back(mono(_Tp(1), {_Tp(-1), _Tp(0), _Tp(0)}));
        // p1 = x0 + v1*x1 + v2*x2
        auto p1 = mono(_Tp(1.0), {_Tp(1), _Tp(0), _Tp(0)}) +
            mono(v1, {_Tp(0), _Tp(1), _Tp(0)}) +
            mono(v2, {_Tp(0), _Tp(0), _Tp(1)});
        // k^-1 * x1
        M.emplace_back(mono(1.0 / k, {_Tp(0), _Tp(1), _Tp(0)}));
        // A * x1^alpha * x2^beta
        cd = mono(_Tp(A), {_Tp(0), alpha, beta});
        M.emplace_back(p1 / (p * cd));
    }

    _Tp obj(const std::valarray<double>& z)
    {
        return p * exp(cd.lse(z)) - v1 * exp(z[1]) - v2 * exp(z[2]);
    }

  private:
    _Tp p;
    _Tp alpha;
    _Tp beta;
    _Tp v1;
    _Tp v2;
    _Tp k;
    double A;
    monomial<_Tp> cd;
};

#endif