use crate::DType;
use super::simplex::{LinProgOptions, LinProgTensorConstraints};
use numr::error::Result;
use numr::ops::{CompareOps, ScalarOps, TensorOps};
use numr::runtime::{Runtime, RuntimeClient};
use numr::tensor::Tensor;
#[derive(Debug, Clone)]
pub struct MilpOptions {
pub max_nodes: usize,
pub int_tol: f64,
pub gap_tol: f64,
pub lp_options: LinProgOptions,
}
impl Default for MilpOptions {
fn default() -> Self {
Self {
max_nodes: 10000,
int_tol: 1e-6,
gap_tol: 1e-4,
lp_options: LinProgOptions::default(),
}
}
}
#[derive(Debug, Clone)]
pub struct MilpTensorResult<R: Runtime<DType = DType>> {
pub x: Tensor<R>,
pub fun: f64,
pub success: bool,
pub nodes: usize,
pub gap: f64,
pub message: String,
}
pub trait MilpAlgorithms<R: Runtime<DType = DType>>:
TensorOps<R> + ScalarOps<R> + CompareOps<R> + RuntimeClient<R>
{
fn milp(
&self,
c: &Tensor<R>,
constraints: &LinProgTensorConstraints<R>,
integrality: &Tensor<R>,
options: &MilpOptions,
) -> Result<MilpTensorResult<R>>;
}