Skip to content

Weibull has some misbehaving cases #310

Description

@FreezyLemon

Might be part of #102.

  • When shape = +Inf and 0 < scale < 1: scale_pow_shape_inv (== scale.powf(-shape)) will become +Inf which causes all sorts of problems
    • cdf/sf/pdf/ln_pdf start returning NaN for valid params1
    • note: If scale >= 1, then cdf etc. generally behave well(?)
  • scale = +Inf will always make inverse_cdf(0) return NaN
    • exception: shape is also +Inf, then it returns 1...

I believe this behaviour is unpredictable and unwanted, but I'm not sure for every single case listed here. And I might've missed something.

Are parameters set to f64::INFINITY degenerate for this distribution? If they are not, then they need special handling from what I can tell.

Dirty testing code to find some things:

#[test]
    fn test_infinities() {
        let test_distrs = [
            create_ok(f64::INFINITY, 0.5),
            create_ok(f64::INFINITY, 1.0),
            create_ok(f64::INFINITY, 1.5),
            create_ok(0.5, f64::INFINITY),
            create_ok(1.0, f64::INFINITY),
            create_ok(1.5, f64::INFINITY),
            create_ok(f64::INFINITY, f64::INFINITY),
        ];

        for dist in test_distrs {
            println!("scale {}", dist.scale());
            println!("shape {}", dist.shape());
            println!("scale.powf(-shape) {}", dist.scale_pow_shape_inv);
            println!();
            println!("cdf(-1): {}", dist.cdf(-1.0));
            println!("cdf(0): {}", dist.cdf(0.0));
            println!("cdf(0.75): {}", dist.cdf(0.75));
            println!();
            println!("sf(-1): {}", dist.sf(-1.0));
            println!("sf(0): {}", dist.sf(0.0));
            println!("sf(0.75): {}", dist.sf(0.75));
            println!();
            println!("inverse_cdf(0): {}", dist.inverse_cdf(0.0));
            println!("inverse_cdf(0.75): {}", dist.inverse_cdf(0.75));

            println!();
            println!();
        }
    }

Footnotes

  1. x.powf(shape) will become x.powf(+Inf) which is zero for any x in (0, 1). Then it's 0 * scale_pow_shape_inv which is 0 * Inf which is NaN

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions