Program Listing for File ell.hpp

Return to documentation for file (ellcpp/ell.hpp)

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

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

// forward declaration
enum class CUTStatus;

class ell
{
  public:
    using Arr = xt::xarray<double, xt::layout_type::row_major>;
    // using params_t = std::tuple<double, double, double>;
    // using return_t = std::tuple<int, params_t>;

    bool use_parallel_cut = true;
    bool no_defer_trick = false;

  protected:
    double _mu {};
    double _rho {};
    double _sigma {};
    double _delta {};
    double _tsq {};

    const int _n;

    const double _nFloat;
    const double _nPlus1;
    const double _nMinus1;
    const double _halfN;
    const double _halfNplus1;
    const double _halfNminus1;
    const double _nSq;
    const double _c1;
    const double _c2;
    const double _c3;

    double _kappa;
    Arr _Q;
    Arr _xc;

    auto operator=(const ell& E) -> ell& = delete;

    template <typename V, typename U>
    ell(V&& kappa, Arr&& Q, U&& x) noexcept
        : _n {int(x.size())}
        , _nFloat {double(_n)}
        , _nPlus1 {_nFloat + 1.}
        , _nMinus1 {_nFloat - 1.}
        , _halfN {_nFloat / 2.}
        , _halfNplus1 {_nPlus1 / 2.}
        , _halfNminus1 {_nMinus1 / 2.}
        , _nSq {_nFloat * _nFloat}
        , _c1 {_nSq / (_nSq - 1)}
        , _c2 {2. / _nPlus1}
        , _c3 {_nFloat / _nPlus1}
        , _kappa {std::forward<V>(kappa)}
        , _Q {std::move(Q)}
        , _xc {std::forward<U>(x)}
    {
    }

  public:
    ell(const Arr& val, Arr x) noexcept
        : ell {1., xt::diag(val), std::move(x)}
    {
    }

    ell(const double& alpha, Arr x) noexcept
        : ell {alpha, xt::eye(x.size()), std::move(x)}
    {
    }

    ell(ell&& E) = default;

    ~ell() { }

    explicit ell(const ell& E) = default;

    [[nodiscard]] auto copy() const -> ell
    {
        return ell(*this);
    }

    [[nodiscard]] auto xc() const -> Arr
    {
        return _xc;
    }

    void set_xc(const Arr& xc)
    {
        _xc = xc;
    }

    template <typename T>
    auto update(const std::tuple<Arr, T>& cut) -> std::tuple<CUTStatus, double>;

  protected:
    auto _update_cut(const double& beta) -> CUTStatus
    {
        return this->_calc_dc(beta);
    }

    CUTStatus _update_cut(const Arr& beta)
    { // parallel cut
        if (beta.shape()[0] < 2)
        {
            return this->_calc_dc(beta[0]);
        }
        return this->_calc_ll_core(beta[0], beta[1]);
    }

    auto _calc_ll_core(const double& b0, const double& b1) -> CUTStatus;

    auto _calc_ll_cc(const double& b1, const double& b1sq) -> void;

    auto _calc_dc(const double& beta) noexcept -> CUTStatus;

    auto _calc_cc(const double& tau) noexcept -> void;
}; // } ell