#pragma once
#include <functional>
#include <span>
#include <Eigen/Core>
#include <Eigen/SparseCore>
#include "sleipnir/optimization/solver/exit_status.hpp"
#include "sleipnir/optimization/solver/iteration_info.hpp"
#include "sleipnir/optimization/solver/options.hpp"
#include "sleipnir/util/symbol_exports.hpp"
namespace slp {
struct SLEIPNIR_DLLEXPORT InteriorPointMatrixCallbacks {
std::function<double(const Eigen::VectorXd& x)> f;
std::function<Eigen::SparseVector<double>(const Eigen::VectorXd& x)> g;
std::function<Eigen::SparseMatrix<double>(const Eigen::VectorXd& x,
const Eigen::VectorXd& y,
const Eigen::VectorXd& z)>
H;
std::function<Eigen::VectorXd(const Eigen::VectorXd& x)> c_e;
std::function<Eigen::SparseMatrix<double>(const Eigen::VectorXd& x)> A_e;
std::function<Eigen::VectorXd(const Eigen::VectorXd& x)> c_i;
std::function<Eigen::SparseMatrix<double>(const Eigen::VectorXd& x)> A_i;
};
SLEIPNIR_DLLEXPORT ExitStatus
interior_point(const InteriorPointMatrixCallbacks& matrix_callbacks,
std::span<std::function<bool(const IterationInfo& info)>>
iteration_callbacks,
const Options& options,
#ifdef SLEIPNIR_ENABLE_BOUND_PROJECTION
const Eigen::ArrayX<bool>& bound_constraint_mask,
#endif
Eigen::VectorXd& x);
}