summaryrefslogtreecommitdiff
path: root/chain/src/default.rs
diff options
context:
space:
mode:
Diffstat (limited to 'chain/src/default.rs')
-rw-r--r--chain/src/default.rs126
1 files changed, 97 insertions, 29 deletions
diff --git a/chain/src/default.rs b/chain/src/default.rs
index 31c1002..c873de7 100644
--- a/chain/src/default.rs
+++ b/chain/src/default.rs
@@ -110,13 +110,13 @@ impl Default for DerIterIndex {
}
/// A complex type used for storing values of edges with two layers.
-type SecondTypeValue = (PaSe, bool, Vec<(Edge, usize)>);
+type SecondTypeValue = (PaSe, bool, Vec<(Roi, usize)>);
/// An iterator of TwoLayers.
#[derive(Debug, Default)]
pub struct DerIter {
/// Stores edges of only one layer.
- singles: Vec<(Edge, usize)>,
+ singles: Vec<(Roi, usize)>,
/// Stores edges with two layers. They are grouped by their
/// labels of the second layer.
///
@@ -139,7 +139,7 @@ impl DerIter {
label: usize,
forest_source: PaSe,
accepting: bool,
- edges: Vec<(Edge, usize)>,
+ edges: Vec<(Roi, usize)>,
) {
if let Some((_, _, vec)) = self.seconds.get_mut(&label) {
vec.extend(edges);
@@ -449,6 +449,30 @@ impl Chain for DefaultChain {
self.current = new;
}
+ fn update_epsilon(
+ &mut self,
+ node_id: usize,
+ edges: impl Iterator<Item = (Roi, usize)>,
+ ) -> Result<(), Self::Error> {
+ for (roi, _) in edges {
+ match roi.imaginary_part() {
+ Some(target) => {
+ if matches!(self.accepting_vec.get(target).copied(), Some(true)) {
+ let accepting_vec_len = self.accepting_vec.len();
+
+ *self
+ .accepting_vec
+ .get_mut(node_id)
+ .ok_or(Error::IndexOutOfBounds(node_id, accepting_vec_len))? = true;
+ }
+ }
+ None => {}
+ }
+ }
+
+ Ok(())
+ }
+
type DerIter = DerIter;
fn derive(&mut self, t: usize, pos: usize) -> Result<Self::DerIter, Self::Error> {
@@ -484,7 +508,7 @@ impl Chain for DefaultChain {
child_iter: impl Iterator<Item = usize> + ExactSizeIterator + Clone,
atom_child_iter: impl Iterator<Item = usize> + Clone,
pase: PaSe,
- mut output: impl AsMut<Vec<(Edge, usize)>>,
+ mut output: impl AsMut<Vec<(Roi, usize)>>,
) -> Result<(), Error> {
// First check the values from iterators are all valid.
let graph_len = chain.graph.nodes_len();
@@ -516,11 +540,9 @@ impl Chain for DefaultChain {
for atom_child in atom_child_iter.clone() {
let atom_child_accepting = chain.atom.is_accepting(atom_child).unwrap();
- let atom_child_empty_node = chain.atom.is_empty_node(atom_child).unwrap();
+ // let atom_child_empty_node = chain.atom.is_empty_node(atom_child).unwrap();
- if !atom_child_empty_node {
- num += child_iter.len();
- }
+ num += child_iter.len();
if atom_child_accepting {
num += child_iter_total_degree;
@@ -539,16 +561,19 @@ impl Chain for DefaultChain {
let atom_child_accepting = chain.atom.is_accepting(atom_child).unwrap();
let atom_child_empty_node = chain.atom.is_empty_node(atom_child).unwrap();
- let edge = Edge::new(atom_child, pase, atom_child_accepting);
+ let roi = Edge::new(atom_child, pase, atom_child_accepting).into();
- if !atom_child_empty_node {
- output.extend(child_iter.clone().map(|child| (edge, child)));
- }
+ if atom_child_empty_node {
+ output.extend(child_iter.clone().map(|child| (child.into(), child)));
+ } else {
+ output.extend(child_iter.clone().map(|child| (roi, child)));
+ };
if atom_child_accepting {
for child in child_iter.clone() {
for (child_label, child_child) in chain.graph.labels_of(child).unwrap() {
- output.extend(child_child.map(|target| (*child_label, target)));
+ output
+ .extend(child_child.map(|target| ((*child_label).into(), target)));
}
}
}
@@ -666,7 +691,8 @@ impl Chain for DefaultChain {
if self.atom.is_empty_node(atom_child).unwrap() {
der_iter.singles.extend(child_iter.clone().map(|child| {
(
- Edge::new(virtual_node, virtual_pase, accepting),
+ Edge::new(virtual_node, virtual_pase, accepting)
+ .into(),
child,
)
}));
@@ -684,7 +710,7 @@ impl Chain for DefaultChain {
self.graph.labels_of(child).unwrap().flat_map(
|(child_label, child_child_iter)| {
child_child_iter.map(|child_child| {
- (*child_label, child_child)
+ ((*child_label).into(), child_child)
})
},
)
@@ -716,18 +742,39 @@ mod test_der_iter {
let parent = Default::default();
- der_iter.singles.push((Edge::new(0, parent, true), 0));
+ der_iter
+ .singles
+ .push((Edge::new(0, parent, true).into(), 0));
- der_iter.singles.push((Edge::new(1, parent, true), 0));
+ der_iter
+ .singles
+ .push((Edge::new(1, parent, true).into(), 0));
- der_iter.singles.push((Edge::new(2, parent, true), 0));
+ der_iter
+ .singles
+ .push((Edge::new(2, parent, true).into(), 0));
- der_iter.add_second_layer(3, parent, true, vec![(Edge::new(4, parent, true), 1)]);
+ der_iter.add_second_layer(
+ 3,
+ parent,
+ true,
+ vec![(Edge::new(4, parent, true).into(), 1)],
+ );
- der_iter.add_second_layer(6, parent, true, vec![(Edge::new(5, parent, true), 1)]);
+ der_iter.add_second_layer(
+ 6,
+ parent,
+ true,
+ vec![(Edge::new(5, parent, true).into(), 1)],
+ );
// add an entry with a repeated label
- der_iter.add_second_layer(3, parent, true, vec![(Edge::new(7, parent, true), 2)]);
+ der_iter.add_second_layer(
+ 3,
+ parent,
+ true,
+ vec![(Edge::new(7, parent, true).into(), 2)],
+ );
assert_eq!(
der_iter.next(),
@@ -736,8 +783,8 @@ mod test_der_iter {
parent,
true,
vec![
- (Edge::new(4, parent, true), 1),
- (Edge::new(7, parent, true), 2)
+ (Edge::new(4, parent, true).into(), 1),
+ (Edge::new(7, parent, true).into(), 2)
]
))
);
@@ -748,23 +795,23 @@ mod test_der_iter {
6,
parent,
true,
- vec![(Edge::new(5, parent, true), 1)]
+ vec![(Edge::new(5, parent, true).into(), 1)]
))
);
assert_eq!(
der_iter.next(),
- Some(TwoLayers::One(Edge::new(0, parent, true), 0))
+ Some(TwoLayers::One(Edge::new(0, parent, true).into(), 0))
);
assert_eq!(
der_iter.next(),
- Some(TwoLayers::One(Edge::new(1, parent, true), 0))
+ Some(TwoLayers::One(Edge::new(1, parent, true).into(), 0))
);
assert_eq!(
der_iter.next(),
- Some(TwoLayers::One(Edge::new(2, parent, true), 0))
+ Some(TwoLayers::One(Edge::new(2, parent, true).into(), 0))
);
assert_eq!(der_iter.next(), None);
@@ -800,6 +847,24 @@ mod test_chain {
chain.chain(0, 11)?;
chain.chain(0, 12)?;
+ let forest = &mut chain.forest;
+
+ let node = forest
+ .query_label(ForestLabel::from(GrammarLabel::new(TNT::Non(6), 6)))
+ .unwrap();
+
+ forest.splone(node, Some(13), forest.degree(node)?)?;
+
+ let node = forest
+ .query_label(ForestLabel::from(GrammarLabel::new(TNT::Non(1), 0)))
+ .unwrap();
+
+ forest.splone(node, Some(13), forest.degree(node)?)?;
+
+ forest.splone(0, Some(13), forest.degree(0)?)?;
+
+ forest.print_viz("forest.gv")?;
+
assert!(matches!(chain.epsilon(), Ok(true)));
#[cfg(feature = "test-print-viz")]
@@ -823,10 +888,13 @@ mod test_chain {
chain.chain(0, 0)?;
chain.chain(2, 1)?;
chain.chain(2, 2)?;
- // chain.chain(2, 3)?;
- chain.chain(1, 3)?;
+ chain.chain(2, 3)?;
+ chain.chain(1, 4)?;
+
+ chain.forest.print_viz("forest.gv")?;
dbg!(chain.current(), chain.history());
+ item::default::print_labels(&chain.atom, &chain.forest)?;
#[cfg(feature = "test-print-viz")]
{