| 336 | const z = sub(x, mu); |
| 337 | const num = fn('Exp', [ |
| 338 | neg( |
| 339 | div( |
| 340 | pow(z, ce.number(2)), |
| 341 | mul([ce.number(2), pow(sigma, ce.number(2))]) |
| 342 | ) |
| 343 | ), |
| 344 | ]); |
| 345 | const den = mul([sigma, fn('Sqrt', [mul([ce.number(2), ce.Pi])])]); |
| 346 | return div(num, den); |
| 347 | } |
| 348 | |
| 349 | case 'BinomialDistribution': { |
| 350 | const [n, p] = distOps(dist); |
| 351 | // Discrete: density at a numeric non-integer point is 0. |
| 352 | if (xv !== undefined && !Number.isInteger(xv)) return ce.Zero; |
| 353 | const k = x; |
| 354 | return mul([ |
| 355 | fn('Binomial', [n, k]), |
| 356 | pow(p, k), |
| 357 | pow(sub(ce.One, p), sub(n, k)), |
| 358 | ]); |
| 359 | } |
| 360 | |
| 361 | case 'PoissonDistribution': { |
| 362 | const [lambda] = distOps(dist); |
| 363 | if (xv !== undefined && !Number.isInteger(xv)) return ce.Zero; |
| 364 | const k = x; |
| 365 | return div( |
| 366 | mul([pow(lambda, k), fn('Exp', [neg(lambda)])]), |
| 367 | fn('Factorial', [k]) |
| 368 | ); |
| 369 | } |
| 370 | |
| 371 | case 'UniformDistribution': { |
| 372 | const [a, b] = distOps(dist); |
| 373 | const av = litVal(a); |
| 374 | const bv = litVal(b); |
| 375 | // Numeric point outside the support has zero density. |
| 376 | if ( |
| 377 | xv !== undefined && |
| 378 | av !== undefined && |
| 379 | bv !== undefined && |
| 380 | (xv < av || xv > bv) |
| 381 | ) |
| 382 | return ce.Zero; |
| 383 | return div(ce.One, sub(b, a)); |
| 384 | } |
| 385 | |
| 386 | case 'ExponentialDistribution': { |
| 387 | const [lambda] = distOps(dist); |
| 388 | if (xv !== undefined && xv < 0) return ce.Zero; |
| 389 | return mul([lambda, fn('Exp', [neg(mul([lambda, x]))])]); |
| 390 | } |
| 391 | } |
| 392 | return undefined; |
| 393 | } |
| 394 | |
| 395 | function distributionCDF( |