pub struct WfaLearning<F, A>where
F: Field<Additive: Invertible, Multiplicative: Invertible>,
A: BlackBoxAutomaton<Output = F::T>,{
automaton: A,
prefixes: Vec<Vec<usize>>,
suffixes: Vec<Vec<usize>>,
inv_h: Matrix<F>,
nh: Vec<Matrix<F>>,
wfa: WeightedFiniteAutomaton<F>,
_marker: PhantomData<fn() -> F>,
}Fields§
§automaton: A§prefixes: Vec<Vec<usize>>§suffixes: Vec<Vec<usize>>§inv_h: Matrix<F>§nh: Vec<Matrix<F>>§wfa: WeightedFiniteAutomaton<F>§_marker: PhantomData<fn() -> F>Implementations§
Source§impl<F, A> WfaLearning<F, A>where
F: Field<T: PartialEq, Additive: Invertible, Multiplicative: Invertible>,
A: BlackBoxAutomaton<Output = F::T>,
impl<F, A> WfaLearning<F, A>where
F: Field<T: PartialEq, Additive: Invertible, Multiplicative: Invertible>,
A: BlackBoxAutomaton<Output = F::T>,
pub fn new(automaton: A) -> Self
pub fn wfa(&self) -> &WeightedFiniteAutomaton<F>
Sourcefn split_sample(&mut self, sample: &[usize]) -> Option<(Vec<usize>, Vec<usize>)>
fn split_sample(&mut self, sample: &[usize]) -> Option<(Vec<usize>, Vec<usize>)>
Examples found in repository?
crates/competitive/src/algorithm/automata_learning.rs (line 524)
523 pub fn train_sample(&mut self, sample: &[usize]) -> bool {
524 let Some((prefix, suffix)) = self.split_sample(sample) else {
525 return false;
526 };
527 self.prefixes.push(prefix);
528 self.suffixes.push(suffix);
529 let n = self.inv_h.shape.0;
530 let prefix = &self.prefixes[n];
531 let suffix = &self.suffixes[n];
532 let u = Matrix::<F>::new_with((n, 1), |i, _| {
533 self.automaton.behavior(
534 self.prefixes[i]
535 .iter()
536 .cloned()
537 .chain(suffix.iter().cloned()),
538 )
539 });
540 let v = Matrix::<F>::new_with((1, n), |_, j| {
541 self.automaton.behavior(
542 prefix
543 .iter()
544 .cloned()
545 .chain(self.suffixes[j].iter().cloned()),
546 )
547 });
548 let w = Matrix::<F>::new_with((1, 1), |_, _| {
549 self.automaton
550 .behavior(prefix.iter().cloned().chain(suffix.iter().cloned()))
551 });
552 let t = &self.inv_h * &u;
553 let s = &v * &self.inv_h;
554 let d = F::inv(&(&w - &(&v * &t))[0][0]);
555 let dh = &t * &s;
556 for i in 0..n {
557 for j in 0..n {
558 F::add_assign(&mut self.inv_h[i][j], &F::mul(&dh[i][j], &d));
559 }
560 }
561 self.inv_h
562 .add_col_with(|i, _| F::neg(&F::mul(&t[i][0], &d)));
563 self.inv_h.add_row_with(|_, j| {
564 if j != n {
565 F::neg(&F::mul(&s[0][j], &d))
566 } else {
567 d.clone()
568 }
569 });
570
571 for (x, transition) in self.wfa.transitions.iter_mut().enumerate() {
572 let b = &(&self.nh[x] * &t) * &s;
573 for i in 0..n {
574 for j in 0..n {
575 F::add_assign(&mut transition[i][j], &F::mul(&b[i][j], &d));
576 }
577 }
578 }
579 for (x, nh) in self.nh.iter_mut().enumerate() {
580 nh.add_col_with(|i, j| {
581 self.automaton.behavior(
582 self.prefixes[i]
583 .iter()
584 .cloned()
585 .chain([x])
586 .chain(self.suffixes[j].iter().cloned()),
587 )
588 });
589 nh.add_row_with(|i, j| {
590 self.automaton.behavior(
591 self.prefixes[i]
592 .iter()
593 .cloned()
594 .chain([x])
595 .chain(self.suffixes[j].iter().cloned()),
596 )
597 });
598 }
599 self.wfa
600 .initial_weights
601 .add_col_with(|_, _| if n == 0 { F::one() } else { F::zero() });
602 self.wfa
603 .final_weights
604 .add_row_with(|_, _| self.automaton.behavior(prefix.iter().cloned()));
605 for (x, transition) in self.wfa.transitions.iter_mut().enumerate() {
606 transition.add_col_with(|_, _| F::zero());
607 transition.add_row_with(|_, _| F::zero());
608 for i in 0..=n {
609 for j in 0..=n {
610 if i == n || j == n {
611 for k in 0..=n {
612 if i != n && j != n && k != n {
613 continue;
614 }
615 F::add_assign(
616 &mut transition[i][k],
617 &F::mul(&self.nh[x][i][j], &self.inv_h[j][k]),
618 );
619 }
620 } else {
621 let k = n;
622 F::add_assign(
623 &mut transition[i][k],
624 &F::mul(&self.nh[x][i][j], &self.inv_h[j][k]),
625 );
626 }
627 }
628 }
629 }
630 true
631 }Sourcepub fn train_sample(&mut self, sample: &[usize]) -> bool
pub fn train_sample(&mut self, sample: &[usize]) -> bool
pub fn train(&mut self, samples: impl IntoIterator<Item = Vec<usize>>)
pub fn batch_train(&mut self, samples: impl IntoIterator<Item = Vec<usize>>)
Trait Implementations§
Source§impl<F, A> Clone for WfaLearning<F, A>where
F: Field<Additive: Invertible, Multiplicative: Invertible>,
A: BlackBoxAutomaton<Output = F::T> + Clone,
impl<F, A> Clone for WfaLearning<F, A>where
F: Field<Additive: Invertible, Multiplicative: Invertible>,
A: BlackBoxAutomaton<Output = F::T> + Clone,
Source§impl<F, A> Debug for WfaLearning<F, A>where
F: Field<T: Debug, Additive: Invertible, Multiplicative: Invertible>,
A: BlackBoxAutomaton<Output = F::T> + Debug,
impl<F, A> Debug for WfaLearning<F, A>where
F: Field<T: Debug, Additive: Invertible, Multiplicative: Invertible>,
A: BlackBoxAutomaton<Output = F::T> + Debug,
Auto Trait Implementations§
impl<F, A> Freeze for WfaLearning<F, A>where
A: Freeze,
impl<F, A> RefUnwindSafe for WfaLearning<F, A>
impl<F, A> Send for WfaLearning<F, A>
impl<F, A> Sync for WfaLearning<F, A>
impl<F, A> Unpin for WfaLearning<F, A>
impl<F, A> UnwindSafe for WfaLearning<F, A>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more