fix: warn on dropped builders and values; stop exporting EP internals
`h.event(1).team(["x"]).team(["y"]).ranking([0, 1]);` without the terminal `.commit()` was a silent no-op: no warning, no error, and the next thing the caller does is converge an empty history and read `None` skills. `EventBuilder` already carried a `#[must_use]`; the value types around it did not, so the same silence covered `Team::with_members`, `Member::new`, `Outcome::*`, `Joint` and `Prediction::outcomes`. `#[must_use]` now goes on the *types* rather than being sprinkled over methods, which covers every constructor and builder setter at once and gives the crate a rule where it previously had a list. Verified by compiling a program that drops each one and reading the warnings back, rather than by assuming the attribute took. Visibility, from #73: `Gaussian::damp_natural` was reachable from outside the crate despite being an EP damping internal called only from `src/factor/`. The stray `pub fn`s inside the private `time_slice`, `key_table` and `matrix` modules are now `pub(crate)`, so their visibility states what it means instead of relying on the module being private. `storage/mod.rs` and `factor/mod.rs` become `storage.rs` and `factor.rs`. Closes #67. Refs #73. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011hcFjNDmHXZF8URGLku5zZ
This commit is contained in:
+9
-5
@@ -228,7 +228,7 @@ pub struct TimeSlice<T: Time = i64> {
|
||||
}
|
||||
|
||||
impl<T: Time> TimeSlice<T> {
|
||||
pub fn new(time: T, p_draw: f64, convergence: crate::ConvergenceOptions) -> Self {
|
||||
pub(crate) fn new(time: T, p_draw: f64, convergence: crate::ConvergenceOptions) -> Self {
|
||||
Self {
|
||||
events: Vec::new(),
|
||||
skills: SkillStore::new(),
|
||||
@@ -282,7 +282,7 @@ impl<T: Time> TimeSlice<T> {
|
||||
);
|
||||
}
|
||||
|
||||
pub fn add_events<D: Drift<T>>(
|
||||
pub(crate) fn add_events<D: Drift<T>>(
|
||||
&mut self,
|
||||
composition: Vec<Vec<Vec<Index>>>,
|
||||
results: Option<Vec<Vec<f64>>>,
|
||||
@@ -393,7 +393,11 @@ impl<T: Time> TimeSlice<T> {
|
||||
/// Panics if an event references a competitor with no entry in this
|
||||
/// slice's skill store. `add_events` inserts one for every participant, so
|
||||
/// this cannot happen for slices built through the public API.
|
||||
pub fn iteration<D: Drift<T>>(&mut self, from: usize, competitors: &CompetitorStore<T, D>) {
|
||||
pub(crate) fn iteration<D: Drift<T>>(
|
||||
&mut self,
|
||||
from: usize,
|
||||
competitors: &CompetitorStore<T, D>,
|
||||
) {
|
||||
if from == 0 && self.color_groups_dirty {
|
||||
self.recompute_color_groups();
|
||||
}
|
||||
@@ -782,7 +786,7 @@ impl<T: Time> TimeSlice<T> {
|
||||
|
||||
/// Test-only: reads the slice's shape back for assertions.
|
||||
#[cfg(test)]
|
||||
pub fn get_composition(&self) -> Vec<Vec<Vec<Index>>> {
|
||||
pub(crate) fn get_composition(&self) -> Vec<Vec<Vec<Index>>> {
|
||||
self.events
|
||||
.iter()
|
||||
.map(|event| {
|
||||
@@ -802,7 +806,7 @@ impl<T: Time> TimeSlice<T> {
|
||||
|
||||
/// Test-only: reads the slice's shape back for assertions.
|
||||
#[cfg(test)]
|
||||
pub fn get_results(&self) -> Vec<Vec<f64>> {
|
||||
pub(crate) fn get_results(&self) -> Vec<Vec<f64>> {
|
||||
self.events
|
||||
.iter()
|
||||
.map(|event| {
|
||||
|
||||
Reference in New Issue
Block a user