Changeset - 4eb3ab63f9dd
[Not reviewed]
default
0 2 0
Laman - 10 months ago 2024-06-30 23:16:37

refactored expand_alphabet interation
2 files changed with 14 insertions and 16 deletions:
0 comments (0 inline, 0 general)
regexp.py
Show inline comments
 
@@ -416,21 +416,20 @@ class RegexpDFA:
 

	
 
		n1 = len(self.alphabet_index)
 
		m = len(self.rules) // n1
 

	
 
		combined_alphabet = set(self.alphabet_index.keys()) | set(alphabet_index.keys())
 
		combined_index = {c: i for (i, c) in enumerate(sorted(combined_alphabet))}
 
		conversion_index = {v: combined_index[k] for (k, v) in self.alphabet_index.items()}
 
		conversion_index = {combined_index[k]: v for (k, v) in self.alphabet_index.items()}
 
		n2 = len(combined_alphabet)
 

	
 
		rules = []
 
		for i in range(0, len(self.rules), n1):
 
			row = ([m]*n2)
 
			for (j, st) in enumerate(self.rules[i:i+n1]):
 
				row[conversion_index[j]] = st
 
			rules.extend(row)
 
		rules = [
 
			self.rules[i*n1 + conversion_index[j]]
 
			if j in conversion_index else m
 
			for i in range(m) for j in range(n2)
 
		]
 
		rules.extend([m]*n2)
 

	
 
		return RegexpDFA(rules, self.end_states, combined_index).reduce().normalize()
 

	
 
	def _build_product_automaton(self, r):
 
		n = len(self.alphabet_index)
src/regexp.rs
Show inline comments
 
@@ -295,24 +295,23 @@ impl RegexpDFA {
 
		let m = self.rules.len() / n1;
 

	
 
		let combined_alphabet: HashSet<char> = HashSet::from_iter(self.alphabet_index.keys().chain(alphabet_index.keys()).copied());
 
		let mut combined_vec = Vec::from_iter(combined_alphabet.into_iter());
 
		combined_vec.sort();
 
		let combined_index = HashMap::from_iter(combined_vec.iter().enumerate().map(|(i, c)| (*c, i)));
 
		let conversion_index: HashMap<usize, usize> = HashMap::from_iter(self.alphabet_index.iter().map(|(k, v)| (*v, combined_index[k])));
 
		let conversion_index: HashMap<usize, usize> = HashMap::from_iter(self.alphabet_index.iter().map(|(k, v)| (combined_index[k], *v)));
 
		let n2 = combined_vec.len();
 

	
 
		let mut rules = vec![];
 
		for i in 0..m {
 
			let mut row = vec![m;n2];
 
			for (j, st) in self.rules[i*n1..(i+1)*n1].iter().enumerate() {
 
				row[conversion_index[&j]] = *st;
 
		let rules: Vec<usize> = (0..m*n2).map(
 
			|i| {
 
				let (j, k) = (i/n2, i%n2);
 
				return if conversion_index.contains_key(&k) {
 
					self.rules[j*n1 + conversion_index[&k]]
 
				} else {m};
 
			}
 
			rules.append(&mut row);
 
		}
 
		rules.append(&mut vec![m;n2]);
 
		).chain(std::iter::repeat(m).take(n2)).collect();
 

	
 
		return RegexpDFA{rules, end_states: self.end_states.clone(), alphabet_index: combined_index}.reduce().normalize();
 
	}
 

	
 
	fn build_product_automaton(&self, other: &RegexpDFA) -> RegexpDFA {
 
		let n = self.alphabet_index.len();
0 comments (0 inline, 0 general)