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>;
};