#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 NewtonMatrixCallbacks {
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)> H;
};
SLEIPNIR_DLLEXPORT ExitStatus
newton(const NewtonMatrixCallbacks& matrix_callbacks,
std::span<std::function<bool(const IterationInfo& info)>>
iteration_callbacks,
const Options& options, Eigen::VectorXd& x);
}