xcsp3_rust/constraints/
xregular.rs1pub mod xcsp3_core {
42 use crate::constraints::xconstraint_trait::xcsp3_core::XConstraintTrait;
43 use crate::data_structs::xint_val_var::xcsp3_core::XVarVal;
44 use crate::errors::xcsp3error::xcsp3_core::Xcsp3Error;
45 use std::collections::HashMap;
46 use std::fmt::{Display, Formatter};
47
48 use crate::utils::utils_functions::xcsp3_utils::{list_to_transitions, list_to_vec_var_val};
49 use crate::variables::xdomain::xcsp3_core::XDomainInteger;
50 use crate::variables::xvariable_set::xcsp3_core::XVariableSet;
51
52 pub struct XRegular<'a> {
54 scope: Vec<XVarVal>,
55 map: HashMap<String, &'a XDomainInteger>,
56 set: &'a XVariableSet,
57 start: String,
58 r#final: Vec<String>,
59 transitions: Vec<(String, i32, String)>,
60 }
61
62 impl Display for XRegular<'_> {
63 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
64 let mut ret = String::default();
65 for e in self.scope.iter() {
66 ret.push('(');
67 ret.push_str(&e.to_string());
68 ret.push_str("), ")
69 }
70 write!(
71 f,
72 "XRegular: list = {}, transitions = {:?}, start = {}, final = {:?}",
73 ret, self.transitions, self.start, self.r#final
74 )
75 }
76 }
77
78 impl XConstraintTrait for XRegular<'_> {
79 fn get_scope_string(&self) -> &Vec<XVarVal> {
80 &self.scope
81 }
82
83 fn get_scope(&mut self) -> Vec<(&String, &XDomainInteger)> {
84 for e in &self.scope {
85 if let XVarVal::IntVar(s) = e {
86 if !self.map.contains_key(s) {
87 if let Ok(vec) = self.set.construct_scope(&[s]) {
88 for (vs, vv) in vec.into_iter() {
89 self.map.insert(vs, vv);
90 }
91 }
92 }
93 }
94 }
95 let mut scope_vec_var: Vec<(&String, &XDomainInteger)> = vec![];
96 for e in self.map.iter() {
97 scope_vec_var.push((e.0, e.1))
98 }
99 scope_vec_var
100 }
101 }
102
103 impl<'a> XRegular<'a> {
104 pub fn from_str(
105 list: &str,
106 transitions_str: &str,
107 start_str: &str,
108 final_str: &str,
109 set: &'a XVariableSet,
110 ) -> Result<Self, Xcsp3Error> {
111 match list_to_vec_var_val(list) {
112 Ok(scope_vec_str) => {
113 let mut finals: Vec<String> = vec![];
114 let t_final: Vec<&str> = final_str.split_whitespace().collect();
115 for s in t_final.iter() {
116 finals.push(s.to_string());
117 }
118 match list_to_transitions(transitions_str) {
119 Ok(transitions) => Ok(XRegular::new(
120 scope_vec_str,
121 set,
122 start_str.to_string(),
123 finals,
124 transitions,
125 )),
126 Err(e) => Err(e),
127 }
128 }
129 Err(e) => Err(e),
130 }
131 }
132
133 pub fn new(
134 scope: Vec<XVarVal>,
135 set: &'a XVariableSet,
136 start: String,
137 r#final: Vec<String>,
138 transitions: Vec<(String, i32, String)>,
139 ) -> Self {
140 XRegular {
141 scope,
142 map: Default::default(),
143 set,
144 start,
145 r#final,
146 transitions,
147 }
148 }
149
150 pub fn get_start(&self) -> &str {
151 &self.start
152 }
153
154 pub fn get_final(&self) -> &Vec<String> {
155 &self.r#final
156 }
157
158 pub fn get_transitions(&self) -> &Vec<(String, i32, String)> {
159 &self.transitions
160 }
161 }
162}