pub struct SemanticContentRouter { /* private fields */ }Expand description
Routes content queries to the most semantically relevant nodes.
Maintains a registry of TopicEmbeddings and, for each query, computes
cosine similarity against every registered embedding, filters by
min_similarity, ranks by combined_score, and caps results at
max_candidates.
§Example
use ipfrs_semantic::content_router::{
RouterConfig, SemanticContentRouter, TopicEmbedding,
};
let config = RouterConfig { min_similarity: 0.5, max_candidates: 5 };
let mut router = SemanticContentRouter::new(config);
let emb = TopicEmbedding::new("node-1", "science", vec![1.0, 0.0, 0.0], 100);
router.register_topic(emb);
let decision = router.route(&[0.9, 0.1, 0.0]);
assert!(decision.best_node.is_some());Implementations§
Source§impl SemanticContentRouter
impl SemanticContentRouter
Sourcepub fn new(config: RouterConfig) -> Self
pub fn new(config: RouterConfig) -> Self
Creates a new router with the given configuration.
Sourcepub fn register_topic(&mut self, topic: TopicEmbedding)
pub fn register_topic(&mut self, topic: TopicEmbedding)
Registers a topic embedding.
Multiple topics from the same node are allowed.
Sourcepub fn update_load(&mut self, node_id: &str, topic: &str, load: usize)
pub fn update_load(&mut self, node_id: &str, topic: &str, load: usize)
Updates the current load for a specific (node, topic) pair.
If no matching entry is found, this is a no-op.
Sourcepub fn route(&mut self, query_embedding: &[f32]) -> RoutingDecision
pub fn route(&mut self, query_embedding: &[f32]) -> RoutingDecision
Routes a query embedding to the most suitable nodes.
Steps:
- Compute cosine similarity to every registered topic embedding.
- Filter candidates whose similarity is below
min_similarity. - Sort remaining candidates by
combined_score(descending). - Retain at most
max_candidatesresults. - Update statistics and return the
RoutingDecision.
Sourcepub fn unregister_node(&mut self, node_id: &str)
pub fn unregister_node(&mut self, node_id: &str)
Removes all registered topic embeddings for the given node.
Sourcepub fn stats(&self) -> &RouterStats
pub fn stats(&self) -> &RouterStats
Returns a reference to the accumulated routing statistics.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for SemanticContentRouter
impl RefUnwindSafe for SemanticContentRouter
impl Send for SemanticContentRouter
impl Sync for SemanticContentRouter
impl Unpin for SemanticContentRouter
impl UnsafeUnpin for SemanticContentRouter
impl UnwindSafe for SemanticContentRouter
Blanket Implementations§
impl<T> Allocation for T
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.