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