From 18512f482844c64476b5763746bc2b92281b7b61 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 10:13:20 +0100 Subject: [PATCH 01/36] Some progress --- .../potentials/score_based_potential.py | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 99f4a420d..e1de31102 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -331,3 +331,66 @@ def __call__(self, input): self.posterior_score_based_potential.__call__, self.posterior_score_based_potential.gradient, ) + + +class ScoreAdaptation(ABC): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to impose additional + constraints on the posterior via guidance. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + self.score_estimator = score_estimator + self.prior = prior + self.device = device + + @abstractmethod + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + pass + + +class ClassifierFreeGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + prior_scale: float | Tensor, + prior_shift: float | Tensor, + likelihood_scale: float | Tensor, + likelihood_shift: float | Tensor, + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to temper of shift the + prior and likelihood. + + This is usually known as classifier-free guidance. And works by decomposing the + posterior score into a prior and likelihood component. These can then be scaled + and shifted to impose additional constraints on the posterior. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + + if prior is None: + raise ValueError("Prior is required for classifier-free guidance, please" + " provide as least an improper empirical prior.") + + self.prior_scale = prior_scale + self.prior_shift = prior_shift + self.likelihood_scale = likelihood_scale + self.likelihood_shift = likelihood_shift + + super().__init__(score_estimator, prior, device) + + + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): From f5e8e7f66bcd5dad3c13a3ede236bd4bbee213b7 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 10:13:20 +0100 Subject: [PATCH 02/36] Some progress --- .../potentials/score_based_potential.py | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 99f4a420d..e1de31102 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -331,3 +331,66 @@ def __call__(self, input): self.posterior_score_based_potential.__call__, self.posterior_score_based_potential.gradient, ) + + +class ScoreAdaptation(ABC): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to impose additional + constraints on the posterior via guidance. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + self.score_estimator = score_estimator + self.prior = prior + self.device = device + + @abstractmethod + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + pass + + +class ClassifierFreeGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + prior_scale: float | Tensor, + prior_shift: float | Tensor, + likelihood_scale: float | Tensor, + likelihood_shift: float | Tensor, + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to temper of shift the + prior and likelihood. + + This is usually known as classifier-free guidance. And works by decomposing the + posterior score into a prior and likelihood component. These can then be scaled + and shifted to impose additional constraints on the posterior. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + + if prior is None: + raise ValueError("Prior is required for classifier-free guidance, please" + " provide as least an improper empirical prior.") + + self.prior_scale = prior_scale + self.prior_shift = prior_shift + self.likelihood_scale = likelihood_scale + self.likelihood_shift = likelihood_shift + + super().__init__(score_estimator, prior, device) + + + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): From ab6b7b49056d3e90af6f56f9f178d124cd461df5 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 11:13:53 +0100 Subject: [PATCH 03/36] Moving and renaming. Refactoring IID function to reduce code redundancy --- .../potentials/score_based_potential.py | 63 ------ .../{score_fn_iid.py => score_fn_util.py} | 187 +++++++++++++----- 2 files changed, 142 insertions(+), 108 deletions(-) rename sbi/inference/potentials/{score_fn_iid.py => score_fn_util.py} (84%) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index e1de31102..99f4a420d 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -331,66 +331,3 @@ def __call__(self, input): self.posterior_score_based_potential.__call__, self.posterior_score_based_potential.gradient, ) - - -class ScoreAdaptation(ABC): - def __init__( - self, - score_estimator: ConditionalScoreEstimator, - prior: Optional[Distribution], - device: str = "cpu", - ): - """ This class manages manipulating the score estimator to impose additional - constraints on the posterior via guidance. - - Args: - score_estimator: The score estimator. - prior: The prior distribution. - device: The device on which to evaluate the potential. - """ - self.score_estimator = score_estimator - self.prior = prior - self.device = device - - @abstractmethod - def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): - pass - - -class ClassifierFreeGuidance(ScoreAdaptation): - def __init__( - self, - score_estimator: ConditionalScoreEstimator, - prior: Optional[Distribution], - prior_scale: float | Tensor, - prior_shift: float | Tensor, - likelihood_scale: float | Tensor, - likelihood_shift: float | Tensor, - device: str = "cpu", - ): - """ This class manages manipulating the score estimator to temper of shift the - prior and likelihood. - - This is usually known as classifier-free guidance. And works by decomposing the - posterior score into a prior and likelihood component. These can then be scaled - and shifted to impose additional constraints on the posterior. - - Args: - score_estimator: The score estimator. - prior: The prior distribution. - device: The device on which to evaluate the potential. - """ - - if prior is None: - raise ValueError("Prior is required for classifier-free guidance, please" - " provide as least an improper empirical prior.") - - self.prior_scale = prior_scale - self.prior_shift = prior_shift - self.likelihood_scale = likelihood_scale - self.likelihood_shift = likelihood_shift - - super().__init__(score_estimator, prior, device) - - - def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): diff --git a/sbi/inference/potentials/score_fn_iid.py b/sbi/inference/potentials/score_fn_util.py similarity index 84% rename from sbi/inference/potentials/score_fn_iid.py rename to sbi/inference/potentials/score_fn_util.py index 60b00e674..8aaa88e51 100644 --- a/sbi/inference/potentials/score_fn_iid.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -18,6 +18,7 @@ from sbi.utils.torchutils import ensure_theta_batched IID_METHODS = {} +GUIDANCE_METHODS = {} def get_iid_method(name: str) -> Type["IIDScoreFunction"]: @@ -36,6 +37,39 @@ def get_iid_method(name: str) -> Type["IIDScoreFunction"]: ) return IID_METHODS[name] +def get_guidance_method(name: str) -> Type["ScoreAdaptation"]: + r""" + Retrieves the guidance method by name. + + Args: + name: The name of the guidance method. + + Returns: + The guidance method class. + """ + if name not in GUIDANCE_METHODS: + raise NotImplementedError( + f"Method {name} for guidance not implemented." + ) + return GUIDANCE_METHODS[name] + +def register_guidance_method(name: str) -> Callable: + r""" + Registers a guidance method. + + Args: + name: The name of the guidance method. + + Returns: + A decorator function to register the guidance method class. + """ + + def decorator(cls: Type["ScoreAdaptation"]) -> Type["ScoreAdaptation"]: + GUIDANCE_METHODS[name] = cls + return cls + + return decorator + def register_iid_method(name: str) -> Callable: r""" @@ -55,6 +89,90 @@ def decorator(cls: Type["IIDScoreFunction"]) -> Type["IIDScoreFunction"]: return decorator +class ScoreAdaptation(ABC): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to impose additional + constraints on the posterior via guidance. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + self.score_estimator = score_estimator + self.prior = prior + self.device = device + + @abstractmethod + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + pass + +@register_guidance_method("classifier_free") +class ClassifierFreeGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + prior_scale: float | Tensor, + prior_shift: float | Tensor, + likelihood_scale: float | Tensor, + likelihood_shift: float | Tensor, + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to temper of shift the + prior and likelihood. + + This is usually known as classifier-free guidance. And works by decomposing the + posterior score into a prior and likelihood component. These can then be scaled + and shifted to impose additional constraints on the posterior. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + + if prior is None: + raise ValueError("Prior is required for classifier-free guidance, please" + " provide as least an improper empirical prior.") + + self.prior_scale = prior_scale + self.prior_shift = prior_shift + self.likelihood_scale = likelihood_scale + self.likelihood_shift = likelihood_shift + + super().__init__(score_estimator, prior, device) + + def marginal_prior_score(self, theta: Tensor, time: Tensor): + """ Computes the marginal prior score analyticaly (or approximatly) + """ + m = self.score_estimator.mean_t_fn(time) + std = self.score_estimator.std_fn(time) + marginal_prior = marginalize(self.prior, m, std) + marginal_prior_score = compute_score(marginal_prior, theta) + return marginal_prior_score + + + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + if time is None: + time = torch.tensor([self.score_estimator.t_min]) + + posterior_score = self.score_estimator(input=theta, condition=x_o, time=time) + prior_score = self.marginal_prior_score(theta, time) + + ll_score = posterior_score - prior_score + ll_score_mod = ll_score * self.likelihood_scale + self.likelihood_shift + prior_score_mod = prior_score * self.prior_scale + self.prior_shift + + return ll_score_mod + prior_score_mod + + + class IIDScoreFunction(ABC): def __init__( self, @@ -177,39 +295,14 @@ def __call__( base_score = self.score_estimator(inputs, conditions, time) # Compute the prior score - prior_score = self.prior_score_weight_fn(time) * self.prior_score_fn(inputs) + + prior_score = self.prior_score_weight_fn(time) * compute_score(self.prior, inputs) # Accumulate score = (1 - N) * prior_score + base_score.sum(-2, keepdim=True) return score - def prior_score_fn(self, theta: Tensor) -> Tensor: - r""" - Computes the score of the prior distribution. - - Args: - theta: The parameters at which to evaluate the prior score. - - Returns: - The computed prior score. - """ - # NOTE The try except is for unifrom priors which do not have a grad, and - # implementations that do not implement the log_prob method. - try: - with torch.enable_grad(): - theta = theta.detach().clone().requires_grad_(True) - prior_log_prob = self.prior.log_prob(theta) - prior_score = torch.autograd.grad( - prior_log_prob, - theta, - grad_outputs=torch.ones_like(prior_log_prob), - create_graph=True, - )[0].detach() - except Exception: - prior_score = torch.zeros_like(theta) - return prior_score - class BaseGaussCorrectedScoreFunction(IIDScoreFunction): def __init__( @@ -310,24 +403,10 @@ def marginal_prior_score_fn(self, time: Tensor, inputs: Tensor) -> Tensor: Returns: Marginal prior score. """ - # NOTE: This is for the uniform distribution and distirbutions that do not - # implement a log_prob. - try: - with torch.enable_grad(): - inputs = inputs.clone().detach().requires_grad_(True) - m = self.score_estimator.mean_t_fn(time) - std = self.score_estimator.std_fn(time) - p = marginalize(self.prior, m, std) - log_p = p.log_prob(inputs) - prior_score = torch.autograd.grad( - log_p, - inputs, - grad_outputs=torch.ones_like(log_p), - create_graph=True, - )[0].detach() - except Exception: - prior_score = torch.zeros_like(inputs) - + m = self.score_estimator.mean_t_fn(time) + std = self.score_estimator.std_fn(time) + p = marginalize(self.prior, m, std) + prior_score = compute_score(p, inputs) return prior_score def marginal_denoising_prior_precision_fn( @@ -691,6 +770,24 @@ def marginal_denoising_posterior_precision_est_fn( return denoising_posterior_precision + +def compute_score(p: Distribution, inputs: Tensor): + # NOTE The try except is for unifrom priors which do not have a grad, and + # implementations that do not implement the log_prob method. + try: + with torch.enable_grad(): + inputs = inputs.detach().clone().requires_grad_(True) + log_prob = p.log_prob(inputs) + score = torch.autograd.grad( + log_prob, + inputs, + grad_outputs=torch.ones_like(log_prob), + create_graph=True, + )[0].detach() + except Exception: + score = torch.zeros_like(inputs) + return score + def ensure_lam_positive_definite( denoising_prior_precision: torch.Tensor, denoising_posterior_precision: torch.Tensor, From 52825d30740103015e0fe0f92fbeeedaa09f8984 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 16:07:54 +0100 Subject: [PATCH 04/36] basic api on potentials --- .../potentials/score_based_potential.py | 27 ++++++++++++++++--- sbi/inference/potentials/score_fn_util.py | 2 +- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 99f4a420d..d4182e3cd 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -10,7 +10,7 @@ from zuko.transforms import FreeFormJacobianTransform from sbi.inference.potentials.base_potential import BasePotential -from sbi.inference.potentials.score_fn_iid import get_iid_method +from sbi.inference.potentials.score_fn_util import get_iid_method, get_guidance_method from sbi.neural_nets.estimators.score_estimator import ConditionalScoreEstimator from sbi.neural_nets.estimators.shape_handling import ( reshape_to_batch_event, @@ -58,7 +58,9 @@ def __init__( prior: Optional[Distribution], x_o: Optional[Tensor] = None, iid_method: str = "auto_gauss", - iid_params: Optional[Dict[str, Any]] = None, + iid_params: Optional[Dict[str, Any]] = None, # NOTE: dataclasses! + guidance_method: Optional[str] = None, + guidance_params: Optional[Dict[str, Any]] = None, device: str = "cpu", ): r"""Returns the score function for score-based methods. @@ -77,6 +79,8 @@ def __init__( self.score_estimator.eval() self.iid_method = iid_method self.iid_params = iid_params + self.guidance_method = None + self.guidance_params = None super().__init__(prior, x_o, device=device) def set_x( @@ -85,6 +89,8 @@ def set_x( x_is_iid: Optional[bool] = False, iid_method: str = "auto_gauss", iid_params: Optional[Dict[str, Any]] = None, + guidance_method: Optional[str] = None, + guidance_params: Optional[Dict[str, Any]] = None, atol: float = 1e-5, rtol: float = 1e-6, exact: bool = True, @@ -108,6 +114,8 @@ def set_x( super().set_x(x_o, x_is_iid) self.iid_method = iid_method self.iid_params = iid_params + self.guidance_method = guidance_method + self.guidance_params = guidance_params # NOTE: Once IID potential evaluation is supported. This needs to be adapted. # See #1450. if not x_is_iid and (self._x_o is not None): @@ -142,6 +150,11 @@ def __call__( ) self.score_estimator.eval() + if self.guidance_method is not None: + raise NotImplementedError( + "Guidance does not yet supported for potential evaluation." + ) + with torch.set_grad_enabled(track_gradients): log_probs = self.flow.log_prob(theta_density_estimator).squeeze(-1) # Force probability to be zero outside prior support. @@ -178,9 +191,17 @@ def gradient( the potential or manually set self._x_o." ) + if self.guidance_method is not None: + score_fn = get_guidance_method(self.guidance_method)( + self.score_estimator, self.prior, **(self.guidance_params or {}) + ) + else: + score_fn = self.score_estimator + + with torch.set_grad_enabled(track_gradients): if not self.x_is_iid or self._x_o.shape[0] == 1: - score = self.score_estimator.forward( + score = score_fn( input=theta, condition=self.x_o, time=time ) else: diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 8aaa88e51..257e4a6c7 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -784,7 +784,7 @@ def compute_score(p: Distribution, inputs: Tensor): grad_outputs=torch.ones_like(log_prob), create_graph=True, )[0].detach() - except Exception: + except Exception: score = torch.zeros_like(inputs) return score From 0237adf3fbe5343e1b81feeed8f8b528ac7ea233 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 16:32:07 +0100 Subject: [PATCH 05/36] working minimal example --- sbi/inference/posteriors/score_posterior.py | 9 +++- .../potentials/score_based_potential.py | 9 ++-- sbi/inference/potentials/score_fn_util.py | 42 ++++++++++--------- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/sbi/inference/posteriors/score_posterior.py b/sbi/inference/posteriors/score_posterior.py index 0d6594d98..ed1893496 100644 --- a/sbi/inference/posteriors/score_posterior.py +++ b/sbi/inference/posteriors/score_posterior.py @@ -107,6 +107,8 @@ def sample( ts: Optional[Tensor] = None, iid_method: str = "auto_gauss", iid_params: Optional[Dict] = None, + guidance_method: Optional[str] = None, + guidance_params: Optional[Dict] = None, max_sampling_batch_size: int = 10_000, sample_with: Optional[str] = None, show_progress_bars: bool = True, @@ -155,7 +157,12 @@ def sample( x = reshape_to_batch_event(x, self.score_estimator.condition_shape) is_iid = x.shape[0] > 1 self.potential_fn.set_x( - x, x_is_iid=is_iid, iid_method=iid_method, iid_params=iid_params + x, + x_is_iid=is_iid, + iid_method=iid_method, + iid_params=iid_params, + guidance_method=guidance_method, + guidance_params=guidance_params, ) num_samples = torch.Size(sample_shape).numel() diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index d4182e3cd..82a566e59 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -10,7 +10,7 @@ from zuko.transforms import FreeFormJacobianTransform from sbi.inference.potentials.base_potential import BasePotential -from sbi.inference.potentials.score_fn_util import get_iid_method, get_guidance_method +from sbi.inference.potentials.score_fn_util import get_guidance_method, get_iid_method from sbi.neural_nets.estimators.score_estimator import ConditionalScoreEstimator from sbi.neural_nets.estimators.shape_handling import ( reshape_to_batch_event, @@ -58,7 +58,7 @@ def __init__( prior: Optional[Distribution], x_o: Optional[Tensor] = None, iid_method: str = "auto_gauss", - iid_params: Optional[Dict[str, Any]] = None, # NOTE: dataclasses! + iid_params: Optional[Dict[str, Any]] = None, # NOTE: dataclasses! guidance_method: Optional[str] = None, guidance_params: Optional[Dict[str, Any]] = None, device: str = "cpu", @@ -198,12 +198,9 @@ def gradient( else: score_fn = self.score_estimator - with torch.set_grad_enabled(track_gradients): if not self.x_is_iid or self._x_o.shape[0] == 1: - score = score_fn( - input=theta, condition=self.x_o, time=time - ) + score = score_fn(input=theta, condition=self.x_o, time=time) else: assert self.prior is not None, "Prior is required for iid methods." diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 257e4a6c7..61c777f5f 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -37,6 +37,7 @@ def get_iid_method(name: str) -> Type["IIDScoreFunction"]: ) return IID_METHODS[name] + def get_guidance_method(name: str) -> Type["ScoreAdaptation"]: r""" Retrieves the guidance method by name. @@ -48,11 +49,10 @@ def get_guidance_method(name: str) -> Type["ScoreAdaptation"]: The guidance method class. """ if name not in GUIDANCE_METHODS: - raise NotImplementedError( - f"Method {name} for guidance not implemented." - ) + raise NotImplementedError(f"Method {name} for guidance not implemented.") return GUIDANCE_METHODS[name] + def register_guidance_method(name: str) -> Callable: r""" Registers a guidance method. @@ -96,7 +96,7 @@ def __init__( prior: Optional[Distribution], device: str = "cpu", ): - """ This class manages manipulating the score estimator to impose additional + """This class manages manipulating the score estimator to impose additional constraints on the posterior via guidance. Args: @@ -112,6 +112,7 @@ def __init__( def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): pass + @register_guidance_method("classifier_free") class ClassifierFreeGuidance(ScoreAdaptation): def __init__( @@ -124,7 +125,7 @@ def __init__( likelihood_shift: float | Tensor, device: str = "cpu", ): - """ This class manages manipulating the score estimator to temper of shift the + """This class manages manipulating the score estimator to temper of shift the prior and likelihood. This is usually known as classifier-free guidance. And works by decomposing the @@ -138,8 +139,10 @@ def __init__( """ if prior is None: - raise ValueError("Prior is required for classifier-free guidance, please" - " provide as least an improper empirical prior.") + raise ValueError( + "Prior is required for classifier-free guidance, please" + " provide as least an improper empirical prior." + ) self.prior_scale = prior_scale self.prior_shift = prior_shift @@ -148,22 +151,22 @@ def __init__( super().__init__(score_estimator, prior, device) - def marginal_prior_score(self, theta: Tensor, time: Tensor): - """ Computes the marginal prior score analyticaly (or approximatly) - """ + def marginal_prior_score(self, theta: Tensor, time: Tensor): + """Computes the marginal prior score analyticaly (or approximatly)""" m = self.score_estimator.mean_t_fn(time) std = self.score_estimator.std_fn(time) - marginal_prior = marginalize(self.prior, m, std) + marginal_prior = marginalize(self.prior, m, std) # type: ignore marginal_prior_score = compute_score(marginal_prior, theta) return marginal_prior_score - - def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): if time is None: time = torch.tensor([self.score_estimator.t_min]) - posterior_score = self.score_estimator(input=theta, condition=x_o, time=time) - prior_score = self.marginal_prior_score(theta, time) + posterior_score = self.score_estimator( + input=input, condition=condition, time=time + ) + prior_score = self.marginal_prior_score(input, time) ll_score = posterior_score - prior_score ll_score_mod = ll_score * self.likelihood_scale + self.likelihood_shift @@ -172,7 +175,6 @@ def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): return ll_score_mod + prior_score_mod - class IIDScoreFunction(ABC): def __init__( self, @@ -296,7 +298,9 @@ def __call__( # Compute the prior score - prior_score = self.prior_score_weight_fn(time) * compute_score(self.prior, inputs) + prior_score = self.prior_score_weight_fn(time) * compute_score( + self.prior, inputs + ) # Accumulate score = (1 - N) * prior_score + base_score.sum(-2, keepdim=True) @@ -770,7 +774,6 @@ def marginal_denoising_posterior_precision_est_fn( return denoising_posterior_precision - def compute_score(p: Distribution, inputs: Tensor): # NOTE The try except is for unifrom priors which do not have a grad, and # implementations that do not implement the log_prob method. @@ -784,10 +787,11 @@ def compute_score(p: Distribution, inputs: Tensor): grad_outputs=torch.ones_like(log_prob), create_graph=True, )[0].detach() - except Exception: + except Exception: score = torch.zeros_like(inputs) return score + def ensure_lam_positive_definite( denoising_prior_precision: torch.Tensor, denoising_posterior_precision: torch.Tensor, From 2e7d27ba78960312dd8f116f0aabcab4bf6b98ab Mon Sep 17 00:00:00 2001 From: michaeldeistler Date: Mon, 17 Mar 2025 17:31:10 +0100 Subject: [PATCH 06/36] Docs: Introduce RTD website --- .github/workflows/build_docs.yml | 8 +- .readthedocs.yaml | 21 ++ docs/Makefile | 20 ++ docs/README.md | 49 +-- docs/_static/custom.css | 0 docs/advanced_tutorials.rst | 53 +++ docs/changelog.md | 5 + docs/code_of_conduct.md | 2 + docs/conf.py | 96 +++++ docs/contributing.md | 327 ++++++++++++++++++ docs/contributor_guide.rst | 16 + docs/credits.md | 41 +++ docs/docs/tutorials/index.md | 59 ---- docs/faq.rst | 15 + docs/{docs => }/faq/question_01_leakage.md | 0 docs/{docs => }/faq/question_02_nans.md | 0 .../faq/question_03_pickling_error.md | 0 docs/{docs => }/faq/question_04_gpu.md | 0 docs/{docs => }/faq/question_05_pickling.md | 0 .../faq/question_06_resume_training.md | 0 .../faq/question_07_custom_prior.md | 0 docs/{docs/static => }/goal.png | Bin docs/index.rst | 251 ++++++++++++++ docs/installation.md | 42 +++ docs/logo.png | Bin 0 -> 42473 bytes docs/make.bat | 35 ++ docs/reference/sbi.analysis.rst | 7 + docs/reference/sbi.inference.rst | 39 +++ docs/reference/sbi.models.rst | 10 + docs/reference/sbi.posteriors.rst | 15 + docs/reference/sbi.potentials.rst | 7 + docs/sbi.rst | 13 + docs/tutorials.rst | 25 ++ .../tutorials}/00_getting_started.ipynb | 0 .../tutorials}/01_gaussian_amortized.ipynb | 0 .../tutorials}/02_multiround_inference.ipynb | 0 .../tutorials}/03_density_estimators.ipynb | 0 .../tutorials}/04_embedding_networks.ipynb | 0 .../05_conditional_distributions.ipynb | 145 ++++---- .../tutorials}/06_restriction_estimator.ipynb | 0 .../tutorials}/07_sensitivity_analysis.ipynb | 0 .../08_crafting_summary_statistics.ipynb | 0 .../tutorials}/09_sampler_interface.ipynb | 0 ...gnostics_posterior_predictive_checks.ipynb | 0 ...nostics_simulation_based_calibration.ipynb | 0 ...and_permutation_invariant_embeddings.ipynb | 0 .../tutorials}/13_diagnostics_lc2st.ipynb | 0 .../14_mcmc_diagnostics_with_arviz.ipynb | 0 .../15_importance_sampled_posteriors.ipynb | 0 .../tutorials}/16_implemented_methods.ipynb | 0 .../17_plotting_functionality.ipynb | 0 .../tutorials}/18_training_interface.ipynb | 0 .../19_flowmatching_and_scorematching.ipynb | 0 .../Example_00_HodgkinHuxleyModel.ipynb | 0 .../Example_01_DecisionMakingModel.ipynb | 0 .../tutorials}/HH_helper_functions.py | 0 .../tutorials}/example_01_utils.py | 0 .../tutorials}/toy_posterior_for_07_cc.py | 0 .../tutorials}/utils_13_diagnosis_sbc.py | 0 mkdocs/README.md | 44 +++ {docs => mkdocs}/docs/citation.md | 0 {docs => mkdocs}/docs/code_of_conduct.md | 0 {docs => mkdocs}/docs/contribute.md | 0 {docs => mkdocs}/docs/credits.md | 0 {docs => mkdocs}/docs/faq.md | 0 mkdocs/docs/faq/question_01_leakage.md | 47 +++ mkdocs/docs/faq/question_02_nans.md | 30 ++ mkdocs/docs/faq/question_03_pickling_error.md | 56 +++ mkdocs/docs/faq/question_04_gpu.md | 46 +++ mkdocs/docs/faq/question_05_pickling.md | 81 +++++ .../docs/faq/question_06_resume_training.md | 20 ++ mkdocs/docs/faq/question_07_custom_prior.md | 87 +++++ {docs => mkdocs}/docs/index.md | 0 {docs => mkdocs}/docs/install.md | 0 {docs => mkdocs}/docs/reference/analysis.md | 0 {docs => mkdocs}/docs/reference/index.md | 0 {docs => mkdocs}/docs/reference/inference.md | 0 {docs => mkdocs}/docs/reference/models.md | 0 {docs => mkdocs}/docs/reference/posteriors.md | 0 {docs => mkdocs}/docs/reference/potentials.md | 0 {docs => mkdocs}/docs/static/global.css | 0 mkdocs/docs/static/goal.png | Bin 0 -> 127228 bytes {docs => mkdocs}/docs/static/infer_demo.gif | Bin {docs => mkdocs}/docs/static/katex.js | 0 {docs => mkdocs}/docs/static/logo.svg | 0 {docs => mkdocs}/docs/static/logo_bmbf.svg | 0 {docs => mkdocs}/docs/static/nav.js | 0 {docs => mkdocs}/docs/tutorials/.gitignore | 0 {docs => mkdocs}/mkdocs.yml | 0 pyproject.toml | 13 +- 90 files changed, 1535 insertions(+), 190 deletions(-) create mode 100644 .readthedocs.yaml create mode 100644 docs/Makefile create mode 100644 docs/_static/custom.css create mode 100644 docs/advanced_tutorials.rst create mode 100644 docs/changelog.md create mode 100644 docs/code_of_conduct.md create mode 100644 docs/conf.py create mode 100644 docs/contributing.md create mode 100644 docs/contributor_guide.rst create mode 100644 docs/credits.md delete mode 100644 docs/docs/tutorials/index.md create mode 100644 docs/faq.rst rename docs/{docs => }/faq/question_01_leakage.md (100%) rename docs/{docs => }/faq/question_02_nans.md (100%) rename docs/{docs => }/faq/question_03_pickling_error.md (100%) rename docs/{docs => }/faq/question_04_gpu.md (100%) rename docs/{docs => }/faq/question_05_pickling.md (100%) rename docs/{docs => }/faq/question_06_resume_training.md (100%) rename docs/{docs => }/faq/question_07_custom_prior.md (100%) rename docs/{docs/static => }/goal.png (100%) create mode 100644 docs/index.rst create mode 100644 docs/installation.md create mode 100644 docs/logo.png create mode 100644 docs/make.bat create mode 100644 docs/reference/sbi.analysis.rst create mode 100644 docs/reference/sbi.inference.rst create mode 100644 docs/reference/sbi.models.rst create mode 100644 docs/reference/sbi.posteriors.rst create mode 100644 docs/reference/sbi.potentials.rst create mode 100644 docs/sbi.rst create mode 100644 docs/tutorials.rst rename {tutorials => docs/tutorials}/00_getting_started.ipynb (100%) rename {tutorials => docs/tutorials}/01_gaussian_amortized.ipynb (100%) rename {tutorials => docs/tutorials}/02_multiround_inference.ipynb (100%) rename {tutorials => docs/tutorials}/03_density_estimators.ipynb (100%) rename {tutorials => docs/tutorials}/04_embedding_networks.ipynb (100%) rename {tutorials => docs/tutorials}/05_conditional_distributions.ipynb (84%) rename {tutorials => docs/tutorials}/06_restriction_estimator.ipynb (100%) rename {tutorials => docs/tutorials}/07_sensitivity_analysis.ipynb (100%) rename {tutorials => docs/tutorials}/08_crafting_summary_statistics.ipynb (100%) rename {tutorials => docs/tutorials}/09_sampler_interface.ipynb (100%) rename {tutorials => docs/tutorials}/10_diagnostics_posterior_predictive_checks.ipynb (100%) rename {tutorials => docs/tutorials}/11_diagnostics_simulation_based_calibration.ipynb (100%) rename {tutorials => docs/tutorials}/12_iid_data_and_permutation_invariant_embeddings.ipynb (100%) rename {tutorials => docs/tutorials}/13_diagnostics_lc2st.ipynb (100%) rename {tutorials => docs/tutorials}/14_mcmc_diagnostics_with_arviz.ipynb (100%) rename {tutorials => docs/tutorials}/15_importance_sampled_posteriors.ipynb (100%) rename {tutorials => docs/tutorials}/16_implemented_methods.ipynb (100%) rename {tutorials => docs/tutorials}/17_plotting_functionality.ipynb (100%) rename {tutorials => docs/tutorials}/18_training_interface.ipynb (100%) rename {tutorials => docs/tutorials}/19_flowmatching_and_scorematching.ipynb (100%) rename {tutorials => docs/tutorials}/Example_00_HodgkinHuxleyModel.ipynb (100%) rename {tutorials => docs/tutorials}/Example_01_DecisionMakingModel.ipynb (100%) rename {tutorials => docs/tutorials}/HH_helper_functions.py (100%) rename {tutorials => docs/tutorials}/example_01_utils.py (100%) rename {tutorials => docs/tutorials}/toy_posterior_for_07_cc.py (100%) rename {tutorials => docs/tutorials}/utils_13_diagnosis_sbc.py (100%) create mode 100644 mkdocs/README.md rename {docs => mkdocs}/docs/citation.md (100%) rename {docs => mkdocs}/docs/code_of_conduct.md (100%) rename {docs => mkdocs}/docs/contribute.md (100%) rename {docs => mkdocs}/docs/credits.md (100%) rename {docs => mkdocs}/docs/faq.md (100%) create mode 100644 mkdocs/docs/faq/question_01_leakage.md create mode 100644 mkdocs/docs/faq/question_02_nans.md create mode 100644 mkdocs/docs/faq/question_03_pickling_error.md create mode 100644 mkdocs/docs/faq/question_04_gpu.md create mode 100644 mkdocs/docs/faq/question_05_pickling.md create mode 100644 mkdocs/docs/faq/question_06_resume_training.md create mode 100644 mkdocs/docs/faq/question_07_custom_prior.md rename {docs => mkdocs}/docs/index.md (100%) rename {docs => mkdocs}/docs/install.md (100%) rename {docs => mkdocs}/docs/reference/analysis.md (100%) rename {docs => mkdocs}/docs/reference/index.md (100%) rename {docs => mkdocs}/docs/reference/inference.md (100%) rename {docs => mkdocs}/docs/reference/models.md (100%) rename {docs => mkdocs}/docs/reference/posteriors.md (100%) rename {docs => mkdocs}/docs/reference/potentials.md (100%) rename {docs => mkdocs}/docs/static/global.css (100%) create mode 100644 mkdocs/docs/static/goal.png rename {docs => mkdocs}/docs/static/infer_demo.gif (100%) rename {docs => mkdocs}/docs/static/katex.js (100%) rename {docs => mkdocs}/docs/static/logo.svg (100%) rename {docs => mkdocs}/docs/static/logo_bmbf.svg (100%) rename {docs => mkdocs}/docs/static/nav.js (100%) rename {docs => mkdocs}/docs/tutorials/.gitignore (100%) rename {docs => mkdocs}/mkdocs.yml (100%) diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml index 76cb93b32..6367a90c6 100644 --- a/.github/workflows/build_docs.yml +++ b/.github/workflows/build_docs.yml @@ -34,8 +34,8 @@ jobs: - name: convert notebooks to markdown run: | - cd docs - uv run jupyter nbconvert --to markdown ../tutorials/*.ipynb --output-dir docs/tutorials/ + cd mkdocs + uv run jupyter nbconvert --to markdown ../docs/tutorials/*.ipynb --output-dir docs/tutorials/ - name: Configure Git user for bot run: | @@ -45,11 +45,11 @@ jobs: - name: Build and deploy dev documentation upon push to main if: ${{ github.event_name == 'push' }} run: | - cd docs + cd mkdocs uv run mike deploy dev --push - name: Build and deploy the lastest documentation upon new release if: ${{ github.event_name == 'release' }} run: | - cd docs + cd mkdocs uv run mike deploy ${{ github.event.release.name }} latest -u --push diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..b1c884d4c --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,21 @@ +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# RTD configuration file version +version: 2 + +sphinx: + configuration: docs/conf.py + +build: + os: ubuntu-22.04 + tools: + python: "3.10" + +python: + install: + - method: pip + path: . + extra_requirements: + - doc diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 000000000..d4bb2cbb9 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/README.md b/docs/README.md index d2dc10858..cef1b790a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,44 +1,9 @@ # Documentation -The documentation is available at: [sbi-dev.github.io/sbi](http://sbi-dev.github.io/sbi) - -## Building the Documentation - -We use [`mike`](https://github.com/jimporter/mike) to manage, build, and deploy our -documentation with [`mkdocs`](https://www.mkdocs.org/). To build the documentation -locally, follow these steps: - -1. Install the documentation dependencies: - - ```bash - python -m pip install .[doc] - ``` - -2. Convert the current version of the documentation notebooks to markdown and build the - website locally using `mkdocs`: - - ```bash - jupyter nbconvert --to markdown ../tutorials/*.ipynb --output-dir docs/tutorials/ - mkdocs serve - ``` - -### Deployment - -Website deployment is managed with `mike` and happens automatically: - -- With every push to `main`, a `dev` version of the most recent documentation is built. -- With every new published **release**, the current documentation is deployed on the - website. - -Thus, the documentation on the website always refers to the latest release, and not -necessarily to the version on `main`. - -## Contributing FAQ - -We welcome contributions to our list of frequently asked questions. To contribute: - -1. Create a new markdown file named `question_XX.md` in the `docs/faq` folder, where - `XX` is a running index for the questions. -2. The file should start with the question as the title (i.e. starting with a `#`) and - then have the answer below. -3. Add a link to your question in the [`docs/faq.md`] file using the same index. +To build the sphinx documentation, run +``` +make html +cd _build/html +python -m http.server +``` +This will find all jupyter notebooks, run them, collect the output, and incorporate them into the documentation. diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 000000000..e69de29bb diff --git a/docs/advanced_tutorials.rst b/docs/advanced_tutorials.rst new file mode 100644 index 000000000..63a85b626 --- /dev/null +++ b/docs/advanced_tutorials.rst @@ -0,0 +1,53 @@ +.. _advanced_tutorials: + + +Advanced tutorials +================== + +.. toctree:: + :maxdepth: 2 + +Advanced +-------- + +.. toctree:: + :maxdepth: 1 + + tutorials/02_multiround_inference.ipynb + tutorials/09_sampler_interface.ipynb + tutorials/03_density_estimators.ipynb + tutorials/04_embedding_networks.ipynb + tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb + tutorials/06_restriction_estimator.ipynb + tutorials/08_crafting_summary_statistics.ipynb + tutorials/15_importance_sampled_posteriors.ipynb + +Diagnostics +----------- + +.. toctree:: + :maxdepth: 1 + + tutorials/10_diagnostics_posterior_predictive_checks.ipynb + tutorials/11_diagnostics_simulation_based_calibration.ipynb + tutorials/13_diagnostics_lc2st.ipynb + tutorials/14_mcmc_diagnostics_with_arviz.ipynb + +Analysis +-------- + +.. toctree:: + :maxdepth: 1 + + tutorials/05_conditional_distributions.ipynb + tutorials/07_sensitivity_analysis.ipynb + tutorials/17_plotting_functionality.ipynb + +Examples +-------- + +.. toctree:: + :maxdepth: 1 + + tutorials/Example_00_HodgkinHuxleyModel.ipynb + tutorials/Example_01_DecisionMakingModel.ipynb diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 000000000..0272637dd --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,5 @@ +(changelog)= +# Changelog + +```{include} ../CHANGELOG.md +``` diff --git a/docs/code_of_conduct.md b/docs/code_of_conduct.md new file mode 100644 index 000000000..1c46998a4 --- /dev/null +++ b/docs/code_of_conduct.md @@ -0,0 +1,2 @@ +```{include} ../CODE_OF_CONDUCT.md +``` diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..6ea449ab1 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,96 @@ +# This file is part of sbi, a toolkit for simulation-based inference. sbi is licensed +# under the Apache License Version 2.0, see + +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + +# -- Project information ----------------------------------------------------- + +project = 'sbi' +copyright = '2020, sbi team' +author = 'sbi team' + + +# -- General configuration --------------------------------------------------- + +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.napoleon", + "sphinx.ext.intersphinx", + "sphinx.ext.viewcode", + "sphinx_math_dollar", + "sphinx.ext.mathjax", + "myst_nb", +] + +intersphinx_mapping = { + "python": ("https://docs.python.org/3", None), +} + +source_suffix = {'.rst': 'restructuredtext', '.myst': 'myst-nb', '.ipynb': 'myst-nb'} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# Myst-NB +myst_enable_extensions = [ + "dollarmath", + "amsmath", + "deflist", + "colon_fence", +] +nb_execution_timeout = 600 +nb_execution_mode = "cache" + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_title = "" +html_logo = "logo.png" +html_theme = 'sphinx_book_theme' +html_theme_options = { + 'repository_url': 'https://github.com/sbi-dev/sbi', + "use_repository_button": True, + "use_download_button": False, + 'repository_branch': 'main', + "path_to_docs": 'docs', + 'launch_buttons': { + 'colab_url': 'https://colab.research.google.com', + 'binderhub_url': 'https://mybinder.org', + }, + "toc_title": "Navigation", + "show_navbar_depth": 1, + "show_toc_level": 3, +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = ['custom.css'] + +autosummary_generate = True +autodoc_typehints = "description" +add_module_names = False +autodoc_member_order = "bysource" diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 000000000..24e4c49cf --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,327 @@ +(contributing)= +# How to contribute + +!!! important + + By participating in the `sbi` community, all members are expected to comply with + our [Code of Conduct](code_of_conduct.md). This ensures a positive and inclusive + environment for everyone involved. + +## User experiences, bugs, and feature requests + +If you are using `sbi` to infer the parameters of a simulator, we would be +delighted to know how it worked for you. If it didn't work according to plan, +please open up an [issue](https://github.com/sbi-dev/sbi/issues) or +[discussion](https://github.com/sbi-dev/sbi/discussions) and tell us more about +your use case: the dimensionality of the input parameters and of the output, +as well as the setup you used to run inference (i.e., number of simulations, +number of rounds, etc.). + +To report bugs and suggest features -- including better documentation -- +please equally head over to [issues on GitHub](https://github.com/sbi-dev/sbi/issues) +and tell us everything. + +## Contributing code + +Contributions to the `sbi` package are always welcome! The preferred way to do +it is via pull requests onto our [main repository](https://github.com/sbi-dev/sbi). +To give credit to contributors, we consider adding contributors who repeatedly +and substantially contributed to `sbi` to the list of authors of the package at +the end of every year. Additionally, we mention all contributors in the releases. + +!!! note + To avoid doing duplicated work, we strongly suggest that you go take + a look at our current [open issues](https://github.com/sbi-dev/sbi/issues) and + [pull requests](https://github.com/sbi-dev/sbi/pulls) to see if someone else is + already doing it. Also, in case you're planning to work on something that has not + yet been proposed by others (e.g. adding a new feature, adding a new example), + it is preferable to first open a new issue explaining what you intend to + propose and then working on your pull request after getting some feedback from + others. + +### Contribution workflow + +The following steps describe all parts of the workflow for doing a contribution +such as installing locally `sbi` from source, creating a `conda` environment, +setting up your `git` repository, etc. We've taken strong inspiration from the +contribution guides of +[`scikit-learn`](https://scikit-learn.org/stable/developers/contributing.html) +and [`mne`](https://mne.tools/stable/development/contributing.html): + +**Step 1**: [Create an account](https://github.com/) on GitHub if you do not +already have one. + +**Step 2**: Fork the [project repository](https://github.com/sbi-dev/sbi): click +on the ‘Fork’ button near the top of the page. This will create a copy of the +`sbi` codebase under your GitHub user account. See more details on how to fork +a repository [here](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo). + +**Step 3**: Clone your fork of the `sbi` repo from your GitHub account to your +local disk: + +```bash +git clone git@github.com:$USERNAME/sbi.git +cd sbi +``` + +**Step 4**: Install a recent version of Python (we currently recommend 3.10) +for instance using [`miniforge`](https://github.com/conda-forge/miniforge). We +strongly recommend you create a specific `conda` environment for doing +development on `sbi` as per: + +```bash +conda create -n sbi_dev python=3.10 +conda activate sbi_dev +``` + +**Step 5**: Install `sbi` in editable mode with + +```bash +pip install -e ".[dev]" +``` + +This installs the `sbi` package into the current environment by creating a +link to the source code directory (instead of copying the code to pip’s `site_packages` +directory, which is what normally happens). This means that any edits you make +to the `sbi` source code will be reflected the next time you open a Python interpreter +and `import sbi` (the `-e` flag of pip stands for an “editable” installation, +and the `dev` flag installs development and testing dependencies). This requires +at least Python 3.8. + +**Step 6**: Add the upstream remote. This saves a reference to the main `sbi` +repository, which you can use to keep your repository synchronized with the latest +changes: + +```bash +git remote add upstream git@github.com:sbi-dev/sbi.git +``` + +Check that the upstream and origin remote aliases are configured correctly by +running `git remote -v` which should display: + +```bash +origin git@github.com:$USERNAME/sbi.git (fetch) +origin git@github.com:$USERNAME/sbi.git (push) +upstream git@github.com:sbi-dev/sbi.git (fetch) +upstream git@github.com:sbi-dev/sbi.git (push) +``` + +**Step 7**: Install `pre-commit` to run code style checks before each commit: + +```bash +pip install pre-commit +pre-commit install +``` + +You should now have a working installation of `sbi` and a git repository +properly configured for making contributions. The following steps describe the +process of modifying code and submitting a pull request: + +**Step 8**: Synchronize your main branch with the upstream/main branch. See more +details on [GitHub Docs](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork): + +```bash +git checkout main +git fetch upstream +git merge upstream/main +``` + +**Step 9**: Create a feature branch to hold your development changes: + +```bash +git checkout -b my_feature +``` + +and start making changes. Always use a feature branch! It’s good practice +to never work on the main branch, as this allows you to easily get back to a +working state of the code if needed (e.g., if you’re working on multiple +changes at once, or need to pull in recent changes from someone else to get +your new feature to work properly). In most cases you should make PRs into the +upstream’s main branch. + +**Step 10**: Develop your code on your feature branch on the computer, using +Git to do the version control. When you’re done editing, add changed files +using `git add` and then `git commit` to record your changes: + +```bash +git add modified_files +git commit -m "description of your commit" +``` + +Then push the changes to your GitHub account with: + +```bash +git push -u origin my_feature +``` + +The `-u` flag ensures that your local branch will be automatically linked with +the remote branch, so you can later use `git push` and `git pull` without any +extra arguments. + +**Step 11**: Follow [these](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) +instructions to create a pull request from your fork. +This will send a notification to `sbi` maintainers and trigger reviews and comments +regarding your contribution. + +!!! note + It is often helpful to keep your local feature branch synchronized + with the latest changes of the main `sbi` repository: + ``` + git fetch upstream + git merge upstream/main + ``` + +### Style conventions and testing + +All our docstrings and comments are written following the [Google +Style](http://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). + +For code linting and formating, we use [`ruff`](https://docs.astral.sh/ruff/), +which is installed alongside `sbi`. + +You can exclude slow tests and those which require a GPU with + +```bash +pytest -m "not slow and not gpu" +``` + +Additionally, we recommend to run tests with + +```bash +pytest -n auto -m "not slow and not gpu" +``` + +in parallel. GPU tests should probably not be run this way. If you see unexpected +behavior (tests fail if they shouldn't), try to run them without `-n auto` and +see if it persists. When writing new tests and debugging things, it may make sense +to also run them without `-n auto`. + +When you create a PR onto `main`, our Continuous Integration (CI) actions on +GitHub will perform the following checks: + +- **[`ruff`](https://docs.astral.sh/ruff/formatter/)** for linting and formatting + (including `black`, `isort`, and `flake8`) +- **[`pyright`](https://github.com/Microsoft/pyright)** for static type checking. +- **[`pytest`](https://docs.pytest.org/en/stable/index.html)** for running a subset of + fast tests from our test suite. + +If any of these fail, try reproducing and solving the error locally: + +- **`ruff`**: Make sure you have `pre-commit` installed locally with the same version as + specified in the + [`pyproject.toml`](https://github.com/sbi-dev/sbi/blob/main/pyproject.toml). Execute it + using `pre-commit run --all-files`. `ruff` tends to give informative error messages + that help you fix the problem. Note that pre-commit only detects problems with `ruff` + linting and formatting, but does not fix them. You can fix them either by running + `ruff check . --fix(linting)`, followed by `ruff format . --fix(formatting)`, or by + hand. +- **`pyright`**: Run it locally using `pyright sbi/` and ensure you are using +the same + `pyright` version as used in the CI (which is the case if you have installed + it with `pip install -e ".[dev]"` but note that you have to rerun it once + someone updates the version in the `pyproject.toml`). + - Known issues and fixes: + - If using `**kwargs`, you either have to specify all possible types of + `kwargs`, e.g. `**kwargs: Union[int, boolean]` or use `**kwargs: Any` +- **`pytest`**: On GitHub Actions you can see which test failed. Reproduce it +locally, e.g., using `pytest -n auto tests/linearGaussian_snpe_test.py`. Note +that this will run for a few minutes and should result in passes and expected +fails (xfailed). +- Commit and push again until CI tests pass. Don't hesitate to ask for help by + commenting on the PR. + +#### mini-sbibm tests + +As SBI is a fundamentally data-driven approach, we are not only interested in whether +the modifications to the codebase "pass the tests" but also in whether they improve or +at least do not deteriorate the performance of the package for inference. To this end, +we have a set of *mini-sbibm* tests (a minimal version of the sbi benchmarking package [`sbibm`](https://github.com/sbi-benchmark/sbibm)) that are intended for developers to run locally. + +These tests differ from the regular tests in that they always pass (provided there +are no errors) but output performance metrics that can be compared, e.g., to the +performance metrics of the main branch or relative to each other. The user-facing API +is available via `pytest` through custom flags. To run the mini-sbibm tests, you can use +the following command: + +```bash + pytest --bm +``` + +This will run all the mini-sbibm tests on all methods with default parameters and output +the performance metrics nicely formatted to the console. If you have multiple CPU cores +available, you can run the tests in parallel using the `-n auto` flag: + +```bash + pytest --bm -n auto +``` + +What if you are currently working on a specific method and you want to run the +mini-sbibm tests only for this class of methods? You can use the `--bm-mode` flag: + +```bash + pytest --bm --bm-mode nspe +``` + +This will run the mini-sbibm tests only for methods of the `nspe` class, but with a +few major hyperparameter choices, such as different base network architectures and +different diffusion processes. + +The currently available modes are: `"npe"`, `"nle"`, `"nre"`, `"fmpe"`, `"npse"`, +`"snpe"`, `"snle"`, and `"snre"`. If you require another mode, you can add it to the +test suite in `tests/test_bm.py`. + +## Contributing to the documentation + +Most of the documentation for `sbi` is written in markdown and the website is generated +using `mkdocs` with `mkdocstrings` and `mike`. The tutorials and examples are converted +from jupyter notebooks into markdown files to be shown on the website. To work on +improvements of the documentation, you should first install the `doc` dependencies: + +```bash +pip install -e ".[doc]" +``` + +Then, you can build the website locally by executing in the `docs` folder + +```bash +mkdocs serve +``` + +This will build the website on a local host address shown in the terminal. Changes to +the website files or a browser refresh will immediately rebuild the website. + +If you updated the tutorials or examples, you need to convert them to markdown first: + +```bash +cd docs +jupyter nbconvert --to markdown ../tutorials/*.ipynb --output-dir docs/tutorials/ +mkdocs serve +``` + +### Using AI Coding Assistants + +We understand that AI coding assistants (like GitHub Copilot, ChatGPT, etc.) can be +helpful tools. You are welcome to use them when contributing to this project, but *with +caution and responsibility*. + +- **Understand the Code:** Do *not* blindly accept suggestions from AI assistants. You + are responsible for ensuring that any code you submit (whether written by you or + generated by an AI) is correct, efficient, secure, and follows all project + guidelines. +- **Thoroughly Review AI-Generated Code:** Treat AI-generated code as you would any + other code you didn't write yourself: review it carefully, line by line. Understand + what it does, how it does it, and why it's the best approach. +- **Test Extensively:** AI assistants can make mistakes (hallucinations, subtle bugs, + inefficient code). Write comprehensive unit tests to verify the correctness of any + AI-generated code. Don't rely solely on the AI to test its own code. +- **Attribution:** If a significant portion of the code was generated by an AI + assistant, briefly mention this in your commit message or pull request description + (e.g., "Implemented feature X with assistance from GitHub Copilot"). This helps + reviewers understand the origin of the code. However, you remain responsible for the + code's correctness. +- **Maintainability:** Make sure the code is well-formatted, commented and does follow + our code style. + +**In essence: Use AI assistants as a *tool* to enhance your productivity, but *you* are +the programmer. You are ultimately responsible for the quality and correctness of the +code you contribute.** diff --git a/docs/contributor_guide.rst b/docs/contributor_guide.rst new file mode 100644 index 000000000..4f77dac4d --- /dev/null +++ b/docs/contributor_guide.rst @@ -0,0 +1,16 @@ +.. _contributor-guide: + +Developer notes +=============== + +`sbi` welcomes contributions from the community. +These are guides to get set up as a developer, as well as +developer-focused resources. + + +.. toctree:: + :maxdepth: 1 + :caption: Contribution guides + + contributing + code_of_conduct diff --git a/docs/credits.md b/docs/credits.md new file mode 100644 index 000000000..4cd52d163 --- /dev/null +++ b/docs/credits.md @@ -0,0 +1,41 @@ +# Credits + +## Community and Contributions + +`sbi` is a community-driven package. We are grateful to all our contributors who have +played a significant role in shaping `sbi`. Their valuable input, suggestions, and +direct contributions to the codebase have been instrumental in the development of `sbi`. + +## License + +`sbi` is licensed under the [Apache License +(Apache-2.0)](https://www.apache.org/licenses/LICENSE-2.0) and + +> Copyright (C) 2020 Álvaro Tejero-Cantero, Jakob H. Macke, Jan-Matthis Lückmann, +> Michael Deistler, Jan F. Bölts. +> +> Copyright (C) 2020 Conor M. Durkan. +> +> All contributors hold the copyright of their specific contributions. + +## Support + +`sbi` has been supported by the German Federal Ministry of Education and Research (BMBF) +through project ADIMEM (FKZ 01IS18052 A-D), project SiMaLeSAM (FKZ 01IS21055A) and the +Tübingen AI Center (FKZ 01IS18039A). Since 2024, `sbi` has been supported by the +appliedAI Institute for Europe gGmbH. + +## Important dependencies and prior art + +- `sbi` is the successor to [`delfi`](https://github.com/mackelab/delfi), a Theano-based + toolbox for sequential neural posterior estimation developed at + [mackelab](https://www.mackelab.org).If you were using `delfi`, we strongly recommend + moving your inference over to `sbi`. Please open issues if you find unexpected + behavior or missing features. We will consider these bugs and give them priority. +- `sbi` as a PyTorch-based toolbox started as a fork of + [conormdurkan/lfi](https://github.com/conormdurkan/lfi), by [Conor + M.Durkan](https://conormdurkan.github.io/). +- `sbi` uses `PyTorch` and tries to align with the interfaces (e.g. for probability + distributions) adopted by `PyTorch`. +- See [README.md](https://github.com/mackelab/sbi/blob/master/README.md) for a + list of publications describing the methods implemented in `sbi`. diff --git a/docs/docs/tutorials/index.md b/docs/docs/tutorials/index.md deleted file mode 100644 index ef0609c6c..000000000 --- a/docs/docs/tutorials/index.md +++ /dev/null @@ -1,59 +0,0 @@ - -# Tutorials for using the `sbi` toolbox - -Before running the notebooks, follow our instructions to [install -sbi](../install.md). Alternatively, you can also open a [codespace on -GitHub](https://codespaces.new/sbi-dev/sbi) and work through the tutorials in -the browser. The numbers of the notebooks are not informative of the order, -please follow this structure depending on which group you identify with. - -Once you have familiarised yourself with the methods and identified how to apply -SBI to your use case, ensure you work through the **Diagnostics** tutorials -linked below, to identify failure cases and assess the quality of your -inference. - -## Introduction - -
-- [Getting started](00_getting_started.md) -- [Amortized inference](01_gaussian_amortized.md) -- [More flexibility for training and sampling](18_training_interface.md) -- [Implemented algorithms](16_implemented_methods.md) -
- -## Advanced - -
-- [Multi-round inference](02_multiround_inference.md) -- [Sampling algorithms in sbi](09_sampler_interface.md) -- [Custom density estimators](03_density_estimators.md) -- [Embedding nets for observations](04_embedding_networks.md) -- [SBI with trial-based data](12_iid_data_and_permutation_invariant_embeddings.md) -- [Handling invalid simulations](06_restriction_estimator.md) -- [Crafting summary statistics](08_crafting_summary_statistics.md) -- [Importance sampling posteriors](15_importance_sampled_posteriors.md) -
- -## Diagnostics - -
-- [Posterior predictive checks](10_diagnostics_posterior_predictive_checks.md) -- [Simulation-based calibration](11_diagnostics_simulation_based_calibration.md) -- [Local-C2ST coverage checks](13_diagnostics_lc2st.md) -- [Density plots and MCMC diagnostics with ArviZ](14_mcmc_diagnostics_with_arviz.md) -
- -## Analysis - -
-- [Conditional distributions](05_conditional_distributions.md) -- [Posterior sensitivity analysis](07_sensitivity_analysis.md) -- [Plotting functionality](17_plotting_functionality.md) -
- -## Examples - -
-- [Hodgkin-Huxley model](Example_00_HodgkinHuxleyModel.md) -- [Decision-making model](Example_01_DecisionMakingModel.md) -
diff --git a/docs/faq.rst b/docs/faq.rst new file mode 100644 index 000000000..6a87fcccd --- /dev/null +++ b/docs/faq.rst @@ -0,0 +1,15 @@ +.. _faq: + +FAQ +=== + +.. toctree:: + :maxdepth: 1 + + faq/question_01_leakage + faq/question_02_nans + faq/question_03_pickling_error + faq/question_04_gpu + faq/question_05_pickling + faq/question_06_resume_training + faq/question_07_custom_prior diff --git a/docs/docs/faq/question_01_leakage.md b/docs/faq/question_01_leakage.md similarity index 100% rename from docs/docs/faq/question_01_leakage.md rename to docs/faq/question_01_leakage.md diff --git a/docs/docs/faq/question_02_nans.md b/docs/faq/question_02_nans.md similarity index 100% rename from docs/docs/faq/question_02_nans.md rename to docs/faq/question_02_nans.md diff --git a/docs/docs/faq/question_03_pickling_error.md b/docs/faq/question_03_pickling_error.md similarity index 100% rename from docs/docs/faq/question_03_pickling_error.md rename to docs/faq/question_03_pickling_error.md diff --git a/docs/docs/faq/question_04_gpu.md b/docs/faq/question_04_gpu.md similarity index 100% rename from docs/docs/faq/question_04_gpu.md rename to docs/faq/question_04_gpu.md diff --git a/docs/docs/faq/question_05_pickling.md b/docs/faq/question_05_pickling.md similarity index 100% rename from docs/docs/faq/question_05_pickling.md rename to docs/faq/question_05_pickling.md diff --git a/docs/docs/faq/question_06_resume_training.md b/docs/faq/question_06_resume_training.md similarity index 100% rename from docs/docs/faq/question_06_resume_training.md rename to docs/faq/question_06_resume_training.md diff --git a/docs/docs/faq/question_07_custom_prior.md b/docs/faq/question_07_custom_prior.md similarity index 100% rename from docs/docs/faq/question_07_custom_prior.md rename to docs/faq/question_07_custom_prior.md diff --git a/docs/docs/static/goal.png b/docs/goal.png similarity index 100% rename from docs/docs/static/goal.png rename to docs/goal.png diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..5c9430f99 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,251 @@ +.. sbi documentation master file, created by + sphinx-quickstart on Tue Oct 18 10:21:12 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + + +Welcome to `sbi`! +=================== + +``sbi`` is a Python package for simulation-based inference, designed to meet the needs of +both researchers and practitioners. Whether you need fine-grained control or an +easy-to-use interface, `sbi` has you covered. + +With `sbi`, you can perform parameter inference using Bayesian inference: Given a +simulator that models a real-world process, SBI estimates the full posterior +distribution over the simulator's parameters based on observed data. This distribution +indicates the most likely parameter values while additionally quantifying uncertainty +and revealing potential interactions between parameters. + + +``sbi`` provides access to simulation-based inference methods via a user-friendly +interface: + +.. code-block:: python + + import torch + from sbi.inference import NPE + + # define shifted Gaussian simulator. + def simulator(θ): return θ + torch.randn_like(θ) + # draw parameters from Gaussian prior. + θ = torch.randn(1000, 2) + # simulate data + x = simulator(θ) + + # choose sbi method and train + inference = NPE() + inference.append_simulations(θ, x).train() + + # do inference given observed data + x_o = torch.ones(2) + posterior = inference.build_posterior() + samples = posterior.sample((1000,), x=x_o) + + +Overview +-------- + +To get started, install the `sbi` package with: + +.. code-block:: console + + python -m pip install sbi + +for more advanced install options, see our `Install Guide `. + +Then, check out our material: + +- `Tutorials and Examples `_ + +- `Reference API `_ + + +Motivation and approach +----------------------- + +Many areas of science and engineering make extensive use of complex, stochastic, +numerical simulations to describe the structure and dynamics of the processes being +investigated. + +A key challenge in simulation-based science is constraining these simulation models' +parameters, which are interpretable quantities, with observational data. Bayesian +inference provides a general and powerful framework to invert the simulators, i.e. +describe the parameters that are consistent both with empirical data and prior +knowledge. + +In the case of simulators, a key quantity required for statistical inference, the +likelihood of observed data given parameters, :math:`\mathcal{L}(\theta) = p(x_o|\theta)`, is +typically intractable, rendering conventional statistical approaches inapplicable. + +`sbi` implements powerful machine-learning methods that address this problem. Roughly, +these algorithms can be categorized as: + +- Neural Posterior Estimation (amortized `NPE` and sequential `SNPE`), +- Neural Likelihood Estimation (`(S)NLE`), and +- Neural Ratio Estimation (`(S)NRE`). + +Depending on the characteristics of the problem, e.g. the dimensionalities of the +parameter space and the observation space, one of the methods will be more suitable. + +.. image:: goal.png + :alt: Conceptual diagram for simulation-based inference. It depicts a model, prior distribution, simulated data, neural density estimator, and posterior distribution. The process includes a feedback loop using the estimated posterior distribution to adaptively generate additional informative simulations. The diagram also illustrates consistent and inconsistent samples. + + +**Goal: Algorithmically identify mechanistic models that are consistent with data.** + +Each of the methods above needs three inputs: A candidate mechanistic model, +prior knowledge or constraints on model parameters, and observational data (or +summary statistics thereof). + +The methods then proceed by + +1. sampling parameters from the prior followed by simulating synthetic data from + these parameters, +2. learning the (probabilistic) association between data (or data features) and + underlying parameters, i.e. to learn statistical inference from simulated + data. How this association is learned differs between the above methods, but + all use deep neural networks. +3. This learned neural network is then applied to empirical data to derive the + full space of parameters consistent with the data and the prior, i.e. the + posterior distribution. The posterior assigns high probability to parameters + that are consistent with both the data and the prior, and low probability to + inconsistent parameters. While NPE directly learns the posterior + distribution, NLE and NRE need an extra MCMC sampling step to construct a + posterior. +4. If needed, an initial estimate of the posterior can be used to adaptively + generate additional informative simulations. + +`Cranmer, Brehmer, Louppe (2020) `_ + + +Implemented algorithms +---------------------- + +``sbi`` implements a variety of *amortized* and *sequential* SBI methods. + +Amortized methods return a posterior that can be applied to many different +observations without retraining (e.g., NPE), whereas sequential methods focus +the inference on one particular observation to be more simulation-efficient +(e.g., SNPE). + +Below, we list all implemented methods and their corresponding publications. +For usage in ``sbi``, see the `Inference API reference `_ +and the `tutorial on implemented methods `_. + + +Posterior estimation (``(S)NPE``) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **Fast ε-free Inference of Simulation Models with Bayesian Conditional Density Estimation** + by Papamakarios & Murray (NeurIPS 2016) + `PDF `__ + `BibTeX `__ + +- **Flexible statistical inference for mechanistic models of neural dynamics** + by Lueckmann, Goncalves, Bassetto, Öcal, Nonnenmacher & Macke (NeurIPS 2017) + `PDF `__ + `BibTeX `__ + +- **Automatic posterior transformation for likelihood-free inference** + by Greenberg, Nonnenmacher & Macke (ICML 2019) + `PDF `__ + `BibTeX`__ + +- **BayesFlow: Learning complex stochastic models with invertible neural networks** + by Radev, S. T., Mertens, U. K., Voss, A., Ardizzone, L., & Köthe, U. (IEEE transactions on neural networks and learning systems 2020) + `Paper `__ + +- **Truncated proposals for scalable and hassle-free simulation-based inference** + by Deistler, Goncalves & Macke (NeurIPS 2022) + `Paper `__ + +- **Flow matching for scalable simulation-based inference** + by Dax, M., Wildberger, J., Buchholz, S., Green, S. R., Macke, J. H., & Schölkopf, B. (NeurIPS, 2023) + `Paper `__ + +- **Compositional Score Modeling for Simulation-Based Inference** + by Geffner, T., Papamakarios, G., & Mnih, A. (ICML 2023) + `Paper `__ + +Likelihood-estimation (``(S)NLE``) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **Sequential neural likelihood: Fast likelihood-free inference with autoregressive flows** + by Papamakarios, Sterratt & Murray (AISTATS 2019) + `PDF `__ + `BibTeX `__ + +- **Variational methods for simulation-based inference** + by Glöckler, Deistler, Macke (ICLR 2022) + `Paper `__ + +- **Flexible and efficient simulation-based inference for models of decision-making** + by Boelts, Lueckmann, Gao, Macke (Elife 2022) + `Paper `__ + +Likelihood-ratio-estimation (``(S)NRE``) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **Likelihood-free MCMC with Amortized Approximate Likelihood Ratios** + by Hermans, Begy & Louppe (ICML 2020) + `PDF `__ + +- **On Contrastive Learning for Likelihood-free Inference** + by Durkan, Murray & Papamakarios (ICML 2020) + `PDF `__ + +- **Towards Reliable Simulation-Based Inference with Balanced Neural Ratio Estimation** + by Delaunoy, Hermans, Rozet, Wehenkel & Louppe (NeurIPS 2022) + `PDF `__ + +- **Contrastive Neural Ratio Estimation** + by Benjamin Kurt Miller, Christoph Weniger & Patrick Forré (NeurIPS 2022) + `PDF `__ + +Diagnostics +^^^^^^^^^^^ + +- **Simulation-based calibration** + by Talts, Betancourt, Simpson, Vehtari, Gelman (arXiv 2018) + `Paper `__ + +- **Expected coverage (sample-based)** + as computed in Deistler, Goncalves, & Macke (NeurIPS 2022) + `Paper `__ and in Rozet & Louppe + `Paper `__ + +- **Local C2ST** + by Linhart, Gramfort & Rodrigues (NeurIPS 2023) + `Paper `__ + +- **TARP** + by Lemos, Coogan, Hezaveh & Perreault-Levasseur (ICML 2023) + `Paper `__ + + + +.. toctree:: + :hidden: + :maxdepth: 1 + :caption: Getting started + + installation + +.. toctree:: + :hidden: + :maxdepth: 1 + + tutorials + faq + +.. toctree:: + :hidden: + :maxdepth: 2 + :caption: More guides/resources + + advanced_tutorials + sbi + contributor_guide + changelog + credits diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 000000000..a960c021c --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,42 @@ +(installation)= +# Installation + +`sbi` requires Python 3.10 or higher. A GPU is not required, but can lead to +speed-up in some cases. We recommend using a +[`conda`](https://docs.conda.io/en/latest/miniconda.html) virtual environment +([Miniconda installation +instructions](https://docs.conda.io/en/latest/miniconda.html)). If `conda` is +installed on the system, an environment for installing `sbi` can be created as +follows: + +```console +# Create an environment for sbi (indicate Python 3.10 or higher); activate it +$ conda create -n sbi_env python=3.10 && conda activate sbi_env +``` + +Independent of whether you are using `conda` or not, `sbi` can be installed +using `pip`: + +```bash +python -m pip install sbi +``` + +To install and add `sbi` to a project with [`pixi`](https://pixi.sh/), from the project directory run + +```bash +pixi add sbi +``` + +and to install into a particular conda environment with [`conda`](https://docs.conda.io/projects/conda/), in the activated environment run + +```bash +conda install --channel conda-forge sbi +``` + +To test the installation, drop into a Python prompt and run + +```python +from sbi.examples.minimal import simple +posterior = simple() +print(posterior) +``` diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ef27b53b3f76967276d82d316277c3e16bc464 GIT binary patch literal 42473 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 q2oX9#Z#zri0!SKwhA+*=-=|ATFF7YAOl=NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/reference/sbi.analysis.rst b/docs/reference/sbi.analysis.rst new file mode 100644 index 000000000..fd3cfb159 --- /dev/null +++ b/docs/reference/sbi.analysis.rst @@ -0,0 +1,7 @@ +Analysis +======== + +.. autofunction:: sbi.analysis.plot.pairplot +.. autofunction:: sbi.analysis.plot.marginal_plot +.. autofunction:: sbi.analysis.plot.conditional_pairplot +.. autofunction:: sbi.analysis.conditional_density.conditional_corrcoeff diff --git a/docs/reference/sbi.inference.rst b/docs/reference/sbi.inference.rst new file mode 100644 index 000000000..2f2a4f699 --- /dev/null +++ b/docs/reference/sbi.inference.rst @@ -0,0 +1,39 @@ +Inference +========= + +.. autoclass:: sbi.inference.trainers.npe.npe_a.NPE_A + :members: + :inherited-members: +.. autoclass:: sbi.inference.trainers.npe.npe_c.NPE_C + :members: + :inherited-members: +.. autoclass:: sbi.inference.trainers.fmpe.fmpe.FMPE + :members: + :inherited-members: +.. autoclass:: sbi.inference.trainers.npse.npse.NPSE + :members: + :inherited-members: +.. autoclass:: sbi.inference.trainers.nle.nle_a.NLE_A + :members: + :inherited-members: +.. autoclass:: sbi.inference.trainers.nre.nre_a.NRE_A + :members: + :inherited-members: +.. autoclass:: sbi.inference.trainers.nre.nre_b.NRE_B + :members: + :inherited-members: +.. autoclass:: sbi.inference.trainers.nre.nre_c.NRE_C + :members: + :inherited-members: +.. autoclass:: sbi.inference.trainers.nre.bnre.BNRE + :members: + :inherited-members: +.. autoclass:: sbi.inference.abc.mcabc.MCABC + :members: + :inherited-members: +.. autoclass:: sbi.inference.abc.smcabc.SMCABC + :members: + :inherited-members: +.. autofunction:: sbi.inference.trainers.base.simulate_for_sbi +.. autofunction:: sbi.utils.user_input_checks.process_prior +.. autofunction:: sbi.utils.user_input_checks.process_simulator diff --git a/docs/reference/sbi.models.rst b/docs/reference/sbi.models.rst new file mode 100644 index 000000000..0911a2c00 --- /dev/null +++ b/docs/reference/sbi.models.rst @@ -0,0 +1,10 @@ +Models +====== + +.. autofunction:: sbi.neural_nets.factory.posterior_nn +.. autofunction:: sbi.neural_nets.factory.likelihood_nn +.. autofunction:: sbi.neural_nets.factory.classifier_nn +.. autofunction:: sbi.neural_nets.factory.flowmatching_nn +.. autofunction:: sbi.neural_nets.factory.posterior_score_nn +.. autoclass:: sbi.neural_nets.estimators.ConditionalDensityEstimator + :members: diff --git a/docs/reference/sbi.posteriors.rst b/docs/reference/sbi.posteriors.rst new file mode 100644 index 000000000..c1e134e75 --- /dev/null +++ b/docs/reference/sbi.posteriors.rst @@ -0,0 +1,15 @@ +Posteriors +========== + +.. autoclass:: sbi.inference.posteriors.direct_posterior.DirectPosterior + :members: +.. autoclass:: sbi.inference.posteriors.importance_posterior.ImportanceSamplingPosterior + :members: +.. autoclass:: sbi.inference.posteriors.mcmc_posterior.MCMCPosterior + :members: +.. autoclass:: sbi.inference.posteriors.rejection_posterior.RejectionPosterior + :members: +.. autoclass:: sbi.inference.posteriors.score_posterior.ScorePosterior + :members: +.. autoclass:: sbi.inference.posteriors.vi_posterior.VIPosterior + :members: diff --git a/docs/reference/sbi.potentials.rst b/docs/reference/sbi.potentials.rst new file mode 100644 index 000000000..7fcf48837 --- /dev/null +++ b/docs/reference/sbi.potentials.rst @@ -0,0 +1,7 @@ +Potentials +========== + +.. autofunction:: sbi.inference.potentials.posterior_based_potential.posterior_estimator_based_potential +.. autofunction:: sbi.inference.potentials.likelihood_based_potential.likelihood_estimator_based_potential +.. autofunction:: sbi.inference.potentials.ratio_based_potential.ratio_estimator_based_potential +.. autofunction:: sbi.inference.potentials.score_based_potential.score_estimator_based_potential diff --git a/docs/sbi.rst b/docs/sbi.rst new file mode 100644 index 000000000..cccca91fb --- /dev/null +++ b/docs/sbi.rst @@ -0,0 +1,13 @@ +.. currentmodule:: sbi + +API Reference +=========================== + +.. toctree:: + :maxdepth: 1 + + reference/sbi.inference + reference/sbi.models + reference/sbi.posteriors + reference/sbi.potentials + reference/sbi.analysis diff --git a/docs/tutorials.rst b/docs/tutorials.rst new file mode 100644 index 000000000..41b72ebbe --- /dev/null +++ b/docs/tutorials.rst @@ -0,0 +1,25 @@ +.. _tutorials: + +Tutorials +========= + +Before running the notebooks, follow our instructions to +`install sbi `_. +Alternatively, you can also open a `codespace on +GitHub `_ and work through the tutorials in +the browser. The numbers of the notebooks are not informative of the order, +please follow this structure depending on which group you identify with. + +Once you have familiarised yourself with the methods and identified how to apply +SBI to your use case, ensure you work through the **Diagnostics** tutorials +linked below, to identify failure cases and assess the quality of your +inference. + + +.. toctree:: + :maxdepth: 1 + + tutorials/00_getting_started.ipynb + tutorials/01_gaussian_amortized.ipynb + tutorials/18_training_interface.ipynb + tutorials/16_implemented_methods.ipynb diff --git a/tutorials/00_getting_started.ipynb b/docs/tutorials/00_getting_started.ipynb similarity index 100% rename from tutorials/00_getting_started.ipynb rename to docs/tutorials/00_getting_started.ipynb diff --git a/tutorials/01_gaussian_amortized.ipynb b/docs/tutorials/01_gaussian_amortized.ipynb similarity index 100% rename from tutorials/01_gaussian_amortized.ipynb rename to docs/tutorials/01_gaussian_amortized.ipynb diff --git a/tutorials/02_multiround_inference.ipynb b/docs/tutorials/02_multiround_inference.ipynb similarity index 100% rename from tutorials/02_multiround_inference.ipynb rename to docs/tutorials/02_multiround_inference.ipynb diff --git a/tutorials/03_density_estimators.ipynb b/docs/tutorials/03_density_estimators.ipynb similarity index 100% rename from tutorials/03_density_estimators.ipynb rename to docs/tutorials/03_density_estimators.ipynb diff --git a/tutorials/04_embedding_networks.ipynb b/docs/tutorials/04_embedding_networks.ipynb similarity index 100% rename from tutorials/04_embedding_networks.ipynb rename to docs/tutorials/04_embedding_networks.ipynb diff --git a/tutorials/05_conditional_distributions.ipynb b/docs/tutorials/05_conditional_distributions.ipynb similarity index 84% rename from tutorials/05_conditional_distributions.ipynb rename to docs/tutorials/05_conditional_distributions.ipynb index fc52bdcb6..0b0962ecc 100644 --- a/tutorials/05_conditional_distributions.ipynb +++ b/docs/tutorials/05_conditional_distributions.ipynb @@ -64,13 +64,19 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING (pytensor.tensor.blas): Using NumPy C-API based implementation for BLAS functions.\n" + ] + } + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import torch\n", - "from IPython.display import HTML\n", - "from matplotlib import animation, rc\n", "\n", "from sbi.analysis import (\n", " conditional_corrcoeff,\n", @@ -193,80 +199,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Because our toy posterior has only three parameters, we can plot posterior samples in a 3D plot:\n" + "Unfortunately, if the posterior has more than three dimensions, inspecting all dimensions at once will not be possible anymore. One way to still reveal structures in high-dimensional posteriors is to inspect 2D-slices through the posterior. In `sbi`, this can be done with the `conditional_pairplot()` function, which computes the conditional distributions within the posterior. We can slice (i.e. condition) the posterior at any location, given by the `condition`. In the plot below, for all upper diagonal plots, we keep all but two parameters constant at values sampled from the posterior, and inspect what combinations of the remaining two parameters can reproduce experimental data. For the plots on the diagonal (the 1D conditionals), we keep all but one parameter constant.\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, - "outputs": [], - "source": [ - "rc(\"animation\", html=\"html5\")\n", - "\n", - "# First set up the figure, the axis, and the plot element we want to animate\n", - "fig = plt.figure(figsize=(6, 6))\n", - "ax = fig.add_subplot(111, projection=\"3d\")\n", - "\n", - "ax.set_xlim((-2, 2))\n", - "ax.set_ylim((-2, 2))\n", - "\n", - "\n", - "def init():\n", - " (line,) = ax.plot([], [], lw=2)\n", - " line.set_data([], [])\n", - " return (line,)\n", - "\n", - "\n", - "def animate(angle):\n", - " num_samples_vis = 1000\n", - " line = ax.scatter(\n", - " posterior_samples[:num_samples_vis, 0],\n", - " posterior_samples[:num_samples_vis, 1],\n", - " posterior_samples[:num_samples_vis, 2],\n", - " zdir=\"z\",\n", - " s=15,\n", - " c=\"#2171b5\",\n", - " depthshade=False,\n", - " )\n", - " ax.view_init(20, angle)\n", - " return (line,)\n", - "\n", - "\n", - "anim = animation.FuncAnimation(\n", - " fig, animate, init_func=init, frames=range(0, 360, 5), interval=150, blit=True\n", - ")\n", - "\n", - "plt.close()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "HTML(anim.to_html5_video())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Clearly, the range of admissible parameters is constrained to a narrow region in parameter space, which had not been evident from the marginals.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the posterior has more than three dimensions, inspecting all dimensions at once will not be possible anymore. One way to still reveal structures in high-dimensional posteriors is to inspect 2D-slices through the posterior. In `sbi`, this can be done with the `conditional_pairplot()` function, which computes the conditional distributions within the posterior. We can slice (i.e. condition) the posterior at any location, given by the `condition`. In the plot below, for all upper diagonal plots, we keep all but two parameters constant at values sampled from the posterior, and inspect what combinations of the remaining two parameters can reproduce experimental data. For the plots on the diagonal (the 1D conditionals), we keep all but one parameter constant.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, "outputs": [ { "data": { @@ -306,9 +245,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/michaeldeistler/anaconda3/envs/sbi/lib/python3.12/site-packages/torch/functional.py:513: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/aten/src/ATen/native/TensorShape.cpp:3610.)\n", + " return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAFWCAYAAAB3gtpEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0G0lEQVR4nO3df1SU1b4/8PcMyiDqgCQwoCT+aIlcFQp0grqlOUtQr0fut+MVj+diXMWliaV4Sul7FH9UZFqayZHMH+S98tVTVy2rRRJedJ3kQOJhmYas8JqQMaASjGCCzDzfP4gnJ2CcZ2D4td+v1l45e/Z+Zs/Uej7un49KkiQJRERE7VB3dwOIiKhnY6AgIiKbGCiIiMgmBgoiIrKJgYKIiGxioCAiIpsYKIiIyCYGCiIisomBgoiIbGKgICIimxgoiIic4MyZM5g9ezb8/f2hUqlw/PjxB9bJzc3FY489Bo1GgzFjxiAjI6NVmbS0NAQGBsLNzQ16vR4FBQWd3/jfYKAgInKC+vp6hISEIC0tza7yV69exaxZszB16lQUFRVh5cqVWLx4Mb744gu5zJEjR5CUlISUlBScP38eISEhiIqKQlVVlbO+BgBAxUMBiYicS6VS4dixY4iJiWm3zJo1a/DZZ5/h4sWLcl5sbCxqamqQlZUFANDr9Zg0aRJ27doFALBYLAgICMCKFSuwdu1ap7WfPQoioh4gLy8PBoPBKi8qKgp5eXkAgMbGRhQWFlqVUavVMBgMchln6efUqxMR9TB3795FY2OjQ3UlSYJKpbLK02g00Gg0HW6X0WiEr6+vVZ6vry9MJhN+/vln/PTTTzCbzW2WuXz5coc/3xYGCiISxt27dzHIayDMP1scqj9o0CDU1dVZ5aWkpGDDhg2d0Lqei4GCiITR2NgI888WjP6DD9SuqgdXuI+lUcKVzCqUl5dDq9XK+Z3RmwAAnU6HyspKq7zKykpotVoMGDAALi4ucHFxabOMTqfrlDa0h3MURCScfm5q9HdzUZT6uTXfLrVarVXqrEARERGBnJwcq7zs7GxEREQAAFxdXREWFmZVxmKxICcnRy7jLAwURCQclcqxpERdXR2KiopQVFQEoHn5a1FREcrKygAAycnJiIuLk8svXboU//u//4uXX34Zly9fxl/+8hf89a9/xapVq+QySUlJeP/99/HBBx+guLgYy5YtQ319PeLj4zv8m9jCoSciEo5a3ZyUkBSWP3fuHKZOnSq/TkpKAgAsXLgQGRkZqKiokIMGAIwcORKfffYZVq1ahXfeeQfDhw/H3r17ERUVJZeZN28ebty4gfXr18NoNCI0NBRZWVmtJrg7G/dREJEwTCYTPDw8EJygg4ursju/udGCb983ora21mqOQgTsURCRcFRqFVRqZWNJSsv3JQwURCQctcqBoSdx4wQDBRGJR6VuTkrriIqBgoiEo1apoFa4jElSuuypD2GgICLhsEehjMBfnYiI7MEeBREJpyv2UfQlDBREJB4Hhp5EHn9hoCAi4ajVKqgV7otQWr4vYaAgIuE4cnaTwIueGCiISDyOzFEoLd+XCPzViYjIHuxREJFweNaTMgwURCQcR856EjhOMFAQkXi4M1sZBgoiEo4jZz0pLd+XMFAQkXDYo1BG4K9ORET2YI+CiITDfRTKOO2rV1dXY8GCBdBqtfD09MSiRYtQV1dns86UKVOgUqms0tKlS53VRCISVMvyWKVJVE7rUSxYsAAVFRXIzs7GvXv3EB8fjyVLliAzM9NmvYSEBGzatEl+7e7u7qwmEpGg2KNQximBori4GFlZWfj6668RHh4OAHj33Xcxc+ZMbNu2Df7+/u3WdXd3h06nc0aziIiaOXDWE8TtUDgnUOTl5cHT01MOEgBgMBigVquRn5+Pf/3Xf2237qFDh/Bf//Vf0Ol0mD17NtatW6eoVyFJEm7fvt2h9hNRzzZ48GCoOrBclafHKuOUQGE0GuHj42P9Qf36wcvLC0ajsd16f/jDHzBixAj4+/vjwoULWLNmDUpKSnD06NF26zQ0NKChoUF+XVtbi4cffrjjX4KIeqyamhp4eHh0dzOEoShQrF27Flu2bLFZpri42OHGLFmyRP7zhAkT4Ofnh2nTpuHKlSsYPXp0m3VSU1OxcePGVvmjYr2hdhV4ULGTbPj4d93dhD4jbdnn3d2EXq+pwYKvt1d0+DrcR6GMokCxevVqPPfcczbLjBo1CjqdDlVVVVb5TU1NqK6uVjT/oNfrAQClpaXtBork5GQkJSXJr00mEwICAqB2VcOFgaLD3FWu3d2EPqOfhv8/dpaODDsBv+zMVjr0xJ3Z9vH29oa3t/cDy0VERKCmpgaFhYUICwsDAJw6dQoWi0W++dujqKgIAODn59duGY1GA41GY/c1iYh4hIcyTvkrzrhx4xAdHY2EhAQUFBTgq6++QmJiImJjY+UVT9evX0dQUBAKCgoAAFeuXMHmzZtRWFiI77//Hp988gni4uLw1FNPYeLEic5oJhEJqmUyW2kSldP6wocOHUJQUBCmTZuGmTNn4sknn8SePXvk9+/du4eSkhLcuXMHAODq6oovv/wS06dPR1BQEFavXo1nn30WJ06ccFYTiUhQzfsolAYKxz4rLS0NgYGBcHNzg16vl/9y3Ja2Nh2rVCrMmjVLLvPcc8+1ej86OtqxxtnJaRvuvLy8bG6uCwwMhCRJ8uuAgACcPn3aWc0hIupyR44cQVJSEtLT06HX67Fjxw5ERUWhpKSk1cpQADh69CgaGxvl17du3UJISAjmzp1rVS46OhoHDhyQXzt7+J2za0QkHLVK7VBS6u2330ZCQgLi4+MRHByM9PR0uLu7Y//+/W2W9/Lygk6nk1N2djbc3d1bBQqNRmNVbsiQIQ79DvZioCAi4XRkjsJkMlml+/dx3a+xsRGFhYUwGAz3fa4aBoMBeXl5drVz3759iI2NxcCBA63yc3Nz4ePjg7Fjx2LZsmW4deuWg7+EfRgoiEg4HQkUAQEB8PDwkFNqamqbn3Hz5k2YzWb4+vpa5fv6+trceNyioKAAFy9exOLFi63yo6OjcfDgQeTk5GDLli04ffo0ZsyYAbPZ7OCv8WA8ZpyIhKNyYHlsy96N8vJyaLVaOd9Z8wP79u3DhAkTMHnyZKv82NhY+c8TJkzAxIkTMXr0aOTm5mLatGlOaQt7FEQkHLVa7VACAK1Wa5XaCxRDhw6Fi4sLKisrrfIrKysfuPG4vr4ehw8fxqJFix74XUaNGoWhQ4eitLTUzm+vHAMFEZETuLq6IiwsDDk5OXKexWJBTk4OIiIibNb98MMP0dDQgD/+8Y8P/JwffvgBt27dsrkxuaMYKIhIOF214S4pKQnvv/8+PvjgAxQXF2PZsmWor69HfHw8ACAuLg7Jycmt6u3btw8xMTF46KGHrPLr6urw0ksv4e9//zu+//575OTkYM6cORgzZgyioqIc+zHswDkKIhJOVx3hMW/ePNy4cQPr16+H0WhEaGgosrKy5AnusrIyeUirRUlJCf72t7/h5MmTra7n4uKCCxcu4IMPPkBNTQ38/f0xffp0bN682al7KRgoiEg4XXkoYGJiIhITE9t8Lzc3t1Xe2LFjrTYj32/AgAH44osvHGpHRzBQEJFw7p+ctr9O2zdvETBQEJFwWs5IUlpHVJzMJiIim9ijICLh8JnZyjBQEJFwGCiUYaAgIuE4chqsWsXJbCIiYajUynsIDpwy3mcwUBCRcPjMbGUEjpFERGQP9iiISDiczFaGgYKIhOPYzmxxB2AYKIhIOJyjUIaBgoiE05WHAvYFDBREJBzOUSgj7qAbERHZhT0KIhKOYzuzxf17NQMFEQmHQ0/KMFAQkXBUKheoVS4K6/CsJyIiYXAfhTIMFEQkHBeVGi4KexQuKouTWtPziRsiiYjILk4PFGlpaQgMDISbmxv0ej0KCgpslv/www8RFBQENzc3TJgwAZ9//rmzm0hEglGrXRxKonJqoDhy5AiSkpKQkpKC8+fPIyQkBFFRUaiqqmqz/NmzZzF//nwsWrQI//jHPxATE4OYmBhcvHjRmc0kIsGof5nMVppE5dRA8fbbbyMhIQHx8fEIDg5Geno63N3dsX///jbLv/POO4iOjsZLL72EcePGYfPmzXjsscewa9cuZzaTiATTMpmtNInKad+8sbERhYWFMBgMv36YWg2DwYC8vLw26+Tl5VmVB4CoqKh2yxMROcJF5eJQEpXTVj3dvHkTZrMZvr6+Vvm+vr64fPlym3WMRmOb5Y1GY7uf09DQgIaGBvm1yWTqQKuJSASOzDmo1Vz11GulpqbCw8NDTgEBAd3dJCKiPsVpgWLo0KFwcXFBZWWlVX5lZSV0Ol2bdXQ6naLyAJCcnIza2lo5lZeXd7zxRNSnqaCWz3uyN6kcvF0qWfmZkZEBlUplldzc3KzKSJKE9evXw8/PDwMGDIDBYMB3333nUNvs5bRA4erqirCwMOTk5Mh5FosFOTk5iIiIaLNORESEVXkAyM7Obrc8AGg0Gmi1WqtERGRL8+S00uWxym+XSld+AoBWq0VFRYWcrl27ZvX+m2++iZ07dyI9PR35+fkYOHAgoqKicPfuXcXts5dTh56SkpLw/vvv44MPPkBxcTGWLVuG+vp6xMfHAwDi4uKQnJwsl3/xxReRlZWFt956C5cvX8aGDRtw7tw5JCYmOrOZRCSYrprMVrryEwBUKhV0Op2c7p+3lSQJO3bswJ///GfMmTMHEydOxMGDB/Hjjz/i+PHjjvwUdnFqoJg3bx62bduG9evXIzQ0FEVFRcjKypK/eFlZGSoqKuTykZGRyMzMxJ49exASEoKPPvoIx48fx/jx453ZTCISjNJhJ0eOJXdk5ScA1NXVYcSIEQgICMCcOXNw6dIl+b2rV6/CaDRaXdPDwwN6vd6pq0OdftZTYmJiuz2C3NzcVnlz587F3LlzndwqIiLH/HZlpUajgUajaVXOkZWfY8eOxf79+zFx4kTU1tZi27ZtiIyMxKVLlzB8+HB5BajS1aEd1etXPRERKdWRIzwCAgKsVlqmpqZ2WrsiIiIQFxeH0NBQPP300zh69Ci8vb3x3nvvddpnOIKnxxKRcBw5kqOlfHl5udWimbZ6E4BjKz9/q3///nj00UdRWloKAHK9yspK+Pn5WV0zNDTU7u+iFHsURCQcF7WLQwlAq1WW7QUKR1Z+/pbZbMY333wjB4WRI0dCp9NZXdNkMiE/P9/uazqCPQoiEk5XPTM7KSkJCxcuRHh4OCZPnowdO3a0Wvk5bNgwefhq06ZNePzxxzFmzBjU1NRg69atuHbtGhYvXgygeUXUypUr8eqrr+KRRx7ByJEjsW7dOvj7+yMmJkZx++zFQEFEwlH9so9CaR2l5s2bhxs3bmD9+vUwGo0IDQ1ttfLz/v0ZP/30ExISEmA0GjFkyBCEhYXh7NmzCA4Olsu8/PLLqK+vx5IlS1BTU4Mnn3wSWVlZrTbmdSaVJEl96kGwJpMJHh4eGBPnCxdXjqx1VOpH/6e7m9BnbH/xk+5uQq/X1GBB3hvXUVtb69Dm2pb7w/v5S+E+qO0ho/bcqWtAgj7d4c/uzdijICLhdGQyW0QMFEQkHEeeLyHy8ygYKIhIOI4cycHnURARCYRDT8owUBCRcNQqBx5cJHCgEHfQjYiI7MIeBREJp6s23PUVDBREJBwXtVo+kkNJHVExUBCRcFQOTGarBJ6jYKAgIuFw6EkZBgoiEg6XxyojbogkIiK7sEdBRMJhj0IZBgoiEo5K5aJ4cpqT2UREAmmezFbaoxB3pJ6BgoiEo4YL1FAYKBSW70sYKIhIOJyjUEbcvhQREdmFPQoiEg57FMowUBCRcLjqSRkGCiISjsqByWwVJ7OJiMShVqkcOOtJ5aTW9HwMFEQkHM5RKMNVT0REZBN7FEQkHPYolHF6jyItLQ2BgYFwc3ODXq9HQUFBu2UzMjKgUqmskpubm7ObSESCaVn1pDSJyqmB4siRI0hKSkJKSgrOnz+PkJAQREVFoaqqqt06Wq0WFRUVcrp27Zozm0hEAmo5wkNpEpVTA8Xbb7+NhIQExMfHIzg4GOnp6XB3d8f+/fvbraNSqaDT6eTk6+vrzCYSkYDUcJGHn+xODBSdr7GxEYWFhTAYDL9+mFoNg8GAvLy8duvV1dVhxIgRCAgIwJw5c3Dp0iWbn9PQ0ACTyWSViIhsURwkHJjTaKFk+P3999/HP//zP2PIkCEYMmQIDAZDq/LPPfdcqyH66Ohoh9pmL6dNZt+8eRNms7lVj8DX1xeXL19us87YsWOxf/9+TJw4EbW1tdi2bRsiIyNx6dIlDB8+vM06qamp2LhxY6v8DR//Du4q145/EcEl//5odzehz3Cv5SLDjjI3WLq7CYq0DL+np6dDr9djx44diIqKQklJCXx8fFqVz83Nxfz58xEZGQk3Nzds2bIF06dPx6VLlzBs2DC5XHR0NA4cOCC/1mg0Tv0ePer/3IiICMTFxSE0NBRPP/00jh49Cm9vb7z33nvt1klOTkZtba2cysvLu7DFRNQbtTyPQllSfrtUOvx+6NAhPP/88wgNDUVQUBD27t0Li8WCnJwcq3IajcZqiH7IkCEO/Q72clqgGDp0KFxcXFBZWWmVX1lZCZ1OZ9c1+vfvj0cffRSlpaXtltFoNNBqtVaJiMiWjqx6+u1Qd0NDQ5uf4ejw+/3u3LmDe/fuwcvLyyo/NzcXPj4+GDt2LJYtW4Zbt245+EvYx2mBwtXVFWFhYVaRsCUyRkRE2HUNs9mMb775Bn5+fs5qJhEJSOXAiqeWs54CAgLg4eEhp9TU1DY/w9bwu9FotKuda9asgb+/v1WwiY6OxsGDB5GTk4MtW7bg9OnTmDFjBsxms4O/xoM5dcNdUlISFi5ciPDwcEyePBk7duxAfX094uPjAQBxcXEYNmyY/ENv2rQJjz/+OMaMGYOamhps3boV165dw+LFi53ZTCISTPPQk9KznprLl5eXW41cOGt+4I033sDhw4eRm5trtZ8sNjZW/vOECRMwceJEjB49Grm5uZg2bZpT2uLUQDFv3jzcuHED69evh9FoRGhoKLKysuQIW1ZWBrX61/9YP/30ExISEmA0GjFkyBCEhYXh7NmzCA4OdmYziUgwHdmZbe8Qd0eG37dt24Y33ngDX375JSZOnGiz7KhRozB06FCUlpb2zkABAImJiUhMTGzzvdzcXKvX27dvx/bt253dJCIip7t/+D0mJgbAr8Pv7d0TAeDNN9/Ea6+9hi+++ALh4eEP/JwffvgBt27dcuoQPc96IiLhdNVZT0qH37ds2YL169cjMzMTgYGB8lzGoEGDMGjQINTV1WHjxo149tlnodPpcOXKFbz88ssYM2YMoqKiFLfPXgwURCQcFdSKH0SkcmDtj9Lh9927d6OxsRG///3vra6TkpKCDRs2wMXFBRcuXMAHH3yAmpoa+Pv7Y/r06di8ebNT91IwUBCRcLry9Fglw+/ff/+9zWsNGDAAX3zxhUPt6AgGCiISDo8ZV4aBgoiE0zz0pGwoyZGhp75C3G9ORER2YY+CiASk+iUprSMmBgoiEg6HnpRhoCAi4ah++UdpHVExUBCRgNRQPkXLHgURkTDYo1BG3BBJRER2YY+CiITT/KxphZPZKnF7FAwURCQgLo9VgoGCiITD5bHKMFAQkYCUT2azR0FEJBQuj1VC3G9ORER2YY+CiITDfRTKMFAQkXA4ma0MAwURCYjLY5VgoCAi4bBHoQwDBREJh3MUyogbIomIyC7sURCRgLiPQgkGCiISDucolGGgICLhNK95UjpHIS4GCiISj0rdnJTWERQDBREJh6uelBE3RBIRkV2cGijOnDmD2bNnw9/fHyqVCsePH39gndzcXDz22GPQaDQYM2YMMjIynNlEIhJQy2S20uSItLQ0BAYGws3NDXq9HgUFBTbLf/jhhwgKCoKbmxsmTJiAzz//3Op9SZKwfv16+Pn5YcCAATAYDPjuu+8capu9nBoo6uvrERISgrS0NLvKX716FbNmzcLUqVNRVFSElStXYvHixfjiiy+c2UwiEo7KwaTMkSNHkJSUhJSUFJw/fx4hISGIiopCVVVVm+XPnj2L+fPnY9GiRfjHP/6BmJgYxMTE4OLFi3KZN998Ezt37kR6ejry8/MxcOBAREVF4e7du4rbZy+VJEmS065+/wepVDh27BhiYmLaLbNmzRp89tlnVj9KbGwsampqkJWVZdfnmEwmeHh44L88EuCucu1os4WX/Puj3d2EPsN9EEd6O8rcYMGF3RWora2FVqtVXL/l/mCsrFBc32QyQefrp+iz9Xo9Jk2ahF27dgEALBYLAgICsGLFCqxdu7ZV+Xnz5qG+vh6ffvqpnPf4448jNDQU6enpkCQJ/v7+WL16Nf70pz8BAGpra+Hr64uMjAzExsYq+k726lH/5+bl5cFgMFjlRUVFIS8vr5taRER9kcrBf5RobGxEYWGh1T1NrVbDYDC0e0970D3w6tWrMBqNVmU8PDyg1+udep/sUauejEYjfH19rfJ8fX1hMpnw888/Y8CAAa3qNDQ0oKGhQX5tMpmc3k4iEtdv7zEajQYajaZVuZs3b8JsNrd5T7t8+XKb127vHmg0GuX3W/LaK+MMPapH4YjU1FR4eHjIKSAgoLubREQ9nuNzFAEBAVb3nNTU1K5vfhfrUT0KnU6HyspKq7zKykpotdo2exMAkJycjKSkJPm1yWRisCAi26RfktI6AMrLy63mKNrqTQDA0KFD4eLi0uY9TafTtVmnvXtgS/mWf1dWVsLPz8+qTGhoqKKvo0SP6lFEREQgJyfHKi87OxsRERHt1tFoNNBqtVaJiMgWlSQ5lAC0ut+0FyhcXV0RFhZmdU+zWCzIyclp9572oHvgyJEjodPprMqYTCbk5+fbvE92lFN7FHV1dSgtLZVfX716FUVFRfDy8sLDDz+M5ORkXL9+HQcPHgQALF26FLt27cLLL7+M//iP/8CpU6fw17/+FZ999pkzm0lEoulAj0KJpKQkLFy4EOHh4Zg8eTJ27NiB+vp6xMfHAwDi4uIwbNgwefjqxRdfxNNPP4233noLs2bNwuHDh3Hu3Dns2bMHQPPq0ZUrV+LVV1/FI488gpEjR2LdunXw9/e3uaK0o5waKM6dO4epU6fKr1uGiBYuXIiMjAxUVFSgrKxMfn/kyJH47LPPsGrVKrzzzjsYPnw49u7di6ioKGc2k4hE00WBYt68ebhx4wbWr18Po9GI0NBQZGVlyZPRZWVlUKt/HdiJjIxEZmYm/vznP+OVV17BI488guPHj2P8+PFymZdffhn19fVYsmQJampq8OSTTyIrKwtubm7KG2inLttH0VW4j6JzcR9F5+E+io7rrH0UVdeNDu2j8Bmmc/ize7MeNZlNRNQlJKk5Ka0jKAYKIhKOSmpOSuuIioGCiMTTRXMUfQUDBRGJh0NPijBQEJF42KNQhMswiIjIJgYKIiKyiUNPRCSc+4/kUFJHVAwURCQmce/7ijFQEJF4OJmtCAMFEYmHy2MV4WQ2ERHZxB4FEQmHR3gow0BBROLhHIUiDBREJB4GCkUYKIhIPJzMVoSBgoiEwzkKZbjqiYiIbGKgICIimzj0RETi4RyFIgwURCQernpShIGCiITDyWxlGCiISDwcelKEk9lERGQTexREJB7OUSjCQEFE4rFIzUlpHUExUBCRcCRJgqRwzkFp+b6EgYKIxGP5JSmtIyhOZhORcCQJkCySsuTEDkV1dTUWLFgArVYLT09PLFq0CHV1dTbLr1ixAmPHjsWAAQPw8MMP44UXXkBtba1VOZVK1SodPnxYcfvYoyAi6mYLFixARUUFsrOzce/ePcTHx2PJkiXIzMxss/yPP/6IH3/8Edu2bUNwcDCuXbuGpUuX4scff8RHH31kVfbAgQOIjo6WX3t6eipun1N7FGfOnMHs2bPh7+8PlUqF48eP2yyfm5vbZgQ0Go3ObCYRiaZlH4XS5ATFxcXIysrC3r17odfr8eSTT+Ldd9/F4cOH8eOPP7ZZZ/z48fjv//5vzJ49G6NHj8YzzzyD1157DSdOnEBTU5NVWU9PT+h0Ojm5ubkpbqNTA0V9fT1CQkKQlpamqF5JSQkqKirk5OPj46QWEpGIFA87/ZIAwGQyWaWGhoYOtSUvLw+enp4IDw+X8wwGA9RqNfLz8+2+Tm1tLbRaLfr1sx4oWr58OYYOHYrJkydj//79Dk3KO3XoacaMGZgxY4biej4+Pg51j4iI7NKB5bEBAQFW2SkpKdiwYYPDTTEaja3+MtyvXz94eXnZPZpy8+ZNbN68GUuWLLHK37RpE5555hm4u7vj5MmTeP7551FXV4cXXnhBURt75BxFaGgoGhoaMH78eGzYsAFPPPFEdzeJiPqQjiyPLS8vh1arlfM1Gk2b5deuXYstW7bYvGZxcbGiNrTFZDJh1qxZCA4ObhWw1q1bJ//50UcfRX19PbZu3dq7A4Wfnx/S09MRHh6OhoYG7N27F1OmTEF+fj4ee+yxNus0NDRYdf1MJlNXNZeIeqsOLI/VarVWgaI9q1evxnPPPWezzKhRo6DT6VBVVWWV39TUhOrqauh0Opv1b9++jejoaAwePBjHjh1D//79bZbX6/XYvHkzGhoa2g1wbelRgWLs2LEYO3as/DoyMhJXrlzB9u3b8Z//+Z9t1klNTcXGjRtb5act+xz9NFz921HutfwNO8udOoEX4ncSc2Pv+Q29vb3h7e39wHIRERGoqalBYWEhwsLCAACnTp2CxWKBXq9vt57JZEJUVBQ0Gg0++eQTuyapi4qKMGTIEEVBAugF+ygmT56M0tLSdt9PTk5GbW2tnMrLy7uwdUTUG7UMPSlNzjBu3DhER0cjISEBBQUF+Oqrr5CYmIjY2Fj4+/sDAK5fv46goCAUFBQAaA4S06dPR319Pfbt2weTyQSj0Qij0Qiz2QwAOHHiBPbu3YuLFy+itLQUu3fvxuuvv44VK1YobmOP6lG0paioCH5+fu2+r9FoFEdHIhJcDzvr6dChQ0hMTMS0adOgVqvx7LPPYufOnfL79+7dQ0lJCe7cuQMAOH/+vLwiasyYMVbXunr1KgIDA9G/f3+kpaVh1apVkCQJY8aMwdtvv42EhATF7XNqoKirq7PqDVy9ehVFRUXw8vLCww8/jOTkZFy/fh0HDx4EAOzYsQMjR47EP/3TP+Hu3bvYu3cvTp06hZMnTzqzmUQkmPuXuyqp4yxeXl7tbq4DgMDAQKsezZQpUx7Yw4mOjrbaaNcRTg0U586dw9SpU+XXSUlJAICFCxciIyMDFRUVKCsrk99vbGzE6tWrcf36dbi7u2PixIn48ssvra5BRNRhfHCRIiqpjx2JaDKZ4OHhgYi1wziZ3QnqanvP5GFPx8nsjjM3WlB6sFLeXKZUy/3BmPMttIMGK6tbdxu6acEOf3ZvxjspERHZ1OMns4mIOp0E5fso+tTYizIMFEQkHD64SBkGCiISTw9bHtvTMVAQkXgYKBRhoCAi4XDoSRmueiIiIpvYoyAi8XTg9FgRMVAQkXB62hEePR0DBRGJh0d4KMJAQUTCYY9CGQYKIhIPl8cqwlVPRERkE3sURCSc5ikKpfsonNSYXoCBgojEIzkw9CRwpGCgICLhSGYLJLOyjRFKy/clDBREJByuelKGgYKIhMMehTJc9URERDaxR0FE4rFYmpPSOoJioCAi4UhmCZJZ4RyFwvJ9CQMFEYnHYoHEHoXdGCiISDiSxYHJbAYKIiKBcI5CEa56IiIimxgoiEg4LRvulCZnqa6uxoIFC6DVauHp6YlFixahrq7OZp0pU6ZApVJZpaVLl1qVKSsrw6xZs+Du7g4fHx+89NJLaGpqUtw+Dj0RkXCaVz0p3XDnvECxYMECVFRUIDs7G/fu3UN8fDyWLFmCzMxMm/USEhKwadMm+bW7u7v8Z7PZjFmzZkGn0+Hs2bOoqKhAXFwc+vfvj9dff11R+xgoiEg4kgOrnpw1mV1cXIysrCx8/fXXCA8PBwC8++67mDlzJrZt2wZ/f/9267q7u0On07X53smTJ/Htt9/iyy+/hK+vL0JDQ7F582asWbMGGzZsgKurq91t5NATEYnHbHEsOUFeXh48PT3lIAEABoMBarUa+fn5NuseOnQIQ4cOxfjx45GcnIw7d+5YXXfChAnw9fWV86KiomAymXDp0iVFbWSPgohIAZPJZPVao9FAo9E4fD2j0QgfHx+rvH79+sHLywtGo7Hden/4wx8wYsQI+Pv748KFC1izZg1KSkpw9OhR+br3BwkA8mtb120LAwURCacjp8cGBARY5aekpGDDhg2tyq9duxZbtmyxec3i4mJFbbjfkiVL5D9PmDABfn5+mDZtGq5cuYLRo0c7fN22OHXoKTU1FZMmTcLgwYPh4+ODmJgYlJSUPLDehx9+iKCgILi5uWHChAn4/PPPndlMIhJMy+mxShMAlJeXo7a2Vk7Jycltfsbq1atRXFxsM40aNQo6nQ5VVVVWdZuamlBdXd3u/ENb9Ho9AKC0tBQAoNPpUFlZaVWm5bWS6wJO7lGcPn0ay5cvx6RJk9DU1IRXXnkF06dPx7fffouBAwe2Wefs2bOYP38+UlNT8S//8i/IzMxETEwMzp8/j/HjxzuzuUQkCElyYDJbai6v1Wqh1WofWN7b2xve3t4PLBcREYGamhoUFhYiLCwMAHDq1ClYLBb55m+PoqIiAICfn5983ddeew1VVVXy0FZ2dja0Wi2Cg4Ptvi4AqCSlD47tgBs3bsDHxwenT5/GU0891WaZefPmob6+Hp9++qmc9/jjjyM0NBTp6ekP/AyTyQQPDw9ErB2GfhrO1XdUXa24u1E72506/pYdZW60oPRgJWpra+26Wf9Wy/3h8msnMNit7b+stuf23XoE/d/ZDn+2LTNmzEBlZSXS09Pl5bHh4eHy8tjr169j2rRpOHjwICZPnowrV64gMzMTM2fOxEMPPYQLFy5g1apVGD58OE6fPg2geXlsaGgo/P398eabb8JoNOLf//3fsXjxYsXLY7v0TlpbWwsA8PLyardMXl4eDAaDVV5UVBTy8vLaLN/Q0ACTyWSViIhsaVkeqzQ5y6FDhxAUFIRp06Zh5syZePLJJ7Fnzx75/Xv37qGkpERe1eTq6oovv/wS06dPR1BQEFavXo1nn30WJ06ckOu4uLjg008/hYuLCyIiIvDHP/4RcXFxVvsu7NVlk9kWiwUrV67EE088YXMIqb2Z+vZm6VNTU7Fx48ZObSsRUVfy8vKyubkuMDAQ9w/+BAQEyD0HW0aMGNEpc7xd1qNYvnw5Ll68iMOHD3fqdZOTk60mlsrLyzv1+kTU93RkMltEXdKjSExMxKeffoozZ85g+PDhNsu2N1Pf3ix9R9cwE5F4etLO7N7AqT0KSZKQmJiIY8eO4dSpUxg5cuQD60RERCAnJ8cqLzs7GxEREc5qJhGJxiw5lgTl1B7F8uXLkZmZiY8//hiDBw+W5xk8PDwwYMAAAEBcXByGDRuG1NRUAMCLL76Ip59+Gm+99RZmzZqFw4cP49y5c1YTO0REHdG84U5pj0LcQOHUHsXu3btRW1uLKVOmwM/PT05HjhyRy5SVlaGiokJ+HRkZiczMTOzZswchISH46KOPcPz4ce6hIKJO0/KEO0VJ4KEnp/Yo7NmikZub2ypv7ty5mDt3rhNaRERESvGsJyISDiezlWGgICLxODI5zclsIiJxsEehDAMFEQlHarJAclEYKJoYKIiIhOHITmuRd2bzeFUiIrKJPQoiEo5ktigeShK5R8FAQUTiceSQPwYKIiJxSE0WSGpOZtuLgYKIhCM1SQ4ECu6jICIShmSWICncQKe0fF/CVU9ERGQTexREJByuelKGgYKIhCOZHZjMZqAgIhKH1GSBpOKqJ3sxUBCRcBgolGGgICLhcOhJGa56IiIim9ijICLhSGYHhp4E7lEwUBCRcKQmCyRwjsJeDBREJBzJLDnQoxB3ZzYDBREJhz0KZTiZTUTCaXnCndLkLNXV1ViwYAG0Wi08PT2xaNEi1NXVtVv++++/h0qlajN9+OGHcrm23j98+LDi9rFHQUTUzRYsWICKigpkZ2fj3r17iI+Px5IlS5CZmdlm+YCAAFRUVFjl7dmzB1u3bsWMGTOs8g8cOIDo6Gj5taenp+L2MVAQkXAkswNDT07qURQXFyMrKwtff/01wsPDAQDvvvsuZs6ciW3btsHf379VHRcXF+h0Oqu8Y8eO4d/+7d8waNAgq3xPT89WZZXi0BMRCUdqsjiUAMBkMlmlhoaGDrUlLy8Pnp6ecpAAAIPBALVajfz8fLuuUVhYiKKiIixatKjVe8uXL8fQoUMxefJk7N+/H5KkfFKePQoiEo5kliDBsedRBAQEWOWnpKRgw4YNDrfFaDTCx8fHKq9fv37w8vKC0Wi06xr79u3DuHHjEBkZaZW/adMmPPPMM3B3d8fJkyfx/PPPo66uDi+88IKiNjJQEJFwpCYLJMmxoafy8nJotVo5X6PRtFl+7dq12LJli81rFhcXK2pDW37++WdkZmZi3bp1rd67P+/RRx9FfX09tm7dykBBRPRADsxR4JdAodVqrQJFe1avXo3nnnvOZplRo0ZBp9OhqqrKKr+pqQnV1dV2zS189NFHuHPnDuLi4h5YVq/XY/PmzWhoaGg3wLWFgYKIyAm8vb3h7e39wHIRERGoqalBYWEhwsLCAACnTp2CxWKBXq9/YP19+/bhd7/7nV2fVVRUhCFDhigKEoCTJ7NTU1MxadIkDB48GD4+PoiJiUFJSYnNOhkZGa3W/bq5uTmzmUQkmJYn3ClKTlr1NG7cOERHRyMhIQEFBQX46quvkJiYiNjYWHnF0/Xr1xEUFISCggKruqWlpThz5gwWL17c6ronTpzA3r17cfHiRZSWlmL37t14/fXXsWLFCsVtdGqP4vTp01i+fDkmTZqEpqYmvPLKK5g+fTq+/fZbDBw4sN16Wq3WKqCoVCpnNpOIBCM1OXDMuMV5G+4OHTqExMRETJs2DWq1Gs8++yx27twpv3/v3j2UlJTgzp07VvX279+P4cOHY/r06a2u2b9/f6SlpWHVqlWQJAljxozB22+/jYSEBMXtU0mOrJVy0I0bN+Dj44PTp0/jqaeearNMRkYGVq5ciZqaGoc+w2QywcPDAxFrh6Gfhqt/O6quVtxjCzrbnTr+lh1lbrSg9GAlamtr7Zon+K2W+8PJYWswUK1s+KXe0oDp17c4/Nm9WZfeSWtrawEAXl5eNsvV1dVhxIgRCAgIwJw5c3Dp0qWuaB4RCaKnHeHR03XZZLbFYsHKlSvxxBNPYPz48e2WGzt2LPbv34+JEyeitrYW27ZtQ2RkJC5duoThw4e3Kt/Q0GC14aUlGDU1iPsftTOZ+Tt2GnMjf8uOsvzyG3Z0IMQiWWBRuDxWafm+pMsCxfLly3Hx4kX87W9/s1kuIiICERER8uvIyEiMGzcO7733HjZv3tyqfGpqKjZu3Ngq/+vtFa3yiKhvuH37Njw8PLq7GcLokkCRmJiITz/9FGfOnGmzV2BL//798eijj6K0tLTN95OTk5GUlCS/tlgsqK6uxkMPPdSjJ8FNJhMCAgJabd4hZfg7dp7e8FtKkoTbt2+3ef6REhZJgkVhr0Rp+b7EqYFCkiSsWLECx44dQ25uLkaOHKn4GmazGd988w1mzpzZ5vsajabVmmBHTkfsLvZu3iHb+Dt2np7+W3ZGT8IsWWBWOJSktHxf4tRAsXz5cmRmZuLjjz/G4MGD5XNLPDw8MGDAAABAXFwchg0bhtTUVADNZ5M8/vjjGDNmDGpqarB161Zcu3atzXXCRESO4ByFMk4NFLt37wYATJkyxSr/wIED8tb2srIyqNW/Lr766aefkJCQAKPRiCFDhiAsLAxnz55FcHCwM5tKRALh0JMyTh96epDc3Fyr19u3b8f27dud1KKeQ6PRICUlRfFWerLG37HziPRbskehTJduuCMi6k4tG+4+8lru0Ia731enCbnhjocCEpFwJAd6FEqPJe9LGCiISDgWODBHofBBR30JAwURCcciSbAofB6FyJPZPDWvG6SlpSEwMBBubm7Q6/Wtjg6mBztz5gxmz54Nf39/qFQqHD9+vLub1Gs58jiA3q5lH4XSJCoGii525MgRJCUlISUlBefPn0dISAiioqJaPeGKbKuvr0dISAjS0tK6uym9XsvjAP7+978jOzsb9+7dw/Tp01FfX9/dTXOaluWxSpOouOqpi+n1ekyaNAm7du0C0HzkSEBAAFasWIG1a9d2c+t6J5VKhWPHjiEmJqa7m9In2PM4gN6qZdXTQe1iuKtcFdW9IzUizrRXyFVP7FF0ocbGRhQWFsJgMMh5arUaBoMBeXl53dgyol/Z+ziA3qxlH4XSJCpOZnehmzdvwmw2w9fX1yrf19cXly9f7qZWEf3K3scB9HYWyeLAZDYDBRGR3Y8D6O2aVz3xCA97MVB0oaFDh8LFxQWVlZVW+ZWVldDpdN3UKqJmHXkcQG/DHoUynKPoQq6urggLC0NOTo6cZ7FYkJOTY/WwJqKuJEkSEhMTcezYMZw6dcqhxwH0NhYHlsaKHCjYo+hiSUlJWLhwIcLDwzF58mTs2LED9fX1iI+P7+6m9Sp1dXVWD7O6evUqioqK4OXlhYcffrgbW9b72PM4ABIbl8d2g127dmHr1q0wGo0IDQ3Fzp07odfru7tZvUpubi6mTp3aKn/hwoXIyMjo+gb1Yu09CfL+xwH0FS3LY//iNh8DFC6P/VlqxPN3/5+Qy2MZKIhIGC2BYpcm1qFAkdhwWMhAwaEnIhIOJ7OVYaAgIuHwUEBlGCiISDjcR6EMl8cSEZFNDBREJJyedsz4a6+9hsjISLi7u8PT09OuOpIkYf369fDz88OAAQNgMBjw3XffWZWprq7GggULoNVq4enpiUWLFqGurk5x+xgoiEg4Pe1QwMbGRsydOxfLli2zu86bb76JnTt3Ij09Hfn5+Rg4cCCioqJw9+5ducyCBQtw6dIlZGdny7vulyxZorh9XB5LRMJoWR77hmoO3FT9FdW9K93DWuljpy6PzcjIwMqVK1FTU2OznCRJ8Pf3x+rVq/GnP/0JQPOpv76+vsjIyEBsbCyKi4sRHByMr7/+GuHh4QCArKwszJw5Ez/88AP8/f3tbhd7FEQknJ7Wo1Dq6tWrMBqNVo8s8PDwgF6vlx9ZkJeXB09PTzlIAIDBYIBarUZ+fr6iz+OqJyISzl3cg8JFT8110NwruZ9Go4FGo+msptml5ZiVth5Z0PKe0WiEj4+P1fv9+vWDl5eXXMZeDBREJAxXV1fodDpsMmY5VH/QoEEICAiwyktJScGGDRtalV27di22bNli83rFxcUICgpyqC1diYGCiITh5uaGq1evorGx0aH6kiS1Ohurvd7E6tWrH3hW1qhRoxxqR8tjCSorK+Hn5yfnV1ZWIjQ0VC5TVVVlVa+pqQnV1dWKH2vAQEFEQnFzc4Obm5vTP8fb2xve3t5OufbIkSOh0+mQk5MjBwaTyYT8/Hx55VRERARqampQWFiIsLAwAMCpU6dgsVgUH0LKyWwiom5WVlaGoqIilJWVwWw2o6ioCEVFRVZ7HoKCgnDs2DEAzSf+rly5Eq+++io++eQTfPPNN4iLi4O/vz9iYmIAAOPGjUN0dDQSEhJQUFCAr776ComJiYiNjVW04gkAIBERUbdauHChhObpdav0P//zP3IZANKBAwfk1xaLRVq3bp3k6+sraTQaadq0aVJJSYnVdW/duiXNnz9fGjRokKTVaqX4+Hjp9u3bitvHfRRERGQTh56IiMgmBgoiIrKJgYKIiGxioCAiIpsYKIiIyCYGCiIisomBgoiIbGKgICIimxgoiIjIJgYKIiKyiYGCiIhsYqAgIiKb/j+fzMf3I4GgkwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "cond_coeff_mat = conditional_corrcoeff(\n", " density=posterior,\n", @@ -345,7 +303,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -390,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -409,7 +367,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -433,9 +391,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/michaeldeistler/Documents/phd/sbi/sbi/inference/posteriors/mcmc_posterior.py:115: UserWarning: The default value for thinning in MCMC sampling has been changed from 10 to 1. This might cause the results differ from the last benchmark.\n", + " thin = _process_thin_default(thin)\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "85621b7d18d34695a29b7059a80cf77a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Generating 20 MCMC inits via resample strategy: 0%| | 0/20 [00:00" ] @@ -516,7 +497,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" }, "toc": { "base_numbering": 1, diff --git a/tutorials/06_restriction_estimator.ipynb b/docs/tutorials/06_restriction_estimator.ipynb similarity index 100% rename from tutorials/06_restriction_estimator.ipynb rename to docs/tutorials/06_restriction_estimator.ipynb diff --git a/tutorials/07_sensitivity_analysis.ipynb b/docs/tutorials/07_sensitivity_analysis.ipynb similarity index 100% rename from tutorials/07_sensitivity_analysis.ipynb rename to docs/tutorials/07_sensitivity_analysis.ipynb diff --git a/tutorials/08_crafting_summary_statistics.ipynb b/docs/tutorials/08_crafting_summary_statistics.ipynb similarity index 100% rename from tutorials/08_crafting_summary_statistics.ipynb rename to docs/tutorials/08_crafting_summary_statistics.ipynb diff --git a/tutorials/09_sampler_interface.ipynb b/docs/tutorials/09_sampler_interface.ipynb similarity index 100% rename from tutorials/09_sampler_interface.ipynb rename to docs/tutorials/09_sampler_interface.ipynb diff --git a/tutorials/10_diagnostics_posterior_predictive_checks.ipynb b/docs/tutorials/10_diagnostics_posterior_predictive_checks.ipynb similarity index 100% rename from tutorials/10_diagnostics_posterior_predictive_checks.ipynb rename to docs/tutorials/10_diagnostics_posterior_predictive_checks.ipynb diff --git a/tutorials/11_diagnostics_simulation_based_calibration.ipynb b/docs/tutorials/11_diagnostics_simulation_based_calibration.ipynb similarity index 100% rename from tutorials/11_diagnostics_simulation_based_calibration.ipynb rename to docs/tutorials/11_diagnostics_simulation_based_calibration.ipynb diff --git a/tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb b/docs/tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb similarity index 100% rename from tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb rename to docs/tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb diff --git a/tutorials/13_diagnostics_lc2st.ipynb b/docs/tutorials/13_diagnostics_lc2st.ipynb similarity index 100% rename from tutorials/13_diagnostics_lc2st.ipynb rename to docs/tutorials/13_diagnostics_lc2st.ipynb diff --git a/tutorials/14_mcmc_diagnostics_with_arviz.ipynb b/docs/tutorials/14_mcmc_diagnostics_with_arviz.ipynb similarity index 100% rename from tutorials/14_mcmc_diagnostics_with_arviz.ipynb rename to docs/tutorials/14_mcmc_diagnostics_with_arviz.ipynb diff --git a/tutorials/15_importance_sampled_posteriors.ipynb b/docs/tutorials/15_importance_sampled_posteriors.ipynb similarity index 100% rename from tutorials/15_importance_sampled_posteriors.ipynb rename to docs/tutorials/15_importance_sampled_posteriors.ipynb diff --git a/tutorials/16_implemented_methods.ipynb b/docs/tutorials/16_implemented_methods.ipynb similarity index 100% rename from tutorials/16_implemented_methods.ipynb rename to docs/tutorials/16_implemented_methods.ipynb diff --git a/tutorials/17_plotting_functionality.ipynb b/docs/tutorials/17_plotting_functionality.ipynb similarity index 100% rename from tutorials/17_plotting_functionality.ipynb rename to docs/tutorials/17_plotting_functionality.ipynb diff --git a/tutorials/18_training_interface.ipynb b/docs/tutorials/18_training_interface.ipynb similarity index 100% rename from tutorials/18_training_interface.ipynb rename to docs/tutorials/18_training_interface.ipynb diff --git a/tutorials/19_flowmatching_and_scorematching.ipynb b/docs/tutorials/19_flowmatching_and_scorematching.ipynb similarity index 100% rename from tutorials/19_flowmatching_and_scorematching.ipynb rename to docs/tutorials/19_flowmatching_and_scorematching.ipynb diff --git a/tutorials/Example_00_HodgkinHuxleyModel.ipynb b/docs/tutorials/Example_00_HodgkinHuxleyModel.ipynb similarity index 100% rename from tutorials/Example_00_HodgkinHuxleyModel.ipynb rename to docs/tutorials/Example_00_HodgkinHuxleyModel.ipynb diff --git a/tutorials/Example_01_DecisionMakingModel.ipynb b/docs/tutorials/Example_01_DecisionMakingModel.ipynb similarity index 100% rename from tutorials/Example_01_DecisionMakingModel.ipynb rename to docs/tutorials/Example_01_DecisionMakingModel.ipynb diff --git a/tutorials/HH_helper_functions.py b/docs/tutorials/HH_helper_functions.py similarity index 100% rename from tutorials/HH_helper_functions.py rename to docs/tutorials/HH_helper_functions.py diff --git a/tutorials/example_01_utils.py b/docs/tutorials/example_01_utils.py similarity index 100% rename from tutorials/example_01_utils.py rename to docs/tutorials/example_01_utils.py diff --git a/tutorials/toy_posterior_for_07_cc.py b/docs/tutorials/toy_posterior_for_07_cc.py similarity index 100% rename from tutorials/toy_posterior_for_07_cc.py rename to docs/tutorials/toy_posterior_for_07_cc.py diff --git a/tutorials/utils_13_diagnosis_sbc.py b/docs/tutorials/utils_13_diagnosis_sbc.py similarity index 100% rename from tutorials/utils_13_diagnosis_sbc.py rename to docs/tutorials/utils_13_diagnosis_sbc.py diff --git a/mkdocs/README.md b/mkdocs/README.md new file mode 100644 index 000000000..70feae73f --- /dev/null +++ b/mkdocs/README.md @@ -0,0 +1,44 @@ +# Documentation + +The documentation is available at: [sbi-dev.github.io/sbi](http://sbi-dev.github.io/sbi) + +## Building the Documentation + +We use [`mike`](https://github.com/jimporter/mike) to manage, build, and deploy our +documentation with [`mkdocs`](https://www.mkdocs.org/). To build the documentation +locally, follow these steps: + +1. Install the documentation dependencies: + + ```bash + python -m pip install .[doc] + ``` + +2. Convert the current version of the documentation notebooks to markdown and build the + website locally using `mkdocs`: + + ```bash + jupyter nbconvert --to markdown ../docs/tutorials/*.ipynb --output-dir docs/tutorials/ + mkdocs serve + ``` + +### Deployment + +Website deployment is managed with `mike` and happens automatically: + +- With every push to `main`, a `dev` version of the most recent documentation is built. +- With every new published **release**, the current documentation is deployed on the + website. + +Thus, the documentation on the website always refers to the latest release, and not +necessarily to the version on `main`. + +## Contributing FAQ + +We welcome contributions to our list of frequently asked questions. To contribute: + +1. Create a new markdown file named `question_XX.md` in the `docs/faq` folder, where + `XX` is a running index for the questions. +2. The file should start with the question as the title (i.e. starting with a `#`) and + then have the answer below. +3. Add a link to your question in the [`docs/faq.md`] file using the same index. diff --git a/docs/docs/citation.md b/mkdocs/docs/citation.md similarity index 100% rename from docs/docs/citation.md rename to mkdocs/docs/citation.md diff --git a/docs/docs/code_of_conduct.md b/mkdocs/docs/code_of_conduct.md similarity index 100% rename from docs/docs/code_of_conduct.md rename to mkdocs/docs/code_of_conduct.md diff --git a/docs/docs/contribute.md b/mkdocs/docs/contribute.md similarity index 100% rename from docs/docs/contribute.md rename to mkdocs/docs/contribute.md diff --git a/docs/docs/credits.md b/mkdocs/docs/credits.md similarity index 100% rename from docs/docs/credits.md rename to mkdocs/docs/credits.md diff --git a/docs/docs/faq.md b/mkdocs/docs/faq.md similarity index 100% rename from docs/docs/faq.md rename to mkdocs/docs/faq.md diff --git a/mkdocs/docs/faq/question_01_leakage.md b/mkdocs/docs/faq/question_01_leakage.md new file mode 100644 index 000000000..f5695081f --- /dev/null +++ b/mkdocs/docs/faq/question_01_leakage.md @@ -0,0 +1,47 @@ +# What should I do when my 'posterior samples are outside the prior support' in SNPE? + +When working with **multi-round** NPE (i.e., SNPE), you might have experienced the +following warning: + +```python +Only x% posterior samples are within the prior support. It may take a long time to +collect the remaining 10000 samples. Consider interrupting (Ctrl-C) and switching to +'sample_with_mcmc=True'. +``` + +The reason for this issue is described in more detail +[here](https://arxiv.org/abs/2210.04815), +[here](https://arxiv.org/abs/2002.03712), and +[here](https://arxiv.org/abs/1905.07488). The following fixes are possible: + +- use truncated proposals for SNPE (TSNPE) + +```python +from sbi.inference import NPE +from sbi.utils import RestrictedPrior, get_density_thresholder + +inference = NPE(prior) +proposal = prior +for _ in range(num_rounds): + theta = proposal.sample((num_sims,)) + x = simulator(theta) + _ = inference.append_simulations(theta, x).train(force_first_round_loss=True) + posterior = inference.build_posterior().set_default_x(x_o) + + accept_reject_fn = get_density_thresholder(posterior, quantile=1e-4) + proposal = RestrictedPrior(prior, accept_reject_fn, sample_with="rejection") +``` + +- sample with MCMC: `samples = posterior((num_samples,), x=x_o, sample_with_mcmc=True)`. +This approach will make sampling slower, but samples will not "leak". + +- resort to single-round NPE and (if necessary) increase your simulation budget. + +- if your prior is either Gaussian (torch.distributions.MultivariateNormal) or Uniform +(sbi.utils.BoxUniform), you can avoid leakage by using a mixture density network as +density estimator. I.e., set `density_estimator='mdn'` when creating the `SNPE` +inference object. When running inference, there should be a print statement "Using +SNPE-C with non-atomic loss". + +- use a different algorithm, e.g., Sequential NRE and Sequential NLE. Note, however, +that these algorithms can have different issues and potential pitfalls. diff --git a/mkdocs/docs/faq/question_02_nans.md b/mkdocs/docs/faq/question_02_nans.md new file mode 100644 index 000000000..e963c4e2c --- /dev/null +++ b/mkdocs/docs/faq/question_02_nans.md @@ -0,0 +1,30 @@ +# Can the algorithms deal with invalid data, e.g., NaN or inf? + +Yes. By default, whenever a simulation returns at least one `NaN` or `inf`, it is +completely excluded from the training data. In other words, the simulation is simply +discarded. + +In cases where a very large fraction of simulations return `NaN` or `inf`, +discarding many simulations can be wasteful. There are two options to deal with +this: Either you use the `RestrictionEstimator` to learn regions in parameter +space that do not produce `NaN` or `inf`, see +[here](https://sbi-dev.github.io/sbi/latest/tutorials/06_restriction_estimator/). +Alternatively, you can manually substitute the 'invalid' values with a +reasonable replacement. For example, at the end of your simulation code, you +search for invalid entries and replace them with a floating point number. +Importantly, in order for neural network training work well, the floating point +number should still be in a reasonable range, i.e., maybe a few standard +deviations outside of 'good' values. + +If you are running **multi-round** NPE (SNPE), however, things can go fully wrong if +invalid data are encountered. In that case, you will get the following warning + +```python +When invalid simulations are excluded, multi-round SNPE-C can leak into the regions +where parameters led to invalid simulations. This can lead to poor results. +``` + +Hence, if you are running multi-round NPE and a significant fraction of +simulations returns at least one invalid number, we strongly recommend manually +replacing the value in your simulation code as described above (or resorting to +single-round NPE, or using a different `sbi` method entirely). diff --git a/mkdocs/docs/faq/question_03_pickling_error.md b/mkdocs/docs/faq/question_03_pickling_error.md new file mode 100644 index 000000000..49419a4c9 --- /dev/null +++ b/mkdocs/docs/faq/question_03_pickling_error.md @@ -0,0 +1,56 @@ +# When using multiple workers, I get a pickling error. Can I still use multiprocessing? + +Yes, but you will have to make a few adjustments to your code. + +Some background: When using `num_workers > 1`, you might experience an error +that a certain object from your simulator could not be pickled (an example can +be found [here](https://github.com/mackelab/sbi/issues/317)). + +This can be fixed by forcing `sbi` to pickle with `dill` instead of the default +`cloudpickle`. To do so, adjust your code as follows: + +- Install `dill`: + +```bash +pip install dill +``` + +- At the very beginning of your python script, set the pickler to `dill`: + +```python +from joblib.externals.loky import set_loky_pickler +set_loky_pickler("dill") +``` + +- Move all imports required by your simulator into the simulator: + +```python +# Imports specified outside of the simulator will break dill: +import torch +def my_simulator(parameters): + return torch.ones(1,10) + +# Therefore, move the imports into the simulator: +def my_simulator(parameters): + import torch + return torch.ones(1,10) +``` + +## Alternative: parallelize yourself + +You can also write your own code to parallelize simulations with whatever +multiprocessing framework you prefer. You can then simulate your data outside of +`sbi` and pass the simulated data using `.append_simulations`: + +```python +# Given pre-simulated theta and x +trainer = SNPE(prior) +trainer.append_simulations(theta, x).train() +``` + +## Some more background + +`sbi` uses `joblib` to parallelize simulations, which in turn uses `pickle` or +`cloudpickle` to serialize the simulator. Almost all simulators will be +picklable with `cloudpickle`, but we have experienced issues, e.g., with `neuron` +simulators, see [here](https://github.com/sbi-dev/sbi/issues/317). diff --git a/mkdocs/docs/faq/question_04_gpu.md b/mkdocs/docs/faq/question_04_gpu.md new file mode 100644 index 000000000..a4aecf92e --- /dev/null +++ b/mkdocs/docs/faq/question_04_gpu.md @@ -0,0 +1,46 @@ + +# Can I use the GPU for training the density estimator? + +**TLDR**; Yes, by passing `device="cuda"` and by passing a prior that lives on the +device name you passed. But we expect no speed-ups for default density estimators. + +## Setup + +Yes, we support GPU training. When creating the inference object in the flexible +interface, you can pass the `device` as an argument, e.g., + +```python +inference = NPE(prior, device="cuda", density_estimator="maf") +``` + +The device is set to `"cpu"` by default. But it can be set to anything, as long +as it maps to an existing PyTorch GPU device, e.g., `device="cuda"` or +`device="cuda:2"`. `sbi` will take care of copying the `net` and the training +data to and from the `device`. +We also support MPS as a GPU device for GPU-accelarated training on an Apple +Silicon chip, e.g., it is possible to pass `device="mps"`. + +Note that the prior must be on the training device already, e.g., when passing +`device="cuda:0"`, make sure to pass a prior object that was created on that +device, e.g., + +```python +prior = torch.distributions.MultivariateNormal(loc=torch.zeros(2, +device="cuda:0"), covariance_matrix=torch.eye(2, device="cuda:0")) +``` + +## Performance + +Whether or not you reduce your training time when training on a GPU depends on +the problem at hand. We provide a couple of default density estimators for +`NPE`, `NLE` and `NRE`, e.g., a mixture density network +(`density_estimator="mdn"`) or a Masked Autoregressive Flow +(`density_estimator="maf"`). For these default density estimators, we do **not** +expect a speed-up. This is because the underlying neural networks are relatively +shallow and not tall, e.g., they do not have many parameters or matrix +operations that benefit from being executed on the GPU. + +A speed-up through training on the GPU will most likely become visible when +using convolutional modules in your neural networks. E.g., when passing an +embedding net for image processing like in this example: +[https://github.com/sbi-dev/sbi/blob/main/tutorials/04_embedding_networks.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/04_embedding_networks.ipynb). diff --git a/mkdocs/docs/faq/question_05_pickling.md b/mkdocs/docs/faq/question_05_pickling.md new file mode 100644 index 000000000..107f4e252 --- /dev/null +++ b/mkdocs/docs/faq/question_05_pickling.md @@ -0,0 +1,81 @@ + +# How should I save and load objects in `sbi`? + +`NeuralPosterior` objects are picklable. + +```python +import pickle + +# ... run inference +posterior = inference.build_posterior() + +with open("/path/to/my_posterior.pkl", "wb") as handle: + pickle.dump(posterior, handle) +``` + +Note: posterior objects that were saved under `sbi v0.22.0` or older cannot be +loaded under `sbi v0.23.0` or newer. + +Note: posterior objects that were saved under `sbi v0.17.2` or older cannot be +loaded under `sbi v0.18.0` or newer. + +Note: if you try to load a posterior that was saved under `sbi v0.14.x` or +earlier under `sbi v0.15.x` until `sbi v0.17.x`, you have to add: + +```python +import sys +from sbi.utils import user_input_checks_utils + +sys.modules["sbi.user_input.user_input_checks_utils"] = user_input_checks_utils +``` + +to your script before loading the posterior. + +As of `sbi v0.18.0`, `NeuralInference` objects are also picklable. + +```python +import pickle + +# ... run inference +posterior = inference.build_posterior() + +with open("/path/to/my_inference.pkl", "wb") as handle: + pickle.dump(inference, handle) +``` + +However, saving and loading the `inference` object will slightly modify the +object (in order to make it serializable). These modifications lead to the +following two changes in behavior: + +1) Retraining from scratch is not supported, i.e. `.train(..., + retrain_from_scratch=True)` does not work. +2) When the loaded object calls the `.train()` method, it generates a new + tensorboard summary writer (instead of appending to the current one). + +## I trained a model on a GPU. Can I load it on a CPU? + +The code snippet below allows to load inference objects on a CPU if they were +saved on a GPU. Note that the neural net also needs to be moved to CPU. + +```python +import io +import pickle + +#https://stackoverflow.com/questions/57081727/load-pickle-file-obtained-from-gpu-to-cpu +class CPU_Unpickler(pickle.Unpickler): + def find_class(self, module, name): + if module == 'torch.storage' and name == '_load_from_bytes': + return lambda b: torch.load(io.BytesIO(b), map_location='cpu') + else: + return super().find_class(module, name) + +with open("/path/to/my_inference.pkl", "rb") as f: + inference = CPU_Unpickler(f).load() + +posterior = inference.build_posterior(inference._neural_net.to("cpu")) +``` + +Loading inference objects on CPU can be useful for inspection. However, resuming +training on CPU for an inference object trained on a GPU is currently not +supported. If this is strictly required by your workflow, consider setting +`inference._device = "cpu"` before calling `inference.train()`. diff --git a/mkdocs/docs/faq/question_06_resume_training.md b/mkdocs/docs/faq/question_06_resume_training.md new file mode 100644 index 000000000..c44bc0882 --- /dev/null +++ b/mkdocs/docs/faq/question_06_resume_training.md @@ -0,0 +1,20 @@ + +# Can I stop neural network training and resume it later? + +Many clusters have a time limit, and `sbi` might exceed this limit. You can +circumvent this problem by stopping and resuming training: + +```python +inference = NPE(prior=prior) +inference = inference.append_simulations(theta, x) +inference.train(max_num_epochs=300) # Pick `max_num_epochs` such that it does not exceed the runtime. + +with open("path/to/my/inference.pkl", "wb") as handle: + pickle.dump(inference, handle) + +# To resume training: +with open("path/to/my/inference.pkl", "rb") as handle: + inference_from_disk = pickle.load(handle) +inference_from_disk.train(resume_training=True, max_num_epochs=600) # Run epochs 301 until 600 (or stop early). +posterior = inference_from_disk.build_posterior() +``` diff --git a/mkdocs/docs/faq/question_07_custom_prior.md b/mkdocs/docs/faq/question_07_custom_prior.md new file mode 100644 index 000000000..169ece95a --- /dev/null +++ b/mkdocs/docs/faq/question_07_custom_prior.md @@ -0,0 +1,87 @@ + +# Can I use a custom prior with sbi? + +As `sbi` works with torch distributions only, we recommend using those whenever +possible. For example, when you are used to using `scipy.stats` distributions as +priors, then we recommend using the corresponding `torch.distributions` instead. +Most `scipy` distributions are implemented in `PyTorch` as well. + +In case you want to use a custom prior that is not in the set of common +distributions that's possible as well: You need to write a prior class that +mimicks the behaviour of a +[`torch.distributions.Distribution`](https://pytorch.org/docs/stable/_modules/torch/distributions/distribution.html#Distribution) +class. `sbi` will wrap this class to make it a fully functional torch +`Distribution`. + +Essentially, the class needs two methods: + +- `.sample(sample_shape)`, where sample_shape is a shape tuple, e.g., `(n,)`, + and returns a batch of n samples, e.g., of shape (n, 2)` for a two dimenional + prior. +- `.log_prob(value)` method that returns the "log probs" of parameters under the + prior, e.g., for a batches of n parameters with shape `(n, ndims)` it should + return a log probs array of shape `(n,)`. + +For `sbi` > 0.17.2 this could look like the following: + +```python +class CustomUniformPrior: + """User defined numpy uniform prior. + + Custom prior with user-defined valid .sample and .log_prob methods. + """ + + def __init__(self, lower: Tensor, upper: Tensor, return_numpy: bool = False): + self.lower = lower + self.upper = upper + self.dist = BoxUniform(lower, upper) + self.return_numpy = return_numpy + + def sample(self, sample_shape=torch.Size([])): + samples = self.dist.sample(sample_shape) + return samples.numpy() if self.return_numpy else samples + + def log_prob(self, values): + if self.return_numpy: + values = torch.as_tensor(values) + log_probs = self.dist.log_prob(values) + return log_probs.numpy() if self.return_numpy else log_probs +``` + +Once you have such a class, you can wrap it into a `Distribution` using the +`process_prior` function `sbi` provides: + +```python +from sbi.utils import process_prior + +custom_prior = CustomUniformPrior(torch.zeros(2), torch.ones(2)) +prior, *_ = process_prior(custom_prior) # Keeping only the first return. +# use this wrapped prior in sbi... +``` + +In `sbi` it is sometimes required to check the support of the prior, e.g., when +the prior support is bounded and one wants to reject samples from the posterior +density estimator that lie outside the prior support. In torch `Distributions` +this is handled automatically. However, when using a custom prior, it is not. +Thus, if your prior has bounded support (like the one above), it makes sense to +pass the bounds to the wrapper function such that `sbi` can pass them to torch +`Distributions`: + +```python +from sbi.utils import process_prior + +custom_prior = CustomUniformPrior(torch.zeros(2), torch.ones(2)) +prior = process_prior(custom_prior, + custom_prior_wrapper_kwargs=dict(lower_bound=torch.zeros(2), + upper_bound=torch.ones(2))) +# use this wrapped prior in sbi... +``` + +Note that in `custom_prior_wrapper_kwargs` you can pass additinal arguments for +the wrapper, e.g., `validate_args` or `arg_constraints` see the `Distribution` +documentation for more details. + +If you are using `sbi` < 0.17.2 and use `NLE` the code above will produce a +`NotImplementedError` (see [#581](https://github.com/mackelab/sbi/issues/581)). +In this case, you need to update to a newer version of `sbi` or use `NPE` +instead. diff --git a/docs/docs/index.md b/mkdocs/docs/index.md similarity index 100% rename from docs/docs/index.md rename to mkdocs/docs/index.md diff --git a/docs/docs/install.md b/mkdocs/docs/install.md similarity index 100% rename from docs/docs/install.md rename to mkdocs/docs/install.md diff --git a/docs/docs/reference/analysis.md b/mkdocs/docs/reference/analysis.md similarity index 100% rename from docs/docs/reference/analysis.md rename to mkdocs/docs/reference/analysis.md diff --git a/docs/docs/reference/index.md b/mkdocs/docs/reference/index.md similarity index 100% rename from docs/docs/reference/index.md rename to mkdocs/docs/reference/index.md diff --git a/docs/docs/reference/inference.md b/mkdocs/docs/reference/inference.md similarity index 100% rename from docs/docs/reference/inference.md rename to mkdocs/docs/reference/inference.md diff --git a/docs/docs/reference/models.md b/mkdocs/docs/reference/models.md similarity index 100% rename from docs/docs/reference/models.md rename to mkdocs/docs/reference/models.md diff --git a/docs/docs/reference/posteriors.md b/mkdocs/docs/reference/posteriors.md similarity index 100% rename from docs/docs/reference/posteriors.md rename to mkdocs/docs/reference/posteriors.md diff --git a/docs/docs/reference/potentials.md b/mkdocs/docs/reference/potentials.md similarity index 100% rename from docs/docs/reference/potentials.md rename to mkdocs/docs/reference/potentials.md diff --git a/docs/docs/static/global.css b/mkdocs/docs/static/global.css similarity index 100% rename from docs/docs/static/global.css rename to mkdocs/docs/static/global.css diff --git a/mkdocs/docs/static/goal.png b/mkdocs/docs/static/goal.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9850fe1c1cbb541212dcf0d64016e7fb47db79 GIT binary patch literal 127228 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%0A|G@o0 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 Date: Tue, 18 Mar 2025 12:25:06 +0100 Subject: [PATCH 07/36] Fix tests for new docs --- tests/tutorials_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tutorials_test.py b/tests/tutorials_test.py index bc4103994..a4ba734ff 100644 --- a/tests/tutorials_test.py +++ b/tests/tutorials_test.py @@ -17,7 +17,7 @@ def list_notebooks(directory: str) -> list: @pytest.mark.slow -@pytest.mark.parametrize("notebook_path", list_notebooks("tutorials/")) +@pytest.mark.parametrize("notebook_path", list_notebooks("docs/tutorials/")) def test_tutorials(notebook_path): """Test that all notebooks in the tutorials directory can be executed.""" with open(notebook_path) as f: From 45d9ca6812b2bb2fcbe93e4f1cccc5bcb982755e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristof=20Schr=C3=B6der?= <38397037+schroedk@users.noreply.github.com> Date: Tue, 18 Mar 2025 14:14:48 +0100 Subject: [PATCH 08/36] chore: pytest split for ci workflow (#1465) - add pytest-split plugin to dev dependencies - use split in ci workflow based on test durations in .test_durations --- .github/workflows/ci.yml | 4 +- .test_durations | 3099 ++++++++++++++++++++++++++++++++++++++ pyproject.toml | 1 + 3 files changed, 3103 insertions(+), 1 deletion(-) create mode 100644 .test_durations diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2bfe1ef2f..aa0e5892e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,8 @@ jobs: fail-fast: false matrix: python-version: ['3.10'] + split_size: [4] + group_number: [1, 2, 3, 4] steps: - name: Checkout @@ -62,7 +64,7 @@ jobs: # [ -f .testmondata ] && chmod u+w .testmondata || true - name: Run fast CPU tests with coverage - run: uv run pytest -v -n auto -m "not slow and not gpu" --cov=sbi --cov-report=xml tests/ #--testmon-forceselect + run: uv run pytest -v -n auto -m "not slow and not gpu" --cov=sbi --cov-report=xml --splitting-algorithm least_duration --splits ${{ matrix.split_size }} --group ${{ matrix.group_number }} tests/ #--testmon-forceselect - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 diff --git a/.test_durations b/.test_durations new file mode 100644 index 000000000..7f6da1648 --- /dev/null +++ b/.test_durations @@ -0,0 +1,3099 @@ +{ + "tests/abc_test.py::test_mc_abc_iid_inference[l2-1-None]": 0.920082332988386, + "tests/abc_test.py::test_mc_abc_iid_inference[mmd-10-distance_kwargs1]": 1.407255833997624, + "tests/abc_test.py::test_mcabc_inference_on_linear_gaussian[-1]": 0.9859038340218831, + "tests/abc_test.py::test_mcabc_inference_on_linear_gaussian[-2]": 0.9306440830259817, + "tests/abc_test.py::test_mcabc_inference_on_linear_gaussian[l2-1]": 1.0023788340040483, + "tests/abc_test.py::test_mcabc_inference_on_linear_gaussian[l2-2]": 0.9282185830088565, + "tests/abc_test.py::test_mcabc_kde[0.1]": 0.8110790840000845, + "tests/abc_test.py::test_mcabc_kde[cv]": 2.4692787090025377, + "tests/abc_test.py::test_mcabc_kde[scott]": 0.8563597500033211, + "tests/abc_test.py::test_mcabc_kde[silvermann]": 0.8589212090009823, + "tests/abc_test.py::test_mcabc_sass_lra[1-False]": 0.7498365009960253, + "tests/abc_test.py::test_mcabc_sass_lra[1-True]": 0.8759968749945983, + "tests/abc_test.py::test_mcabc_sass_lra[2-False]": 0.7536785410047742, + "tests/abc_test.py::test_mcabc_sass_lra[2-True]": 0.7929662509850459, + "tests/abc_test.py::test_smcabc_iid_inference[l2-1-None--1]": 1.1737546669901349, + "tests/abc_test.py::test_smcabc_iid_inference[mmd-20-distance_kwargs1--1]": 1.4792186659906292, + "tests/abc_test.py::test_smcabc_iid_inference[wasserstein-10-distance_kwargs2-1000]": 1.449296499005868, + "tests/abc_test.py::test_smcabc_inference_on_linear_gaussian[gaussian-1]": 1.184943875996396, + "tests/abc_test.py::test_smcabc_inference_on_linear_gaussian[gaussian-2]": 1.1494234169949777, + "tests/abc_test.py::test_smcabc_inference_on_linear_gaussian[uniform-1]": 1.1979685409896774, + "tests/abc_test.py::test_smcabc_inference_on_linear_gaussian[uniform-2]": 1.248123208002653, + "tests/abc_test.py::test_smcabc_kde[cv]": 2.493088791015907, + "tests/abc_test.py::test_smcabc_sass_lra[1-False]": 1.0191839159961091, + "tests/abc_test.py::test_smcabc_sass_lra[1-True]": 1.0735964990162756, + "tests/abc_test.py::test_smcabc_sass_lra[2-False]": 0.9674955410155235, + "tests/abc_test.py::test_smcabc_sass_lra[2-True]": 1.1639057909924304, + "tests/analysis_test.py::test_1d_marginals_peaks_from_kde[1000]": 0.21343937501660548, + "tests/base_test.py::test_get_dataloaders[100]": 0.002431291009997949, + "tests/base_test.py::test_get_dataloaders[10]": 0.0026417500048410147, + "tests/base_test.py::test_get_dataloaders[1]": 0.002973791997646913, + "tests/base_test.py::test_infer": 0.84150458300428, + "tests/bm_test.py::test_run_benchmark[FMPE-extra_kwargs0-gaussian_linear]": 0.00017849997675511986, + "tests/bm_test.py::test_run_benchmark[FMPE-extra_kwargs0-linear_mvg_2d]": 0.0001077920023817569, + "tests/bm_test.py::test_run_benchmark[FMPE-extra_kwargs0-slcp]": 9.708399011287838e-05, + "tests/bm_test.py::test_run_benchmark[FMPE-extra_kwargs0-two_moons]": 0.00010145900887437165, + "tests/bm_test.py::test_run_benchmark[NLE_A-extra_kwargs0-gaussian_linear]": 9.92920104181394e-05, + "tests/bm_test.py::test_run_benchmark[NLE_A-extra_kwargs0-linear_mvg_2d]": 0.0001033750013448298, + "tests/bm_test.py::test_run_benchmark[NLE_A-extra_kwargs0-slcp]": 0.00010174998897127807, + "tests/bm_test.py::test_run_benchmark[NLE_A-extra_kwargs0-two_moons]": 9.695799963083118e-05, + "tests/bm_test.py::test_run_benchmark[NPE_C-extra_kwargs0-gaussian_linear]": 0.00010583398398011923, + "tests/bm_test.py::test_run_benchmark[NPE_C-extra_kwargs0-linear_mvg_2d]": 0.0001092910097213462, + "tests/bm_test.py::test_run_benchmark[NPE_C-extra_kwargs0-slcp]": 0.00010420900071039796, + "tests/bm_test.py::test_run_benchmark[NPE_C-extra_kwargs0-two_moons]": 0.00013237498933449388, + "tests/bm_test.py::test_run_benchmark[NPSE-extra_kwargs0-gaussian_linear]": 0.00010095899051520973, + "tests/bm_test.py::test_run_benchmark[NPSE-extra_kwargs0-linear_mvg_2d]": 9.841701830737293e-05, + "tests/bm_test.py::test_run_benchmark[NPSE-extra_kwargs0-slcp]": 9.966600919142365e-05, + "tests/bm_test.py::test_run_benchmark[NPSE-extra_kwargs0-two_moons]": 0.00010020799527410418, + "tests/bm_test.py::test_run_benchmark[NRE_B-extra_kwargs0-gaussian_linear]": 9.824999142438173e-05, + "tests/bm_test.py::test_run_benchmark[NRE_B-extra_kwargs0-linear_mvg_2d]": 0.00019237601372878999, + "tests/bm_test.py::test_run_benchmark[NRE_B-extra_kwargs0-slcp]": 0.00010391700197942555, + "tests/bm_test.py::test_run_benchmark[NRE_B-extra_kwargs0-two_moons]": 0.00010729099449235946, + "tests/circular_import_test.py::test_for_circular_imports": 0.3064827500056708, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_made]": 0.01588037500914652, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_maf]": 0.012087374983821064, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_maf_rqs]": 0.026299709003069438, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_mdn]": 0.0028982920048292726, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_mlp_flowmatcher]": 0.17351016600150615, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_nsf]": 0.02181566701619886, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_resnet_flowmatcher]": 0.6351329999888549, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_bpf]": 0.06318649998866022, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_gf]": 0.03416270800516941, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_maf]": 0.005749875010224059, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_naf]": 0.18673174998548348, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_ncsf]": 0.0125050829956308, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_nice]": 0.00545375001092907, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_nsf]": 0.011432334009441547, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_sospf]": 0.09625079200486653, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape0-build_zuko_unaf]": 1.5015684590034653, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_made]": 0.03950937399349641, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_maf]": 0.04085791601391975, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_maf_rqs]": 0.12482749999617226, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_mdn]": 0.00376512500224635, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_mlp_flowmatcher]": 0.18312162499933038, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_nsf]": 0.045533708995208144, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_resnet_flowmatcher]": 0.7297299170168117, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_bpf]": 0.40198179200524464, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_gf]": 0.06528641699696891, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_maf]": 0.0546904170041671, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_naf]": 1.6760687509959098, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_ncsf]": 0.10264745900349226, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_nice]": 0.017342000995995477, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_nsf]": 0.10225666698534042, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_sospf]": 0.7442986669775564, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape0-input_event_shape1-build_zuko_unaf]": 25.749485749998712, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_made]": 0.018428290990414098, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_maf]": 0.015714542008936405, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_maf_rqs]": 0.02870841699768789, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_mdn]": 0.0032055419869720936, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_mlp_flowmatcher]": 0.1568590839888202, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_nsf]": 0.02440329200180713, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_resnet_flowmatcher]": 0.6901137909881072, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_bpf]": 0.06798554200213403, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_gf]": 0.03645650000544265, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_maf]": 0.0060213329998077825, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_naf]": 0.23128400002315175, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_ncsf]": 0.012526334016001783, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_nice]": 0.005773666009190492, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_nsf]": 0.012617125001270324, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_sospf]": 0.12274345802143216, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape0-build_zuko_unaf]": 1.5284789179859217, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_made]": 0.04243133298587054, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_maf]": 0.0423758759861812, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_maf_rqs]": 0.12540179101051763, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_mdn]": 0.0039335829933406785, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_mlp_flowmatcher]": 0.16050874900247436, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_nsf]": 0.04522512402036227, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_resnet_flowmatcher]": 0.8103774990013335, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_bpf]": 0.4690854170039529, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_gf]": 0.06863445899216458, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_maf]": 0.051947790998383425, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_naf]": 1.7909212910017231, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_ncsf]": 0.10697433400491718, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_nice]": 0.016787708023912273, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_nsf]": 0.10201504100405145, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_sospf]": 0.7385911659948761, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape0-condition_event_shape1-input_event_shape1-build_zuko_unaf]": 25.66098291699018, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_made]": 0.020958540990250185, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_maf]": 0.016053664992796257, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_maf_rqs]": 0.029430708003928885, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_mdn]": 0.003369541998836212, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_mlp_flowmatcher]": 0.18174525100039318, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_nsf]": 0.023416624986566603, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_resnet_flowmatcher]": 0.6586726249952335, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_bpf]": 0.06855562499549706, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_gf]": 0.03286991601635236, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_maf]": 0.005547000022488646, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_naf]": 0.22374941599264275, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_ncsf]": 0.012471206980990246, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_nice]": 0.005452083016280085, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_nsf]": 0.011794584002927877, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_sospf]": 0.10062279098201543, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape0-build_zuko_unaf]": 1.5541722510242835, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_made]": 0.04624941700603813, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_maf]": 0.04345725000894163, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_maf_rqs]": 0.1281838339928072, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_mdn]": 0.003821833000984043, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_mlp_flowmatcher]": 0.19664987399301026, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_nsf]": 0.04503041699354071, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_resnet_flowmatcher]": 0.7474030409794068, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_bpf]": 0.4249699580250308, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_gf]": 0.06670995899185073, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_maf]": 0.053065792002598755, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_naf]": 1.7257498760009184, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_ncsf]": 0.10338433201832231, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_nice]": 0.01821854199806694, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_nsf]": 0.10024608300591353, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_sospf]": 0.7433782930165762, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape0-input_event_shape1-build_zuko_unaf]": 25.865869417990325, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_made]": 0.02136066601087805, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_maf]": 0.013505668001016602, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_maf_rqs]": 0.03446487500332296, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_mdn]": 0.003180750019964762, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_mlp_flowmatcher]": 0.16268525100895204, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_nsf]": 0.02493437698285561, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_resnet_flowmatcher]": 0.6947858329949668, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_bpf]": 0.07056241699319798, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_gf]": 0.035868292005034164, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_maf]": 0.00570570798299741, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_naf]": 0.2413992500078166, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_ncsf]": 0.012812333981855772, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_nice]": 0.005657208996126428, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_nsf]": 0.01167337600782048, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_sospf]": 0.10639862401876599, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape0-build_zuko_unaf]": 1.5484560419863556, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_made]": 0.03812258300604299, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_maf]": 0.04146254099032376, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_maf_rqs]": 0.12437358200259041, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_mdn]": 0.003609959007008001, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_mlp_flowmatcher]": 0.16747183300321922, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_nsf]": 0.04683916599606164, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_resnet_flowmatcher]": 0.7874391239893157, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_bpf]": 0.4167239589878591, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_gf]": 0.06208662400604226, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_maf]": 0.053284292996977456, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_naf]": 1.7885180840094108, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_ncsf]": 0.09588820800126996, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_nice]": 0.01899124900228344, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_nsf]": 0.10479933299939148, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_sospf]": 0.757557209013612, + "tests/density_estimator_test.py::test_correctness_of_batched_vs_seperate_sample_and_log_prob[sample_shape1-condition_event_shape1-input_event_shape1-build_zuko_unaf]": 25.746463917006622, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_made]": 0.002979166980367154, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_maf]": 0.0033664169895928353, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_maf_rqs]": 0.004620332998456433, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_mdn]": 0.0016479159967275336, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_nsf]": 0.00389370798075106, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_bpf]": 0.0027013329818146303, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_gf]": 0.0023550840123789385, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_maf]": 0.003061166004044935, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_naf]": 0.00776574898918625, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_ncsf]": 0.004056000005220994, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_nice]": 0.002943583982414566, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_nsf]": 0.004092000002856366, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_sospf]": 0.003508915993734263, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape0-build_zuko_unaf]": 0.005051208994700573, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_made]": 0.0027414160140324384, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_maf]": 0.003240082980482839, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_maf_rqs]": 0.0046227509883465245, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_mdn]": 0.0018242089863633737, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_nsf]": 0.0054981239954940975, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_bpf]": 0.003796250995947048, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_gf]": 0.00272620799660217, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_maf]": 0.0042771250155055895, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_naf]": 0.0077585430117323995, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_ncsf]": 0.006337250000797212, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_nice]": 0.0032948740117717534, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_nsf]": 0.0059849569806829095, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_sospf]": 0.00534441698982846, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape0-input_event_shape1-build_zuko_unaf]": 0.0073827080050250515, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_made]": 0.0028080420015612617, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_maf]": 0.003344666984048672, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_maf_rqs]": 0.004775041990797035, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_mdn]": 0.0018545420025475323, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_nsf]": 0.003855457980534993, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_bpf]": 0.0027822919946629554, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_gf]": 0.002538708984502591, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_maf]": 0.0029722089966526255, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_naf]": 0.005412666985648684, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_ncsf]": 0.00434366799890995, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_nice]": 0.0030924580059945583, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_nsf]": 0.004201249990728684, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_sospf]": 0.0036496249958872795, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape0-build_zuko_unaf]": 0.005231333008850925, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_made]": 0.0028826670022681355, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_maf]": 0.0034207919816253707, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_maf_rqs]": 0.004807126009836793, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_mdn]": 0.0020274999842513353, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_nsf]": 0.0056619160022819415, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_bpf]": 0.0038305829948512837, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_gf]": 0.0028840000013587996, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_maf]": 0.004455749993212521, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_naf]": 0.007854374023736455, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_ncsf]": 0.006372999006998725, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_nice]": 0.003978999986429699, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_nsf]": 0.006566208990989253, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_sospf]": 0.005497625010320917, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[1-condition_event_shape1-input_event_shape1-build_zuko_unaf]": 0.007980417009093799, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_made]": 0.0028284990112297237, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_maf]": 0.0032262919994536787, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_maf_rqs]": 0.004913583004963584, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_mdn]": 0.001651040991418995, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_nsf]": 0.0038230829959502444, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_bpf]": 0.0026766249939100817, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_gf]": 0.0023269169905688614, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_maf]": 0.0029031239973846823, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_naf]": 0.00530033401446417, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_ncsf]": 0.004261333015165292, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_nice]": 0.0029988339956616983, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_nsf]": 0.003977291999035515, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_sospf]": 0.0036285830137785524, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape0-build_zuko_unaf]": 0.0055370839982060716, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_made]": 0.0028082509816158563, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_maf]": 0.003424999988055788, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_maf_rqs]": 0.004937751000397839, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_mdn]": 0.001851207998697646, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_nsf]": 0.006266416981816292, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_bpf]": 0.0038699569849995896, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_gf]": 0.0027202929923078045, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_maf]": 0.004491041996516287, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_naf]": 0.00795979100803379, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_ncsf]": 0.006603333007660694, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_nice]": 0.003435832986724563, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_nsf]": 0.006183126010000706, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_sospf]": 0.005507542009581812, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape0-input_event_shape1-build_zuko_unaf]": 0.009274625001125969, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_made]": 0.002948792011011392, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_maf]": 0.0035247909981990233, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_maf_rqs]": 0.004824584015295841, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_mdn]": 0.001915041997563094, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_nsf]": 0.00391445800778456, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_bpf]": 0.002929418013081886, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_gf]": 0.002544415998272598, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_maf]": 0.003279208001913503, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_naf]": 0.005673459003446624, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_ncsf]": 0.004667166998842731, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_nice]": 0.0032344579813070595, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_nsf]": 0.004279332992155105, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_sospf]": 0.003673665996757336, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape0-build_zuko_unaf]": 0.005632208994938992, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_made]": 0.0029812500142725185, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_maf]": 0.003585498998290859, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_maf_rqs]": 0.005026957995141856, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_mdn]": 0.0020433340105228126, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_nsf]": 0.006740083990735002, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_bpf]": 0.004159916017670184, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_gf]": 0.003024457997526042, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_maf]": 0.004681209989939816, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_naf]": 0.008221124007832259, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_ncsf]": 0.0066694590204861015, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_nice]": 0.0037324169970816, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_nsf]": 0.006642207998083904, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_sospf]": 0.005718749001971446, + "tests/density_estimator_test.py::test_correctness_of_density_estimator_log_prob[10-condition_event_shape1-input_event_shape1-build_zuko_unaf]": 0.008923291985411197, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_made]": 0.003558250013156794, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_maf]": 0.003612165994127281, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_maf_rqs]": 0.004894375000731088, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_mdn]": 0.002185417994041927, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_nsf]": 0.004112291993806139, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_bpf]": 0.003136291023110971, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_gf]": 0.0027746659907279536, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_maf]": 0.003302625991636887, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_naf]": 0.005388874997152016, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_ncsf]": 0.004643290987587534, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_nice]": 0.0034724580036709085, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_nsf]": 0.004444918013177812, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_sospf]": 0.0039587090141139925, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-1-build_zuko_unaf]": 0.005774749995907769, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_made]": 0.0031202489917632192, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_maf]": 0.003647165998700075, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_maf_rqs]": 0.005357958012609743, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_mdn]": 0.0021842499845661223, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_nsf]": 0.004547332995571196, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_bpf]": 0.0031736680102767423, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_gf]": 0.002815707994159311, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_maf]": 0.003311374006443657, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_naf]": 0.005526167020434514, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_ncsf]": 0.004548459008219652, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_nice]": 0.0033617500157561153, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_nsf]": 0.0046075830032350495, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_sospf]": 0.003945457996451296, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape0-2-build_zuko_unaf]": 0.005637292008032091, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_made]": 0.0033212080161320046, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_maf]": 0.0038042920059524477, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_maf_rqs]": 0.0055684160033706576, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_mdn]": 0.0026059160009026527, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_nsf]": 0.006291416997555643, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_bpf]": 0.004459207993932068, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_gf]": 0.0032562909909756854, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_maf]": 0.00480779200734105, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_naf]": 0.008001957015949301, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_ncsf]": 0.006657582998741418, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_nice]": 0.0037212499883025885, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_nsf]": 0.006546207994688302, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_sospf]": 0.0059116659831488505, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-1-build_zuko_unaf]": 0.007891959976404905, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_made]": 0.003307166014565155, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_maf]": 0.003732125012902543, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_maf_rqs]": 0.005270623994874768, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_mdn]": 0.0023749169922666624, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_nsf]": 0.006781374991987832, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_bpf]": 0.004150708002271131, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_gf]": 0.0031312909995904192, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_maf]": 0.004751833985210396, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_naf]": 0.007997084001544863, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_ncsf]": 0.007589125001686625, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_nice]": 0.0037955410225549713, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_nsf]": 0.006496581991086714, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_sospf]": 0.005950999999186024, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape0-input_event_shape1-2-build_zuko_unaf]": 0.008082542000920512, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_made]": 0.003828500004601665, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_maf]": 0.004360291000921279, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_maf_rqs]": 0.00565804100187961, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_mdn]": 0.0029333329875953496, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_nsf]": 0.004966292006429285, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_bpf]": 0.0038796660082880408, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_gf]": 0.003894042019965127, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_maf]": 0.004280208988348022, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_naf]": 0.007189875017502345, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_ncsf]": 0.005655540997395292, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_nice]": 0.005740541979321279, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_nsf]": 0.005264250983600505, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_sospf]": 0.0048421259998576716, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-1-build_zuko_unaf]": 0.006105624997871928, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_made]": 0.0038513329927809536, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_maf]": 0.004702249978436157, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_maf_rqs]": 0.006097876001149416, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_mdn]": 0.0031123329972615466, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_nsf]": 0.005036333008320071, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_bpf]": 0.003981582980486564, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_gf]": 0.003646626020781696, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_maf]": 0.004200042996671982, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_naf]": 0.006592584002646618, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_ncsf]": 0.005550415982725099, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_nice]": 0.004134874994633719, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_nsf]": 0.00533245800761506, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_sospf]": 0.004688541986979544, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape0-2-build_zuko_unaf]": 0.0062534150056308135, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_made]": 0.004121332996874116, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_maf]": 0.004657000987208448, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_maf_rqs]": 0.005955708998953924, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_mdn]": 0.003139332009595819, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_nsf]": 0.006898207982885651, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_bpf]": 0.005330207000952214, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_gf]": 0.004053040989674628, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_maf]": 0.00563633200363256, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_naf]": 0.008595916006015614, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_ncsf]": 0.007504541994421743, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_nice]": 0.004632874988601543, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_nsf]": 0.007611458990140818, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_sospf]": 0.006641750020207837, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-1-build_zuko_unaf]": 0.008626042021205649, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_made]": 0.00400304097274784, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_maf]": 0.004744667006889358, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_maf_rqs]": 0.006069957991712727, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_mdn]": 0.0033264579833485186, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_nsf]": 0.0067588340025395155, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_bpf]": 0.00506158301141113, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_gf]": 0.003972124992287718, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_maf]": 0.005600750999292359, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_naf]": 0.00902679299178999, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_ncsf]": 0.007529082999099046, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_nice]": 0.00454362497839611, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_nsf]": 0.007422999988193624, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_sospf]": 0.006743916004779749, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape1-input_event_shape1-2-build_zuko_unaf]": 0.008987748995423317, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_made]": 0.0035992920165881515, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_maf]": 0.004190292005660012, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_maf_rqs]": 0.005401041024015285, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_mdn]": 0.0027300830115564167, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_nsf]": 0.004602166009135544, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_bpf]": 0.003599375006160699, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_gf]": 0.0032757500011939555, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_maf]": 0.004047124995850027, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_naf]": 0.006160042001283728, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_ncsf]": 0.0052204999956302345, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_nice]": 0.003917167996405624, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_nsf]": 0.005267832006211393, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_sospf]": 0.0067602909984998405, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-1-build_zuko_unaf]": 0.006128834007540718, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_made]": 0.003926333010895178, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_maf]": 0.004214999993564561, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_maf_rqs]": 0.005795710007078014, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_mdn]": 0.002884542991523631, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_nsf]": 0.004947624009218998, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_bpf]": 0.0037056669971207157, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_gf]": 0.0033475839882157743, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_maf]": 0.0039912919892231, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_naf]": 0.006109376001404598, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_ncsf]": 0.005319125019013882, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_nice]": 0.004033082994283177, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_nsf]": 0.005365334000089206, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_sospf]": 0.004499167000176385, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape0-2-build_zuko_unaf]": 0.0060206260095583275, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_made]": 0.0036392490001162514, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_maf]": 0.004188498001894914, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_maf_rqs]": 0.005670167010976002, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_mdn]": 0.002835916995536536, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_nsf]": 0.0066005000117002055, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_bpf]": 0.004657459008740261, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_gf]": 0.00359670800389722, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_maf]": 0.005608083985862322, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_naf]": 0.00833716600027401, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_ncsf]": 0.007477958017261699, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_nice]": 0.004281665998860262, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_nsf]": 0.006992124006501399, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_sospf]": 0.006188083018059842, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-1-build_zuko_unaf]": 0.008198832991183735, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_made]": 0.003664585019578226, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_maf]": 0.004154041002038866, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_maf_rqs]": 0.005621208998491056, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_mdn]": 0.0028115830064052716, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_nsf]": 0.006539125010021962, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_bpf]": 0.004791500003193505, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_gf]": 0.003643000003648922, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_maf]": 0.005274291994282976, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_naf]": 0.008437876007519662, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_ncsf]": 0.007153707992983982, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_nice]": 0.004359124999609776, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_nsf]": 0.006991416012169793, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_sospf]": 0.006196250018547289, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape2-input_event_shape1-2-build_zuko_unaf]": 0.008310376011650078, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_made]": 0.004846125011681579, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_maf]": 0.005645958997774869, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_maf_rqs]": 0.0069044999981997535, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_mdn]": 0.004258498986018822, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_nsf]": 0.006163709025713615, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_bpf]": 0.005003749989555217, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_gf]": 0.004617915998096578, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_maf]": 0.005342083022696897, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_naf]": 0.007782584012602456, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_ncsf]": 0.006408458008081652, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_nice]": 0.005147666990524158, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_nsf]": 0.0061597909952979535, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_sospf]": 0.006568416021764278, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-1-build_zuko_unaf]": 0.007398834000923671, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_made]": 0.004921250001643784, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_maf]": 0.005477167011122219, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_maf_rqs]": 0.0068330829963088036, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_mdn]": 0.00408416599384509, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_nsf]": 0.006004040988045745, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_bpf]": 0.004954624018864706, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_gf]": 0.0045851250033592805, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_maf]": 0.005126250005559996, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_naf]": 0.0073318750073667616, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_ncsf]": 0.006573250007932074, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_nice]": 0.005250124988378957, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_nsf]": 0.006296332998317666, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_sospf]": 0.005713874998036772, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape0-2-build_zuko_unaf]": 0.0072162080177804455, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_made]": 0.005005957995308563, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_maf]": 0.005749249990913086, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_maf_rqs]": 0.0069658760039601475, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_mdn]": 0.004157041999860667, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_nsf]": 0.007719333021668717, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_bpf]": 0.006372415999067016, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_gf]": 0.004991041016182862, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_maf]": 0.006628249975619838, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_naf]": 0.00945420900825411, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_ncsf]": 0.008499208997818641, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_nice]": 0.005517333003808744, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_nsf]": 0.00824370898772031, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_sospf]": 0.007815875011147, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-1-build_zuko_unaf]": 0.009576165015459992, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_made]": 0.005439583997940645, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_maf]": 0.0057172910164808854, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_maf_rqs]": 0.007095665991073474, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_mdn]": 0.00442153999756556, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_nsf]": 0.007845665997592732, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_bpf]": 0.005990959005430341, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_gf]": 0.004996750998543575, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_maf]": 0.006744124984834343, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_naf]": 0.01005145900126081, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_ncsf]": 0.008895623992430046, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_nice]": 0.005754750978667289, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_nsf]": 0.008422958009759896, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_sospf]": 0.007678250010940246, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[1-condition_event_shape3-input_event_shape1-2-build_zuko_unaf]": 0.009808375005377457, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_made]": 0.0031219169904943556, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_maf]": 0.0036979160067858174, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_maf_rqs]": 0.005124623989104293, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_mdn]": 0.0022340410068864003, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_nsf]": 0.004241375005221926, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_bpf]": 0.0032277500140480697, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_gf]": 0.002826708005159162, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_maf]": 0.0034244160051457584, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_naf]": 0.005742084002122283, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_ncsf]": 0.004749166997498833, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_nice]": 0.0035131669865222648, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_nsf]": 0.004612082979292609, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_sospf]": 0.004064332984853536, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-1-build_zuko_unaf]": 0.005836708005517721, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_made]": 0.003179916995577514, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_maf]": 0.003922874995623715, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_maf_rqs]": 0.005247708992101252, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_mdn]": 0.002251625992357731, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_nsf]": 0.004323125016526319, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_bpf]": 0.003311041000415571, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_gf]": 0.002963292005006224, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_maf]": 0.0034465419739717618, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_naf]": 0.005999333006911911, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_ncsf]": 0.004929123999318108, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_nice]": 0.00346062499738764, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_nsf]": 0.0046200430078897625, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_sospf]": 0.004015583006548695, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape0-2-build_zuko_unaf]": 0.005952166000497527, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_made]": 0.0032666670012986287, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_maf]": 0.0038220830028876662, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_maf_rqs]": 0.005401667003752664, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_mdn]": 0.002413249996607192, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_nsf]": 0.006763708996004425, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_bpf]": 0.004310708012781106, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_gf]": 0.003227374007110484, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_maf]": 0.00502645799133461, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_naf]": 0.008473124995362014, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_ncsf]": 0.00679958300315775, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_nice]": 0.003876208982546814, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_nsf]": 0.007089916995028034, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_sospf]": 0.006007333999150433, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-1-build_zuko_unaf]": 0.008570374993723817, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_made]": 0.0033613750129006803, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_maf]": 0.003937290995963849, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_maf_rqs]": 0.00533133301360067, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_mdn]": 0.002499083013390191, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_nsf]": 0.0070180829934543, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_bpf]": 0.004557832988211885, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_gf]": 0.0033582090109121054, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_maf]": 0.005031249995226972, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_naf]": 0.008669332979479805, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_ncsf]": 0.006876209023175761, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_nice]": 0.004000999993877485, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_nsf]": 0.006829999998444691, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_sospf]": 0.006030541000654921, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape0-input_event_shape1-2-build_zuko_unaf]": 0.009732626014738344, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_made]": 0.003911332998541184, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_maf]": 0.004596624989062548, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_maf_rqs]": 0.0060023329860996455, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_mdn]": 0.003217584002413787, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_nsf]": 0.0051672910049092025, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_bpf]": 0.004025792004540563, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_gf]": 0.00360775098670274, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_maf]": 0.004176540998741984, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_naf]": 0.006468291991041042, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_ncsf]": 0.005537665987503715, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_nice]": 0.00425783300306648, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_nsf]": 0.005360416995245032, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_sospf]": 0.004742082979646511, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-1-build_zuko_unaf]": 0.006559999004821293, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_made]": 0.003973915983806364, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_maf]": 0.004859709006268531, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_maf_rqs]": 0.006295834013144486, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_mdn]": 0.003429750999202952, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_nsf]": 0.0052872910018777475, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_bpf]": 0.005893291992833838, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_gf]": 0.003906459009158425, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_maf]": 0.004221666997182183, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_naf]": 0.007058082992443815, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_ncsf]": 0.005682124989107251, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_nice]": 0.004225541997584514, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_nsf]": 0.005336583984899335, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_sospf]": 0.005502667001564987, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape0-2-build_zuko_unaf]": 0.0070864570006961, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_made]": 0.0043917909933952615, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_maf]": 0.004584624010021798, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_maf_rqs]": 0.006122042002971284, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_mdn]": 0.0031922909984132275, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_nsf]": 0.007587373984279111, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_bpf]": 0.005103542003780603, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_gf]": 0.004000667002401315, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_maf]": 0.0056351249950239435, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_naf]": 0.009079374998691492, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_ncsf]": 0.008092207994195633, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_nice]": 0.004744208010379225, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_nsf]": 0.007669624988920987, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_sospf]": 0.006770375010091811, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-1-build_zuko_unaf]": 0.009630624001147225, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_made]": 0.004146790990489535, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_maf]": 0.004746001010062173, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_maf_rqs]": 0.006137041986221448, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_mdn]": 0.003219416001229547, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_nsf]": 0.007633250002982095, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_bpf]": 0.005253999013802968, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_gf]": 0.004249292003805749, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_maf]": 0.005987540993373841, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_naf]": 0.010073208002722822, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_ncsf]": 0.0077116669999668375, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_nice]": 0.004893458986771293, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_nsf]": 0.007566959000541829, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_sospf]": 0.007114665990229696, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape1-input_event_shape1-2-build_zuko_unaf]": 0.010570083002676256, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_made]": 0.0036737510090461, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_maf]": 0.004388749002828263, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_maf_rqs]": 0.0056633339991094545, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_mdn]": 0.0027037070103688166, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_nsf]": 0.004986500003724359, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_bpf]": 0.003709831988089718, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_gf]": 0.0035277080023661256, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_maf]": 0.003902625001501292, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_naf]": 0.006162623991258442, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_ncsf]": 0.005140625988133252, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_nice]": 0.003868376021273434, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_nsf]": 0.005005793005693704, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_sospf]": 0.004537834000075236, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-1-build_zuko_unaf]": 0.006451208973885514, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_made]": 0.00378249998902902, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_maf]": 0.0044133749906904995, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_maf_rqs]": 0.005750708995037712, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_mdn]": 0.0028642090037465096, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_nsf]": 0.004993001013644971, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_bpf]": 0.003747626004042104, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_gf]": 0.003307667007902637, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_maf]": 0.003918957998394035, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_naf]": 0.006452042012824677, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_ncsf]": 0.005216624995227903, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_nice]": 0.004023209010483697, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_nsf]": 0.005030000989791006, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_sospf]": 0.004472458982490934, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape0-2-build_zuko_unaf]": 0.00729212501028087, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_made]": 0.0038491670129587874, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_maf]": 0.0043646249832818285, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_maf_rqs]": 0.005885082980967127, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_mdn]": 0.002877791994251311, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_nsf]": 0.007327790997806005, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_bpf]": 0.00485208400641568, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_gf]": 0.003708332995302044, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_maf]": 0.00531375000718981, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_naf]": 0.008735334005905315, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_ncsf]": 0.0074963740044040605, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_nice]": 0.004300584987504408, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_nsf]": 0.007537331999628805, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_sospf]": 0.006676167991827242, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-1-build_zuko_unaf]": 0.00897062401054427, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_made]": 0.003873708992614411, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_maf]": 0.0046058739972068, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_maf_rqs]": 0.006051665986888111, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_mdn]": 0.0029341249901335686, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_nsf]": 0.007500833002268337, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_bpf]": 0.004982376005500555, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_gf]": 0.0037594589812215418, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_maf]": 0.00547054098569788, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_naf]": 0.009815458994125947, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_ncsf]": 0.007595542003400624, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_nice]": 0.004480500996578485, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_nsf]": 0.007481749998987652, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_sospf]": 0.006543791008880362, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape2-input_event_shape1-2-build_zuko_unaf]": 0.00972937498590909, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_made]": 0.004989375011064112, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_maf]": 0.0056679169938433915, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_maf_rqs]": 0.0077007920044707134, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_mdn]": 0.004057500002090819, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_nsf]": 0.006228790996829048, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_bpf]": 0.0052002920128870755, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_gf]": 0.004717208998044953, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_maf]": 0.005275374001939781, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_naf]": 0.007667250989470631, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_ncsf]": 0.006946207999135368, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_nice]": 0.005325874997652136, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_nsf]": 0.006398918005288579, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_sospf]": 0.005907375976676121, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-1-build_zuko_unaf]": 0.008545500008040108, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_made]": 0.005236624987446703, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_maf]": 0.005844667000928894, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_maf_rqs]": 0.007102623989339918, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_mdn]": 0.004295625010854565, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_nsf]": 0.006202791002579033, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_bpf]": 0.0051589579961728305, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_gf]": 0.004675208998378366, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_maf]": 0.006241666982532479, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_naf]": 0.0077287489984882995, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_ncsf]": 0.006696666998323053, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_nice]": 0.005582041994784959, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_nsf]": 0.006500415998743847, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_sospf]": 0.006455417998949997, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape0-2-build_zuko_unaf]": 0.008176499002729543, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_made]": 0.0054214170086197555, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_maf]": 0.005633416993077844, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_maf_rqs]": 0.007305917999474332, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_mdn]": 0.004285250004613772, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_nsf]": 0.00865308300126344, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_bpf]": 0.006548959005158395, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_gf]": 0.005672833998687565, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_maf]": 0.006846500022220425, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_naf]": 0.010539415990933776, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_ncsf]": 0.008701916987774894, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_nice]": 0.005658958005369641, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_nsf]": 0.008466375002171844, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_sospf]": 0.007966749995830469, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-1-build_zuko_unaf]": 0.011172167010954581, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_made]": 0.0053097909985808656, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_maf]": 0.005936916000791825, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_maf_rqs]": 0.00737749898689799, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_mdn]": 0.004307292998419143, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_nsf]": 0.008989499983727, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_bpf]": 0.0062576659838669, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_gf]": 0.005097958986880258, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_maf]": 0.006848083998193033, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_naf]": 0.010468209002283402, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_ncsf]": 0.00882387401361484, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_nice]": 0.005982250993838534, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_nsf]": 0.008809792998363264, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_sospf]": 0.008061917003942654, + "tests/density_estimator_test.py::test_density_estimator_log_prob_shapes_with_embedding[10-condition_event_shape3-input_event_shape1-2-build_zuko_unaf]": 0.011344416998326778, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_made]": 0.0033964989706873894, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_maf]": 0.003321083015180193, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_maf_rqs]": 0.0046427909983322024, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_mdn]": 0.0018555420101620257, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_mlp_flowmatcher]": 0.0014254589768825099, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_nsf]": 0.0036229580000508577, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_resnet_flowmatcher]": 0.0023987079912330955, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_bpf]": 0.002918334008427337, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_gf]": 0.0028957080066902563, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_maf]": 0.0028318760014371946, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_naf]": 0.0052040410082554445, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_ncsf]": 0.004326916008722037, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_nice]": 0.003019124997081235, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_nsf]": 0.0041636250098235905, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_sospf]": 0.003904540979419835, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-1-build_zuko_unaf]": 0.005567458982113749, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_made]": 0.0025818330032052472, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_maf]": 0.003149123993352987, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_maf_rqs]": 0.004444126010639593, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_mdn]": 0.0016360409936169162, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_mlp_flowmatcher]": 0.0013458749890560284, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_nsf]": 0.003660000002128072, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_resnet_flowmatcher]": 0.0022983329981798306, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_bpf]": 0.002648875000886619, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_gf]": 0.002189083010307513, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_maf]": 0.002686709980480373, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_naf]": 0.004715749993920326, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_ncsf]": 0.0038583749992540106, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_nice]": 0.0026857919874601066, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_nsf]": 0.003658581990748644, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_sospf]": 0.0032349160173907876, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape0-2-build_zuko_unaf]": 0.005083375013782643, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_made]": 0.0032073340116767213, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_maf]": 0.0033736670011421666, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_maf_rqs]": 0.004876207996858284, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_mdn]": 0.0019367089844308794, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_mlp_flowmatcher]": 0.0014709159877384081, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_nsf]": 0.005468999996082857, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_resnet_flowmatcher]": 0.002451749998726882, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_bpf]": 0.003720708002219908, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_gf]": 0.0026332490087952465, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_maf]": 0.004280790992197581, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_naf]": 0.007399250011076219, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_ncsf]": 0.006737624993547797, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_nice]": 0.0032231670047622174, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_nsf]": 0.006793833017582074, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_sospf]": 0.005464543006382883, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-1-build_zuko_unaf]": 0.007363042997894809, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_made]": 0.0026470839948160574, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_maf]": 0.0034625410044100136, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_maf_rqs]": 0.0051302079955348745, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_mdn]": 0.0021613330027321354, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_mlp_flowmatcher]": 0.0014424590044654906, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_nsf]": 0.0053741659939987585, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_resnet_flowmatcher]": 0.0024744160182308406, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_bpf]": 0.003752083983272314, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_gf]": 0.002629708018503152, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_maf]": 0.004351581985247321, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_naf]": 0.0073799169913399965, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_ncsf]": 0.006220081995707005, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_nice]": 0.003251292000641115, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_nsf]": 0.005979958979878575, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_sospf]": 0.005244458021479659, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape0-input_event_shape1-2-build_zuko_unaf]": 0.007261874998221174, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_made]": 0.0028320849814917892, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_maf]": 0.003355625012773089, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_maf_rqs]": 0.004604249988915399, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_mdn]": 0.0018246239924337715, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_mlp_flowmatcher]": 0.0015462919982383028, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_nsf]": 0.003942957002436742, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_resnet_flowmatcher]": 0.0026412090082885697, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_bpf]": 0.0028188750002300367, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_gf]": 0.0024854990042513236, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_maf]": 0.0030001659906702116, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_naf]": 0.005199623992666602, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_ncsf]": 0.00431037500675302, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_nice]": 0.00302845798432827, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_nsf]": 0.004191707994323224, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_sospf]": 0.0035515000054147094, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-1-build_zuko_unaf]": 0.004970832989783958, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_made]": 0.002832666999893263, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_maf]": 0.0033827919978648424, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_maf_rqs]": 0.004632875003153458, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_mdn]": 0.0018361249967711046, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_mlp_flowmatcher]": 0.0015471250080736354, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_nsf]": 0.0038347069930750877, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_resnet_flowmatcher]": 0.0026200419815722853, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_bpf]": 0.0027828329912154004, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_gf]": 0.0026289170054951683, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_maf]": 0.002990916997077875, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_naf]": 0.005064665980171412, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_ncsf]": 0.0042989169887732714, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_nice]": 0.003021666008862667, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_nsf]": 0.004160250988206826, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_sospf]": 0.003550041001290083, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape0-2-build_zuko_unaf]": 0.005208373986533843, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_made]": 0.0029277080029714853, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_maf]": 0.003424207985517569, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_maf_rqs]": 0.0050359159940853715, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_mdn]": 0.001984791990253143, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_mlp_flowmatcher]": 0.001657917004195042, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_nsf]": 0.005633916996885091, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_resnet_flowmatcher]": 0.0026757929881569, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_bpf]": 0.003841081997961737, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_gf]": 0.0028558350022649392, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_maf]": 0.004705750994617119, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_naf]": 0.007490207994123921, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_ncsf]": 0.00640704101533629, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_nice]": 0.0035589579929364845, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_nsf]": 0.006342166991089471, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_sospf]": 0.005564084014622495, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-1-build_zuko_unaf]": 0.00743454099574592, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_made]": 0.0029327919764909893, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_maf]": 0.0034559159830678254, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_maf_rqs]": 0.004818500005058013, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_mdn]": 0.0020231249945936725, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_mlp_flowmatcher]": 0.0016655839863233268, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_nsf]": 0.005484543013153598, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_resnet_flowmatcher]": 0.0027544989861780778, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_bpf]": 0.003824123996309936, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_gf]": 0.0028032910195179284, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_maf]": 0.004429834021721035, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_naf]": 0.007367958998656832, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_ncsf]": 0.007293542003026232, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_nice]": 0.0034262910048710182, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_nsf]": 0.006498291011666879, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_sospf]": 0.005551041991566308, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[1-condition_event_shape1-input_event_shape1-2-build_zuko_unaf]": 0.00746670899388846, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_made]": 0.0025724579754751176, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_maf]": 0.0031098750041564927, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_maf_rqs]": 0.00447020900901407, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_mdn]": 0.001614292006706819, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_mlp_flowmatcher]": 0.00135800099815242, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_nsf]": 0.003717292012879625, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_resnet_flowmatcher]": 0.0023998749966267496, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_bpf]": 0.0026147089956793934, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_gf]": 0.002262458991026506, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_maf]": 0.0028226659924257547, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_naf]": 0.005321959004504606, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_ncsf]": 0.004452457986189984, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_nice]": 0.0029087500006426126, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_nsf]": 0.004552999002044089, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_sospf]": 0.0035159590042894706, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-1-build_zuko_unaf]": 0.005276833995594643, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_made]": 0.002518207998946309, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_maf]": 0.003094166997470893, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_maf_rqs]": 0.0044440839847084135, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_mdn]": 0.0015805840084794909, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_mlp_flowmatcher]": 0.0013545820111176, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_nsf]": 0.003604083991376683, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_resnet_flowmatcher]": 0.002402999991318211, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_bpf]": 0.0025877920124912634, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_gf]": 0.00223779100633692, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_maf]": 0.002838083019014448, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_naf]": 0.005271290996461175, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_ncsf]": 0.004109875007998198, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_nice]": 0.0028527080139610916, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_nsf]": 0.004003542009741068, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_sospf]": 0.003479582999716513, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape0-2-build_zuko_unaf]": 0.005377416018745862, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_made]": 0.002659791018231772, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_maf]": 0.003220041995518841, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_maf_rqs]": 0.004724292011815123, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_mdn]": 0.001799417004804127, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_mlp_flowmatcher]": 0.0014604170137317851, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_nsf]": 0.00612108402128797, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_resnet_flowmatcher]": 0.0025023329799296334, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_bpf]": 0.0037293320056051016, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_gf]": 0.00265633400704246, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_maf]": 0.004286708004656248, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_naf]": 0.007684208016144112, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_ncsf]": 0.006203707991517149, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_nice]": 0.0033724999957485124, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_nsf]": 0.006353581993607804, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_sospf]": 0.005436499995994382, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-1-build_zuko_unaf]": 0.007937499016406946, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_made]": 0.0026717919972725213, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_maf]": 0.003224998989026062, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_maf_rqs]": 0.004688083005021326, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_mdn]": 0.0017972500063478947, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_mlp_flowmatcher]": 0.0015043760067783296, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_nsf]": 0.006309166987193748, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_resnet_flowmatcher]": 0.0025661249965196475, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_bpf]": 0.0036963740130886436, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_gf]": 0.00278475099185016, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_maf]": 0.004333125005359761, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_naf]": 0.007749083990347572, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_ncsf]": 0.006508958991616964, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_nice]": 0.0032910430163610727, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_nsf]": 0.006181333010317758, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_sospf]": 0.005325165999238379, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape0-input_event_shape1-2-build_zuko_unaf]": 0.007840833000955172, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_made]": 0.0027683749940479174, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_maf]": 0.003324876000988297, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_maf_rqs]": 0.004731291002826765, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_mdn]": 0.0018625829834491014, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_mlp_flowmatcher]": 0.001609333005035296, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_nsf]": 0.003996458995970897, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_resnet_flowmatcher]": 0.002720998993027024, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_bpf]": 0.0028790430224034935, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_gf]": 0.009246959001757205, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_maf]": 0.0034438739967299625, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_naf]": 0.005706958007067442, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_ncsf]": 0.005186793001485057, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_nice]": 0.003785501015954651, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_nsf]": 0.006209000988746993, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_sospf]": 0.0037781659921165556, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-1-build_zuko_unaf]": 0.0056213739881059155, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_made]": 0.0027505400066729635, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_maf]": 0.003439626016188413, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_maf_rqs]": 0.004762707991176285, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_mdn]": 0.0018233339942526072, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_mlp_flowmatcher]": 0.0016112090088427067, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_nsf]": 0.003938460009521805, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_resnet_flowmatcher]": 0.0026611669891281053, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_bpf]": 0.0028371260123094544, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_gf]": 0.0025285830051871017, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_maf]": 0.0030469999910565093, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_naf]": 0.005568874999880791, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_ncsf]": 0.004423125006724149, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_nice]": 0.0030828749877400696, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_nsf]": 0.004620290987077169, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_sospf]": 0.0038150829932419583, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape0-2-build_zuko_unaf]": 0.005519499987713061, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_made]": 0.002917666992289014, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_maf]": 0.0035080830130027607, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_maf_rqs]": 0.004943458014167845, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_mdn]": 0.002040666004177183, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_mlp_flowmatcher]": 0.0017130420019384474, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_nsf]": 0.006797207985073328, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_resnet_flowmatcher]": 0.0027828330057673156, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_bpf]": 0.004022292006993666, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_gf]": 0.0031774999952176586, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_maf]": 0.0047854580043349415, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_naf]": 0.008105249013169669, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_ncsf]": 0.08829487499315292, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_nice]": 0.0037372499937191606, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_nsf]": 0.006575124993105419, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_sospf]": 0.0056082080118358135, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-1-build_zuko_unaf]": 0.008315126004163176, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_made]": 0.0030888750188751146, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_maf]": 0.003532832983182743, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_maf_rqs]": 0.005154750993824564, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_mdn]": 0.0021510009828489274, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_mlp_flowmatcher]": 0.0017284589994233102, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_nsf]": 0.006372624993673526, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_resnet_flowmatcher]": 0.0027826250006910414, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_bpf]": 0.004021290995297022, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_gf]": 0.0029138749960111454, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_maf]": 0.004606583985150792, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_naf]": 0.007981458998983726, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_ncsf]": 0.006438209005864337, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_nice]": 0.0034537490137154236, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_nsf]": 0.006359498991514556, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_sospf]": 0.00560779198713135, + "tests/density_estimator_test.py::test_density_estimator_loss_shapes[10-condition_event_shape1-input_event_shape1-2-build_zuko_unaf]": 0.008352832999662496, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_made]": 0.002842957997927442, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_maf]": 0.003162875000271015, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_maf_rqs]": 0.0048455419891979545, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_mdn]": 0.0016119159990921617, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_nsf]": 0.003891333981300704, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_bpf]": 0.006180083000799641, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_gf]": 0.003530292000505142, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_maf]": 0.002717082985327579, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_naf]": 0.01405879098456353, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_ncsf]": 0.0038628760230494663, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_nice]": 0.002714000002015382, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_nsf]": 0.0037127909890841693, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_sospf]": 0.008750416993279941, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_unaf]": 0.019069207992288284, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_made]": 0.0031175830081338063, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_maf]": 0.0034281669941265136, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_maf_rqs]": 0.0050942079978995025, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_mdn]": 0.0017752089916029945, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_nsf]": 0.003896540991263464, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_bpf]": 0.0062576659984188154, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_gf]": 0.003474208991974592, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_maf]": 0.0026922079996438697, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_naf]": 0.014559250004822388, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_ncsf]": 0.003662541013909504, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_nice]": 0.0027212909917579964, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_nsf]": 0.0034198750072391704, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_sospf]": 0.008867166005074978, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_unaf]": 0.01907795800070744, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_made]": 0.002847334006219171, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_maf]": 0.0031960430060280487, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_maf_rqs]": 0.005057042013504542, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_mdn]": 0.0015965000056894496, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_nsf]": 0.0038724159967387095, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_bpf]": 0.006577209001989104, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_gf]": 0.0035894999891752377, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_maf]": 0.0028590409929165617, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_naf]": 0.01721316597831901, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_ncsf]": 0.0037506249936996028, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_nice]": 0.002700292010558769, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_nsf]": 0.003623748998506926, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_sospf]": 0.009032166010001674, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_unaf]": 0.023302666988456622, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_made]": 0.003606792990467511, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_maf]": 0.0046100829931674525, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_maf_rqs]": 0.011109459010185674, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_mdn]": 0.001844625992816873, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_nsf]": 0.006441666992031969, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_bpf]": 0.021511834012926556, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_gf]": 0.003971875994466245, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_maf]": 0.005472583026858047, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_naf]": 0.0527530410035979, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_ncsf]": 0.009058042996912263, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_nice]": 0.0031131249997997656, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_nsf]": 0.008782332981354557, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_sospf]": 0.02924679197894875, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_unaf]": 0.0798352919955505, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_made]": 0.003681499991216697, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_maf]": 0.004611250027664937, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_maf_rqs]": 0.012911542013171129, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_mdn]": 0.0020482909894781187, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_nsf]": 0.0067658749903785065, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_bpf]": 0.02315791700675618, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_gf]": 0.004256623986293562, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_maf]": 0.005573041984462179, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_naf]": 0.0549964570091106, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_ncsf]": 0.009267497996916063, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_nice]": 0.0029972500051371753, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_nsf]": 0.009111749997828156, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_sospf]": 0.02971533199888654, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_unaf]": 0.08359412499703467, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_made]": 0.00391954199585598, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_maf]": 0.004682167011196725, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_maf_rqs]": 0.01144754100823775, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_mdn]": 0.001884416997199878, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_nsf]": 0.0065306670003337786, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_bpf]": 0.023253833991475403, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_gf]": 0.0040937080048024654, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_maf]": 0.00569079200795386, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_naf]": 0.0798786669911351, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_ncsf]": 0.009927250997861847, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_nice]": 0.0030303740059025586, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_nsf]": 0.009331957990070805, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_sospf]": 0.03297333299997263, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_unaf]": 0.1460353330039652, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_made]": 0.007250415001180954, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_maf]": 0.004403041995828971, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_maf_rqs]": 0.005403209012001753, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_mdn]": 0.0024476250109728426, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_nsf]": 0.004541083006188273, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_bpf]": 0.006695207994198427, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_gf]": 0.0038394570001401007, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_maf]": 0.0036602920008590445, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_naf]": 0.015406625010655262, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_ncsf]": 0.004319375002523884, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_nice]": 0.003386458003660664, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_nsf]": 0.004658083998947404, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_sospf]": 0.008866874995874241, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_unaf]": 0.019759293005336076, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_made]": 0.0033937489934032783, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_maf]": 0.003740375002962537, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_maf_rqs]": 0.00541487499140203, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_mdn]": 0.003899417002685368, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_nsf]": 0.004403915008879267, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_bpf]": 0.006613998993998393, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_gf]": 0.003725499991560355, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_maf]": 0.0029973750206409022, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_naf]": 0.014987916991231032, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_ncsf]": 0.0047604179999325424, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_nice]": 0.003032791006262414, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_nsf]": 0.007544208026956767, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_sospf]": 0.00891958299325779, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_unaf]": 0.020978500004275702, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_made]": 0.00306883298617322, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_maf]": 0.0034930000110762194, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_maf_rqs]": 0.004989417007891461, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_mdn]": 0.0018302089883945882, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_nsf]": 0.009839416001341306, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_bpf]": 0.006863417002023198, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_gf]": 0.0037957489839755, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_maf]": 0.0029226260085124522, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_naf]": 0.01685562400962226, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_ncsf]": 0.03146641800412908, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_nice]": 0.019669125002110377, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_nsf]": 0.039799500998924486, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_sospf]": 0.011590791007620282, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_unaf]": 0.02954833301191684, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_made]": 0.007323166006244719, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_maf]": 0.0050064170063706115, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_maf_rqs]": 0.012168626009952277, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_mdn]": 0.003401166992262006, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_nsf]": 0.04136829200433567, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_bpf]": 0.023466583996196277, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_gf]": 0.004216375004034489, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_maf]": 0.005702832015231252, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_naf]": 0.05438108299858868, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_ncsf]": 0.010240374991553836, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_nice]": 0.003256373995100148, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_nsf]": 0.009264208012609743, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_sospf]": 0.029680999999982305, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_unaf]": 0.08200670800579246, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_made]": 0.0038561249966733158, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_maf]": 0.0055714580084895715, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_maf_rqs]": 0.011522957996930927, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_mdn]": 0.0020396659965626895, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_nsf]": 0.00665829201170709, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_bpf]": 0.021162749995710328, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_gf]": 0.004130376008106396, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_maf]": 0.009554750999086536, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_naf]": 0.05803920798643958, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_ncsf]": 0.011796541017247364, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_nice]": 0.003321291005704552, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_nsf]": 0.009877290998701937, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_sospf]": 0.03024533300776966, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_unaf]": 0.08276770799420774, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_made]": 0.004419210003106855, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_maf]": 0.005436001010821201, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_maf_rqs]": 0.01164133298152592, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_mdn]": 0.0020919990056427196, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_nsf]": 0.007221166990348138, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_bpf]": 0.023227373996633105, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_gf]": 0.004718917014542967, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_maf]": 0.006237709007109515, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_naf]": 0.08203112499904819, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_ncsf]": 0.01105329001438804, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_nice]": 0.003270708999480121, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_nsf]": 0.01032283301174175, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_sospf]": 0.03483912399678957, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[1-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_unaf]": 0.13376050000078976, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_made]": 0.0030644990038126707, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_maf]": 0.003285750004579313, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_maf_rqs]": 0.004835583997191861, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_mdn]": 0.001693917001830414, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_nsf]": 0.003912665997631848, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_bpf]": 0.006298875014181249, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_gf]": 0.003503251005895436, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_maf]": 0.0027221250056754798, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_naf]": 0.017109957989305258, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_ncsf]": 0.003829082997981459, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_nice]": 0.0029573749925475568, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_nsf]": 0.0036891240015393123, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_sospf]": 0.008930167008657008, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape0-build_zuko_unaf]": 0.027000416012015194, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_made]": 0.002819500004989095, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_maf]": 0.0033864170109154657, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_maf_rqs]": 0.004948916001012549, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_mdn]": 0.001663791001192294, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_nsf]": 0.00416887499159202, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_bpf]": 0.006586625022464432, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_gf]": 0.0035907920100726187, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_maf]": 0.002832168000168167, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_naf]": 0.01694274999317713, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_ncsf]": 0.003887124010361731, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_nice]": 0.0028070000116713345, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_nsf]": 0.003597541988710873, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_sospf]": 0.009173874001135118, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape1-build_zuko_unaf]": 0.02824037599202711, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_made]": 0.003143833004287444, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_maf]": 0.003551250003511086, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_maf_rqs]": 0.005152207988430746, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_mdn]": 0.0016461240156786516, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_nsf]": 0.004203124000923708, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_bpf]": 0.007539833997725509, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_gf]": 0.0038734169938834384, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_maf]": 0.0027290410071145743, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_naf]": 0.019597831997089088, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_ncsf]": 0.0038931659946683794, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_nice]": 0.0027988759975414723, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_nsf]": 0.0036156679852865636, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_sospf]": 0.010644042980857193, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape0-sample_shape2-build_zuko_unaf]": 0.04291558399563655, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_made]": 0.004134957998758182, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_maf]": 0.004932334006298333, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_maf_rqs]": 0.011635458024102263, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_mdn]": 0.001948043005540967, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_nsf]": 0.006657624995568767, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_bpf]": 0.02409095800248906, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_gf]": 0.004221793002216145, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_maf]": 0.005766707006841898, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_naf]": 0.07596508298593108, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_ncsf]": 0.00972733402159065, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_nice]": 0.0030207499949028715, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_nsf]": 0.009121539987972938, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_sospf]": 0.03345149999950081, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape0-build_zuko_unaf]": 0.13740008299646433, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_made]": 0.004042292013764381, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_maf]": 0.004931459014187567, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_maf_rqs]": 0.011316375006572343, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_mdn]": 0.0019446250225882977, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_nsf]": 0.006632208998780698, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_bpf]": 0.024532290975912474, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_gf]": 0.004176832997472957, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_maf]": 0.005789083006675355, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_naf]": 0.07745187400723808, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_ncsf]": 0.010014917032094672, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_nice]": 0.003122167006949894, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_nsf]": 0.009408875004737638, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_sospf]": 0.033971041018958203, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape1-build_zuko_unaf]": 0.14695520799432416, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_made]": 0.0831206260190811, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_maf]": 0.006047834001947194, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_maf_rqs]": 0.013972166998428293, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_mdn]": 0.002265250004711561, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_nsf]": 0.007022416990366764, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_bpf]": 0.0446332919964334, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_gf]": 0.005507959009264596, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_maf]": 0.007225542009109631, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_naf]": 0.10979766702803317, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_ncsf]": 0.011732667990145274, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_nice]": 0.0033007510064635426, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_nsf]": 0.010726917011197656, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_sospf]": 0.0568579169921577, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape0-input_event_shape1-sample_shape2-build_zuko_unaf]": 0.4901291670103092, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_made]": 0.003396624990273267, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_maf]": 0.0035174170043319464, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_maf_rqs]": 0.0054404160036938265, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_mdn]": 0.0019038329919567332, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_nsf]": 0.004596458005835302, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_bpf]": 0.006870291021186858, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_gf]": 0.003946291020838544, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_maf]": 0.0031799160060472786, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_naf]": 0.016937166001298465, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_ncsf]": 0.003984500988735817, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_nice]": 0.003099581997958012, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_nsf]": 0.0038199180125957355, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_sospf]": 0.009179749991744757, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape0-build_zuko_unaf]": 0.02726266600075178, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_made]": 0.0031073330028448254, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_maf]": 0.0035351249971427023, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_maf_rqs]": 0.0050914570019813254, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_mdn]": 0.0018420840060571209, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_nsf]": 0.004201084011583589, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_bpf]": 0.00671170798887033, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_gf]": 0.0037750409974250942, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_maf]": 0.0029475830087903887, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_naf]": 0.017054291020031087, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_ncsf]": 0.004065208995598368, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_nice]": 0.003053333013667725, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_nsf]": 0.0038603740104008466, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_sospf]": 0.009592834001523443, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape1-build_zuko_unaf]": 0.02812299900688231, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_made]": 0.0034858330036513507, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_maf]": 0.003887498998665251, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_maf_rqs]": 0.005434833001345396, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_mdn]": 0.0018911670049419627, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_nsf]": 0.0044410010013962165, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_bpf]": 0.007900873984908685, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_gf]": 0.0041133330087177455, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_maf]": 0.0029645409958902746, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_naf]": 0.019862540997564793, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_ncsf]": 0.003937040994060226, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_nice]": 0.0029612920043291524, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_nsf]": 0.003834876013570465, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_sospf]": 0.01112437499978114, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape0-sample_shape2-build_zuko_unaf]": 0.04598241701023653, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_made]": 0.004107583008590154, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_maf]": 0.00512200100638438, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_maf_rqs]": 0.01309245900483802, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_mdn]": 0.00226587601355277, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_nsf]": 0.007001125006354414, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_bpf]": 0.024073083011899143, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_gf]": 0.0043452910031192005, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_maf]": 0.0057334169978275895, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_naf]": 0.07559958400088362, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_ncsf]": 0.010062415996799245, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_nice]": 0.0034167070116382092, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_nsf]": 0.009677376001491211, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_sospf]": 0.03353854198940098, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape0-build_zuko_unaf]": 0.14778341598866973, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_made]": 0.004158584008109756, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_maf]": 0.005000541990739293, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_maf_rqs]": 0.011519332983880304, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_mdn]": 0.002043957996647805, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_nsf]": 0.007044001016765833, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_bpf]": 0.02441008402092848, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_gf]": 0.004432040979736485, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_maf]": 0.006084167005610652, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_naf]": 0.08166816599259619, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_ncsf]": 0.01005370898928959, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_nice]": 0.003218416008166969, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_nsf]": 0.009837790988967754, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_sospf]": 0.034146375008276664, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape1-build_zuko_unaf]": 0.1527115839999169, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_made]": 0.004930665993015282, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_maf]": 0.006192750021000393, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_maf_rqs]": 0.013937874013208784, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_mdn]": 0.0021302910026861355, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_nsf]": 0.007702750008320436, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_bpf]": 0.04372191600850783, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_gf]": 0.005595375012489967, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_maf]": 0.006948250986170024, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_naf]": 0.11151858400262427, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_ncsf]": 0.012027208009385504, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_nice]": 0.003623500990215689, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_nsf]": 0.012340124987531453, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_sospf]": 0.05663737600843888, + "tests/density_estimator_test.py::test_density_estimator_sample_shapes[10-condition_event_shape1-input_event_shape1-sample_shape2-build_zuko_unaf]": 0.49451237499306444, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_categoricalmassestimator-1-input_event_shape5-condition_event_shape5-10]": 0.004804418014828116, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_categoricalmassestimator-1-input_event_shape8-condition_event_shape8-10]": 0.0020363339863251895, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_categoricalmassestimator-2-input_event_shape6-condition_event_shape6-10]": 0.004614249017322436, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_mnle-1-input_event_shape0-condition_event_shape0-1]": 0.005926666999584995, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_mnle-1-input_event_shape1-condition_event_shape1-10]": 0.005782082982477732, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_mnle-1-input_event_shape2-condition_event_shape2-10]": 0.009610000008251518, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_mnle-1-input_event_shape3-condition_event_shape3-10]": 0.008419165998930112, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_mnle-1-input_event_shape4-condition_event_shape4-10]": 0.009446541022043675, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape0-build_mnle-2-input_event_shape7-condition_event_shape7-10]": 0.0032570410112384707, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_categoricalmassestimator-1-input_event_shape5-condition_event_shape5-10]": 0.004387667999253608, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_categoricalmassestimator-1-input_event_shape8-condition_event_shape8-10]": 0.0019242500129621476, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_categoricalmassestimator-2-input_event_shape6-condition_event_shape6-10]": 0.0046542500058421865, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_mnle-1-input_event_shape0-condition_event_shape0-1]": 0.005558750010095537, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_mnle-1-input_event_shape1-condition_event_shape1-10]": 0.00530983300996013, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_mnle-1-input_event_shape2-condition_event_shape2-10]": 0.009879082994302735, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_mnle-1-input_event_shape3-condition_event_shape3-10]": 0.00935958199261222, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_mnle-1-input_event_shape4-condition_event_shape4-10]": 0.008793831992079504, + "tests/density_estimator_test.py::test_mixed_density_estimator[sample_shape1-build_mnle-2-input_event_shape7-condition_event_shape7-10]": 0.0032007499976316467, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape0-target_shape0-event_shape0-False]": 0.000856750993989408, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape1-target_shape1-event_shape1-True]": 0.0006437089905375615, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape10-target_shape10-event_shape10-False]": 0.0006303760019363835, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape11-target_shape11-event_shape11-True]": 0.000614582997513935, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape12-target_shape12-event_shape12-False]": 0.0006184579979162663, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape13-target_shape13-event_shape13-True]": 0.000608125003054738, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape14-target_shape14-event_shape14-True]": 0.0006082080071792006, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape15-target_shape15-event_shape15-False]": 0.0007960829971125349, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape16-target_shape16-5-False]": 0.0006825840100646019, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape17-target_shape17-3-False]": 0.0007398329908028245, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape18-target_shape18-event_shape18-False]": 0.0007689569902140647, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape19-target_shape19-event_shape19-False]": 0.0007599169766763225, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape2-target_shape2-event_shape2-False]": 0.0006319580279523507, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape20-target_shape20-3-False]": 0.0007201670086942613, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape21-target_shape21-3-True]": 0.0007005420047789812, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape3-target_shape3-event_shape3-True]": 0.0006977500306675211, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape4-target_shape4-event_shape4-False]": 0.0006460000149672851, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape5-target_shape5-event_shape5-True]": 0.0006465409969678149, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape6-target_shape6-event_shape6-True]": 0.0006226250116014853, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape7-target_shape7-event_shape7-False]": 0.000643749997834675, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape8-target_shape8-event_shape8-False]": 0.0006274579936871305, + "tests/density_estimator_test.py::test_shape_handling_utility_for_density_estimator[theta_or_x_shape9-target_shape9-event_shape9-True]": 0.0006126669904915616, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[1-input_shape0]": 0.4058945399883669, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[1-input_shape1]": 0.6936867910117144, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[1-input_shape2]": 0.8805956660071388, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[2-input_shape0]": 0.4082713760144543, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[2-input_shape1]": 0.705334001002484, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[2-input_shape2]": 1.0053542079986073, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[3-input_shape0]": 0.39847237498906907, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[3-input_shape1]": 0.7379519579990301, + "tests/embedding_net_test.py::test_1d_and_2d_cnn_embedding_net[3-input_shape2]": 1.0337010009970982, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[direct-1-1-1]": 0.14593400098965503, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[direct-1-1-2]": 0.15232891698542517, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[direct-1-2-1]": 0.15063687598740216, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[direct-1-2-2]": 0.15319916598673444, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[direct-2-1-1]": 0.15472258301451802, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[direct-2-1-2]": 0.15227833400422242, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[direct-2-2-1]": 0.1527886659896467, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[direct-2-2-2]": 0.15345449998858385, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[mcmc-1-1-1]": 2.2078785420017084, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[mcmc-1-1-2]": 1.000097290991107, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[mcmc-1-2-1]": 2.2410688339878106, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[mcmc-1-2-2]": 1.0240541660023155, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[mcmc-2-1-1]": 3.8512472490256187, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[mcmc-2-1-2]": 2.046002207993297, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[mcmc-2-2-1]": 3.7480234570102766, + "tests/embedding_net_test.py::test_embedding_api_with_multiple_trials[mcmc-2-2-2]": 2.00366745798965, + "tests/embedding_net_test.py::test_embedding_net_api[mlp-1-FMPE]": 0.05234737500722986, + "tests/embedding_net_test.py::test_embedding_net_api[mlp-1-NLE]": 0.44597183298901655, + "tests/embedding_net_test.py::test_embedding_net_api[mlp-1-NPE]": 0.16550812497735023, + "tests/embedding_net_test.py::test_embedding_net_api[mlp-1-NRE]": 0.17771416599862278, + "tests/embedding_net_test.py::test_embedding_net_api[mlp-2-FMPE]": 0.18356945700361393, + "tests/embedding_net_test.py::test_embedding_net_api[mlp-2-NLE]": 1.8627704999962589, + "tests/embedding_net_test.py::test_embedding_net_api[mlp-2-NPE]": 0.11386933400353882, + "tests/embedding_net_test.py::test_embedding_net_api[mlp-2-NRE]": 0.640289125018171, + "tests/embedding_net_test.py::test_npe_with_with_iid_embedding_varying_num_trials": 22.270861082986812, + "tests/ensemble_test.py::test_c2st_posterior_ensemble_on_linearGaussian[NLE_A-1]": 18.854254833000596, + "tests/ensemble_test.py::test_c2st_posterior_ensemble_on_linearGaussian[NLE_A-5]": 24.37106779201713, + "tests/ensemble_test.py::test_c2st_posterior_ensemble_on_linearGaussian[NPE_C-1]": 13.74234225001419, + "tests/ensemble_test.py::test_c2st_posterior_ensemble_on_linearGaussian[NPE_C-5]": 8.757447457988746, + "tests/ensemble_test.py::test_c2st_posterior_ensemble_on_linearGaussian[NRE_A-1]": 4.947418792027747, + "tests/ensemble_test.py::test_c2st_posterior_ensemble_on_linearGaussian[NRE_A-5]": 5.840503751009237, + "tests/ensemble_test.py::test_ensemble_posterior_weights[0.5-TypeError]": 0.05101366600138135, + "tests/ensemble_test.py::test_ensemble_posterior_weights[None-None]": 0.05519779201131314, + "tests/ensemble_test.py::test_ensemble_posterior_weights[weights1-None]": 0.05294366799353156, + "tests/ensemble_test.py::test_ensemble_posterior_weights[weights2-None]": 0.051860124003724195, + "tests/ensemble_test.py::test_ensemble_posterior_weights[weights3-TypeError]": 0.0514463319996139, + "tests/ensemble_test.py::test_ensemble_posterior_weights[weights5-TypeError]": 0.05135441699530929, + "tests/ensemble_test.py::test_import_before_deprecation": 0.02760416599630844, + "tests/inference_on_device_test.py::test_nograd_after_inference_train[NLE_A]": 0.022784248998505063, + "tests/inference_on_device_test.py::test_nograd_after_inference_train[NPE_A]": 0.008704417981789447, + "tests/inference_on_device_test.py::test_nograd_after_inference_train[NPE_C]": 0.0239679160004016, + "tests/inference_on_device_test.py::test_nograd_after_inference_train[NRE_A]": 0.007748292002361268, + "tests/inference_on_device_test.py::test_nograd_after_inference_train[NRE_B]": 0.008086166984867305, + "tests/inference_on_device_test.py::test_nograd_after_inference_train[NRE_C]": 0.01013516700186301, + "tests/inference_on_device_test.py::test_validate_theta_and_x_shapes[shape_theta0-shape_x0]": 0.000735125009668991, + "tests/inference_on_device_test.py::test_validate_theta_and_x_shapes[shape_theta1-shape_x0]": 0.000635749995126389, + "tests/inference_on_device_test.py::test_validate_theta_and_x_tensor": 0.0005965410091448575, + "tests/inference_on_device_test.py::test_validate_theta_and_x_type": 0.0005553340015467256, + "tests/inference_with_NaN_simulator_test.py::test_handle_invalid_x[x_shape0]": 0.000667666012304835, + "tests/inference_with_NaN_simulator_test.py::test_handle_invalid_x[x_shape1]": 0.0006134580034995452, + "tests/inference_with_NaN_simulator_test.py::test_inference_with_nan_simulator[NLE_A-0.05]": 0.13079104201460723, + "tests/inference_with_NaN_simulator_test.py::test_inference_with_nan_simulator[NPE_C-0.05]": 8.456587376014795, + "tests/inference_with_NaN_simulator_test.py::test_inference_with_nan_simulator[NRE_B-0.05]": 0.12743349999072962, + "tests/inference_with_NaN_simulator_test.py::test_inference_with_restriction_estimator": 4.237933582990081, + "tests/inference_with_NaN_simulator_test.py::test_restricted_prior_log_prob[gaussian]": 0.5811783749959432, + "tests/inference_with_NaN_simulator_test.py::test_restricted_prior_log_prob[uniform]": 0.5779843330092262, + "tests/inference_with_NaN_simulator_test.py::test_z_scoring_warning[NPE_A]": 0.008357458005775698, + "tests/inference_with_NaN_simulator_test.py::test_z_scoring_warning[NPE_C]": 0.02047462499467656, + "tests/lc2st_test.py::test_lc2st_false_positiv_rate[LC2ST]": 85.0407132919936, + "tests/lc2st_test.py::test_lc2st_false_positiv_rate[LC2ST_NF]": 93.08494737397996, + "tests/lc2st_test.py::test_lc2st_true_positiv_rate[LC2ST]": 62.35916045901831, + "tests/lc2st_test.py::test_lc2st_true_positiv_rate[LC2ST_NF]": 63.7056505419896, + "tests/lc2st_test.py::test_running_lc2st[False-1-1-custom-LC2ST]": 1.7412178750091698, + "tests/lc2st_test.py::test_running_lc2st[False-1-1-custom-LC2ST_NF]": 1.725578707002569, + "tests/lc2st_test.py::test_running_lc2st[False-1-1-mlp-LC2ST]": 0.3780537079728674, + "tests/lc2st_test.py::test_running_lc2st[False-1-1-mlp-LC2ST_NF]": 0.09457020799163729, + "tests/lc2st_test.py::test_running_lc2st[False-1-1-random_forest-LC2ST]": 0.22856491597485729, + "tests/lc2st_test.py::test_running_lc2st[False-1-1-random_forest-LC2ST_NF]": 0.23364095900615212, + "tests/lc2st_test.py::test_running_lc2st[False-1-2-custom-LC2ST]": 2.1096857910160907, + "tests/lc2st_test.py::test_running_lc2st[False-1-2-custom-LC2ST_NF]": 2.4464845420006895, + "tests/lc2st_test.py::test_running_lc2st[False-1-2-mlp-LC2ST]": 0.3227105840051081, + "tests/lc2st_test.py::test_running_lc2st[False-1-2-mlp-LC2ST_NF]": 0.16251466602261644, + "tests/lc2st_test.py::test_running_lc2st[False-1-2-random_forest-LC2ST]": 0.38738400099100545, + "tests/lc2st_test.py::test_running_lc2st[False-1-2-random_forest-LC2ST_NF]": 0.38859208300709724, + "tests/lc2st_test.py::test_running_lc2st[False-3-1-custom-LC2ST]": 5.340229876019293, + "tests/lc2st_test.py::test_running_lc2st[False-3-1-custom-LC2ST_NF]": 6.152937748993281, + "tests/lc2st_test.py::test_running_lc2st[False-3-1-mlp-LC2ST]": 0.43889104199479334, + "tests/lc2st_test.py::test_running_lc2st[False-3-1-mlp-LC2ST_NF]": 0.23806412499106955, + "tests/lc2st_test.py::test_running_lc2st[False-3-1-random_forest-LC2ST]": 0.6168177080107853, + "tests/lc2st_test.py::test_running_lc2st[False-3-1-random_forest-LC2ST_NF]": 0.6330212080065394, + "tests/lc2st_test.py::test_running_lc2st[False-3-2-custom-LC2ST]": 6.1080968319874955, + "tests/lc2st_test.py::test_running_lc2st[False-3-2-custom-LC2ST_NF]": 6.7505397090135375, + "tests/lc2st_test.py::test_running_lc2st[False-3-2-mlp-LC2ST]": 0.6676238750078483, + "tests/lc2st_test.py::test_running_lc2st[False-3-2-mlp-LC2ST_NF]": 0.36400845801108517, + "tests/lc2st_test.py::test_running_lc2st[False-3-2-random_forest-LC2ST]": 1.0902068330033217, + "tests/lc2st_test.py::test_running_lc2st[False-3-2-random_forest-LC2ST_NF]": 1.1237997499847552, + "tests/lc2st_test.py::test_running_lc2st[True-1-1-custom-LC2ST]": 0.29583574998832773, + "tests/lc2st_test.py::test_running_lc2st[True-1-1-custom-LC2ST_NF]": 1.8431711659941357, + "tests/lc2st_test.py::test_running_lc2st[True-1-1-mlp-LC2ST]": 0.1400306670111604, + "tests/lc2st_test.py::test_running_lc2st[True-1-1-mlp-LC2ST_NF]": 0.13508154099690728, + "tests/lc2st_test.py::test_running_lc2st[True-1-1-random_forest-LC2ST]": 0.23290591601107735, + "tests/lc2st_test.py::test_running_lc2st[True-1-1-random_forest-LC2ST_NF]": 0.23343808301433455, + "tests/lc2st_test.py::test_running_lc2st[True-1-2-custom-LC2ST]": 0.4242326239909744, + "tests/lc2st_test.py::test_running_lc2st[True-1-2-custom-LC2ST_NF]": 2.325436958009959, + "tests/lc2st_test.py::test_running_lc2st[True-1-2-mlp-LC2ST]": 0.4235329160146648, + "tests/lc2st_test.py::test_running_lc2st[True-1-2-mlp-LC2ST_NF]": 0.1684802070085425, + "tests/lc2st_test.py::test_running_lc2st[True-1-2-random_forest-LC2ST]": 0.38949604200024623, + "tests/lc2st_test.py::test_running_lc2st[True-1-2-random_forest-LC2ST_NF]": 0.38876229101151694, + "tests/lc2st_test.py::test_running_lc2st[True-3-1-custom-LC2ST]": 0.8882554579904536, + "tests/lc2st_test.py::test_running_lc2st[True-3-1-custom-LC2ST_NF]": 5.299183124981937, + "tests/lc2st_test.py::test_running_lc2st[True-3-1-mlp-LC2ST]": 0.49909245799062774, + "tests/lc2st_test.py::test_running_lc2st[True-3-1-mlp-LC2ST_NF]": 0.3318419589777477, + "tests/lc2st_test.py::test_running_lc2st[True-3-1-random_forest-LC2ST]": 0.6193059160141274, + "tests/lc2st_test.py::test_running_lc2st[True-3-1-random_forest-LC2ST_NF]": 0.6285956680076197, + "tests/lc2st_test.py::test_running_lc2st[True-3-2-custom-LC2ST]": 1.25769487398793, + "tests/lc2st_test.py::test_running_lc2st[True-3-2-custom-LC2ST_NF]": 7.058843041988439, + "tests/lc2st_test.py::test_running_lc2st[True-3-2-mlp-LC2ST]": 0.5856055010226555, + "tests/lc2st_test.py::test_running_lc2st[True-3-2-mlp-LC2ST_NF]": 0.45725241700711194, + "tests/lc2st_test.py::test_running_lc2st[True-3-2-random_forest-LC2ST]": 1.0913404159946367, + "tests/lc2st_test.py::test_running_lc2st[True-3-2-random_forest-LC2ST_NF]": 1.1025322909845272, + "tests/linearGaussian_fmpe_test.py::test_c2st_fmpe_for_different_dims_and_resume_training": 2.352003959022113, + "tests/linearGaussian_fmpe_test.py::test_c2st_fmpe_on_linearGaussian[1-gaussian]": 6.989391208990128, + "tests/linearGaussian_fmpe_test.py::test_c2st_fmpe_on_linearGaussian[1-uniform]": 3.6121601659833686, + "tests/linearGaussian_fmpe_test.py::test_c2st_fmpe_on_linearGaussian[2-gaussian]": 8.276646500016795, + "tests/linearGaussian_fmpe_test.py::test_c2st_fmpe_on_linearGaussian[2-uniform]": 4.582348124007694, + "tests/linearGaussian_fmpe_test.py::test_fmpe_map": 6.069286750003812, + "tests/linearGaussian_fmpe_test.py::test_fmpe_with_different_models[mlp]": 1.9131464160018368, + "tests/linearGaussian_fmpe_test.py::test_fmpe_with_different_models[resnet]": 9.42425391699362, + "tests/linearGaussian_fmpe_test.py::test_multi_round_handling_fmpe": 0.018968874981510453, + "tests/linearGaussian_fmpe_test.py::test_sample_conditional": 323.1201582089998, + "tests/linearGaussian_mdn_test.py::test_mdn_inference_with_different_methods[NLE_A]": 2.5056916259927675, + "tests/linearGaussian_mdn_test.py::test_mdn_inference_with_different_methods[NPE_C]": 1.3119654590118444, + "tests/linearGaussian_mdn_test.py::test_mdn_with_1D_uniform_prior": 0.17272037599468604, + "tests/linearGaussian_npse_test.py::test_c2st_npse_on_linearGaussian[subvp-3-uniform-sample_with4]": 34.38937225002155, + "tests/linearGaussian_npse_test.py::test_c2st_npse_on_linearGaussian[ve-3-uniform-sample_with3]": 48.835406876009074, + "tests/linearGaussian_npse_test.py::test_c2st_npse_on_linearGaussian[vp-1-gaussian-sample_with0]": 135.11930937600846, + "tests/linearGaussian_npse_test.py::test_c2st_npse_on_linearGaussian[vp-3-gaussian-sample_with2]": 96.3594292490161, + "tests/linearGaussian_npse_test.py::test_c2st_npse_on_linearGaussian[vp-3-uniform-sample_with1]": 51.08408291499654, + "tests/linearGaussian_npse_test.py::test_c2st_npse_on_linearGaussian_different_dims": 8.763673251, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-None-auto_gauss-16trials]": 5.053837459985516, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-None-auto_gauss-8trials]": 4.274894998990931, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-None-fnpe-2trials]": 79.32216266600881, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-None-gauss-6trials]": 2.122279458999401, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-None-jac_gauss-8trials]": 16.583293541989406, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-gaussian-auto_gauss-16trials]": 5.914521583006717, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-gaussian-auto_gauss-8trials]": 4.87025216598704, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-gaussian-fnpe-2trials]": 26.889345999996294, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-gaussian-gauss-6trials]": 2.931748915987555, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-gaussian-jac_gauss-8trials]": 17.543197207982303, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-uniform-auto_gauss-16trials]": 5.5356802079913905, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-uniform-auto_gauss-8trials]": 4.356292331998702, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-uniform-fnpe-2trials]": 59.22952650101797, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-uniform-gauss-6trials]": 2.316293374984525, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[subvp-uniform-jac_gauss-8trials]": 18.679428957984783, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-None-auto_gauss-16trials]": 5.182898250001017, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-None-auto_gauss-8trials]": 4.276028749998659, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-None-fnpe-2trials]": 48.972029376003775, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-None-gauss-6trials]": 2.222831416002009, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-None-jac_gauss-8trials]": 16.7309335420141, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-gaussian-auto_gauss-16trials]": 5.640709000028437, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-gaussian-auto_gauss-8trials]": 4.817403749009827, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-gaussian-fnpe-2trials]": 46.195205875017564, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-gaussian-gauss-6trials]": 2.7750922499835724, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-gaussian-jac_gauss-8trials]": 17.3763139579969, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-uniform-auto_gauss-16trials]": 6.471081834009965, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-uniform-auto_gauss-8trials]": 4.266942041009315, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-uniform-fnpe-2trials]": 49.29106854200654, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-uniform-gauss-6trials]": 2.1298804160032887, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[ve-uniform-jac_gauss-8trials]": 18.841613333002897, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-None-auto_gauss-16trials]": 5.361931082981755, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-None-auto_gauss-8trials]": 4.167129832014325, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-None-fnpe-2trials]": 47.15962895899429, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-None-gauss-6trials]": 2.1070809589873534, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-None-jac_gauss-8trials]": 16.930961165984627, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-gaussian-auto_gauss-16trials]": 6.094277458003489, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-gaussian-auto_gauss-8trials]": 4.948228207984357, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-gaussian-fnpe-2trials]": 63.88656445799279, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-gaussian-gauss-6trials]": 3.223629625994363, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-gaussian-jac_gauss-8trials]": 17.464856749997125, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-uniform-auto_gauss-16trials]": 4.614589415999944, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-uniform-auto_gauss-8trials]": 4.306941707996884, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-uniform-fnpe-2trials]": 65.5737337499886, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-uniform-gauss-6trials]": 2.2990860419959063, + "tests/linearGaussian_npse_test.py::test_npse_iid_inference[vp-uniform-jac_gauss-8trials]": 19.281600083995727, + "tests/linearGaussian_npse_test.py::test_npse_map": 63.949765541998204, + "tests/linearGaussian_simulator_test.py::test_linearGaussian_simulator[1-10000]": 0.0010118329955730587, + "tests/linearGaussian_simulator_test.py::test_linearGaussian_simulator[5-100000]": 0.008255791006376967, + "tests/linearGaussian_simulator_test.py::test_standardlinearGaussian_simulator[1-10000]": 0.001305540994508192, + "tests/linearGaussian_simulator_test.py::test_standardlinearGaussian_simulator[5-100000]": 0.007418832974508405, + "tests/linearGaussian_snle_test.py::test_api_nle_multiple_trials_and_rounds_map[gaussian-1]": 0.7198685409966856, + "tests/linearGaussian_snle_test.py::test_api_nle_multiple_trials_and_rounds_map[uniform-1]": 1.0727716669789515, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-IW-gaussian]": 0.6339449579973007, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-IW-uniform]": 0.6320859590050532, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-alpha-gaussian]": 0.5011277080193395, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-alpha-uniform]": 0.5008129180059768, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-fKL-gaussian]": 0.5228915830084588, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-fKL-uniform]": 0.5009542080078973, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-hmc_pymc-gaussian]": 0.20302679199085105, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-importance-gaussian]": 0.14203879199340008, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-importance-uniform]": 0.13350991600600537, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-nuts_pymc-gaussian]": 3.977094374000444, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-nuts_pyro-uniform]": 0.3582130410068203, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-rKL-gaussian]": 0.5060113749932498, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-rKL-uniform]": 0.5139054999890504, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-rejection-gaussian]": 1.1081623749923892, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-rejection-uniform]": 0.965193875003024, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-slice_np-gaussian]": 0.5599981669802219, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-slice_np-uniform]": 0.8350799169857055, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-slice_np_vectorized-gaussian]": 0.9851373330020579, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[proposal-slice_np_vectorized-uniform]": 1.7251015420042677, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-IW-gaussian]": 0.6387455420044716, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-IW-uniform]": 0.6308435420069145, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-alpha-gaussian]": 0.5208164590003435, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-alpha-uniform]": 0.5095798750116955, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-fKL-gaussian]": 0.5141092090052553, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-fKL-uniform]": 0.5107831249915762, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-hmc_pymc-gaussian]": 0.2321989170013694, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-importance-gaussian]": 0.1378329149883939, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-importance-uniform]": 0.12929929100209847, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-nuts_pymc-gaussian]": 0.24044041699380614, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-nuts_pyro-uniform]": 0.21050312498118728, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-rKL-gaussian]": 0.5126334170199698, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-rKL-uniform]": 0.4964670409972314, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-rejection-gaussian]": 1.045521165986429, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-rejection-uniform]": 0.9672697920032078, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-slice_np-gaussian]": 0.6104947920102859, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-slice_np-uniform]": 1.0545602510101162, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-slice_np_vectorized-gaussian]": 1.0320025000110036, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[resample-slice_np_vectorized-uniform]": 2.0024461670109304, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-IW-gaussian]": 0.6549426260025939, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-IW-uniform]": 0.6126032079919241, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-alpha-gaussian]": 0.5272812090115622, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-alpha-uniform]": 0.498532958998112, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-fKL-gaussian]": 0.5148639590042876, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-fKL-uniform]": 0.5080772500077728, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-hmc_pymc-gaussian]": 0.23145624999597203, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-importance-gaussian]": 0.13878095998370554, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-importance-uniform]": 0.1411008330032928, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-nuts_pymc-gaussian]": 0.24798512501001824, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-nuts_pyro-uniform]": 0.20803349999187049, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-rKL-gaussian]": 0.5241282079950906, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-rKL-uniform]": 0.5078384169901256, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-rejection-gaussian]": 1.0978097089973744, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-rejection-uniform]": 0.9529525409889175, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-slice_np-gaussian]": 0.7975626680126879, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-slice_np-uniform]": 0.9969539590092609, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-slice_np_vectorized-gaussian]": 1.0084754160052398, + "tests/linearGaussian_snle_test.py::test_api_nle_sampling_methods[sir-slice_np_vectorized-uniform]": 1.9325260420009727, + "tests/linearGaussian_snle_test.py::test_c2st_and_map_nle_on_linearGaussian_different[maf-gaussian-1]": 4.9966836249950575, + "tests/linearGaussian_snle_test.py::test_c2st_and_map_nle_on_linearGaussian_different[maf-gaussian-2]": 5.153458000990213, + "tests/linearGaussian_snle_test.py::test_c2st_and_map_nle_on_linearGaussian_different[maf-uniform-1]": 5.026689165024436, + "tests/linearGaussian_snle_test.py::test_c2st_and_map_nle_on_linearGaussian_different[maf-uniform-2]": 5.304202665996854, + "tests/linearGaussian_snle_test.py::test_c2st_and_map_nle_on_linearGaussian_different[zuko_maf-gaussian-1]": 3.7809027500043157, + "tests/linearGaussian_snle_test.py::test_c2st_and_map_nle_on_linearGaussian_different[zuko_maf-gaussian-2]": 5.194910710008116, + "tests/linearGaussian_snle_test.py::test_c2st_and_map_nle_on_linearGaussian_different[zuko_maf-uniform-1]": 4.103660666005453, + "tests/linearGaussian_snle_test.py::test_c2st_and_map_nle_on_linearGaussian_different[zuko_maf-uniform-2]": 5.751198748999741, + "tests/linearGaussian_snle_test.py::test_c2st_multi_round_nle_on_linearGaussian[1]": 7.490861126003438, + "tests/linearGaussian_snle_test.py::test_c2st_multi_round_nle_on_linearGaussian[3]": 14.570809000972076, + "tests/linearGaussian_snle_test.py::test_c2st_multi_round_nle_on_linearGaussian_vi[1]": 3.4993214169953717, + "tests/linearGaussian_snle_test.py::test_c2st_multi_round_nle_on_linearGaussian_vi[3]": 7.4900966660061385, + "tests/linearGaussian_snle_test.py::test_c2st_nle_on_linear_gaussian_different_dims": 6.368224000005284, + "tests/linearGaussian_snle_test.py::test_map_with_multiple_independent_prior[False]": 2.2301509580138372, + "tests/linearGaussian_snle_test.py::test_map_with_multiple_independent_prior[True]": 2.232291916006943, + "tests/linearGaussian_snpe_test.py::test_api_force_first_round_loss[False-False]": 0.1147343750053551, + "tests/linearGaussian_snpe_test.py::test_api_force_first_round_loss[False-True]": 0.3927406250004424, + "tests/linearGaussian_snpe_test.py::test_api_force_first_round_loss[True-False]": 0.35487137400195934, + "tests/linearGaussian_snpe_test.py::test_api_force_first_round_loss[True-True]": 0.2498156670044409, + "tests/linearGaussian_snpe_test.py::test_api_snpe_c_posterior_correction[mcmc-slice_np-gaussian]": 3.79576758199255, + "tests/linearGaussian_snpe_test.py::test_api_snpe_c_posterior_correction[mcmc-slice_np_vectorized-gaussian]": 3.9061008759890683, + "tests/linearGaussian_snpe_test.py::test_api_snpe_c_posterior_correction[rejection-rejection-uniform]": 4.443334333001985, + "tests/linearGaussian_snpe_test.py::test_c2st_multi_round_snpe_on_linearGaussian[snpe_a]": 2.0595681260165293, + "tests/linearGaussian_snpe_test.py::test_c2st_multi_round_snpe_on_linearGaussian[snpe_b]": 0.0011699589958880097, + "tests/linearGaussian_snpe_test.py::test_c2st_multi_round_snpe_on_linearGaussian[snpe_c]": 6.040764582998236, + "tests/linearGaussian_snpe_test.py::test_c2st_multi_round_snpe_on_linearGaussian[snpe_c_non_atomic]": 2.4458496250008466, + "tests/linearGaussian_snpe_test.py::test_c2st_multi_round_snpe_on_linearGaussian[tsnpe_rejection]": 8.802158082995447, + "tests/linearGaussian_snpe_test.py::test_c2st_multi_round_snpe_on_linearGaussian[tsnpe_sir]": 9.899196957005188, + "tests/linearGaussian_snpe_test.py::test_c2st_npe_on_linearGaussian[1-gaussian-NPE_A]": 2.2958831659925636, + "tests/linearGaussian_snpe_test.py::test_c2st_npe_on_linearGaussian[1-gaussian-NPE_C]": 4.968999874996371, + "tests/linearGaussian_snpe_test.py::test_c2st_npe_on_linearGaussian[2-gaussian-NPE_A]": 3.537743248976767, + "tests/linearGaussian_snpe_test.py::test_c2st_npe_on_linearGaussian[2-gaussian-NPE_C]": 5.555673915994703, + "tests/linearGaussian_snpe_test.py::test_c2st_npe_on_linearGaussian[2-uniform-NPE_A]": 2.9019158330047503, + "tests/linearGaussian_snpe_test.py::test_c2st_npe_on_linearGaussian[2-uniform-NPE_C]": 8.359362999981386, + "tests/linearGaussian_snpe_test.py::test_c2st_npe_on_linearGaussian_different_dims": 3.8427128759940388, + "tests/linearGaussian_snpe_test.py::test_density_estimators_on_linearGaussian[made]": 3.132174624988693, + "tests/linearGaussian_snpe_test.py::test_density_estimators_on_linearGaussian[maf]": 5.751318626003922, + "tests/linearGaussian_snpe_test.py::test_density_estimators_on_linearGaussian[maf_rqs]": 10.466042582003865, + "tests/linearGaussian_snpe_test.py::test_density_estimators_on_linearGaussian[mdn]": 3.333134333981434, + "tests/linearGaussian_snpe_test.py::test_density_estimators_on_linearGaussian[nsf]": 11.187396581983194, + "tests/linearGaussian_snpe_test.py::test_density_estimators_on_linearGaussian[zuko_maf]": 6.666426041992963, + "tests/linearGaussian_snpe_test.py::test_density_estimators_on_linearGaussian[zuko_nsf]": 9.398535583997727, + "tests/linearGaussian_snpe_test.py::test_example_posterior[NPE_A]": 0.013701167015824467, + "tests/linearGaussian_snpe_test.py::test_example_posterior[NPE_C]": 0.02648375101853162, + "tests/linearGaussian_snpe_test.py::test_mdn_conditional_density": 2.1643304169992916, + "tests/linearGaussian_snpe_test.py::test_multiround_mog_training": 10.086697167003877, + "tests/linearGaussian_snpe_test.py::test_sample_conditional": 6.076259125009528, + "tests/linearGaussian_snre_test.py::test_api_nre_multiple_trials_and_rounds_map[NRE_B-1]": 0.5947117500036256, + "tests/linearGaussian_snre_test.py::test_api_nre_multiple_trials_and_rounds_map[NRE_C-1]": 0.5778150410042144, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[IW-gaussian]": 0.3351613330160035, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[IW-uniform]": 0.3241303329996299, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[alpha-gaussian]": 0.30307162398821674, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[alpha-uniform]": 0.30285829200875014, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[fKL-gaussian]": 0.2994622079859255, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[fKL-uniform]": 0.2959190419933293, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[hmc_pyro-gaussian]": 0.04312883398961276, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[importance-gaussian]": 0.022761207990697585, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[importance-uniform]": 0.02106283200555481, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[nuts_pymc-gaussian]": 0.07881791600084398, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[nuts_pyro-uniform]": 0.04470191599102691, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[rKL-gaussian]": 0.29008958299527876, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[rKL-uniform]": 0.2862166669947328, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[rejection-gaussian]": 0.2955752089910675, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[rejection-uniform]": 0.22428300099272747, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[slice_np-gaussian]": 0.2073410419980064, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[slice_np-uniform]": 0.3244384580029873, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[slice_np_vectorized-gaussian]": 0.3322399159951601, + "tests/linearGaussian_snre_test.py::test_api_sre_sampling_methods[slice_np_vectorized-uniform]": 0.5905156670050928, + "tests/linearGaussian_snre_test.py::test_c2st_multi_round_snr_on_linearGaussian_vi[NRE_B-1]": 4.815855707987794, + "tests/linearGaussian_snre_test.py::test_c2st_multi_round_snr_on_linearGaussian_vi[NRE_B-3]": 8.042859417008003, + "tests/linearGaussian_snre_test.py::test_c2st_multi_round_snr_on_linearGaussian_vi[NRE_C-1]": 6.366219625007943, + "tests/linearGaussian_snre_test.py::test_c2st_multi_round_snr_on_linearGaussian_vi[NRE_C-3]": 9.015567624999676, + "tests/linearGaussian_snre_test.py::test_c2st_nre_variants_on_linearGaussian_with_multiple_trials[3-gaussian-BNRE]": 4.424953918001847, + "tests/linearGaussian_snre_test.py::test_c2st_nre_variants_on_linearGaussian_with_multiple_trials[3-gaussian-NRE_A]": 3.531077000006917, + "tests/linearGaussian_snre_test.py::test_c2st_nre_variants_on_linearGaussian_with_multiple_trials[3-gaussian-NRE_B]": 4.0768820000084816, + "tests/linearGaussian_snre_test.py::test_c2st_nre_variants_on_linearGaussian_with_multiple_trials[3-gaussian-NRE_C]": 4.4228509579988895, + "tests/linearGaussian_snre_test.py::test_c2st_nre_variants_on_linearGaussian_with_multiple_trials[3-uniform-BNRE]": 5.465903957985574, + "tests/linearGaussian_snre_test.py::test_c2st_nre_variants_on_linearGaussian_with_multiple_trials[3-uniform-NRE_A]": 3.4137114160112105, + "tests/linearGaussian_snre_test.py::test_c2st_nre_variants_on_linearGaussian_with_multiple_trials[3-uniform-NRE_B]": 3.7084491679706844, + "tests/linearGaussian_snre_test.py::test_c2st_nre_variants_on_linearGaussian_with_multiple_trials[3-uniform-NRE_C]": 4.760292332997778, + "tests/linearGaussian_snre_test.py::test_c2st_sre_on_linearGaussian[NRE_B]": 3.07656804099679, + "tests/linearGaussian_snre_test.py::test_c2st_sre_on_linearGaussian[NRE_C]": 4.517465457989601, + "tests/mcmc_test.py::test_c2st_pymc_sampler_on_Gaussian[1-hmc]": 1.4083942510187626, + "tests/mcmc_test.py::test_c2st_pymc_sampler_on_Gaussian[1-nuts]": 1.6368413340242114, + "tests/mcmc_test.py::test_c2st_pymc_sampler_on_Gaussian[1-slice]": 1.5938252080086386, + "tests/mcmc_test.py::test_c2st_pymc_sampler_on_Gaussian[3-hmc]": 4.45510550099425, + "tests/mcmc_test.py::test_c2st_pymc_sampler_on_Gaussian[3-nuts]": 4.224689415990724, + "tests/mcmc_test.py::test_c2st_pymc_sampler_on_Gaussian[3-slice]": 4.406567624988384, + "tests/mcmc_test.py::test_c2st_slice_np_on_Gaussian[1]": 0.6168605410202872, + "tests/mcmc_test.py::test_c2st_slice_np_on_Gaussian[2]": 0.7953532910032663, + "tests/mcmc_test.py::test_c2st_slice_np_vectorized_parallelized_on_Gaussian[1-SliceSamplerSerial-1]": 1.7406938329950208, + "tests/mcmc_test.py::test_c2st_slice_np_vectorized_parallelized_on_Gaussian[1-SliceSamplerSerial-2]": 2.557733998997719, + "tests/mcmc_test.py::test_c2st_slice_np_vectorized_parallelized_on_Gaussian[1-SliceSamplerVectorized-1]": 1.194248791987775, + "tests/mcmc_test.py::test_c2st_slice_np_vectorized_parallelized_on_Gaussian[1-SliceSamplerVectorized-2]": 1.4103497920004884, + "tests/mcmc_test.py::test_c2st_slice_np_vectorized_parallelized_on_Gaussian[2-SliceSamplerSerial-1]": 3.7197095830051694, + "tests/mcmc_test.py::test_c2st_slice_np_vectorized_parallelized_on_Gaussian[2-SliceSamplerSerial-2]": 4.043668875005096, + "tests/mcmc_test.py::test_c2st_slice_np_vectorized_parallelized_on_Gaussian[2-SliceSamplerVectorized-1]": 1.1965434169833316, + "tests/mcmc_test.py::test_c2st_slice_np_vectorized_parallelized_on_Gaussian[2-SliceSamplerVectorized-2]": 1.4191224160022102, + "tests/mcmc_test.py::test_getting_inference_diagnostics[hmc_pymc]": 0.10361670800193679, + "tests/mcmc_test.py::test_getting_inference_diagnostics[hmc_pyro]": 0.05274279099830892, + "tests/mcmc_test.py::test_getting_inference_diagnostics[nuts_pymc]": 0.5925204590021167, + "tests/mcmc_test.py::test_getting_inference_diagnostics[nuts_pyro]": 0.07276004200684838, + "tests/mcmc_test.py::test_getting_inference_diagnostics[slice_np]": 0.6351873749954393, + "tests/mcmc_test.py::test_getting_inference_diagnostics[slice_np_vectorized]": 1.4521858330117539, + "tests/mcmc_test.py::test_getting_inference_diagnostics[slice_pymc]": 0.11581070799729787, + "tests/metrics_test.py::test_c2st_with_constant_features[1]": 0.9311871249956312, + "tests/metrics_test.py::test_c2st_with_constant_features[2]": 0.2619228339899564, + "tests/metrics_test.py::test_c2st_with_different_distributions[mlp-0.0-0.45-0.55]": 2.344415083003696, + "tests/metrics_test.py::test_c2st_with_different_distributions[mlp-1.0-0.85-1.0]": 2.5603605000069365, + "tests/metrics_test.py::test_c2st_with_different_distributions[mlp-20.0-0.98-1.0]": 2.2907592919946183, + "tests/metrics_test.py::test_c2st_with_different_distributions[rf-0.0-0.45-0.55]": 1.5991015009931289, + "tests/metrics_test.py::test_c2st_with_different_distributions[rf-1.0-0.85-1.0]": 1.0992780840024352, + "tests/metrics_test.py::test_c2st_with_different_distributions[rf-20.0-0.98-1.0]": 0.38041408399294596, + "tests/metrics_test.py::test_mmd_squared_distance[0.0-biased_mmd_hypothesis_test]": 0.04741104200365953, + "tests/metrics_test.py::test_mmd_squared_distance[0.0-unbiased_mmd_squared_hypothesis_test]": 0.053545458998996764, + "tests/metrics_test.py::test_mmd_squared_distance[5.0-biased_mmd_hypothesis_test]": 0.04390104200865608, + "tests/metrics_test.py::test_mmd_squared_distance[5.0-unbiased_mmd_squared_hypothesis_test]": 0.039591917986399494, + "tests/metrics_test.py::test_posterior_shrinkage[prior_samples0-post_samples0-None-False]": 0.0008631660166429356, + "tests/metrics_test.py::test_posterior_shrinkage[prior_samples1-post_samples1-expected_shrinkage1-False]": 0.0006689589936286211, + "tests/metrics_test.py::test_posterior_shrinkage[prior_samples2-post_samples2-expected_shrinkage2-False]": 0.0006310830067377537, + "tests/metrics_test.py::test_posterior_shrinkage[prior_samples3-post_samples3-None-True]": 0.0006188330007717013, + "tests/metrics_test.py::test_posterior_zscore[true_theta0-post_samples0-expected_zscore0-False]": 0.0006838750123279169, + "tests/metrics_test.py::test_posterior_zscore[true_theta1-post_samples1-expected_zscore1-False]": 0.000643167004454881, + "tests/metrics_test.py::test_posterior_zscore[true_theta2-post_samples2-None-True]": 0.0005883330013602972, + "tests/metrics_test.py::test_wasserstein_2_distance[0.0]": 2.4683859170181677, + "tests/metrics_test.py::test_wasserstein_2_distance[20.0]": 2.558744834997924, + "tests/metrics_test.py::test_wasserstein_2_distance[5]": 2.7377968760119984, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[1-1-1-10]": 0.034441458017681725, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[1-1-1-1]": 0.03589391599234659, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[1-1-5-10]": 0.04734908300451934, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[1-1-5-1]": 0.0426431250089081, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[1-2-1-10]": 0.03169575000356417, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[1-2-1-1]": 0.031012999985250644, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[1-2-5-10]": 0.03170554299140349, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[1-2-5-1]": 0.03141216600488406, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[2-1-1-10]": 0.02995562501018867, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[2-1-1-1]": 0.031188499997369945, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[2-1-5-10]": 0.031039876004797406, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[2-1-5-1]": 0.030863166990457103, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[2-2-1-10]": 0.030881917002261616, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[2-2-1-1]": 0.03161329100839794, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[2-2-5-10]": 0.030794499994954094, + "tests/mnle_test.py::test_log_likelihood_over_local_iid_theta[2-2-5-1]": 0.03125162600190379, + "tests/mnle_test.py::test_mnle_accuracy_with_different_samplers_and_trials[nsf-5-mcmc]": 28.11988291698799, + "tests/mnle_test.py::test_mnle_accuracy_with_different_samplers_and_trials[nsf-5-rejection]": 0.0006684170075459406, + "tests/mnle_test.py::test_mnle_api[independent-maf-mcmc]": 2.3753656250046333, + "tests/mnle_test.py::test_mnle_api[independent-maf-rejection]": 0.94513187398843, + "tests/mnle_test.py::test_mnle_api[independent-maf-vi]": 0.7252499589958461, + "tests/mnle_test.py::test_mnle_api[independent-mdn-mcmc]": 1.6238423339964356, + "tests/mnle_test.py::test_mnle_api[independent-mdn-rejection]": 0.6303842089982936, + "tests/mnle_test.py::test_mnle_api[independent-mdn-vi]": 0.5478165430104127, + "tests/mnle_test.py::test_mnle_api[independent-nsf-mcmc]": 5.429408333991887, + "tests/mnle_test.py::test_mnle_api[independent-nsf-rejection]": 1.4928240830049617, + "tests/mnle_test.py::test_mnle_api[independent-nsf-vi]": 0.9668145829928108, + "tests/mnle_test.py::test_mnle_api[independent-zuko_bpf-mcmc]": 7.247432625998044, + "tests/mnle_test.py::test_mnle_api[independent-zuko_bpf-rejection]": 1.664448249997804, + "tests/mnle_test.py::test_mnle_api[independent-zuko_bpf-vi]": 1.2238752489793114, + "tests/mnle_test.py::test_mnle_api[independent-zuko_nsf-mcmc]": 5.450627625992638, + "tests/mnle_test.py::test_mnle_api[independent-zuko_nsf-rejection]": 1.4649160010012565, + "tests/mnle_test.py::test_mnle_api[independent-zuko_nsf-vi]": 1.298134000011487, + "tests/mnle_test.py::test_mnle_api[none-maf-mcmc]": 2.311792541993782, + "tests/mnle_test.py::test_mnle_api[none-maf-rejection]": 1.0532785409886856, + "tests/mnle_test.py::test_mnle_api[none-maf-vi]": 1.2091585830057738, + "tests/mnle_test.py::test_mnle_api[none-mdn-mcmc]": 1.5495294160064077, + "tests/mnle_test.py::test_mnle_api[none-mdn-rejection]": 0.5155007510038558, + "tests/mnle_test.py::test_mnle_api[none-mdn-vi]": 0.7013684579869732, + "tests/mnle_test.py::test_mnle_api[none-nsf-mcmc]": 5.408539998999913, + "tests/mnle_test.py::test_mnle_api[none-nsf-rejection]": 1.314022124017356, + "tests/mnle_test.py::test_mnle_api[none-nsf-vi]": 0.9231488329969579, + "tests/mnle_test.py::test_mnle_api[none-zuko_bpf-mcmc]": 7.235302417000639, + "tests/mnle_test.py::test_mnle_api[none-zuko_bpf-rejection]": 1.629393123977934, + "tests/mnle_test.py::test_mnle_api[none-zuko_bpf-vi]": 0.9281328340002801, + "tests/mnle_test.py::test_mnle_api[none-zuko_nsf-mcmc]": 5.393141791995731, + "tests/mnle_test.py::test_mnle_api[none-zuko_nsf-rejection]": 1.495162873994559, + "tests/mnle_test.py::test_mnle_api[none-zuko_nsf-vi]": 1.3083411249972414, + "tests/plot_test.py::test_nan_inf[None-samples0]": 0.024304791979375295, + "tests/plot_test.py::test_nan_inf[limits0-samples0]": 0.02462837599159684, + "tests/plot_test.py::test_pairplot1D[None-samples0]": 0.012411707997671328, + "tests/plot_test.py::test_pairplot1D[limits0-samples0]": 0.08452833401679527, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.024950874008936808, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.04908808301843237, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.02513058298791293, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.15037462700274773, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.024020208016736433, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.02651320700533688, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.025029167998582125, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.02671095800178591, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.02536695900198538, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.051006125984713435, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.02783195799565874, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.052080832989304326, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.025330583011964336, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.02676391598652117, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.02478850001352839, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.13582050100376364, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.024716165993595496, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.048330665988032706, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.024164957998436876, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.04741624998860061, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.024237416990217753, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.027617415980785154, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.024560041012591682, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.02592833297967445, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.025612999001168646, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.05120675198850222, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.024351790983928367, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.16191141598392278, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.02447154100809712, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.02767966699320823, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.025727375003043562, + "tests/plot_test.py::test_pairplot[None-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.027890583005500957, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.026301041987608187, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.054126333008753136, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.026882667021709494, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.053880917010246776, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.13965758300037123, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.029656250990228727, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.027084542001830414, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.028987373982090503, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.027686540997819975, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.05722566599433776, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.027827791011077352, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.057785998986219056, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.028117333989939652, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.031139416998485103, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.028246208996279165, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.032219751010416076, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.1399778330087429, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.0555687079904601, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.026881874990067445, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.054459582999697886, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.027070750002167188, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.028999041009228677, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.02743366698268801, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.028793332996428944, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.027929291987675242, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.05760858400026336, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.02850433299317956, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.05860387500433717, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.1437860419973731, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.030355291004525498, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.027600874003837816, + "tests/plot_test.py::test_pairplot[None-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.03055987600237131, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.02442312399216462, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.04608895900310017, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.024015875009354204, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.04572820899193175, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.03322791699611116, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.02550600100948941, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.02503041700401809, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.025401584003702737, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.024951125000370666, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.16247679099615198, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.02414462500018999, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.04947512499347795, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.024181166983908042, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.02750766699318774, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.02590025099925697, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.029640875000040978, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.02429266601393465, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.04754745798709337, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.024744333000853658, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.04716441803611815, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.02375087399559561, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.025613541991333477, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.02390420899610035, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.025771041997359134, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.024848082000971772, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.049031500006094575, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.024522249994333833, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.16371212499507237, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.025787584017962217, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.026683710006182082, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.027630499011138454, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.026544499982264824, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.027545749995624647, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.054919248999794945, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.02671099899453111, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.05387299999711104, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.027588290991843678, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.028123916999902576, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.13860266700794455, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.028816998994443566, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.02789495899924077, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.0568480839865515, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.027695415992639028, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.057963250001193956, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.027176583011168987, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.029435542004648596, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.027225083991652355, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.030403791010030545, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.027408166002715006, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.05371245800051838, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.02693624998209998, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.16597020700282883, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.027731124006095342, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.028428917008568533, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.026953209002385847, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.028836000987212174, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.027579834015341476, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.057228167017456144, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.028023790975566953, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.05916604198864661, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.027263374999165535, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.029221458986285143, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.027804084005765617, + "tests/plot_test.py::test_pairplot[None-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.14523745799669996, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.024946582998381928, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.049017416007700376, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.025210167004843242, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.04845433300943114, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.026559374993667006, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.02718316699611023, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.028488541996921413, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.03048774998751469, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.14085333301045466, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.05537333199754357, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.025545083000906743, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.05155258298327681, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.025520625989884138, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.028145207979832776, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.026798583989148028, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.02900654199765995, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.028713707986753434, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.048431625007651746, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.025272249986301176, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.04919429199071601, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.13815254099608865, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.027986417000647634, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.025080958002945408, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.028087792015867308, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.026733831997262314, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.051463124982547015, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.02638875099364668, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.051852457007043995, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.02598241598752793, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.027386624991777353, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.026038625990622677, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.02866708299552556, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.027609457989456132, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.167653042008169, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.027905751005164348, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.05504175098030828, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.0287354169995524, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.02974479201657232, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.02794808401085902, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.029242417003843002, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.02820558298844844, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.057832749997032806, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.028459125009248964, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.05968175000452902, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.027938125989749096, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.14742845798900817, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.029213124988018535, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.03418491601769347, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.028052209003362805, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.055829542005085386, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.029184707993408665, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.05464308299997356, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.028369249994284473, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.02937462500995025, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.028043126018019393, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.02964675000112038, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.030540748994098976, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.1736199580191169, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.028083959012292325, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.063526373996865, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.03007670801889617, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.03068287399946712, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.02877774897206109, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-None-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.031595957989338785, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.02539137600979302, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.047985917000914924, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.028329167995252647, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.048153750016354024, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.028005750005831942, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.13876337496913038, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.02460050000809133, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.026478584011783823, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.026114457985386252, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.05094641698815394, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.026267334003932774, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.054389583980082534, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.02552391600329429, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.02758033298596274, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.02545325101527851, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.027339749998645857, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.025494126006378792, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.15994291698734742, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.02498037600889802, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.047020458994666114, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.024489917006576434, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.027208459010580555, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.026417792003485374, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.026721582995378412, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.025734833019669168, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.05111120799847413, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.025403458988876082, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.054312126012519, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.02590204100124538, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.030421708011999726, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.026546415989287198, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-None-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.029518208000808954, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.028462916976423003, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.054143916990142316, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.14098533301148564, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.05493050099175889, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.028625082995858975, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.029373376004514284, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.0286389589891769, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.032040375997894444, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.028844248998211697, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.17354870900453534, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.027962499007117003, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.058141793007962406, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.027768583997385576, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.03154058499785606, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.0288624160020845, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-None-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.02954416700231377, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples0]": 0.02801200101384893, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-None-points0-samples1]": 0.05531979099032469, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples0]": 0.02881054099998437, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-None-limits0-points0-samples1]": 0.055501374998129904, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples0]": 0.026895084010902792, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-None-points0-samples1]": 0.029329792014323175, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples0]": 0.028613249989575706, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-None-None-scatter-subset1-limits0-points0-samples1]": 0.028865915985079482, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples0]": 0.03160441700310912, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-None-points0-samples1]": 0.06016716698650271, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples0]": 0.028161458991235122, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-None-limits0-points0-samples1]": 0.17266191702219658, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples0]": 0.029148124987841584, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-None-points0-samples1]": 0.032572124982834794, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples0]": 0.028541499996208586, + "tests/plot_test.py::test_pairplot[fig_kwargs1-None-diag_kwargs1-None-ticks1-labels1-figsize0-hist-scatter-lower_kwargs1-scatter-subset1-limits0-points0-samples1]": 0.030752334001590498, + "tests/plot_test.py::test_pairplot_dep[None-None-None-hist-False-None-samples0]": 0.024334332993021235, + "tests/plot_test.py::test_pairplot_dep[None-None-None-hist-False-None-samples1]": 0.027704249005182646, + "tests/plot_test.py::test_pairplot_dep[None-None-None-hist-False-labels1-samples0]": 0.02438391601026524, + "tests/plot_test.py::test_pairplot_dep[None-None-None-hist-False-labels1-samples1]": 0.027069333984400146, + "tests/plot_test.py::test_pairplot_dep[None-None-None-hist-True-None-samples0]": 0.024754208003287204, + "tests/plot_test.py::test_pairplot_dep[None-None-None-hist-True-None-samples1]": 0.03043091599829495, + "tests/plot_test.py::test_pairplot_dep[None-None-None-hist-True-labels1-samples0]": 0.02456220900057815, + "tests/plot_test.py::test_pairplot_dep[None-None-None-hist-True-labels1-samples1]": 0.028604417020687833, + "tests/plot_test.py::test_pairplot_dep[None-None-None-scatter-False-None-samples0]": 0.02433529100380838, + "tests/plot_test.py::test_pairplot_dep[None-None-None-scatter-False-None-samples1]": 0.02801304101012647, + "tests/plot_test.py::test_pairplot_dep[None-None-None-scatter-False-labels1-samples0]": 0.024088082995149307, + "tests/plot_test.py::test_pairplot_dep[None-None-None-scatter-False-labels1-samples1]": 0.1422063740028534, + "tests/plot_test.py::test_pairplot_dep[None-None-None-scatter-True-None-samples0]": 0.025265333999413997, + "tests/plot_test.py::test_pairplot_dep[None-None-None-scatter-True-None-samples1]": 0.02769887501199264, + "tests/plot_test.py::test_pairplot_dep[None-None-None-scatter-True-labels1-samples0]": 0.025155375013127923, + "tests/plot_test.py::test_pairplot_dep[None-None-None-scatter-True-labels1-samples1]": 0.028861833008704707, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-hist-False-None-samples0]": 0.024911124986829236, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-hist-False-None-samples1]": 0.02742916700663045, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-hist-False-labels1-samples0]": 0.024866416977602057, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-hist-False-labels1-samples1]": 0.02906974998768419, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-hist-True-None-samples0]": 0.025346750000608154, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-hist-True-None-samples1]": 0.028230416995938867, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-hist-True-labels1-samples0]": 0.025867332995403558, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-hist-True-labels1-samples1]": 0.027939417006564327, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-scatter-False-None-samples0]": 0.14210149997961707, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-scatter-False-None-samples1]": 0.028340876000584103, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-scatter-False-labels1-samples0]": 0.02694345901545603, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-scatter-False-labels1-samples1]": 0.027505373989697546, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-scatter-True-None-samples0]": 0.02432912499352824, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-scatter-True-None-samples1]": 0.028154375017038547, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-scatter-True-labels1-samples0]": 0.02463112401892431, + "tests/plot_test.py::test_pairplot_dep[None-None-samples_labels0-scatter-True-labels1-samples1]": 0.02812304100370966, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-hist-False-None-samples0]": 0.024458166008116677, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-hist-False-None-samples1]": 0.028422206989489496, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-hist-False-labels1-samples0]": 0.024083208001684397, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-hist-False-labels1-samples1]": 0.027633249992504716, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-hist-True-None-samples0]": 0.025181541990605183, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-hist-True-None-samples1]": 0.02770375000545755, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-hist-True-labels1-samples0]": 0.02531900000758469, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-hist-True-labels1-samples1]": 0.028824750013882294, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-scatter-False-None-samples0]": 0.024391501006903127, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-scatter-False-None-samples1]": 0.028392708001774736, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-scatter-False-labels1-samples0]": 0.02488279200042598, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-scatter-False-labels1-samples1]": 0.027665750007145107, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-scatter-True-None-samples0]": 0.02491275100328494, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-scatter-True-None-samples1]": 0.14137820902396925, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-scatter-True-labels1-samples0]": 0.02601558400783688, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-None-scatter-True-labels1-samples1]": 0.02816354100650642, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-hist-False-None-samples0]": 0.027038624990382232, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-hist-False-None-samples1]": 0.027710750015103258, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-hist-False-labels1-samples0]": 0.024910625026677735, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-hist-False-labels1-samples1]": 0.14295649901032448, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-hist-True-None-samples0]": 0.025320915985503234, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-hist-True-None-samples1]": 0.029002998999203555, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-hist-True-labels1-samples0]": 0.024810707996948622, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-hist-True-labels1-samples1]": 0.028261958999792114, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-scatter-False-None-samples0]": 0.025545333002810366, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-scatter-False-None-samples1]": 0.02750541600107681, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-scatter-False-labels1-samples0]": 0.02774375001899898, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-scatter-False-labels1-samples1]": 0.027266958000836894, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-scatter-True-None-samples0]": 0.025906791983288713, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-scatter-True-None-samples1]": 0.02834300001268275, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-scatter-True-labels1-samples0]": 0.02471937600057572, + "tests/plot_test.py::test_pairplot_dep[None-points_labels0-samples_labels0-scatter-True-labels1-samples1]": 0.02829362500051502, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-hist-False-None-samples0]": 0.02559533400926739, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-hist-False-None-samples1]": 0.14624341599119361, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-hist-False-labels1-samples0]": 0.02871349900669884, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-hist-False-labels1-samples1]": 0.02904083400790114, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-hist-True-None-samples0]": 0.02693320698745083, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-hist-True-None-samples1]": 0.028958750001038425, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-hist-True-labels1-samples0]": 0.025921665990608744, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-hist-True-labels1-samples1]": 0.028777957006241195, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-scatter-False-None-samples0]": 0.025607917006709613, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-scatter-False-None-samples1]": 0.028807416994823143, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-scatter-False-labels1-samples0]": 0.0261743330192985, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-scatter-False-labels1-samples1]": 0.028719583002384752, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-scatter-True-None-samples0]": 0.026140666974242777, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-scatter-True-None-samples1]": 0.029464584004017524, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-scatter-True-labels1-samples0]": 0.0312781679967884, + "tests/plot_test.py::test_pairplot_dep[points1-None-None-scatter-True-labels1-samples1]": 0.029068832998746075, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-hist-False-None-samples0]": 0.02703962400846649, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-hist-False-None-samples1]": 0.028709333986626007, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-hist-False-labels1-samples0]": 0.02534054200805258, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-hist-False-labels1-samples1]": 0.03202208297443576, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-hist-True-None-samples0]": 0.02690299999085255, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-hist-True-None-samples1]": 0.03165745799196884, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-hist-True-labels1-samples0]": 0.02672237499791663, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-hist-True-labels1-samples1]": 0.14700716600054875, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-scatter-False-None-samples0]": 0.026280334990588017, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-scatter-False-None-samples1]": 0.02872154099168256, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-scatter-False-labels1-samples0]": 0.025498000977677293, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-scatter-False-labels1-samples1]": 0.028165333002107218, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-scatter-True-None-samples0]": 0.025638582999818027, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-scatter-True-None-samples1]": 0.030156374006764963, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-scatter-True-labels1-samples0]": 0.025588666991097853, + "tests/plot_test.py::test_pairplot_dep[points1-None-samples_labels0-scatter-True-labels1-samples1]": 0.030012207993422635, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-hist-False-None-samples0]": 0.02576049999333918, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-hist-False-None-samples1]": 0.028392874999553896, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-hist-False-labels1-samples0]": 0.0269570009841118, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-hist-False-labels1-samples1]": 0.02808524998545181, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-hist-True-None-samples0]": 0.025944666005671024, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-hist-True-None-samples1]": 0.14487104100408033, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-hist-True-labels1-samples0]": 0.026760332999401726, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-hist-True-labels1-samples1]": 0.029272125000716187, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-scatter-False-None-samples0]": 0.026505665999138728, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-scatter-False-None-samples1]": 0.0287664159986889, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-scatter-False-labels1-samples0]": 0.025134624986094423, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-scatter-False-labels1-samples1]": 0.028237417005584575, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-scatter-True-None-samples0]": 0.02623125100217294, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-scatter-True-None-samples1]": 0.0300709180010017, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-scatter-True-labels1-samples0]": 0.025884041999233887, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-None-scatter-True-labels1-samples1]": 0.0292207909951685, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-hist-False-None-samples0]": 0.02572537500236649, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-hist-False-None-samples1]": 0.03156879299785942, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-hist-False-labels1-samples0]": 0.0249208750174148, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-hist-False-labels1-samples1]": 0.028562748979311436, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-hist-True-None-samples0]": 0.02752341699670069, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-hist-True-None-samples1]": 0.029127166999387555, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-hist-True-labels1-samples0]": 0.02687083299679216, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-hist-True-labels1-samples1]": 0.028758208005456254, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-scatter-False-None-samples0]": 0.025142499012872577, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-scatter-False-None-samples1]": 0.027813206979772076, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-scatter-False-labels1-samples0]": 0.025508626000373624, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-scatter-False-labels1-samples1]": 0.02800145799119491, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-scatter-True-None-samples0]": 0.02548387600108981, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-scatter-True-None-samples1]": 0.029568666010163724, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-scatter-True-labels1-samples0]": 0.025827166988165118, + "tests/plot_test.py::test_pairplot_dep[points1-points_labels0-samples_labels0-scatter-True-labels1-samples1]": 0.02942925100796856, + "tests/plot_test.py::test_plot_summary[NLE_A]": 0.03104462601186242, + "tests/plot_test.py::test_plot_summary[NPE_C]": 0.03414504100510385, + "tests/plot_test.py::test_plot_summary[NRE_B]": 0.022550084002432413, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-2-10]": 0.09287329198559746, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-2-2]": 0.02615962500567548, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-2-4]": 0.042070625015185215, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-3-10]": 0.09631591801007744, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-3-2]": 0.024764001005678438, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-3-4]": 0.04650666798988823, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-4-10]": 0.0958715840097284, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-4-2]": 0.02586937499290798, + "tests/plot_test.py::test_sbc_rank_plot[cdf-False-4-4]": 0.04068733300664462, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-2-10]": 0.20959870898514055, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-2-2]": 0.024672375016962178, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-2-4]": 0.040876041995943524, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-3-10]": 0.09198508401459549, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-3-2]": 0.025192084023728967, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-3-4]": 0.04278708400670439, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-4-10]": 0.09161245801078621, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-4-2]": 0.02538912501768209, + "tests/plot_test.py::test_sbc_rank_plot[cdf-True-4-4]": 0.040766333986539394, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-2-10]": 0.07257945901073981, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-2-2]": 0.02224954098346643, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-2-4]": 0.035806958010653034, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-3-10]": 0.1942065830080537, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-3-2]": 0.023135917013860308, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-3-4]": 0.0398304590198677, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-4-10]": 0.0762577920104377, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-4-2]": 0.022226291985134594, + "tests/plot_test.py::test_sbc_rank_plot[hist-False-4-4]": 0.032809501004521735, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-2-10]": 0.07150833298510406, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-2-2]": 0.02215287502622232, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-2-4]": 0.03431054101383779, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-3-10]": 0.07170908300031442, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-3-2]": 0.024026667000725865, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-3-4]": 0.03295050098677166, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-4-10]": 0.19126170901290607, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-4-2]": 0.022156457998789847, + "tests/plot_test.py::test_sbc_rank_plot[hist-True-4-4]": 0.0339746250101598, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-0-NLE_A]": 0.6607704160123831, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-0-NPE_C]": 1.8245924160000868, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-0-NRE_A]": 0.22421799998846836, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-0-NRE_B]": 0.2340539160068147, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-0-NRE_C]": 0.21258175099501386, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-1-NLE_A]": 0.6539249169873074, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-1-NPE_C]": 1.8074862900102744, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-1-NRE_A]": 0.2264809580083238, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-1-NRE_B]": 0.23142008400463965, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-1-NRE_C]": 0.21300195901130792, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-2-NLE_A]": 15.889232042012736, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-2-NPE_C]": 16.77078970898583, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-2-NRE_A]": 6.108887668015086, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-2-NRE_B]": 6.100894376009819, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-proposal-2-NRE_C]": 6.072604375003721, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-0-NLE_A]": 0.7390005419874797, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-0-NPE_C]": 1.9015856249898206, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-0-NRE_A]": 0.20740612500230782, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-0-NRE_B]": 0.25015408400213346, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-0-NRE_C]": 0.24015762501221616, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-1-NLE_A]": 0.8539761660067597, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-1-NPE_C]": 1.916561833000742, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-1-NRE_A]": 0.21002608301932923, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-1-NRE_B]": 0.2508556239918107, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-1-NRE_C]": 0.24281562300166115, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-2-NLE_A]": 15.992210291980882, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-2-NPE_C]": 16.52147641699412, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-2-NRE_A]": 6.056652375016711, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-2-NRE_B]": 6.123691832981422, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape0-resample-2-NRE_C]": 6.15273991599679, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-0-NLE_A]": 0.6464417920069536, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-0-NPE_C]": 1.709512290006387, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-0-NRE_A]": 0.25430712501110975, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-0-NRE_B]": 0.23415925000153948, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-0-NRE_C]": 0.242019707991858, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-1-NLE_A]": 0.6489452500100015, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-1-NPE_C]": 1.7187838749960065, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-1-NRE_A]": 0.2511869170120917, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-1-NRE_B]": 0.23344758398889098, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-1-NRE_C]": 0.2317223329882836, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-2-NLE_A]": 0.8947466669924324, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-2-NPE_C]": 3.4529450010013534, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-2-NRE_A]": 0.3478045410156483, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-2-NRE_B]": 0.37359179100894835, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-proposal-2-NRE_C]": 0.34728437500598375, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-0-NLE_A]": 0.755623667006148, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-0-NPE_C]": 1.7656790409819223, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-0-NRE_A]": 0.2452213749929797, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-0-NRE_B]": 0.25106408399005886, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-0-NRE_C]": 0.25224212401371915, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-1-NLE_A]": 0.7692049589968519, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-1-NPE_C]": 1.8491967090085382, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-1-NRE_A]": 0.24342050001723692, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-1-NRE_B]": 0.24938429100438952, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-1-NRE_C]": 0.25048325101670343, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-2-NLE_A]": 1.2541027089901036, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-2-NPE_C]": 4.084792249996099, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-2-NRE_A]": 0.39988458300649654, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-2-NRE_B]": 0.4054148750001332, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape1-resample-2-NRE_C]": 0.39539495897770394, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-0-NLE_A]": 0.8387073740013875, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-0-NPE_C]": 2.2838170420145616, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-0-NRE_A]": 0.2774911249871366, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-0-NRE_B]": 0.28056200001446996, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-0-NRE_C]": 0.2881142499973066, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-1-NLE_A]": 0.8378451249882346, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-1-NPE_C]": 2.2742419580026763, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-1-NRE_A]": 0.2800626660027774, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-1-NRE_B]": 0.28236645899596624, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-1-NRE_C]": 0.2891687910014298, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-2-NLE_A]": 0.9966336250072345, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-2-NPE_C]": 3.366259958012961, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-2-NRE_A]": 0.38015262701082975, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-2-NRE_B]": 0.38848912599496543, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-proposal-2-NRE_C]": 0.38044187502237037, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-0-NLE_A]": 1.0367743329843506, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-0-NPE_C]": 2.780751373997191, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-0-NRE_A]": 0.30972720800491516, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-0-NRE_B]": 0.29769120800483506, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-0-NRE_C]": 0.3291803339816397, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-1-NLE_A]": 1.0285035419947235, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-1-NPE_C]": 2.7956420830014395, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-1-NRE_A]": 0.30753645798540674, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-1-NRE_B]": 0.30136595900694374, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-1-NRE_C]": 0.3326830830046674, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-2-NLE_A]": 1.273727207983029, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-2-NPE_C]": 3.824388708002516, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-2-NRE_A]": 0.43131670901493635, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-2-NRE_B]": 0.43288700000266545, + "tests/posterior_nn_test.py::test_batched_mcmc_sample_log_prob_with_different_x[sample_shape2-resample-2-NRE_C]": 0.43212416701135226, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[mvn-0-NPE_A]": 0.043310459019267, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[mvn-0-NPE_C]": 0.15229916697717272, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[mvn-1-NPE_A]": 0.044432376002077945, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[mvn-1-NPE_C]": 0.15297879200079478, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[mvn-2-NPE_A]": 0.15324487500765827, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[mvn-2-NPE_C]": 0.2083301249804208, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[uniform-0-NPE_A]": 0.0449018750077812, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[uniform-0-NPE_C]": 0.2466677929915022, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[uniform-1-NPE_A]": 0.04544570801954251, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[uniform-1-NPE_C]": 0.25470558198867366, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[uniform-2-NPE_A]": 0.0470947509893449, + "tests/posterior_nn_test.py::test_batched_sample_log_prob_with_different_x[uniform-2-NPE_C]": 0.4060890010005096, + "tests/posterior_nn_test.py::test_importance_posterior_sample_log_prob[NLE_A]": 0.11712162400363013, + "tests/posterior_nn_test.py::test_importance_posterior_sample_log_prob[NPE_A]": 0.04830808500992134, + "tests/posterior_nn_test.py::test_importance_posterior_sample_log_prob[NPE_C]": 0.11835799999244045, + "tests/posterior_nn_test.py::test_importance_posterior_sample_log_prob[NRE_A]": 0.057523790979757905, + "tests/posterior_nn_test.py::test_importance_posterior_sample_log_prob[NRE_B]": 0.0770196249941364, + "tests/posterior_nn_test.py::test_importance_posterior_sample_log_prob[NRE_C]": 0.10491958299826365, + "tests/posterior_nn_test.py::test_log_prob_with_different_x[0-NPE_A]": 0.04778066602011677, + "tests/posterior_nn_test.py::test_log_prob_with_different_x[0-NPE_C]": 0.1264223329926608, + "tests/posterior_nn_test.py::test_log_prob_with_different_x[1-NPE_A]": 0.042904084009933285, + "tests/posterior_nn_test.py::test_log_prob_with_different_x[1-NPE_C]": 0.12047395901754498, + "tests/posterior_nn_test.py::test_log_prob_with_different_x[2-NPE_A]": 0.04049012500036042, + "tests/posterior_nn_test.py::test_log_prob_with_different_x[2-NPE_C]": 0.08905295800650492, + "tests/posterior_sampler_test.py::test_api_posterior_sampler_set[1-hmc_pymc]": 0.21804487599001732, + "tests/posterior_sampler_test.py::test_api_posterior_sampler_set[1-hmc_pyro]": 0.5609832930058474, + "tests/posterior_sampler_test.py::test_api_posterior_sampler_set[1-nuts_pymc]": 0.22731645898602437, + "tests/posterior_sampler_test.py::test_api_posterior_sampler_set[1-nuts_pyro]": 0.33471887500490993, + "tests/posterior_sampler_test.py::test_api_posterior_sampler_set[1-slice_np]": 0.807430499990005, + "tests/posterior_sampler_test.py::test_api_posterior_sampler_set[1-slice_np_vectorized]": 1.1150797499867622, + "tests/posterior_sampler_test.py::test_api_posterior_sampler_set[1-slice_pymc]": 0.31031795899616554, + "tests/potential_test.py::test_callable_potential[ImportanceSamplingPosterior]": 0.03682812499755528, + "tests/potential_test.py::test_callable_potential[MCMCPosterior]": 0.6320653329894412, + "tests/potential_test.py::test_callable_potential[RejectionPosterior]": 0.03862820801441558, + "tests/potential_test.py::test_callable_potential[VIPosterior]": 0.5116349170129979, + "tests/potential_test.py::test_conditioned_potential[condition0]": 0.0007952919841045514, + "tests/potential_test.py::test_conditioned_potential[condition1]": 0.0006567079981323332, + "tests/pyroutils_test.py::test_unbounded_transform": 0.0013489579869201407, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape0-theta_shape0-RatioEstimator]": 0.0011155830143252388, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape0-theta_shape1-RatioEstimator]": 0.0009761260007508099, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape0-theta_shape2-RatioEstimator]": 0.0009663749951869249, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape0-theta_shape3-RatioEstimator]": 0.0009482930036028847, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape0-theta_shape4-RatioEstimator]": 0.0023150830093072727, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape0-theta_shape5-RatioEstimator]": 0.0026592919894028455, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape0-theta_shape6-RatioEstimator]": 0.002859376007108949, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape1-theta_shape0-RatioEstimator]": 0.0009603329963283613, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape1-theta_shape1-RatioEstimator]": 0.0009225829999195412, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape1-theta_shape2-RatioEstimator]": 0.0009599589975550771, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape1-theta_shape3-RatioEstimator]": 0.0010463750077178702, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape1-theta_shape4-RatioEstimator]": 0.0024205419758800417, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape1-theta_shape5-RatioEstimator]": 0.0025141660153167322, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape1-theta_shape6-RatioEstimator]": 0.002774332999251783, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape2-theta_shape0-RatioEstimator]": 0.0009790000185603276, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape2-theta_shape1-RatioEstimator]": 0.0009639180061640218, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape2-theta_shape2-RatioEstimator]": 0.0010648750176187605, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape2-theta_shape3-RatioEstimator]": 0.0009783750138012692, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape2-theta_shape4-RatioEstimator]": 0.0020337489986559376, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape2-theta_shape5-RatioEstimator]": 0.002564082999015227, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape2-theta_shape6-RatioEstimator]": 0.002619207982206717, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape3-theta_shape0-RatioEstimator]": 0.0009542089974274859, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape3-theta_shape1-RatioEstimator]": 0.0009375010122312233, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape3-theta_shape2-RatioEstimator]": 0.0009282919927500188, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape3-theta_shape3-RatioEstimator]": 0.0009215409954776987, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape3-theta_shape4-RatioEstimator]": 0.0019289580086478963, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape3-theta_shape5-RatioEstimator]": 0.0024126250064000487, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape3-theta_shape6-RatioEstimator]": 0.0027007089811377227, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape4-theta_shape0-RatioEstimator]": 0.0019470010156510398, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape4-theta_shape1-RatioEstimator]": 0.0018985830101883039, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape4-theta_shape2-RatioEstimator]": 0.0019991250155726448, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape4-theta_shape3-RatioEstimator]": 0.0018947899952763692, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape4-theta_shape4-RatioEstimator]": 0.002874957994208671, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape4-theta_shape5-RatioEstimator]": 0.0033282490185229108, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape4-theta_shape6-RatioEstimator]": 0.003682958005811088, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape5-theta_shape0-RatioEstimator]": 0.0023771669948473573, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape5-theta_shape1-RatioEstimator]": 0.0023715830029686913, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape5-theta_shape2-RatioEstimator]": 0.0024270830035675317, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape5-theta_shape3-RatioEstimator]": 0.0024486259935656562, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape5-theta_shape4-RatioEstimator]": 0.0035082500107819214, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape5-theta_shape5-RatioEstimator]": 0.005431416982901283, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape5-theta_shape6-RatioEstimator]": 0.0049011260125553235, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape6-theta_shape0-RatioEstimator]": 0.0027613749989541247, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape6-theta_shape1-RatioEstimator]": 0.003690042009111494, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape6-theta_shape2-RatioEstimator]": 0.00297300101374276, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape6-theta_shape3-RatioEstimator]": 0.0029198340052971616, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape6-theta_shape4-RatioEstimator]": 0.003903166012605652, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape6-theta_shape5-RatioEstimator]": 0.0045831259922124445, + "tests/ratio_estimator_test.py::test_api_ratio_estimator[x_shape6-theta_shape6-RatioEstimator]": 0.004778082991833799, + "tests/save_and_load_test.py::test_picklability[NLE_A-mcmc]": 1.6338918319961522, + "tests/save_and_load_test.py::test_picklability[NPE_C-direct]": 0.10712787399825174, + "tests/save_and_load_test.py::test_picklability[NRE_B-mcmc]": 0.5886642079858575, + "tests/save_and_load_test.py::test_picklability[NRE_B-rejection]": 0.17813841698807664, + "tests/save_and_load_test.py::test_picklability[NRE_B-vi]": 0.4226386240043212, + "tests/sbc_test.py::test_running_sbc[NLE_A-mcmc-boxuniform-marginals]": 0.8281676250189776, + "tests/sbc_test.py::test_running_sbc[NLE_A-mcmc-boxuniform-posterior_log_prob]": 0.8440078329731477, + "tests/sbc_test.py::test_running_sbc[NLE_A-mcmc-independent-marginals]": 0.9869349169894122, + "tests/sbc_test.py::test_running_sbc[NLE_A-mcmc-independent-posterior_log_prob]": 0.9822380410187179, + "tests/sbc_test.py::test_running_sbc[NLE_A-vi-boxuniform-marginals]": 1.8840904999960912, + "tests/sbc_test.py::test_running_sbc[NLE_A-vi-boxuniform-posterior_log_prob]": 1.8906392080098158, + "tests/sbc_test.py::test_running_sbc[NLE_A-vi-independent-marginals]": 2.3157996670197463, + "tests/sbc_test.py::test_running_sbc[NLE_A-vi-independent-posterior_log_prob]": 2.3905293330026325, + "tests/sbc_test.py::test_running_sbc[NPE_C-None-boxuniform-marginals]": 1.4089680000033695, + "tests/sbc_test.py::test_running_sbc[NPE_C-None-boxuniform-posterior_log_prob]": 1.4148213749867864, + "tests/sbc_test.py::test_running_sbc[NPE_C-None-independent-marginals]": 1.0912427910079714, + "tests/sbc_test.py::test_running_sbc[NPE_C-None-independent-posterior_log_prob]": 1.068198331995518, + "tests/sbc_test.py::test_running_sbc[NPSE-None-boxuniform-marginals]": 1.6169386239926098, + "tests/sbc_test.py::test_running_sbc[NPSE-None-boxuniform-posterior_log_prob]": 6.836484874016605, + "tests/sbc_test.py::test_running_sbc[NPSE-None-independent-marginals]": 1.5320008330163546, + "tests/sbc_test.py::test_running_sbc[NPSE-None-independent-posterior_log_prob]": 6.587297543010209, + "tests/sbc_test.py::test_sbc_accuracy": 3.8728578750015004, + "tests/sbc_test.py::test_sbc_plotting[1-None-cdf-30]": 0.03168333299981896, + "tests/sbc_test.py::test_sbc_plotting[1-None-cdf-None]": 0.04340237499854993, + "tests/sbc_test.py::test_sbc_plotting[1-None-hist-30]": 0.03337204098352231, + "tests/sbc_test.py::test_sbc_plotting[1-None-hist-None]": 0.04309016700426582, + "tests/sbc_test.py::test_sbc_plotting[1-legend_kwargs1-cdf-30]": 0.03179158200509846, + "tests/sbc_test.py::test_sbc_plotting[1-legend_kwargs1-cdf-None]": 0.04137391700351145, + "tests/sbc_test.py::test_sbc_plotting[1-legend_kwargs1-hist-30]": 0.03368837499874644, + "tests/sbc_test.py::test_sbc_plotting[1-legend_kwargs1-hist-None]": 0.042647083988413215, + "tests/sbc_test.py::test_sbc_plotting[2-None-cdf-30]": 0.05340999900363386, + "tests/sbc_test.py::test_sbc_plotting[2-None-cdf-None]": 0.07314391800900921, + "tests/sbc_test.py::test_sbc_plotting[2-None-hist-30]": 0.05066904101113323, + "tests/sbc_test.py::test_sbc_plotting[2-None-hist-None]": 0.06659437400230672, + "tests/sbc_test.py::test_sbc_plotting[2-legend_kwargs1-cdf-30]": 0.05148549999285024, + "tests/sbc_test.py::test_sbc_plotting[2-legend_kwargs1-cdf-None]": 0.07200000000011642, + "tests/sbc_test.py::test_sbc_plotting[2-legend_kwargs1-hist-30]": 0.050436416000593454, + "tests/sbc_test.py::test_sbc_plotting[2-legend_kwargs1-hist-None]": 0.18139925099967513, + "tests/sbiutils_test.py::test_average_cond_coeff_matrix": 0.008855958003550768, + "tests/sbiutils_test.py::test_conditional_corrcoeff[0.0]": 0.003874667003401555, + "tests/sbiutils_test.py::test_conditional_corrcoeff[0.95]": 0.004248417011694983, + "tests/sbiutils_test.py::test_conditional_corrcoeff[0.99]": 0.0041642090218374506, + "tests/sbiutils_test.py::test_conditional_density_1d": 0.0017637080018175766, + "tests/sbiutils_test.py::test_conditional_density_2d": 0.0031022919865790755, + "tests/sbiutils_test.py::test_conditional_pairplot": 0.025047916002222337, + "tests/sbiutils_test.py::test_gaussian_transforms[snpe_a]": 0.013052209003944881, + "tests/sbiutils_test.py::test_gaussian_transforms[snpe_c]": 0.01267016700876411, + "tests/sbiutils_test.py::test_kde[cv-False-None]": 0.13170158299908508, + "tests/sbiutils_test.py::test_kde[cv-False-transform1]": 0.13166250199719798, + "tests/sbiutils_test.py::test_kde[cv-False-transform2]": 0.1307563750015106, + "tests/sbiutils_test.py::test_kde[cv-True-None]": 0.13252612501673866, + "tests/sbiutils_test.py::test_kde[cv-True-transform1]": 0.1328635399986524, + "tests/sbiutils_test.py::test_kde[cv-True-transform2]": 0.13298029098950792, + "tests/sbiutils_test.py::test_kde[scott-False-None]": 0.0009873749950202182, + "tests/sbiutils_test.py::test_kde[scott-False-transform1]": 0.000982291006948799, + "tests/sbiutils_test.py::test_kde[scott-False-transform2]": 0.0009814160002861172, + "tests/sbiutils_test.py::test_kde[scott-True-None]": 0.0014426680136239156, + "tests/sbiutils_test.py::test_kde[scott-True-transform1]": 0.001356459004455246, + "tests/sbiutils_test.py::test_kde[scott-True-transform2]": 0.0013552499876823276, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-False-False]": 0.0015594580036122352, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-False-None]": 0.0012687090056715533, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-False-True]": 0.00203462500940077, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-False-independent]": 0.002033042997936718, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-False-none]": 0.001221957994857803, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-False-structured]": 0.0018509990040911362, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-None-False]": 0.0012225009995745495, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-None-None]": 0.001220874983118847, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-None-True]": 0.0020185840112389997, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-None-independent]": 0.0021200839983066544, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-None-none]": 0.001201706996653229, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-None-structured]": 0.0019052489951718599, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-True-False]": 0.002146000013453886, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-True-None]": 0.002053250005701557, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-True-True]": 0.003797541983658448, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-True-independent]": 0.0028214589838171378, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-True-none]": 0.002233416002127342, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-True-structured]": 0.002742498996667564, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-independent-False]": 0.002025042980676517, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-independent-None]": 0.002022417014813982, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-independent-True]": 0.0027747090061893687, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-independent-independent]": 0.003058334012166597, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-independent-none]": 0.0020127489988226444, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-independent-structured]": 0.002632250005262904, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-none-False]": 0.001789833011571318, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-none-None]": 0.0012223339872434735, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-none-True]": 0.0020187900081509724, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-none-independent]": 0.0021170829859329388, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-none-none]": 0.001209251000545919, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-none-structured]": 0.0019227919838158414, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-structured-False]": 0.001874250010587275, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-structured-None]": 0.0018907080084318295, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-structured-True]": 0.0026160419802181423, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-structured-independent]": 0.002645417014718987, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-structured-none]": 0.001847999999881722, + "tests/sbiutils_test.py::test_z_scoring_structured[classifier_nn-structured-structured]": 0.0024672919826116413, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-False-False]": 0.1953412489965558, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-False-None]": 0.19575195800280198, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-False-True]": 0.1961785829917062, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-False-independent]": 0.19913233400438912, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-False-none]": 0.19741212399094366, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-False-structured]": 0.1975157080014469, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-None-False]": 0.1975841660023434, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-None-None]": 0.19525904100737534, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-None-True]": 0.19786300000851043, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-None-independent]": 0.1963967089977814, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-None-none]": 0.19598449900513515, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-None-structured]": 0.19576175000111107, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-True-False]": 0.1968574580096174, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-True-None]": 0.19581945800746325, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-True-True]": 0.2089322079991689, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-True-independent]": 0.1965877089969581, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-True-none]": 0.19671904201095458, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-True-structured]": 0.19672970799729228, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-independent-False]": 0.19568729100865312, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-independent-None]": 0.19710841598862316, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-independent-True]": 0.19713833399873693, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-independent-independent]": 0.1967656250053551, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-independent-none]": 0.19698804098879918, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-independent-structured]": 0.19657229201402515, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-none-False]": 0.19481500101392157, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-none-None]": 0.1949108749977313, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-none-True]": 0.19638949999352917, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-none-independent]": 0.19618987600551918, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-none-none]": 0.19542012600868475, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-none-structured]": 0.19588779199693818, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-structured-False]": 0.19523962499806657, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-structured-None]": 0.19530737400054932, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-structured-True]": 0.19649350001418497, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-structured-independent]": 0.1973165829986101, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-structured-none]": 0.19647962399176322, + "tests/sbiutils_test.py::test_z_scoring_structured[likelihood_nn-structured-structured]": 0.19746020800084807, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-False-False]": 0.19562316700466909, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-False-None]": 0.1958980839990545, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-False-True]": 0.19705966699984856, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-False-independent]": 0.1963634579878999, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-False-none]": 0.19537241697253194, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-False-structured]": 0.19946491700829938, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-None-False]": 0.1966866259899689, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-None-None]": 0.19598633400164545, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-None-True]": 0.19775004200346302, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-None-independent]": 0.19766208199143875, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-None-none]": 0.19704779298626818, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-None-structured]": 0.1987102910206886, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-True-False]": 0.1969888759922469, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-True-None]": 0.19606750099046621, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-True-True]": 0.19762216600065585, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-True-independent]": 0.19736937500420026, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-True-none]": 0.19712012600211892, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-True-structured]": 0.1968596249789698, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-independent-False]": 0.19713529098953586, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-independent-None]": 0.1984267919906415, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-independent-True]": 0.1976487499923678, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-independent-independent]": 0.19987566699273884, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-independent-none]": 0.19870062499830965, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-independent-structured]": 0.20381529199949, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-none-False]": 0.19666170800337568, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-none-None]": 0.19584470898553263, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-none-True]": 0.19815658300649375, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-none-independent]": 0.19753045900142752, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-none-none]": 0.19714220800960902, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-none-structured]": 0.19707829199614935, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-structured-False]": 0.19864575000246987, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-structured-None]": 0.20038345801003743, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-structured-True]": 0.20116208399122115, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-structured-independent]": 0.201184457007912, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-structured-none]": 0.19818816700717434, + "tests/sbiutils_test.py::test_z_scoring_structured[posterior_nn-structured-structured]": 0.1995168330031447, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-1-subvp]": 0.0023697069991612807, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-1-ve]": 0.0022401660098694265, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-1-vp]": 0.0024004169972613454, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-2-subvp]": 0.0023397079930873588, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-2-ve]": 0.0025892479898175225, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-2-vp]": 0.0023668340145377442, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-1-subvp]": 0.0024907079932745546, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-1-ve]": 0.002355833988985978, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-1-vp]": 0.002566957991803065, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-2-subvp]": 0.00242625099781435, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-2-ve]": 0.0023190000210888684, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-2-vp]": 0.002439542004140094, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-1-subvp]": 0.0025303329894086346, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-1-ve]": 0.00242008401255589, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-1-vp]": 0.0025529159902362153, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-2-subvp]": 0.002533042003051378, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-2-ve]": 0.0024627910170238465, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-2-vp]": 0.0025263339921366423, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-1-subvp]": 0.0026196669787168503, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-1-ve]": 0.0025354590034112334, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-1-vp]": 0.0026259990117978305, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-2-subvp]": 0.002749291990767233, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-2-ve]": 0.0027335829799994826, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-2-vp]": 0.0026294179988326505, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-1-subvp]": 0.002496125001925975, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-1-ve]": 0.0023806669778423384, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-1-vp]": 0.003213916003005579, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-2-subvp]": 0.002462750009726733, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-2-ve]": 0.002392249007243663, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-2-vp]": 0.002494000000297092, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-1-subvp]": 0.0027736249758163467, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-1-ve]": 0.0024297920026583597, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-1-vp]": 0.0025571250007487833, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-2-subvp]": 0.0026129999750992283, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-2-ve]": 0.0026122090057469904, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-2-vp]": 0.00288845798058901, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-1-subvp]": 0.0035887509875465184, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-1-ve]": 0.0026430009893374518, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-1-vp]": 0.0027388330054236576, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-2-subvp]": 0.0029766240040771663, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-2-ve]": 0.002784790995065123, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-2-vp]": 0.002881207983591594, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-1-subvp]": 0.002820333989802748, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-1-ve]": 0.005977376000373624, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-1-vp]": 0.004125083010876551, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-2-subvp]": 0.0027606660005403683, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-2-ve]": 0.0026785010122694075, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-2-vp]": 0.002785958000458777, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape0-1-subvp]": 0.0015944580227369443, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape0-1-ve]": 0.0015397929964819923, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape0-1-vp]": 0.0015819999971427023, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape0-2-subvp]": 0.0016042910137912259, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape0-2-ve]": 0.001456208003219217, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape0-2-vp]": 0.0016135410114657134, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape1-1-subvp]": 0.0016975000035017729, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape1-1-ve]": 0.0015880840073805302, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape1-1-vp]": 0.0016834169946378097, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape1-2-subvp]": 0.001673584003583528, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape1-2-ve]": 0.0015346250147558749, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape0-input_event_shape1-2-vp]": 0.0019447090162429959, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape0-1-subvp]": 0.001777457000571303, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape0-1-ve]": 0.0016775419790064916, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape0-1-vp]": 0.0017681669851299375, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape0-2-subvp]": 0.0018348339799558744, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape0-2-ve]": 0.0017045000131474808, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape0-2-vp]": 0.0018534159898990765, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape1-1-subvp]": 0.0019043340143980458, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape1-1-ve]": 0.0017790419806260616, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape1-1-vp]": 0.0018548330263001844, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape1-2-subvp]": 0.0019279579864814878, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape1-2-ve]": 0.0017499579989816993, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-1-condition_event_shape1-input_event_shape1-2-vp]": 0.0019928749970858917, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape0-1-subvp]": 0.0015634580049663782, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape0-1-ve]": 0.0015315420168917626, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape0-1-vp]": 0.001596165995579213, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape0-2-subvp]": 0.0019645430002128705, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape0-2-ve]": 0.0015345830033766106, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape0-2-vp]": 0.0023566680029034615, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape1-1-subvp]": 0.0016937090113060549, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape1-1-ve]": 0.0016712090000510216, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape1-1-vp]": 0.0018415410013403744, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape1-2-subvp]": 0.0017949999892152846, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape1-2-ve]": 0.0015472079830942675, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape0-input_event_shape1-2-vp]": 0.002389665984082967, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape0-1-subvp]": 0.0017884159897221252, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape0-1-ve]": 0.0017985409795073792, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape0-1-vp]": 0.0018028339982265607, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape0-2-subvp]": 0.001998250008909963, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape0-2-ve]": 0.0017011260060826316, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape0-2-vp]": 0.001896708010463044, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape1-1-subvp]": 0.0019884590001311153, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape1-1-ve]": 0.0018187919922638685, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape1-1-vp]": 0.0019920409977203235, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape1-2-subvp]": 0.001959083994734101, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape1-2-ve]": 0.0018902909941971302, + "tests/score_estimator_test.py::test_score_estimator_forward_shapes[mlp-10-condition_event_shape1-input_event_shape1-2-vp]": 0.002080874008242972, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-1-subvp]": 0.0024875410163076594, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-1-ve]": 0.0023391249851556495, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-1-vp]": 0.0025910009862855077, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-2-subvp]": 0.002421083001536317, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-2-ve]": 0.0025929999828804284, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape0-2-vp]": 0.00252541498048231, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-1-subvp]": 0.002493415988283232, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-1-ve]": 0.0023443339887307957, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-1-vp]": 0.002490666985977441, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-2-subvp]": 0.0025209159939549863, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-2-ve]": 0.002337708996492438, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape0-input_event_shape1-2-vp]": 0.002486417011823505, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-1-subvp]": 0.0027912919904338196, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-1-ve]": 0.0026761250046547502, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-1-vp]": 0.0041947499848902225, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-2-subvp]": 0.002784334006719291, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-2-ve]": 0.0026002099766628817, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape0-2-vp]": 0.0027870000194525346, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-1-subvp]": 0.0027777089999290183, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-1-ve]": 0.002560292006819509, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-1-vp]": 0.0027202920173294842, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-2-subvp]": 0.0027459159900899976, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-2-ve]": 0.002699167001992464, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-1-condition_event_shape1-input_event_shape1-2-vp]": 0.0027483320009196177, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-1-subvp]": 0.00267558399355039, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-1-ve]": 0.0025154589966405183, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-1-vp]": 0.0025880419998429716, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-2-subvp]": 0.00268583299475722, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-2-ve]": 0.002591706987004727, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape0-2-vp]": 0.0025624999980209395, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-1-subvp]": 0.002713832989684306, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-1-ve]": 0.0025820830051088706, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-1-vp]": 0.0026611670036800206, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-2-subvp]": 0.0026766249939100817, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-2-ve]": 0.002935791009804234, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape0-input_event_shape1-2-vp]": 0.0026894989860011265, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-1-subvp]": 0.002856457998859696, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-1-ve]": 0.002798540983349085, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-1-vp]": 0.0027615839935606346, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-2-subvp]": 0.002864625013899058, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-2-ve]": 0.0027354170015314594, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape0-2-vp]": 0.0028632080066017807, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-1-subvp]": 0.0029374589794315398, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-1-ve]": 0.002804916992317885, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-1-vp]": 0.002894123987061903, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-2-subvp]": 0.002923791005741805, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-2-ve]": 0.0033684999943943694, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[ada_mlp-10-condition_event_shape1-input_event_shape1-2-vp]": 0.0029102499975124374, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape0-1-subvp]": 0.0016667920135660097, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape0-1-ve]": 0.0015995839930837974, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape0-1-vp]": 0.0018505829939385876, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape0-2-subvp]": 0.0017037079960573465, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape0-2-ve]": 0.0014928330056136474, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape0-2-vp]": 0.0017035829951055348, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape1-1-subvp]": 0.0018066659977193922, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape1-1-ve]": 0.0018509990040911362, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape1-1-vp]": 0.0017403759993612766, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape1-2-subvp]": 0.0017845409893197939, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape1-2-ve]": 0.0016029590042307973, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape0-input_event_shape1-2-vp]": 0.0019482079951558262, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape0-1-subvp]": 0.0018561249889899045, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape0-1-ve]": 0.0017406669940100983, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape0-1-vp]": 0.0018442089931340888, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape0-2-subvp]": 0.0018956669955514371, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape0-2-ve]": 0.0016932499856920913, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape0-2-vp]": 0.0019082079961663112, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape1-1-subvp]": 0.0019409999949857593, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape1-1-ve]": 0.0018428759940434247, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape1-1-vp]": 0.0019377499993424863, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape1-2-subvp]": 0.0020084580028196797, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape1-2-ve]": 0.0018051669903798029, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-1-condition_event_shape1-input_event_shape1-2-vp]": 0.001985291004530154, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape0-1-subvp]": 0.001682208981947042, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape0-1-ve]": 0.0015618340112268925, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape0-1-vp]": 0.001662665992625989, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape0-2-subvp]": 0.0017183340096380562, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape0-2-ve]": 0.0015021660074125975, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape0-2-vp]": 0.0017065419960999861, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape1-1-subvp]": 0.0018348750018049031, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape1-1-ve]": 0.0020149579941062257, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape1-1-vp]": 0.0019821669993689284, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape1-2-subvp]": 0.001789707996067591, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape1-2-ve]": 0.0016250409971689805, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape0-input_event_shape1-2-vp]": 0.0022354999819071963, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape0-1-subvp]": 0.0019338340061949566, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape0-1-ve]": 0.0018454999953974038, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape0-1-vp]": 0.001968416996533051, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape0-2-subvp]": 0.0019579170184442773, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape0-2-ve]": 0.0017607909976504743, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape0-2-vp]": 0.0020232500246493146, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape1-1-subvp]": 0.001955542014911771, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape1-1-ve]": 0.0018634169973665848, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape1-1-vp]": 0.002018874976783991, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape1-2-subvp]": 0.002000083011807874, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape1-2-ve]": 0.0018133339908672497, + "tests/score_estimator_test.py::test_score_estimator_loss_shapes[mlp-10-condition_event_shape1-input_event_shape1-2-vp]": 0.0019934589945478365, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-None-euler_maruyama-subvp]": 0.08684312501281966, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-None-euler_maruyama-ve]": 0.05446612401283346, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-None-euler_maruyama-vp]": 0.08049912501883227, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-gibbs-euler_maruyama-subvp]": 0.6134049169777427, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-gibbs-euler_maruyama-ve]": 0.3731818330124952, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-gibbs-euler_maruyama-vp]": 0.5704887089959811, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-langevin-euler_maruyama-subvp]": 0.39119395801390056, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-langevin-euler_maruyama-ve]": 0.2504696249816334, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape0-langevin-euler_maruyama-vp]": 0.40330650001124013, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-None-euler_maruyama-subvp]": 0.10999149999406654, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-None-euler_maruyama-ve]": 0.07916450100310612, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-None-euler_maruyama-vp]": 0.10576520899485331, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-gibbs-euler_maruyama-subvp]": 0.8371208739990834, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-gibbs-euler_maruyama-ve]": 0.5972449999972014, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-gibbs-euler_maruyama-vp]": 0.7775317920022644, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-langevin-euler_maruyama-subvp]": 0.5445945000101347, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-langevin-euler_maruyama-ve]": 0.3919867499935208, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1--1.0-input_event_shape1-langevin-euler_maruyama-vp]": 0.5428249169926858, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-None-euler_maruyama-subvp]": 0.08731537399580702, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-None-euler_maruyama-ve]": 0.05477041700214613, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-None-euler_maruyama-vp]": 0.08262937499966938, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-gibbs-euler_maruyama-subvp]": 0.611113375009154, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-gibbs-euler_maruyama-ve]": 0.3704808750189841, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-gibbs-euler_maruyama-vp]": 0.5518049169913866, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-langevin-euler_maruyama-subvp]": 0.3915289160213433, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-langevin-euler_maruyama-ve]": 0.2570226240059128, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape0-langevin-euler_maruyama-vp]": 0.39518258298630826, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-None-euler_maruyama-subvp]": 0.10877095801697578, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-None-euler_maruyama-ve]": 0.07762075000209734, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-None-euler_maruyama-vp]": 0.10549704100412782, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-gibbs-euler_maruyama-subvp]": 0.8381372080039, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-gibbs-euler_maruyama-ve]": 0.599279583999305, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-gibbs-euler_maruyama-vp]": 0.780266666028183, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-langevin-euler_maruyama-subvp]": 0.5457688349997625, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-langevin-euler_maruyama-ve]": 0.39222583398805, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-0.0-input_event_shape1-langevin-euler_maruyama-vp]": 0.544958416983718, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-None-euler_maruyama-subvp]": 0.08659195699146949, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-None-euler_maruyama-ve]": 0.05592199901002459, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-None-euler_maruyama-vp]": 0.08271795799373649, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-gibbs-euler_maruyama-subvp]": 0.6019799159985268, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-gibbs-euler_maruyama-ve]": 0.3790201249939855, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-gibbs-euler_maruyama-vp]": 0.5459360829991056, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-langevin-euler_maruyama-subvp]": 0.3902002499962691, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-langevin-euler_maruyama-ve]": 0.2519209579913877, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape0-langevin-euler_maruyama-vp]": 0.41189595800824463, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-None-euler_maruyama-subvp]": 0.11043508401780855, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-None-euler_maruyama-ve]": 0.07816620900121052, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-None-euler_maruyama-vp]": 0.10568158299429342, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-gibbs-euler_maruyama-subvp]": 0.8524085829994874, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-gibbs-euler_maruyama-ve]": 0.5962141250056447, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-gibbs-euler_maruyama-vp]": 0.7785440420266241, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-langevin-euler_maruyama-subvp]": 0.5453882070141844, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-langevin-euler_maruyama-ve]": 0.3970999579905765, + "tests/score_samplers_test.py::test_gaussian_score_sampling[0.1-1.0-input_event_shape1-langevin-euler_maruyama-vp]": 0.5484834159869934, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-None-euler_maruyama-subvp]": 0.08634825001354329, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-None-euler_maruyama-ve]": 0.05681979199289344, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-None-euler_maruyama-vp]": 0.08501900000555906, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-gibbs-euler_maruyama-subvp]": 0.594435833991156, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-gibbs-euler_maruyama-ve]": 0.3826922499865759, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-gibbs-euler_maruyama-vp]": 0.5475831669900799, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-langevin-euler_maruyama-subvp]": 0.38813825001125224, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-langevin-euler_maruyama-ve]": 0.24877458301489241, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape0-langevin-euler_maruyama-vp]": 0.39249224998638965, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-None-euler_maruyama-subvp]": 0.11205675000383053, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-None-euler_maruyama-ve]": 0.07990083401091397, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-None-euler_maruyama-vp]": 0.10683412500657141, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-gibbs-euler_maruyama-subvp]": 0.8360640820028493, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-gibbs-euler_maruyama-ve]": 0.5995648749958491, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-gibbs-euler_maruyama-vp]": 0.7802541669952916, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-langevin-euler_maruyama-subvp]": 0.5418262519669952, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-langevin-euler_maruyama-ve]": 0.3961007929901825, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0--1.0-input_event_shape1-langevin-euler_maruyama-vp]": 0.5430696660041576, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-None-euler_maruyama-subvp]": 0.08876437500293832, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-None-euler_maruyama-ve]": 0.054632958010188304, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-None-euler_maruyama-vp]": 0.08413445799669717, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-gibbs-euler_maruyama-subvp]": 0.5959592079889262, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-gibbs-euler_maruyama-ve]": 0.3770951260084985, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-gibbs-euler_maruyama-vp]": 0.5520624999917345, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-langevin-euler_maruyama-subvp]": 0.39271324999572244, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-langevin-euler_maruyama-ve]": 0.2534159170027124, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape0-langevin-euler_maruyama-vp]": 0.3929708329960704, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-None-euler_maruyama-subvp]": 0.11000891798175871, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-None-euler_maruyama-ve]": 0.07792516599874943, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-None-euler_maruyama-vp]": 0.10549845799687319, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-gibbs-euler_maruyama-subvp]": 0.8414544569968712, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-gibbs-euler_maruyama-ve]": 0.5979942510166438, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-gibbs-euler_maruyama-vp]": 0.7811890840093838, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-langevin-euler_maruyama-subvp]": 0.5401739170192741, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-langevin-euler_maruyama-ve]": 0.3937444160110317, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-0.0-input_event_shape1-langevin-euler_maruyama-vp]": 0.5457026249932824, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-None-euler_maruyama-subvp]": 0.0854786679847166, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-None-euler_maruyama-ve]": 0.05447383401042316, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-None-euler_maruyama-vp]": 0.08114500000374392, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-gibbs-euler_maruyama-subvp]": 0.6066972920089029, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-gibbs-euler_maruyama-ve]": 0.3709110839990899, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-gibbs-euler_maruyama-vp]": 0.5413471659994684, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-langevin-euler_maruyama-subvp]": 0.3873476250009844, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-langevin-euler_maruyama-ve]": 0.25532066699815914, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape0-langevin-euler_maruyama-vp]": 0.3931014589907136, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-None-euler_maruyama-subvp]": 0.10963979197549634, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-None-euler_maruyama-ve]": 0.07770329098275397, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-None-euler_maruyama-vp]": 0.1073070000129519, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-gibbs-euler_maruyama-subvp]": 0.8420025009982055, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-gibbs-euler_maruyama-ve]": 0.5965435409889324, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-gibbs-euler_maruyama-vp]": 0.7807186659920262, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-langevin-euler_maruyama-subvp]": 0.5418660009891028, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-langevin-euler_maruyama-ve]": 0.3940082920016721, + "tests/score_samplers_test.py::test_gaussian_score_sampling[1.0-1.0-input_event_shape1-langevin-euler_maruyama-vp]": 0.5472431249945657, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-auto_gauss-subvp]": 0.569727290989249, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-auto_gauss-ve]": 0.32888266700319946, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-auto_gauss-vp]": 0.647481166975922, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-fnpe-subvp]": 0.0023795010056346655, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-fnpe-ve]": 0.0020925409917254, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-fnpe-vp]": 0.0026865820109378546, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-gauss-subvp]": 0.029902291993494146, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-gauss-ve]": 0.07661687600193545, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-gauss-vp]": 0.24514724999608006, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-jac_gauss-subvp]": 0.03788708300271537, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-jac_gauss-ve]": 0.0327504989982117, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[1-jac_gauss-vp]": 0.03630174999125302, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-auto_gauss-subvp]": 1.9814804999914486, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-auto_gauss-ve]": 1.5625192080187844, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-auto_gauss-vp]": 2.0613677080109483, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-fnpe-subvp]": 0.0025986259861383587, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-fnpe-ve]": 0.002325958979781717, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-fnpe-vp]": 0.003310707994387485, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-gauss-subvp]": 0.2771608750044834, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-gauss-ve]": 0.27437900099903345, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-gauss-vp]": 0.27751066599739715, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-jac_gauss-subvp]": 0.27787112499936484, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-jac_gauss-ve]": 0.27880087499215733, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[2-jac_gauss-vp]": 0.27081283400184475, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-auto_gauss-subvp]": 6.760090832991409, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-auto_gauss-ve]": 6.210948790991097, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-auto_gauss-vp]": 6.886936291994061, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-fnpe-subvp]": 0.0026296249852748588, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-fnpe-ve]": 0.002279165986692533, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-fnpe-vp]": 0.0029333340207813308, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-gauss-subvp]": 1.1038668749970384, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-gauss-ve]": 1.1941502499830676, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-gauss-vp]": 0.9165680830046767, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-jac_gauss-subvp]": 1.1506301229965175, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-jac_gauss-ve]": 1.1588016679888824, + "tests/score_samplers_test.py::test_score_fn_iid_on_different_priors[3-jac_gauss-vp]": 1.0530795420054346, + "tests/simulator_utils_test.py::test_simulate_in_batches[42--1-0]": 0.0012432090006768703, + "tests/simulator_utils_test.py::test_simulate_in_batches[42--1-10]": 0.0015660419885534793, + "tests/simulator_utils_test.py::test_simulate_in_batches[42--10-0]": 0.0012985409703105688, + "tests/simulator_utils_test.py::test_simulate_in_batches[42--10-10]": 0.0012946669885423034, + "tests/simulator_utils_test.py::test_simulate_in_batches[42-diagonal_linear_gaussian-1-0]": 0.0013032510032644495, + "tests/simulator_utils_test.py::test_simulate_in_batches[42-diagonal_linear_gaussian-1-10]": 0.0016820000018924475, + "tests/simulator_utils_test.py::test_simulate_in_batches[42-diagonal_linear_gaussian-10-0]": 0.0012989579990971833, + "tests/simulator_utils_test.py::test_simulate_in_batches[42-diagonal_linear_gaussian-10-10]": 0.0014379580097738653, + "tests/simulator_utils_test.py::test_simulate_in_batches[None--1-0]": 0.0013070420100120828, + "tests/simulator_utils_test.py::test_simulate_in_batches[None--1-10]": 0.0016161249950528145, + "tests/simulator_utils_test.py::test_simulate_in_batches[None--10-0]": 0.0013113340100971982, + "tests/simulator_utils_test.py::test_simulate_in_batches[None--10-10]": 0.0013203319977037609, + "tests/simulator_utils_test.py::test_simulate_in_batches[None-diagonal_linear_gaussian-1-0]": 0.0025862920156214386, + "tests/simulator_utils_test.py::test_simulate_in_batches[None-diagonal_linear_gaussian-1-10]": 0.001714458005153574, + "tests/simulator_utils_test.py::test_simulate_in_batches[None-diagonal_linear_gaussian-10-0]": 0.0012795819930033758, + "tests/simulator_utils_test.py::test_simulate_in_batches[None-diagonal_linear_gaussian-10-10]": 0.0013314589887158945, + "tests/tarp_test.py::test_check_tarp_correct": 0.0018886670150095597, + "tests/tarp_test.py::test_check_tarp_detect_bias": 0.0022015420254319906, + "tests/tarp_test.py::test_check_tarp_overdispersed": 0.0016807510110083967, + "tests/tarp_test.py::test_check_tarp_underdispersed": 0.0016898760077310726, + "tests/tarp_test.py::test_distances": 0.0016005420038709417, + "tests/tarp_test.py::test_run_tarp_correct[False-l1]": 0.0015738749934826046, + "tests/tarp_test.py::test_run_tarp_correct[False-l2]": 0.0015653329901397228, + "tests/tarp_test.py::test_run_tarp_correct[True-l1]": 0.002181958014261909, + "tests/tarp_test.py::test_run_tarp_correct[True-l2]": 0.001474500008043833, + "tests/tarp_test.py::test_run_tarp_detect_bias[l1]": 0.0024695839965716004, + "tests/tarp_test.py::test_run_tarp_detect_bias[l2]": 0.0025272500060964376, + "tests/tarp_test.py::test_run_tarp_detect_overdispersed[l1]": 0.001554667018353939, + "tests/tarp_test.py::test_run_tarp_detect_overdispersed[l2]": 0.0015312909963540733, + "tests/tarp_test.py::test_run_tarp_detect_underdispersed[l1]": 0.0015293759934138507, + "tests/tarp_test.py::test_run_tarp_detect_underdispersed[l2]": 0.001525208994280547, + "tests/tarp_test.py::test_tarp_plotting[Correct]": 0.016114582991576754, + "tests/tarp_test.py::test_tarp_plotting[None]": 0.013485541989211924, + "tests/torchutils_test.py::TorchUtilsTest::test_logabsdet": 0.0010053340083686635, + "tests/torchutils_test.py::TorchUtilsTest::test_merge_leading_dims": 0.0006564169889315963, + "tests/torchutils_test.py::TorchUtilsTest::test_random_orthogonal": 0.0012925420014653355, + "tests/torchutils_test.py::TorchUtilsTest::test_repeat_rows": 0.0006467500206781551, + "tests/torchutils_test.py::TorchUtilsTest::test_searchsorted": 0.0006739170057699084, + "tests/torchutils_test.py::TorchUtilsTest::test_searchsorted_arbitrary_shape": 0.0006132920098025352, + "tests/torchutils_test.py::TorchUtilsTest::test_split_leading_dim": 0.000683959005982615, + "tests/torchutils_test.py::TorchUtilsTest::test_split_merge_leading_dims_are_consistent": 0.0006248750141821802, + "tests/torchutils_test.py::test_atleast_2d_many": 0.0005567089974647388, + "tests/torchutils_test.py::test_batched_first_of_batch": 0.0005517910030903295, + "tests/torchutils_test.py::test_box_uniform_distribution": 0.0005876659997738898, + "tests/torchutils_test.py::test_dkl_gauss": 0.47745245799887925, + "tests/torchutils_test.py::test_ensure_batch_dim": 0.0005541250138776377, + "tests/torchutils_test.py::test_maybe_add_batch_dim_to_size": 0.0005307919927872717, + "tests/torchutils_test.py::test_process_device[cpu]": 0.0006119579920778051, + "tests/torchutils_test.py::test_process_device[cuda:0]": 0.0005827499990118667, + "tests/torchutils_test.py::test_process_device[cuda]": 0.0007946669938974082, + "tests/torchutils_test.py::test_process_device[gpu]": 0.04453445899707731, + "tests/torchutils_test.py::test_process_device[mps]": 0.0007191670156316832, + "tests/transforms_test.py::test_mcmc_transform[prior0-True]": 0.000997333016130142, + "tests/transforms_test.py::test_mcmc_transform[prior1-True]": 0.0008107089961413294, + "tests/transforms_test.py::test_mcmc_transform[prior2-False]": 0.0007367500220425427, + "tests/transforms_test.py::test_mcmc_transform[prior3-True]": 0.0009287500288337469, + "tests/transforms_test.py::test_mcmc_transform[prior4-True]": 0.0007922910008346662, + "tests/transforms_test.py::test_mcmc_transform[prior5-True]": 0.0008878340013325214, + "tests/transforms_test.py::test_mcmc_transform[prior6-True]": 0.001301165990298614, + "tests/transforms_test.py::test_transforms[prior0-SigmoidTransform]": 0.0008627909992355853, + "tests/transforms_test.py::test_transforms[prior1-SigmoidTransform]": 0.0007015829905867577, + "tests/transforms_test.py::test_transforms[prior2-SigmoidTransform]": 0.0010188750020461157, + "tests/transforms_test.py::test_transforms[prior3-AffineTransform]": 0.0007057069888105616, + "tests/transforms_test.py::test_transforms[prior4-ExpTransform]": 0.0006986259832046926, + "tests/user_input_checks_test.py::test_independent_joint_shapes_and_samples[dists0]": 0.0006537930021295324, + "tests/user_input_checks_test.py::test_independent_joint_shapes_and_samples[dists1]": 0.0006115009891800582, + "tests/user_input_checks_test.py::test_independent_joint_shapes_and_samples[dists2]": 0.0006078329897718504, + "tests/user_input_checks_test.py::test_independent_joint_shapes_and_samples[dists3]": 0.000614999997196719, + "tests/user_input_checks_test.py::test_independent_joint_shapes_and_samples[dists4]": 0.0013092089793644845, + "tests/user_input_checks_test.py::test_independent_joint_shapes_and_samples[dists5]": 0.0014331240090541542, + "tests/user_input_checks_test.py::test_independent_joint_shapes_and_samples[dists6]": 0.0013555000186897814, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[diagonal_linear_gaussian-user_prior0-NPE_A]": 0.013430542006972246, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[diagonal_linear_gaussian-user_prior0-NPE_C]": 0.02799799900094513, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[diagonal_linear_gaussian-user_prior3-NPE_A]": 0.011741874986910261, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[diagonal_linear_gaussian-user_prior3-NPE_C]": 0.02687837499252055, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[diagonal_linear_gaussian-user_prior7-NPE_A]": 0.013429123995592818, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[diagonal_linear_gaussian-user_prior7-NPE_C]": 0.028193208010634407, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[diagonal_linear_gaussian-user_prior8-NPE_A]": 0.012663792993407696, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[diagonal_linear_gaussian-user_prior8-NPE_C]": 0.02645762500469573, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[linear_gaussian_no_batch-user_prior1-NPE_A]": 0.015066291991388425, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[linear_gaussian_no_batch-user_prior1-NPE_C]": 0.03063220900367014, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[linear_gaussian_no_batch-user_prior4-NPE_A]": 0.014859415998216718, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[linear_gaussian_no_batch-user_prior4-NPE_C]": 0.030560792991309427, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[list_simulator-user_prior5-NPE_A]": 0.012185708008473739, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[list_simulator-user_prior5-NPE_C]": 0.02731075100018643, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[numpy_linear_gaussian-user_prior2-NPE_A]": 0.012317415996221825, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[numpy_linear_gaussian-user_prior2-NPE_C]": 0.02732558401476126, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[numpy_linear_gaussian-user_prior6-NPE_A]": 0.011903167003765702, + "tests/user_input_checks_test.py::test_inference_with_user_sbi_problems[numpy_linear_gaussian-user_prior6-NPE_C]": 0.02780241600703448, + "tests/user_input_checks_test.py::test_invalid_inputs": 0.0006639579951297492, + "tests/user_input_checks_test.py::test_passing_custom_density_estimator[MAF]": 0.0014861649833619595, + "tests/user_input_checks_test.py::test_passing_custom_density_estimator[fun]": 0.0015221670182654634, + "tests/user_input_checks_test.py::test_passing_custom_density_estimator[maf]": 0.001783166007953696, + "tests/user_input_checks_test.py::test_passing_custom_density_estimator[nn]": 0.001397584012011066, + "tests/user_input_checks_test.py::test_prepare_sbi_problem[diagonal_linear_gaussian-prior2]": 0.0007342909957515076, + "tests/user_input_checks_test.py::test_prepare_sbi_problem[diagonal_linear_gaussian-prior3]": 0.0007221249979920685, + "tests/user_input_checks_test.py::test_prepare_sbi_problem[diagonal_linear_gaussian-prior5]": 0.0017973320063902065, + "tests/user_input_checks_test.py::test_prepare_sbi_problem[linear_gaussian_no_batch-prior0]": 0.0011337499890942127, + "tests/user_input_checks_test.py::test_prepare_sbi_problem[list_simulator-prior6]": 0.0008325830131070688, + "tests/user_input_checks_test.py::test_prepare_sbi_problem[numpy_linear_gaussian-prior1]": 0.0008876670035533607, + "tests/user_input_checks_test.py::test_prepare_sbi_problem[numpy_linear_gaussian-prior4]": 0.0008724169892957434, + "tests/user_input_checks_test.py::test_prior_wrappers[CustomPriorWrapper-prior0-kwargs0]": 0.0008912080083973706, + "tests/user_input_checks_test.py::test_prior_wrappers[OneDimPriorWrapper-prior2-kwargs2]": 0.0007097510097082704, + "tests/user_input_checks_test.py::test_prior_wrappers[PytorchReturnTypeWrapper-prior1-kwargs1]": 0.0007549580041086301, + "tests/user_input_checks_test.py::test_process_prior[prior0]": 0.0006139169854577631, + "tests/user_input_checks_test.py::test_process_prior[prior10]": 0.0010446670203236863, + "tests/user_input_checks_test.py::test_process_prior[prior11]": 0.0014944579888833687, + "tests/user_input_checks_test.py::test_process_prior[prior1]": 0.0006771660118829459, + "tests/user_input_checks_test.py::test_process_prior[prior2]": 0.0007465409871656448, + "tests/user_input_checks_test.py::test_process_prior[prior3]": 0.0006862500013085082, + "tests/user_input_checks_test.py::test_process_prior[prior4]": 0.0007570839952677488, + "tests/user_input_checks_test.py::test_process_prior[prior5]": 0.0006787509919377044, + "tests/user_input_checks_test.py::test_process_prior[prior6]": 0.0007946670084493235, + "tests/user_input_checks_test.py::test_process_prior[prior7]": 0.0007982510142028332, + "tests/user_input_checks_test.py::test_process_prior[prior8]": 0.0008016669889912009, + "tests/user_input_checks_test.py::test_process_prior[prior9]": 0.0006632490112679079, + "tests/user_input_checks_test.py::test_process_simulator[-prior5-x_shape5]": 0.0006942909967619926, + "tests/user_input_checks_test.py::test_process_simulator[diagonal_linear_gaussian-prior0-x_shape0]": 0.0007071240106597543, + "tests/user_input_checks_test.py::test_process_simulator[diagonal_linear_gaussian-prior1-x_shape1]": 0.0007091679872246459, + "tests/user_input_checks_test.py::test_process_simulator[linear_gaussian_no_batch-prior3-x_shape3]": 0.0010697079997044057, + "tests/user_input_checks_test.py::test_process_simulator[list_simulator-prior4-x_shape4]": 0.0007794160192133859, + "tests/user_input_checks_test.py::test_process_simulator[numpy_linear_gaussian-prior2-x_shape2]": 0.0008044169953791425, + "tests/user_input_checks_test.py::test_process_x[x0-x_shape0]": 0.0005848330038134009, + "tests/user_input_checks_test.py::test_process_x[x1-x_shape1]": 0.0005676260043401271, + "tests/user_input_checks_test.py::test_process_x[x2-x_shape2]": 0.0005572509980993345, + "tests/user_input_checks_test.py::test_process_x[x3-None]": 0.0005535009695449844, + "tests/user_input_checks_test.py::test_process_x[x4-x_shape4]": 0.0005609170184470713, + "tests/user_input_checks_test.py::test_reinterpreted_batch_dim_prior": 0.0007335419941227883, + "tests/user_input_checks_test.py::test_simulate_for_sbi[0-None-1-True]": 0.0007800010062055662, + "tests/user_input_checks_test.py::test_simulate_for_sbi[10-None-1-True]": 0.0013184169947635382, + "tests/user_input_checks_test.py::test_simulate_for_sbi[100-10-1-True]": 0.001444249995984137, + "tests/user_input_checks_test.py::test_simulate_for_sbi[100-10-2-False]": 1.8238417500106152, + "tests/user_input_checks_test.py::test_simulate_for_sbi[100-None-2-True]": 1.4210593340103514, + "tests/user_input_checks_test.py::test_simulate_for_sbi[1000-50-4-True]": 1.8715655830164906, + "tests/vi_test.py::test_deepcopy_support[gaussian]": 0.0038214570085983723, + "tests/vi_test.py::test_deepcopy_support[gaussian_diag]": 0.0075444590038387105, + "tests/vi_test.py::test_deepcopy_support[maf]": 0.019470916988211684, + "tests/vi_test.py::test_deepcopy_support[mcf]": 0.015438707996509038, + "tests/vi_test.py::test_deepcopy_support[nsf]": 0.044251417013583705, + "tests/vi_test.py::test_deepcopy_support[scf]": 0.03980208400753327, + "tests/vi_test.py::test_pickle_support[gaussian]": 0.004786666002473794, + "tests/vi_test.py::test_pickle_support[gaussian_diag]": 0.0054843759862706065, + "tests/vi_test.py::test_pickle_support[maf]": 0.02115225000306964, + "tests/vi_test.py::test_pickle_support[mcf]": 0.021611667005345225, + "tests/vi_test.py::test_pickle_support[nsf]": 0.05154004100768361, + "tests/vi_test.py::test_pickle_support[scf]": 0.047762918009539135, + "tests/vi_test.py::test_vi_flow_builders[gaussian-10]": 0.0007446669915225357, + "tests/vi_test.py::test_vi_flow_builders[gaussian-1]": 0.0007904170051915571, + "tests/vi_test.py::test_vi_flow_builders[gaussian-25]": 0.000764290991355665, + "tests/vi_test.py::test_vi_flow_builders[gaussian-2]": 0.000756665991502814, + "tests/vi_test.py::test_vi_flow_builders[gaussian-33]": 0.0007596670038765296, + "tests/vi_test.py::test_vi_flow_builders[gaussian-3]": 0.0007449580152751878, + "tests/vi_test.py::test_vi_flow_builders[gaussian-4]": 0.0007477079925592989, + "tests/vi_test.py::test_vi_flow_builders[gaussian-5]": 0.0007439579931087792, + "tests/vi_test.py::test_vi_flow_builders[gaussian_diag-10]": 0.0007837910088710487, + "tests/vi_test.py::test_vi_flow_builders[gaussian_diag-1]": 0.001029251012369059, + "tests/vi_test.py::test_vi_flow_builders[gaussian_diag-25]": 0.0007572509930469096, + "tests/vi_test.py::test_vi_flow_builders[gaussian_diag-2]": 0.0008347919938387349, + "tests/vi_test.py::test_vi_flow_builders[gaussian_diag-33]": 0.0007593740010634065, + "tests/vi_test.py::test_vi_flow_builders[gaussian_diag-3]": 0.0008041250257520005, + "tests/vi_test.py::test_vi_flow_builders[gaussian_diag-4]": 0.0007710840000072494, + "tests/vi_test.py::test_vi_flow_builders[gaussian_diag-5]": 0.0007601670076837763, + "tests/vi_test.py::test_vi_flow_builders[maf-10]": 0.0028102100040996447, + "tests/vi_test.py::test_vi_flow_builders[maf-1]": 0.0029449999856296927, + "tests/vi_test.py::test_vi_flow_builders[maf-25]": 0.003083083007368259, + "tests/vi_test.py::test_vi_flow_builders[maf-2]": 0.0029947489965707064, + "tests/vi_test.py::test_vi_flow_builders[maf-33]": 0.0037507079978240654, + "tests/vi_test.py::test_vi_flow_builders[maf-3]": 0.0028405829943949357, + "tests/vi_test.py::test_vi_flow_builders[maf-4]": 0.002816667009028606, + "tests/vi_test.py::test_vi_flow_builders[maf-5]": 0.002796998989651911, + "tests/vi_test.py::test_vi_flow_builders[mcf-10]": 0.002644458014401607, + "tests/vi_test.py::test_vi_flow_builders[mcf-1]": 0.0006611659919144586, + "tests/vi_test.py::test_vi_flow_builders[mcf-25]": 0.0034375410032225773, + "tests/vi_test.py::test_vi_flow_builders[mcf-2]": 0.002592040997114964, + "tests/vi_test.py::test_vi_flow_builders[mcf-33]": 0.0038712909881724045, + "tests/vi_test.py::test_vi_flow_builders[mcf-3]": 0.0025567099946783856, + "tests/vi_test.py::test_vi_flow_builders[mcf-4]": 0.002525250005419366, + "tests/vi_test.py::test_vi_flow_builders[mcf-5]": 0.0025474590074736625, + "tests/vi_test.py::test_vi_flow_builders[nsf-10]": 0.006674251009826548, + "tests/vi_test.py::test_vi_flow_builders[nsf-1]": 0.005303500016452745, + "tests/vi_test.py::test_vi_flow_builders[nsf-25]": 0.01104025098902639, + "tests/vi_test.py::test_vi_flow_builders[nsf-2]": 0.005317707997164689, + "tests/vi_test.py::test_vi_flow_builders[nsf-33]": 0.010934291000012308, + "tests/vi_test.py::test_vi_flow_builders[nsf-3]": 0.0053269590134732425, + "tests/vi_test.py::test_vi_flow_builders[nsf-4]": 0.005423957991297357, + "tests/vi_test.py::test_vi_flow_builders[nsf-5]": 0.005395458996645175, + "tests/vi_test.py::test_vi_flow_builders[scf-10]": 0.009719708992633969, + "tests/vi_test.py::test_vi_flow_builders[scf-1]": 0.0006267909921007231, + "tests/vi_test.py::test_vi_flow_builders[scf-25]": 0.011263250999036245, + "tests/vi_test.py::test_vi_flow_builders[scf-2]": 0.007534708012826741, + "tests/vi_test.py::test_vi_flow_builders[scf-33]": 0.01276549999602139, + "tests/vi_test.py::test_vi_flow_builders[scf-3]": 0.007613292007590644, + "tests/vi_test.py::test_vi_flow_builders[scf-4]": 0.008055540994973853, + "tests/vi_test.py::test_vi_flow_builders[scf-5]": 0.008088664995739236, + "tests/vi_test.py::test_vi_posterior_inferface": 1.2457300829992164, + "tests/vi_test.py::test_vi_with_multiple_independent_prior": 1.3032346669933759 +} diff --git a/pyproject.toml b/pyproject.toml index 69cfb9dee..9d4b9ea5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,6 +81,7 @@ dev = [ "pytest-testmon", "pytest-xdist", "pytest-harvest", + "pytest-split", "torchtestcase", ] From 6f891da00f3c12dba533e8b273d06a612a700b5b Mon Sep 17 00:00:00 2001 From: michaeldeistler Date: Tue, 18 Mar 2025 14:34:13 +0100 Subject: [PATCH 09/36] Prevent notebook execution upon doc build --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 6ea449ab1..ef81d02ab 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,7 @@ "colon_fence", ] nb_execution_timeout = 600 -nb_execution_mode = "cache" +nb_execution_mode = "off" # -- Options for HTML output ------------------------------------------------- From 55926829f36fcf90aa1fed7d0aa5938a8f03e628 Mon Sep 17 00:00:00 2001 From: michaeldeistler Date: Tue, 18 Mar 2025 15:56:06 +0100 Subject: [PATCH 10/36] Fix broken links on website --- docs/index.rst | 10 +- docs/tutorials/00_getting_started.ipynb | 14 +- docs/tutorials/01_gaussian_amortized.ipynb | 10 +- docs/tutorials/02_multiround_inference.ipynb | 22 +- docs/tutorials/03_density_estimators.ipynb | 15 +- docs/tutorials/04_embedding_networks.ipynb | 8 +- .../05_conditional_distributions.ipynb | 2 +- docs/tutorials/06_restriction_estimator.ipynb | 10 +- .../08_crafting_summary_statistics.ipynb | 4 +- ...nostics_simulation_based_calibration.ipynb | 4 +- ...and_permutation_invariant_embeddings.ipynb | 2 +- docs/tutorials/13_diagnostics_lc2st.ipynb | 8 +- .../14_mcmc_diagnostics_with_arviz.ipynb | 4 +- .../15_importance_sampled_posteriors.ipynb | 42 ++-- docs/tutorials/18_training_interface.ipynb | 194 ++++++------------ .../Example_00_HodgkinHuxleyModel.ipynb | 4 +- .../Example_01_DecisionMakingModel.ipynb | 8 +- 17 files changed, 131 insertions(+), 230 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 5c9430f99..e2de0a0eb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -52,13 +52,13 @@ To get started, install the `sbi` package with: python -m pip install sbi -for more advanced install options, see our `Install Guide `. +for more advanced install options, see our `Install Guide `_. Then, check out our material: - `Tutorials and Examples `_ -- `Reference API `_ +- `Reference API `_ Motivation and approach @@ -130,7 +130,7 @@ the inference on one particular observation to be more simulation-efficient (e.g., SNPE). Below, we list all implemented methods and their corresponding publications. -For usage in ``sbi``, see the `Inference API reference `_ +For usage in ``sbi``, see the `Inference API reference `_ and the `tutorial on implemented methods `_. @@ -140,17 +140,14 @@ Posterior estimation (``(S)NPE``) - **Fast ε-free Inference of Simulation Models with Bayesian Conditional Density Estimation** by Papamakarios & Murray (NeurIPS 2016) `PDF `__ - `BibTeX `__ - **Flexible statistical inference for mechanistic models of neural dynamics** by Lueckmann, Goncalves, Bassetto, Öcal, Nonnenmacher & Macke (NeurIPS 2017) `PDF `__ - `BibTeX `__ - **Automatic posterior transformation for likelihood-free inference** by Greenberg, Nonnenmacher & Macke (ICML 2019) `PDF `__ - `BibTeX`__ - **BayesFlow: Learning complex stochastic models with invertible neural networks** by Radev, S. T., Mertens, U. K., Voss, A., Ardizzone, L., & Köthe, U. (IEEE transactions on neural networks and learning systems 2020) @@ -174,7 +171,6 @@ Likelihood-estimation (``(S)NLE``) - **Sequential neural likelihood: Fast likelihood-free inference with autoregressive flows** by Papamakarios, Sterratt & Murray (AISTATS 2019) `PDF `__ - `BibTeX `__ - **Variational methods for simulation-based inference** by Glöckler, Deistler, Macke (ICLR 2022) diff --git a/docs/tutorials/00_getting_started.ipynb b/docs/tutorials/00_getting_started.ipynb index 78877a79b..96fbecd81 100644 --- a/docs/tutorials/00_getting_started.ipynb +++ b/docs/tutorials/00_getting_started.ipynb @@ -11,7 +11,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note, you can find the original version of this notebook at [/tutorials/00_getting_started.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/00_getting_started.ipynb) in the `sbi` repository." + "Note, you can find the original version of this notebook at [/docs/tutorials/00_getting_started.ipynb](https://github.com/sbi-dev/sbi/blob/main/docs/tutorials/00_getting_started.ipynb) in the `sbi` repository." ] }, { @@ -60,7 +60,7 @@ "2. a candidate (mechanistic) model - _the simulator_ \n", "3. prior knowledge or constraints on model parameters - _the prior_\n", "\n", - "If you are new to simulation-based inference, please first read the information on the [homepage of the website](https://sbi-dev.github.io/sbi/) to familiarise with the motivation and relevant terms." + "If you are new to simulation-based inference, please first read the information on the [homepage of the website](https://sbi.readthedocs.io/en/latest/index.html) to familiarise with the motivation and relevant terms." ] }, { @@ -138,9 +138,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> Note: In `sbi` version 0.23.0, we renamed all inference classes from, e.g., `SNPE`, to `NPE` (i.e., we removed the `S` prefix). The functionality of the classes remains the same. The `NPE` class handles both the amortized (as shown in this tutorial) and sequential (as shown [here](https://sbi-dev.github.io/sbi/tutorial/02_multiround_inference/)) versions of neural posterior estimation. An alias for `SNPE` still exists for backwards compatibility.\n", + "> Note: In `sbi` version 0.23.0, we renamed all inference classes from, e.g., `SNPE`, to `NPE` (i.e., we removed the `S` prefix). The functionality of the classes remains the same. The `NPE` class handles both the amortized (as shown in this tutorial) and sequential (as shown [here](https://sbi.readthedocs.io/en/latest/tutorials/02_multiround_inference.html)) versions of neural posterior estimation. An alias for `SNPE` still exists for backwards compatibility.\n", "\n", - "> Note: This is where you could specify an alternative inference object such as NRE for ratio estimation or NLE for likelihood estimation. Here, you can see [all implemented methods](https://sbi-dev.github.io/sbi/latest/tutorials/16_implemented_methods/)." + "> Note: This is where you could specify an alternative inference object such as NRE for ratio estimation or NLE for likelihood estimation. Here, you can see [all implemented methods](https://sbi.readthedocs.io/en/latest/tutorials/16_implemented_methods.html)." ] }, { @@ -456,11 +456,11 @@ "## Next steps\n", "\n", "To learn more about the capabilities of `sbi`, you can head over to the tutorial\n", - "[01_gaussian_amortized](01_gaussian_amortized.md), for inferring parameters for multiple\n", + "[01_gaussian_amortized](https://sbi.readthedocs.io/en/latest/tutorials/01_gaussian_amortized.html), for inferring parameters for multiple\n", "observations without retraining.\n", "\n", "Alternatively, for an example with an __actual__ simulator, you can read our example\n", - "for a scientific simulator from neuroscience under [Example_00_HodgkinHuxleyModel](Example_00_HodgkinHuxleyModel.md)." + "for a scientific simulator from neuroscience under [Example_00_HodgkinHuxleyModel](https://sbi.readthedocs.io/en/latest/tutorials/Example_00_HodgkinHuxleyModel.html)." ] } ], @@ -480,7 +480,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/docs/tutorials/01_gaussian_amortized.ipynb b/docs/tutorials/01_gaussian_amortized.ipynb index 410be08fb..39baf8403 100644 --- a/docs/tutorials/01_gaussian_amortized.ipynb +++ b/docs/tutorials/01_gaussian_amortized.ipynb @@ -11,7 +11,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note, you can find the original version of this notebook at [tutorials/01_gaussian_amortized.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/01_gaussian_amortized.ipynb) in the `sbi` repository." + "Note, you can find the original version of this notebook at [docs/tutorials/01_gaussian_amortized.ipynb](https://github.com/sbi-dev/sbi/blob/main/docs/tutorials/01_gaussian_amortized.ipynb) in the `sbi` repository." ] }, { @@ -20,7 +20,7 @@ "source": [ "In this tutorial, we introduce **amortization** that is the capability to evaluate the posterior for different observations without having to re-run inference.\n", "\n", - "We will demonstrate how `sbi` can infer an amortized posterior for the illustrative linear Gaussian example introduced in [Getting Started](https://sbi-dev.github.io/sbi/latest/tutorials/00_getting_started/), that takes in 3 parameters ($\\theta$). " + "We will demonstrate how `sbi` can infer an amortized posterior for the illustrative linear Gaussian example introduced in [Getting Started](https://sbi.readthedocs.io/en/latest/tutorials/00_getting_started.html), that takes in 3 parameters ($\\theta$). " ] }, { @@ -214,10 +214,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Next steps\n", + "## Next steps\n", "\n", "Now that you got familiar with amortization and are probably good to go and have a first shot at applying `sbi` to your own inference problem. If you want to learn more, we recommend checking out our tutorial\n", - "[02_multiround_inference](02_multiround_inference.md) which aims to make inference for a single observation more sampling efficient." + "[02_multiround_inference](https://sbi.readthedocs.io/en/latest/tutorials/02_multiround_inference.html) which aims to make inference for a single observation more sampling efficient." ] } ], @@ -237,7 +237,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/docs/tutorials/02_multiround_inference.ipynb b/docs/tutorials/02_multiround_inference.ipynb index 115f2e250..1faf79a98 100644 --- a/docs/tutorials/02_multiround_inference.ipynb +++ b/docs/tutorials/02_multiround_inference.ipynb @@ -17,7 +17,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note, you can find the original version of this notebook at [tutorials/02_multiround_inference.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/02_multiround_inference.ipynb) in the `sbi` repository.\n" + "Note, you can find the original version of this notebook at [docs/tutorials/02_multiround_inference.ipynb](https://github.com/sbi-dev/sbi/blob/main/docs/tutorials/02_multiround_inference.ipynb) in the `sbi` repository.\n" ] }, { @@ -54,14 +54,7 @@ "name": "stdout", "output_type": "stream", "text": [ - " Neural network successfully converged after 196 epochs." - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using SNPE-C with atomic loss\n", + " Neural network successfully converged after 196 epochs.Using SNPE-C with atomic loss\n", " Neural network successfully converged after 37 epochs." ] } @@ -173,14 +166,7 @@ "name": "stdout", "output_type": "stream", "text": [ - " Neural network successfully converged after 277 epochs." - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using SNPE-C with atomic loss\n", + " Neural network successfully converged after 277 epochs.Using SNPE-C with atomic loss\n", " Neural network successfully converged after 35 epochs." ] } @@ -260,7 +246,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/docs/tutorials/03_density_estimators.ipynb b/docs/tutorials/03_density_estimators.ipynb index 338027093..2d25491a5 100644 --- a/docs/tutorials/03_density_estimators.ipynb +++ b/docs/tutorials/03_density_estimators.ipynb @@ -18,7 +18,7 @@ "[`nflows`](https://github.com/bayesiains/nflows/) (via `pyknos`) or [`zuko`](https://github.com/probabilists/zuko). \n", "\n", "For all options, check the API reference\n", - "[here](https://sbi-dev.github.io/sbi/reference/models/).\n" + "[here](https://sbi.readthedocs.io/en/latest/reference/sbi.models.html).\n" ] }, { @@ -113,7 +113,7 @@ "source": [ "It is also possible to pass an `embedding_net` to `posterior_nn()` to automatically\n", "learn summary statistics from high-dimensional simulation outputs. You can find a more\n", - "detailed tutorial on this in [04_embedding_networks](04_embedding_networks.md).\n" + "detailed tutorial on this in [04_embedding_networks](https://sbi.readthedocs.io/en/latest/tutorials/04_embedding_networks.html).\n" ] }, { @@ -137,15 +137,8 @@ "- `loss(input, condition, **kwargs)`: Return the loss for training the density estimator.\n", "- `sample(sample_shape, condition, **kwargs)`: Return samples from the density estimator.\n", "\n", - "See more information on the [Reference API page](https://sbi-dev.github.io/sbi/reference/models/#sbi.neural_nets.density_estimators.ConditionalDensityEstimator)." + "See more information on the [Reference API page](https://sbi.readthedocs.io/en/latest/sbi.html)." ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -164,7 +157,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/docs/tutorials/04_embedding_networks.ipynb b/docs/tutorials/04_embedding_networks.ipynb index 9e0e606ae..8e6d6e08b 100644 --- a/docs/tutorials/04_embedding_networks.ipynb +++ b/docs/tutorials/04_embedding_networks.ipynb @@ -6,8 +6,7 @@ "source": [ "# Embedding nets for observations\n", "\n", - "!!! note\n", - " You can find the original version of this notebook at [tutorials/04_embedding_networks.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/04_embedding_networks.ipynb) in the `sbi` repository.\n", + "Note, you can find the original version of this notebook at [docs/tutorials/04_embedding_networks.ipynb](https://github.com/sbi-dev/sbi/blob/main/docs/tutorials/04_embedding_networks.ipynb) in the `sbi` repository.\n", "\n", "## Introduction\n", "\n", @@ -251,8 +250,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "!!! note\n", - " See [here](https://github.com/sbi-dev/sbi/blob/main/sbi/neural_nets/embedding_nets.py) for details on all hyperparametes for each available embedding net in `sbi`\n", + "See [here](https://github.com/sbi-dev/sbi/blob/main/sbi/neural_nets/embedding_nets.py) for details on all hyperparametes for each available embedding net in `sbi`\n", "\n", "## The inference procedure\n", "\n", @@ -432,7 +430,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/docs/tutorials/05_conditional_distributions.ipynb b/docs/tutorials/05_conditional_distributions.ipynb index 0b0962ecc..8d2092644 100644 --- a/docs/tutorials/05_conditional_distributions.ipynb +++ b/docs/tutorials/05_conditional_distributions.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note, you can find the original version of this notebook at [tutorials/05_conditional_distributions.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/05_conditional_distributions.ipynb) in the `sbi` repository.\n" + "Note, you can find the original version of this notebook at [docs/tutorials/05_conditional_distributions.ipynb](https://github.com/sbi-dev/sbi/blob/main/docs/tutorials/05_conditional_distributions.ipynb) in the `sbi` repository.\n" ] }, { diff --git a/docs/tutorials/06_restriction_estimator.ipynb b/docs/tutorials/06_restriction_estimator.ipynb index 683d49a4c..65a7c4ed9 100644 --- a/docs/tutorials/06_restriction_estimator.ipynb +++ b/docs/tutorials/06_restriction_estimator.ipynb @@ -231,13 +231,7 @@ "text": [ "The `RestrictedPrior` rejected 53.2%\n", " of prior samples. You will get a speed-up of\n", - " 113.8%.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + " 113.8%.\n", "Simulation outputs: tensor([[ 1.7930, 1.5322],\n", " [ 1.6024, 1.6551],\n", " [ 0.0756, 2.4023],\n", @@ -329,7 +323,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" }, "toc": { "base_numbering": 1, diff --git a/docs/tutorials/08_crafting_summary_statistics.ipynb b/docs/tutorials/08_crafting_summary_statistics.ipynb index 19d5bf436..865193299 100644 --- a/docs/tutorials/08_crafting_summary_statistics.ipynb +++ b/docs/tutorials/08_crafting_summary_statistics.ipynb @@ -12,7 +12,7 @@ "metadata": {}, "source": [ "Many simulators produce outputs that are high-dimesional. For example, a simulator might\n", - "generate a time series or an image. In the tutorial [04_embedding_networks](04_embedding_networks.md), we discussed how a\n", + "generate a time series or an image. In the tutorial [04_embedding_networks](https://sbi.readthedocs.io/en/latest/tutorials/04_embedding_networks.html), we discussed how a\n", "neural networks can be used to learn summary statistics from such data. In this\n", "notebook, we will instead focus on hand-crafting summary statistics. We demonstrate that\n", "the choice of summary statistics can be crucial for the performance of the inference\n", @@ -599,7 +599,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" }, "toc": { "base_numbering": 1, diff --git a/docs/tutorials/11_diagnostics_simulation_based_calibration.ipynb b/docs/tutorials/11_diagnostics_simulation_based_calibration.ipynb index 828e5fe83..67aa881b5 100644 --- a/docs/tutorials/11_diagnostics_simulation_based_calibration.ipynb +++ b/docs/tutorials/11_diagnostics_simulation_based_calibration.ipynb @@ -10,7 +10,7 @@ "the estimator should be made subject to several **diagnostic tests**. This needs to be\n", "performed before being used for inference given the actual observed data. _Posterior\n", "Predictive Checks_ (see [10_diagnostics_posterior_predictive_checks\n", - "tutorial](10_diagnostics_posterior_predictive_checks.md)) provide one way to \"critique\" a trained\n", + "tutorial](http://localhost:8000/tutorials/10_diagnostics_posterior_predictive_checks.html)) provide one way to \"critique\" a trained\n", "estimator based on its predictive performance. Another important approach to such\n", "diagnostics is simulation-based calibration as developed by [Cook et al,\n", "2006](https://www.tandfonline.com/doi/abs/10.1198/106186006X136976) and [Talts et al,\n", @@ -909,7 +909,7 @@ ], "metadata": { "kernelspec": { - "display_name": "sbi-dev", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/docs/tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb b/docs/tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb index aeabe880f..f46615205 100644 --- a/docs/tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb +++ b/docs/tutorials/12_iid_data_and_permutation_invariant_embeddings.ipynb @@ -599,7 +599,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" }, "toc": { "base_numbering": 1, diff --git a/docs/tutorials/13_diagnostics_lc2st.ipynb b/docs/tutorials/13_diagnostics_lc2st.ipynb index 134f02b68..e119dc6a3 100644 --- a/docs/tutorials/13_diagnostics_lc2st.ipynb +++ b/docs/tutorials/13_diagnostics_lc2st.ipynb @@ -4,14 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Local Classifier Two-Sample Tests ($\\ell$-C2ST)\n", + "# Local Classifier Two-Sample Tests (L-C2ST)\n", "\n", "\n", " After a density estimator has been trained with simulated data to obtain a posterior, the estimator should be made subject to several diagnostic tests. This diagnostic should be performed before the posterior is used for inference given the actual observed data. \n", " \n", - "*Posterior Predictive Checks* (see [tutorial 10](10_diagnostics_posterior_predictive_checks.md)) provide one way to \"critique\" a trained estimator via its predictive performance. \n", + "*Posterior Predictive Checks* (see [tutorial 10](https://sbi.readthedocs.io/en/latest/tutorials/10_diagnostics_posterior_predictive_checks.html)) provide one way to \"critique\" a trained estimator via its predictive performance. \n", " \n", - "Another approach is *Simulation-Based Calibration* (SBC, see [tutorial 11](11_diagnostics_simulation_based_calibration.md)). SBC evaluates whether the estimated posterior is balanced, i.e., neither over-confident nor under-confident. These checks are performed ***in expectation (on average) over the observation space***, i.e. they are performed on a set of $(\\theta,x)$ pairs sampled from the joint distribution over simulator parameters $\\theta$ and corresponding observations $x$. As such, SBC is a ***global validation method*** that can be viewed as a necessary condition (but not sufficient) for a valid inference algorithm: If SBC checks fail, this tells you that your inference is invalid. If SBC checks pass, *this is no guarantee that the posterior estimation is working*.\n", + "Another approach is *Simulation-Based Calibration* (SBC, see [tutorial 11](https://sbi.readthedocs.io/en/latest/tutorials/11_diagnostics_simulation_based_calibration.html)). SBC evaluates whether the estimated posterior is balanced, i.e., neither over-confident nor under-confident. These checks are performed ***in expectation (on average) over the observation space***, i.e. they are performed on a set of $(\\theta,x)$ pairs sampled from the joint distribution over simulator parameters $\\theta$ and corresponding observations $x$. As such, SBC is a ***global validation method*** that can be viewed as a necessary condition (but not sufficient) for a valid inference algorithm: If SBC checks fail, this tells you that your inference is invalid. If SBC checks pass, *this is no guarantee that the posterior estimation is working*.\n", "\n", "**Local Classifier Two-Sample Tests** ($\\ell$-C2ST) as developed by [Linhart et al, 2023](https://arxiv.org/abs/2306.03580) present a new ***local validation method*** that allows to evaluate the correctness of the posterior estimator ***at a fixed observation***, i.e. they work on a single $(\\theta,x)$ pair. They provide necessary *and sufficient* conditions for the validity of the SBI algorithm, as well as easy-to-interpret qualitative and quantitative diagnostics. \n", " \n", @@ -881,7 +881,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" }, "toc": { "base_numbering": 1, diff --git a/docs/tutorials/14_mcmc_diagnostics_with_arviz.ipynb b/docs/tutorials/14_mcmc_diagnostics_with_arviz.ipynb index 35c577183..7cf4802f4 100644 --- a/docs/tutorials/14_mcmc_diagnostics_with_arviz.ipynb +++ b/docs/tutorials/14_mcmc_diagnostics_with_arviz.ipynb @@ -66,7 +66,7 @@ "## Train MNLE to approximate the likelihood\n", "\n", "For this tutorial, we will use a simple simulator with two parameters. For details see\n", - "the [example on the decision making model](Example_01_DecisionMakingModel.md).\n", + "the [example on the decision making model](https://sbi.readthedocs.io/en/latest/tutorials/Example_01_DecisionMakingModel.html).\n", "\n", "Here, we pass `mcmc_method=\"nuts\"` in order to use the underlying [`pyro` No-U-turn sampler](https://docs.pyro.ai/en/1.8.1/mcmc.html#nuts), but it would work as well with other samplers (e.g. \"slice_np_vectorized\", \"hmc\").\n", "\n", @@ -373,7 +373,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" }, "toc": { "base_numbering": 1, diff --git a/docs/tutorials/15_importance_sampled_posteriors.ipynb b/docs/tutorials/15_importance_sampled_posteriors.ipynb index 15052ffd6..ea7bd8f09 100644 --- a/docs/tutorials/15_importance_sampled_posteriors.ipynb +++ b/docs/tutorials/15_importance_sampled_posteriors.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "cf9f505b-f478-4da4-9ccd-5208aa806825", + "id": "e68f7a0f", "metadata": {}, "source": [ "# Refining posterior estimates with importance sampling" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "cb0b9d26-e5f7-4866-ae1b-fad6485d54b1", + "id": "ce0a234b", "metadata": {}, "source": [ "# Theory\n", @@ -42,7 +42,7 @@ }, { "cell_type": "markdown", - "id": "fe5e6091-285a-4841-b902-7e335fc15513", + "id": "9c3eadd2", "metadata": {}, "source": [ "# Implementation" @@ -51,7 +51,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "f3284c6a-5205-492a-bbd9-c1b46bb2feb3", + "id": "92d26a7b", "metadata": {}, "outputs": [], "source": [ @@ -66,7 +66,7 @@ }, { "cell_type": "markdown", - "id": "4808d6d3-cb14-4ecd-a0f5-824bf54a5b01", + "id": "286ac908", "metadata": {}, "source": [ "We first define a simulator and a prior which both have a `sample` function (as required for `sbi`) and `log_prob` evaluations (as required for importance sampling)." @@ -74,7 +74,7 @@ }, { "cell_type": "markdown", - "id": "7bafcabf-bf3f-4133-aeaa-ab1e36e89267", + "id": "c83f461a", "metadata": {}, "source": [ "Next we train an NPE model for inference." @@ -82,7 +82,7 @@ }, { "cell_type": "markdown", - "id": "cb514776-590a-4c41-93f4-e42a32f8470e", + "id": "000ef796", "metadata": {}, "source": [ "Now we perfrom inference with the model." @@ -91,7 +91,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "3e72c9d2-7973-499a-8d56-485cd69f2ebb", + "id": "c874b5a9", "metadata": {}, "outputs": [ { @@ -146,7 +146,7 @@ }, { "cell_type": "markdown", - "id": "101e8005-8ac7-4730-bb8a-f51c652c4ecf", + "id": "fcbd4519", "metadata": {}, "source": [ "In this case, we know the ground truth posterior, so we can compare NPE to it:" @@ -155,7 +155,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "fe85d9a6-33e9-41fd-8464-864107ff326b", + "id": "a6336c83", "metadata": {}, "outputs": [ { @@ -181,7 +181,7 @@ }, { "cell_type": "markdown", - "id": "f5974817-74fd-4549-ad81-6c5bb52e29b7", + "id": "0c00ab1c", "metadata": {}, "source": [ "While NPE is not completely off, it does not provide a perfect fit to the posterior. In cases where the likelihood is tractable, we can fix this with importance sampling." @@ -189,7 +189,7 @@ }, { "cell_type": "markdown", - "id": "26d8d8c7-05a0-4fd4-ac64-0dabf1a848f6", + "id": "d19c552d", "metadata": {}, "source": [ "### Importance sampling with the SBI toolbox" @@ -197,7 +197,7 @@ }, { "cell_type": "markdown", - "id": "7150cc13-9911-4656-936f-9cafb867eba4", + "id": "1f68a9cc", "metadata": {}, "source": [ "With the `sbi` toolbox, importance sampling is a one-liner. `sbi` supports two methods\n", @@ -215,7 +215,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "1479c986-a677-4367-9037-d72f5f34569d", + "id": "dfb29709", "metadata": {}, "outputs": [], "source": [ @@ -234,7 +234,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "6efc07ec-6b06-4c77-88c8-6d16685f5c68", + "id": "d6bf911a", "metadata": {}, "outputs": [ { @@ -260,19 +260,11 @@ }, { "cell_type": "markdown", - "id": "eb7e80dd-1534-4158-b112-f55ceb9da50b", + "id": "f8a4ed64", "metadata": {}, "source": [ "Indeed, the importance-sampled posterior matches the ground truth well, despite significant deviations of the initial NPE estimate." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4ac18a2e-16a0-4a94-a0a7-4a30deb54f18", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -291,7 +283,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/docs/tutorials/18_training_interface.ipynb b/docs/tutorials/18_training_interface.ipynb index 6e1a17cdc..dfccb9af3 100644 --- a/docs/tutorials/18_training_interface.ipynb +++ b/docs/tutorials/18_training_interface.ipynb @@ -2,10 +2,8 @@ "cells": [ { "cell_type": "markdown", - "id": "02ef8ff7-d8e5-43d7-9795-92e39069c9b5", - "metadata": { - "collapsed": false - }, + "id": "bf51f9bb", + "metadata": {}, "source": [ "\n", "# More flexibility over the training loop and samplers" @@ -13,20 +11,16 @@ }, { "cell_type": "markdown", - "id": "0e5d329e-b30e-43c9-a497-d088d3ce57d5", - "metadata": { - "collapsed": false - }, + "id": "03094546", + "metadata": {}, "source": [ - "Note, you can find the original version of this notebook at [tutorials/18_training_interface.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/18_training_interface.ipynb) in the `sbi` repository." + "Note, you can find the original version of this notebook at [docs/tutorials/18_training_interface.ipynb](https://github.com/sbi-dev/sbi/blob/main/docs/tutorials/18_training_interface.ipynb) in the `sbi` repository." ] }, { "cell_type": "markdown", - "id": "a3b3e07e-838a-46e2-9ed6-02bfb27a4ede", - "metadata": { - "collapsed": false - }, + "id": "a23ac144", + "metadata": {}, "source": [ "In the previous tutorials, we showed how `sbi` can be used to train neural networks and sample from the posterior. If you are an `sbi` power-user, then you might want more control over individual stages of this process. For example, you might want to write a custom training loop or more flexibility over the samplers that are used. In this tutorial, we will explain how you can achieve this." ] @@ -34,7 +28,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "3ce293ed-5d23-4440-b3fc-22c66bd079a8", + "id": "6c8a39ec", "metadata": {}, "outputs": [], "source": [ @@ -50,10 +44,8 @@ }, { "cell_type": "markdown", - "id": "c8dffec5-843a-48fc-91e8-2feb1f22a0e6", - "metadata": { - "collapsed": false - }, + "id": "e95c1546", + "metadata": {}, "source": [ "As in the previous tutorials, we first define the prior and simulator and use them to generate simulated data: " ] @@ -61,7 +53,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "19122e88-2a8d-4e09-8c4e-061a087d175a", + "id": "b640b303", "metadata": {}, "outputs": [], "source": [ @@ -77,30 +69,24 @@ }, { "cell_type": "markdown", - "id": "3877610b-c76c-4653-abba-355c387f8e06", - "metadata": { - "collapsed": false - }, + "id": "9bfc648b", + "metadata": {}, "source": [ "Below, we will first describe how you can run `Neural Posterior Estimation (NPE)`. We will attach code snippets for `Neural Likelihood Estimation (NLE)` and `Neural Ratio Estimation (NRE)` at the end." ] }, { "cell_type": "markdown", - "id": "73f85c4d-fa93-44dd-85ca-24787b4cfbfc", - "metadata": { - "collapsed": false - }, + "id": "0e5e7183", + "metadata": {}, "source": [ "## Neural Posterior Estimation" ] }, { "cell_type": "markdown", - "id": "6c9d207b-fd00-4c8c-ab9b-5eb9f811c21a", - "metadata": { - "collapsed": false - }, + "id": "74875872", + "metadata": {}, "source": [ "First, we have to decide on what `DensityEstimator` to use. In this tutorial, we will use a `Neural Spline Flow` (NSF) taken from the [`nflows`](https://github.com/bayesiains/nflows) package." ] @@ -108,7 +94,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "8b520f28-5f30-444a-92b7-3407f70860ac", + "id": "76a08d19", "metadata": {}, "outputs": [], "source": [ @@ -119,10 +105,8 @@ }, { "cell_type": "markdown", - "id": "a208249e-d606-4bf4-b1f5-22cc777efef1", - "metadata": { - "collapsed": false - }, + "id": "6240ad71", + "metadata": {}, "source": [ "Every `density_estimator` in `sbi` implements at least two methods: `.sample()` and `.loss()`. Their input and output shapes are:\n", "\n", @@ -150,10 +134,8 @@ }, { "cell_type": "markdown", - "id": "c5bd6333-cee6-4b28-90ce-693ff4e2931a", - "metadata": { - "collapsed": false - }, + "id": "c729362b", + "metadata": {}, "source": [ "Some `DensityEstimator`s, such as Normalizing flows, also allow to evaluate the `log probability`. In those cases, the `DensityEstimator` also has the following method:\n", "\n", @@ -170,20 +152,16 @@ }, { "cell_type": "markdown", - "id": "5e4a0c77-2407-4c90-a708-afd826f5d1da", - "metadata": { - "collapsed": false - }, + "id": "2dd6cb69", + "metadata": {}, "source": [ "## Training the density estimator" ] }, { "cell_type": "markdown", - "id": "612f82c9-6ba8-4270-bda1-06c47f87f0cd", - "metadata": { - "collapsed": false - }, + "id": "f721d315", + "metadata": {}, "source": [ "We can now write our own custom training loop to train the above-generated `DensityEstimator`:" ] @@ -191,7 +169,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "27188bb7-4a3f-433f-9d68-04c18fbe6485", + "id": "cb2656d5", "metadata": {}, "outputs": [], "source": [ @@ -207,10 +185,8 @@ }, { "cell_type": "markdown", - "id": "30babe16-8ad6-48e0-b0a1-600f8b88a6cc", - "metadata": { - "collapsed": false - }, + "id": "d31a5f1f", + "metadata": {}, "source": [ "Given this trained `density_estimator`, we can already generate samples from the posterior given observations (but we have to adhere to the shape specifications of the `DensityEstimator` explained above:" ] @@ -218,7 +194,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "ca964f37-b7aa-4570-80b3-64667b0a30e1", + "id": "df3a4c7a", "metadata": {}, "outputs": [ { @@ -245,7 +221,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "cd37d472-4b6b-43f2-8fef-2ad967544a6a", + "id": "ef8c02fa", "metadata": {}, "outputs": [ { @@ -265,14 +241,12 @@ }, { "cell_type": "markdown", - "id": "3f1cab68-4196-47ee-a4c2-3ed2cd8a454b", - "metadata": { - "collapsed": false - }, + "id": "a25fc52a", + "metadata": {}, "source": [ "### Wrapping as a `DirectPosterior`\n", "\n", - "You can also wrap the `DensityEstimator` as a `DirectPosterior`. The `DirectPosterior` is also returned by `inference.build_posterior` and you have already learned how to use it in the [introduction tutorial](https://sbi-dev.github.io/sbi/dev/tutorials/00_getting_started/) and the [amortization tutotrial](https://sbi-dev.github.io/sbi/dev/tutorials/01_gaussian_amortized/). It adds the following functionality over the raw `DensityEstimator`:\n", + "You can also wrap the `DensityEstimator` as a `DirectPosterior`. The `DirectPosterior` is also returned by `inference.build_posterior` and you have already learned how to use it in the [introduction tutorial](https://sbi.readthedocs.io/en/latest/tutorials/00_getting_started.html) and the [amortization tutotrial](https://sbi.readthedocs.io/en/latest/tutorials/01_gaussian_amortized.html). It adds the following functionality over the raw `DensityEstimator`:\n", "\n", "- automatically reject samples outside of the prior bounds \n", "- compute the Maximum-a-posteriori (MAP) estimate\n", @@ -282,7 +256,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "77f5e432-1399-4b26-8942-bb710a009651", + "id": "82198059", "metadata": {}, "outputs": [], "source": [ @@ -294,20 +268,14 @@ { "cell_type": "code", "execution_count": 8, - "id": "012870c0-7551-4895-9b3d-7cae3d103ae9", + "id": "d3813dff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Shape of x_o: torch.Size([1, 2])\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "Shape of x_o: torch.Size([1, 2])\n", "Shape of samples: torch.Size([1000, 2])\n" ] } @@ -320,10 +288,8 @@ }, { "cell_type": "markdown", - "id": "0abcbddf", - "metadata": { - "collapsed": false - }, + "id": "44b45bcf", + "metadata": {}, "source": [ "Note: For the `DirectPosterior`, the batch dimension is optional, i.e., it is possible to sample for multiple observations simultaneously. Use `.sample_batch` in that case." ] @@ -331,7 +297,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "e01d496c-d4f0-43aa-96a3-103afa745416", + "id": "7c6f1f4a", "metadata": {}, "outputs": [ { @@ -351,14 +317,12 @@ }, { "cell_type": "markdown", - "id": "d3c92a48-d6ff-4e06-a842-47c0e07de217", - "metadata": { - "collapsed": false - }, + "id": "801bc591", + "metadata": {}, "source": [ "### Custom Data Loaders\n", "\n", - "One helpful advantage of having access to the training loop is that you can now use your own DataLoaders during training of the density estimator. In this fashion, larger datasets can be used as input to `sbi` where `x` is potentially an image or something else. While this will require [embedding the input data](https://sbi-dev.github.io/sbi/latest/tutorials/04_embedding_networks/), a more fine grained control over loading the data is possible and allows to manage the memory requirement during training.\n", + "One helpful advantage of having access to the training loop is that you can now use your own DataLoaders during training of the density estimator. In this fashion, larger datasets can be used as input to `sbi` where `x` is potentially an image or something else. While this will require [embedding the input data](https://sbi.readthedocs.io/en/latest/tutorials/04_embedding_networks.html), a more fine grained control over loading the data is possible and allows to manage the memory requirement during training.\n", "\n", "First, we build a Dataset that complies with the `torch.util.data.Dataset` API. Note, the class below is meant for illustration purposes. In practice, this class can also read the data from disk etc.\n" ] @@ -366,7 +330,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "8dbe6e31-e682-419f-b88f-23b1e833eaf8", + "id": "de3145a8", "metadata": {}, "outputs": [], "source": [ @@ -395,10 +359,8 @@ }, { "cell_type": "markdown", - "id": "d8178235-291c-43e7-8376-98e42542d42d", - "metadata": { - "collapsed": false - }, + "id": "40c9825c", + "metadata": {}, "source": [ "We can now proceed to create a DataLoader and conduct our training loop as illustrated above." ] @@ -406,7 +368,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "eb2aa734-dfca-4691-b3b5-f5be889219ba", + "id": "481c787f", "metadata": {}, "outputs": [], "source": [ @@ -416,10 +378,8 @@ }, { "cell_type": "markdown", - "id": "2759a702-6ce7-4e2c-8373-402fb30d7f49", - "metadata": { - "collapsed": false - }, + "id": "ac6a9dc6", + "metadata": {}, "source": [ "For sake of demonstration, let's create another estimator using a masked autoregressive flow (maf). For this, we create a second dataset and use only parts of the data to construct the maf estimator." ] @@ -427,7 +387,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "2e61a11a-b9d6-4211-8456-cb4ff8755d1e", + "id": "ba27aa21", "metadata": {}, "outputs": [], "source": [ @@ -442,7 +402,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "7fe6624f-ce79-43dd-b661-1cced75dca09", + "id": "8a71cab9", "metadata": {}, "outputs": [ { @@ -480,7 +440,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "cc63ae5f-33e2-422b-9365-f183a53c09b9", + "id": "19d09dbc", "metadata": {}, "outputs": [ { @@ -504,7 +464,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "cd309901-76e1-4ebc-87e3-f1fa32161185", + "id": "785988da", "metadata": {}, "outputs": [ { @@ -524,20 +484,16 @@ }, { "cell_type": "markdown", - "id": "5a5b9e60-f504-4837-9ce8-c5af63dd03bd", - "metadata": { - "collapsed": false - }, + "id": "467353dd", + "metadata": {}, "source": [ "## Neural Likelihood Estimation" ] }, { "cell_type": "markdown", - "id": "a502a9df-dde9-4953-84ea-8058e05432fd", - "metadata": { - "collapsed": false - }, + "id": "e4e1c2b8", + "metadata": {}, "source": [ "The workflow for Neural Likelihood Estimation is very similar. Unlike for NPE, we have to sample with MCMC (or variational inference) though, so we will build an `MCMCPosterior` after training:" ] @@ -545,7 +501,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "794d401c-9410-4f39-9fd8-787a90a391cc", + "id": "9e5178d8", "metadata": {}, "outputs": [], "source": [ @@ -556,7 +512,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "ccb162e2-c4ed-4268-82f7-81ef79ab8ddb", + "id": "dd897335", "metadata": {}, "outputs": [], "source": [ @@ -587,7 +543,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "cb208afd-5ec0-4995-82ee-8611ade423e3", + "id": "ad9bfa87", "metadata": {}, "outputs": [ { @@ -608,10 +564,8 @@ }, { "cell_type": "markdown", - "id": "2cb59c62-389e-4292-8cb5-1fbfc883076b", - "metadata": { - "collapsed": false - }, + "id": "38e5da2d", + "metadata": {}, "source": [ "## Neural Ratio Estimation\n", "\n", @@ -621,7 +575,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "6078a8bb-c03f-4649-8035-632581f0b8c2", + "id": "f00869bd", "metadata": {}, "outputs": [], "source": [ @@ -633,7 +587,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "1644654f-12e3-4655-a8fc-00f80c4dde39", + "id": "0f48b3fe", "metadata": {}, "outputs": [], "source": [ @@ -643,7 +597,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "337b13c5-e6f8-460f-80c4-bdec4b30e93f", + "id": "d9153e23", "metadata": {}, "outputs": [], "source": [ @@ -677,7 +631,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "f70d4cb3-b283-4b36-b259-5c8cc4b540c8", + "id": "318837dc", "metadata": {}, "outputs": [], "source": [ @@ -694,7 +648,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "8a0b3de2-b630-4502-ace1-2a4b827451be", + "id": "feb90dcb", "metadata": {}, "outputs": [ { @@ -716,20 +670,8 @@ ], "metadata": { "kernelspec": { - "argv": [ - "python", - "-m", - "ipykernel_launcher", - "-f", - "{connection_file}" - ], "display_name": "Python 3 (ipykernel)", - "env": null, - "interrupt_mode": "signal", "language": "python", - "metadata": { - "debugger": true - }, "name": "python3" }, "language_info": { @@ -742,7 +684,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" }, "name": "18_training_interface.ipynb", "toc": { diff --git a/docs/tutorials/Example_00_HodgkinHuxleyModel.ipynb b/docs/tutorials/Example_00_HodgkinHuxleyModel.ipynb index da8b1ae0a..c584bbe73 100644 --- a/docs/tutorials/Example_00_HodgkinHuxleyModel.ipynb +++ b/docs/tutorials/Example_00_HodgkinHuxleyModel.ipynb @@ -20,7 +20,7 @@ "metadata": {}, "source": [ "Note, you find the original version of this notebook in the `sbi` repository under\n", - "[tutorials/Example_00_HodgkinHuxleyModel.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/Example_00_HodgkinHuxleyModel.ipynb).\n" + "[docs/tutorials/Example_00_HodgkinHuxleyModel.ipynb](https://github.com/sbi-dev/sbi/blob/main/docs/tutorials/Example_00_HodgkinHuxleyModel.ipynb).\n" ] }, { @@ -619,7 +619,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/docs/tutorials/Example_01_DecisionMakingModel.ipynb b/docs/tutorials/Example_01_DecisionMakingModel.ipynb index a7b58a27b..7da43c37b 100644 --- a/docs/tutorials/Example_01_DecisionMakingModel.ipynb +++ b/docs/tutorials/Example_01_DecisionMakingModel.ipynb @@ -7,7 +7,7 @@ "# SBI for decision-making models\n", "\n", "In [a previous\n", - "tutorial](https://sbi-dev.github.io/sbi/latest/tutorials/12_iid_data_and_permutation_invariant_embeddings.md),\n", + "tutorial](https://sbi.readthedocs.io/en/latest/tutorials/12_iid_data_and_permutation_invariant_embeddings.html),\n", "we showed how to use SBI with trial-based iid data. Such scenarios can arise,\n", "for example, in models of perceptual decision making. In addition to trial-based\n", "iid data points, these models often come with mixed data types and varying\n", @@ -20,7 +20,7 @@ "metadata": {}, "source": [ "Note, you find the original version of this notebook in the `sbi` repository under\n", - "[tutorials/Example_01_DecisionMakingModel.ipynb](https://github.com/sbi-dev/sbi/blob/main/tutorials/Example_01_DecisionMakingModel.ipynb)." + "[docs/tutorials/Example_01_DecisionMakingModel.ipynb](https://github.com/sbi-dev/sbi/blob/main/docs/tutorials/Example_01_DecisionMakingModel.ipynb)." ] }, { @@ -725,7 +725,7 @@ ], "metadata": { "kernelspec": { - "display_name": "sbi", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -739,7 +739,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.12.4" } }, "nbformat": 4, From bd2735f419eb18068e6a31a4a246f51995f55160 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 17:39:01 +0100 Subject: [PATCH 11/36] internal dataclasses but external stringly... --- .../potentials/score_based_potential.py | 10 +++--- sbi/inference/potentials/score_fn_util.py | 35 +++++++++++-------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 82a566e59..0c6386231 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -79,8 +79,8 @@ def __init__( self.score_estimator.eval() self.iid_method = iid_method self.iid_params = iid_params - self.guidance_method = None - self.guidance_params = None + self.guidance_method = guidance_method + self.guidance_params = guidance_params super().__init__(prior, x_o, device=device) def set_x( @@ -192,9 +192,9 @@ def gradient( ) if self.guidance_method is not None: - score_fn = get_guidance_method(self.guidance_method)( - self.score_estimator, self.prior, **(self.guidance_params or {}) - ) + score_wrapper, cfg = get_guidance_method(self.guidance_method) + cfg_params = cfg(**(self.guidance_params or {})) + score_fn = score_wrapper(self.score_estimator, self.prior, cfg_params) else: score_fn = self.score_estimator diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 61c777f5f..afb42d1f1 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -17,6 +17,8 @@ ) from sbi.utils.torchutils import ensure_theta_batched +from dataclasses import dataclass + IID_METHODS = {} GUIDANCE_METHODS = {} @@ -46,26 +48,27 @@ def get_guidance_method(name: str) -> Type["ScoreAdaptation"]: name: The name of the guidance method. Returns: - The guidance method class. + The guidance method class and its default configuration. """ if name not in GUIDANCE_METHODS: raise NotImplementedError(f"Method {name} for guidance not implemented.") return GUIDANCE_METHODS[name] -def register_guidance_method(name: str) -> Callable: +def register_guidance_method(name: str, default_cfg: Optional[Type] = None) -> Callable: r""" - Registers a guidance method. + Registers a guidance method and its default configuration. Args: name: The name of the guidance method. + default_cfg: The default configuration class for the guidance method. Returns: A decorator function to register the guidance method class. """ def decorator(cls: Type["ScoreAdaptation"]) -> Type["ScoreAdaptation"]: - GUIDANCE_METHODS[name] = cls + GUIDANCE_METHODS[name] = (cls, default_cfg) return cls return decorator @@ -112,17 +115,20 @@ def __init__( def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): pass +@dataclass +class AffineClassifierFreeGuidanceCfg: + prior_scale: float | Tensor = 1.0 + prior_shift: float | Tensor = 0.0 + likelihood_scale: float | Tensor = 1.0 + likelihood_shift: float | Tensor = 0.0 -@register_guidance_method("classifier_free") -class ClassifierFreeGuidance(ScoreAdaptation): +@register_guidance_method("affine_classifier_free", AffineClassifierFreeGuidanceCfg) +class AffineClassifierFreeGuidance(ScoreAdaptation): def __init__( self, score_estimator: ConditionalScoreEstimator, prior: Optional[Distribution], - prior_scale: float | Tensor, - prior_shift: float | Tensor, - likelihood_scale: float | Tensor, - likelihood_shift: float | Tensor, + cfg: AffineClassifierFreeGuidanceCfg, device: str = "cpu", ): """This class manages manipulating the score estimator to temper of shift the @@ -144,11 +150,10 @@ def __init__( " provide as least an improper empirical prior." ) - self.prior_scale = prior_scale - self.prior_shift = prior_shift - self.likelihood_scale = likelihood_scale - self.likelihood_shift = likelihood_shift - + self.prior_scale = torch.tensor(cfg.prior_scale, device=device) + self.prior_shift = torch.tensor(cfg.prior_shift, device=device) + self.likelihood_scale = torch.tensor(cfg.likelihood_scale, device=device) + self.likelihood_shift = torch.tensor(cfg.likelihood_shift, device=device) super().__init__(score_estimator, prior, device) def marginal_prior_score(self, theta: Tensor, time: Tensor): From 762ed437882858656bdfe9d60475bc286f736288 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 11:09:23 +0100 Subject: [PATCH 12/36] Other more general guidance methods --- .../potentials/score_based_potential.py | 2 +- sbi/inference/potentials/score_fn_util.py | 111 +++++++++++++++++- 2 files changed, 110 insertions(+), 3 deletions(-) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 0c6386231..96fc26884 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -209,7 +209,7 @@ def gradient( self.score_estimator, self.prior, **(self.iid_params or {}) ) - score = score_fn_iid(theta, self.x_o, time) + score = score_fn_iid(theta, self.x_o, time) return score diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index afb42d1f1..416438308 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -131,12 +131,12 @@ def __init__( cfg: AffineClassifierFreeGuidanceCfg, device: str = "cpu", ): - """This class manages manipulating the score estimator to temper of shift the + """This class manages manipulating the score estimator to temper or shift the prior and likelihood. This is usually known as classifier-free guidance. And works by decomposing the posterior score into a prior and likelihood component. These can then be scaled - and shifted to impose additional constraints on the posterior. + and shifted to impose change the posterior to p Args: score_estimator: The score estimator. @@ -179,6 +179,113 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No return ll_score_mod + prior_score_mod +@dataclass +class ImpaintGuidanceCfg: + conditioned_indices: list[int] + imputed_value: float | Tensor + + +@register_guidance_method("impaint", ImpaintGuidanceCfg) +class ImpaintGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + cfg: ImpaintGuidanceCfg, + device: str = "cpu", + ): + """This class manages manipulating the score estimator to impute values for + certain indices of the input. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + cfg: Configuration for the impaint guidance. + device: The device on which to evaluate the potential. + """ + self.conditioned_indices = torch.tensor(cfg.conditioned_indices, device=device) + self.imputed_value = torch.tensor(cfg.imputed_value, device=device) + super().__init__(score_estimator, prior, device) + + def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): + if time is None: + time = torch.tensor([self.score_estimator.t_min]) + + noise = torch.randn_like(self.imputed_value) + m = self.score_estimator.mean_t_fn(time) + std = self.score_estimator.std_fn(time) + imputed_value_t = m * self.imputed_value + std * noise + + input = input.clone() + input[..., self.conditioned_indices] = imputed_value_t + + score = self.score_estimator(input, condition, time) + + # Set score to zero for the conditioned indices + score[..., self.conditioned_indices] = 0.0 + + return score + + +@dataclass +class UniversalGuidanceCfg: + guidance_fn: Callable[[Tensor, Tensor, Tensor, Tensor], Tensor] + guidance_fn_score: Optional[Callable[[Tensor, Tensor, Tensor, Tensor], Tensor]] = ( + None + ) + + +@register_guidance_method("universal", UniversalGuidanceCfg) +class UniversalGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + cfg: UniversalGuidanceCfg, + device: str = "cpu", + ): + """This class manages manipulating the score estimator using a custom guidance + function. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + cfg: Configuration for the universal guidance. + device: The device on which to evaluate the potential. + """ + self.guidance_fn = cfg.guidance_fn + + if cfg.guidance_fn_score is None: + + def guidance_fn_score(input, condition, m, std): + with torch.enable_grad(): + input = input.detach().clone().requires_grad_(True) + score = torch.autograd.grad( + cfg.guidance_fn(input, condition, m, std).sum(), + input, + create_graph=True, + )[0] + return score + + self.guidance_fn_score = guidance_fn_score + else: + self.guidance_fn_score = cfg.guidance_fn_score + + super().__init__(score_estimator, prior, device) + + def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): + if time is None: + time = torch.tensor([self.score_estimator.t_min]) + score = self.score_estimator(input, condition, time) + m = self.score_estimator.mean_t_fn(time) + std = self.score_estimator.std_fn(time) + + # Tweedie's formula for denoising + denoised_input = (input + std**2 * score) / m + guidance_score = self.guidance_fn_score(denoised_input, condition, m, std) + + return score + guidance_score + class IIDScoreFunction(ABC): def __init__( From 9653d0e6279e367828e073932d4a620c885eebcd Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 12:08:06 +0100 Subject: [PATCH 13/36] universal guidance working --- tests/score_samplers_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/score_samplers_test.py b/tests/score_samplers_test.py index 7915d1bff..7a8d69025 100644 --- a/tests/score_samplers_test.py +++ b/tests/score_samplers_test.py @@ -73,6 +73,7 @@ def test_score_fn_iid_on_different_priors(sde_type, iid_method, num_dim): assert torch.isfinite(output).all(), "Output contains non-finite values" + @pytest.mark.parametrize("sde_type", ["vp", "ve", "subvp"]) @pytest.mark.parametrize("predictor", ("euler_maruyama",)) @pytest.mark.parametrize("corrector", (None, "gibbs", "langevin")) From fe23d43e110fd51c2e5a59985c903f2a04e34c4b Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 12:16:45 +0100 Subject: [PATCH 14/36] Specialized child class for interval constriants --- sbi/inference/potentials/score_fn_util.py | 40 ++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 416438308..8120b6863 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -6,6 +6,7 @@ import torch from torch import Tensor from torch.distributions import Distribution +import torch.nn.functional as F from sbi.neural_nets.estimators.score_estimator import ConditionalScoreEstimator from sbi.utils.score_utils import ( @@ -184,7 +185,6 @@ class ImpaintGuidanceCfg: conditioned_indices: list[int] imputed_value: float | Tensor - @register_guidance_method("impaint", ImpaintGuidanceCfg) class ImpaintGuidance(ScoreAdaptation): def __init__( @@ -286,6 +286,44 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No return score + guidance_score +@dataclass +class IntervalGuidanceCfg: + lower_bound: float | Tensor + upper_bound: float | Tensor + scale_factor: float = 0.1 + + +@register_guidance_method("interval", IntervalGuidanceCfg) +class IntervalGuidance(UniversalGuidance): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + cfg: IntervalGuidanceCfg, + device: str = "cpu", + ): + """Implements interval guidance to constrain parameters within bounds. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + cfg: Configuration specifying the interval bounds. + device: The device on which to evaluate the potential. + """ + + def interval_fn(input, condition, m, std): + scale = cfg.scale_factor / (m**2 * std**2) + return F.logsigmoid(scale * (input - cfg.upper_bound)) + F.logsigmoid( + -scale * (input - cfg.lower_bound) + ) + + super().__init__( + score_estimator, + prior, + UniversalGuidanceCfg(guidance_fn=interval_fn), + device=device, + ) + class IIDScoreFunction(ABC): def __init__( From 4789025a651bf3b987c73c1f02dcf55a5ad449f9 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 10:13:20 +0100 Subject: [PATCH 15/36] Some progress --- .../potentials/score_based_potential.py | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 99f4a420d..e1de31102 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -331,3 +331,66 @@ def __call__(self, input): self.posterior_score_based_potential.__call__, self.posterior_score_based_potential.gradient, ) + + +class ScoreAdaptation(ABC): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to impose additional + constraints on the posterior via guidance. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + self.score_estimator = score_estimator + self.prior = prior + self.device = device + + @abstractmethod + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + pass + + +class ClassifierFreeGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + prior_scale: float | Tensor, + prior_shift: float | Tensor, + likelihood_scale: float | Tensor, + likelihood_shift: float | Tensor, + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to temper of shift the + prior and likelihood. + + This is usually known as classifier-free guidance. And works by decomposing the + posterior score into a prior and likelihood component. These can then be scaled + and shifted to impose additional constraints on the posterior. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + + if prior is None: + raise ValueError("Prior is required for classifier-free guidance, please" + " provide as least an improper empirical prior.") + + self.prior_scale = prior_scale + self.prior_shift = prior_shift + self.likelihood_scale = likelihood_scale + self.likelihood_shift = likelihood_shift + + super().__init__(score_estimator, prior, device) + + + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): From 7b435834003d41e1905a6ca905d7fec8f176e14e Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 11:13:53 +0100 Subject: [PATCH 16/36] Moving and renaming. Refactoring IID function to reduce code redundancy --- .../potentials/score_based_potential.py | 63 ------ .../{score_fn_iid.py => score_fn_util.py} | 187 +++++++++++++----- 2 files changed, 142 insertions(+), 108 deletions(-) rename sbi/inference/potentials/{score_fn_iid.py => score_fn_util.py} (84%) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index e1de31102..99f4a420d 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -331,66 +331,3 @@ def __call__(self, input): self.posterior_score_based_potential.__call__, self.posterior_score_based_potential.gradient, ) - - -class ScoreAdaptation(ABC): - def __init__( - self, - score_estimator: ConditionalScoreEstimator, - prior: Optional[Distribution], - device: str = "cpu", - ): - """ This class manages manipulating the score estimator to impose additional - constraints on the posterior via guidance. - - Args: - score_estimator: The score estimator. - prior: The prior distribution. - device: The device on which to evaluate the potential. - """ - self.score_estimator = score_estimator - self.prior = prior - self.device = device - - @abstractmethod - def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): - pass - - -class ClassifierFreeGuidance(ScoreAdaptation): - def __init__( - self, - score_estimator: ConditionalScoreEstimator, - prior: Optional[Distribution], - prior_scale: float | Tensor, - prior_shift: float | Tensor, - likelihood_scale: float | Tensor, - likelihood_shift: float | Tensor, - device: str = "cpu", - ): - """ This class manages manipulating the score estimator to temper of shift the - prior and likelihood. - - This is usually known as classifier-free guidance. And works by decomposing the - posterior score into a prior and likelihood component. These can then be scaled - and shifted to impose additional constraints on the posterior. - - Args: - score_estimator: The score estimator. - prior: The prior distribution. - device: The device on which to evaluate the potential. - """ - - if prior is None: - raise ValueError("Prior is required for classifier-free guidance, please" - " provide as least an improper empirical prior.") - - self.prior_scale = prior_scale - self.prior_shift = prior_shift - self.likelihood_scale = likelihood_scale - self.likelihood_shift = likelihood_shift - - super().__init__(score_estimator, prior, device) - - - def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): diff --git a/sbi/inference/potentials/score_fn_iid.py b/sbi/inference/potentials/score_fn_util.py similarity index 84% rename from sbi/inference/potentials/score_fn_iid.py rename to sbi/inference/potentials/score_fn_util.py index 60b00e674..8aaa88e51 100644 --- a/sbi/inference/potentials/score_fn_iid.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -18,6 +18,7 @@ from sbi.utils.torchutils import ensure_theta_batched IID_METHODS = {} +GUIDANCE_METHODS = {} def get_iid_method(name: str) -> Type["IIDScoreFunction"]: @@ -36,6 +37,39 @@ def get_iid_method(name: str) -> Type["IIDScoreFunction"]: ) return IID_METHODS[name] +def get_guidance_method(name: str) -> Type["ScoreAdaptation"]: + r""" + Retrieves the guidance method by name. + + Args: + name: The name of the guidance method. + + Returns: + The guidance method class. + """ + if name not in GUIDANCE_METHODS: + raise NotImplementedError( + f"Method {name} for guidance not implemented." + ) + return GUIDANCE_METHODS[name] + +def register_guidance_method(name: str) -> Callable: + r""" + Registers a guidance method. + + Args: + name: The name of the guidance method. + + Returns: + A decorator function to register the guidance method class. + """ + + def decorator(cls: Type["ScoreAdaptation"]) -> Type["ScoreAdaptation"]: + GUIDANCE_METHODS[name] = cls + return cls + + return decorator + def register_iid_method(name: str) -> Callable: r""" @@ -55,6 +89,90 @@ def decorator(cls: Type["IIDScoreFunction"]) -> Type["IIDScoreFunction"]: return decorator +class ScoreAdaptation(ABC): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to impose additional + constraints on the posterior via guidance. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + self.score_estimator = score_estimator + self.prior = prior + self.device = device + + @abstractmethod + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + pass + +@register_guidance_method("classifier_free") +class ClassifierFreeGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + prior_scale: float | Tensor, + prior_shift: float | Tensor, + likelihood_scale: float | Tensor, + likelihood_shift: float | Tensor, + device: str = "cpu", + ): + """ This class manages manipulating the score estimator to temper of shift the + prior and likelihood. + + This is usually known as classifier-free guidance. And works by decomposing the + posterior score into a prior and likelihood component. These can then be scaled + and shifted to impose additional constraints on the posterior. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + device: The device on which to evaluate the potential. + """ + + if prior is None: + raise ValueError("Prior is required for classifier-free guidance, please" + " provide as least an improper empirical prior.") + + self.prior_scale = prior_scale + self.prior_shift = prior_shift + self.likelihood_scale = likelihood_scale + self.likelihood_shift = likelihood_shift + + super().__init__(score_estimator, prior, device) + + def marginal_prior_score(self, theta: Tensor, time: Tensor): + """ Computes the marginal prior score analyticaly (or approximatly) + """ + m = self.score_estimator.mean_t_fn(time) + std = self.score_estimator.std_fn(time) + marginal_prior = marginalize(self.prior, m, std) + marginal_prior_score = compute_score(marginal_prior, theta) + return marginal_prior_score + + + def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + if time is None: + time = torch.tensor([self.score_estimator.t_min]) + + posterior_score = self.score_estimator(input=theta, condition=x_o, time=time) + prior_score = self.marginal_prior_score(theta, time) + + ll_score = posterior_score - prior_score + ll_score_mod = ll_score * self.likelihood_scale + self.likelihood_shift + prior_score_mod = prior_score * self.prior_scale + self.prior_shift + + return ll_score_mod + prior_score_mod + + + class IIDScoreFunction(ABC): def __init__( self, @@ -177,39 +295,14 @@ def __call__( base_score = self.score_estimator(inputs, conditions, time) # Compute the prior score - prior_score = self.prior_score_weight_fn(time) * self.prior_score_fn(inputs) + + prior_score = self.prior_score_weight_fn(time) * compute_score(self.prior, inputs) # Accumulate score = (1 - N) * prior_score + base_score.sum(-2, keepdim=True) return score - def prior_score_fn(self, theta: Tensor) -> Tensor: - r""" - Computes the score of the prior distribution. - - Args: - theta: The parameters at which to evaluate the prior score. - - Returns: - The computed prior score. - """ - # NOTE The try except is for unifrom priors which do not have a grad, and - # implementations that do not implement the log_prob method. - try: - with torch.enable_grad(): - theta = theta.detach().clone().requires_grad_(True) - prior_log_prob = self.prior.log_prob(theta) - prior_score = torch.autograd.grad( - prior_log_prob, - theta, - grad_outputs=torch.ones_like(prior_log_prob), - create_graph=True, - )[0].detach() - except Exception: - prior_score = torch.zeros_like(theta) - return prior_score - class BaseGaussCorrectedScoreFunction(IIDScoreFunction): def __init__( @@ -310,24 +403,10 @@ def marginal_prior_score_fn(self, time: Tensor, inputs: Tensor) -> Tensor: Returns: Marginal prior score. """ - # NOTE: This is for the uniform distribution and distirbutions that do not - # implement a log_prob. - try: - with torch.enable_grad(): - inputs = inputs.clone().detach().requires_grad_(True) - m = self.score_estimator.mean_t_fn(time) - std = self.score_estimator.std_fn(time) - p = marginalize(self.prior, m, std) - log_p = p.log_prob(inputs) - prior_score = torch.autograd.grad( - log_p, - inputs, - grad_outputs=torch.ones_like(log_p), - create_graph=True, - )[0].detach() - except Exception: - prior_score = torch.zeros_like(inputs) - + m = self.score_estimator.mean_t_fn(time) + std = self.score_estimator.std_fn(time) + p = marginalize(self.prior, m, std) + prior_score = compute_score(p, inputs) return prior_score def marginal_denoising_prior_precision_fn( @@ -691,6 +770,24 @@ def marginal_denoising_posterior_precision_est_fn( return denoising_posterior_precision + +def compute_score(p: Distribution, inputs: Tensor): + # NOTE The try except is for unifrom priors which do not have a grad, and + # implementations that do not implement the log_prob method. + try: + with torch.enable_grad(): + inputs = inputs.detach().clone().requires_grad_(True) + log_prob = p.log_prob(inputs) + score = torch.autograd.grad( + log_prob, + inputs, + grad_outputs=torch.ones_like(log_prob), + create_graph=True, + )[0].detach() + except Exception: + score = torch.zeros_like(inputs) + return score + def ensure_lam_positive_definite( denoising_prior_precision: torch.Tensor, denoising_posterior_precision: torch.Tensor, From ec7ae065b09036d32c7897a41a20e8a653bcfa89 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 16:07:54 +0100 Subject: [PATCH 17/36] basic api on potentials --- .../potentials/score_based_potential.py | 27 ++++++++++++++++--- sbi/inference/potentials/score_fn_util.py | 2 +- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 99f4a420d..d4182e3cd 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -10,7 +10,7 @@ from zuko.transforms import FreeFormJacobianTransform from sbi.inference.potentials.base_potential import BasePotential -from sbi.inference.potentials.score_fn_iid import get_iid_method +from sbi.inference.potentials.score_fn_util import get_iid_method, get_guidance_method from sbi.neural_nets.estimators.score_estimator import ConditionalScoreEstimator from sbi.neural_nets.estimators.shape_handling import ( reshape_to_batch_event, @@ -58,7 +58,9 @@ def __init__( prior: Optional[Distribution], x_o: Optional[Tensor] = None, iid_method: str = "auto_gauss", - iid_params: Optional[Dict[str, Any]] = None, + iid_params: Optional[Dict[str, Any]] = None, # NOTE: dataclasses! + guidance_method: Optional[str] = None, + guidance_params: Optional[Dict[str, Any]] = None, device: str = "cpu", ): r"""Returns the score function for score-based methods. @@ -77,6 +79,8 @@ def __init__( self.score_estimator.eval() self.iid_method = iid_method self.iid_params = iid_params + self.guidance_method = None + self.guidance_params = None super().__init__(prior, x_o, device=device) def set_x( @@ -85,6 +89,8 @@ def set_x( x_is_iid: Optional[bool] = False, iid_method: str = "auto_gauss", iid_params: Optional[Dict[str, Any]] = None, + guidance_method: Optional[str] = None, + guidance_params: Optional[Dict[str, Any]] = None, atol: float = 1e-5, rtol: float = 1e-6, exact: bool = True, @@ -108,6 +114,8 @@ def set_x( super().set_x(x_o, x_is_iid) self.iid_method = iid_method self.iid_params = iid_params + self.guidance_method = guidance_method + self.guidance_params = guidance_params # NOTE: Once IID potential evaluation is supported. This needs to be adapted. # See #1450. if not x_is_iid and (self._x_o is not None): @@ -142,6 +150,11 @@ def __call__( ) self.score_estimator.eval() + if self.guidance_method is not None: + raise NotImplementedError( + "Guidance does not yet supported for potential evaluation." + ) + with torch.set_grad_enabled(track_gradients): log_probs = self.flow.log_prob(theta_density_estimator).squeeze(-1) # Force probability to be zero outside prior support. @@ -178,9 +191,17 @@ def gradient( the potential or manually set self._x_o." ) + if self.guidance_method is not None: + score_fn = get_guidance_method(self.guidance_method)( + self.score_estimator, self.prior, **(self.guidance_params or {}) + ) + else: + score_fn = self.score_estimator + + with torch.set_grad_enabled(track_gradients): if not self.x_is_iid or self._x_o.shape[0] == 1: - score = self.score_estimator.forward( + score = score_fn( input=theta, condition=self.x_o, time=time ) else: diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 8aaa88e51..257e4a6c7 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -784,7 +784,7 @@ def compute_score(p: Distribution, inputs: Tensor): grad_outputs=torch.ones_like(log_prob), create_graph=True, )[0].detach() - except Exception: + except Exception: score = torch.zeros_like(inputs) return score From 1469881b6f5ecaaf5ae153b95807aa77589d1192 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 16:32:07 +0100 Subject: [PATCH 18/36] working minimal example --- sbi/inference/posteriors/score_posterior.py | 9 +++- .../potentials/score_based_potential.py | 9 ++-- sbi/inference/potentials/score_fn_util.py | 42 ++++++++++--------- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/sbi/inference/posteriors/score_posterior.py b/sbi/inference/posteriors/score_posterior.py index 0d6594d98..ed1893496 100644 --- a/sbi/inference/posteriors/score_posterior.py +++ b/sbi/inference/posteriors/score_posterior.py @@ -107,6 +107,8 @@ def sample( ts: Optional[Tensor] = None, iid_method: str = "auto_gauss", iid_params: Optional[Dict] = None, + guidance_method: Optional[str] = None, + guidance_params: Optional[Dict] = None, max_sampling_batch_size: int = 10_000, sample_with: Optional[str] = None, show_progress_bars: bool = True, @@ -155,7 +157,12 @@ def sample( x = reshape_to_batch_event(x, self.score_estimator.condition_shape) is_iid = x.shape[0] > 1 self.potential_fn.set_x( - x, x_is_iid=is_iid, iid_method=iid_method, iid_params=iid_params + x, + x_is_iid=is_iid, + iid_method=iid_method, + iid_params=iid_params, + guidance_method=guidance_method, + guidance_params=guidance_params, ) num_samples = torch.Size(sample_shape).numel() diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index d4182e3cd..82a566e59 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -10,7 +10,7 @@ from zuko.transforms import FreeFormJacobianTransform from sbi.inference.potentials.base_potential import BasePotential -from sbi.inference.potentials.score_fn_util import get_iid_method, get_guidance_method +from sbi.inference.potentials.score_fn_util import get_guidance_method, get_iid_method from sbi.neural_nets.estimators.score_estimator import ConditionalScoreEstimator from sbi.neural_nets.estimators.shape_handling import ( reshape_to_batch_event, @@ -58,7 +58,7 @@ def __init__( prior: Optional[Distribution], x_o: Optional[Tensor] = None, iid_method: str = "auto_gauss", - iid_params: Optional[Dict[str, Any]] = None, # NOTE: dataclasses! + iid_params: Optional[Dict[str, Any]] = None, # NOTE: dataclasses! guidance_method: Optional[str] = None, guidance_params: Optional[Dict[str, Any]] = None, device: str = "cpu", @@ -198,12 +198,9 @@ def gradient( else: score_fn = self.score_estimator - with torch.set_grad_enabled(track_gradients): if not self.x_is_iid or self._x_o.shape[0] == 1: - score = score_fn( - input=theta, condition=self.x_o, time=time - ) + score = score_fn(input=theta, condition=self.x_o, time=time) else: assert self.prior is not None, "Prior is required for iid methods." diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 257e4a6c7..61c777f5f 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -37,6 +37,7 @@ def get_iid_method(name: str) -> Type["IIDScoreFunction"]: ) return IID_METHODS[name] + def get_guidance_method(name: str) -> Type["ScoreAdaptation"]: r""" Retrieves the guidance method by name. @@ -48,11 +49,10 @@ def get_guidance_method(name: str) -> Type["ScoreAdaptation"]: The guidance method class. """ if name not in GUIDANCE_METHODS: - raise NotImplementedError( - f"Method {name} for guidance not implemented." - ) + raise NotImplementedError(f"Method {name} for guidance not implemented.") return GUIDANCE_METHODS[name] + def register_guidance_method(name: str) -> Callable: r""" Registers a guidance method. @@ -96,7 +96,7 @@ def __init__( prior: Optional[Distribution], device: str = "cpu", ): - """ This class manages manipulating the score estimator to impose additional + """This class manages manipulating the score estimator to impose additional constraints on the posterior via guidance. Args: @@ -112,6 +112,7 @@ def __init__( def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): pass + @register_guidance_method("classifier_free") class ClassifierFreeGuidance(ScoreAdaptation): def __init__( @@ -124,7 +125,7 @@ def __init__( likelihood_shift: float | Tensor, device: str = "cpu", ): - """ This class manages manipulating the score estimator to temper of shift the + """This class manages manipulating the score estimator to temper of shift the prior and likelihood. This is usually known as classifier-free guidance. And works by decomposing the @@ -138,8 +139,10 @@ def __init__( """ if prior is None: - raise ValueError("Prior is required for classifier-free guidance, please" - " provide as least an improper empirical prior.") + raise ValueError( + "Prior is required for classifier-free guidance, please" + " provide as least an improper empirical prior." + ) self.prior_scale = prior_scale self.prior_shift = prior_shift @@ -148,22 +151,22 @@ def __init__( super().__init__(score_estimator, prior, device) - def marginal_prior_score(self, theta: Tensor, time: Tensor): - """ Computes the marginal prior score analyticaly (or approximatly) - """ + def marginal_prior_score(self, theta: Tensor, time: Tensor): + """Computes the marginal prior score analyticaly (or approximatly)""" m = self.score_estimator.mean_t_fn(time) std = self.score_estimator.std_fn(time) - marginal_prior = marginalize(self.prior, m, std) + marginal_prior = marginalize(self.prior, m, std) # type: ignore marginal_prior_score = compute_score(marginal_prior, theta) return marginal_prior_score - - def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): if time is None: time = torch.tensor([self.score_estimator.t_min]) - posterior_score = self.score_estimator(input=theta, condition=x_o, time=time) - prior_score = self.marginal_prior_score(theta, time) + posterior_score = self.score_estimator( + input=input, condition=condition, time=time + ) + prior_score = self.marginal_prior_score(input, time) ll_score = posterior_score - prior_score ll_score_mod = ll_score * self.likelihood_scale + self.likelihood_shift @@ -172,7 +175,6 @@ def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): return ll_score_mod + prior_score_mod - class IIDScoreFunction(ABC): def __init__( self, @@ -296,7 +298,9 @@ def __call__( # Compute the prior score - prior_score = self.prior_score_weight_fn(time) * compute_score(self.prior, inputs) + prior_score = self.prior_score_weight_fn(time) * compute_score( + self.prior, inputs + ) # Accumulate score = (1 - N) * prior_score + base_score.sum(-2, keepdim=True) @@ -770,7 +774,6 @@ def marginal_denoising_posterior_precision_est_fn( return denoising_posterior_precision - def compute_score(p: Distribution, inputs: Tensor): # NOTE The try except is for unifrom priors which do not have a grad, and # implementations that do not implement the log_prob method. @@ -784,10 +787,11 @@ def compute_score(p: Distribution, inputs: Tensor): grad_outputs=torch.ones_like(log_prob), create_graph=True, )[0].detach() - except Exception: + except Exception: score = torch.zeros_like(inputs) return score + def ensure_lam_positive_definite( denoising_prior_precision: torch.Tensor, denoising_posterior_precision: torch.Tensor, From b5edda983b1c917df5febe98fd5438e6464d82e0 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Tue, 18 Mar 2025 17:39:01 +0100 Subject: [PATCH 19/36] internal dataclasses but external stringly... --- .../potentials/score_based_potential.py | 10 +++--- sbi/inference/potentials/score_fn_util.py | 35 +++++++++++-------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 82a566e59..0c6386231 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -79,8 +79,8 @@ def __init__( self.score_estimator.eval() self.iid_method = iid_method self.iid_params = iid_params - self.guidance_method = None - self.guidance_params = None + self.guidance_method = guidance_method + self.guidance_params = guidance_params super().__init__(prior, x_o, device=device) def set_x( @@ -192,9 +192,9 @@ def gradient( ) if self.guidance_method is not None: - score_fn = get_guidance_method(self.guidance_method)( - self.score_estimator, self.prior, **(self.guidance_params or {}) - ) + score_wrapper, cfg = get_guidance_method(self.guidance_method) + cfg_params = cfg(**(self.guidance_params or {})) + score_fn = score_wrapper(self.score_estimator, self.prior, cfg_params) else: score_fn = self.score_estimator diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 61c777f5f..afb42d1f1 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -17,6 +17,8 @@ ) from sbi.utils.torchutils import ensure_theta_batched +from dataclasses import dataclass + IID_METHODS = {} GUIDANCE_METHODS = {} @@ -46,26 +48,27 @@ def get_guidance_method(name: str) -> Type["ScoreAdaptation"]: name: The name of the guidance method. Returns: - The guidance method class. + The guidance method class and its default configuration. """ if name not in GUIDANCE_METHODS: raise NotImplementedError(f"Method {name} for guidance not implemented.") return GUIDANCE_METHODS[name] -def register_guidance_method(name: str) -> Callable: +def register_guidance_method(name: str, default_cfg: Optional[Type] = None) -> Callable: r""" - Registers a guidance method. + Registers a guidance method and its default configuration. Args: name: The name of the guidance method. + default_cfg: The default configuration class for the guidance method. Returns: A decorator function to register the guidance method class. """ def decorator(cls: Type["ScoreAdaptation"]) -> Type["ScoreAdaptation"]: - GUIDANCE_METHODS[name] = cls + GUIDANCE_METHODS[name] = (cls, default_cfg) return cls return decorator @@ -112,17 +115,20 @@ def __init__( def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): pass +@dataclass +class AffineClassifierFreeGuidanceCfg: + prior_scale: float | Tensor = 1.0 + prior_shift: float | Tensor = 0.0 + likelihood_scale: float | Tensor = 1.0 + likelihood_shift: float | Tensor = 0.0 -@register_guidance_method("classifier_free") -class ClassifierFreeGuidance(ScoreAdaptation): +@register_guidance_method("affine_classifier_free", AffineClassifierFreeGuidanceCfg) +class AffineClassifierFreeGuidance(ScoreAdaptation): def __init__( self, score_estimator: ConditionalScoreEstimator, prior: Optional[Distribution], - prior_scale: float | Tensor, - prior_shift: float | Tensor, - likelihood_scale: float | Tensor, - likelihood_shift: float | Tensor, + cfg: AffineClassifierFreeGuidanceCfg, device: str = "cpu", ): """This class manages manipulating the score estimator to temper of shift the @@ -144,11 +150,10 @@ def __init__( " provide as least an improper empirical prior." ) - self.prior_scale = prior_scale - self.prior_shift = prior_shift - self.likelihood_scale = likelihood_scale - self.likelihood_shift = likelihood_shift - + self.prior_scale = torch.tensor(cfg.prior_scale, device=device) + self.prior_shift = torch.tensor(cfg.prior_shift, device=device) + self.likelihood_scale = torch.tensor(cfg.likelihood_scale, device=device) + self.likelihood_shift = torch.tensor(cfg.likelihood_shift, device=device) super().__init__(score_estimator, prior, device) def marginal_prior_score(self, theta: Tensor, time: Tensor): From 51cde805bde216c50bd7e0dfa0a7af17fcc4bea7 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 11:09:23 +0100 Subject: [PATCH 20/36] Other more general guidance methods --- .../potentials/score_based_potential.py | 2 +- sbi/inference/potentials/score_fn_util.py | 111 +++++++++++++++++- 2 files changed, 110 insertions(+), 3 deletions(-) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 0c6386231..96fc26884 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -209,7 +209,7 @@ def gradient( self.score_estimator, self.prior, **(self.iid_params or {}) ) - score = score_fn_iid(theta, self.x_o, time) + score = score_fn_iid(theta, self.x_o, time) return score diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index afb42d1f1..416438308 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -131,12 +131,12 @@ def __init__( cfg: AffineClassifierFreeGuidanceCfg, device: str = "cpu", ): - """This class manages manipulating the score estimator to temper of shift the + """This class manages manipulating the score estimator to temper or shift the prior and likelihood. This is usually known as classifier-free guidance. And works by decomposing the posterior score into a prior and likelihood component. These can then be scaled - and shifted to impose additional constraints on the posterior. + and shifted to impose change the posterior to p Args: score_estimator: The score estimator. @@ -179,6 +179,113 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No return ll_score_mod + prior_score_mod +@dataclass +class ImpaintGuidanceCfg: + conditioned_indices: list[int] + imputed_value: float | Tensor + + +@register_guidance_method("impaint", ImpaintGuidanceCfg) +class ImpaintGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + cfg: ImpaintGuidanceCfg, + device: str = "cpu", + ): + """This class manages manipulating the score estimator to impute values for + certain indices of the input. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + cfg: Configuration for the impaint guidance. + device: The device on which to evaluate the potential. + """ + self.conditioned_indices = torch.tensor(cfg.conditioned_indices, device=device) + self.imputed_value = torch.tensor(cfg.imputed_value, device=device) + super().__init__(score_estimator, prior, device) + + def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): + if time is None: + time = torch.tensor([self.score_estimator.t_min]) + + noise = torch.randn_like(self.imputed_value) + m = self.score_estimator.mean_t_fn(time) + std = self.score_estimator.std_fn(time) + imputed_value_t = m * self.imputed_value + std * noise + + input = input.clone() + input[..., self.conditioned_indices] = imputed_value_t + + score = self.score_estimator(input, condition, time) + + # Set score to zero for the conditioned indices + score[..., self.conditioned_indices] = 0.0 + + return score + + +@dataclass +class UniversalGuidanceCfg: + guidance_fn: Callable[[Tensor, Tensor, Tensor, Tensor], Tensor] + guidance_fn_score: Optional[Callable[[Tensor, Tensor, Tensor, Tensor], Tensor]] = ( + None + ) + + +@register_guidance_method("universal", UniversalGuidanceCfg) +class UniversalGuidance(ScoreAdaptation): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + cfg: UniversalGuidanceCfg, + device: str = "cpu", + ): + """This class manages manipulating the score estimator using a custom guidance + function. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + cfg: Configuration for the universal guidance. + device: The device on which to evaluate the potential. + """ + self.guidance_fn = cfg.guidance_fn + + if cfg.guidance_fn_score is None: + + def guidance_fn_score(input, condition, m, std): + with torch.enable_grad(): + input = input.detach().clone().requires_grad_(True) + score = torch.autograd.grad( + cfg.guidance_fn(input, condition, m, std).sum(), + input, + create_graph=True, + )[0] + return score + + self.guidance_fn_score = guidance_fn_score + else: + self.guidance_fn_score = cfg.guidance_fn_score + + super().__init__(score_estimator, prior, device) + + def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): + if time is None: + time = torch.tensor([self.score_estimator.t_min]) + score = self.score_estimator(input, condition, time) + m = self.score_estimator.mean_t_fn(time) + std = self.score_estimator.std_fn(time) + + # Tweedie's formula for denoising + denoised_input = (input + std**2 * score) / m + guidance_score = self.guidance_fn_score(denoised_input, condition, m, std) + + return score + guidance_score + class IIDScoreFunction(ABC): def __init__( From 251fc88a31d1cfc437730dddfb786fbd6baa7c39 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 12:08:06 +0100 Subject: [PATCH 21/36] universal guidance working --- tests/score_samplers_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/score_samplers_test.py b/tests/score_samplers_test.py index 7915d1bff..7a8d69025 100644 --- a/tests/score_samplers_test.py +++ b/tests/score_samplers_test.py @@ -73,6 +73,7 @@ def test_score_fn_iid_on_different_priors(sde_type, iid_method, num_dim): assert torch.isfinite(output).all(), "Output contains non-finite values" + @pytest.mark.parametrize("sde_type", ["vp", "ve", "subvp"]) @pytest.mark.parametrize("predictor", ("euler_maruyama",)) @pytest.mark.parametrize("corrector", (None, "gibbs", "langevin")) From 4a5f4317c81c9af28f8bbe4295c6a8bb8e8aed4d Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 12:16:45 +0100 Subject: [PATCH 22/36] Specialized child class for interval constriants --- sbi/inference/potentials/score_fn_util.py | 40 ++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 416438308..8120b6863 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -6,6 +6,7 @@ import torch from torch import Tensor from torch.distributions import Distribution +import torch.nn.functional as F from sbi.neural_nets.estimators.score_estimator import ConditionalScoreEstimator from sbi.utils.score_utils import ( @@ -184,7 +185,6 @@ class ImpaintGuidanceCfg: conditioned_indices: list[int] imputed_value: float | Tensor - @register_guidance_method("impaint", ImpaintGuidanceCfg) class ImpaintGuidance(ScoreAdaptation): def __init__( @@ -286,6 +286,44 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No return score + guidance_score +@dataclass +class IntervalGuidanceCfg: + lower_bound: float | Tensor + upper_bound: float | Tensor + scale_factor: float = 0.1 + + +@register_guidance_method("interval", IntervalGuidanceCfg) +class IntervalGuidance(UniversalGuidance): + def __init__( + self, + score_estimator: ConditionalScoreEstimator, + prior: Optional[Distribution], + cfg: IntervalGuidanceCfg, + device: str = "cpu", + ): + """Implements interval guidance to constrain parameters within bounds. + + Args: + score_estimator: The score estimator. + prior: The prior distribution. + cfg: Configuration specifying the interval bounds. + device: The device on which to evaluate the potential. + """ + + def interval_fn(input, condition, m, std): + scale = cfg.scale_factor / (m**2 * std**2) + return F.logsigmoid(scale * (input - cfg.upper_bound)) + F.logsigmoid( + -scale * (input - cfg.lower_bound) + ) + + super().__init__( + score_estimator, + prior, + UniversalGuidanceCfg(guidance_fn=interval_fn), + device=device, + ) + class IIDScoreFunction(ABC): def __init__( From 3652eb5184a7702533f50ac74cc66f80dfdc49d0 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 12:21:57 +0100 Subject: [PATCH 23/36] Formatting --- sbi/inference/potentials/score_based_potential.py | 2 +- sbi/inference/potentials/score_fn_util.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 96fc26884..0c6386231 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -209,7 +209,7 @@ def gradient( self.score_estimator, self.prior, **(self.iid_params or {}) ) - score = score_fn_iid(theta, self.x_o, time) + score = score_fn_iid(theta, self.x_o, time) return score diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 8120b6863..b77171401 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -1,12 +1,13 @@ import functools import math from abc import ABC, abstractmethod +from dataclasses import dataclass from typing import Callable, Optional, Type import torch +import torch.nn.functional as F from torch import Tensor from torch.distributions import Distribution -import torch.nn.functional as F from sbi.neural_nets.estimators.score_estimator import ConditionalScoreEstimator from sbi.utils.score_utils import ( @@ -18,8 +19,6 @@ ) from sbi.utils.torchutils import ensure_theta_batched -from dataclasses import dataclass - IID_METHODS = {} GUIDANCE_METHODS = {} @@ -116,6 +115,7 @@ def __init__( def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): pass + @dataclass class AffineClassifierFreeGuidanceCfg: prior_scale: float | Tensor = 1.0 @@ -123,6 +123,7 @@ class AffineClassifierFreeGuidanceCfg: likelihood_scale: float | Tensor = 1.0 likelihood_shift: float | Tensor = 0.0 + @register_guidance_method("affine_classifier_free", AffineClassifierFreeGuidanceCfg) class AffineClassifierFreeGuidance(ScoreAdaptation): def __init__( @@ -180,11 +181,13 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No return ll_score_mod + prior_score_mod + @dataclass class ImpaintGuidanceCfg: conditioned_indices: list[int] imputed_value: float | Tensor + @register_guidance_method("impaint", ImpaintGuidanceCfg) class ImpaintGuidance(ScoreAdaptation): def __init__( @@ -286,6 +289,7 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No return score + guidance_score + @dataclass class IntervalGuidanceCfg: lower_bound: float | Tensor From 48906b1b77e5e0798637978d6f521954cebddd93 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 18:43:24 +0100 Subject: [PATCH 24/36] typing --- sbi/inference/potentials/score_fn_util.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index b77171401..8483504b1 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -2,7 +2,7 @@ import math from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import Callable, Optional, Type +from typing import Callable, Optional, Type, Union import torch import torch.nn.functional as F @@ -118,10 +118,10 @@ def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): @dataclass class AffineClassifierFreeGuidanceCfg: - prior_scale: float | Tensor = 1.0 - prior_shift: float | Tensor = 0.0 - likelihood_scale: float | Tensor = 1.0 - likelihood_shift: float | Tensor = 0.0 + prior_scale: Union[float, Tensor] = 1.0 + prior_shift: Union[float, Tensor] = 0.0 + likelihood_scale: Union[float, Tensor] = 1.0 + likelihood_shift: Union[float, Tensor] = 0.0 @register_guidance_method("affine_classifier_free", AffineClassifierFreeGuidanceCfg) @@ -173,8 +173,9 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No posterior_score = self.score_estimator( input=input, condition=condition, time=time ) + print(input.shape) prior_score = self.marginal_prior_score(input, time) - + print(posterior_score.shape, prior_score.shape) ll_score = posterior_score - prior_score ll_score_mod = ll_score * self.likelihood_scale + self.likelihood_shift prior_score_mod = prior_score * self.prior_scale + self.prior_shift @@ -292,8 +293,8 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No @dataclass class IntervalGuidanceCfg: - lower_bound: float | Tensor - upper_bound: float | Tensor + lower_bound: Optional[Union[float, Tensor]] + upper_bound: Optional[Union[float, Tensor]] scale_factor: float = 0.1 From 1eba71589abf267026582f9974663b18d2bb354e Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 18:43:39 +0100 Subject: [PATCH 25/36] tests --- tests/score_samplers_test.py | 76 ++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 20 deletions(-) diff --git a/tests/score_samplers_test.py b/tests/score_samplers_test.py index 7a8d69025..84b3cac53 100644 --- a/tests/score_samplers_test.py +++ b/tests/score_samplers_test.py @@ -17,6 +17,27 @@ from sbi.samplers.score import Diffuser from sbi.utils import BoxUniform, MultipleIndependent +def build_some_priors(num_dim: int): + # Diag normal prior + prior1 = Independent(Normal(torch.zeros((num_dim,)), torch.ones((num_dim,))), 1) + # Uniform prior + prior2 = Independent(Uniform(torch.zeros((num_dim,)), torch.ones((num_dim,))), 1) + prior2_2 = BoxUniform(torch.zeros((num_dim,)), torch.ones((num_dim,))) + # Multivariate normal prior + prior3 = MultivariateNormal(torch.zeros((num_dim,)), torch.eye(num_dim)) + # Gamma prior - analytical not implemented but should fall back to general case + prior4 = Independent(Gamma(torch.ones((num_dim,)), torch.ones((num_dim,))), 1) + # Multiple independent prior + if num_dim == 1: + prior5 = Independent(Normal(torch.zeros((num_dim,)), torch.ones((num_dim,))), 1) + else: + prior5 = MultipleIndependent([ + Normal(torch.zeros((1,)), torch.ones((1,))) for _ in range(num_dim) + ]) + + priors = [prior1, prior2, prior2_2, prior3, prior4, prior5] + + return priors @pytest.mark.parametrize("sde_type", ["vp", "ve", "subvp"]) @pytest.mark.parametrize( @@ -28,7 +49,7 @@ "jac_gauss", ], ) -@pytest.mark.parametrize("num_dim", [1, 2, 3]) +@pytest.mark.parametrize("num_dim", [2, 3]) def test_score_fn_iid_on_different_priors(sde_type, iid_method, num_dim): """Test the the iid methods work with the most common priors that are used in practice (or are implemented in this library). @@ -38,27 +59,11 @@ def test_score_fn_iid_on_different_priors(sde_type, iid_method, num_dim): that it doesn't lead to any errors, but does not test the correctness of the integration! """ - mean0 = torch.zeros(num_dim) - std0 = torch.ones(num_dim) + mean0 = torch.zeros((num_dim,)) + std0 = torch.ones((num_dim,)) score_fn = _build_gaussian_score_estimator(sde_type, (num_dim,), mean0, std0) - # Diag normal prior - prior1 = Independent(Normal(torch.zeros(num_dim), torch.ones(num_dim)), 1) - # Uniform prior - prior2 = Independent(Uniform(torch.zeros(num_dim), torch.ones(num_dim)), 1) - prior2_2 = BoxUniform(torch.zeros(num_dim), torch.ones(num_dim)) - # Multivariate normal prior - prior3 = MultivariateNormal(torch.zeros(num_dim), torch.eye(num_dim)) - # Gamma prior - analytical not implemented but should fall back to general case - prior4 = Independent(Gamma(torch.ones(num_dim), torch.ones(num_dim)), 1) - # Multiple independent prior - if num_dim == 1: - prior5 = Independent(Normal(torch.zeros(1), torch.ones(1)), 1) - else: - prior5 = MultipleIndependent([ - Normal(torch.zeros(1), torch.ones(1)) for _ in range(num_dim) - ]) - priors = [prior1, prior2, prior2_2, prior3, prior4, prior5] + priors = build_some_priors(num_dim) x_o_iid = torch.ones((5, 1)) score_fn.set_x(x_o_iid, x_is_iid=True, iid_method=iid_method) inputs = torch.ones((1, 1, num_dim)) @@ -73,6 +78,37 @@ def test_score_fn_iid_on_different_priors(sde_type, iid_method, num_dim): assert torch.isfinite(output).all(), "Output contains non-finite values" +@pytest.mark.parametrize("sde_type", ["vp", "ve", "subvp"]) +@pytest.mark.parametrize( + "guidance_method", + [ + "affine_classifier_free", + ], +) +@pytest.mark.parametrize("num_dim", [1, 2, 3]) +def test_score_fn_guidance(sde_type, guidance_method, num_dim): + """ """ + mean0 = torch.zeros(num_dim) + std0 = torch.ones(num_dim) + score_fn = _build_gaussian_score_estimator(sde_type, (num_dim,), mean0, std0) + x_o = torch.ones(( + 1, + 1, + )) + score_fn.set_x(x_o, guidance_method=guidance_method) + inputs = torch.ones((1, 1, num_dim)) + time = torch.ones(1) + + priors = build_some_priors(num_dim) + for prior in priors: + score_fn.prior = prior + output = score_fn.gradient(inputs, time=time) + + assert output.shape == (1, 1, num_dim), ( + f"Expected shape {(1, 1, num_dim)}, got {output.shape}" + ) + assert torch.isfinite(output).all(), "Output contains non-finite values" + @pytest.mark.parametrize("sde_type", ["vp", "ve", "subvp"]) @pytest.mark.parametrize("predictor", ("euler_maruyama",)) From f29d75cecc5db4a49715de4bf93ceb42e31998b5 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Wed, 19 Mar 2025 18:53:09 +0100 Subject: [PATCH 26/36] check independet prior, problem --- tests/score_samplers_test.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/tests/score_samplers_test.py b/tests/score_samplers_test.py index 84b3cac53..183838653 100644 --- a/tests/score_samplers_test.py +++ b/tests/score_samplers_test.py @@ -19,23 +19,24 @@ def build_some_priors(num_dim: int): # Diag normal prior - prior1 = Independent(Normal(torch.zeros((num_dim,)), torch.ones((num_dim,))), 1) + prior1 = Independent(Normal(torch.zeros(num_dim), torch.ones(num_dim)), 1) # Uniform prior - prior2 = Independent(Uniform(torch.zeros((num_dim,)), torch.ones((num_dim,))), 1) - prior2_2 = BoxUniform(torch.zeros((num_dim,)), torch.ones((num_dim,))) + prior2 = Independent(Uniform(torch.zeros(num_dim), torch.ones(num_dim)), 1) + prior2_2 = BoxUniform(torch.zeros(num_dim), torch.ones(num_dim)) # Multivariate normal prior - prior3 = MultivariateNormal(torch.zeros((num_dim,)), torch.eye(num_dim)) + prior3 = MultivariateNormal(torch.zeros(num_dim), torch.eye(num_dim)) # Gamma prior - analytical not implemented but should fall back to general case - prior4 = Independent(Gamma(torch.ones((num_dim,)), torch.ones((num_dim,))), 1) + prior4 = Independent(Gamma(torch.ones(num_dim), torch.ones(num_dim)), 1) # Multiple independent prior if num_dim == 1: - prior5 = Independent(Normal(torch.zeros((num_dim,)), torch.ones((num_dim,))), 1) + prior5 = Independent(Normal(torch.zeros(1), torch.ones(1)), 1) else: prior5 = MultipleIndependent([ - Normal(torch.zeros((1,)), torch.ones((1,))) for _ in range(num_dim) + Normal(torch.zeros(1), torch.ones(1)) for _ in range(num_dim) ]) - priors = [prior1, prior2, prior2_2, prior3, prior4, prior5] + # Bug in Independent introduced???? + priors = [prior1, prior2, prior2_2]#, prior3, prior4]#, prior5] Something broke return priors @@ -49,7 +50,7 @@ def build_some_priors(num_dim: int): "jac_gauss", ], ) -@pytest.mark.parametrize("num_dim", [2, 3]) +@pytest.mark.parametrize("num_dim", [1, 2, 3]) def test_score_fn_iid_on_different_priors(sde_type, iid_method, num_dim): """Test the the iid methods work with the most common priors that are used in practice (or are implemented in this library). @@ -59,8 +60,8 @@ def test_score_fn_iid_on_different_priors(sde_type, iid_method, num_dim): that it doesn't lead to any errors, but does not test the correctness of the integration! """ - mean0 = torch.zeros((num_dim,)) - std0 = torch.ones((num_dim,)) + mean0 = torch.zeros(num_dim) + std0 = torch.ones(num_dim) score_fn = _build_gaussian_score_estimator(sde_type, (num_dim,), mean0, std0) priors = build_some_priors(num_dim) @@ -91,10 +92,7 @@ def test_score_fn_guidance(sde_type, guidance_method, num_dim): mean0 = torch.zeros(num_dim) std0 = torch.ones(num_dim) score_fn = _build_gaussian_score_estimator(sde_type, (num_dim,), mean0, std0) - x_o = torch.ones(( - 1, - 1, - )) + x_o = torch.ones((1,1,)) score_fn.set_x(x_o, guidance_method=guidance_method) inputs = torch.ones((1, 1, num_dim)) time = torch.ones(1) From c38db7ac76b3f97c1f3ed47221b37fbe8959dad3 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Thu, 20 Mar 2025 08:04:09 +0100 Subject: [PATCH 27/36] Fix hidden bug in score_utils --- .../potentials/score_based_potential.py | 8 +++++--- sbi/utils/score_utils.py | 20 +++++++++++++++---- tests/score_samplers_test.py | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/sbi/inference/potentials/score_based_potential.py b/sbi/inference/potentials/score_based_potential.py index 0c6386231..3b2ac33c6 100644 --- a/sbi/inference/potentials/score_based_potential.py +++ b/sbi/inference/potentials/score_based_potential.py @@ -194,13 +194,15 @@ def gradient( if self.guidance_method is not None: score_wrapper, cfg = get_guidance_method(self.guidance_method) cfg_params = cfg(**(self.guidance_params or {})) - score_fn = score_wrapper(self.score_estimator, self.prior, cfg_params) + score_estimator = score_wrapper( + self.score_estimator, self.prior, cfg_params + ) else: - score_fn = self.score_estimator + score_estimator = self.score_estimator with torch.set_grad_enabled(track_gradients): if not self.x_is_iid or self._x_o.shape[0] == 1: - score = score_fn(input=theta, condition=self.x_o, time=time) + score = score_estimator(input=theta, condition=self.x_o, time=time) else: assert self.prior is not None, "Prior is required for iid methods." diff --git a/sbi/utils/score_utils.py b/sbi/utils/score_utils.py index 1310f92ed..eb8754ecf 100644 --- a/sbi/utils/score_utils.py +++ b/sbi/utils/score_utils.py @@ -52,7 +52,7 @@ def denoise(p: Distribution, m: Tensor, s: Tensor, x_t: Tensor) -> Distribution: def denoise_independent( p: Independent, m: Tensor, s: Tensor, x_t: Tensor -) -> Independent: +) -> Independent | Distribution: """Denoise an independent distribution. Args: @@ -64,7 +64,12 @@ def denoise_independent( Returns: The posterior independent distribution. """ - return Independent(denoise(p.base_dist, m, s, x_t), p.reinterpreted_batch_ndims) + denoised_base_dist = denoise(p.base_dist, m, s, x_t) + batch_shape = denoised_base_dist.batch_shape + if len(batch_shape) < p.reinterpreted_batch_ndims: + return denoised_base_dist + else: + return Independent(denoised_base_dist, p.reinterpreted_batch_ndims) def denoise_gaussian(p: Normal, m: Tensor, s: Tensor, x_t: Tensor) -> Normal: @@ -229,7 +234,9 @@ def marginalize(p: Distribution, m: Tensor, s: Tensor) -> Distribution: return marginalize_empirical(p, m, s) -def marginalize_independent(p: Independent, m: Tensor, s: Tensor) -> Independent: +def marginalize_independent( + p: Independent, m: Tensor, s: Tensor +) -> Independent | Distribution: """Marginalize an independent distribution. Args: @@ -240,7 +247,12 @@ def marginalize_independent(p: Independent, m: Tensor, s: Tensor) -> Independent Returns: The marginal independent distribution. """ - return Independent(marginalize(p.base_dist, m, s), p.reinterpreted_batch_ndims) + marg_base_dist = marginalize(p.base_dist, m, s) + batch_shape = marg_base_dist.batch_shape + if len(batch_shape) < p.reinterpreted_batch_ndims: + return marg_base_dist + else: + return Independent(marg_base_dist, p.reinterpreted_batch_ndims) def marginalize_mixture( diff --git a/tests/score_samplers_test.py b/tests/score_samplers_test.py index 183838653..2ee79eea8 100644 --- a/tests/score_samplers_test.py +++ b/tests/score_samplers_test.py @@ -36,7 +36,7 @@ def build_some_priors(num_dim: int): ]) # Bug in Independent introduced???? - priors = [prior1, prior2, prior2_2]#, prior3, prior4]#, prior5] Something broke + priors = [prior1, prior2, prior2_2, prior3, prior4, prior5] # Something broke return priors From 68616d401c6e4d32b10c5a58777c6b4b7a9bb2ad Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Thu, 20 Mar 2025 08:04:37 +0100 Subject: [PATCH 28/36] Format --- tests/score_samplers_test.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/score_samplers_test.py b/tests/score_samplers_test.py index 2ee79eea8..a0d35710e 100644 --- a/tests/score_samplers_test.py +++ b/tests/score_samplers_test.py @@ -17,6 +17,7 @@ from sbi.samplers.score import Diffuser from sbi.utils import BoxUniform, MultipleIndependent + def build_some_priors(num_dim: int): # Diag normal prior prior1 = Independent(Normal(torch.zeros(num_dim), torch.ones(num_dim)), 1) @@ -40,6 +41,7 @@ def build_some_priors(num_dim: int): return priors + @pytest.mark.parametrize("sde_type", ["vp", "ve", "subvp"]) @pytest.mark.parametrize( "iid_method", @@ -92,7 +94,10 @@ def test_score_fn_guidance(sde_type, guidance_method, num_dim): mean0 = torch.zeros(num_dim) std0 = torch.ones(num_dim) score_fn = _build_gaussian_score_estimator(sde_type, (num_dim,), mean0, std0) - x_o = torch.ones((1,1,)) + x_o = torch.ones(( + 1, + 1, + )) score_fn.set_x(x_o, guidance_method=guidance_method) inputs = torch.ones((1, 1, num_dim)) time = torch.ones(1) From a75a94484c39454292d4c61118f22c4ed38c2ee1 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Thu, 20 Mar 2025 09:42:40 +0100 Subject: [PATCH 29/36] Removing unncessary. Adding tests on basic API --- sbi/inference/potentials/score_fn_util.py | 78 +++++++---------------- tests/score_samplers_test.py | 33 ++++++++-- 2 files changed, 49 insertions(+), 62 deletions(-) diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 8483504b1..e2e0765bc 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -173,9 +173,7 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No posterior_score = self.score_estimator( input=input, condition=condition, time=time ) - print(input.shape) prior_score = self.marginal_prior_score(input, time) - print(posterior_score.shape, prior_score.shape) ll_score = posterior_score - prior_score ll_score_mod = ll_score * self.likelihood_scale + self.likelihood_shift prior_score_mod = prior_score * self.prior_scale + self.prior_shift @@ -183,54 +181,6 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No return ll_score_mod + prior_score_mod -@dataclass -class ImpaintGuidanceCfg: - conditioned_indices: list[int] - imputed_value: float | Tensor - - -@register_guidance_method("impaint", ImpaintGuidanceCfg) -class ImpaintGuidance(ScoreAdaptation): - def __init__( - self, - score_estimator: ConditionalScoreEstimator, - prior: Optional[Distribution], - cfg: ImpaintGuidanceCfg, - device: str = "cpu", - ): - """This class manages manipulating the score estimator to impute values for - certain indices of the input. - - Args: - score_estimator: The score estimator. - prior: The prior distribution. - cfg: Configuration for the impaint guidance. - device: The device on which to evaluate the potential. - """ - self.conditioned_indices = torch.tensor(cfg.conditioned_indices, device=device) - self.imputed_value = torch.tensor(cfg.imputed_value, device=device) - super().__init__(score_estimator, prior, device) - - def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): - if time is None: - time = torch.tensor([self.score_estimator.t_min]) - - noise = torch.randn_like(self.imputed_value) - m = self.score_estimator.mean_t_fn(time) - std = self.score_estimator.std_fn(time) - imputed_value_t = m * self.imputed_value + std * noise - - input = input.clone() - input[..., self.conditioned_indices] = imputed_value_t - - score = self.score_estimator(input, condition, time) - - # Set score to zero for the conditioned indices - score[..., self.conditioned_indices] = 0.0 - - return score - - @dataclass class UniversalGuidanceCfg: guidance_fn: Callable[[Tensor, Tensor, Tensor, Tensor], Tensor] @@ -238,7 +188,6 @@ class UniversalGuidanceCfg: None ) - @register_guidance_method("universal", UniversalGuidanceCfg) class UniversalGuidance(ScoreAdaptation): def __init__( @@ -295,8 +244,8 @@ def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = No class IntervalGuidanceCfg: lower_bound: Optional[Union[float, Tensor]] upper_bound: Optional[Union[float, Tensor]] - scale_factor: float = 0.1 - + mask: Optional[Tensor] = None + scale_factor: float = 0.5 @register_guidance_method("interval", IntervalGuidanceCfg) class IntervalGuidance(UniversalGuidance): @@ -317,10 +266,29 @@ def __init__( """ def interval_fn(input, condition, m, std): + if cfg.lower_bound is None and cfg.upper_bound is None: + raise ValueError( + "At least one of lower_bound or upper_bound is required. Otherwise" + " the guidance function has no effect." + ) + scale = cfg.scale_factor / (m**2 * std**2) - return F.logsigmoid(scale * (input - cfg.upper_bound)) + F.logsigmoid( - -scale * (input - cfg.lower_bound) + upper_bound = ( + F.logsigmoid(scale * (input - cfg.upper_bound)) + if cfg.upper_bound is not None + else torch.zeros_like(input) + ) + lower_bound = ( + F.logsigmoid(-scale * (input - cfg.lower_bound)) + if cfg.lower_bound is not None + else torch.zeros_like(input) ) + out = upper_bound + lower_bound + if cfg.mask is not None: + if cfg.mask.shape != out.shape: + cfg.mask = cfg.mask.unsqueeze(0).expand_as(out) + out = torch.where(cfg.mask, out, torch.zeros_like(out)) + return out super().__init__( score_estimator, diff --git a/tests/score_samplers_test.py b/tests/score_samplers_test.py index a0d35710e..b9720edf3 100644 --- a/tests/score_samplers_test.py +++ b/tests/score_samplers_test.py @@ -85,20 +85,39 @@ def test_score_fn_iid_on_different_priors(sde_type, iid_method, num_dim): @pytest.mark.parametrize( "guidance_method", [ - "affine_classifier_free", + ("affine_classifier_free", {"likelihood_scale": 0.1}), + ("affine_classifier_free", {"likelihood_scale": 10.0, "prior_scale": 1.0}), + ( + "affine_classifier_free", + { + "likelihood_scale": 0.1, + "prior_scale": 1.0, + "prior_shift": 1.0, + "likelihood_shift": 1.0, + }, + ), + ("universal", {"guidance_fn": lambda x, t, y, z: x}), + ( + "universal", + { + "guidance_fn": lambda x, t, y, z: x + 1.0, + "guidance_fn_score": lambda x, t, y, z: x, + }, + ), + ("interval", {"lower_bound": 0.0, "upper_bound": 1.0}), + ("interval", {"lower_bound": None, "upper_bound": 1.0}), + ("interval", {"lower_bound": -1.0, "upper_bound": None}), ], ) @pytest.mark.parametrize("num_dim", [1, 2, 3]) -def test_score_fn_guidance(sde_type, guidance_method, num_dim): +def test_score_fn_guidance_general(sde_type, guidance_method, num_dim): """ """ mean0 = torch.zeros(num_dim) std0 = torch.ones(num_dim) score_fn = _build_gaussian_score_estimator(sde_type, (num_dim,), mean0, std0) - x_o = torch.ones(( - 1, - 1, - )) - score_fn.set_x(x_o, guidance_method=guidance_method) + x_o = torch.ones((1, 1)) + guidance_name, guidance_params = guidance_method + score_fn.set_x(x_o, guidance_method=guidance_name, guidance_params=guidance_params) inputs = torch.ones((1, 1, num_dim)) time = torch.ones(1) From 2efb7c70ec8443bf20db3f437c7484f9b0fd89c7 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Thu, 20 Mar 2025 10:25:18 +0100 Subject: [PATCH 30/36] test lower upper, lower upper where switched --- sbi/inference/potentials/score_fn_util.py | 4 +- tests/linearGaussian_npse_test.py | 84 ++++++++++++++++++++++- 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index e2e0765bc..fdca239cc 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -274,12 +274,12 @@ def interval_fn(input, condition, m, std): scale = cfg.scale_factor / (m**2 * std**2) upper_bound = ( - F.logsigmoid(scale * (input - cfg.upper_bound)) + F.logsigmoid(-scale * (input - cfg.upper_bound)) if cfg.upper_bound is not None else torch.zeros_like(input) ) lower_bound = ( - F.logsigmoid(-scale * (input - cfg.lower_bound)) + F.logsigmoid(scale * (input - cfg.lower_bound)) if cfg.lower_bound is not None else torch.zeros_like(input) ) diff --git a/tests/linearGaussian_npse_test.py b/tests/linearGaussian_npse_test.py index 508954bfb..2479a622f 100644 --- a/tests/linearGaussian_npse_test.py +++ b/tests/linearGaussian_npse_test.py @@ -1,6 +1,7 @@ from typing import List import pytest +import torch from torch import eye, ones, zeros from torch.distributions import MultivariateNormal @@ -217,7 +218,7 @@ def npse_trained_model(sde_type, prior_type): @pytest.mark.slow @pytest.mark.parametrize( - "iid_method, num_trial", + "iid_method, num_trial", [ pytest.param("fnpe", 3, id="fnpe-2trials"), pytest.param("gauss", 3, id="gauss-6trials"), @@ -270,6 +271,87 @@ def test_npse_iid_inference( tol=0.05 * min(num_trial, 8), ) +@pytest.mark.slow +@pytest.mark.parametrize( + "guidance_params", + [ + pytest.param({"lower_bound": 0.0, "upper_bound": 1.0}, id="upper and lower"), + pytest.param({"lower_bound": None, "upper_bound": 1.5}, id="only upper"), + pytest.param({"lower_bound": 1.0, "upper_bound": None}, id="only lower"), + ], +) +def test_npse_interval_guidance(npse_trained_model, guidance_params): + """Test whether NPSE infers well a simple example with available ground truth.""" + num_samples = 1000 + + # Extract data from fixture + score_estimator = npse_trained_model["score_estimator"] + inference = npse_trained_model["inference"] + num_dim = npse_trained_model["num_dim"] + + x_o = zeros(1, num_dim) + posterior = inference.build_posterior(score_estimator) + posterior.set_default_x(x_o) + samples = posterior.sample( + (num_samples,), guidance_method="interval", guidance_params=guidance_params + ) + samples_soft_lower = torch.min(samples, dim=0).values + 1e-1 + samples_soft_upper = torch.max(samples, dim=0).values - 1e-1 + + if guidance_params["lower_bound"] is not None: + assert (samples_soft_lower >= guidance_params["lower_bound"]).all() + if guidance_params["upper_bound"] is not None: + assert (samples_soft_upper <= guidance_params["upper_bound"]).all() + + +@pytest.mark.slow +@pytest.mark.parametrize( + "guidance_params", + [ + pytest.param({"likelihood_scale": 2.0}, id="increase_likelihood"), + pytest.param({"likelihood_scale": 0.5}, id="decrease likelihood"), + ], +) +def test_npse_affine_classifier_free(npse_trained_model, guidance_params): + """Test whether NPSE infers well a simple example with available ground truth.""" + num_samples = 1000 + + # Extract data from fixture + score_estimator = npse_trained_model["score_estimator"] + inference = npse_trained_model["inference"] + num_dim = npse_trained_model["num_dim"] + likelihood_shift = npse_trained_model["likelihood_shift"] + likelihood_cov = npse_trained_model["likelihood_cov"] + prior_mean = npse_trained_model["prior_mean"] + prior_cov = npse_trained_model["prior_cov"] + prior = npse_trained_model["prior"] + if not isinstance(prior, MultivariateNormal): + return + + x_o = zeros(1, num_dim) + posterior = inference.build_posterior(score_estimator) + posterior.set_default_x(x_o) + samples = posterior.sample( + (num_samples,), + guidance_method="affine_classifier_free", + guidance_params=guidance_params, + ) + + if "likelihood_scale" in guidance_params: + adapted_likelihood_shift = ( + likelihood_shift * guidance_params["likelihood_scale"] + ) + posterior = true_posterior_linear_gaussian_mvn_prior( + x_o, adapted_likelihood_shift, likelihood_cov, prior_mean, prior_cov + ) + target_samples = posterior.sample((num_samples,)) + # Compute the c2st and assert it is near chance level of 0.5. + check_c2st( + samples, + target_samples, + alg=f"npse-vp-gaussian-{num_dim}-affine_classifier_free", + ) + @pytest.mark.slow def test_npse_map(): From ff289b10d996e55e71e8755f06274fee2f04de87 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Thu, 20 Mar 2025 10:57:44 +0100 Subject: [PATCH 31/36] Formats and tests --- sbi/inference/potentials/score_fn_util.py | 2 ++ tests/linearGaussian_npse_test.py | 12 +++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index fdca239cc..d3894096e 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -188,6 +188,7 @@ class UniversalGuidanceCfg: None ) + @register_guidance_method("universal", UniversalGuidanceCfg) class UniversalGuidance(ScoreAdaptation): def __init__( @@ -247,6 +248,7 @@ class IntervalGuidanceCfg: mask: Optional[Tensor] = None scale_factor: float = 0.5 + @register_guidance_method("interval", IntervalGuidanceCfg) class IntervalGuidance(UniversalGuidance): def __init__( diff --git a/tests/linearGaussian_npse_test.py b/tests/linearGaussian_npse_test.py index 2479a622f..c7d59a8c9 100644 --- a/tests/linearGaussian_npse_test.py +++ b/tests/linearGaussian_npse_test.py @@ -218,7 +218,7 @@ def npse_trained_model(sde_type, prior_type): @pytest.mark.slow @pytest.mark.parametrize( - "iid_method, num_trial", + "iid_method, num_trial", [ pytest.param("fnpe", 3, id="fnpe-2trials"), pytest.param("gauss", 3, id="gauss-6trials"), @@ -271,6 +271,7 @@ def test_npse_iid_inference( tol=0.05 * min(num_trial, 8), ) + @pytest.mark.slow @pytest.mark.parametrize( "guidance_params", @@ -308,8 +309,8 @@ def test_npse_interval_guidance(npse_trained_model, guidance_params): @pytest.mark.parametrize( "guidance_params", [ - pytest.param({"likelihood_scale": 2.0}, id="increase_likelihood"), - pytest.param({"likelihood_scale": 0.5}, id="decrease likelihood"), + pytest.param({"likelihood_scale": 1.2}, id="increase_likelihood"), + pytest.param({"likelihood_scale": 0.8}, id="decrease likelihood"), ], ) def test_npse_affine_classifier_free(npse_trained_model, guidance_params): @@ -339,7 +340,7 @@ def test_npse_affine_classifier_free(npse_trained_model, guidance_params): if "likelihood_scale" in guidance_params: adapted_likelihood_shift = ( - likelihood_shift * guidance_params["likelihood_scale"] + likelihood_shift * 1 / guidance_params["likelihood_scale"] ) posterior = true_posterior_linear_gaussian_mvn_prior( x_o, adapted_likelihood_shift, likelihood_cov, prior_mean, prior_cov @@ -349,7 +350,8 @@ def test_npse_affine_classifier_free(npse_trained_model, guidance_params): check_c2st( samples, target_samples, - alg=f"npse-vp-gaussian-{num_dim}-affine_classifier_free", + tol=0.1, + alg=f"npse-gaussian-{num_dim}-affine_classifier_free", ) From 5fdbb4c3a5cdd7ad8d55cabcb0320705d612bef4 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Thu, 20 Mar 2025 11:11:44 +0100 Subject: [PATCH 32/36] add documentation --- sbi/inference/posteriors/score_posterior.py | 11 +++++++++++ sbi/inference/potentials/score_fn_util.py | 17 ++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/sbi/inference/posteriors/score_posterior.py b/sbi/inference/posteriors/score_posterior.py index ed1893496..cde76eae9 100644 --- a/sbi/inference/posteriors/score_posterior.py +++ b/sbi/inference/posteriors/score_posterior.py @@ -140,6 +140,17 @@ def sample( "auto_gauss" for these reasons. iid_params: Additional parameters passed to the iid method. See the specific `IIDScoreFunction` child class for details. + guidance_method: Method to guide the diffusion process. If None, no guidance + is used. currently we support `affine_classifier_free`, which allows to + scale and shift the "likelihood" or "prior" score contribution. This can + be used to perform "super" conditioning i.e. shring the variance of the + likelihood. `Universal` can be used to guide the diffusion process with + a general guidance function. `Interval` is an isntance of that where + the guidance function constraints the diffusion process to a given + interval. + guidance_params: Additional parameters passed to the guidance method. See + the specific `ScoreAdaptation` child class for details, specifically + `AffineClassifierFreeCfg`, `UniversalCfg`, and `IntervalCfg`. max_sampling_batch_size: Maximum batch size for sampling. sample_with: Deprecated - use `.build_posterior(sample_with=...)` prior to `.sample()`. diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index d3894096e..c3447ec3c 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -112,7 +112,7 @@ def __init__( self.device = device @abstractmethod - def __call__(self, theta: Tensor, x_o: Tensor, time: Optional[Tensor] = None): + def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): pass @@ -143,7 +143,14 @@ def __init__( Args: score_estimator: The score estimator. prior: The prior distribution. + cfg: Configuration for the affine classifier-free guidance. This includes + the scale and shift applied to the prior and likelihood contributions. device: The device on which to evaluate the potential. + + References: + - [1] Classifier-Free Diffusion Guidance (2022) + - [2] All-in-one simulation-based inference (2024) + """ if prior is None: @@ -206,6 +213,11 @@ def __init__( prior: The prior distribution. cfg: Configuration for the universal guidance. device: The device on which to evaluate the potential. + + + + References: + - [1] Universal Guidance for Diffusion Models (2022) """ self.guidance_fn = cfg.guidance_fn @@ -265,6 +277,9 @@ def __init__( prior: The prior distribution. cfg: Configuration specifying the interval bounds. device: The device on which to evaluate the potential. + + References: + - [2] All-in-one simulation-based inference (2024) """ def interval_fn(input, condition, m, std): From 5972a29551a81697640adcd0f432081cf2c3dd35 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Fri, 5 Sep 2025 14:07:02 +0200 Subject: [PATCH 33/36] Port changes --- .../potentials/vector_field_potential.py | 30 ++++++- tests/linearGaussian_vector_field_test.py | 83 +++++++++++++++++++ 2 files changed, 109 insertions(+), 4 deletions(-) diff --git a/sbi/inference/potentials/vector_field_potential.py b/sbi/inference/potentials/vector_field_potential.py index 019cd8bcb..9fa0b20de 100644 --- a/sbi/inference/potentials/vector_field_potential.py +++ b/sbi/inference/potentials/vector_field_potential.py @@ -4,12 +4,13 @@ from typing import Any, Dict, List, Literal, Optional, Tuple, Union import torch -from torch import Tensor +from torch import Tensor, ge from torch.distributions import Distribution from zuko.distributions import NormalizingFlow from sbi.inference.potentials.base_potential import BasePotential -from sbi.inference.potentials.score_fn_iid import get_iid_method +from sbi.inference.potentials.score_fn_util import get_iid_method +from sbi.inference.potentials.score_fn_util import get_guidance_method, get_iid_method from sbi.neural_nets.estimators import ConditionalVectorFieldEstimator from sbi.neural_nets.estimators.shape_handling import ( reshape_to_batch_event, @@ -96,6 +97,8 @@ def set_x( x_is_iid: Optional[bool] = False, iid_method: Optional[str] = None, iid_params: Optional[Dict[str, Any]] = None, + guidance_method: Optional[str] = None, + guidance_params: Optional[Dict[str, Any]] = None, **ode_kwargs, ): """ @@ -115,6 +118,8 @@ def set_x( super().set_x(x_o, x_is_iid) self.iid_method = iid_method or self.iid_method self.iid_params = iid_params + self.guidance_method = guidance_method + self.guidance_params = guidance_params if not x_is_iid and (self._x_o is not None): self.flow = self.rebuild_flow(**ode_kwargs) elif self._x_o is not None: @@ -136,6 +141,11 @@ def __call__( The potential function, i.e., the log probability of the posterior. """ + if self.guidance_method is not None: + raise NotImplementedError( + "Potential evaluation for guidance is not supported yet." + ) + theta = ensure_theta_batched(torch.as_tensor(theta)) theta_density_estimator = reshape_to_sample_batch_event( theta, theta.shape[1:], leading_is_sample=True @@ -216,9 +226,21 @@ def gradient( "the potential or manually set self._x_o." ) + if self.guidance_method is not None: + score_wrapper, cfg = get_guidance_method(self.guidance_method) + cfg_params = cfg(**(self.guidance_params or {})) + vf_estimator = score_wrapper( + self.vector_field_estimator, + self.prior, + device=device, + **cfg_params, + ) + else: + vf_estimator = self.vector_field_estimator + with torch.set_grad_enabled(track_gradients): if not self.x_is_iid or self._x_o.shape[0] == 1: - score = self.vector_field_estimator.score( + score = vf_estimator.score( input=theta, condition=self.x_o, t=time.to(device) ) else: @@ -226,7 +248,7 @@ def gradient( iid_method = get_iid_method(self.iid_method) score_fn_iid = iid_method( - self.vector_field_estimator, + vf_estimator, self.prior, device=device, **(self.iid_params or {}), diff --git a/tests/linearGaussian_vector_field_test.py b/tests/linearGaussian_vector_field_test.py index ccfe93276..0a438dd03 100644 --- a/tests/linearGaussian_vector_field_test.py +++ b/tests/linearGaussian_vector_field_test.py @@ -634,3 +634,86 @@ def test_iid_log_prob(vector_field_type, prior_type, iid_batch_size): f"Probs diff: {diff.mean()} too big " f"for number of samples {num_posterior_samples}" ) + + +@pytest.mark.slow +@pytest.mark.parametrize( + "guidance_params", + [ + pytest.param({"lower_bound": 0.0, "upper_bound": 1.0}, id="upper and lower"), + pytest.param({"lower_bound": None, "upper_bound": 1.5}, id="only upper"), + pytest.param({"lower_bound": 1.0, "upper_bound": None}, id="only lower"), + ], +) +def test_npse_interval_guidance(npse_trained_model, guidance_params): + """Test whether NPSE infers well a simple example with available ground truth.""" + num_samples = 1000 + + # Extract data from fixture + score_estimator = npse_trained_model["score_estimator"] + inference = npse_trained_model["inference"] + num_dim = npse_trained_model["num_dim"] + + x_o = zeros(1, num_dim) + posterior = inference.build_posterior(score_estimator) + posterior.set_default_x(x_o) + samples = posterior.sample( + (num_samples,), guidance_method="interval", guidance_params=guidance_params + ) + samples_soft_lower = torch.min(samples, dim=0).values + 1e-1 + samples_soft_upper = torch.max(samples, dim=0).values - 1e-1 + + if guidance_params["lower_bound"] is not None: + assert (samples_soft_lower >= guidance_params["lower_bound"]).all() + if guidance_params["upper_bound"] is not None: + assert (samples_soft_upper <= guidance_params["upper_bound"]).all() + + +@pytest.mark.slow +@pytest.mark.parametrize( + "guidance_params", + [ + pytest.param({"likelihood_scale": 1.2}, id="increase_likelihood"), + pytest.param({"likelihood_scale": 0.8}, id="decrease likelihood"), + ], +) +def test_npse_affine_classifier_free(npse_trained_model, guidance_params): + """Test whether NPSE infers well a simple example with available ground truth.""" + num_samples = 1000 + + # Extract data from fixture + score_estimator = npse_trained_model["score_estimator"] + inference = npse_trained_model["inference"] + num_dim = npse_trained_model["num_dim"] + likelihood_shift = npse_trained_model["likelihood_shift"] + likelihood_cov = npse_trained_model["likelihood_cov"] + prior_mean = npse_trained_model["prior_mean"] + prior_cov = npse_trained_model["prior_cov"] + prior = npse_trained_model["prior"] + if not isinstance(prior, MultivariateNormal): + return + + x_o = zeros(1, num_dim) + posterior = inference.build_posterior(score_estimator) + posterior.set_default_x(x_o) + samples = posterior.sample( + (num_samples,), + guidance_method="affine_classifier_free", + guidance_params=guidance_params, + ) + + if "likelihood_scale" in guidance_params: + adapted_likelihood_shift = ( + likelihood_shift * 1 / guidance_params["likelihood_scale"] + ) + posterior = true_posterior_linear_gaussian_mvn_prior( + x_o, adapted_likelihood_shift, likelihood_cov, prior_mean, prior_cov + ) + target_samples = posterior.sample((num_samples,)) + # Compute the c2st and assert it is near chance level of 0.5. + check_c2st( + samples, + target_samples, + tol=0.1, + alg=f"npse-gaussian-{num_dim}-affine_classifier_free", + ) From 50fde2fd5cdcf6df6ffb159c5305748c5b0d10c5 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Mon, 8 Sep 2025 16:28:48 +0200 Subject: [PATCH 34/36] Update to recent changes --- sbi/inference/potentials/score_fn_util.py | 37 ++++++++++--------- .../potentials/vector_field_potential.py | 4 +- tests/linearGaussian_vector_field_test.py | 32 +++++++++------- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/sbi/inference/potentials/score_fn_util.py b/sbi/inference/potentials/score_fn_util.py index 847984588..2d30600cf 100644 --- a/sbi/inference/potentials/score_fn_util.py +++ b/sbi/inference/potentials/score_fn_util.py @@ -98,7 +98,7 @@ def decorator(cls: Type["IIDScoreFunction"]) -> Type["IIDScoreFunction"]: class ScoreAdaptation(ABC): def __init__( self, - score_estimator: ConditionalScoreEstimator, + vf_estimator: ConditionalVectorFieldEstimator, prior: Optional[Distribution], device: str = "cpu", ): @@ -110,7 +110,7 @@ def __init__( prior: The prior distribution. device: The device on which to evaluate the potential. """ - self.score_estimator = score_estimator + self.vf_estimator = vf_estimator self.prior = prior self.device = device @@ -118,6 +118,9 @@ def __init__( def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): pass + def score(self, input: Tensor, condition: Tensor, t: Optional[Tensor] = None): + return self.__call__(input, condition, t) + @dataclass class AffineClassifierFreeGuidanceCfg: @@ -131,7 +134,7 @@ class AffineClassifierFreeGuidanceCfg: class AffineClassifierFreeGuidance(ScoreAdaptation): def __init__( self, - score_estimator: ConditionalScoreEstimator, + vf_estimator: ConditionalVectorFieldEstimator, prior: Optional[Distribution], cfg: AffineClassifierFreeGuidanceCfg, device: str = "cpu", @@ -166,23 +169,21 @@ def __init__( self.prior_shift = torch.tensor(cfg.prior_shift, device=device) self.likelihood_scale = torch.tensor(cfg.likelihood_scale, device=device) self.likelihood_shift = torch.tensor(cfg.likelihood_shift, device=device) - super().__init__(score_estimator, prior, device) + super().__init__(vf_estimator, prior, device) def marginal_prior_score(self, theta: Tensor, time: Tensor): """Computes the marginal prior score analyticaly (or approximatly)""" - m = self.score_estimator.mean_t_fn(time) - std = self.score_estimator.std_fn(time) + m = self.vf_estimator.mean_t_fn(time) + std = self.vf_estimator.std_fn(time) marginal_prior = marginalize(self.prior, m, std) # type: ignore marginal_prior_score = compute_score(marginal_prior, theta) return marginal_prior_score def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): if time is None: - time = torch.tensor([self.score_estimator.t_min]) + time = torch.tensor([self.vf_estimator.t_min]) - posterior_score = self.score_estimator( - input=input, condition=condition, time=time - ) + posterior_score = self.vf_estimator(input=input, condition=condition, time=time) prior_score = self.marginal_prior_score(input, time) ll_score = posterior_score - prior_score ll_score_mod = ll_score * self.likelihood_scale + self.likelihood_shift @@ -203,7 +204,7 @@ class UniversalGuidanceCfg: class UniversalGuidance(ScoreAdaptation): def __init__( self, - score_estimator: ConditionalScoreEstimator, + vf_estimator: ConditionalVectorFieldEstimator, prior: Optional[Distribution], cfg: UniversalGuidanceCfg, device: str = "cpu", @@ -240,14 +241,14 @@ def guidance_fn_score(input, condition, m, std): else: self.guidance_fn_score = cfg.guidance_fn_score - super().__init__(score_estimator, prior, device) + super().__init__(vf_estimator, prior, device) def __call__(self, input: Tensor, condition: Tensor, time: Optional[Tensor] = None): if time is None: - time = torch.tensor([self.score_estimator.t_min]) - score = self.score_estimator(input, condition, time) - m = self.score_estimator.mean_t_fn(time) - std = self.score_estimator.std_fn(time) + time = torch.tensor([self.vf_estimator.t_min]) + score = self.vf_estimator(input, condition, time) + m = self.vf_estimator.mean_t_fn(time) + std = self.vf_estimator.std_fn(time) # Tweedie's formula for denoising denoised_input = (input + std**2 * score) / m @@ -268,7 +269,7 @@ class IntervalGuidanceCfg: class IntervalGuidance(UniversalGuidance): def __init__( self, - score_estimator: ConditionalScoreEstimator, + vf_estimator: ConditionalVectorFieldEstimator, prior: Optional[Distribution], cfg: IntervalGuidanceCfg, device: str = "cpu", @@ -311,7 +312,7 @@ def interval_fn(input, condition, m, std): return out super().__init__( - score_estimator, + vf_estimator, prior, UniversalGuidanceCfg(guidance_fn=interval_fn), device=device, diff --git a/sbi/inference/potentials/vector_field_potential.py b/sbi/inference/potentials/vector_field_potential.py index 9fa0b20de..05e4ced2b 100644 --- a/sbi/inference/potentials/vector_field_potential.py +++ b/sbi/inference/potentials/vector_field_potential.py @@ -229,11 +229,13 @@ def gradient( if self.guidance_method is not None: score_wrapper, cfg = get_guidance_method(self.guidance_method) cfg_params = cfg(**(self.guidance_params or {})) + # Note to make this cross compatible with IID we need make this + # wrapper more like a proper estimator. vf_estimator = score_wrapper( self.vector_field_estimator, self.prior, + cfg=cfg_params, device=device, - **cfg_params, ) else: vf_estimator = self.vector_field_estimator diff --git a/tests/linearGaussian_vector_field_test.py b/tests/linearGaussian_vector_field_test.py index 0a438dd03..2426b2b03 100644 --- a/tests/linearGaussian_vector_field_test.py +++ b/tests/linearGaussian_vector_field_test.py @@ -637,6 +637,8 @@ def test_iid_log_prob(vector_field_type, prior_type, iid_batch_size): @pytest.mark.slow +@pytest.mark.parametrize("vector_field_type", ["ve", "fmpe"]) +@pytest.mark.parametrize("prior_type", ["gaussian"]) @pytest.mark.parametrize( "guidance_params", [ @@ -645,14 +647,15 @@ def test_iid_log_prob(vector_field_type, prior_type, iid_batch_size): pytest.param({"lower_bound": 1.0, "upper_bound": None}, id="only lower"), ], ) -def test_npse_interval_guidance(npse_trained_model, guidance_params): +def test_npse_interval_guidance(vector_field_type, prior_type, guidance_params): """Test whether NPSE infers well a simple example with available ground truth.""" num_samples = 1000 + vector_field_trained_model = train_vector_field_model(vector_field_type, prior_type) # Extract data from fixture - score_estimator = npse_trained_model["score_estimator"] - inference = npse_trained_model["inference"] - num_dim = npse_trained_model["num_dim"] + score_estimator = vector_field_trained_model["estimator"] + inference = vector_field_trained_model["inference"] + num_dim = vector_field_trained_model["num_dim"] x_o = zeros(1, num_dim) posterior = inference.build_posterior(score_estimator) @@ -670,6 +673,8 @@ def test_npse_interval_guidance(npse_trained_model, guidance_params): @pytest.mark.slow +@pytest.mark.parametrize("vector_field_type", ["ve", "fmpe"]) +@pytest.mark.parametrize("prior_type", ["gaussian"]) @pytest.mark.parametrize( "guidance_params", [ @@ -677,19 +682,20 @@ def test_npse_interval_guidance(npse_trained_model, guidance_params): pytest.param({"likelihood_scale": 0.8}, id="decrease likelihood"), ], ) -def test_npse_affine_classifier_free(npse_trained_model, guidance_params): +def test_npse_affine_classifier_free(vector_field_type, prior_type, guidance_params): """Test whether NPSE infers well a simple example with available ground truth.""" num_samples = 1000 + vf_trained_model = train_vector_field_model(vector_field_type, prior_type) # Extract data from fixture - score_estimator = npse_trained_model["score_estimator"] - inference = npse_trained_model["inference"] - num_dim = npse_trained_model["num_dim"] - likelihood_shift = npse_trained_model["likelihood_shift"] - likelihood_cov = npse_trained_model["likelihood_cov"] - prior_mean = npse_trained_model["prior_mean"] - prior_cov = npse_trained_model["prior_cov"] - prior = npse_trained_model["prior"] + score_estimator = vf_trained_model["estimator"] + inference = vf_trained_model["inference"] + num_dim = vf_trained_model["num_dim"] + likelihood_shift = vf_trained_model["likelihood_shift"] + likelihood_cov = vf_trained_model["likelihood_cov"] + prior_mean = vf_trained_model["prior_mean"] + prior_cov = vf_trained_model["prior_cov"] + prior = vf_trained_model["prior"] if not isinstance(prior, MultivariateNormal): return From 5637db4291b122af14efd5ea7740823db994b6d9 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Mon, 8 Sep 2025 17:17:03 +0200 Subject: [PATCH 35/36] Tutorial --- .../20_score_based_methods_new_features.ipynb | 225 ++++++++++++++++-- tests/linearGaussian_vector_field_test.py | 4 +- 2 files changed, 208 insertions(+), 21 deletions(-) diff --git a/docs/advanced_tutorials/20_score_based_methods_new_features.ipynb b/docs/advanced_tutorials/20_score_based_methods_new_features.ipynb index eeee7de73..c493c9981 100644 --- a/docs/advanced_tutorials/20_score_based_methods_new_features.ipynb +++ b/docs/advanced_tutorials/20_score_based_methods_new_features.ipynb @@ -115,7 +115,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -153,7 +153,7 @@ "name": "stdout", "output_type": "stream", "text": [ - " Neural network successfully converged after 140 epochs." + " Neural network successfully converged after 130 epochs." ] } ], @@ -188,11 +188,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "/mnt/lustre/work/macke/mgloeckler90/sbi/sbi/inference/trainers/base.py:569: FutureWarning: The following arguments are deprecated and will be removed in a future version: mcmc_method, vi_method. Please use `posterior_parameters` instead. Refer to this guide for details:\n", - "https://sbi.readthedocs.io/en/latest/how_to_guide/19_posterior_parameters.html#\n", - " self._raise_deprecation_warning(deprecated_params, **kwargs)\n", - "Drawing 10000 posterior samples: 100%|██████████| 99/99 [00:12<00:00, 7.63it/s]:00log for further details." + ] } ], "source": [ @@ -311,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -335,6 +348,15 @@ "text": [ "\n" ] + }, + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mnotebook controller is DISPOSED. \n", + "\u001b[1;31mView Jupyter log for further details." + ] } ], "source": [ @@ -367,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -381,19 +403,28 @@ "Drawing 1000 posterior samples: 100%|██████████| 499/499 [00:24<00:00, 20.62it/s]log for further details." + ] } ], "source": [ "# Build the tall posterior, and sample using sde option\n", - "tall_posterior = inference.build_posterior(score_estimator, prior=prior, sample_with=\"sde\")\n", + "posterior = inference.build_posterior(score_estimator, prior=prior, sample_with=\"sde\")\n", "x_iid = simulator(theta_o.repeat(20,1))\n", "\n", "# Sample from a posterior conditioned with 5 observations\n", - "tall_samples_5_obs = tall_posterior.sample(sample_shape=(1000,), x=x_iid[:5,:], iid_method=\"gauss\")\n", + "tall_samples_5_obs = posterior.sample(sample_shape=(1000,), x=x_iid[:5,:], iid_method=\"gauss\")\n", "# Sample from a posterior conditioned with 10 observations\n", - "tall_samples_10_obs = tall_posterior.sample(sample_shape=(1000,), x=x_iid[:10,:], iid_method=\"gauss\")\n", + "tall_samples_10_obs = posterior.sample(sample_shape=(1000,), x=x_iid[:10,:], iid_method=\"gauss\")\n", "# Sample from a posterior conditioned with 20 observations\n", - "tall_samples_20_obs = tall_posterior.sample(sample_shape=(1000,), x=x_iid, iid_method=\"gauss\")" + "tall_samples_20_obs = posterior.sample(sample_shape=(1000,), x=x_iid, iid_method=\"gauss\")" ] }, { @@ -414,7 +445,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -426,6 +457,15 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mnotebook controller is DISPOSED. \n", + "\u001b[1;31mView Jupyter log for further details." + ] } ], "source": [ @@ -458,6 +498,153 @@ "source": [ "As expected, the posterior concentrates around the ground truth parameter $\\theta_0$ as the number of i.i.d. conditional observations increases." ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Score-base guidance methods for post-hoc modifications\n", + "\n", + "We might want to do certain modifications to our model after training i.e. which could include:\n", + "- Shifting prior/likelihood location/scale.\n", + "- Truncating the prior.\n", + "- Enforcing a certain constraint function in addition to the observational constraint.\n", + "\n", + "A way to do this is **guidance** and there is an API, as well as a few pre-implemented methods, to perform such operations." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "Generating 1000 posterior samples in 499 diffusion steps.: 100%|██████████| 499/499 [00:01<00:00, 272.36it/s]\n", + "100%|██████████| 1000/1000 [00:01<00:00, 544.58it/s]\n", + "\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "\u001b[A\n", + "Generating 1000 posterior samples in 499 diffusion steps.: 100%|██████████| 499/499 [00:02<00:00, 234.71it/s]\n", + "100%|██████████| 1000/1000 [00:02<00:00, 469.64it/s]\n" + ] + } + ], + "source": [ + "guidance_params = {\n", + " \"likelihood_scale\": 4.0, # increase the likelihood precision (-> narrower posterior)\n", + " \"prior_scale\": 1., # decrease the prior precision\n", + " \"prior_shift\": 0., # shift the prior mean\n", + " \"likelihood_shift\": 0., # shift the likelihood mean\n", + "}\n", + "\n", + "samples_unguided = posterior.sample((1000,), x=x_o)\n", + "samples_guided = posterior.sample(\n", + " (1000,),\n", + " x=x_o,\n", + " guidance_method=\"affine_classifier_free\",\n", + " guidance_params=guidance_params,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating 1000 posterior samples in 499 diffusion steps.: 100%|██████████| 499/499 [00:02<00:00, 232.76it/s]\n", + "100%|██████████| 1000/1000 [00:02<00:00, 465.77it/s]\n", + "Generating 1000 posterior samples in 499 diffusion steps.: 100%|██████████| 499/499 [00:14<00:00, 35.53it/s]\n", + "100%|██████████| 1000/1000 [00:14<00:00, 71.19it/s]\n" + ] + } + ], + "source": [ + "guidance_params = {\n", + " \"lower_bound\": torch.tensor([-0.1, -1]), # lower bound for truncation\n", + " \"upper_bound\": torch.tensor([0.2,1]), # No upper bound for truncation\n", + "}\n", + "\n", + "samples_unguided = posterior.sample((1000,), x=x_o)\n", + "samples_guided = posterior.sample(\n", + " (1000,),\n", + " x=x_o,\n", + " corrector=\"gibbs\", # Correctors do help with mixing when using approx. guidance method\n", + " guidance_method=\"interval\",\n", + " guidance_params=guidance_params,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pairplot(\n", + " [samples_unguided, samples_guided],\n", + " points=theta_o.unsqueeze(0),\n", + " figsize=(8, 8),\n", + " diag=\"kde\",\n", + " upper=\"contour\",\n", + " diag_kwargs=dict(bins=100),\n", + " upper_kwargs=dict(levels=[0.95]),\n", + " labels=[r\"$\\theta_1$\", r\"$\\theta_2$\"],\n", + ");" + ] } ], "metadata": { diff --git a/tests/linearGaussian_vector_field_test.py b/tests/linearGaussian_vector_field_test.py index 2426b2b03..4744eba4d 100644 --- a/tests/linearGaussian_vector_field_test.py +++ b/tests/linearGaussian_vector_field_test.py @@ -637,7 +637,7 @@ def test_iid_log_prob(vector_field_type, prior_type, iid_batch_size): @pytest.mark.slow -@pytest.mark.parametrize("vector_field_type", ["ve", "fmpe"]) +@pytest.mark.parametrize("vector_field_type", ["ve", "vp"]) @pytest.mark.parametrize("prior_type", ["gaussian"]) @pytest.mark.parametrize( "guidance_params", @@ -673,7 +673,7 @@ def test_npse_interval_guidance(vector_field_type, prior_type, guidance_params): @pytest.mark.slow -@pytest.mark.parametrize("vector_field_type", ["ve", "fmpe"]) +@pytest.mark.parametrize("vector_field_type", ["ve", "vp"]) @pytest.mark.parametrize("prior_type", ["gaussian"]) @pytest.mark.parametrize( "guidance_params", From 0476ab025f253d4c8066e37ec200da4d2e5b8814 Mon Sep 17 00:00:00 2001 From: manuelgloeckler Date: Mon, 8 Sep 2025 17:19:26 +0200 Subject: [PATCH 36/36] froamting --- sbi/inference/potentials/vector_field_potential.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sbi/inference/potentials/vector_field_potential.py b/sbi/inference/potentials/vector_field_potential.py index 05e4ced2b..9390d6242 100644 --- a/sbi/inference/potentials/vector_field_potential.py +++ b/sbi/inference/potentials/vector_field_potential.py @@ -4,12 +4,11 @@ from typing import Any, Dict, List, Literal, Optional, Tuple, Union import torch -from torch import Tensor, ge +from torch import Tensor from torch.distributions import Distribution from zuko.distributions import NormalizingFlow from sbi.inference.potentials.base_potential import BasePotential -from sbi.inference.potentials.score_fn_util import get_iid_method from sbi.inference.potentials.score_fn_util import get_guidance_method, get_iid_method from sbi.neural_nets.estimators import ConditionalVectorFieldEstimator from sbi.neural_nets.estimators.shape_handling import (