use super::*;
use crate::{
config::{目标配置, 优化配置, 求解器配置},
contexts::default::默认上下文,
encoders::default::默认编码器,
objectives::{default::默认目标函数, metric::默认指标, 目标函数},
operators::default::默认操作,
码表项, 错误,
};
use console_error_panic_hook::set_once;
#[derive(Default)]
pub struct WebApi {
参数: 默认输入,
回调: Option<Box<dyn Fn(&消息) + Send + Sync>>,
}
impl WebApi {
pub fn new() -> Self {
set_once();
let 参数 = 默认输入::default();
Self {
参数, 回调: None
}
}
pub fn set_callback<F>(&mut self, callback: F)
where
F: Fn(&消息) + Send + Sync + 'static,
{
self.回调 = Some(Box::new(callback));
}
pub fn sync(&mut self, 前端参数: 默认输入) -> Result<(), 错误> {
self.参数 = 前端参数;
Ok(())
}
pub fn encode_evaluate(
&self,
目标函数配置: 目标配置,
) -> Result<(Vec<码表项>, 默认指标), 错误> {
let mut 输入 = self.参数.clone();
输入.配置.optimization = Some(优化配置 {
objective: 目标函数配置,
metaheuristic: None,
});
let 上下文 = 默认上下文::新建(输入)?;
let 编码器 = 默认编码器::新建(&上下文)?;
let mut 目标函数 = 默认目标函数::新建(&上下文, 编码器)?;
let (指标, _) = 目标函数.计算(&上下文.初始决策, &None);
let 码表 = 上下文.生成码表(&目标函数.编码结果);
Ok((码表, 指标))
}
pub fn optimize(&self) -> Result<(), 错误> {
let 优化方法配置 = self.参数.配置.clone().optimization.unwrap().metaheuristic.unwrap();
let 上下文 = 默认上下文::新建(self.参数.clone())?;
let 编码器 = 默认编码器::新建(&上下文)?;
let mut 目标函数 = 默认目标函数::新建(&上下文, 编码器)?;
let mut 操作 = 默认操作::新建(&上下文)?;
let 求解器配置::SimulatedAnnealing(退火) = 优化方法配置;
退火.优化(&上下文.初始决策, &mut 目标函数, &mut 操作, &上下文, self, None);
Ok(())
}
}
impl 界面 for WebApi {
fn 发送(&self, 消息: 消息) {
if let Some(ref callback) = self.回调 {
callback(&消息);
}
}
}