pub struct FusionOptions {
pub hops: usize,
pub graph_boost: f64,
pub pool: Option<usize>,
}Expand description
Tuning knobs for
MemoryService::recall_fused.
Default matches the values validated on the LoCoMo/HotpotQA/TimeQA
benchmarks (examples/locomo, examples/multihop, examples/timeqa):
graph_boost = 0.15 was the optimum of a sweep (0.30/0.50/0.80 all
degraded ranking quality), and hops = 2 is the minimum depth at which a
fact wired only through a shared topic (the remember_extracted hub
scaffolding: fact → hub is hop 1, hub → sibling fact is hop 2) becomes
reachable at all.
Fields§
§hops: usizeHops the graph traversal walks from the top vector seed.
graph_boost: f64Weight added to a graph-reached fact’s normalised vector score.
pool: Option<usize>Depth of the oversampled vector pool fusion re-ranks. None uses the
proven default (k scaled up, floored at 64 — see
crate::fusion::pool_size). Widen this to give
MemoryService::recall_fused_reranked’s
reranker more candidates to work with.
Implementations§
Source§impl FusionOptions
impl FusionOptions
Sourcepub fn from_knobs(
hops: Option<usize>,
graph_boost: Option<f64>,
pool: Option<usize>,
) -> Self
pub fn from_knobs( hops: Option<usize>, graph_boost: Option<f64>, pool: Option<usize>, ) -> Self
Build options from optional, untrusted tuning knobs, applying the
defaults and clamps every binding must enforce identically: hops
clamped to the graph-traversal ceiling
(clamp_hops), graph_boost defaulted when
absent, and pool clamped to the recall ceiling
(clamp_recall_limit) or left at the
proven default. The MCP recall_fused tool and the Python
recall_fused binding both build their options here — same three
knobs, same clamps — so the transports can’t drift on what they
accept. A non-finite graph_boost is not filtered here — that guard
lives in Self::sanitized, applied by fusion itself so every
caller is covered, not just this constructor.
Sourcepub fn sanitized(self) -> Self
pub fn sanitized(self) -> Self
A copy with any non-finite graph_boost (NaN or ±∞) reset to the
default. A non-finite boost poisons fusion catastrophically: the score
term graph_boost · weight is NaN for every candidate — even a
pool-only one, since NaN · 0.0 == NaN — so crate::fusion::fuse’s
total_cmp sort sees all scores as equal, degenerates to a no-op, and
then truncates away the graph-reached facts fusion exists to surface
(they are appended after the vector pool). The result is silently worse
than a plain recall. Applied inside
recall_fused so no
caller — any binding, or a direct Rust user who filled the struct — can
trip it, however the options were built.
Trait Implementations§
Source§impl Clone for FusionOptions
impl Clone for FusionOptions
Source§fn clone(&self) -> FusionOptions
fn clone(&self) -> FusionOptions
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for FusionOptions
Source§impl Debug for FusionOptions
impl Debug for FusionOptions
Auto Trait Implementations§
impl Freeze for FusionOptions
impl RefUnwindSafe for FusionOptions
impl Send for FusionOptions
impl Sync for FusionOptions
impl Unpin for FusionOptions
impl UnsafeUnpin for FusionOptions
impl UnwindSafe for FusionOptions
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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> ⓘ
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> ⓘ
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> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);