tiny.profiling.experiment.design
Defined in experiment.
API (2)
Actions
Public operations.
Source
Source: src/profiling/experiment/design.zig
zig
const std = @import("std");const model = @import("model.zig");pub fn samplePlan( calibration_log_ratios: []const f64, practical_effect_percent: f64, design: model.Design,) !model.SamplePlan { try design.validate(); if (calibration_log_ratios.len != design.calibration_pairs) { return error.InvalidCalibrationSamples; } const standard_deviation = sampleStandardDeviation(calibration_log_ratios); const effect_log = std.math.log1p(practical_effect_percent / 100.0); if (!std.math.isFinite(standard_deviation) or !std.math.isFinite(effect_log) or effect_log <= 0) { return error.InvalidExperimentStatistics; } const raw = std.math.pow( f64, model.normal_critical_sum * standard_deviation / effect_log, 2, ); const calculated = if (raw >= @as(f64, @floatFromInt(model.maximum_pairs))) model.maximum_pairs + 1 else @as(usize, @intFromFloat(@ceil(raw))); const evaluation_pairs = @max( calculated, design.minimum_evaluation_pairs, ); return .{ .calibration_standard_deviation_log_ratio = standard_deviation, .calculated_evaluation_pairs = calculated, .evaluation_pairs = evaluation_pairs, .within_budget = evaluation_pairs <= design.maximum_evaluation_pairs, };}fn sampleStandardDeviation(values: []const f64) f64 { std.debug.assert(values.len >= 2); var total: f64 = 0; for (values) |value| total += value; const mean = total / @as(f64, @floatFromInt(values.len)); var squared: f64 = 0; for (values) |value| { const delta = value - mean; squared += delta * delta; } return @sqrt(squared / @as(f64, @floatFromInt(values.len - 1)));}pub fn classify( interval: model.Interval, practical_effect_percent: f64,) model.Verdict { std.debug.assert(practical_effect_percent > 0); if (interval.high_percent < -practical_effect_percent) return .faster; if (interval.low_percent > practical_effect_percent) return .slower; if (interval.low_percent >= -practical_effect_percent and interval.high_percent <= practical_effect_percent) { return .equivalent; } return .inconclusive;}test "profiling experiment derives evaluation N from discarded calibration" { const low_noise = [_]f64{ -0.012, 0.008, -0.004, 0.010, -0.006, 0.004, -0.009, 0.009, }; const plan = try samplePlan(&low_noise, 5, .{}); try std.testing.expect(plan.within_budget); try std.testing.expectEqual( model.default_minimum_evaluation_pairs, plan.evaluation_pairs, ); const noisy = [_]f64{ -0.40, 0.35, -0.30, 0.25, -0.20, 0.15, -0.10, 0.05, }; const unsupported = try samplePlan(&noisy, 1, .{}); try std.testing.expect(!unsupported.within_budget);}test "profiling experiment verdict requires practical support" { try std.testing.expectEqual( model.Verdict.faster, classify(.{ .low_percent = -9, .high_percent = -6 }, 5), ); try std.testing.expectEqual( model.Verdict.slower, classify(.{ .low_percent = 6, .high_percent = 9 }, 5), ); try std.testing.expectEqual( model.Verdict.equivalent, classify(.{ .low_percent = -2, .high_percent = 3 }, 5), ); try std.testing.expectEqual( model.Verdict.inconclusive, classify(.{ .low_percent = -7, .high_percent = 2 }, 5), );}Source: src/profiling/experiment/root.zig:2
zig
pub const design = @import("design.zig");Audit
| Definitions | 3 |
|---|---|
| Public names | 3 |
| Members | 0 |
| Version | 26.7.0 |
| Revision | daab053ee433 |