Program Listing for File qmi_oracle.hpp

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

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

#include "ldlt_ext.hpp"
#include <gsl/span>
#include <optional>
#include <xtensor/xarray.hpp>

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

  private:
    double _t = 0.;
    size_t _nx = 0;
    size_t _count = 0;

    const size_t _n;
    const size_t _m;
    const gsl::span<const Arr> _F;
    const Arr _F0;
    Arr _Fx;

  public:
    ldlt_ext _Q;


    qmi_oracle(gsl::span<const Arr> F, Arr F0)
        : _n {F0.shape()[0]}
        , _m {F0.shape()[1]}
        , _F {F}
        , _F0 {std::move(F0)}
        , _Fx {zeros({_m, _n})} // transposed
        , _Q(_m)                // take column
    {
    }

    auto update(double t) -> void
    {
        this->_t = t;
    }

    auto operator()(const Arr& x) -> std::optional<Cut>;
};