sample_numpy.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from functools import singledispatch
  2. from sympy.external import import_module
  3. from sympy.stats.crv_types import BetaDistribution, ChiSquaredDistribution, ExponentialDistribution, GammaDistribution, \
  4. LogNormalDistribution, NormalDistribution, ParetoDistribution, UniformDistribution, FDistributionDistribution, GumbelDistribution, LaplaceDistribution, \
  5. LogisticDistribution, RayleighDistribution, TriangularDistribution
  6. from sympy.stats.drv_types import GeometricDistribution, PoissonDistribution, ZetaDistribution
  7. from sympy.stats.frv_types import BinomialDistribution, HypergeometricDistribution
  8. numpy = import_module('numpy')
  9. @singledispatch
  10. def do_sample_numpy(dist, size, rand_state):
  11. return None
  12. # CRV:
  13. @do_sample_numpy.register(BetaDistribution)
  14. def _(dist: BetaDistribution, size, rand_state):
  15. return rand_state.beta(a=float(dist.alpha), b=float(dist.beta), size=size)
  16. @do_sample_numpy.register(ChiSquaredDistribution)
  17. def _(dist: ChiSquaredDistribution, size, rand_state):
  18. return rand_state.chisquare(df=float(dist.k), size=size)
  19. @do_sample_numpy.register(ExponentialDistribution)
  20. def _(dist: ExponentialDistribution, size, rand_state):
  21. return rand_state.exponential(1 / float(dist.rate), size=size)
  22. @do_sample_numpy.register(FDistributionDistribution)
  23. def _(dist: FDistributionDistribution, size, rand_state):
  24. return rand_state.f(dfnum = float(dist.d1), dfden = float(dist.d2), size=size)
  25. @do_sample_numpy.register(GammaDistribution)
  26. def _(dist: GammaDistribution, size, rand_state):
  27. return rand_state.gamma(shape = float(dist.k), scale = float(dist.theta), size=size)
  28. @do_sample_numpy.register(GumbelDistribution)
  29. def _(dist: GumbelDistribution, size, rand_state):
  30. return rand_state.gumbel(loc = float(dist.mu), scale = float(dist.beta), size=size)
  31. @do_sample_numpy.register(LaplaceDistribution)
  32. def _(dist: LaplaceDistribution, size, rand_state):
  33. return rand_state.laplace(loc = float(dist.mu), scale = float(dist.b), size=size)
  34. @do_sample_numpy.register(LogisticDistribution)
  35. def _(dist: LogisticDistribution, size, rand_state):
  36. return rand_state.logistic(loc = float(dist.mu), scale = float(dist.s), size=size)
  37. @do_sample_numpy.register(LogNormalDistribution)
  38. def _(dist: LogNormalDistribution, size, rand_state):
  39. return rand_state.lognormal(mean = float(dist.mean), sigma = float(dist.std), size=size)
  40. @do_sample_numpy.register(NormalDistribution)
  41. def _(dist: NormalDistribution, size, rand_state):
  42. return rand_state.normal(loc = float(dist.mean), scale = float(dist.std), size=size)
  43. @do_sample_numpy.register(RayleighDistribution)
  44. def _(dist: RayleighDistribution, size, rand_state):
  45. return rand_state.rayleigh(scale = float(dist.sigma), size=size)
  46. @do_sample_numpy.register(ParetoDistribution)
  47. def _(dist: ParetoDistribution, size, rand_state):
  48. return (numpy.random.pareto(a=float(dist.alpha), size=size) + 1) * float(dist.xm)
  49. @do_sample_numpy.register(TriangularDistribution)
  50. def _(dist: TriangularDistribution, size, rand_state):
  51. return rand_state.triangular(left = float(dist.a), mode = float(dist.b), right = float(dist.c), size=size)
  52. @do_sample_numpy.register(UniformDistribution)
  53. def _(dist: UniformDistribution, size, rand_state):
  54. return rand_state.uniform(low=float(dist.left), high=float(dist.right), size=size)
  55. # DRV:
  56. @do_sample_numpy.register(GeometricDistribution)
  57. def _(dist: GeometricDistribution, size, rand_state):
  58. return rand_state.geometric(p=float(dist.p), size=size)
  59. @do_sample_numpy.register(PoissonDistribution)
  60. def _(dist: PoissonDistribution, size, rand_state):
  61. return rand_state.poisson(lam=float(dist.lamda), size=size)
  62. @do_sample_numpy.register(ZetaDistribution)
  63. def _(dist: ZetaDistribution, size, rand_state):
  64. return rand_state.zipf(a=float(dist.s), size=size)
  65. # FRV:
  66. @do_sample_numpy.register(BinomialDistribution)
  67. def _(dist: BinomialDistribution, size, rand_state):
  68. return rand_state.binomial(n=int(dist.n), p=float(dist.p), size=size)
  69. @do_sample_numpy.register(HypergeometricDistribution)
  70. def _(dist: HypergeometricDistribution, size, rand_state):
  71. return rand_state.hypergeometric(ngood = int(dist.N), nbad = int(dist.m), nsample = int(dist.n), size=size)