1use crate::{
2 config::{决策生成器规则, 变量规则, 安排, 安排描述, 广义码位},
3 optimizers::决策,
4 元素, 错误,
5};
6use indexmap::IndexMap;
7use regex::Regex;
8use rustc_hash::{FxHashMap, FxHashSet};
9use std::collections::VecDeque;
10pub mod default;
11
12pub trait 上下文 {
13 type 决策: 决策;
14
15 fn 序列化(&self, 决策: &Self::决策) -> String;
16}
17
18#[derive(Debug, Clone)]
19pub struct 条件<T> {
20 pub 元素: 元素,
21 pub 谓词: bool,
22 pub 值: T,
23}
24
25#[derive(Debug, Clone)]
26pub struct 条件安排<T> {
27 pub 安排: T,
28 pub 分数: f64,
29 pub 条件: Vec<条件<T>>,
30}
31
32pub fn 合并初始决策(
33 原始决策空间: &mut IndexMap<String, Vec<安排描述>>,
34 原始决策: &mut IndexMap<String, 安排>,
35) {
36 for 元素名称 in 原始决策.keys() {
38 if !原始决策空间.contains_key(元素名称) {
39 原始决策空间.insert(元素名称.clone(), vec![]);
40 }
41 }
42 for 元素名称 in 原始决策空间.keys() {
43 if !原始决策.contains_key(元素名称) {
44 原始决策.insert(元素名称.clone(), 安排::Unused(()));
45 }
46 }
47 for (元素名称, 原始安排列表) in 原始决策空间.iter_mut() {
49 let 原始安排 = 原始决策[元素名称].clone();
50 if !原始安排列表.iter().any(|x| &x.value == &原始安排) {
51 原始安排列表.insert(
52 0,
53 安排描述 {
54 value: 原始安排,
55 score: 0.0,
56 condition: None,
57 },
58 );
59 }
60 }
61}
62
63pub fn 展开变量(
64 原始决策空间: &mut IndexMap<String, Vec<安排描述>>,
65 原始变量映射: &IndexMap<String, 变量规则>,
66) {
67 for (_, 原始安排列表) in 原始决策空间.iter_mut() {
68 let mut 队列 = VecDeque::from(原始安排列表.clone());
69 原始安排列表.clear();
70 while let Some(原始安排) = 队列.pop_front() {
71 let mut 是否展开 = false;
72 if let 安排::Advanced(keys) = &原始安排.value {
73 for (序号, 映射键) in keys.iter().enumerate() {
74 if let 广义码位::Variable {
75 variable: generator,
76 } = 映射键
77 {
78 let 变量取值列表 = 原始变量映射.get(generator).unwrap();
79 for 变量取值 in &变量取值列表.keys {
80 let mut 新映射键列表 = keys.clone();
81 新映射键列表[序号] = 广义码位::Ascii(*变量取值);
82 let 新原始安排 = 安排描述 {
83 value: 安排::Advanced(新映射键列表),
84 score: 原始安排.score,
85 condition: 原始安排.condition.clone(),
86 };
87 队列.push_back(新原始安排);
88 }
89 是否展开 = true;
90 break;
91 }
92 }
93 }
94 if !是否展开 {
95 原始安排列表.push(原始安排);
96 }
97 }
98 }
99}
100
101pub fn 拓扑排序(
102 原始决策空间: &IndexMap<String, Vec<安排描述>>,
103) -> Result<(Vec<String>, FxHashMap<String, Vec<String>>), 错误> {
104 let mut 入度 = FxHashMap::default();
106 let mut 元素图 = FxHashMap::default();
107 for 元素名称 in 原始决策空间.keys() {
108 入度.insert(元素名称.clone(), 0);
109 元素图.insert(元素名称.clone(), vec![]);
110 }
111 for (元素名称, 原始安排列表) in 原始决策空间 {
112 let mut 依赖 = FxHashSet::default();
113 for 原始安排 in 原始安排列表 {
114 if let 安排::Advanced(keys) = &原始安排.value {
115 for k in keys {
116 if let 广义码位::Reference { element, .. } = k {
117 依赖.insert(element.clone());
118 }
119 }
120 } else if let 安排::Grouped { element } = &原始安排.value {
121 依赖.insert(element.clone());
122 }
123 if let Some(条件列表) = &原始安排.condition {
124 for 条件 in 条件列表 {
125 依赖.insert(条件.element.clone());
126 }
127 }
128 }
129 for 依赖元素 in &依赖 {
130 元素图.get_mut(依赖元素).map(|v| {
131 v.push(元素名称.clone());
132 *入度.get_mut(元素名称).unwrap() += 1;
133 });
134 }
135 }
136
137 let mut 队列 = VecDeque::new();
139 for (元素名称, d) in &入度 {
140 if *d == 0 {
141 队列.push_back(元素名称.clone());
142 }
143 }
144
145 let mut 排序后元素名称 = Vec::new();
146 while let Some(u) = 队列.pop_front() {
147 排序后元素名称.push(u.clone());
148 for v in &元素图[&u] {
149 let deg = 入度.get_mut(v).unwrap();
150 *deg -= 1;
151 if *deg == 0 {
152 队列.push_back(v.clone());
153 }
154 }
155 }
156
157 if 排序后元素名称.len() != 原始决策空间.len() {
159 let remaining: Vec<_> = 入度
160 .into_iter()
161 .filter(|(_, deg)| *deg > 0)
162 .map(|(k, _)| k)
163 .collect();
164 return Err(format!("检测到依赖环,无法进行拓扑排序,剩余节点:{:?}", remaining).into());
165 }
166
167 Ok((排序后元素名称, 元素图))
168}
169
170pub fn 应用生成器(
171 原始决策空间: &mut IndexMap<String, Vec<安排描述>>,
172 原始生成器列表: &Vec<决策生成器规则>,
173) {
174 for 生成器 in 原始生成器列表 {
175 let regex = Regex::new(&生成器.regex).unwrap();
176 for (元素名称, 原始安排列表) in 原始决策空间.iter_mut() {
177 if !regex.is_match(元素名称) {
178 continue;
179 }
180 if let 安排::Advanced(码位列表) = &生成器.value.value {
181 let mut values = FxHashSet::default();
182 for 现有安排 in 原始安排列表.iter() {
183 if matches!(&现有安排.value, 安排::Basic(_) | 安排::Advanced(_)) {
184 let 现有码位列表 = &现有安排.value.normalize();
185 let mut valid = true;
186 let mut 合成 = vec![];
187 for (i, 码位) in 码位列表.iter().enumerate() {
188 if let Some(现有码位) = 现有码位列表.get(i) {
189 if !matches!(现有码位, 广义码位::Ascii(..))
191 && matches!(码位, 广义码位::Variable { .. })
192 {
193 valid = false;
194 break;
195 }
196 let 替换后 = if let 广义码位::Placeholder(_) = 码位 {
197 现有码位.clone()
198 } else {
199 码位.clone()
200 };
201 合成.push(替换后);
202 } else {
203 valid = false;
204 break;
205 }
206 }
207 if !valid {
208 continue;
209 }
210 values.insert(合成);
211 }
212 }
213 for value in values {
214 let 新原始安排 = 安排描述 {
215 value: 安排::Advanced(value),
216 score: 生成器.value.score,
217 condition: 生成器.value.condition.clone(),
218 };
219 原始安排列表.push(新原始安排);
220 }
221 } else {
222 原始安排列表.push(生成器.value.clone());
223 }
224 }
225 }
226}
227
228pub fn 补充存在性条件(原始决策空间: &mut IndexMap<String, Vec<安排描述>>) {
229 for (_, 原始安排列表) in 原始决策空间.iter_mut() {
230 for 安排描述 in 原始安排列表.iter_mut() {
231 let mut 需要存在的元素 = FxHashSet::default();
232 match &安排描述.value {
233 安排::Grouped { element } => {
234 需要存在的元素.insert(element.clone());
235 }
236 安排::Advanced(ref keys) => {
237 for k in keys {
238 if let 广义码位::Reference { element, .. } = k {
239 需要存在的元素.insert(element.clone());
240 }
241 }
242 }
243 _ => {}
244 }
245 if 需要存在的元素.is_empty() {
246 continue;
247 }
248 let mut condition = vec![];
249 for 元素 in &需要存在的元素 {
250 condition.push(crate::config::条件 {
251 element: 元素.clone(),
252 op: "不是".to_string(),
253 value: 安排::Unused(()),
254 });
255 }
256 if let Some(existing_condition) = &mut 安排描述.condition {
257 existing_condition.extend(condition);
258 } else {
259 安排描述.condition = Some(condition);
260 }
261 }
262 }
263}