refactoring and slight optimization for index assignment
This commit is contained in:
@ -3,7 +3,9 @@ use std::collections::hash_map::Entry;
|
||||
use std::collections::{BTreeSet, HashMap, HashSet};
|
||||
use std::rc::Rc;
|
||||
|
||||
use petgraph::visit::{ EdgeCount, EdgeRef, GraphBase, IntoEdgeReferences, IntoEdges, IntoNeighborsDirected, IntoNodeReferences, NodeCount };
|
||||
use petgraph::visit::{ EdgeCount, EdgeRef, GraphBase, IntoEdgeReferences,
|
||||
IntoEdges, IntoNeighborsDirected, IntoNodeReferences,
|
||||
NodeCount };
|
||||
use petgraph::Direction::{Incoming, Outgoing};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@ -289,8 +291,8 @@ impl<const N: usize, T> NextId<(T, GraphIdType), NodeType> for NodeState<N> {
|
||||
}
|
||||
}
|
||||
|
||||
type MyNodeTranslator<From, const N: usize> = Translator<(From, GraphIdType), NodeType, NodeState<N>>;
|
||||
|
||||
type MyNodeTranslator<From, const N: usize> =
|
||||
Translator<(From, GraphIdType), NodeType, NodeState<N>>;
|
||||
|
||||
|
||||
type EdgeIdType = u32;
|
||||
@ -323,13 +325,11 @@ impl<T> NextId<T, EdgeType> for EdgeState {
|
||||
type MyEdgeTranslator<From> = Translator<From, EdgeType, EdgeState>;
|
||||
|
||||
|
||||
|
||||
|
||||
type Block = Vec<NodeType>;
|
||||
type BackEdges = HashMap<NodeType, Vec<NodeType>>;
|
||||
type NodeToBlock = HashMap<NodeType, Rc<RefCell<SimpleBlock>>>;
|
||||
type CompoundPartition = Vec<Rc<CompoundBlock>>;
|
||||
type FineBlockPointer = Rc<RefCell<SimpleBlock>>;
|
||||
type SimpleBlockPointer = Rc<RefCell<SimpleBlock>>;
|
||||
type CompoundBlockPointer = Rc<CompoundBlock>;
|
||||
type BackEdgesGrouped = HashMap<Block, BackEdgesGroup>;
|
||||
|
||||
@ -369,7 +369,7 @@ trait HasBlock {
|
||||
fn block(&self) -> Block;
|
||||
}
|
||||
|
||||
impl HasBlock for FineBlockPointer {
|
||||
impl HasBlock for SimpleBlockPointer {
|
||||
fn block(&self) -> Block {
|
||||
(**self).borrow().block.clone()
|
||||
}
|
||||
@ -384,7 +384,7 @@ impl HasBlock for CompoundBlock {
|
||||
#[allow(clippy::type_complexity)]
|
||||
fn initialization<const N: usize, G>(
|
||||
graphs: &[&G; N]
|
||||
) -> ( (FineBlockPointer, FineBlockPointer),
|
||||
) -> ( (SimpleBlockPointer, SimpleBlockPointer),
|
||||
CompoundPartition,
|
||||
NodeToBlock,
|
||||
MyNodeTranslator<G::NodeId, N> )
|
||||
@ -561,7 +561,7 @@ fn split_blocks_with_grouped_backedges(
|
||||
mut backedges_grouped: BackEdgesGrouped,
|
||||
node_to_block: &mut NodeToBlock,
|
||||
) -> (
|
||||
(Vec<FineBlockPointer>, Vec<FineBlockPointer>),
|
||||
(Vec<SimpleBlockPointer>, Vec<SimpleBlockPointer>),
|
||||
Vec<CompoundBlockPointer>,
|
||||
) {
|
||||
let mut all_new_simple_blocks: Vec<Rc<RefCell<SimpleBlock>>> = vec![];
|
||||
@ -871,15 +871,23 @@ where
|
||||
|
||||
// we convert the problem into the equivalent with only one label
|
||||
let converter_edges: MyEdgeTranslator<G::EdgeWeight> = {
|
||||
let mut tmp = Translator::new();
|
||||
let mut labels: HashMap<G::EdgeWeight, u32> = HashMap::new();
|
||||
|
||||
for edge in graph_a.edge_references() {
|
||||
let _ = tmp.encode(edge.weight().clone());
|
||||
*labels.entry(edge.weight().clone()).or_default() += 1;
|
||||
}
|
||||
for edge in graph_b.edge_references() {
|
||||
let _ = tmp.encode(edge.weight().clone());
|
||||
*labels.entry(edge.weight().clone()).or_default() += 1;
|
||||
}
|
||||
// slight optimization: we reorder the edges such that edges with the
|
||||
// most occurrences have smaller index
|
||||
let mut labels: Vec<(G::EdgeWeight, u32)> = labels.into_iter().collect();
|
||||
labels.sort_by(|a, b| b.1.cmp(&a.1));
|
||||
|
||||
let mut tmp = Translator::new();
|
||||
for (label, _) in labels.into_iter() {
|
||||
let _ = tmp.encode(label);
|
||||
}
|
||||
tmp
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user