Packages

Comprehensive benchmarking framework for AI research. Measures latency, throughput, cost, and reliability with percentile analysis and Nx numerical computations.

Current section

Files

Jump to
crucible_bench lib bench.ex
Raw

lib/bench.ex

defmodule CrucibleBench do
@moduledoc """
Bench - Statistical Testing Framework for AI Research
A comprehensive statistical testing framework designed specifically for AI/ML research.
Provides rigorous statistical tests, effect size measures, power analysis, and
publication-ready reporting.
## Core Capabilities
- **Parametric Tests**: t-tests, ANOVA
- **Non-Parametric Tests**: Mann-Whitney U, Wilcoxon signed-rank, Kruskal-Wallis
- **Effect Sizes**: Cohen's d, Hedges' g, eta-squared, omega-squared
- **Power Analysis**: A priori and post-hoc power calculations
- **Confidence Intervals**: Bootstrap and analytical methods
- **Multiple Comparison Correction**: Bonferroni, Holm, Benjamini-Hochberg
## Quick Start
# Compare two groups
control = [0.72, 0.68, 0.75, 0.71, 0.69]
treatment = [0.78, 0.73, 0.81, 0.76, 0.74]
CrucibleBench.compare(control, treatment)
## Design Principles
1. **Statistical Rigor**: All implementations validated against R/SciPy
2. **Interpretability**: Every result includes effect sizes
3. **Reproducibility**: Complete audit trails
4. **Peer-Review Ready**: Publication-quality output
"""
alias CrucibleBench.Stats
alias CrucibleBench.Analysis
alias CrucibleBench.Experiment
@doc """
Compare two independent groups with automatic test selection.
Automatically selects appropriate test based on data characteristics and
assumption checking. Returns comprehensive results including p-value,
effect size, confidence interval, and interpretation.
## Options
- `:test` - Force specific test (:t_test, :welch_t_test, :mann_whitney)
- `:confidence_level` - Confidence level for CI (default: 0.95)
- `:check_assumptions` - Test normality and variance (default: true)
- `:alternative` - :two_sided (default), :less, :greater
## Examples
iex> control = [5.1, 4.9, 5.3, 5.0, 5.2]
iex> treatment = [6.2, 6.0, 6.4, 5.9, 6.1]
iex> result = CrucibleBench.compare(control, treatment)
iex> result.p_value < 0.05
true
## Returns
A `CrucibleBench.Result` struct containing:
- `test`: Test type used
- `statistic`: Test statistic value
- `p_value`: P-value
- `effect_size`: Effect size measure
- `confidence_interval`: CI for mean difference
- `interpretation`: Human-readable interpretation
"""
def compare(group1, group2, opts \\ []) do
Analysis.compare_groups(group1, group2, opts)
end
@doc """
Perform paired comparison between related groups.
Use when samples are paired (e.g., before/after measurements on same subjects).
## Examples
iex> before = [0.72, 0.68, 0.75, 0.71, 0.69]
iex> after_values = [0.78, 0.73, 0.81, 0.76, 0.74]
iex> result = CrucibleBench.compare_paired(before, after_values)
iex> result.effect_size.mean_diff > 0
true
"""
def compare_paired(group1, group2, opts \\ []) do
Analysis.compare_paired(group1, group2, opts)
end
@doc """
Compare multiple groups (3+) with ANOVA or Kruskal-Wallis.
Automatically selects parametric (ANOVA) or non-parametric (Kruskal-Wallis)
test based on assumption checking.
## Examples
iex> gpt4 = [0.89, 0.91, 0.88, 0.90, 0.92]
iex> claude = [0.87, 0.89, 0.86, 0.88, 0.90]
iex> gemini = [0.84, 0.86, 0.83, 0.85, 0.87]
iex> result = CrucibleBench.compare_multiple([gpt4, claude, gemini])
iex> result.test in [:anova, :kruskal_wallis]
true
"""
def compare_multiple(groups, opts \\ []) do
Analysis.compare_multiple(groups, opts)
end
@doc """
Calculate effect size between two groups.
Returns Cohen's d or appropriate effect size measure.
## Examples
iex> group1 = [5.0, 5.2, 4.8, 5.1, 4.9]
iex> group2 = [6.0, 6.2, 5.8, 6.1, 5.9]
iex> effect = CrucibleBench.effect_size(group1, group2)
iex> effect.cohens_d < 0
true
"""
def effect_size(group1, group2, opts \\ []) do
Stats.EffectSize.calculate(group1, group2, opts)
end
@doc """
Calculate confidence interval for a statistic.
Supports both analytical and bootstrap methods.
## Options
- `:method` - :analytical (default) or :bootstrap
- `:confidence_level` - Confidence level (default: 0.95)
- `:iterations` - Bootstrap iterations (default: 10000)
## Examples
iex> data = [5.0, 5.2, 4.8, 5.1, 4.9, 5.3]
iex> ci = CrucibleBench.confidence_interval(data, :mean)
iex> {lower, upper} = ci.interval
iex> lower < 5.05 and upper > 5.05
true
"""
def confidence_interval(data, statistic, opts \\ []) do
Stats.ConfidenceInterval.calculate(data, statistic, opts)
end
@doc """
Perform power analysis for a test.
Calculate required sample size or achieved power.
## Options
- `:analysis_type` - :a_priori (sample size) or :post_hoc (power)
- `:effect_size` - Expected or observed effect size
- `:alpha` - Significance level (default: 0.05)
- `:power` - Desired power (default: 0.80)
## Examples
iex> # Calculate required sample size
iex> result = CrucibleBench.power_analysis(:t_test,
...> effect_size: 0.5, alpha: 0.05, power: 0.80)
iex> result.n_per_group > 0
true
"""
def power_analysis(test_type, opts \\ []) do
Stats.Power.analyze(test_type, opts)
end
@doc """
Run an experiment with automatic analysis.
High-level DSL for common experiment patterns.
## Experiment Types
- `:ab_test` - A/B testing
- `:ablation` - Ablation study
- `:hyperparameter_sweep` - Hyperparameter optimization
## Examples
iex> control = [0.72, 0.68, 0.75, 0.71, 0.69]
iex> treatment = [0.78, 0.73, 0.81, 0.76, 0.74]
iex> result = CrucibleBench.experiment(:ab_test,
...> control: control, treatment: treatment,
...> name: "Prompt Engineering Test")
iex> result.significant?
true
"""
def experiment(type, opts \\ []) do
Experiment.run(type, opts)
end
end