voiage.analysis.DecisionAnalysis
Stateful decision-analysis interface for VOI calculations.
The class wraps a net-benefit surface and optional parameter samples, then exposes the core EVPI/EVPPI/EVSI and downstream analysis methods through a single object. It also manages backend selection, caching, and streaming updates for callers that accumulate data over time.
Parameters
Section titled “Parameters”nb_array : numpy.ndarray or ValueArray
Net-benefit samples with shape (n_samples, n_strategies).
parameter_samples : numpy.ndarray, ParameterSet, dict[str, numpy.ndarray], optional
Optional parameter samples used by EVPPI, EVSI, and related methods.
backend : str, optional
Backend name to use. If omitted, the backend is auto-detected.
use_jit : bool, default=False
Enable JAX JIT compilation where available.
streaming_window_size : int, optional
If provided, enable rolling-window buffering for incremental updates.
enable_caching : bool, default=False
Cache intermediate results when repeated calculations are expected.
Attributes
Section titled “Attributes”nb_array : ValueArray
Normalized net-benefit container used by the analysis methods.
parameter_samples : ParameterSet or None
Normalized parameter samples, or None if the analysis is
net-benefit only.
backend : object
Selected computational backend implementation.
use_jit : bool
Whether JAX JIT compilation is enabled.
streaming_window_size : int or None
Size of the streaming buffer, if enabled.
enable_caching : bool
Whether the instance cache is active.
Examples
Section titled “Examples”>>> import numpy as np >>> from voiage.analysis import DecisionAnalysis >>> analysis = DecisionAnalysis(np.array([[10.0, 12.0], [11.0, 9.5]])) >>> round(analysis.evpi(), 2) 1.0
Methods
Section titled “Methods”update_with_new_data
Section titled “update_with_new_data”update_with_new_data([positional or keyword] self: None = None, [positional or keyword] new_nb_data: np.ndarray | ValueArray = None, [positional or keyword] new_parameter_samples: np.ndarray | ParameterSet | dict[str, np.ndarray] | None = None) -> NoneUpdate the decision analysis with new data for streaming VOI calculations.
Args: new_nb_data: New net benefit data to add new_parameter_samples: New parameter samples corresponding to the net benefit data
Parameters:
selfnew_nb_datanp.ndarray | ValueArraynew_parameter_samplesnp.ndarray | ParameterSet | dict[str, np.ndarray] | None(default:None)
Returns: None
expected_utility_information
Section titled “expected_utility_information”expected_utility_information([positional or keyword] self: None = None, [positional or keyword] request: Mapping[str, object] = None) -> dict[str, object]Run the experimental Rust expected-utility information contract.
The request must identify finite states and probabilities explicitly; rows in the analysis PSA array are not silently reinterpreted as a decision-maker’s state distribution.
Parameters:
selfrequestMapping[str, object]
Returns: dict[str, object]
streaming_evpi
Section titled “streaming_evpi”streaming_evpi([positional or keyword] self: None = None) -> Generator[float, None, None]Yield EVPI repeatedly for the current data state.
Yields
Section titled “Yields”float EVPI value calculated from the current buffered data.
Parameters:
self
Returns: Generator[float, None, None]
streaming_evppi
Section titled “streaming_evppi”streaming_evppi([positional or keyword] self: None = None) -> Generator[float, None, None]Yield EVPPI repeatedly for the current data state.
Yields
Section titled “Yields”float EVPPI value calculated from the current buffered data.
Parameters:
self
Returns: Generator[float, None, None]
evpi([positional or keyword] self: None = None, [positional or keyword] population: float | None = None, [positional or keyword] time_horizon: float | None = None, [positional or keyword] discount_rate: float | None = None, [positional or keyword] chunk_size: int | None = None) -> floatCalculate expected value of perfect information.
Parameters
Section titled “Parameters”population : float, optional Population size for population-scaled EVPI. time_horizon : float, optional Time horizon in years for population scaling. discount_rate : float, optional Annual discount rate used for population scaling. chunk_size : int, optional Optional chunk size for incremental computation.
Returns
Section titled “Returns”float Per-decision EVPI unless population scaling is requested.
EVPI is computed as :math:E[\\max_d NB_d] - \\max_d E[NB_d].
Parameters:
selfpopulationfloat | None(default:None)time_horizonfloat | None(default:None)discount_ratefloat | None(default:None)chunk_sizeint | None(default:None)
Returns: float
calculate_evpi
Section titled “calculate_evpi”calculate_evpi([positional or keyword] self: None = None, [positional or keyword] population: float | None = None, [positional or keyword] time_horizon: float | None = None, [positional or keyword] discount_rate: float | None = None, [positional or keyword] chunk_size: int | None = None) -> floatCompatibility wrapper around :meth:evpi.
Parameters
Section titled “Parameters”population : float, optional Population size for population scaling. time_horizon : float, optional Time horizon in years for population scaling. discount_rate : float, optional Annual discount rate used for population scaling. chunk_size : int, optional Optional chunk size for incremental computation.
Returns
Section titled “Returns”float
EVPI value returned by :meth:evpi.
Parameters:
selfpopulationfloat | None(default:None)time_horizonfloat | None(default:None)discount_ratefloat | None(default:None)chunk_sizeint | None(default:None)
Returns: float
evppi([positional or keyword] self: None = None, [positional or keyword] parameters_of_interest: list[str] | None = None, [positional or keyword] population: float | None = None, [positional or keyword] time_horizon: float | None = None, [positional or keyword] discount_rate: float | None = None, [positional or keyword] n_regression_samples: int | None = None, [positional or keyword] regression_model: RegressionModelProtocol | type[RegressionModelProtocol] | None = None, [positional or keyword] chunk_size: int | None = None) -> floatCalculate expected value of partial perfect information.
Parameters
Section titled “Parameters”parameters_of_interest : list[str], optional Parameter names to analyze. Defaults to all parameters. population : float, optional Population size for population scaling. time_horizon : float, optional Time horizon in years for population scaling. discount_rate : float, optional Annual discount rate used for population scaling. n_regression_samples : int, optional Number of samples used to fit the regression approximation. regression_model : RegressionModelProtocol or type, optional Optional scikit-learn-compatible regression model. chunk_size : int, optional Optional chunk size for incremental computation of the baseline term.
Returns
Section titled “Returns”float Per-decision EVPPI unless population scaling is requested.
EVPPI is computed by regressing net benefit on the parameters of interest and comparing the conditional and unconditional maxima.
Parameters:
selfparameters_of_interestlist[str] | None(default:None)populationfloat | None(default:None)time_horizonfloat | None(default:None)discount_ratefloat | None(default:None)n_regression_samplesint | None(default:None)regression_modelRegressionModelProtocol | type[RegressionModelProtocol] | None(default:None)chunk_sizeint | None(default:None)
Returns: float
enbs([positional or keyword] self: None = None, [positional or keyword] evsi_result: float = None, [positional or keyword] research_cost: float = None, [positional or keyword] population: float | None = None, [positional or keyword] time_horizon: float | None = None, [positional or keyword] discount_rate: float | None = None) -> floatCalculate expected net benefit of sampling.
Parameters
Section titled “Parameters”evsi_result : float Expected value of sample information for the proposed study, per decision and per period when population scaling is requested. research_cost : float Total cost of the proposed research study. population : float, optional Recurring population or decision opportunities per period. time_horizon : float, optional Time horizon in years for population scaling. discount_rate : float, optional Annual discount rate used for population scaling.
Returns
Section titled “Returns”float Signed ENBS. A negative result means the proposed study costs more than its expected information value.
Population scaling is applied to EVSI before the total research cost
is subtracted. The method therefore implements
scaled EVSI - total research cost rather than scaling study cost.
Parameters:
selfevsi_resultfloatresearch_costfloatpopulationfloat | None(default:None)time_horizonfloat | None(default:None)discount_ratefloat | None(default:None)
Returns: float
ceaf([positional or keyword] self: None = None, [positional or keyword] wtp_thresholds: Sequence[float] = None, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] confidence_level: float = 0.95) -> AnyCalculate the cost-effectiveness acceptability frontier.
Parameters
Section titled “Parameters”wtp_thresholds : sequence of float Willingness-to-pay thresholds to evaluate. strategy_names : sequence of str, optional Optional strategy labels. confidence_level : float, default=0.95 Confidence level used to build the probability band.
Returns
Section titled “Returns”object
CEAF result from :func:voiage.methods.ceaf.calculate_ceaf.
Parameters:
selfwtp_thresholdsSequence[float]strategy_namesSequence[str] | None(default:None)confidence_levelfloat(default:0.95)
Returns: Any
dominance
Section titled “dominance”dominance([positional or keyword] self: None = None, [positional or keyword] costs: Sequence[float] = None, [positional or keyword] effects: Sequence[float] = None, [positional or keyword] strategy_names: Sequence[str] | None = None) -> AnyCalculate strong and extended dominance for cost/effect pairs.
Parameters
Section titled “Parameters”costs : sequence of float Strategy costs. effects : sequence of float Strategy effects. strategy_names : sequence of str, optional Optional strategy labels.
Returns
Section titled “Returns”object
Dominance result from :func:voiage.methods.dominance.calculate_dominance.
Parameters:
selfcostsSequence[float]effectsSequence[float]strategy_namesSequence[str] | None(default:None)
Returns: Any
value_of_heterogeneity
Section titled “value_of_heterogeneity”value_of_heterogeneity([positional or keyword] self: None = None, [positional or keyword] subgroups: Sequence[object] = None, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] n_bins: int | None = None) -> AnyCalculate the value of subgroup-specific decisions.
Parameters
Section titled “Parameters”subgroups : sequence of object Subgroup label for each sample. strategy_names : sequence of str, optional Optional strategy labels. n_bins : int, optional Quantile bin count for numeric subgroup values.
Returns
Section titled “Returns”object
Heterogeneity result from :func:voiage.methods.heterogeneity.value_of_heterogeneity.
Parameters:
selfsubgroupsSequence[object]strategy_namesSequence[str] | None(default:None)n_binsint | None(default:None)
Returns: Any
value_of_distributional_equity
Section titled “value_of_distributional_equity”value_of_distributional_equity([positional or keyword] self: None = None, [positional or keyword] subgroups: Sequence[object] = None, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] equity_weights: Sequence[float] | dict[str, float] | None = None, [positional or keyword] n_bins: int | None = None) -> AnyCalculate the value of distributional and equity-weighted decision tailoring.
Parameters:
selfsubgroupsSequence[object]strategy_namesSequence[str] | None(default:None)equity_weightsSequence[float] | dict[str, float] | None(default:None)n_binsint | None(default:None)
Returns: Any
value_of_ambiguity_distribution_shift
Section titled “value_of_ambiguity_distribution_shift”value_of_ambiguity_distribution_shift([positional or keyword] self: None = None, [positional or keyword] shift_weights: Sequence[Sequence[float]] = None, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] scenario_names: Sequence[str] | None = None, [positional or keyword] scenario_probabilities: Sequence[float] | None = None, [positional or keyword] ambiguity_radius: float = 0.0, [positional or keyword] information_cost: float = 0.0) -> AnyCalculate robust VOI under ambiguity and distribution shift.
Parameters:
selfshift_weightsSequence[Sequence[float]]strategy_namesSequence[str] | None(default:None)scenario_namesSequence[str] | None(default:None)scenario_probabilitiesSequence[float] | None(default:None)ambiguity_radiusfloat(default:0.0)information_costfloat(default:0.0)
Returns: Any
value_of_adaptive_learning_bandit
Section titled “value_of_adaptive_learning_bandit”value_of_adaptive_learning_bandit([positional or keyword] self: None = None, [positional or keyword] policy: str = 'ucb', [positional or keyword] horizon: int | None = None, [positional or keyword] exploration_cost: float = 0.0, [positional or keyword] epsilon: float = 0.1, [positional or keyword] confidence: float = 2.0, [positional or keyword] stop_regret: float | None = None, [positional or keyword] arm_names: Sequence[str] | None = None, [positional or keyword] seed: int = 0) -> AnyCalculate fixture-backed value of adaptive bandit learning.
Parameters:
selfpolicystr(default:'ucb')horizonint | None(default:None)exploration_costfloat(default:0.0)epsilonfloat(default:0.1)confidencefloat(default:2.0)stop_regretfloat | None(default:None)arm_namesSequence[str] | None(default:None)seedint(default:0)
Returns: Any
value_of_capacity_budget_constrained
Section titled “value_of_capacity_budget_constrained”value_of_capacity_budget_constrained([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate value of information under resource constraints.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_ai_assisted_evidence_triage
Section titled “value_of_ai_assisted_evidence_triage”value_of_ai_assisted_evidence_triage([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate the decision value of human-in-the-loop evidence triage.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_federated_privacy_preserving
Section titled “value_of_federated_privacy_preserving”value_of_federated_privacy_preserving([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate site-local evidence under privacy-preserving aggregation.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_explainability_transparency
Section titled “value_of_explainability_transparency”value_of_explainability_transparency([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate adoption and governance value of transparent explanations.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_interoperability_standardization
Section titled “value_of_interoperability_standardization”value_of_interoperability_standardization([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate harmonization and cross-site evidence reuse value.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_regulatory_market_access
Section titled “value_of_regulatory_market_access”value_of_regulatory_market_access([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate regulatory approval, reimbursement, and access value.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_replication_reproducibility
Section titled “value_of_replication_reproducibility”value_of_replication_reproducibility([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate replication and reproducibility information value.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_evidence_obsolescence_refresh
Section titled “value_of_evidence_obsolescence_refresh”value_of_evidence_obsolescence_refresh([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate evidence obsolescence and refresh information value.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_strategic_behavior
Section titled “value_of_strategic_behavior”value_of_strategic_behavior([positional or keyword] self: None = None, [variadic keyword] kwargs: object = {}) -> objectEvaluate strategic behavior and game-theoretic information value.
Parameters:
selfkwargsobject(default:{})
Returns: object
value_of_equity_information
Section titled “value_of_equity_information”value_of_equity_information([positional or keyword] self: None = None, [positional or keyword] subgroups: Sequence[object] = None, [positional or keyword] equity_weights: Sequence[float] = None, [positional or keyword] resolved_equity_weights: Sequence[Sequence[float]] = None, [positional or keyword] scenario_probabilities: Sequence[float] | None = None, [positional or keyword] information_cost: float = 0.0, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] policy_strata: Sequence[str] | None = None) -> AnyCalculate the value of resolving equity-relevant uncertainty.
Parameters:
selfsubgroupsSequence[object]equity_weightsSequence[float]resolved_equity_weightsSequence[Sequence[float]]scenario_probabilitiesSequence[float] | None(default:None)information_costfloat(default:0.0)strategy_namesSequence[str] | None(default:None)policy_strataSequence[str] | None(default:None)
Returns: Any
value_of_implementation
Section titled “value_of_implementation”value_of_implementation([positional or keyword] self: None = None, [positional or keyword] uptake: float = 1.0, [positional or keyword] adherence: float = 1.0, [positional or keyword] coverage: float = 1.0, [positional or keyword] implementation_delay: float = 0.0, [positional or keyword] implementation_uncertainty: float = 0.0, [positional or keyword] discount_rate: float = 0.0, [positional or keyword] time_horizon: float | None = None, [positional or keyword] population: float | None = None, [positional or keyword] strategy_names: Sequence[str] | None = None) -> AnyCalculate implementation-adjusted VOI summaries.
Parameters:
selfuptakefloat(default:1.0)adherencefloat(default:1.0)coveragefloat(default:1.0)implementation_delayfloat(default:0.0)implementation_uncertaintyfloat(default:0.0)discount_ratefloat(default:0.0)time_horizonfloat | None(default:None)populationfloat | None(default:None)strategy_namesSequence[str] | None(default:None)
Returns: Any
value_of_perspective
Section titled “value_of_perspective”value_of_perspective([positional or keyword] self: None = None, [positional or keyword] perspectives: Any | None = None, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] perspective_names: Sequence[str] | None = None, [positional or keyword] perspective_weights: Sequence[float] | dict[str, float] | None = None, [positional or keyword] reference_perspective: str | int | None = None) -> AnyCompare decision value across multiple perspectives.
Parameters
Section titled “Parameters”perspectives : :class:~voiage.methods.perspective.PerspectiveSet or sequence, optional
Ordered perspective metadata or perspective identifiers.
strategy_names : sequence of str, optional
Optional strategy labels.
perspective_names : sequence of str, optional
Optional perspective labels when full metadata is not provided.
perspective_weights : sequence or dict, optional
Non-negative weights used for consensus and switching-value
summaries.
reference_perspective : str or int, optional
Reference perspective used for switching-value summaries.
Returns
Section titled “Returns”object
Result from :func:voiage.methods.perspective.value_of_perspective.
Parameters:
selfperspectivesAny | None(default:None)strategy_namesSequence[str] | None(default:None)perspective_namesSequence[str] | None(default:None)perspective_weightsSequence[float] | dict[str, float] | None(default:None)reference_perspectivestr | int | None(default:None)
Returns: Any
value_of_preference
Section titled “value_of_preference”value_of_preference([positional or keyword] self: None = None, [positional or keyword] preference_profiles: Any | None = None, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] preference_profile_names: Sequence[str] | None = None, [positional or keyword] preference_profile_weights: Sequence[float] | dict[str, float] | None = None, [positional or keyword] reference_preference_profile: str | int | None = None, [positional or keyword] analysis_id: str | None = None, [positional or keyword] decision_problem_id: str | None = None, [positional or keyword] decision_context: str | None = None) -> AnyCompare decision value across multiple preference profiles.
Parameters:
selfpreference_profilesAny | None(default:None)strategy_namesSequence[str] | None(default:None)preference_profile_namesSequence[str] | None(default:None)preference_profile_weightsSequence[float] | dict[str, float] | None(default:None)reference_preference_profilestr | int | None(default:None)analysis_idstr | None(default:None)decision_problem_idstr | None(default:None)decision_contextstr | None(default:None)
Returns: Any
value_of_model_validation
Section titled “value_of_model_validation”value_of_model_validation([positional or keyword] self: None = None, [positional or keyword] validation_profiles: Any | None = None, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] validation_profile_names: Sequence[str] | None = None, [positional or keyword] validation_profile_weights: Sequence[float] | dict[str, float] | None = None, [positional or keyword] reference_validation_profile: str | int | None = None, [positional or keyword] analysis_id: str | None = None, [positional or keyword] decision_problem_id: str | None = None, [positional or keyword] decision_context: str | None = None) -> AnyCompare decision value across multiple validation profiles.
Parameters:
selfvalidation_profilesAny | None(default:None)strategy_namesSequence[str] | None(default:None)validation_profile_namesSequence[str] | None(default:None)validation_profile_weightsSequence[float] | dict[str, float] | None(default:None)reference_validation_profilestr | int | None(default:None)analysis_idstr | None(default:None)decision_problem_idstr | None(default:None)decision_contextstr | None(default:None)
Returns: Any
value_of_threshold_information
Section titled “value_of_threshold_information”value_of_threshold_information([positional or keyword] self: None = None, [positional or keyword] threshold_profiles: Any | None = None, [positional or keyword] strategy_names: Sequence[str] | None = None, [positional or keyword] threshold_profile_names: Sequence[str] | None = None, [positional or keyword] threshold_profile_weights: Sequence[float] | dict[str, float] | None = None, [positional or keyword] reference_threshold_profile: str | int | None = None, [positional or keyword] analysis_id: str | None = None, [positional or keyword] decision_problem_id: str | None = None, [positional or keyword] decision_context: str | None = None) -> AnyCompare decision value across multiple threshold profiles.
Parameters:
selfthreshold_profilesAny | None(default:None)strategy_namesSequence[str] | None(default:None)threshold_profile_namesSequence[str] | None(default:None)threshold_profile_weightsSequence[float] | dict[str, float] | None(default:None)reference_threshold_profilestr | int | None(default:None)analysis_idstr | None(default:None)decision_problem_idstr | None(default:None)decision_contextstr | None(default:None)
Returns: Any
portfolio_voi
Section titled “portfolio_voi”portfolio_voi([positional or keyword] self: None = None, [positional or keyword] portfolio_specification: PortfolioSpec = None, [positional or keyword] study_value_calculator: Callable[[PortfolioStudy], float] = None, [positional or keyword] optimization_method: str = 'greedy', [variadic keyword] kwargs: object = {}) -> dict[str, object]Optimize a research portfolio from the analysis surface.
Parameters
Section titled “Parameters”portfolio_specification : PortfolioSpec Portfolio definition to optimize. study_value_calculator : callable Study value function used for ranking. optimization_method : str, default=“greedy” Portfolio optimization algorithm. **kwargs : object Additional algorithm-specific options.
Returns
Section titled “Returns”dict[str, object] Portfolio optimization result.
Parameters:
selfportfolio_specificationPortfolioSpecstudy_value_calculatorCallable[[PortfolioStudy], float]optimization_methodstr(default:'greedy')kwargsobject(default:{})
Returns: dict[str, object]
get_decision_recommendations
Section titled “get_decision_recommendations”get_decision_recommendations([positional or keyword] self: None = None) -> list[dict[str, Any]]Summarize the strategies with the highest expected net benefit.
Returns
Section titled “Returns”list[dict[str, Any]] Ranked strategy recommendations with mean net benefit and rank.
Parameters:
self
Returns: list[dict[str, Any]]