Skip to main content

chai/interfaces/
web.rs

1use crate::config::{目标配置, 优化配置, 求解器配置, 配置};
2use crate::contexts::default::默认上下文;
3use crate::encoders::default::默认编码器;
4use crate::interfaces::{默认输入, 消息, 界面};
5use crate::objectives::default::默认目标函数;
6use crate::objectives::目标函数;
7use crate::operators::default::默认操作;
8use console_error_panic_hook::set_once;
9use js_sys::Function;
10use serde::Serialize;
11use serde_wasm_bindgen::{from_value, to_value, Serializer};
12use wasm_bindgen::{prelude::*, JsError};
13
14/// 通过图形界面来使用 libchai 的入口,实现了界面特征
15#[wasm_bindgen]
16pub struct Web {
17    回调: Function,
18    参数: 默认输入,
19}
20
21/// 用于在图形界面验证输入的配置是否正确
22#[wasm_bindgen]
23pub fn validate(js_config: JsValue) -> Result<JsValue, JsError> {
24    set_once();
25    let 配置: 配置 = from_value(js_config)?;
26    let 序列化 = Serializer::json_compatible();
27    Ok(配置.serialize(&序列化)?)
28}
29
30#[wasm_bindgen]
31impl Web {
32    pub fn new(回调: Function) -> Web {
33        set_once();
34        let 参数 = 默认输入::default();
35        Self { 回调, 参数 }
36    }
37
38    pub fn sync(&mut self, 前端参数: JsValue) -> Result<(), JsError> {
39        self.参数 = from_value(前端参数)?;
40        Ok(())
41    }
42
43    pub fn encode_evaluate(&self, 前端目标函数配置: JsValue) -> Result<JsValue, JsError> {
44        let 目标函数配置: 目标配置 = from_value(前端目标函数配置)?;
45        let mut 输入 = self.参数.clone();
46        输入.配置.optimization = Some(优化配置 {
47            objective: 目标函数配置,
48            metaheuristic: None,
49        });
50        let 上下文 = 默认上下文::新建(输入)?;
51        let 编码器 = 默认编码器::新建(&上下文)?;
52        let mut 目标函数 = 默认目标函数::新建(&上下文, 编码器)?;
53        let (指标, _) = 目标函数.计算(&上下文.初始决策, &None);
54        let 码表 = 上下文.生成码表(&目标函数.编码结果);
55        Ok(to_value(&(码表, 指标))?)
56    }
57
58    pub fn optimize(&self) -> Result<(), JsError> {
59        let 优化方法配置 = self.参数.配置.clone().optimization.unwrap().metaheuristic.unwrap();
60        let 上下文 = 默认上下文::新建(self.参数.clone())?;
61        let 编码器 = 默认编码器::新建(&上下文)?;
62        let mut 目标函数 = 默认目标函数::新建(&上下文, 编码器)?;
63        let mut 操作 = 默认操作::新建(&上下文)?;
64        let 求解器配置::SimulatedAnnealing(退火) = 优化方法配置;
65        退火.优化(&上下文.初始决策, &mut 目标函数, &mut 操作, &上下文, self);
66        Ok(())
67    }
68}
69
70impl 界面 for Web {
71    fn 发送(&self, 消息: 消息) {
72        let 序列化 = Serializer::json_compatible();
73        let 前端消息 = 消息.serialize(&序列化).unwrap();
74        self.回调.call1(&JsValue::null(), &前端消息).unwrap();
75    }
76}