Program Listing for File profit_oracle.hpp

Return to documentation for file (ellcpp/oracles/profit_oracle.hpp)

// -*- coding: utf-8 -*-
#pragma once

#include <cmath>
#include <tuple>
#include <xtensor/xarray.hpp>

class profit_oracle
{
    using Arr = xt::xarray<double, xt::layout_type::row_major>;
    using Cut = std::tuple<Arr, double>;

  private:
    const double _log_pA;
    const double _log_k;
    const Arr _v;

  public:
    Arr _a;


    profit_oracle(double p, double A, double k, const Arr& a, const Arr& v)
        : _log_pA {std::log(p * A)}
        , _log_k {std::log(k)}
        , _v {v}
        , _a {a}
    {
    }

    explicit profit_oracle(const profit_oracle&) = default;

    auto operator()(const Arr& y, double& t) const -> std::tuple<Cut, bool>;
};

class profit_rb_oracle
{
    using Arr = xt::xarray<double, xt::layout_type::row_major>;

  private:
    const Arr _uie;
    Arr _a;
    profit_oracle _P;

  public:
    profit_rb_oracle(double p, double A, double k, const Arr& a, const Arr& v,
        const Arr& e, double e3)
        : _uie {e}
        , _a {a}
        , _P(p - e3, A, k - e3, a, v + e3)
    {
    }

    auto operator()(const Arr& y, double& t)
    {
        auto a_rb = this->_a;
        a_rb[0] += y[0] > 0. ? -this->_uie[0] : this->_uie[0];
        a_rb[1] += y[1] > 0. ? -this->_uie[1] : this->_uie[1];
        this->_P._a = a_rb;
        return this->_P(y, t);
    }
};

class profit_q_oracle
{
    using Arr = xt::xarray<double, xt::layout_type::row_major>;
    using Cut = std::tuple<Arr, double>;

  private:
    profit_oracle _P;
    Arr _yd;

  public:
    profit_q_oracle(double p, double A, double k, const Arr& a, const Arr& v)
        : _P(p, A, k, a, v)
    {
    }

    auto operator()(const Arr& y, double& t, bool retry)
        -> std::tuple<Cut, Arr, bool, bool>;
};