Skip to main content

chai/interfaces/
server.rs

1use super::*;
2use crate::{
3    config::{目标配置, 优化配置, 求解器配置},
4    contexts::default::默认上下文,
5    encoders::default::默认编码器,
6    objectives::{default::默认目标函数, metric::默认指标, 目标函数},
7    operators::default::默认操作,
8    码表项, 错误,
9};
10use console_error_panic_hook::set_once;
11
12/// 纯 Rust 的 Web API 接口,与 wasm_bindgen Web 结构一一对应
13#[derive(Default)]
14pub struct WebApi {
15    参数: 默认输入,
16    回调: Option<Box<dyn Fn(&消息) + Send + Sync>>,
17}
18
19impl WebApi {
20    /// 创建新的 WebApi 实例,与 Web::new 对应
21    pub fn new() -> Self {
22        set_once();
23        let 参数 = 默认输入::default();
24        Self {
25            参数, 回调: None
26        }
27    }
28
29    /// 设置消息回调函数
30    pub fn set_callback<F>(&mut self, callback: F)
31    where
32        F: Fn(&消息) + Send + Sync + 'static,
33    {
34        self.回调 = Some(Box::new(callback));
35    }
36
37    /// 同步前端参数,与 Web::sync 对应
38    pub fn sync(&mut self, 前端参数: 默认输入) -> Result<(), 错误> {
39        self.参数 = 前端参数;
40        Ok(())
41    }
42
43    /// 编码评估,与 Web::encode_evaluate 对应
44    pub fn encode_evaluate(
45        &self,
46        目标函数配置: 目标配置,
47    ) -> Result<(Vec<码表项>, 默认指标), 错误> {
48        let mut 输入 = self.参数.clone();
49        输入.配置.optimization = Some(优化配置 {
50            objective: 目标函数配置,
51            metaheuristic: None,
52        });
53        let 上下文 = 默认上下文::新建(输入)?;
54        let 编码器 = 默认编码器::新建(&上下文)?;
55        let mut 目标函数 = 默认目标函数::新建(&上下文, 编码器)?;
56        let (指标, _) = 目标函数.计算(&上下文.初始决策, &None);
57        let 码表 = 上下文.生成码表(&目标函数.编码结果);
58
59        Ok((码表, 指标))
60    }
61
62    /// 优化,与 Web::optimize 对应  
63    pub fn optimize(&self) -> Result<(), 错误> {
64        let 优化方法配置 = self.参数.配置.clone().optimization.unwrap().metaheuristic.unwrap();
65        let 上下文 = 默认上下文::新建(self.参数.clone())?;
66        let 编码器 = 默认编码器::新建(&上下文)?;
67        let mut 目标函数 = 默认目标函数::新建(&上下文, 编码器)?;
68        let mut 操作 = 默认操作::新建(&上下文)?;
69        let 求解器配置::SimulatedAnnealing(退火) = 优化方法配置;
70        退火.优化(&上下文.初始决策, &mut 目标函数, &mut 操作, &上下文, self);
71        Ok(())
72    }
73}
74
75impl 界面 for WebApi {
76    fn 发送(&self, 消息: 消息) {
77        if let Some(ref callback) = self.回调 {
78            callback(&消息);
79        }
80    }
81}