From cc00f6cdf91f9fc2e5aa02a01a541126956cbfc5 Mon Sep 17 00:00:00 2001 From: Michael Dickens Date: Thu, 23 Nov 2023 10:55:10 -0800 Subject: [PATCH 1/7] docs: init Sphinx docs --- docs/Makefile | 19 + docs/build/doctrees/README.doctree | Bin 0 -> 50071 bytes docs/build/doctrees/environment.pickle | Bin 0 -> 81020 bytes docs/build/doctrees/index.doctree | Bin 0 -> 4974 bytes docs/build/html/.buildinfo | 4 + docs/build/html/README.html | 893 ++ docs/build/html/_sources/README.rst.txt | 531 + docs/build/html/_sources/index.rst.txt | 18 + docs/build/html/_static/alabaster.css | 703 ++ docs/build/html/_static/basic.css | 925 ++ docs/build/html/_static/custom.css | 1 + docs/build/html/_static/doctools.js | 156 + .../html/_static/documentation_options.js | 13 + docs/build/html/_static/file.png | Bin 0 -> 286 bytes docs/build/html/_static/jquery.js | 10365 ++++++++++++++++ docs/build/html/_static/language_data.js | 199 + docs/build/html/_static/minus.png | Bin 0 -> 90 bytes docs/build/html/_static/plus.png | Bin 0 -> 90 bytes docs/build/html/_static/pygments.css | 152 + docs/build/html/_static/scripts/bootstrap.js | 3 + .../_static/scripts/bootstrap.js.LICENSE.txt | 5 + .../html/_static/scripts/bootstrap.js.map | 1 + .../_static/scripts/pydata-sphinx-theme.js | 2 + .../scripts/pydata-sphinx-theme.js.map | 1 + docs/build/html/_static/searchtools.js | 574 + docs/build/html/_static/sphinx_highlight.js | 154 + docs/build/html/_static/styles/bootstrap.css | 6 + .../html/_static/styles/bootstrap.css.map | 1 + .../_static/styles/pydata-sphinx-theme.css | 2 + .../styles/pydata-sphinx-theme.css.map | 1 + docs/build/html/_static/styles/theme.css | 2 + docs/build/html/_static/underscore.js | 1707 +++ .../vendor/fontawesome/6.1.2/LICENSE.txt | 165 + .../vendor/fontawesome/6.1.2/css/all.min.css | 5 + .../vendor/fontawesome/6.1.2/js/all.min.js | 2 + .../6.1.2/js/all.min.js.LICENSE.txt | 5 + .../6.1.2/webfonts/fa-brands-400.ttf | Bin 0 -> 181264 bytes .../6.1.2/webfonts/fa-brands-400.woff2 | Bin 0 -> 105112 bytes .../6.1.2/webfonts/fa-regular-400.ttf | Bin 0 -> 60236 bytes .../6.1.2/webfonts/fa-regular-400.woff2 | Bin 0 -> 24028 bytes .../6.1.2/webfonts/fa-solid-900.ttf | Bin 0 -> 389948 bytes .../6.1.2/webfonts/fa-solid-900.woff2 | Bin 0 -> 154840 bytes .../6.1.2/webfonts/fa-v4compatibility.ttf | Bin 0 -> 10084 bytes .../6.1.2/webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4776 bytes docs/build/html/_static/webpack-macros.html | 31 + docs/build/html/genindex.html | 333 + docs/build/html/index.html | 359 + docs/build/html/objects.inv | Bin 0 -> 276 bytes docs/build/html/search.html | 357 + docs/build/html/searchindex.js | 1 + docs/make.bat | 35 + docs/source/README.rst | 531 + docs/source/conf.py | 179 + docs/source/index.rst | 18 + 54 files changed, 18459 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/build/doctrees/README.doctree create mode 100644 docs/build/doctrees/environment.pickle create mode 100644 docs/build/doctrees/index.doctree create mode 100644 docs/build/html/.buildinfo create mode 100644 docs/build/html/README.html create mode 100644 docs/build/html/_sources/README.rst.txt create mode 100644 docs/build/html/_sources/index.rst.txt create mode 100644 docs/build/html/_static/alabaster.css create mode 100644 docs/build/html/_static/basic.css create mode 100644 docs/build/html/_static/custom.css create mode 100644 docs/build/html/_static/doctools.js create mode 100644 docs/build/html/_static/documentation_options.js create mode 100644 docs/build/html/_static/file.png create mode 100644 docs/build/html/_static/jquery.js create mode 100644 docs/build/html/_static/language_data.js create mode 100644 docs/build/html/_static/minus.png create mode 100644 docs/build/html/_static/plus.png create mode 100644 docs/build/html/_static/pygments.css create mode 100644 docs/build/html/_static/scripts/bootstrap.js create mode 100644 docs/build/html/_static/scripts/bootstrap.js.LICENSE.txt create mode 100644 docs/build/html/_static/scripts/bootstrap.js.map create mode 100644 docs/build/html/_static/scripts/pydata-sphinx-theme.js create mode 100644 docs/build/html/_static/scripts/pydata-sphinx-theme.js.map create mode 100644 docs/build/html/_static/searchtools.js create mode 100644 docs/build/html/_static/sphinx_highlight.js create mode 100644 docs/build/html/_static/styles/bootstrap.css create mode 100644 docs/build/html/_static/styles/bootstrap.css.map create mode 100644 docs/build/html/_static/styles/pydata-sphinx-theme.css create mode 100644 docs/build/html/_static/styles/pydata-sphinx-theme.css.map create mode 100644 docs/build/html/_static/styles/theme.css create mode 100644 docs/build/html/_static/underscore.js create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js.LICENSE.txt create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf create mode 100644 docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 create mode 100644 docs/build/html/_static/webpack-macros.html create mode 100644 docs/build/html/genindex.html create mode 100644 docs/build/html/index.html create mode 100644 docs/build/html/objects.inv create mode 100644 docs/build/html/search.html create mode 100644 docs/build/html/searchindex.js create mode 100644 docs/make.bat create mode 100644 docs/source/README.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..69fe55e --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = source +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) \ No newline at end of file diff --git a/docs/build/doctrees/README.doctree b/docs/build/doctrees/README.doctree new file mode 100644 index 0000000000000000000000000000000000000000..460644ca272d21b9bdb5ed6a9c882765a2f14d7d GIT binary patch literal 50071 zcmeHwdyHJyc^^q}`53+=N@5K!Q#Z1jq|T(iBCE6e&_PZX2{vn!te3A_$VeZk?t^{|I0d zMd1cW>n82*`_4U&d*`takrpj40nX0cdmi8U&Ue1^z0P;u9r>B$y&e27ITE!Ru79^= z*Xw>zccN~xuO8IeO~;SB|FApuqusZ=#bkeIuSP*TtU29e2TIf$u2&Bozk8>f9H!#2 z>qVus{@%!`#ctrM>Wz`cp2prg-C|>ZG7`J7=NPY&@{Kpz?&6~7v^wXl%gvVOP~SGS zUOWD{9z{hmt+%Xs;%_ zJ=b@-SKC!PDcErwy47|JED=^7a_bRcU~kQ{qX-Z2eZ;q$;@iG@yQP0r?b>qaEKr$t zvNyID=~cIJr16o)!NwDfhZ;{N=O!CL)0u46-P*F_N0Y5ESPboEG#M!bO#(*z=9!qh z{``eYbI+H;2=IUO%C2@5IN6T@*{IcO7%0AVYS)e(^9qrlY{YRZIzKtNy1H7DZBKZ% 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 literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..6edc5b2af3c3580a12566d9f1fee66a1fdecd080 GIT binary patch literal 81020 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 cmA7h(tZ=Y>Q>dQbM8IW zFM5B7u5b8%?$BgHri(F)<5b7olx{E9QIYV}mS2=_|GxZPdB^p0c42gpN4#_!=n)C2 z;+&`Dr==TGcPo_{*W-5$kF3;bJ6!a{j@bRQyd(OqXQfrV)8y`d^t_Psx#HRKVemM~ z6sNfvc?k3@Xj%iA1|KY~fM4AYZbK8|!UdGA>m2GRs9 z_~ylzM$(xK>eVDNod-?lV5W1Ni!G#;=R81{DVs_qjg?Wr@qglv@tYTa83&JTV0eDc z&48IeS`+AtG%%K>F;hDAgK4+x{x75ztIkWnVsS6P0l+rE`uxfWEj%W8{ED5kkD^>= z7Sjbvp7Fp69?UqiMb0r}2TholR?gFSV0BO!4wu0!=g$kcQ_E_W#{pAD2L{K2y}-i- zOKnj1M_i<0`CwM09_~yb3h2|~^d3Tx@klbImT;ugxsfpsG}e^YP^JJ_A1k{tJgpFL?hDnfm}FBLH{Nth@Sh&e~qb%xhHO~0b^Mc5iIyw#e!4uI&n>W9|RL` zfagEN?@j#P!tZSmY}*s3G*rv_4jHB5`>;K5OTl#mbkWJ!rHd@E15vc z7>V2B9$8?WHyB zrA0DDvWd$l8*bp$g3+m3qVE7Iq_Y5eZDtX_rEvVF4#yDTm|xB!?y%nZ=mG^Y<9W%t ziG{}VCXAIIBqA}c6cEzggGYi#XMslbp{nu_rTF2q58wa!FP^?1yj%T!?-><`IY+6p zEJsypQs{{ru8;1Z&UI0T1KQ6}lu%{E1@cVSBRv~6S!E>CQC4YH))X*zziB0%yFQkbNz+RDp&eTn zJ=*X9>)EPK%~KwNZ~ffXBVX%RanHSGbCw$A7a4jL$4#YQdsbVfDxTGSJnaga?}{5n zMNaBCY_;%yW2rQ;+cVr+KoysUBb;M(3z#7Xldi&f{hFx)xuHR%+W~p9!j`Av@YMC^ zJmopFIxq1OGpK6Ik_<0bs|iEQa)#GI{aWM-ZwFv;NNSo|F>#MF!m@P7Gp%i^E$=iw zx#AA!GJ=#6E}&JD5|$yVgv>(ZNK%dlE^k&AUfn!QNUAezG(Bdl2h<|})a~ay)42^5 zKj#SFrW**R+Si^t;tPqWLE06j>C|(*m`{s2rW+EpiQw?dSprKRM-*||6c9g@DPj~t zZD~parRx`VHhO1dB%W`rH-RLWP9pE1--(mBT919WOoarF6G1wOn!`{_cjA z)71i+p|{o>E{$~8XafM65r~h%hDvwP+!PS*81I|N`R;noBb~<~Y6W0|X{ex_x}8X; zGwc!JkTHOY!m=pEjvKPV>TqRpn-bVMh@pwY7JrDUH;|;yQ-~S3IrJ8femeV=DKor? zb+||fPuGxlwBccQq=!gk!*gk5h0ntpitqGVauo2-g3i?XCb9Yufu6GC=?mM zj3x%8u zg&)AXO?Rcz?VAKeG<;rw)CPgN?%%7|Q0a)(y5n{vaO;h5@D4m zkf@UYR0k|FodE+)Ryd|SVT$Rcez?KTaTuCaRHTmqXC*KLi4udqODsWf)TWp2Muc8x zAxDW*AwH(y!bzV5K6gj;=MaEZ&8nRC(rxkdoIWbJy(*W0ynrH9mIOI$SXDePvyQMR zK+7Vz0ydCal)K&Wnzj1O05iPJ+84SP(H9EXcga{ii?793#`VcS6_}dE*DsBD1Ao5~ z`^Ft~56h1}Kvk~F2Rv35;$+jWT4vWmK=M``ZZg%XJ%4X}?UJ$W-Cy(AZ)Wv_j@SHq zc}2g0YS6j0`va7Xx1w`gFY7kRytJ45g>tZ_o2TIL;!T + + + + + + + + + Squigglepy: Implementation of Squiggle in Python — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +
+

Squigglepy: Implementation of Squiggle in Python#

+

Squiggle is a “simple +programming language for intuitive probabilistic estimation”. It serves +as its own standalone programming language with its own syntax, but it +is implemented in JavaScript. I like the features of Squiggle and intend +to use it frequently, but I also sometimes want to use similar +functionalities in Python, especially alongside other Python statistical +programming packages like Numpy, Pandas, and Matplotlib. The +squigglepy package here implements many Squiggle-like +functionalities in Python.

+
+

Installation#

+
pip install squigglepy
+
+
+

For plotting support, you can also use the plots extra:

+
pip install squigglepy[plots]
+
+
+
+
+

Usage#

+
+

Piano Tuners Example#

+

Here’s the Squigglepy implementation of the example from Squiggle +Docs:

+
import squigglepy as sq
+import numpy as np
+import matplotlib.pyplot as plt
+from squigglepy.numbers import K, M
+from pprint import pprint
+
+pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)  # This means that you're 90% confident the value is between 8.1 and 8.4 Million.
+pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01  # We assume there are almost no people with multiple pianos
+pianos_per_piano_tuner = sq.to(2*K, 50*K)
+piano_tuners_per_piano = 1 / pianos_per_piano_tuner
+total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano
+samples = total_tuners_in_2022 @ 1000  # Note: `@ 1000` is shorthand to get 1000 samples
+
+# Get mean and SD
+print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2),
+                                round(np.std(samples), 2)))
+
+# Get percentiles
+pprint(sq.get_percentiles(samples, digits=0))
+
+# Histogram
+plt.hist(samples, bins=200)
+plt.show()
+
+# Shorter histogram
+total_tuners_in_2022.plot()
+
+
+

And the version from the Squiggle doc that incorporates time:

+
import squigglepy as sq
+from squigglepy.numbers import K, M
+
+pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)
+pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01
+pianos_per_piano_tuner = sq.to(2*K, 50*K)
+piano_tuners_per_piano = 1 / pianos_per_piano_tuner
+
+def pop_at_time(t):  # t = Time in years after 2022
+    avg_yearly_pct_change = sq.to(-0.01, 0.05)  # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year
+    return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t)
+
+def total_tuners_at_time(t):
+    return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano
+
+# Get total piano tuners at 2030
+sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000)
+
+
+

WARNING: Be careful about dividing by K, M, etc. 1/2*K = +500 in Python. Use 1/(2*K) instead to get the expected outcome.

+

WARNING: Be careful about using K to get sample counts. Use +sq.norm(2, 3) @ (2*K)sq.norm(2, 3) @ 2*K will return only +two samples, multiplied by 1000.

+
+
+

Distributions#

+
import squigglepy as sq
+
+# Normal distribution
+sq.norm(1, 3)  # 90% interval from 1 to 3
+
+# Distribution can be sampled with mean and sd too
+sq.norm(mean=0, sd=1)
+
+# Shorthand to get one sample
+~sq.norm(1, 3)
+
+# Shorthand to get more than one sample
+sq.norm(1, 3) @ 100
+
+# Longhand version to get more than one sample
+sq.sample(sq.norm(1, 3), n=100)
+
+# Nice progress reporter
+sq.sample(sq.norm(1, 3), n=1000, verbose=True)
+
+# Other distributions exist
+sq.lognorm(1, 10)
+sq.tdist(1, 10, t=5)
+sq.triangular(1, 2, 3)
+sq.pert(1, 2, 3, lam=2)
+sq.binomial(p=0.5, n=5)
+sq.beta(a=1, b=2)
+sq.bernoulli(p=0.5)
+sq.poisson(10)
+sq.chisquare(2)
+sq.gamma(3, 2)
+sq.pareto(1)
+sq.exponential(scale=1)
+sq.geometric(p=0.5)
+
+# Discrete sampling
+sq.discrete({'A': 0.1, 'B': 0.9})
+
+# Can return integers
+sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15})
+
+# Alternate format (also can be used to return more complex objects)
+sq.discrete([[0.1,  0],
+             [0.3,  1],
+             [0.3,  2],
+             [0.15, 3],
+             [0.15, 4]])
+
+sq.discrete([0, 1, 2]) # No weights assumes equal weights
+
+# You can mix distributions together
+sq.mixture([sq.norm(1, 3),
+            sq.norm(4, 10),
+            sq.lognorm(1, 10)],  # Distributions to mix
+           [0.3, 0.3, 0.4])     # These are the weights on each distribution
+
+# This is equivalent to the above, just a different way of doing the notation
+sq.mixture([[0.3, sq.norm(1,3)],
+            [0.3, sq.norm(4,10)],
+            [0.4, sq.lognorm(1,10)]])
+
+# Make a zero-inflated distribution
+# 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`.
+sq.zero_inflated(0.6, sq.norm(1, 2))
+
+
+
+
+

Additional Features#

+
import squigglepy as sq
+
+# You can add and subtract distributions
+(sq.norm(1,3) + sq.norm(4,5)) @ 100
+(sq.norm(1,3) - sq.norm(4,5)) @ 100
+(sq.norm(1,3) * sq.norm(4,5)) @ 100
+(sq.norm(1,3) / sq.norm(4,5)) @ 100
+
+# You can also do math with numbers
+~((sq.norm(sd=5) + 2) * 2)
+~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10)
+
+# You can change the CI from 90% (default) to 80%
+sq.norm(1, 3, credibility=80)
+
+# You can clip
+sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5.
+
+# You can also clip with a function, and use pipes
+sq.norm(0, 3) >> sq.clip(0, 5)
+
+# You can correlate continuous distributions
+a, b = sq.uniform(-1, 1), sq.to(0, 3)
+a, b = sq.correlate((a, b), 0.5)  # Correlate a and b with a correlation of 0.5
+# You can even pass your own correlation matrix!
+a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]])
+
+
+
+

Example: Rolling a Die#

+

An example of how to use distributions to build tools:

+
import squigglepy as sq
+
+def roll_die(sides, n=1):
+    return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None
+
+roll_die(sides=6, n=10)
+# [2, 6, 5, 2, 6, 2, 3, 1, 5, 2]
+
+
+

This is already included standard in the utils of this package. Use +sq.roll_die.

+
+
+
+

Bayesian inference#

+

1% of women at age forty who participate in routine screening have +breast cancer. 80% of women with breast cancer will get positive +mammographies. 9.6% of women without breast cancer will also get +positive mammographies.

+

A woman in this age group had a positive mammography in a routine +screening. What is the probability that she actually has breast cancer?

+

We can approximate the answer with a Bayesian network (uses rejection +sampling):

+
import squigglepy as sq
+from squigglepy import bayes
+from squigglepy.numbers import M
+
+def mammography(has_cancer):
+    return sq.event(0.8 if has_cancer else 0.096)
+
+def define_event():
+    cancer = ~sq.bernoulli(0.01)
+    return({'mammography': mammography(cancer),
+            'cancer': cancer})
+
+bayes.bayesnet(define_event,
+               find=lambda e: e['cancer'],
+               conditional_on=lambda e: e['mammography'],
+               n=1*M)
+# 0.07723995880535531
+
+
+

Or if we have the information immediately on hand, we can directly +calculate it. Though this doesn’t work for very complex stuff.

+
from squigglepy import bayes
+bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096)
+# 0.07763975155279504
+
+
+

You can also make distributions and update them:

+
import matplotlib.pyplot as plt
+import squigglepy as sq
+from squigglepy import bayes
+from squigglepy.numbers import K
+import numpy as np
+
+print('Prior')
+prior = sq.norm(1,5)
+prior_samples = prior @ (10*K)
+plt.hist(prior_samples, bins = 200)
+plt.show()
+print(sq.get_percentiles(prior_samples))
+print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples)))
+print('-')
+
+print('Evidence')
+evidence = sq.norm(2,3)
+evidence_samples = evidence @ (10*K)
+plt.hist(evidence_samples, bins = 200)
+plt.show()
+print(sq.get_percentiles(evidence_samples))
+print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples)))
+print('-')
+
+print('Posterior')
+posterior = bayes.update(prior, evidence)
+posterior_samples = posterior @ (10*K)
+plt.hist(posterior_samples, bins = 200)
+plt.show()
+print(sq.get_percentiles(posterior_samples))
+print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples)))
+
+print('Average')
+average = bayes.average(prior, evidence)
+average_samples = average @ (10*K)
+plt.hist(average_samples, bins = 200)
+plt.show()
+print(sq.get_percentiles(average_samples))
+print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples)))
+
+
+
+

Example: Alarm net#

+

This is the alarm network from Bayesian Artificial Intelligence - +Section +2.5.1:

+
+

Assume your house has an alarm system against burglary.

+

You live in the seismically active area and the alarm system can get +occasionally set off by an earthquake.

+

You have two neighbors, Mary and John, who do not know each other. If +they hear the alarm they call you, but this is not guaranteed.

+

The chance of a burglary on a particular day is 0.1%. The chance of +an earthquake on a particular day is 0.2%.

+

The alarm will go off 95% of the time with both a burglary and an +earthquake, 94% of the time with just a burglary, 29% of the time +with just an earthquake, and 0.1% of the time with nothing (total +false alarm).

+

John will call you 90% of the time when the alarm goes off. But on 5% +of the days, John will just call to say “hi”. Mary will call you 70% +of the time when the alarm goes off. But on 1% of the days, Mary will +just call to say “hi”.

+
+
import squigglepy as sq
+from squigglepy import bayes
+from squigglepy.numbers import M
+
+def p_alarm_goes_off(burglary, earthquake):
+    if burglary and earthquake:
+        return 0.95
+    elif burglary and not earthquake:
+        return 0.94
+    elif not burglary and earthquake:
+        return 0.29
+    elif not burglary and not earthquake:
+        return 0.001
+
+def p_john_calls(alarm_goes_off):
+    return 0.9 if alarm_goes_off else 0.05
+
+def p_mary_calls(alarm_goes_off):
+    return 0.7 if alarm_goes_off else 0.01
+
+def define_event():
+    burglary_happens = sq.event(p=0.001)
+    earthquake_happens = sq.event(p=0.002)
+    alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens))
+    john_calls = sq.event(p_john_calls(alarm_goes_off))
+    mary_calls = sq.event(p_mary_calls(alarm_goes_off))
+    return {'burglary': burglary_happens,
+            'earthquake': earthquake_happens,
+            'alarm_goes_off': alarm_goes_off,
+            'john_calls': john_calls,
+            'mary_calls': mary_calls}
+
+# What are the chances that both John and Mary call if an earthquake happens?
+bayes.bayesnet(define_event,
+               n=1*M,
+               find=lambda e: (e['mary_calls'] and e['john_calls']),
+               conditional_on=lambda e: e['earthquake'])
+# Result will be ~0.19, though it varies because it is based on a random sample.
+# This also may take a minute to run.
+
+# If both John and Mary call, what is the chance there's been a burglary?
+bayes.bayesnet(define_event,
+               n=1*M,
+               find=lambda e: e['burglary'],
+               conditional_on=lambda e: (e['mary_calls'] and e['john_calls']))
+# Result will be ~0.27, though it varies because it is based on a random sample.
+# This will run quickly because there is a built-in cache.
+# Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache.
+
+
+

Note that the amount of Bayesian analysis that squigglepy can do is +pretty limited. For more complex bayesian analysis, consider +sorobn, +pomegranate, +bnlearn, or +pyMC.

+
+
+

Example: A Demonstration of the Monty Hall Problem#

+
import squigglepy as sq
+from squigglepy import bayes
+from squigglepy.numbers import K, M, B, T
+
+
+def monte_hall(door_picked, switch=False):
+    doors = ['A', 'B', 'C']
+    car_is_behind_door = ~sq.discrete(doors)
+    reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door])
+
+    if switch:
+        old_door_picked = door_picked
+        door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0]
+
+    won_car = (car_is_behind_door == door_picked)
+    return won_car
+
+
+def define_event():
+    door = ~sq.discrete(['A', 'B', 'C'])
+    switch = sq.event(0.5)
+    return {'won': monte_hall(door_picked=door, switch=switch),
+            'switched': switch}
+
+RUNS = 10*K
+r = bayes.bayesnet(define_event,
+                   find=lambda e: e['won'],
+                   conditional_on=lambda e: e['switched'],
+                   verbose=True,
+                   n=RUNS)
+print('Win {}% of the time when switching'.format(int(r * 100)))
+
+r = bayes.bayesnet(define_event,
+                   find=lambda e: e['won'],
+                   conditional_on=lambda e: not e['switched'],
+                   verbose=True,
+                   n=RUNS)
+print('Win {}% of the time when not switching'.format(int(r * 100)))
+
+# Win 66% of the time when switching
+# Win 34% of the time when not switching
+
+
+
+
+

Example: More complex coin/dice interactions#

+
+

Imagine that I flip a coin. If heads, I take a random die out of my +blue bag. If tails, I take a random die out of my red bag. The blue +bag contains only 6-sided dice. The red bag contains a 4-sided die, a +6-sided die, a 10-sided die, and a 20-sided die. I then roll the +random die I took. What is the chance that I roll a 6?

+
+
import squigglepy as sq
+from squigglepy.numbers import K, M, B, T
+from squigglepy import bayes
+
+def define_event():
+    if sq.flip_coin() == 'heads': # Blue bag
+        return sq.roll_die(6)
+    else: # Red bag
+        return sq.discrete([4, 6, 10, 20]) >> sq.roll_die
+
+
+bayes.bayesnet(define_event,
+               find=lambda e: e == 6,
+               verbose=True,
+               n=100*K)
+# This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292
+
+
+
+
+
+

Kelly betting#

+

You can use probability generated, combine with a bankroll to determine +bet sizing using Kelly +criterion.

+

For example, if you want to Kelly bet and you’ve…

+
    +
  • determined that your price (your probability of the event in question +happening / the market in question resolving in your favor) is $0.70 +(70%)

  • +
  • see that the market is pricing at $0.65

  • +
  • you have a bankroll of $1000 that you are willing to bet

  • +
+

You should bet as follows:

+
import squigglepy as sq
+kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000)
+kelly_data['kelly']  # What fraction of my bankroll should I bet on this?
+# 0.143
+kelly_data['target']  # How much money should be invested in this?
+# 142.86
+kelly_data['expected_roi']  # What is the expected ROI of this bet?
+# 0.077
+
+
+
+
+

More examples#

+

You can see more examples of squigglepy in action +here.

+
+
+
+

Run tests#

+

Use black . for formatting.

+

Run +ruff check . && pytest && pip3 install . && python3 tests/integration.py

+
+
+

Disclaimers#

+

This package is unofficial and supported by myself and Rethink +Priorities. It is not affiliated with or associated with the Quantified +Uncertainty Research Institute, which maintains the Squiggle language +(in JavaScript).

+

This package is also new and not yet in a stable production version, so +you may encounter bugs and other errors. Please report those so they can +be fixed. It’s also possible that future versions of the package may +introduce breaking changes.

+

This package is available under an MIT License.

+
+
+

Acknowledgements#

+
    +
  • The primary author of this package is Peter Wildeford. Agustín +Covarrubias and Bernardo Baron contributed several key features and +developments.

  • +
  • Thanks to Ozzie Gooen and the Quantified Uncertainty Research +Institute for creating and maintaining the original Squiggle +language.

  • +
  • Thanks to Dawn Drescher for helping me implement math between +distributions.

  • +
  • Thanks to Dawn Drescher for coming up with the idea to use ~ as a +shorthand for sample, as well as helping me implement it.

  • +
+
+
+ + +
+ + + + + +
+ +
+
+
+ +
+ + + + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/_sources/README.rst.txt b/docs/build/html/_sources/README.rst.txt new file mode 100644 index 0000000..f5ec681 --- /dev/null +++ b/docs/build/html/_sources/README.rst.txt @@ -0,0 +1,531 @@ +Squigglepy: Implementation of Squiggle in Python +================================================ + +`Squiggle `__ is a “simple +programming language for intuitive probabilistic estimation”. It serves +as its own standalone programming language with its own syntax, but it +is implemented in JavaScript. I like the features of Squiggle and intend +to use it frequently, but I also sometimes want to use similar +functionalities in Python, especially alongside other Python statistical +programming packages like Numpy, Pandas, and Matplotlib. The +**squigglepy** package here implements many Squiggle-like +functionalities in Python. + +Installation +------------ + +.. code:: shell + + pip install squigglepy + +For plotting support, you can also use the ``plots`` extra: + +.. code:: shell + + pip install squigglepy[plots] + +Usage +----- + +Piano Tuners Example +~~~~~~~~~~~~~~~~~~~~ + +Here’s the Squigglepy implementation of `the example from Squiggle +Docs `__: + +.. code:: python + + import squigglepy as sq + import numpy as np + import matplotlib.pyplot as plt + from squigglepy.numbers import K, M + from pprint import pprint + + pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) # This means that you're 90% confident the value is between 8.1 and 8.4 Million. + pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 # We assume there are almost no people with multiple pianos + pianos_per_piano_tuner = sq.to(2*K, 50*K) + piano_tuners_per_piano = 1 / pianos_per_piano_tuner + total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano + samples = total_tuners_in_2022 @ 1000 # Note: `@ 1000` is shorthand to get 1000 samples + + # Get mean and SD + print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2), + round(np.std(samples), 2))) + + # Get percentiles + pprint(sq.get_percentiles(samples, digits=0)) + + # Histogram + plt.hist(samples, bins=200) + plt.show() + + # Shorter histogram + total_tuners_in_2022.plot() + +And the version from the Squiggle doc that incorporates time: + +.. code:: python + + import squigglepy as sq + from squigglepy.numbers import K, M + + pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) + pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 + pianos_per_piano_tuner = sq.to(2*K, 50*K) + piano_tuners_per_piano = 1 / pianos_per_piano_tuner + + def pop_at_time(t): # t = Time in years after 2022 + avg_yearly_pct_change = sq.to(-0.01, 0.05) # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year + return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t) + + def total_tuners_at_time(t): + return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano + + # Get total piano tuners at 2030 + sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000) + +**WARNING:** Be careful about dividing by ``K``, ``M``, etc. ``1/2*K`` = +500 in Python. Use ``1/(2*K)`` instead to get the expected outcome. + +**WARNING:** Be careful about using ``K`` to get sample counts. Use +``sq.norm(2, 3) @ (2*K)``\ … ``sq.norm(2, 3) @ 2*K`` will return only +two samples, multiplied by 1000. + +Distributions +~~~~~~~~~~~~~ + +.. code:: python + + import squigglepy as sq + + # Normal distribution + sq.norm(1, 3) # 90% interval from 1 to 3 + + # Distribution can be sampled with mean and sd too + sq.norm(mean=0, sd=1) + + # Shorthand to get one sample + ~sq.norm(1, 3) + + # Shorthand to get more than one sample + sq.norm(1, 3) @ 100 + + # Longhand version to get more than one sample + sq.sample(sq.norm(1, 3), n=100) + + # Nice progress reporter + sq.sample(sq.norm(1, 3), n=1000, verbose=True) + + # Other distributions exist + sq.lognorm(1, 10) + sq.tdist(1, 10, t=5) + sq.triangular(1, 2, 3) + sq.pert(1, 2, 3, lam=2) + sq.binomial(p=0.5, n=5) + sq.beta(a=1, b=2) + sq.bernoulli(p=0.5) + sq.poisson(10) + sq.chisquare(2) + sq.gamma(3, 2) + sq.pareto(1) + sq.exponential(scale=1) + sq.geometric(p=0.5) + + # Discrete sampling + sq.discrete({'A': 0.1, 'B': 0.9}) + + # Can return integers + sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15}) + + # Alternate format (also can be used to return more complex objects) + sq.discrete([[0.1, 0], + [0.3, 1], + [0.3, 2], + [0.15, 3], + [0.15, 4]]) + + sq.discrete([0, 1, 2]) # No weights assumes equal weights + + # You can mix distributions together + sq.mixture([sq.norm(1, 3), + sq.norm(4, 10), + sq.lognorm(1, 10)], # Distributions to mix + [0.3, 0.3, 0.4]) # These are the weights on each distribution + + # This is equivalent to the above, just a different way of doing the notation + sq.mixture([[0.3, sq.norm(1,3)], + [0.3, sq.norm(4,10)], + [0.4, sq.lognorm(1,10)]]) + + # Make a zero-inflated distribution + # 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`. + sq.zero_inflated(0.6, sq.norm(1, 2)) + +Additional Features +~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + import squigglepy as sq + + # You can add and subtract distributions + (sq.norm(1,3) + sq.norm(4,5)) @ 100 + (sq.norm(1,3) - sq.norm(4,5)) @ 100 + (sq.norm(1,3) * sq.norm(4,5)) @ 100 + (sq.norm(1,3) / sq.norm(4,5)) @ 100 + + # You can also do math with numbers + ~((sq.norm(sd=5) + 2) * 2) + ~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10) + + # You can change the CI from 90% (default) to 80% + sq.norm(1, 3, credibility=80) + + # You can clip + sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5. + + # You can also clip with a function, and use pipes + sq.norm(0, 3) >> sq.clip(0, 5) + + # You can correlate continuous distributions + a, b = sq.uniform(-1, 1), sq.to(0, 3) + a, b = sq.correlate((a, b), 0.5) # Correlate a and b with a correlation of 0.5 + # You can even pass your own correlation matrix! + a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]]) + +Example: Rolling a Die +^^^^^^^^^^^^^^^^^^^^^^ + +An example of how to use distributions to build tools: + +.. code:: python + + import squigglepy as sq + + def roll_die(sides, n=1): + return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None + + roll_die(sides=6, n=10) + # [2, 6, 5, 2, 6, 2, 3, 1, 5, 2] + +This is already included standard in the utils of this package. Use +``sq.roll_die``. + +Bayesian inference +~~~~~~~~~~~~~~~~~~ + +1% of women at age forty who participate in routine screening have +breast cancer. 80% of women with breast cancer will get positive +mammographies. 9.6% of women without breast cancer will also get +positive mammographies. + +A woman in this age group had a positive mammography in a routine +screening. What is the probability that she actually has breast cancer? + +We can approximate the answer with a Bayesian network (uses rejection +sampling): + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import M + + def mammography(has_cancer): + return sq.event(0.8 if has_cancer else 0.096) + + def define_event(): + cancer = ~sq.bernoulli(0.01) + return({'mammography': mammography(cancer), + 'cancer': cancer}) + + bayes.bayesnet(define_event, + find=lambda e: e['cancer'], + conditional_on=lambda e: e['mammography'], + n=1*M) + # 0.07723995880535531 + +Or if we have the information immediately on hand, we can directly +calculate it. Though this doesn’t work for very complex stuff. + +.. code:: python + + from squigglepy import bayes + bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) + # 0.07763975155279504 + +You can also make distributions and update them: + +.. code:: python + + import matplotlib.pyplot as plt + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import K + import numpy as np + + print('Prior') + prior = sq.norm(1,5) + prior_samples = prior @ (10*K) + plt.hist(prior_samples, bins = 200) + plt.show() + print(sq.get_percentiles(prior_samples)) + print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples))) + print('-') + + print('Evidence') + evidence = sq.norm(2,3) + evidence_samples = evidence @ (10*K) + plt.hist(evidence_samples, bins = 200) + plt.show() + print(sq.get_percentiles(evidence_samples)) + print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples))) + print('-') + + print('Posterior') + posterior = bayes.update(prior, evidence) + posterior_samples = posterior @ (10*K) + plt.hist(posterior_samples, bins = 200) + plt.show() + print(sq.get_percentiles(posterior_samples)) + print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples))) + + print('Average') + average = bayes.average(prior, evidence) + average_samples = average @ (10*K) + plt.hist(average_samples, bins = 200) + plt.show() + print(sq.get_percentiles(average_samples)) + print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples))) + +Example: Alarm net +^^^^^^^^^^^^^^^^^^ + +This is the alarm network from `Bayesian Artificial Intelligence - +Section +2.5.1 `__: + + Assume your house has an alarm system against burglary. + + You live in the seismically active area and the alarm system can get + occasionally set off by an earthquake. + + You have two neighbors, Mary and John, who do not know each other. If + they hear the alarm they call you, but this is not guaranteed. + + The chance of a burglary on a particular day is 0.1%. The chance of + an earthquake on a particular day is 0.2%. + + The alarm will go off 95% of the time with both a burglary and an + earthquake, 94% of the time with just a burglary, 29% of the time + with just an earthquake, and 0.1% of the time with nothing (total + false alarm). + + John will call you 90% of the time when the alarm goes off. But on 5% + of the days, John will just call to say “hi”. Mary will call you 70% + of the time when the alarm goes off. But on 1% of the days, Mary will + just call to say “hi”. + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import M + + def p_alarm_goes_off(burglary, earthquake): + if burglary and earthquake: + return 0.95 + elif burglary and not earthquake: + return 0.94 + elif not burglary and earthquake: + return 0.29 + elif not burglary and not earthquake: + return 0.001 + + def p_john_calls(alarm_goes_off): + return 0.9 if alarm_goes_off else 0.05 + + def p_mary_calls(alarm_goes_off): + return 0.7 if alarm_goes_off else 0.01 + + def define_event(): + burglary_happens = sq.event(p=0.001) + earthquake_happens = sq.event(p=0.002) + alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens)) + john_calls = sq.event(p_john_calls(alarm_goes_off)) + mary_calls = sq.event(p_mary_calls(alarm_goes_off)) + return {'burglary': burglary_happens, + 'earthquake': earthquake_happens, + 'alarm_goes_off': alarm_goes_off, + 'john_calls': john_calls, + 'mary_calls': mary_calls} + + # What are the chances that both John and Mary call if an earthquake happens? + bayes.bayesnet(define_event, + n=1*M, + find=lambda e: (e['mary_calls'] and e['john_calls']), + conditional_on=lambda e: e['earthquake']) + # Result will be ~0.19, though it varies because it is based on a random sample. + # This also may take a minute to run. + + # If both John and Mary call, what is the chance there's been a burglary? + bayes.bayesnet(define_event, + n=1*M, + find=lambda e: e['burglary'], + conditional_on=lambda e: (e['mary_calls'] and e['john_calls'])) + # Result will be ~0.27, though it varies because it is based on a random sample. + # This will run quickly because there is a built-in cache. + # Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache. + +Note that the amount of Bayesian analysis that squigglepy can do is +pretty limited. For more complex bayesian analysis, consider +`sorobn `__, +`pomegranate `__, +`bnlearn `__, or +`pyMC `__. + +Example: A Demonstration of the Monty Hall Problem +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import K, M, B, T + + + def monte_hall(door_picked, switch=False): + doors = ['A', 'B', 'C'] + car_is_behind_door = ~sq.discrete(doors) + reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door]) + + if switch: + old_door_picked = door_picked + door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0] + + won_car = (car_is_behind_door == door_picked) + return won_car + + + def define_event(): + door = ~sq.discrete(['A', 'B', 'C']) + switch = sq.event(0.5) + return {'won': monte_hall(door_picked=door, switch=switch), + 'switched': switch} + + RUNS = 10*K + r = bayes.bayesnet(define_event, + find=lambda e: e['won'], + conditional_on=lambda e: e['switched'], + verbose=True, + n=RUNS) + print('Win {}% of the time when switching'.format(int(r * 100))) + + r = bayes.bayesnet(define_event, + find=lambda e: e['won'], + conditional_on=lambda e: not e['switched'], + verbose=True, + n=RUNS) + print('Win {}% of the time when not switching'.format(int(r * 100))) + + # Win 66% of the time when switching + # Win 34% of the time when not switching + +Example: More complex coin/dice interactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Imagine that I flip a coin. If heads, I take a random die out of my + blue bag. If tails, I take a random die out of my red bag. The blue + bag contains only 6-sided dice. The red bag contains a 4-sided die, a + 6-sided die, a 10-sided die, and a 20-sided die. I then roll the + random die I took. What is the chance that I roll a 6? + +.. code:: python + + import squigglepy as sq + from squigglepy.numbers import K, M, B, T + from squigglepy import bayes + + def define_event(): + if sq.flip_coin() == 'heads': # Blue bag + return sq.roll_die(6) + else: # Red bag + return sq.discrete([4, 6, 10, 20]) >> sq.roll_die + + + bayes.bayesnet(define_event, + find=lambda e: e == 6, + verbose=True, + n=100*K) + # This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292 + +Kelly betting +~~~~~~~~~~~~~ + +You can use probability generated, combine with a bankroll to determine +bet sizing using `Kelly +criterion `__. + +For example, if you want to Kelly bet and you’ve… + +- determined that your price (your probability of the event in question + happening / the market in question resolving in your favor) is $0.70 + (70%) +- see that the market is pricing at $0.65 +- you have a bankroll of $1000 that you are willing to bet + +You should bet as follows: + +.. code:: python + + import squigglepy as sq + kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000) + kelly_data['kelly'] # What fraction of my bankroll should I bet on this? + # 0.143 + kelly_data['target'] # How much money should be invested in this? + # 142.86 + kelly_data['expected_roi'] # What is the expected ROI of this bet? + # 0.077 + +More examples +~~~~~~~~~~~~~ + +You can see more examples of squigglepy in action +`here `__. + +Run tests +--------- + +Use ``black .`` for formatting. + +Run +``ruff check . && pytest && pip3 install . && python3 tests/integration.py`` + +Disclaimers +----------- + +This package is unofficial and supported by myself and Rethink +Priorities. It is not affiliated with or associated with the Quantified +Uncertainty Research Institute, which maintains the Squiggle language +(in JavaScript). + +This package is also new and not yet in a stable production version, so +you may encounter bugs and other errors. Please report those so they can +be fixed. It’s also possible that future versions of the package may +introduce breaking changes. + +This package is available under an MIT License. + +Acknowledgements +---------------- + +- The primary author of this package is Peter Wildeford. Agustín + Covarrubias and Bernardo Baron contributed several key features and + developments. +- Thanks to Ozzie Gooen and the Quantified Uncertainty Research + Institute for creating and maintaining the original Squiggle + language. +- Thanks to Dawn Drescher for helping me implement math between + distributions. +- Thanks to Dawn Drescher for coming up with the idea to use ``~`` as a + shorthand for ``sample``, as well as helping me implement it. diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt new file mode 100644 index 0000000..9a79421 --- /dev/null +++ b/docs/build/html/_sources/index.rst.txt @@ -0,0 +1,18 @@ +Squigglepy: Implementation of Squiggle in Python +================================================ + +`Squiggle `__ is a “simple +programming language for intuitive probabilistic estimation”. It serves +as its own standalone programming language with its own syntax, but it +is implemented in JavaScript. I like the features of Squiggle and intend +to use it frequently, but I also sometimes want to use similar +functionalities in Python, especially alongside other Python statistical +programming packages like Numpy, Pandas, and Matplotlib. The +**squigglepy** package here implements many Squiggle-like +functionalities in Python. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +Check out the :doc:`README ` to get started. diff --git a/docs/build/html/_static/alabaster.css b/docs/build/html/_static/alabaster.css new file mode 100644 index 0000000..517d0b2 --- /dev/null +++ b/docs/build/html/_static/alabaster.css @@ -0,0 +1,703 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css new file mode 100644 index 0000000..e760386 --- /dev/null +++ b/docs/build/html/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/build/html/_static/custom.css b/docs/build/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/docs/build/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/docs/build/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js new file mode 100644 index 0000000..7e4c114 --- /dev/null +++ b/docs/build/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/build/html/_static/file.png b/docs/build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/build/html/_static/jquery.js b/docs/build/html/_static/jquery.js new file mode 100644 index 0000000..7e32910 --- /dev/null +++ b/docs/build/html/_static/jquery.js @@ -0,0 +1,10365 @@ +/*! + * jQuery JavaScript Library v3.3.1-dfsg + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2019-04-19T06:52Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. + + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + var preservedScriptAttributes = { + type: true, + src: true, + noModule: true + }; + + function DOMEval( code, doc, node ) { + doc = doc || document; + + var i, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + if ( node[ i ] ) { + script[ i ] = node[ i ]; + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.3.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + div.style.position = "absolute"; + scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + ) ); + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + val = curCSS( elem, dimension, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox; + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = valueIsBorderBox && + ( support.boxSizingReliable() || val === elem.style[ dimension ] ); + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + if ( val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { + + val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; + + // offsetWidth/offsetHeight provide border-box values + valueIsBorderBox = true; + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra && boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ); + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && support.scrollboxSize() === styles.position ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = Date.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " +{% endmacro %} + +{% macro body_post() %} + + + +{% endmacro %} \ No newline at end of file diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html new file mode 100644 index 0000000..23b4876 --- /dev/null +++ b/docs/build/html/genindex.html @@ -0,0 +1,333 @@ + + + + + + + + + + Index — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+ + + + + +
+ + +

Index

+ +
+ +
+ + +
+ + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/index.html b/docs/build/html/index.html new file mode 100644 index 0000000..acead48 --- /dev/null +++ b/docs/build/html/index.html @@ -0,0 +1,359 @@ + + + + + + + + + + + Squigglepy: Implementation of Squiggle in Python — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+ + + + + +
+ +
+

Squigglepy: Implementation of Squiggle in Python#

+

Squiggle is a “simple +programming language for intuitive probabilistic estimation”. It serves +as its own standalone programming language with its own syntax, but it +is implemented in JavaScript. I like the features of Squiggle and intend +to use it frequently, but I also sometimes want to use similar +functionalities in Python, especially alongside other Python statistical +programming packages like Numpy, Pandas, and Matplotlib. The +squigglepy package here implements many Squiggle-like +functionalities in Python.

+
+
+

Check out the README to get started.

+
+ + +
+ + + + + +
+ +
+
+
+ +
+ + + +
+ + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..3a5c908166e70f24a93dc0a41ec8dca8a4e4c2e7 GIT binary patch literal 276 zcmY#Z2rkIT%&Sny%qvUHE6FdaR47X=D$dN$Q!wIERtPA{&q_@$u~G;wEX_<$&q*z) z1d4`1R9Gnh*&!LJ3Pq{8iJ5sRsYMF;X$mD7nZ*ienK`KnKsq@;x1cDsxHvUMp|m(N zFI}N3Co@TptKt@SQEAD?(ohXO&y8Lu{lhMphHx--zet_(i?T^G8JInpnuILn;c-emz@0h3TuKOoNKIgY*%hkh@1$cDkOF XTp^{H6rk_$gjwiv@J@!72X$-!b_{eB literal 0 HcmV?d00001 diff --git a/docs/build/html/search.html b/docs/build/html/search.html new file mode 100644 index 0000000..41857b5 --- /dev/null +++ b/docs/build/html/search.html @@ -0,0 +1,357 @@ + + + + + + + + + Search - Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+ + +
+

Search

+ + + +
+
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js new file mode 100644 index 0000000..9c3cd0c --- /dev/null +++ b/docs/build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["README", "index"], "filenames": ["README.rst", "index.rst"], "titles": ["Squigglepy: Implementation of Squiggle in Python", "Squigglepy: Implementation of Squiggle in Python"], "terms": {"index": [], "modul": [], "search": [], "page": [], "i": [0, 1], "simpl": [0, 1], "program": [0, 1], "languag": [0, 1], "intuit": [0, 1], "probabilist": [0, 1], "estim": [0, 1], "It": [0, 1], "serv": [0, 1], "its": [0, 1], "own": [0, 1], "standalon": [0, 1], "syntax": [0, 1], "javascript": [0, 1], "like": [0, 1], "intend": [0, 1], "us": [0, 1], "frequent": [0, 1], "also": [0, 1], "sometim": [0, 1], "want": [0, 1], "similar": [0, 1], "function": [0, 1], "especi": [0, 1], "alongsid": [0, 1], "other": [0, 1], "statist": [0, 1], "packag": [0, 1], "numpi": [0, 1], "panda": [0, 1], "matplotlib": [0, 1], "The": [0, 1], "here": [0, 1], "mani": [0, 1], "pip": 0, "For": 0, "plot": 0, "support": 0, "you": 0, "can": 0, "extra": 0, "": 0, "from": 0, "doc": 0, "import": 0, "sq": 0, "np": 0, "pyplot": 0, "plt": 0, "number": 0, "k": 0, "m": 0, "pprint": 0, "pop_of_ny_2022": 0, "8": 0, "1": 0, "4": 0, "thi": 0, "mean": 0, "re": 0, "90": 0, "confid": 0, "valu": 0, "between": 0, "million": 0, "pct_of_pop_w_piano": 0, "0": 0, "2": 0, "01": 0, "we": 0, "assum": 0, "ar": 0, "almost": 0, "peopl": 0, "multipl": 0, "pianos_per_piano_tun": 0, "50": 0, "piano_tuners_per_piano": 0, "total_tuners_in_2022": 0, "sampl": 0, "1000": 0, "note": 0, "shorthand": 0, "get": [0, 1], "sd": 0, "print": 0, "format": 0, "round": 0, "std": 0, "percentil": 0, "get_percentil": 0, "digit": 0, "histogram": 0, "hist": 0, "bin": 0, "200": 0, "show": 0, "shorter": 0, "And": 0, "version": 0, "incorpor": 0, "time": 0, "def": 0, "pop_at_tim": 0, "t": 0, "year": 0, "after": 0, "2022": 0, "avg_yearly_pct_chang": 0, "05": 0, "expect": 0, "nyc": 0, "continu": 0, "grow": 0, "an": 0, "roughli": 0, "per": 0, "return": 0, "total_tuners_at_tim": 0, "total": 0, "2030": 0, "warn": 0, "Be": 0, "care": 0, "about": 0, "divid": 0, "etc": 0, "500": 0, "instead": 0, "outcom": 0, "count": 0, "norm": 0, "3": 0, "onli": 0, "two": 0, "multipli": 0, "normal": 0, "interv": 0, "too": 0, "one": 0, "than": 0, "100": 0, "longhand": 0, "n": 0, "nice": 0, "progress": 0, "report": 0, "verbos": 0, "true": 0, "exist": 0, "lognorm": 0, "10": 0, "tdist": 0, "5": 0, "triangular": 0, "pert": 0, "lam": 0, "binomi": 0, "p": 0, "beta": 0, "b": 0, "bernoulli": 0, "poisson": 0, "chisquar": 0, "gamma": 0, "pareto": 0, "exponenti": 0, "scale": 0, "geometr": 0, "discret": 0, "9": 0, "integ": 0, "15": 0, "altern": 0, "object": 0, "No": 0, "weight": 0, "equal": 0, "mix": 0, "togeth": 0, "mixtur": 0, "These": 0, "each": 0, "equival": 0, "abov": 0, "just": 0, "differ": 0, "wai": 0, "do": 0, "notat": 0, "make": 0, "zero": 0, "inflat": 0, "60": 0, "chanc": 0, "40": 0, "zero_infl": 0, "6": 0, "add": 0, "subtract": 0, "math": 0, "chang": 0, "ci": 0, "default": 0, "80": 0, "credibl": 0, "clip": 0, "lclip": 0, "rclip": 0, "anyth": 0, "lower": 0, "higher": 0, "pipe": 0, "correl": 0, "uniform": 0, "even": 0, "pass": 0, "your": 0, "matrix": 0, "how": 0, "build": 0, "tool": 0, "roll_di": 0, "side": 0, "list": 0, "rang": 0, "els": 0, "none": 0, "alreadi": 0, "includ": 0, "standard": 0, "util": 0, "women": 0, "ag": 0, "forti": 0, "who": 0, "particip": 0, "routin": 0, "screen": 0, "have": 0, "breast": 0, "cancer": 0, "posit": 0, "mammographi": 0, "without": 0, "woman": 0, "group": 0, "had": 0, "what": 0, "probabl": 0, "she": 0, "actual": 0, "ha": 0, "approxim": 0, "answer": 0, "network": 0, "reject": 0, "bay": 0, "has_canc": 0, "event": 0, "096": 0, "define_ev": 0, "bayesnet": 0, "find": 0, "lambda": 0, "e": 0, "conditional_on": 0, "07723995880535531": 0, "Or": 0, "inform": 0, "immedi": 0, "hand": 0, "directli": 0, "calcul": 0, "though": 0, "doesn": 0, "work": 0, "veri": 0, "stuff": 0, "simple_bay": 0, "prior": 0, "likelihood_h": 0, "likelihood_not_h": 0, "07763975155279504": 0, "updat": 0, "them": 0, "prior_sampl": 0, "evid": 0, "evidence_sampl": 0, "posterior": 0, "posterior_sampl": 0, "averag": 0, "average_sampl": 0, "artifici": 0, "intellig": 0, "section": 0, "hous": 0, "system": 0, "against": 0, "burglari": 0, "live": 0, "seismic": 0, "activ": 0, "area": 0, "occasion": 0, "set": 0, "off": 0, "earthquak": 0, "neighbor": 0, "mari": 0, "john": 0, "know": 0, "If": 0, "thei": 0, "hear": 0, "call": 0, "guarante": 0, "particular": 0, "dai": 0, "go": 0, "95": 0, "both": 0, "94": 0, "29": 0, "noth": 0, "fals": 0, "when": 0, "goe": 0, "But": 0, "sai": 0, "hi": 0, "70": 0, "p_alarm_goes_off": 0, "elif": 0, "001": 0, "p_john_cal": 0, "alarm_goes_off": 0, "p_mary_cal": 0, "7": 0, "burglary_happen": 0, "earthquake_happen": 0, "002": 0, "john_cal": 0, "mary_cal": 0, "happen": 0, "result": 0, "19": 0, "vari": 0, "becaus": 0, "base": 0, "random": 0, "mai": 0, "take": 0, "minut": 0, "been": 0, "27": 0, "quickli": 0, "built": 0, "cach": 0, "reload_cach": 0, "recalcul": 0, "amount": 0, "analysi": 0, "pretti": 0, "limit": 0, "consid": 0, "sorobn": 0, "pomegran": 0, "bnlearn": 0, "pymc": 0, "monte_hal": 0, "door_pick": 0, "switch": 0, "door": 0, "c": 0, "car_is_behind_door": 0, "reveal_door": 0, "d": 0, "old_door_pick": 0, "won_car": 0, "won": 0, "r": 0, "win": 0, "int": 0, "66": 0, "34": 0, "imagin": 0, "flip": 0, "head": 0, "out": [0, 1], "my": 0, "blue": 0, "bag": 0, "tail": 0, "red": 0, "contain": 0, "20": 0, "took": 0, "flip_coin": 0, "me": 0, "12306": 0, "which": 0, "close": 0, "correct": 0, "12292": 0, "gener": 0, "combin": 0, "bankrol": 0, "determin": 0, "size": 0, "criterion": 0, "ve": 0, "price": 0, "question": 0, "market": 0, "resolv": 0, "favor": 0, "see": 0, "65": 0, "willing": 0, "should": 0, "follow": 0, "kelly_data": 0, "my_pric": 0, "market_pric": 0, "fraction": 0, "143": 0, "target": 0, "much": 0, "monei": 0, "invest": 0, "142": 0, "86": 0, "expected_roi": 0, "roi": 0, "077": 0, "action": 0, "black": 0, "ruff": 0, "check": [0, 1], "pytest": 0, "pip3": 0, "python3": 0, "integr": 0, "py": 0, "unoffici": 0, "myself": 0, "rethink": 0, "prioriti": 0, "affili": 0, "associ": 0, "quantifi": 0, "uncertainti": 0, "research": 0, "institut": 0, "maintain": 0, "new": 0, "yet": 0, "stabl": 0, "product": 0, "so": 0, "encount": 0, "bug": 0, "error": 0, "pleas": 0, "those": 0, "fix": 0, "possibl": 0, "futur": 0, "introduc": 0, "break": 0, "avail": 0, "under": 0, "mit": 0, "licens": 0, "primari": 0, "author": 0, "peter": 0, "wildeford": 0, "agust\u00edn": 0, "covarrubia": 0, "bernardo": 0, "baron": 0, "contribut": 0, "sever": 0, "kei": 0, "develop": 0, "thank": 0, "ozzi": 0, "gooen": 0, "creat": 0, "origin": 0, "dawn": 0, "drescher": 0, "help": 0, "come": 0, "up": 0, "idea": 0, "well": 0, "featur": 1, "start": 1, "readm": 1}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"welcom": [], "squigglepi": [0, 1], "": [], "document": [], "indic": [], "tabl": [], "implement": [0, 1], "squiggl": [0, 1], "python": [0, 1], "instal": 0, "usag": 0, "piano": 0, "tuner": 0, "exampl": 0, "distribut": 0, "addit": 0, "featur": 0, "roll": 0, "die": 0, "bayesian": 0, "infer": 0, "alarm": 0, "net": 0, "A": 0, "demonstr": 0, "monti": 0, "hall": 0, "problem": 0, "more": 0, "complex": 0, "coin": 0, "dice": 0, "interact": 0, "kelli": 0, "bet": 0, "run": 0, "test": 0, "disclaim": 0, "acknowledg": 0}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Squigglepy: Implementation of Squiggle in Python": [[0, "squigglepy-implementation-of-squiggle-in-python"], [1, "squigglepy-implementation-of-squiggle-in-python"]], "Installation": [[0, "installation"]], "Usage": [[0, "usage"]], "Piano Tuners Example": [[0, "piano-tuners-example"]], "Distributions": [[0, "distributions"]], "Additional Features": [[0, "additional-features"]], "Example: Rolling a Die": [[0, "example-rolling-a-die"]], "Bayesian inference": [[0, "bayesian-inference"]], "Example: Alarm net": [[0, "example-alarm-net"]], "Example: A Demonstration of the Monty Hall Problem": [[0, "example-a-demonstration-of-the-monty-hall-problem"]], "Example: More complex coin/dice interactions": [[0, "example-more-complex-coin-dice-interactions"]], "Kelly betting": [[0, "kelly-betting"]], "More examples": [[0, "more-examples"]], "Run tests": [[0, "run-tests"]], "Disclaimers": [[0, "disclaimers"]], "Acknowledgements": [[0, "acknowledgements"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..543c6b1 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >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.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/docs/source/README.rst b/docs/source/README.rst new file mode 100644 index 0000000..f5ec681 --- /dev/null +++ b/docs/source/README.rst @@ -0,0 +1,531 @@ +Squigglepy: Implementation of Squiggle in Python +================================================ + +`Squiggle `__ is a “simple +programming language for intuitive probabilistic estimation”. It serves +as its own standalone programming language with its own syntax, but it +is implemented in JavaScript. I like the features of Squiggle and intend +to use it frequently, but I also sometimes want to use similar +functionalities in Python, especially alongside other Python statistical +programming packages like Numpy, Pandas, and Matplotlib. The +**squigglepy** package here implements many Squiggle-like +functionalities in Python. + +Installation +------------ + +.. code:: shell + + pip install squigglepy + +For plotting support, you can also use the ``plots`` extra: + +.. code:: shell + + pip install squigglepy[plots] + +Usage +----- + +Piano Tuners Example +~~~~~~~~~~~~~~~~~~~~ + +Here’s the Squigglepy implementation of `the example from Squiggle +Docs `__: + +.. code:: python + + import squigglepy as sq + import numpy as np + import matplotlib.pyplot as plt + from squigglepy.numbers import K, M + from pprint import pprint + + pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) # This means that you're 90% confident the value is between 8.1 and 8.4 Million. + pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 # We assume there are almost no people with multiple pianos + pianos_per_piano_tuner = sq.to(2*K, 50*K) + piano_tuners_per_piano = 1 / pianos_per_piano_tuner + total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano + samples = total_tuners_in_2022 @ 1000 # Note: `@ 1000` is shorthand to get 1000 samples + + # Get mean and SD + print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2), + round(np.std(samples), 2))) + + # Get percentiles + pprint(sq.get_percentiles(samples, digits=0)) + + # Histogram + plt.hist(samples, bins=200) + plt.show() + + # Shorter histogram + total_tuners_in_2022.plot() + +And the version from the Squiggle doc that incorporates time: + +.. code:: python + + import squigglepy as sq + from squigglepy.numbers import K, M + + pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) + pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 + pianos_per_piano_tuner = sq.to(2*K, 50*K) + piano_tuners_per_piano = 1 / pianos_per_piano_tuner + + def pop_at_time(t): # t = Time in years after 2022 + avg_yearly_pct_change = sq.to(-0.01, 0.05) # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year + return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t) + + def total_tuners_at_time(t): + return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano + + # Get total piano tuners at 2030 + sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000) + +**WARNING:** Be careful about dividing by ``K``, ``M``, etc. ``1/2*K`` = +500 in Python. Use ``1/(2*K)`` instead to get the expected outcome. + +**WARNING:** Be careful about using ``K`` to get sample counts. Use +``sq.norm(2, 3) @ (2*K)``\ … ``sq.norm(2, 3) @ 2*K`` will return only +two samples, multiplied by 1000. + +Distributions +~~~~~~~~~~~~~ + +.. code:: python + + import squigglepy as sq + + # Normal distribution + sq.norm(1, 3) # 90% interval from 1 to 3 + + # Distribution can be sampled with mean and sd too + sq.norm(mean=0, sd=1) + + # Shorthand to get one sample + ~sq.norm(1, 3) + + # Shorthand to get more than one sample + sq.norm(1, 3) @ 100 + + # Longhand version to get more than one sample + sq.sample(sq.norm(1, 3), n=100) + + # Nice progress reporter + sq.sample(sq.norm(1, 3), n=1000, verbose=True) + + # Other distributions exist + sq.lognorm(1, 10) + sq.tdist(1, 10, t=5) + sq.triangular(1, 2, 3) + sq.pert(1, 2, 3, lam=2) + sq.binomial(p=0.5, n=5) + sq.beta(a=1, b=2) + sq.bernoulli(p=0.5) + sq.poisson(10) + sq.chisquare(2) + sq.gamma(3, 2) + sq.pareto(1) + sq.exponential(scale=1) + sq.geometric(p=0.5) + + # Discrete sampling + sq.discrete({'A': 0.1, 'B': 0.9}) + + # Can return integers + sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15}) + + # Alternate format (also can be used to return more complex objects) + sq.discrete([[0.1, 0], + [0.3, 1], + [0.3, 2], + [0.15, 3], + [0.15, 4]]) + + sq.discrete([0, 1, 2]) # No weights assumes equal weights + + # You can mix distributions together + sq.mixture([sq.norm(1, 3), + sq.norm(4, 10), + sq.lognorm(1, 10)], # Distributions to mix + [0.3, 0.3, 0.4]) # These are the weights on each distribution + + # This is equivalent to the above, just a different way of doing the notation + sq.mixture([[0.3, sq.norm(1,3)], + [0.3, sq.norm(4,10)], + [0.4, sq.lognorm(1,10)]]) + + # Make a zero-inflated distribution + # 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`. + sq.zero_inflated(0.6, sq.norm(1, 2)) + +Additional Features +~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + import squigglepy as sq + + # You can add and subtract distributions + (sq.norm(1,3) + sq.norm(4,5)) @ 100 + (sq.norm(1,3) - sq.norm(4,5)) @ 100 + (sq.norm(1,3) * sq.norm(4,5)) @ 100 + (sq.norm(1,3) / sq.norm(4,5)) @ 100 + + # You can also do math with numbers + ~((sq.norm(sd=5) + 2) * 2) + ~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10) + + # You can change the CI from 90% (default) to 80% + sq.norm(1, 3, credibility=80) + + # You can clip + sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5. + + # You can also clip with a function, and use pipes + sq.norm(0, 3) >> sq.clip(0, 5) + + # You can correlate continuous distributions + a, b = sq.uniform(-1, 1), sq.to(0, 3) + a, b = sq.correlate((a, b), 0.5) # Correlate a and b with a correlation of 0.5 + # You can even pass your own correlation matrix! + a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]]) + +Example: Rolling a Die +^^^^^^^^^^^^^^^^^^^^^^ + +An example of how to use distributions to build tools: + +.. code:: python + + import squigglepy as sq + + def roll_die(sides, n=1): + return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None + + roll_die(sides=6, n=10) + # [2, 6, 5, 2, 6, 2, 3, 1, 5, 2] + +This is already included standard in the utils of this package. Use +``sq.roll_die``. + +Bayesian inference +~~~~~~~~~~~~~~~~~~ + +1% of women at age forty who participate in routine screening have +breast cancer. 80% of women with breast cancer will get positive +mammographies. 9.6% of women without breast cancer will also get +positive mammographies. + +A woman in this age group had a positive mammography in a routine +screening. What is the probability that she actually has breast cancer? + +We can approximate the answer with a Bayesian network (uses rejection +sampling): + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import M + + def mammography(has_cancer): + return sq.event(0.8 if has_cancer else 0.096) + + def define_event(): + cancer = ~sq.bernoulli(0.01) + return({'mammography': mammography(cancer), + 'cancer': cancer}) + + bayes.bayesnet(define_event, + find=lambda e: e['cancer'], + conditional_on=lambda e: e['mammography'], + n=1*M) + # 0.07723995880535531 + +Or if we have the information immediately on hand, we can directly +calculate it. Though this doesn’t work for very complex stuff. + +.. code:: python + + from squigglepy import bayes + bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) + # 0.07763975155279504 + +You can also make distributions and update them: + +.. code:: python + + import matplotlib.pyplot as plt + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import K + import numpy as np + + print('Prior') + prior = sq.norm(1,5) + prior_samples = prior @ (10*K) + plt.hist(prior_samples, bins = 200) + plt.show() + print(sq.get_percentiles(prior_samples)) + print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples))) + print('-') + + print('Evidence') + evidence = sq.norm(2,3) + evidence_samples = evidence @ (10*K) + plt.hist(evidence_samples, bins = 200) + plt.show() + print(sq.get_percentiles(evidence_samples)) + print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples))) + print('-') + + print('Posterior') + posterior = bayes.update(prior, evidence) + posterior_samples = posterior @ (10*K) + plt.hist(posterior_samples, bins = 200) + plt.show() + print(sq.get_percentiles(posterior_samples)) + print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples))) + + print('Average') + average = bayes.average(prior, evidence) + average_samples = average @ (10*K) + plt.hist(average_samples, bins = 200) + plt.show() + print(sq.get_percentiles(average_samples)) + print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples))) + +Example: Alarm net +^^^^^^^^^^^^^^^^^^ + +This is the alarm network from `Bayesian Artificial Intelligence - +Section +2.5.1 `__: + + Assume your house has an alarm system against burglary. + + You live in the seismically active area and the alarm system can get + occasionally set off by an earthquake. + + You have two neighbors, Mary and John, who do not know each other. If + they hear the alarm they call you, but this is not guaranteed. + + The chance of a burglary on a particular day is 0.1%. The chance of + an earthquake on a particular day is 0.2%. + + The alarm will go off 95% of the time with both a burglary and an + earthquake, 94% of the time with just a burglary, 29% of the time + with just an earthquake, and 0.1% of the time with nothing (total + false alarm). + + John will call you 90% of the time when the alarm goes off. But on 5% + of the days, John will just call to say “hi”. Mary will call you 70% + of the time when the alarm goes off. But on 1% of the days, Mary will + just call to say “hi”. + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import M + + def p_alarm_goes_off(burglary, earthquake): + if burglary and earthquake: + return 0.95 + elif burglary and not earthquake: + return 0.94 + elif not burglary and earthquake: + return 0.29 + elif not burglary and not earthquake: + return 0.001 + + def p_john_calls(alarm_goes_off): + return 0.9 if alarm_goes_off else 0.05 + + def p_mary_calls(alarm_goes_off): + return 0.7 if alarm_goes_off else 0.01 + + def define_event(): + burglary_happens = sq.event(p=0.001) + earthquake_happens = sq.event(p=0.002) + alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens)) + john_calls = sq.event(p_john_calls(alarm_goes_off)) + mary_calls = sq.event(p_mary_calls(alarm_goes_off)) + return {'burglary': burglary_happens, + 'earthquake': earthquake_happens, + 'alarm_goes_off': alarm_goes_off, + 'john_calls': john_calls, + 'mary_calls': mary_calls} + + # What are the chances that both John and Mary call if an earthquake happens? + bayes.bayesnet(define_event, + n=1*M, + find=lambda e: (e['mary_calls'] and e['john_calls']), + conditional_on=lambda e: e['earthquake']) + # Result will be ~0.19, though it varies because it is based on a random sample. + # This also may take a minute to run. + + # If both John and Mary call, what is the chance there's been a burglary? + bayes.bayesnet(define_event, + n=1*M, + find=lambda e: e['burglary'], + conditional_on=lambda e: (e['mary_calls'] and e['john_calls'])) + # Result will be ~0.27, though it varies because it is based on a random sample. + # This will run quickly because there is a built-in cache. + # Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache. + +Note that the amount of Bayesian analysis that squigglepy can do is +pretty limited. For more complex bayesian analysis, consider +`sorobn `__, +`pomegranate `__, +`bnlearn `__, or +`pyMC `__. + +Example: A Demonstration of the Monty Hall Problem +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import K, M, B, T + + + def monte_hall(door_picked, switch=False): + doors = ['A', 'B', 'C'] + car_is_behind_door = ~sq.discrete(doors) + reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door]) + + if switch: + old_door_picked = door_picked + door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0] + + won_car = (car_is_behind_door == door_picked) + return won_car + + + def define_event(): + door = ~sq.discrete(['A', 'B', 'C']) + switch = sq.event(0.5) + return {'won': monte_hall(door_picked=door, switch=switch), + 'switched': switch} + + RUNS = 10*K + r = bayes.bayesnet(define_event, + find=lambda e: e['won'], + conditional_on=lambda e: e['switched'], + verbose=True, + n=RUNS) + print('Win {}% of the time when switching'.format(int(r * 100))) + + r = bayes.bayesnet(define_event, + find=lambda e: e['won'], + conditional_on=lambda e: not e['switched'], + verbose=True, + n=RUNS) + print('Win {}% of the time when not switching'.format(int(r * 100))) + + # Win 66% of the time when switching + # Win 34% of the time when not switching + +Example: More complex coin/dice interactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Imagine that I flip a coin. If heads, I take a random die out of my + blue bag. If tails, I take a random die out of my red bag. The blue + bag contains only 6-sided dice. The red bag contains a 4-sided die, a + 6-sided die, a 10-sided die, and a 20-sided die. I then roll the + random die I took. What is the chance that I roll a 6? + +.. code:: python + + import squigglepy as sq + from squigglepy.numbers import K, M, B, T + from squigglepy import bayes + + def define_event(): + if sq.flip_coin() == 'heads': # Blue bag + return sq.roll_die(6) + else: # Red bag + return sq.discrete([4, 6, 10, 20]) >> sq.roll_die + + + bayes.bayesnet(define_event, + find=lambda e: e == 6, + verbose=True, + n=100*K) + # This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292 + +Kelly betting +~~~~~~~~~~~~~ + +You can use probability generated, combine with a bankroll to determine +bet sizing using `Kelly +criterion `__. + +For example, if you want to Kelly bet and you’ve… + +- determined that your price (your probability of the event in question + happening / the market in question resolving in your favor) is $0.70 + (70%) +- see that the market is pricing at $0.65 +- you have a bankroll of $1000 that you are willing to bet + +You should bet as follows: + +.. code:: python + + import squigglepy as sq + kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000) + kelly_data['kelly'] # What fraction of my bankroll should I bet on this? + # 0.143 + kelly_data['target'] # How much money should be invested in this? + # 142.86 + kelly_data['expected_roi'] # What is the expected ROI of this bet? + # 0.077 + +More examples +~~~~~~~~~~~~~ + +You can see more examples of squigglepy in action +`here `__. + +Run tests +--------- + +Use ``black .`` for formatting. + +Run +``ruff check . && pytest && pip3 install . && python3 tests/integration.py`` + +Disclaimers +----------- + +This package is unofficial and supported by myself and Rethink +Priorities. It is not affiliated with or associated with the Quantified +Uncertainty Research Institute, which maintains the Squiggle language +(in JavaScript). + +This package is also new and not yet in a stable production version, so +you may encounter bugs and other errors. Please report those so they can +be fixed. It’s also possible that future versions of the package may +introduce breaking changes. + +This package is available under an MIT License. + +Acknowledgements +---------------- + +- The primary author of this package is Peter Wildeford. Agustín + Covarrubias and Bernardo Baron contributed several key features and + developments. +- Thanks to Ozzie Gooen and the Quantified Uncertainty Research + Institute for creating and maintaining the original Squiggle + language. +- Thanks to Dawn Drescher for helping me implement math between + distributions. +- Thanks to Dawn Drescher for coming up with the idea to use ``~`` as a + shorthand for ``sample``, as well as helping me implement it. diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..1a3efc3 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- 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 = 'Squigglepy' +copyright = '2023, Peter Wildeford' +author = 'Peter Wildeford' + +# The short X.Y version +version = '' +# The full version, including alpha/beta/rc tags +release = '' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.imgmath', + 'sphinx.ext.viewcode', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'en' + +# 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 = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "pydata_sphinx_theme" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# 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'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Squigglepydoc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'Squigglepy.tex', 'Squigglepy Documentation', + 'Peter Wildeford', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'squigglepy', 'Squigglepy Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Squigglepy', 'Squigglepy Documentation', + author, 'Squigglepy', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + + +# -- Extension configuration ------------------------------------------------- diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..9a79421 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,18 @@ +Squigglepy: Implementation of Squiggle in Python +================================================ + +`Squiggle `__ is a “simple +programming language for intuitive probabilistic estimation”. It serves +as its own standalone programming language with its own syntax, but it +is implemented in JavaScript. I like the features of Squiggle and intend +to use it frequently, but I also sometimes want to use similar +functionalities in Python, especially alongside other Python statistical +programming packages like Numpy, Pandas, and Matplotlib. The +**squigglepy** package here implements many Squiggle-like +functionalities in Python. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +Check out the :doc:`README ` to get started. From 397a0e6503110e2968254f40c8fe3a732abf6f09 Mon Sep 17 00:00:00 2001 From: Michael Dickens Date: Thu, 23 Nov 2023 12:36:16 -0800 Subject: [PATCH 2/7] docs: generate using sphinx-apidoc --- docs/Makefile | 7 +- docs/build/doctrees/environment.pickle | Bin 81020 -> 1496050 bytes docs/build/doctrees/examples.doctree | Bin 0 -> 41989 bytes docs/build/doctrees/index.doctree | Bin 4974 -> 10780 bytes docs/build/doctrees/reference/modules.doctree | Bin 0 -> 2792 bytes .../reference/squigglepy.bayes.doctree | Bin 0 -> 53325 bytes .../reference/squigglepy.correlation.doctree | Bin 0 -> 56364 bytes .../squigglepy.distributions.doctree | Bin 0 -> 332703 bytes .../doctrees/reference/squigglepy.doctree | Bin 0 -> 3633 bytes .../reference/squigglepy.numbers.doctree | Bin 0 -> 2850 bytes .../doctrees/reference/squigglepy.rng.doctree | Bin 0 -> 7310 bytes .../reference/squigglepy.samplers.doctree | Bin 0 -> 171575 bytes .../reference/squigglepy.squigglepy.doctree | Bin 0 -> 5627 bytes .../reference/squigglepy.tests.doctree | Bin 0 -> 5947 bytes .../reference/squigglepy.utils.doctree | Bin 0 -> 210728 bytes .../reference/squigglepy.version.doctree | Bin 0 -> 2850 bytes docs/build/html/_modules/index.html | 386 +++ .../build/html/_modules/squigglepy/bayes.html | 804 ++++++ .../html/_modules/squigglepy/correlation.html | 717 ++++++ .../_modules/squigglepy/distributions.html | 2239 +++++++++++++++++ docs/build/html/_modules/squigglepy/rng.html | 389 +++ .../html/_modules/squigglepy/samplers.html | 1560 ++++++++++++ .../build/html/_modules/squigglepy/utils.html | 1628 ++++++++++++ docs/build/html/_sources/examples.rst.txt | 468 ++++ docs/build/html/_sources/index.rst.txt | 61 +- .../html/_sources/reference/modules.rst.txt | 7 + .../reference/squigglepy.bayes.rst.txt | 7 + .../reference/squigglepy.correlation.rst.txt | 7 + .../squigglepy.distributions.rst.txt | 7 + .../reference/squigglepy.numbers.rst.txt | 7 + .../_sources/reference/squigglepy.rng.rst.txt | 7 + .../_sources/reference/squigglepy.rst.txt | 22 + .../reference/squigglepy.samplers.rst.txt | 7 + .../reference/squigglepy.squigglepy.rst.txt | 78 + .../reference/squigglepy.tests.rst.txt | 86 + .../reference/squigglepy.utils.rst.txt | 7 + .../reference/squigglepy.version.rst.txt | 7 + docs/build/html/examples.html | 891 +++++++ docs/build/html/genindex.html | 527 ++++ docs/build/html/index.html | 120 +- docs/build/html/objects.inv | Bin 276 -> 1334 bytes docs/build/html/py-modindex.html | 414 +++ docs/build/html/reference/modules.html | 675 +++++ .../html/reference/squigglepy.bayes.html | 649 +++++ .../reference/squigglepy.correlation.html | 597 +++++ .../reference/squigglepy.distributions.html | 1721 +++++++++++++ docs/build/html/reference/squigglepy.html | 602 +++++ .../html/reference/squigglepy.numbers.html | 446 ++++ docs/build/html/reference/squigglepy.rng.html | 484 ++++ .../html/reference/squigglepy.samplers.html | 1179 +++++++++ .../html/reference/squigglepy.squigglepy.html | 434 ++++ .../html/reference/squigglepy.tests.html | 438 ++++ .../html/reference/squigglepy.utils.html | 1383 ++++++++++ .../html/reference/squigglepy.version.html | 446 ++++ docs/build/html/search.html | 26 + docs/build/html/searchindex.js | 2 +- docs/source/deleteme | 0 docs/source/examples.rst | 468 ++++ docs/source/index.rst | 61 +- docs/source/reference/modules.rst | 7 + docs/source/reference/squigglepy.bayes.rst | 7 + .../reference/squigglepy.correlation.rst | 7 + .../reference/squigglepy.distributions.rst | 7 + docs/source/reference/squigglepy.numbers.rst | 7 + docs/source/reference/squigglepy.rng.rst | 7 + docs/source/reference/squigglepy.rst | 22 + docs/source/reference/squigglepy.samplers.rst | 7 + docs/source/reference/squigglepy.utils.rst | 7 + docs/source/reference/squigglepy.version.rst | 7 + squigglepy/bayes.py | 4 + squigglepy/distributions.py | 4 + 71 files changed, 20151 insertions(+), 13 deletions(-) create mode 100644 docs/build/doctrees/examples.doctree create mode 100644 docs/build/doctrees/reference/modules.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.bayes.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.correlation.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.distributions.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.numbers.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.rng.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.samplers.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.squigglepy.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.tests.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.utils.doctree create mode 100644 docs/build/doctrees/reference/squigglepy.version.doctree create mode 100644 docs/build/html/_modules/index.html create mode 100644 docs/build/html/_modules/squigglepy/bayes.html create mode 100644 docs/build/html/_modules/squigglepy/correlation.html create mode 100644 docs/build/html/_modules/squigglepy/distributions.html create mode 100644 docs/build/html/_modules/squigglepy/rng.html create mode 100644 docs/build/html/_modules/squigglepy/samplers.html create mode 100644 docs/build/html/_modules/squigglepy/utils.html create mode 100644 docs/build/html/_sources/examples.rst.txt create mode 100644 docs/build/html/_sources/reference/modules.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.bayes.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.correlation.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.distributions.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.numbers.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.rng.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.samplers.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.squigglepy.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.tests.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.utils.rst.txt create mode 100644 docs/build/html/_sources/reference/squigglepy.version.rst.txt create mode 100644 docs/build/html/examples.html create mode 100644 docs/build/html/py-modindex.html create mode 100644 docs/build/html/reference/modules.html create mode 100644 docs/build/html/reference/squigglepy.bayes.html create mode 100644 docs/build/html/reference/squigglepy.correlation.html create mode 100644 docs/build/html/reference/squigglepy.distributions.html create mode 100644 docs/build/html/reference/squigglepy.html create mode 100644 docs/build/html/reference/squigglepy.numbers.html create mode 100644 docs/build/html/reference/squigglepy.rng.html create mode 100644 docs/build/html/reference/squigglepy.samplers.html create mode 100644 docs/build/html/reference/squigglepy.squigglepy.html create mode 100644 docs/build/html/reference/squigglepy.tests.html create mode 100644 docs/build/html/reference/squigglepy.utils.html create mode 100644 docs/build/html/reference/squigglepy.version.html create mode 100644 docs/source/deleteme create mode 100644 docs/source/examples.rst create mode 100644 docs/source/reference/modules.rst create mode 100644 docs/source/reference/squigglepy.bayes.rst create mode 100644 docs/source/reference/squigglepy.correlation.rst create mode 100644 docs/source/reference/squigglepy.distributions.rst create mode 100644 docs/source/reference/squigglepy.numbers.rst create mode 100644 docs/source/reference/squigglepy.rng.rst create mode 100644 docs/source/reference/squigglepy.rst create mode 100644 docs/source/reference/squigglepy.samplers.rst create mode 100644 docs/source/reference/squigglepy.utils.rst create mode 100644 docs/source/reference/squigglepy.version.rst diff --git a/docs/Makefile b/docs/Makefile index 69fe55e..be9d2e1 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -16,4 +16,9 @@ help: # 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) \ No newline at end of file + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +buildapi: + sphinx-apidoc -efM ../squigglepy -o source/reference + @echo "Auto-generation of API documentation finished. " \ + "The generated files are in 'api/'" diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index 6edc5b2af3c3580a12566d9f1fee66a1fdecd080..aa95bcaa7b8a4a95fc58b095af2fc7e6625d7b2b 100644 GIT binary patch literal 1496050 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 Gr};lp)`M37 delta 585 zcmZuu&ubGw6n2wr($%G{3OSgzY{4HXY7W{{5J75B#T<$t9)ewWCw)Vc*)=muBPi8_ zpzu7%K1HN=@hE%oFDTTDe}Z=p#e;u<*ZHUMD(%COjhrB3z`PN1I(6-%}KU^EoH`;^nM zg8KhC#~k2cRjR&JVhRE8Ej_bWC;FyX_wzTEbFC&;EDK>-o0zc1_f_7D1YBU;B|a-% z%HT45fCjwFPtPyxVU+>)4P@wz(?KW|!AGodWge%3r`bN9;#!Q-zKo=ym*e(sI8>Zk z92>+&(XlkkLa+!|U}@tFvmu*N$N7H^^`~~g{PpZL&p!68hlO4~DwW_@(L4XW9KazQ bX!KM#5LT4tUxdR~8kRX8fUk?M%}wVwA;j4& diff --git a/docs/build/doctrees/reference/modules.doctree b/docs/build/doctrees/reference/modules.doctree new file mode 100644 index 0000000000000000000000000000000000000000..146f4044c2699a2767ce0c62278f7e4aa3dadafe GIT binary patch literal 2792 zcmZWrTWcIQ6n1RydUw6Mz9cDy#4VxZMq_U&eJFh@v~Q+qz)6DGbrG~|$qoZ^Ez9aqK`RCukPW2a#Tp^@hTu{ceVcf;gV5Vg`&3Ftu(8z>T%yJ#y#xPFmUMhFdoIh|p^U~<{xaf$kICvXh zh<@mJ=@nnw3Iq49l=Hdb#cfPlP}={EFOv6-y^pburCU&V_EDUKK50W0d!gGzcop`Q z)I465QyK=;dn>1>vV@dCS*}*X(_X%)}Fv?koJB;`bcCm-syjC;#(^+)+L& ztBkM0gO$Q6=J;2nVJLN`O2%graiRv|M;dxLT`*pF5ij>qLt0dgM#bmKOygbX3dtC7 zaTi9-=~mFwWj;mnEMD$}K?MV6w7P}v0PtGHREn>~x8h8^LRt1v>k0ZO)>8~eO(o86 zEG-IdBVErroj+goDA@rNcxz$418=Ez zil!Qo3K`thDC~ISsj3Un=u~wnlfQdmoRv0VoV17@E+sXxL(g&VrJjSXCoTVG)@aWG zp3r?wRf(px1n!#B7p0F^;^->$=Uj73y|EDsM!^kF^8$;*+983LYb*!Nva|}T5vooS zC(q1|LLj)uYNh}{v>mx+K8B;Z z(rZ>am6aIIwsy8mh(E))Ho6L6dGzt-#@5MjoDu-goIrgP5{hA@sGgT}&QWfL^)5&m z?pvN2%Lo_@n7~aM0#~7%89hUeD2HSKDj2_rq8rAv^oFcNVOIiMBUa`GY4L}uRssp= zSxr?kcvML$^rzmhM1|ueGh~q`JRS2zVH_vxCo70#p1hY%*7!UkOgcJMDUl}1gC#G( zu_2OiU_wPQ7#%fgWI46MXXy)09Jdt_xlYy?`hAG8gFe+u;PWJr3$W31pis$N`uNN7 z^Dr)WLE0&qk{Kq+lp^-TjPSYezHmQGCJ?)e;?@hJFN~c}VtAM|s{o)$JkQY{k9PDR zKY#kocc|ys&ay4@NwPBkY-t`$r3tUs++IlTXO$1IeZI6cl1}3PZvbUxls54y!*-|+z(w&!LoNHNbOLl`_;N$5@j-4UkKqW6BO~F z@io~{<*I}@eO(rCk=_Q?q;G}*t_4V>o&f{Psc@R+ge#|8dNNPoRfg77Ojr7K1ZHrD zF!1*lAqdVroIK2+bxn9qr6PF7SWMX}?33mp0F(;)QfSpxC`ic&KP za(LpYopa14JPS?`6rkntxWW9!J(y;9INgxej|GTfZPqTji9&d1Kz@*f^|yE4 zEn%zO->}$UdaVwfZrI0cwLT5=hugNA9o+4h7#SWhfJF?4nNbRbMGm+!4t{FnpOE~= v_$$zl*Bp3+_m@MzYlrRN*bpDK;;Lnb&HDlnnWt_ISek9k7)ZBuIlcG~1*cmy literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/reference/squigglepy.bayes.doctree b/docs/build/doctrees/reference/squigglepy.bayes.doctree new file mode 100644 index 0000000000000000000000000000000000000000..db441fa9085704978ba0458b5e11f3f5383cf9b2 GIT binary patch literal 53325 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 literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/reference/squigglepy.distributions.doctree b/docs/build/doctrees/reference/squigglepy.distributions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9ee6d5dcc8de4df7c572adbfc79bd7f7491f82be GIT binary patch literal 332703 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 literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/reference/squigglepy.numbers.doctree b/docs/build/doctrees/reference/squigglepy.numbers.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d5f47fd239e436900aff8f80c5bcfa7a9e2678c7 GIT binary patch literal 2850 zcma)8NpBlB6n1P&w!Fx8mTrmL1VtJLjinxXDAF7PW=St_y#;~31 z%oj|#_#r<2Gro-{VPNPRtG&rs3~SKHxRAMFD!z#t!#zQ?JF2#o_;L7o%yq%WMJ}>)rtG*hdTwZ8$IFz*h!N`w+cC^B zM4z!0g%*>MvB>Jnvvoh^YoRAp&K4^$)(G>jkOhAL)V{|5A^wl>f1EM`C`MFyoP^Di z3KPQ@HOxQWUxw3q1J?EC=|}c>f8rwb{9AsyOm@P*1f;Bs;DkS0y|2^eYEPT1Wo?A3 zO0D&*5(Ph8hLbpkWv-AQ=GujHRUF`!Ey= z7!lNg&Y=~>|aH?|2K)JU&b=~Y%@IKH-X%>-9r zSQ}ji&>p>ab>rH}aF`MR(JTi(5(&kyFR7Y)I%j}8$9f$-Gu$#P(1sNyY4R_e)V} zna?#@6p2rVY*A{<$m+?8BAFwvg%veF4@fR7oywF*6XjN07pSp4Bx6wtRguByexpWa zLRL*De3HK4#4=MAB2&p)j{DxlaKSy*OYrk36&Glu=3t=|g>dnw!$)CQvXXQiG9|N@ zBvXpmQ)PtDxO1g_Ivzu8N9Bd%T8*@sk7Kx#G^+rhNgOM1Jr38g4f*NA@4g3~Lo>^+ znNO0X`EOeDs8pKxdd|#9FgL4wp!&z$6%x({j!scRx#RI{I~;?M1?g(DOMuuiG2}8F z+6(3Af^aeC5`U0)Q|iR~JzG#z*(;BtwgBo@wXT;$>Wntf9%q~)9$b7~Y(Tk!5U0<5 z2^VQZS97;%0+(Qq&V-tQ18rBhnfiqF(`$O7NaU58)}@$c=XnHYFsF0W?*&5Oj5#>D zlR@j8u!0In@R~5_vQ^ke&3gc3m9x61U4{*&UZ)uxw(DMk;sq5k)dY&e5l79Op*LZ2 z9U&-C%i)cI{+*|Z`xf2qinN}}5X0K6Tl7;2VW304m4x*-f5D&IFh~M-Q6j>(k-xaK z{6QL>&oR57;mOgj1L!(;`-E8zoM-f3Gp8pkrdxcUrpMnH|G)o_@xL6e<7PsFxleIB zsgbGqeLefwbjJ9*(T-j}^tIKDDqIb~7y{xPTlm<+ffl@(;ML yckve#EM9sjeZ0*qC|W!0dfgTAZYQo-wkuR7eV$l7PXyb^Q#)=tS9)Oh>F6IiRBo&Q literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/reference/squigglepy.rng.doctree b/docs/build/doctrees/reference/squigglepy.rng.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ac0ea5fb36fc78b8f8c4e66b78a054800b4f2998 GIT binary patch literal 7310 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 literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/reference/squigglepy.squigglepy.doctree b/docs/build/doctrees/reference/squigglepy.squigglepy.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c704ca0881c3d61b25c5025f45cf71c5d9195c39 GIT binary patch literal 5627 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 L#-)!K>FD@>YDLSF literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/reference/squigglepy.utils.doctree b/docs/build/doctrees/reference/squigglepy.utils.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8ea7c64cfb19aa1288d77f6517b794b49dda66bc GIT binary patch literal 210728 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 h+TJq*+qXp$xhVJO809`IjZtncW=St_y#;}#^ z%oj|#_#r;|Gro<-VPNPRtG&rs3~SKHxRAMFD!z(gnADw+cGR5Tv@CN%tL`}O@jl;t z6_5EK^qg>#t!#zQ?Q1XQbIHn!(K#~~Cm$3#_s~j*aAxCIwn)MJm+HG%N7^qb;&PE6 zh5_jk;p?H_#6JleQYaQDeoDhObCxh`^>a@x!!wH88r_Y^JaudUpd%f*yt zXNJv^jt`rT&eK-p`}`i?<@fnIKMFsOxh~ka$VGO>lpU8w&kZf?c$xATF=Aa|JBB%i z=rgvW&|)$&7Fm6Hdecw&TIdOtv&9OGHNyNWWWgT-wXgAig#TmwpQMZciV;;F$6=$S z!o=`J4fBr=mf^JCfOWlj@{v8>pSVap|CXODlb!G{0V(SuIOfk+@9U(w+LPvLSsUT1 zQtQ3Ff7*thd~L(mdJQapS_45lZ>_cVKzH5zX}IGIRaVl(Nm5+_v-NfNoOV>k)3vbO z>aZM3pZwhj!_1pRCel%7x0Tcs3R{*rC)6BObJ&%^%xLA9%46vNMx_VlT^;qcccpi6 z!uKa(FlUMx>a>Yi59&8h5`y>Q4D0;oCayls_wp_j9%pTpho4K)g=LBlXwKr#UQ8B0mU_hBd$ zFe0b}okJ^zfp@c$A5N^m_x-Dzgc+j^;Z)_4fztgHYUX0tuaRD{(yOe*aCB|wnhCDL zur|63pgns3>c+K`;UFadqFD}nBoc~YPf|7abj|>Gj`dCS%y8SVOq-nKtOQNqCe`I6 z^fRqy$PsXe97JU^v534MhSWPvmZES|fLnXHFG|w!52#iG0qPk=Wiq&5Nh)TiyI+b* z%Y3fMqDXu?V2e^)MpjQ&6v-Sp7gp5#+$XuPbShIKO_ZB$U7*Hxk&HzpR7D1(dyN{I z30XCr@JafD6U$6hh)gAGIqrK0!v*(LFTu~lR9v8qnuCQ>6vD-y4jzYL$x707$dt@( zl1wRLPn8iqlrg6!Q8C!f$AS~S4cP;I66fM<&MYGt#AZF7No1qE&*c8#E{Ey zU@w%T3&O>mOZ-9J4XG3FcWpsYWv@Mo+5)KC)w*61sWaL@dz5jCcyRG`u>s`@LYzMH zC0wKtUCrI530#6bIumLJ4zyk2R_YVhPp|2TB9T{WT9;y)oo5l8DW)t({azph&X|Lf zyBW032rHO9ThuvPaG6fdZVsU}byjyP)O47~}H z>kvVKS`Kdv^zS@P+_&gAR%_OY9`Ah!7hCvdzixLsOjr`@M zm_2X%DVg9JF4mL$|Kj$2c%9&7Zs1Z8bZX!f0}t_Nj%%u#;&i!3E@iDYyBuk$=E_ zy^Ft~VDZvJ>Emr?LDAY_*Xyo`cRF#!vK^r^>GQ + + + + + + + + Overview: module code — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + + + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/_modules/squigglepy/bayes.html b/docs/build/html/_modules/squigglepy/bayes.html new file mode 100644 index 0000000..c759bab --- /dev/null +++ b/docs/build/html/_modules/squigglepy/bayes.html @@ -0,0 +1,804 @@ + + + + + + + + + + squigglepy.bayes — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +

Source code for squigglepy.bayes

+"""
+This modules includes functions for Bayesian inference.
+"""
+
+import os
+import time
+import math
+import msgspec
+
+import numpy as np
+import pathos.multiprocessing as mp
+
+from datetime import datetime
+
+from .distributions import BetaDistribution, NormalDistribution, norm, beta, mixture
+from .utils import _core_cuts, _init_tqdm, _tick_tqdm, _flush_tqdm
+
+
+_squigglepy_internal_bayesnet_caches = {}
+
+
+
+[docs] +def simple_bayes(likelihood_h, likelihood_not_h, prior): + """ + Calculate Bayes rule. + + p(h|e) = (p(e|h)*p(h)) / (p(e|h)*p(h) + p(e|~h)*(1-p(h))) + p(h|e) is called posterior + p(e|h) is called likelihood + p(h) is called prior + + Parameters + ---------- + likelihood_h : float + The likelihood (given that the hypothesis is true), aka p(e|h) + likelihood_not_h : float + The likelihood given the hypothesis is not true, aka p(e|~h) + prior : float + The prior probability, aka p(h) + + Returns + ------- + float + The result of Bayes rule, aka p(h|e) + + Examples + -------- + # Cancer example: prior of having cancer is 1%, the likelihood of a positive + # mammography given cancer is 80% (true positive rate), and the likelihood of + # a positive mammography given no cancer is 9.6% (false positive rate). + # Given this, what is the probability of cancer given a positive mammography? + >>> simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) + 0.07763975155279504 + """ + return (likelihood_h * prior) / (likelihood_h * prior + likelihood_not_h * (1 - prior))
+ + + +
+[docs] +def bayesnet( + event_fn=None, + n=1, + find=None, + conditional_on=None, + reduce_fn=None, + raw=False, + memcache=True, + memcache_load=True, + memcache_save=True, + reload_cache=False, + dump_cache_file=None, + load_cache_file=None, + cache_file_primary=False, + verbose=False, + cores=1, +): + """ + Calculate a Bayesian network. + + Allows you to find conditional probabilities of custom events based on + rejection sampling. + + Parameters + ---------- + event_fn : function + A function that defines the bayesian network + n : int + The number of samples to generate + find : a function or None + What do we want to know the probability of? + conditional_on : a function or None + When finding the probability, what do we want to condition on? + reduce_fn : a function or None + When taking all the results of the simulations, how do we aggregate them + into a final answer? Defaults to ``np.mean``. + raw : bool + If True, just return the results of each simulation without aggregating. + memcache : bool + If True, cache the results in-memory for future calculations. Each cache + will be matched based on the ``event_fn``. Default ``True``. + memcache_load : bool + If True, load cache from the in-memory. This will be true if ``memcache`` + is True. Cache will be matched based on the ``event_fn``. Default ``True``. + memcache_save : bool + If True, save results to an in-memory cache. This will be true if ``memcache`` + is True. Cache will be matched based on the ``event_fn``. Default ``True``. + reload_cache : bool + If True, any existing cache will be ignored and recalculated. Default ``False``. + dump_cache_file : str or None + If present, will write out the cache to a binary file with this path with + ``.sqlcache`` appended to the file name. + load_cache_file : str or None + If present, will first attempt to load and use a cache from a file with this + path with ``.sqlcache`` appended to the file name. + cache_file_primary : bool + If both an in-memory cache and file cache are present, the file + cache will be used for the cache if this is True, and the in-memory cache + will be used otherwise. Defaults to False. + verbose : bool + If True, will print out statements on computational progress. + cores : int + If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing + pool with that many cores / processes. + + Returns + ------- + various + The result of ``reduce_fn`` on ``n`` simulations of ``event_fn``. + + Examples + -------- + # Cancer example: prior of having cancer is 1%, the likelihood of a positive + # mammography given cancer is 80% (true positive rate), and the likelihood of + # a positive mammography given no cancer is 9.6% (false positive rate). + # Given this, what is the probability of cancer given a positive mammography? + >> def mammography(has_cancer): + >> p = 0.8 if has_cancer else 0.096 + >> return bool(sq.sample(sq.bernoulli(p))) + >> + >> def define_event(): + >> cancer = sq.sample(sq.bernoulli(0.01)) + >> return({'mammography': mammography(cancer), + >> 'cancer': cancer}) + >> + >> bayes.bayesnet(define_event, + >> find=lambda e: e['cancer'], + >> conditional_on=lambda e: e['mammography'], + >> n=1*M) + 0.07723995880535531 + """ + events = None + if memcache is True: + memcache_load = True + memcache_save = True + elif memcache is False: + memcache_load = False + memcache_save = False + has_in_mem_cache = event_fn in _squigglepy_internal_bayesnet_caches + cache_path = load_cache_file + ".sqcache" if load_cache_file else None + has_file_cache = os.path.exists(cache_path) if load_cache_file else False + + if load_cache_file or dump_cache_file or cores > 1: + encoder = msgspec.msgpack.Encoder() + decoder = msgspec.msgpack.Decoder() + + if load_cache_file and not has_file_cache and verbose: + print("Warning: cache file `{}.sqcache` not found.".format(load_cache_file)) + + if not reload_cache: + if load_cache_file and has_file_cache and (not has_in_mem_cache or cache_file_primary): + if verbose: + print("Loading from cache file (`{}`)...".format(cache_path)) + with open(cache_path, "rb") as f: + events = decoder.decode(f.read()) + + elif memcache_load and has_in_mem_cache: + if verbose: + print("Loading from in-memory cache...") + events = _squigglepy_internal_bayesnet_caches.get(event_fn) + + if events: + if events["metadata"]["n"] < n: + raise ValueError( + ("insufficient samples - {} results cached but " + "requested {}").format( + events["metadata"]["n"], n + ) + ) + + events = events["events"] + if verbose: + print("...Loaded") + + elif verbose: + print("Reloading cache...") + + if events is None: + if event_fn is None: + return None + + def run_event_fn(pbar=None, total_cores=1): + _tick_tqdm(pbar, total_cores) + return event_fn() + + if cores == 1: + if verbose: + print("Generating Bayes net...") + r_ = range(n) + pbar = _init_tqdm(verbose=verbose, total=n) + events = [run_event_fn(pbar=pbar, total_cores=1) for _ in r_] + _flush_tqdm(pbar) + else: + if verbose: + print("Generating Bayes net with {} cores...".format(cores)) + with mp.ProcessingPool(cores) as pool: + cuts = _core_cuts(n, cores) + + def multicore_event_fn(core, total_cores=1, verbose=False): + r_ = range(cuts[core]) + pbar = _init_tqdm(verbose=verbose, total=n) + batch = [run_event_fn(pbar=pbar, total_cores=total_cores) for _ in r_] + _flush_tqdm(pbar) + + if verbose: + print("Shuffling data...") + + while not os.path.exists("test-core-{}.sqcache".format(core)): + with open("test-core-{}.sqcache".format(core), "wb") as outfile: + encoder = msgspec.msgpack.Encoder() + outfile.write(encoder.encode(batch)) + if verbose: + print("Writing data...") + time.sleep(1) + + pool_results = pool.amap(multicore_event_fn, list(range(cores - 1))) + multicore_event_fn(cores - 1, total_cores=cores, verbose=verbose) + if verbose: + print("Waiting for other cores...") + while not pool_results.ready(): + if verbose: + print(".", end="", flush=True) + time.sleep(1) + + if cores > 1: + if verbose: + print("Collecting data...") + events = [] + pbar = _init_tqdm(verbose=verbose, total=cores) + for c in range(cores): + _tick_tqdm(pbar, 1) + with open("test-core-{}.sqcache".format(c), "rb") as infile: + events += decoder.decode(infile.read()) + os.remove("test-core-{}.sqcache".format(c)) + _flush_tqdm(pbar) + if verbose: + print("...Collected!") + + metadata = {"n": n, "last_generated": datetime.now()} + cache_data = {"events": events, "metadata": metadata} + if memcache_save and (not has_in_mem_cache or reload_cache): + if verbose: + print("Caching in-memory...") + _squigglepy_internal_bayesnet_caches[event_fn] = cache_data + if verbose: + print("...Cached!") + + if dump_cache_file: + cache_path = dump_cache_file + ".sqcache" + if verbose: + print("Writing cache to file `{}`...".format(cache_path)) + with open(cache_path, "wb") as f: + f.write(encoder.encode(cache_data)) + if verbose: + print("...Cached!") + + if conditional_on is not None: + if verbose: + print("Filtering conditional...") + events = [e for e in events if conditional_on(e)] + + if len(events) < 1: + raise ValueError("insufficient samples for condition") + + if conditional_on and verbose: + print("...Filtered!") + + if find is None: + if verbose: + print("...Reducing") + events = events if reduce_fn is None else reduce_fn(events) + if verbose: + print("...Reduced!") + else: + if verbose: + print("...Finding") + events = [find(e) for e in events] + if verbose: + print("...Found!") + if not raw: + if verbose: + print("...Reducing") + reduce_fn = np.mean if reduce_fn is None else reduce_fn + events = reduce_fn(events) + if verbose: + print("...Reduced!") + if verbose: + print("...All done!") + return events
+ + + +
+[docs] +def update(prior, evidence, evidence_weight=1): + """ + Update a distribution. + + Starting with a prior distribution, use Bayesian inference to perform an update, + producing a posterior distribution from the evidence distribution. + + Parameters + ---------- + prior : Distribution + The prior distribution. Currently must either be normal or beta type. Other + types are not yet supported. + evidence : Distribution + The distribution used to update the prior. Currently must either be normal + or beta type. Other types are not yet supported. + evidence_weight : float + How much weight to put on the evidence distribution? Currently this only matters + for normal distributions, where this should be equivalent to the sample weight. + + Returns + ------- + Distribution + The posterior distribution + + Examples + -------- + >> prior = sq.norm(1,5) + >> evidence = sq.norm(2,3) + >> bayes.update(prior, evidence) + <Distribution> norm(mean=2.53, sd=0.29) + """ + if isinstance(prior, NormalDistribution) and isinstance(evidence, NormalDistribution): + prior_mean = prior.mean + prior_var = prior.sd**2 + evidence_mean = evidence.mean + evidence_var = evidence.sd**2 + return norm( + mean=( + (evidence_var * prior_mean + evidence_weight * (prior_var * evidence_mean)) + / (evidence_weight * prior_var + evidence_var) + ), + sd=math.sqrt( + (evidence_var * prior_var) / (evidence_weight * prior_var + evidence_var) + ), + ) + elif isinstance(prior, BetaDistribution) and isinstance(evidence, BetaDistribution): + prior_a = prior.a + prior_b = prior.b + evidence_a = evidence.a + evidence_b = evidence.b + return beta(prior_a + evidence_a, prior_b + evidence_b) + elif type(prior) != type(evidence): + print(type(prior), type(evidence)) + raise ValueError("can only update distributions of the same type.") + else: + raise ValueError("type `{}` not supported.".format(prior.__class__.__name__))
+ + + +
+[docs] +def average(prior, evidence, weights=[0.5, 0.5], relative_weights=None): + """ + Average two distributions. + + Parameters + ---------- + prior : Distribution + The prior distribution. + evidence : Distribution + The distribution used to average with the prior. + weights : list or np.array or float + How much weight to put on ``prior`` versus ``evidence`` when averaging? If + only one weight is passed, the other weight will be inferred to make the + total weights sum to 1. Defaults to 50-50 weights. + relative_weights : list or None + Relative weights, which if given will be weights that are normalized + to sum to 1. + + Returns + ------- + Distribution + A mixture distribution that accords weights to ``prior`` and ``evidence``. + + Examples + -------- + >> prior = sq.norm(1,5) + >> evidence = sq.norm(2,3) + >> bayes.average(prior, evidence) + <Distribution> mixture + """ + return mixture(dists=[prior, evidence], weights=weights, relative_weights=relative_weights)
+ +
+ +
+ + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/_modules/squigglepy/correlation.html b/docs/build/html/_modules/squigglepy/correlation.html new file mode 100644 index 0000000..e6a1834 --- /dev/null +++ b/docs/build/html/_modules/squigglepy/correlation.html @@ -0,0 +1,717 @@ + + + + + + + + + + squigglepy.correlation — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +

Source code for squigglepy.correlation

+"""
+This module implements the Iman-Conover method for inducing correlations between distributions.
+
+Some of the code has been adapted from Abraham Lee's mcerp package (https://github.com/tisimst/mcerp/).
+"""
+
+# Parts of `induce_correlation` are licensed as follows:
+
+# BSD 3-Clause License
+
+# Copyright (c) 2018, Abraham Lee
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+
+# * Redistributions of source code must retain the above copyright notice, this
+#   list of conditions and the following disclaimer.
+
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+
+# * Neither the name of the copyright holder nor the names of its
+#   contributors may be used to endorse or promote products derived from
+#   this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from __future__ import annotations
+
+from dataclasses import dataclass
+import numpy as np
+from scipy.linalg import cholesky
+from scipy.stats import rankdata, spearmanr
+from scipy.stats.distributions import norm as _scipy_norm
+from numpy.typing import NDArray
+from copy import deepcopy
+
+from typing import TYPE_CHECKING, Union
+
+if TYPE_CHECKING:
+    from .distributions import OperableDistribution
+
+
+
+[docs] +def correlate( + variables: tuple[OperableDistribution, ...], + correlation: Union[NDArray[np.float64], list[list[float]], np.float64, float], + tolerance: Union[float, np.float64, None] = 0.05, + _min_unique_samples: int = 100, +): + """ + Correlate a set of variables according to a rank correlation matrix. + + This employs the Iman-Conover method to induce the correlation while + preserving the original marginal distributions. + + This method works on a best-effort basis, and may fail to induce the desired + correlation depending on the distributions provided. An exception will be raised + if that's the case. + + Parameters + ---------- + variables : tuple of distributions + The variables to correlate as a tuple of distributions. + + The distributions must be able to produce enough unique samples for the method + to be able to induce the desired correlation by shuffling the samples. + + Discrete distributions are notably hard to correlate this way, + as it's common for them to result in very few unique samples. + + correlation : 2d-array or float + An n-by-n array that defines the desired Spearman rank correlation coefficients. + This matrix must be symmetric and positive semi-definite; and must not be confused with + a covariance matrix. + + Correlation parameters can only be between -1 and 1, exclusive + (including extremely close approximations). + + If a float is provided, all variables will be correlated with the same coefficient. + + tolerance : float, optional + If provided, overrides the absolute tolerance used to check if the resulting + correlation matrix matches the desired correlation matrix. Defaults to 0.05. + + Checking can also be disabled by passing None. + + Returns + ------- + correlated_variables : tuple of distributions + The correlated variables as a tuple of distributions in the same order as + the input variables. + + Examples + -------- + Suppose we want to correlate two variables with a correlation coefficient of 0.65: + >>> solar_radiation, temperature = sq.gamma(300, 100), sq.to(22, 28) + >>> solar_radiation, temperature = sq.correlate((solar_radiation, temperature), 0.7) + >>> print(np.corrcoef(solar_radiation @ 1000, temperature @ 1000)[0, 1]) + 0.6975960649767123 + + Or you could pass a correlation matrix: + >>> funding_gap, cost_per_delivery, effect_size = ( + sq.to(20_000, 80_000), sq.to(30, 80), sq.beta(2, 5) + ) + >>> funding_gap, cost_per_delivery, effect_size = sq.correlate( + (funding_gap, cost_per_delivery, effect_size), + [[1, 0.6, -0.5], [0.6, 1, -0.2], [-0.5, -0.2, 1]] + ) + >>> print(np.corrcoef(funding_gap @ 1000, cost_per_delivery @ 1000, effect_size @ 1000)) + array([[ 1. , 0.580520 , -0.480149], + [ 0.580962, 1. , -0.187831], + [-0.480149, -0.187831 , 1. ]]) + + """ + if not isinstance(variables, tuple): + variables = tuple(variables) + + if len(variables) < 2: + raise ValueError("You must provide at least two variables to correlate.") + + assert all(v.correlation_group is None for v in variables) + + # Convert a float to a correlation matrix + if ( + isinstance(correlation, float) + or isinstance(correlation, np.floating) + or isinstance(correlation, int) + ): + correlation_parameter = np.float64(correlation) + + assert ( + -1 < correlation_parameter < 1 + ), "Correlation parameter must be between -1 and 1, exclusive." + # Generate a correlation matrix with + # pairwise correlations equal to the correlation parameter + correlation_matrix: NDArray[np.float64] = np.full( + (len(variables), len(variables)), correlation_parameter + ) + # Set the diagonal to 1 + np.fill_diagonal(correlation_matrix, 1) + else: + # Coerce the correlation matrix into a numpy array + correlation_matrix: NDArray[np.float64] = np.array(correlation, dtype=np.float64) + + tolerance = float(tolerance) if tolerance is not None else None + + # Deepcopy the variables to avoid modifying the originals + variables = deepcopy(variables) + + # Create the correlation group + CorrelationGroup(variables, correlation_matrix, tolerance, _min_unique_samples) + + return variables
+ + + +
+[docs] +@dataclass +class CorrelationGroup: + """ + An object that holds metadata for a group of correlated distributions. + This object is not intended to be used directly by the user, but + rather during sampling to induce correlations between distributions. + """ + + correlated_dists: tuple[OperableDistribution] + correlation_matrix: NDArray[np.float64] + correlation_tolerance: Union[float, None] = 0.05 + min_unique_samples: int = 100 + + def __post_init__(self): + # Check that the correlation matrix is square of the expected size + assert ( + self.correlation_matrix.shape[0] + == self.correlation_matrix.shape[1] + == len(self.correlated_dists) + ), "Correlation matrix must be square, and of the length of the number of dists. provided." + + # Check that the diagonal of the correlation matrix is all ones + assert np.all(np.diag(self.correlation_matrix) == 1), "Diagonal must be all ones." + + # Check that values are between -1 and 1 + assert ( + -1 <= np.min(self.correlation_matrix) and np.max(self.correlation_matrix) <= 1 + ), "Correlation matrix values must be between -1 and 1." + + # Check that the correlation matrix is positive semi-definite + assert np.all( + np.linalg.eigvals(self.correlation_matrix) >= 0 + ), "Matrix must be positive semi-definite." + + # Check that the correlation matrix is symmetric + assert np.all( + self.correlation_matrix == self.correlation_matrix.T + ), "Matrix must be symmetric." + + # Link the correlation group to each distribution + for dist in self.correlated_dists: + dist.correlation_group = self + +
+[docs] + def induce_correlation(self, data: NDArray[np.float64]) -> NDArray[np.float64]: + """ + Induce a set of correlations on a column-wise dataset + + Parameters + ---------- + data : 2d-array + An m-by-n array where m is the number of samples and n is the + number of independent variables, each column of the array corresponding + to each variable + corrmat : 2d-array + An n-by-n array that defines the desired correlation coefficients + (between -1 and 1). Note: the matrix must be symmetric and + positive-definite in order to induce. + + Returns + ------- + new_data : 2d-array + An m-by-n array that has the desired correlations. + + """ + # Check that each column doesn't have too little unique values + for column in data.T: + if not self.has_sufficient_sample_diversity(column): + raise ValueError( + "The data has too many repeated values to induce a correlation. " + "This might be because of too few samples, or too many repeated samples." + ) + + # If the correlation matrix is the identity matrix, just return the data + if np.all(self.correlation_matrix == np.eye(self.correlation_matrix.shape[0])): + return data + + # Create a rank-matrix + data_rank = np.vstack([rankdata(datai, method="min") for datai in data.T]).T + + # Generate van der Waerden scores + data_rank_score = data_rank / (data_rank.shape[0] + 1.0) + data_rank_score = _scipy_norm(0, 1).ppf(data_rank_score) + + # Calculate the lower triangular matrix of the Cholesky decomposition + # of the desired correlation matrix + p = cholesky(self.correlation_matrix, lower=True) + + # Calculate the current correlations + t = np.corrcoef(data_rank_score, rowvar=False) + + # Calculate the lower triangular matrix of the Cholesky decomposition + # of the current correlation matrix + q = cholesky(t, lower=True) + + # Calculate the re-correlation matrix + s = np.dot(p, np.linalg.inv(q)) + + # Calculate the re-sampled matrix + new_data = np.dot(data_rank_score, s.T) + + # Create the new rank matrix + new_data_rank = np.vstack([rankdata(datai, method="min") for datai in new_data.T]).T + + # Sort the original data according to the new rank matrix + self._sort_data_according_to_rank(data, data_rank, new_data_rank) + + # # Check correlation + if self.correlation_tolerance: + self._check_empirical_correlation(data) + + return data
+ + + def _sort_data_according_to_rank( + self, + data: NDArray[np.float64], + data_rank: NDArray[np.float64], + new_data_rank: NDArray[np.float64], + ): + """Sorts the original data according to new_data_rank, in place.""" + assert ( + data.shape == data_rank.shape == new_data_rank.shape + ), "All input arrays must have the same shape" + for i in range(data.shape[1]): + _, order = np.unique( + np.hstack((data_rank[:, i], new_data_rank[:, i])), return_inverse=True + ) + old_order = order[: new_data_rank.shape[0]] + new_order = order[-new_data_rank.shape[0] :] + tmp = data[np.argsort(old_order), i][new_order] + data[:, i] = tmp[:] + + def _check_empirical_correlation(self, samples: NDArray[np.float64]): + """ + Ensures that the empirical correlation matrix is + the same as the desired correlation matrix. + """ + assert self.correlation_tolerance is not None + + # Compute the empirical correlation matrix + empirical_correlation = spearmanr(samples).statistic + if len(self.correlated_dists) == 2: + # empirical_correlation is a scalar + properly_correlated = np.isclose( + empirical_correlation, + self.correlation_matrix[0, 1], + atol=self.correlation_tolerance, + rtol=0, + ) + else: + # empirical_correlation is a matrix + properly_correlated = np.allclose( + empirical_correlation, + self.correlation_matrix, + atol=self.correlation_tolerance, + rtol=0, + ) + if not properly_correlated: + raise RuntimeError( + "Failed to induce the desired correlation between samples. " + "This might be because of too little diversity in the samples. " + "You can relax the tolerance by passing `tolerance` to correlate()." + ) + +
+[docs] + def has_sufficient_sample_diversity( + self, + samples: NDArray[np.float64], + relative_threshold: float = 0.7, + absolute_threshold=None, + ) -> bool: + """ + Check if there is there are sufficient unique samples to work with in the data. + """ + + if absolute_threshold is None: + absolute_threshold = self.min_unique_samples + + unique_samples = len(np.unique(samples, axis=0)) + n_samples = len(samples) + + diversity = unique_samples / n_samples + + return (diversity >= relative_threshold) and (unique_samples >= absolute_threshold)
+
+ +
+ +
+ + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/_modules/squigglepy/distributions.html b/docs/build/html/_modules/squigglepy/distributions.html new file mode 100644 index 0000000..2ac9dc3 --- /dev/null +++ b/docs/build/html/_modules/squigglepy/distributions.html @@ -0,0 +1,2239 @@ + + + + + + + + + + squigglepy.distributions — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +

Source code for squigglepy.distributions

+"""
+A collection of probability distributions and functions to operate on them.
+"""
+
+import operator
+import math
+import numpy as np
+import scipy.stats
+
+from typing import Optional, Union
+
+from .utils import _process_weights_values, _is_numpy, is_dist, _round
+from .version import __version__
+from .correlation import CorrelationGroup
+
+from collections.abc import Iterable
+
+from abc import ABC, abstractmethod
+
+
+
+[docs] +class BaseDistribution(ABC): + def __init__(self): + self.x = None + self.y = None + self.n = None + self.p = None + self.t = None + self.a = None + self.b = None + self.shape = None + self.scale = None + self.credibility = None + self.mean = None + self.sd = None + self.left = None + self.mode = None + self.right = None + self.fn = None + self.fn_str = None + self.lclip = None + self.rclip = None + self.lam = None + self.df = None + self.items = None + self.dists = None + self.weights = None + self._version = __version__ + + # Correlation metadata + self.correlation_group: Optional[CorrelationGroup] = None + self._correlated_samples: Optional[np.ndarray] = None + + @abstractmethod + def __str__(self) -> str: + ... + + def __repr__(self): + if self.correlation_group: + return ( + self.__str__() + f" (version {self._version}, corr_group {self.correlation_group})" + ) + return self.__str__() + f" (version {self._version})"
+ + + +
+[docs] +class OperableDistribution(BaseDistribution): + def __init__(self): + super().__init__() + +
+[docs] + def plot(self, num_samples=None, bins=None): + """ + Plot a histogram of the samples. + + Parameters + ---------- + num_samples : int + The number of samples to draw for plotting. Defaults to 1000 if not set. + bins : int + The number of bins to plot. Defaults to 200 if not set. + + Examples + -------- + >>> sq.norm(5, 10).plot() + """ + from matplotlib import pyplot as plt + + num_samples = 1000 if num_samples is None else num_samples + bins = 200 if bins is None else bins + + samples = self @ num_samples + + plt.hist(samples, bins=bins) + plt.show()
+ + + def __invert__(self): + from .samplers import sample + + return sample(self) + + def __matmul__(self, n): + try: + n = int(n) + except ValueError: + raise ValueError("number of samples must be an integer") + from .samplers import sample + + return sample(self, n=n) + + def __rshift__(self, fn): + if callable(fn): + return fn(self) + elif isinstance(fn, ComplexDistribution): + return ComplexDistribution(self, fn.left, fn.fn, fn.fn_str, infix=False) + else: + raise ValueError + + def __rmatmul__(self, n): + return self.__matmul__(n) + + def __gt__(self, dist): + return ComplexDistribution(self, dist, operator.gt, ">") + + def __ge__(self, dist): + return ComplexDistribution(self, dist, operator.ge, ">=") + + def __lt__(self, dist): + return ComplexDistribution(self, dist, operator.lt, "<") + + def __le__(self, dist): + return ComplexDistribution(self, dist, operator.le, "<=") + + def __eq__(self, dist): + return ComplexDistribution(self, dist, operator.le, "==") + + def __ne__(self, dist): + return ComplexDistribution(self, dist, operator.le, "!=") + + def __neg__(self): + return ComplexDistribution(self, None, operator.neg, "-") + + def __add__(self, dist): + return ComplexDistribution(self, dist, operator.add, "+") + + def __radd__(self, dist): + return ComplexDistribution(dist, self, operator.add, "+") + + def __sub__(self, dist): + return ComplexDistribution(self, dist, operator.sub, "-") + + def __rsub__(self, dist): + return ComplexDistribution(dist, self, operator.sub, "-") + + def __mul__(self, dist): + return ComplexDistribution(self, dist, operator.mul, "*") + + def __rmul__(self, dist): + return ComplexDistribution(dist, self, operator.mul, "*") + + def __truediv__(self, dist): + return ComplexDistribution(self, dist, operator.truediv, "/") + + def __rtruediv__(self, dist): + return ComplexDistribution(dist, self, operator.truediv, "/") + + def __floordiv__(self, dist): + return ComplexDistribution(self, dist, operator.floordiv, "//") + + def __rfloordiv__(self, dist): + return ComplexDistribution(dist, self, operator.floordiv, "//") + + def __pow__(self, dist): + return ComplexDistribution(self, dist, operator.pow, "**") + + def __rpow__(self, dist): + return ComplexDistribution(dist, self, operator.pow, "**") + + def __hash__(self): + return hash(repr(self))
+ + + +# Distribution are either discrete, continuous, or composite + + +
+[docs] +class DiscreteDistribution(OperableDistribution, ABC): + ...
+ + + +
+[docs] +class ContinuousDistribution(OperableDistribution, ABC): + ...
+ + + +
+[docs] +class CompositeDistribution(OperableDistribution): + def __init__(self): + super().__init__() + # Whether this distribution contains any correlated variables + self.contains_correlated: Optional[bool] = None + + def __post_init__(self): + assert self.contains_correlated is not None, "contains_correlated must be set" + + def _check_correlated(self, dists: Iterable) -> None: + for dist in dists: + if isinstance(dist, BaseDistribution) and dist.correlation_group is not None: + self.contains_correlated = True + break + if isinstance(dist, CompositeDistribution): + if dist.contains_correlated: + self.contains_correlated = True + break
+ + + +
+[docs] +class ComplexDistribution(CompositeDistribution): + def __init__(self, left, right=None, fn=operator.add, fn_str="+", infix=True): + super().__init__() + self.left = left + self.right = right + self.fn = fn + self.fn_str = fn_str + self.infix = infix + self._check_correlated((left, right)) + + def __str__(self): + if self.right is None and self.infix: + if self.fn_str == "-": + out = "<Distribution> {}{}" + else: + out = "<Distribution> {} {}" + out = out.format(self.fn_str, str(self.left).replace("<Distribution> ", "")) + elif self.right is None and not self.infix: + out = "<Distribution> {}({})".format( + self.fn_str, str(self.left).replace("<Distribution> ", "") + ) + elif self.right is not None and self.infix: + out = "<Distribution> {} {} {}".format( + str(self.left).replace("<Distribution> ", ""), + self.fn_str, + str(self.right).replace("<Distribution> ", ""), + ) + elif self.right is not None and not self.infix: + out = "<Distribution> {}({}, {})" + out = out.format( + self.fn_str, + str(self.left).replace("<Distribution> ", ""), + str(self.right).replace("<Distribution> ", ""), + ) + else: + raise ValueError + return out
+ + + +def _get_fname(f, name): + if name is None: + if isinstance(f, np.vectorize): + name = f.pyfunc.__name__ + else: + name = f.__name__ + return name + + +
+[docs] +def dist_fn(dist1, dist2=None, fn=None, name=None): + """ + Initialize a distribution that has a custom function applied to the result. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution or function or list + Typically, the distribution to apply the function to. Could also be a function + or list of functions if ``dist_fn`` is being used in a pipe. + dist2 : Distribution or function or list or None + Typically, the second distribution to apply the function to if the function takes + two arguments. Could also be a function or list of functions if ``dist_fn`` is + being used in a pipe. + fn : function or None + The function to apply to the distribution(s). + name : str or None + By default, ``fn.__name__`` will be used to name the function. But you can pass + a custom name. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + when it is sampled. + + Examples + -------- + >>> def double(x): + >>> return x * 2 + >>> dist_fn(norm(0, 1), double) + <Distribution> double(norm(mean=0.5, sd=0.3)) + >>> norm(0, 1) >> dist_fn(double) + <Distribution> double(norm(mean=0.5, sd=0.3)) + """ + if isinstance(dist1, list) and callable(dist1[0]) and dist2 is None and fn is None: + fn = dist1 + + def out_fn(d): + out = d + for f in fn: + out = ComplexDistribution(out, None, fn=f, fn_str=_get_fname(f, name), infix=False) + return out + + return out_fn + + if callable(dist1) and dist2 is None and fn is None: + return lambda d: dist_fn(d, fn=dist1) + + if isinstance(dist2, list) and callable(dist2[0]) and fn is None: + fn = dist2 + dist2 = None + + if callable(dist2) and fn is None: + fn = dist2 + dist2 = None + + if not isinstance(fn, list): + fn = [fn] + + out = dist1 + for f in fn: + out = ComplexDistribution(out, dist2, fn=f, fn_str=_get_fname(f, name), infix=False) + + return out
+ + + +
+[docs] +def dist_max(dist1, dist2=None): + """ + Initialize the calculation of the maximum value of two distributions. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution + The distribution to sample and determine the max of. + dist2 : Distribution + The second distribution to sample and determine the max of. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + when it is sampled. + + Examples + -------- + >>> dist_max(norm(0, 1), norm(1, 2)) + <Distribution> max(norm(mean=0.5, sd=0.3), norm(mean=1.5, sd=0.3)) + """ + if is_dist(dist1) and dist2 is None: + return lambda d: dist_fn(d, dist1, np.maximum, name="max") + else: + return dist_fn(dist1, dist2, np.maximum, name="max")
+ + + +
+[docs] +def dist_min(dist1, dist2=None): + """ + Initialize the calculation of the minimum value of two distributions. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution + The distribution to sample and determine the min of. + dist2 : Distribution + The second distribution to sample and determine the min of. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> dist_min(norm(0, 1), norm(1, 2)) + <Distribution> min(norm(mean=0.5, sd=0.3), norm(mean=1.5, sd=0.3)) + """ + if is_dist(dist1) and dist2 is None: + return lambda d: dist_fn(d, dist1, np.minimum, name="min") + else: + return dist_fn(dist1, dist2, np.minimum, name="min")
+ + + +
+[docs] +def dist_round(dist1, digits=0): + """ + Initialize the rounding of the output of the distribution. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution + The distribution to sample and then round. + digits : int + The number of digits to round to. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> dist_round(norm(0, 1)) + <Distribution> round(norm(mean=0.5, sd=0.3), 0) + """ + if isinstance(dist1, int) and digits == 0: + return lambda d: dist_round(d, digits=dist1) + else: + return dist_fn(dist1, digits, _round, name="round")
+ + + +
+[docs] +def dist_ceil(dist1): + """ + Initialize the ceiling rounding of the output of the distribution. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution + The distribution to sample and then ceiling round. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> dist_ceil(norm(0, 1)) + <Distribution> ceil(norm(mean=0.5, sd=0.3)) + """ + return dist_fn(dist1, None, np.ceil)
+ + + +
+[docs] +def dist_floor(dist1): + """ + Initialize the floor rounding of the output of the distribution. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution + The distribution to sample and then floor round. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> dist_floor(norm(0, 1)) + <Distribution> floor(norm(mean=0.5, sd=0.3)) + """ + return dist_fn(dist1, None, np.floor)
+ + + +
+[docs] +def dist_log(dist1, base=math.e): + """ + Initialize the log of the output of the distribution. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution + The distribution to sample and then take the log of. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> dist_log(norm(0, 1), 10) + <Distribution> log(norm(mean=0.5, sd=0.3), const(10)) + """ + return dist_fn(dist1, const(base), math.log)
+ + + +
+[docs] +def dist_exp(dist1): + """ + Initialize the exp of the output of the distribution. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution + The distribution to sample and then take the exp of. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> dist_exp(norm(0, 1)) + <Distribution> exp(norm(mean=0.5, sd=0.3)) + """ + return dist_fn(dist1, None, math.exp)
+ + + +@np.vectorize +def _lclip(n, val=None): + if val is None: + return n + else: + return val if n < val else n + + +
+[docs] +def lclip(dist1, val=None): + """ + Initialize the clipping/bounding of the output of the distribution by the lower value. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution or function + The distribution to clip. If this is a funciton, it will return a partial that will + be suitable for use in piping. + val : int or float or None + The value to use as the lower bound for clipping. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> lclip(norm(0, 1), 0.5) + <Distribution> lclip(norm(mean=0.5, sd=0.3), 0.5) + """ + if (isinstance(dist1, int) or isinstance(dist1, float)) and val is None: + return lambda d: lclip(d, dist1) + elif is_dist(dist1): + return dist_fn(dist1, val, _lclip, name="lclip") + else: + return _lclip(dist1, val)
+ + + +@np.vectorize +def _rclip(n, val=None): + if val is None: + return n + else: + return val if n > val else n + + +
+[docs] +def rclip(dist1, val=None): + """ + Initialize the clipping/bounding of the output of the distribution by the upper value. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution or function + The distribution to clip. If this is a funciton, it will return a partial that will + be suitable for use in piping. + val : int or float or None + The value to use as the upper bound for clipping. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> rclip(norm(0, 1), 0.5) + <Distribution> rclip(norm(mean=0.5, sd=0.3), 0.5) + """ + if (isinstance(dist1, int) or isinstance(dist1, float)) and val is None: + return lambda d: rclip(d, dist1) + elif is_dist(dist1): + return dist_fn(dist1, val, _rclip, name="rclip") + else: + return _rclip(dist1, val)
+ + + +
+[docs] +def clip(dist1, left, right=None): + """ + Initialize the clipping/bounding of the output of the distribution. + + The function won't be applied until the distribution is sampled. + + Parameters + ---------- + dist1 : Distribution or function + The distribution to clip. If this is a funciton, it will return a partial that will + be suitable for use in piping. + left : int or float or None + The value to use as the lower bound for clipping. + right : int or float or None + The value to use as the upper bound for clipping. + + Returns + ------- + ComplexDistribution or function + This will be a lazy evaluation of the desired function that will then be calculated + + Examples + -------- + >>> clip(norm(0, 1), 0.5, 0.9) + <Distribution> rclip(lclip(norm(mean=0.5, sd=0.3), 0.5), 0.9) + """ + if ( + (isinstance(dist1, int) or isinstance(dist1, float)) + and (isinstance(left, int) or isinstance(left, float)) + and right is None + ): + return lambda d: rclip(lclip(d, dist1), left) + else: + return rclip(lclip(dist1, left), right)
+ + + +
+[docs] +class ConstantDistribution(DiscreteDistribution): + def __init__(self, x): + super().__init__() + self.x = x + + def __str__(self): + return "<Distribution> const({})".format(self.x)
+ + + +
+[docs] +def const(x): + """ + Initialize a constant distribution. + + Constant distributions always return the same value no matter what. + + Parameters + ---------- + x : anything + The value the constant distribution should always return. + + Returns + ------- + ConstantDistribution + + Examples + -------- + >>> const(1) + <Distribution> const(1) + """ + return ConstantDistribution(x)
+ + + +
+[docs] +class UniformDistribution(ContinuousDistribution): + def __init__(self, x, y): + super().__init__() + self.x = x + self.y = y + assert x < y, "x must be less than y" + + def __str__(self): + return "<Distribution> uniform({}, {})".format(self.x, self.y)
+ + + +
+[docs] +def uniform(x, y): + """ + Initialize a uniform random distribution. + + Parameters + ---------- + x : float + The smallest value the uniform distribution will return. + y : float + The largest value the uniform distribution will return. + + Returns + ------- + UniformDistribution + + Examples + -------- + >>> uniform(0, 1) + <Distribution> uniform(0, 1) + """ + return UniformDistribution(x=x, y=y)
+ + + +
+[docs] +class NormalDistribution(ContinuousDistribution): + def __init__(self, x=None, y=None, mean=None, sd=None, credibility=90, lclip=None, rclip=None): + super().__init__() + self.x = x + self.y = y + self.credibility = credibility + self.mean = mean + self.sd = sd + self.lclip = lclip + self.rclip = rclip + + if self.x is not None and self.y is not None and self.x > self.y: + raise ValueError("`high value` cannot be lower than `low value`") + + if (self.x is None or self.y is None) and self.sd is None: + raise ValueError("must define either x/y or mean/sd") + elif (self.x is not None or self.y is not None) and self.sd is not None: + raise ValueError("must define either x/y or mean/sd -- cannot define both") + elif self.sd is not None and self.mean is None: + self.mean = 0 + + if self.mean is None and self.sd is None: + self.mean = (self.x + self.y) / 2 + cdf_value = 0.5 + 0.5 * (self.credibility / 100) + normed_sigma = scipy.stats.norm.ppf(cdf_value) + self.sd = (self.y - self.mean) / normed_sigma + + def __str__(self): + out = "<Distribution> norm(mean={}, sd={}".format(round(self.mean, 2), round(self.sd, 2)) + if self.lclip is not None: + out += ", lclip={}".format(self.lclip) + if self.rclip is not None: + out += ", rclip={}".format(self.rclip) + out += ")" + return out
+ + + +
+[docs] +def norm( + x=None, y=None, credibility=90, mean=None, sd=None, lclip=None, rclip=None +) -> NormalDistribution: + """ + Initialize a normal distribution. + + Can be defined either via a credible interval from ``x`` to ``y`` (use ``credibility`` or + it will default to being a 90% CI) or defined via ``mean`` and ``sd``. + + Parameters + ---------- + x : float + The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + y : float + The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + credibility : float + The range of the credibility interval. Defaults to 90. Ignored if the distribution is + defined instead by ``mean`` and ``sd``. + mean : float or None + The mean of the normal distribution. If not defined, defaults to 0. + sd : float + The standard deviation of the normal distribution. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + NormalDistribution + + Examples + -------- + >>> norm(0, 1) + <Distribution> norm(mean=0.5, sd=0.3) + >>> norm(mean=1, sd=2) + <Distribution> norm(mean=1, sd=2) + """ + return NormalDistribution( + x=x, y=y, credibility=credibility, mean=mean, sd=sd, lclip=lclip, rclip=rclip + )
+ + + +
+[docs] +class LognormalDistribution(ContinuousDistribution): + def __init__( + self, + x=None, + y=None, + norm_mean=None, + norm_sd=None, + lognorm_mean=None, + lognorm_sd=None, + credibility=90, + lclip=None, + rclip=None, + ): + super().__init__() + self.x = x + self.y = y + self.credibility = credibility + self.norm_mean = norm_mean + self.norm_sd = norm_sd + self.lognorm_mean = lognorm_mean + self.lognorm_sd = lognorm_sd + self.lclip = lclip + self.rclip = rclip + + if self.x is not None and self.y is not None and self.x > self.y: + raise ValueError("`high value` cannot be lower than `low value`") + if self.x is not None and self.x <= 0: + raise ValueError("lognormal distribution must have values > 0") + + if (self.x is None or self.y is None) and self.norm_sd is None and self.lognorm_sd is None: + raise ValueError( + ("must define only one of x/y, norm_mean/norm_sd, " "or lognorm_mean/lognorm_sd") + ) + elif (self.x is not None or self.y is not None) and ( + self.norm_sd is not None or self.lognorm_sd is not None + ): + raise ValueError( + ("must define only one of x/y, norm_mean/norm_sd, " "or lognorm_mean/lognorm_sd") + ) + elif (self.norm_sd is not None or self.norm_mean is not None) and ( + self.lognorm_sd is not None or self.lognorm_mean is not None + ): + raise ValueError( + ("must define only one of x/y, norm_mean/norm_sd, " "or lognorm_mean/lognorm_sd") + ) + elif self.norm_sd is not None and self.norm_mean is None: + self.norm_mean = 0 + elif self.lognorm_sd is not None and self.lognorm_mean is None: + self.lognorm_mean = 1 + + if self.x is not None: + self.norm_mean = (np.log(self.x) + np.log(self.y)) / 2 + cdf_value = 0.5 + 0.5 * (self.credibility / 100) + normed_sigma = scipy.stats.norm.ppf(cdf_value) + self.norm_sd = (np.log(self.y) - self.norm_mean) / normed_sigma + + if self.lognorm_sd is None: + self.lognorm_mean = np.exp(self.norm_mean + self.norm_sd**2 / 2) + self.lognorm_sd = ( + (np.exp(self.norm_sd**2) - 1) * np.exp(2 * self.norm_mean + self.norm_sd**2) + ) ** 0.5 + elif self.norm_sd is None: + self.norm_mean = np.log( + (self.lognorm_mean**2 / np.sqrt(self.lognorm_sd**2 + self.lognorm_mean**2)) + ) + self.norm_sd = np.sqrt(np.log(1 + self.lognorm_sd**2 / self.lognorm_mean**2)) + + def __str__(self): + out = "<Distribution> lognorm(lognorm_mean={}, lognorm_sd={}, norm_mean={}, norm_sd={}" + out = out.format( + round(self.lognorm_mean, 2), + round(self.lognorm_sd, 2), + round(self.norm_mean, 2), + round(self.norm_sd, 2), + ) + if self.lclip is not None: + out += ", lclip={}".format(self.lclip) + if self.rclip is not None: + out += ", rclip={}".format(self.rclip) + out += ")" + return out
+ + + +
+[docs] +def lognorm( + x=None, + y=None, + credibility=90, + norm_mean=None, + norm_sd=None, + lognorm_mean=None, + lognorm_sd=None, + lclip=None, + rclip=None, +): + """ + Initialize a lognormal distribution. + + Can be defined either via a credible interval from ``x`` to ``y`` (use ``credibility`` or + it will default to being a 90% CI) or defined via ``mean`` and ``sd``. + + Parameters + ---------- + x : float + The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + Must be a value greater than 0. + y : float + The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + Must be a value greater than 0. + credibility : float + The range of the credibility interval. Defaults to 90. Ignored if the distribution is + defined instead by ``mean`` and ``sd``. + norm_mean : float or None + The mean of the underlying normal distribution. If not defined, defaults to 0. + norm_sd : float + The standard deviation of the underlying normal distribution. + lognorm_mean : float or None + The mean of the lognormal distribution. If not defined, defaults to 1. + lognorm_sd : float + The standard deviation of the lognormal distribution. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + LognormalDistribution + + Examples + -------- + >>> lognorm(1, 10) + <Distribution> lognorm(lognorm_mean=4.04, lognorm_sd=3.21, norm_mean=1.15, norm_sd=0.7) + >>> lognorm(norm_mean=1, norm_sd=2) + <Distribution> lognorm(lognorm_mean=20.09, lognorm_sd=147.05, norm_mean=1, norm_sd=2) + >>> lognorm(lognorm_mean=1, lognorm_sd=2) + <Distribution> lognorm(lognorm_mean=1, lognorm_sd=2, norm_mean=-0.8, norm_sd=1.27) + """ + return LognormalDistribution( + x=x, + y=y, + credibility=credibility, + norm_mean=norm_mean, + norm_sd=norm_sd, + lognorm_mean=lognorm_mean, + lognorm_sd=lognorm_sd, + lclip=lclip, + rclip=rclip, + )
+ + + +
+[docs] +def to( + x, y, credibility=90, lclip=None, rclip=None +) -> Union[LognormalDistribution, NormalDistribution]: + """ + Initialize a distribution from ``x`` to ``y``. + + The distribution will be lognormal by default, unless ``x`` is less than or equal to 0, + in which case it will become a normal distribution. + + The distribution will default to be a 90% credible interval between ``x`` and ``y`` unless + ``credibility`` is passed. + + Parameters + ---------- + x : float + The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + y : float + The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + credibility : float + The range of the credibility interval. Defaults to 90. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + ``LognormalDistribution`` if ``x`` > 0, otherwise a ``NormalDistribution`` + + Examples + -------- + >>> to(1, 10) + <Distribution> lognorm(mean=1.15, sd=0.7) + >>> to(-10, 10) + <Distribution> norm(mean=0.0, sd=6.08) + """ + if x > 0: + return lognorm(x=x, y=y, credibility=credibility, lclip=lclip, rclip=rclip) + else: + return norm(x=x, y=y, credibility=credibility, lclip=lclip, rclip=rclip)
+ + + +
+[docs] +class BinomialDistribution(DiscreteDistribution): + def __init__(self, n, p): + super().__init__() + self.n = n + self.p = p + if self.p <= 0 or self.p >= 1: + raise ValueError("p must be between 0 and 1 (exclusive)") + + def __str__(self): + return "<Distribution> binomial(n={}, p={})".format(self.n, self.p)
+ + + +
+[docs] +def binomial(n, p): + """ + Initialize a binomial distribution. + + Parameters + ---------- + n : int + The number of trials. + p : float + The probability of success for each trial. Must be between 0 and 1. + + Returns + ------- + BinomialDistribution + + Examples + -------- + >>> binomial(1, 0.1) + <Distribution> binomial(1, 0.1) + """ + return BinomialDistribution(n=n, p=p)
+ + + +
+[docs] +class BetaDistribution(ContinuousDistribution): + def __init__(self, a, b): + super().__init__() + self.a = a + self.b = b + + def __str__(self): + return "<Distribution> beta(a={}, b={})".format(self.a, self.b)
+ + + +
+[docs] +def beta(a, b): + """ + Initialize a beta distribution. + + Parameters + ---------- + a : float + The alpha shape value of the distribution. Typically takes the value of the + number of trials that resulted in a success. + b : float + The beta shape value of the distribution. Typically takes the value of the + number of trials that resulted in a failure. + + Returns + ------- + BetaDistribution + + Examples + -------- + >>> beta(1, 2) + <Distribution> beta(1, 2) + """ + return BetaDistribution(a, b)
+ + + +
+[docs] +class BernoulliDistribution(DiscreteDistribution): + def __init__(self, p): + super().__init__() + if not isinstance(p, float) or isinstance(p, int): + raise ValueError("bernoulli p must be a float or int") + if p <= 0 or p >= 1: + raise ValueError("bernoulli p must be 0-1 (exclusive)") + self.p = p + + def __str__(self): + return "<Distribution> bernoulli(p={})".format(self.p)
+ + + +
+[docs] +def bernoulli(p): + """ + Initialize a Bernoulli distribution. + + Parameters + ---------- + p : float + The probability of the binary event. Must be between 0 and 1. + + Returns + ------- + BernoulliDistribution + + Examples + -------- + >>> bernoulli(0.1) + <Distribution> bernoulli(p=0.1) + """ + return BernoulliDistribution(p)
+ + + +
+[docs] +class CategoricalDistribution(DiscreteDistribution): + def __init__(self, items): + super().__init__() + if not isinstance(items, dict) and not isinstance(items, list) and not _is_numpy(items): + raise ValueError("inputs to categorical must be a dict or list") + assert len(items) > 0, "inputs to categorical must be non-empty" + self.items = list(items) if _is_numpy(items) else items + + def __str__(self): + return "<Distribution> categorical({})".format(self.items)
+ + + +
+[docs] +def discrete(items): + """ + Initialize a discrete distribution (aka categorical distribution). + + Parameters + ---------- + items : list or dict + The values that the discrete distribution will return and their associated + weights (or likelihoods of being returned when sampled). + + Returns + ------- + CategoricalDistribution + + Examples + -------- + >>> discrete({0: 0.1, 1: 0.9}) # 10% chance of returning 0, 90% chance of returning 1 + <Distribution> categorical({0: 0.1, 1: 0.9}) + >>> discrete([[0.1, 0], [0.9, 1]]) # Different notation for the same thing. + <Distribution> categorical([[0.1, 0], [0.9, 1]]) + >>> discrete([0, 1, 2]) # When no weights are given, all have equal chance of happening. + <Distribution> categorical([0, 1, 2]) + >>> discrete({'a': 0.1, 'b': 0.9}) # Values do not have to be numbers. + <Distribution> categorical({'a': 0.1, 'b': 0.9}) + """ + return CategoricalDistribution(items)
+ + + +
+[docs] +class TDistribution(ContinuousDistribution): + def __init__(self, x=None, y=None, t=20, credibility=90, lclip=None, rclip=None): + super().__init__() + self.x = x + self.y = y + self.t = t + self.df = t + self.credibility = credibility + self.lclip = lclip + self.rclip = rclip + + if (self.x is None or self.y is None) and not (self.x is None and self.y is None): + raise ValueError("must define either both `x` and `y` or neither.") + elif self.x is not None and self.y is not None and self.x > self.y: + raise ValueError("`high value` cannot be lower than `low value`") + + if self.x is None: + self.credibility = None + + def __str__(self): + if self.x is not None: + out = "<Distribution> tdist(x={}, y={}, t={}".format(self.x, self.y, self.t) + else: + out = "<Distribution> tdist(t={}".format(self.t) + if self.credibility != 90 and self.credibility is not None: + out += ", credibility={}".format(self.credibility) + if self.lclip is not None: + out += ", lclip={}".format(self.lclip) + if self.rclip is not None: + out += ", rclip={}".format(self.rclip) + out += ")" + return out
+ + + +
+[docs] +def tdist(x=None, y=None, t=20, credibility=90, lclip=None, rclip=None): + """ + Initialize a t-distribution. + + Is defined either via a loose credible interval from ``x`` to ``y`` (use ``credibility`` or + it will default to being a 90% CI). Unlike the normal and lognormal distributions, this + credible interval is an approximation and is not precisely defined. + + If ``x`` and ``y`` are not defined, can just return a classic t-distribution defined via + ``t`` as the number of degrees of freedom. + + Parameters + ---------- + x : float or None + The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + y : float or None + The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + t : float + The number of degrees of freedom of the t-distribution. Defaults to 20. + credibility : float + The range of the credibility interval. Defaults to 90. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + TDistribution + + Examples + -------- + >>> tdist(0, 1, 2) + <Distribution> tdist(x=0, y=1, t=2) + >>> tdist() + <Distribution> tdist(t=1) + """ + return TDistribution(x=x, y=y, t=t, credibility=credibility, lclip=lclip, rclip=rclip)
+ + + +
+[docs] +class LogTDistribution(ContinuousDistribution): + def __init__(self, x=None, y=None, t=1, credibility=90, lclip=None, rclip=None): + super().__init__() + self.x = x + self.y = y + self.t = t + self.df = t + self.credibility = credibility + self.lclip = lclip + self.rclip = rclip + + if (self.x is None or self.y is None) and not (self.x is None and self.y is None): + raise ValueError("must define either both `x` and `y` or neither.") + if self.x is not None and self.y is not None and self.x > self.y: + raise ValueError("`high value` cannot be lower than `low value`") + if self.x is not None and self.x <= 0: + raise ValueError("`low value` must be greater than 0.") + + if self.x is None: + self.credibility = None + + def __str__(self): + if self.x is not None: + out = "<Distribution> log_tdist(x={}, y={}, t={}".format(self.x, self.y, self.t) + else: + out = "<Distribution> log_tdist(t={}".format(self.t) + if self.credibility != 90 and self.credibility is not None: + out += ", credibility={}".format(self.credibility) + if self.lclip is not None: + out += ", lclip={}".format(self.lclip) + if self.rclip is not None: + out += ", rclip={}".format(self.rclip) + out += ")" + return out
+ + + +
+[docs] +def log_tdist(x=None, y=None, t=1, credibility=90, lclip=None, rclip=None): + """ + Initialize a log t-distribution, which is a t-distribution in log-space. + + Is defined either via a loose credible interval from ``x`` to ``y`` (use ``credibility`` or + it will default to being a 90% CI). Unlike the normal and lognormal distributions, this + credible interval is an approximation and is not precisely defined. + + If ``x`` and ``y`` are not defined, can just return a classic t-distribution defined via + ``t`` as the number of degrees of freedom, but in log-space. + + Parameters + ---------- + x : float or None + The low value of a credible interval defined by ``credibility``. Must be greater than 0. + Defaults to a 90% CI. + y : float or None + The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + t : float + The number of degrees of freedom of the t-distribution. Defaults to 1. + credibility : float + The range of the credibility interval. Defaults to 90. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + LogTDistribution + + Examples + -------- + >>> log_tdist(0, 1, 2) + <Distribution> log_tdist(x=0, y=1, t=2) + >>> log_tdist() + <Distribution> log_tdist(t=1) + """ + return LogTDistribution(x=x, y=y, t=t, credibility=credibility, lclip=lclip, rclip=rclip)
+ + + +
+[docs] +class TriangularDistribution(ContinuousDistribution): + def __init__(self, left, mode, right): + super().__init__() + if left > mode: + raise ValueError("left must be less than or equal to mode") + if right < mode: + raise ValueError("right must be greater than or equal to mode") + if left == right: + raise ValueError("left and right must be different") + self.left = left + self.mode = mode + self.right = right + + def __str__(self): + return "<Distribution> triangular({}, {}, {})".format(self.left, self.mode, self.right)
+ + + +
+[docs] +def triangular(left, mode, right, lclip=None, rclip=None): + """ + Initialize a triangular distribution. + + Parameters + ---------- + left : float + The smallest value of the triangular distribution. + mode : float + The most common value of the triangular distribution. + right : float + The largest value of the triangular distribution. + + Returns + ------- + TriangularDistribution + + Examples + -------- + >>> triangular(1, 2, 3) + <Distribution> triangular(1, 2, 3) + """ + return TriangularDistribution(left=left, mode=mode, right=right)
+ + + +
+[docs] +class PERTDistribution(ContinuousDistribution): + def __init__(self, left, mode, right, lam=4, lclip=None, rclip=None): + super().__init__() + if left > mode: + raise ValueError("left must be less than or equal to mode") + if right < mode: + raise ValueError("right must be greater than or equal to mode") + if lam < 0: + raise ValueError("the shape parameter must be positive") + if left == right: + raise ValueError("left and right must be different") + + self.left = left + self.mode = mode + self.right = right + self.lam = lam + self.lclip = lclip + self.rclip = rclip + + def __str__(self): + out = "<Distribution> PERT({}, {}, {}, lam={}".format( + self.left, self.mode, self.right, self.lam + ) + if self.lclip is not None: + out += ", lclip={}".format(self.lclip) + if self.rclip is not None: + out += ", rclip={}".format(self.rclip) + out += ")" + return out
+ + + +
+[docs] +def pert(left, mode, right, lam=4, lclip=None, rclip=None): + """ + Initialize a PERT distribution. + + Parameters + ---------- + left : float + The smallest value of the PERT distribution. + mode : float + The most common value of the PERT distribution. + right : float + The largest value of the PERT distribution. + lam : float + The lambda value of the PERT distribution. Defaults to 4. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + PERTDistribution + + Examples + -------- + >>> pert(1, 2, 3) + <Distribution> PERT(1, 2, 3) + """ + return PERTDistribution(left=left, mode=mode, right=right, lam=lam, lclip=lclip, rclip=rclip)
+ + + +
+[docs] +class PoissonDistribution(DiscreteDistribution): + def __init__(self, lam, lclip=None, rclip=None): + super().__init__() + self.lam = lam + self.lclip = lclip + self.rclip = rclip + + def __str__(self): + out = "<Distribution> poisson({}".format(self.lam) + if self.lclip is not None: + out += ", lclip={}".format(self.lclip) + if self.rclip is not None: + out += ", rclip={}".format(self.rclip) + out += ")" + return out
+ + + +
+[docs] +def poisson(lam, lclip=None, rclip=None): + """ + Initialize a poisson distribution. + + Parameters + ---------- + lam : float + The lambda value of the poisson distribution. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + PoissonDistribution + + Examples + -------- + >>> poisson(1) + <Distribution> poisson(1) + """ + return PoissonDistribution(lam=lam, lclip=lclip, rclip=rclip)
+ + + +
+[docs] +class ChiSquareDistribution(ContinuousDistribution): + def __init__(self, df): + super().__init__() + self.df = df + if self.df <= 0: + raise ValueError("df must be positive") + + def __str__(self): + return "<Distribution> chisquare({})".format(self.df)
+ + + +
+[docs] +def chisquare(df): + """ + Initialize a chi-square distribution. + + Parameters + ---------- + df : float + The degrees of freedom. Must be positive. + + Returns + ------- + ChiSquareDistribution + + Examples + -------- + >>> chisquare(2) + <Distribution> chiaquare(2) + """ + return ChiSquareDistribution(df=df)
+ + + +
+[docs] +class ExponentialDistribution(ContinuousDistribution): + def __init__(self, scale, lclip=None, rclip=None): + super().__init__() + assert scale > 0, "scale must be positive" + # Prevent numeric overflows + assert scale < 1e20, "scale must be less than 1e20" + self.scale = scale + self.lclip = lclip + self.rclip = rclip + + def __str__(self): + out = "<Distribution> exponential({}".format(self.scale) + if self.lclip is not None: + out += ", lclip={}".format(self.lclip) + if self.rclip is not None: + out += ", rclip={}".format(self.rclip) + out += ")" + return out
+ + + +
+[docs] +def exponential(scale, lclip=None, rclip=None): + """ + Initialize an exponential distribution. + + Parameters + ---------- + scale : float + The scale value of the exponential distribution (> 0) + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + ExponentialDistribution + + Examples + -------- + >>> exponential(1) + <Distribution> exponential(1) + """ + return ExponentialDistribution(scale=scale, lclip=lclip, rclip=rclip)
+ + + +
+[docs] +class GammaDistribution(ContinuousDistribution): + def __init__(self, shape, scale=1, lclip=None, rclip=None): + super().__init__() + self.shape = shape + self.scale = scale + self.lclip = lclip + self.rclip = rclip + + def __str__(self): + out = "<Distribution> gamma(shape={}, scale={}".format(self.shape, self.scale) + if self.lclip is not None: + out += ", lclip={}".format(self.lclip) + if self.rclip is not None: + out += ", rclip={}".format(self.rclip) + out += ")" + return out
+ + + +
+[docs] +def gamma(shape, scale=1, lclip=None, rclip=None): + """ + Initialize a gamma distribution. + + Parameters + ---------- + shape : float + The shape value of the gamma distribution. + scale : float + The scale value of the gamma distribution. Defaults to 1. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + GammaDistribution + + Examples + -------- + >>> gamma(10, 1) + <Distribution> gamma(shape=10, scale=1) + """ + return GammaDistribution(shape=shape, scale=scale, lclip=lclip, rclip=rclip)
+ + + +
+[docs] +class ParetoDistribution(ContinuousDistribution): + def __init__(self, shape): + super().__init__() + self.shape = shape + + def __str__(self): + return "<Distribution> pareto({})".format(self.shape)
+ + + +
+[docs] +def pareto(shape): + """ + Initialize a pareto distribution. + + Parameters + ---------- + shape : float + The shape value of the pareto distribution. + + Returns + ------- + ParetoDistribution + + Examples + -------- + >>> pareto(1) + <Distribution> pareto(1) + """ + return ParetoDistribution(shape=shape)
+ + + +
+[docs] +class MixtureDistribution(CompositeDistribution): + def __init__(self, dists, weights=None, relative_weights=None, lclip=None, rclip=None): + super().__init__() + weights, dists = _process_weights_values(weights, relative_weights, dists) + self.dists = dists + self.weights = weights + self.lclip = lclip + self.rclip = rclip + self._check_correlated(dists) + + def __str__(self): + out = "<Distribution> mixture" + for i in range(len(self.dists)): + out += "\n - {} weight on {}".format(self.weights[i], self.dists[i]) + return out
+ + + +
+[docs] +def mixture(dists, weights=None, relative_weights=None, lclip=None, rclip=None): + """ + Initialize a mixture distribution, which is a combination of different distributions. + + Parameters + ---------- + dists : list or dict + The distributions to mix. Can also be defined as a list of weights and distributions. + weights : list or None + The weights for each distribution. + relative_weights : list or None + Relative weights, which if given will be weights that are normalized + to sum to 1. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + + Returns + ------- + MixtureDistribution + + Examples + -------- + >>> mixture([norm(1, 2), norm(3, 4)], weights=[0.1, 0.9]) + <Distribution> mixture + - <Distribution> norm(mean=1.5, sd=0.3) + - <Distribution> norm(mean=3.5, sd=0.3) + >>> mixture([[0.1, norm(1, 2)], [0.9, norm(3, 4)]]) # Different notation for the same thing. + <Distribution> mixture + - <Distribution> norm(mean=1.5, sd=0.3) + - <Distribution> norm(mean=3.5, sd=0.3) + >>> mixture([norm(1, 2), norm(3, 4)]) # When no weights are given, all have equal chance + >>> # of happening. + <Distribution> mixture + - <Distribution> norm(mean=1.5, sd=0.3) + - <Distribution> norm(mean=3.5, sd=0.3) + """ + return MixtureDistribution( + dists=dists, + weights=weights, + relative_weights=relative_weights, + lclip=lclip, + rclip=rclip, + )
+ + + +
+[docs] +def zero_inflated(p_zero, dist): + """ + Initialize an arbitrary zero-inflated distribution. + + Parameters + ---------- + p_zero : float + The chance of the distribution returning zero + dist : Distribution + The distribution to sample from when not zero + + Returns + ------- + MixtureDistribution + + Examples + -------- + >>> zero_inflated(0.6, norm(1, 2)) + <Distribution> mixture + - 0 + - <Distribution> norm(mean=1.5, sd=0.3) + """ + if p_zero > 1 or p_zero < 0 or not isinstance(p_zero, float): + raise ValueError("`p_zero` must be between 0 and 1") + return MixtureDistribution(dists=[0, dist], weights=p_zero)
+ + + +
+[docs] +def inf0(p_zero, dist): + """ + Initialize an arbitrary zero-inflated distribution. + + Alias for ``zero_inflated``. + + Parameters + ---------- + p_zero : float + The chance of the distribution returning zero + dist : Distribution + The distribution to sample from when not zero + + Returns + ------- + MixtureDistribution + + Examples + -------- + >>> inf0(0.6, norm(1, 2)) + <Distribution> mixture + - 0 + - <Distribution> norm(mean=1.5, sd=0.3) + """ + return zero_inflated(p_zero=p_zero, dist=dist)
+ + + +
+[docs] +class GeometricDistribution(OperableDistribution): + def __init__(self, p): + super().__init__() + self.p = p + if self.p < 0 or self.p > 1: + raise ValueError("p must be between 0 and 1") + + def __str__(self): + return "<Distribution> geometric(p={})".format(self.p)
+ + + +
+[docs] +def geometric(p): + """ + Initialize a geometric distribution. + + Parameters + ---------- + p : float + The probability of success of an individual trial. Must be between 0 and 1. + + Returns + ------- + GeometricDistribution + + Examples + -------- + >>> geometric(0.1) + <Distribution> geometric(0.1) + """ + return GeometricDistribution(p=p)
+ +
+ +
+ + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/_modules/squigglepy/rng.html b/docs/build/html/_modules/squigglepy/rng.html new file mode 100644 index 0000000..af027d7 --- /dev/null +++ b/docs/build/html/_modules/squigglepy/rng.html @@ -0,0 +1,389 @@ + + + + + + + + + + squigglepy.rng — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +

Source code for squigglepy.rng

+import numpy as np
+
+_squigglepy_internal_rng = np.random.default_rng()
+
+
+
+[docs] +def set_seed(seed): + """ + Set the seed of the random number generator used by Squigglepy. + + The RNG is a ``np.random.default_rng`` under the hood. + + Parameters + ---------- + seed : float + The seed to use for the RNG. + + Returns + ------- + np.random.default_rng + The RNG used internally. + + Examples + -------- + >>> set_seed(42) + Generator(PCG64) at 0x127EDE9E0 + """ + global _squigglepy_internal_rng + _squigglepy_internal_rng = np.random.default_rng(seed) + return _squigglepy_internal_rng
+ +
+ +
+ + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/_modules/squigglepy/samplers.html b/docs/build/html/_modules/squigglepy/samplers.html new file mode 100644 index 0000000..9118039 --- /dev/null +++ b/docs/build/html/_modules/squigglepy/samplers.html @@ -0,0 +1,1560 @@ + + + + + + + + + + squigglepy.samplers — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +

Source code for squigglepy.samplers

+import bisect
+import os
+import time
+
+import numpy as np
+import pathos.multiprocessing as mp
+
+from numpy.typing import NDArray
+
+from scipy import stats
+
+from .utils import (
+    _process_weights_values,
+    _process_discrete_weights_values,
+    is_dist,
+    is_sampleable,
+    _simplify,
+    _enlist,
+    _safe_len,
+    _core_cuts,
+    _init_tqdm,
+    _tick_tqdm,
+    _flush_tqdm,
+)
+
+from .distributions import (
+    BaseDistribution,
+    BernoulliDistribution,
+    BetaDistribution,
+    BinomialDistribution,
+    ChiSquareDistribution,
+    ComplexDistribution,
+    ConstantDistribution,
+    CategoricalDistribution,
+    ExponentialDistribution,
+    GammaDistribution,
+    GeometricDistribution,
+    LogTDistribution,
+    LognormalDistribution,
+    MixtureDistribution,
+    NormalDistribution,
+    ParetoDistribution,
+    PoissonDistribution,
+    TDistribution,
+    TriangularDistribution,
+    PERTDistribution,
+    UniformDistribution,
+    const,
+)
+
+_squigglepy_internal_sample_caches = {}
+
+
+def _get_rng():
+    from .rng import _squigglepy_internal_rng
+
+    return _squigglepy_internal_rng
+
+
+
+[docs] +def normal_sample(mean, sd, samples=1): + """ + Sample a random number according to a normal distribution. + + Parameters + ---------- + mean : float + The mean of the normal distribution that is being sampled. + sd : float + The standard deviation of the normal distribution that is being sampled. + samples : int + The number of samples to return. + + Returns + ------- + float + A random number sampled from a normal distribution defined by + ``mean`` and ``sd``. + + Examples + -------- + >>> set_seed(42) + >>> normal_sample(0, 1) + 0.30471707975443135 + """ + return _simplify(_get_rng().normal(mean, sd, samples))
+ + + +
+[docs] +def lognormal_sample(mean, sd, samples=1): + """ + Sample a random number according to a lognormal distribution. + + Parameters + ---------- + mean : float + The mean of the lognormal distribution that is being sampled. + sd : float + The standard deviation of the lognormal distribution that is being sampled. + samples : int + The number of samples to return. + + Returns + ------- + float + A random number sampled from a lognormal distribution defined by + ``mean`` and ``sd``. + + Examples + -------- + >>> set_seed(42) + >>> lognormal_sample(0, 1) + 1.3562412406168636 + """ + return _simplify(_get_rng().lognormal(mean, sd, samples))
+ + + +
+[docs] +def t_sample(low=None, high=None, t=20, samples=1, credibility=90): + """ + Sample a random number according to a t-distribution. + + The t-distribution is defined with degrees of freedom via the ``t`` + parameter. Additionally, a loose credibility interval can be defined + via the t-distribution using the ``low`` and ``high`` values. This will be a + 90% CI by default unless you change ``credibility.`` Unlike the normal and + lognormal samplers, this credible interval is an approximation and is + not precisely defined. + + Parameters + ---------- + low : float or None + The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + high : float or None + The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + t : float + The number of degrees of freedom of the t-distribution. Defaults to 20. + samples : int + The number of samples to return. + credibility : float + The range of the credibility interval. Defaults to 90. + + Returns + ------- + float + A random number sampled from a lognormal distribution defined by + ``mean`` and ``sd``. + + Examples + -------- + >>> set_seed(42) + >>> t_sample(1, 2, t=4) + 2.7887113716855985 + """ + if low is None and high is None: + return _get_rng().standard_t(t, samples) + elif low is None or high is None: + raise ValueError("must define either both `x` and `y` or neither.") + elif low > high: + raise ValueError("`high value` cannot be lower than `low value`") + elif low == high: + return low + else: + mu = (high + low) / 2 + cdf_value = 0.5 + 0.5 * (credibility / 100) + normed_sigma = stats.norm.ppf(cdf_value) + sigma = (high - mu) / normed_sigma + return _simplify( + normal_sample(mu, sigma, samples) / ((chi_square_sample(t, samples) / t) ** 0.5) + )
+ + + +
+[docs] +def log_t_sample(low=None, high=None, t=20, samples=1, credibility=90): + """ + Sample a random number according to a log-t-distribution. + + The log-t-distribution is a t-distribution in log-space. It is defined with + degrees of freedom via the ``t`` parameter. Additionally, a loose credibility + interval can be defined via the t-distribution using the ``low`` and ``high`` + values. This will be a 90% CI by default unless you change ``credibility.`` + Unlike the normal and lognormal samplers, this credible interval is an + approximation and is not precisely defined. + + Parameters + ---------- + low : float or None + The low value of a credible interval defined by ``credibility``. + Must be greater than 0. Defaults to a 90% CI. + high : float or None + The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. + t : float + The number of degrees of freedom of the t-distribution. Defaults to 20. + samples : int + The number of samples to return. + credibility : float + The range of the credibility interval. Defaults to 90. + + Returns + ------- + float + A random number sampled from a lognormal distribution defined by + ``mean`` and ``sd``. + + Examples + -------- + >>> set_seed(42) + >>> log_t_sample(1, 2, t=4) + 2.052949773846356 + """ + if low is None and high is None: + return np.exp(_get_rng().standard_t(t)) + elif low > high: + raise ValueError("`high value` cannot be lower than `low value`") + elif low < 0: + raise ValueError("log_t_sample cannot handle negative values") + elif low == high: + return low + else: + log_low = np.log(low) + log_high = np.log(high) + mu = (log_high + log_low) / 2 + cdf_value = 0.5 + 0.5 * (credibility / 100) + normed_sigma = stats.norm.ppf(cdf_value) + sigma = (log_high - mu) / normed_sigma + return _simplify( + np.exp( + normal_sample(mu, sigma, samples) / ((chi_square_sample(t, samples) / t) ** 0.5) + ) + )
+ + + +
+[docs] +def binomial_sample(n, p, samples=1): + """ + Sample a random number according to a binomial distribution. + + Parameters + ---------- + n : int + The number of trials. + p : float + The probability of success for each trial. Must be between 0 and 1. + samples : int + The number of samples to return. + + Returns + ------- + int + A random number sampled from a binomial distribution defined by + ``n`` and ``p``. The random number should be between 0 and ``n``. + + Examples + -------- + >>> set_seed(42) + >>> binomial_sample(10, 0.1) + 2 + """ + return _simplify(_get_rng().binomial(n, p, samples))
+ + + +
+[docs] +def beta_sample(a, b, samples=1): + """ + Sample a random number according to a beta distribution. + + Parameters + ---------- + a : float + The alpha shape value of the distribution. Typically takes the value of the + number of trials that resulted in a success. + b : float + The beta shape value of the distribution. Typically takes the value of the + number of trials that resulted in a failure. + samples : int + The number of samples to return. + + Returns + ------- + float + A random number sampled from a beta distribution defined by + ``a`` and ``b``. + + Examples + -------- + >>> set_seed(42) + >>> beta_sample(1, 1) + 0.22145847498048798 + """ + return _simplify(_get_rng().beta(a, b, samples))
+ + + +
+[docs] +def bernoulli_sample(p, samples=1): + """ + Sample 1 with probability ``p`` and 0 otherwise. + + Parameters + ---------- + p : float + The probability of success. Must be between 0 and 1. + samples : int + The number of samples to return. + + Returns + ------- + int + Either 0 or 1 + + Examples + -------- + >>> set_seed(42) + >>> bernoulli_sample(0.5) + 0 + """ + a = uniform_sample(0, 1, samples) + if _safe_len(a) == 1: + return int(a < p) + else: + return (a < p).astype(int)
+ + + +
+[docs] +def triangular_sample(left, mode, right, samples=1): + """ + Sample a random number according to a triangular distribution. + + Parameters + ---------- + left : float + The smallest value of the triangular distribution. + mode : float + The most common value of the triangular distribution. + right : float + The largest value of the triangular distribution. + samples : int + The number of samples to return. + + Returns + ------- + float + A random number sampled from a triangular distribution. + + Examples + -------- + >>> set_seed(42) + >>> triangular_sample(1, 2, 3) + 2.327625176788963 + """ + return _simplify(_get_rng().triangular(left, mode, right, samples))
+ + + +
+[docs] +def pert_sample(left, mode, right, lam, samples=1): + """ + Sample a random number according to a PERT distribution. + + Parameters + ---------- + left : float + The smallest value of the PERT distribution. + mode : float + The most common value of the PERT distribution. + right : float + The largest value of the PERT distribution. + lam : float + The lambda of the PERT distribution. + samples : int + The number of samples to return. + + Returns + ------- + float + A random number sampled from a PERT distribution. + + Examples + -------- + >>> set_seed(42) + >>> pert_sample(1, 2, 3, 4) + 2.327625176788963 + """ + r = right - left + alpha = 1 + lam * (mode - left) / r + beta = 1 + lam * (right - mode) / r + return left + beta_sample(a=alpha, b=beta, samples=samples) * r
+ + + +
+[docs] +def poisson_sample(lam, samples=1): + """ + Sample a random number according to a poisson distribution. + + Parameters + ---------- + lam : float + The lambda value of the poisson distribution. + samples : int + The number of samples to return. + + Returns + ------- + int + A random number sampled from a poisson distribution. + + Examples + -------- + >>> set_seed(42) + >>> poisson_sample(10) + 13 + """ + return _simplify(_get_rng().poisson(lam, samples))
+ + + +
+[docs] +def exponential_sample(scale, samples=1): + """ + Sample a random number according to an exponential distribution. + + Parameters + ---------- + scale : float + The scale value of the exponential distribution. + samples : int + The number of samples to return. + + Returns + ------- + int + A random number sampled from an exponential distribution. + + Examples + -------- + >>> set_seed(42) + >>> exponential_sample(10) + 24.042086039659946 + """ + return _simplify(_get_rng().exponential(scale, samples))
+ + + +
+[docs] +def gamma_sample(shape, scale, samples=1): + """ + Sample a random number according to a gamma distribution. + + Parameters + ---------- + shape : float + The shape value of the gamma distribution. + scale : float + The scale value of the gamma distribution. Defaults to 1. + samples : int + The number of samples to return. + + Returns + ------- + int + A random number sampled from an gamma distribution. + + Examples + -------- + >>> set_seed(42) + >>> gamma_sample(10, 2) + 21.290716894247602 + """ + return _simplify(_get_rng().gamma(shape, scale, samples))
+ + + +
+[docs] +def pareto_sample(shape, samples=1): + """ + Sample a random number according to a pareto distribution. + + Parameters + ---------- + shape : float + The shape value of the pareto distribution. + + Returns + ------- + int + A random number sampled from an pareto distribution. + + Examples + -------- + >>> set_seed(42) + >>> pareto_sample(1) + 10.069666324736094 + """ + return _simplify(_get_rng().pareto(shape, samples))
+ + + +
+[docs] +def uniform_sample(low, high, samples=1): + """ + Sample a random number according to a uniform distribution. + + Parameters + ---------- + low : float + The smallest value the uniform distribution will return. + high : float + The largest value the uniform distribution will return. + samples : int + The number of samples to return. + + Returns + ------- + float + A random number sampled from a uniform distribution between + ```low``` and ```high```. + + Examples + -------- + >>> set_seed(42) + >>> uniform_sample(0, 1) + 0.7739560485559633 + """ + return _simplify(_get_rng().uniform(low, high, samples))
+ + + +
+[docs] +def chi_square_sample(df, samples=1): + """ + Sample a random number according to a chi-square distribution. + + Parameters + ---------- + df : float + The number of degrees of freedom + samples : int + The number of samples to return. + + Returns + ------- + float + A random number sampled from a chi-square distribution. + + Examples + -------- + >>> set_seed(42) + >>> chi_square_sample(2) + 4.808417207931989 + """ + return _simplify(_get_rng().chisquare(df, samples))
+ + + +
+[docs] +def discrete_sample(items, samples=1, verbose=False, _multicore_tqdm_n=1, _multicore_tqdm_cores=1): + """ + Sample a random value from a discrete distribution (aka categorical distribution). + + Parameters + ---------- + items : list or dict + The values that the discrete distribution will return and their associated + weights (or likelihoods of being returned when sampled). + samples : int + The number of samples to return. + verbose : bool + If True, will print out statements on computational progress. + _multicore_tqdm_n : int + The total number of samples to use for printing tqdm's interface. This is meant to only + be used internally by squigglepy to make the progress bar printing work well for + multicore. This parameter can be safely ignored by the user. + _multicore_tqdm_cores : int + The total number of cores to use for printing tqdm's interface. This is meant to only + be used internally by squigglepy to make the progress bar printing work well for + multicore. This parameter can be safely ignored by the user. + + Returns + ------- + Various, based on items in ``items`` + + Examples + -------- + >>> set_seed(42) + >>> # 10% chance of returning 0, 90% chance of returning 1 + >>> discrete_sample({0: 0.1, 1: 0.9}) + 1 + >>> discrete_sample([[0.1, 0], [0.9, 1]]) # Different notation for the same thing. + 1 + >>> # When no weights are given, all have equal chance of happening. + >>> discrete_sample([0, 1, 2]) + 2 + >>> discrete_sample({'a': 0.1, 'b': 0.9}) # Values do not have to be numbers. + 'b' + """ + weights, values = _process_discrete_weights_values(items) + + values = [const(v) for v in values] + + return mixture_sample( + values=values, + weights=weights, + samples=samples, + verbose=verbose, + _multicore_tqdm_n=_multicore_tqdm_n, + _multicore_tqdm_cores=_multicore_tqdm_cores, + )
+ + + +
+[docs] +def geometric_sample(p, samples=1): + """ + Sample a random number according to a geometric distribution. + + Parameters + ---------- + p : float + The probability of success of an individual trial. Must be between 0 and 1. + samples : int + The number of samples to return. + + Returns + ------- + int + A random number sampled from a geometric distribution. + + Examples + -------- + >>> set_seed(42) + >>> geometric_sample(0.1) + 2 + """ + return _simplify(_get_rng().geometric(p, samples))
+ + + +def _mixture_sample_for_large_n( + values, + weights=None, + relative_weights=None, + samples=1, + verbose=False, + _multicore_tqdm_n=1, + _multicore_tqdm_cores=1, +): + def _run_presample(dist, pbar): + _tick_tqdm(pbar) + return _enlist(sample(dist, n=samples)) + + pbar = _init_tqdm(verbose=verbose, total=len(values)) + values = [_run_presample(v, pbar) for v in values] + _flush_tqdm(pbar) + + def _run_mixture(picker, i, pbar): + _tick_tqdm(pbar, _multicore_tqdm_cores) + index = bisect.bisect_left(weights, picker) + return values[index][i] + + weights = np.cumsum(weights) + picker = uniform_sample(0, 1, samples=samples) + + tqdm_samples = samples if _multicore_tqdm_cores == 1 else _multicore_tqdm_n + pbar = _init_tqdm(verbose=verbose, total=tqdm_samples) + out = _simplify([_run_mixture(p, i, pbar) for i, p in enumerate(_enlist(picker))]) + _flush_tqdm(pbar) + + return out + + +def _mixture_sample_for_small_n( + values, + weights=None, + relative_weights=None, + samples=1, + verbose=False, + _multicore_tqdm_n=1, + _multicore_tqdm_cores=1, +): + def _run_mixture(values, weights, pbar=None, tick=1): + r_ = uniform_sample(0, 1) + _tick_tqdm(pbar, tick) + for i, dist in enumerate(values): + weight = weights[i] + if r_ <= weight: + return sample(dist) + return sample(dist) + + weights = np.cumsum(weights) + tqdm_samples = samples if _multicore_tqdm_cores == 1 else _multicore_tqdm_n + pbar = _init_tqdm(verbose=verbose, total=tqdm_samples) + out = _simplify( + [ + _run_mixture(values=values, weights=weights, pbar=pbar, tick=_multicore_tqdm_cores) + for _ in range(samples) + ] + ) + _flush_tqdm(pbar) + return out + + +
+[docs] +def mixture_sample( + values, + weights=None, + relative_weights=None, + samples=1, + verbose=False, + _multicore_tqdm_n=1, + _multicore_tqdm_cores=1, +): + """ + Sample a ranom number from a mixture distribution. + + Parameters + ---------- + values : list or dict + The distributions to mix. Can also be defined as a list of weights and distributions. + weights : list or None + The weights for each distribution. + relative_weights : list or None + Relative weights, which if given will be weights that are normalized + to sum to 1. + samples : int + The number of samples to return. + verbose : bool + If True, will print out statements on computational progress. + _multicore_tqdm_n : int + The total number of samples to use for printing tqdm's interface. This is meant to only + be used internally by squigglepy to make the progress bar printing work well for + multicore. This parameter can be safely ignored by the user. + _multicore_tqdm_cores : int + The total number of cores to use for printing tqdm's interface. This is meant to only + be used internally by squigglepy to make the progress bar printing work well for + multicore. This parameter can be safely ignored by the user. + + Returns + ------- + Various, based on items in ``values`` + + Examples + -------- + >>> set_seed(42) + >>> mixture_sample([norm(1, 2), norm(3, 4)], weights=[0.1, 0.9]) + 3.183867278765718 + >>> # Different notation for the same thing. + >>> mixture_sample([[0.1, norm(1, 2)], [0.9, norm(3, 4)]]) + 3.7859113725925972 + >>> # When no weights are given, all have equal chance of happening. + >>> mixture_sample([norm(1, 2), norm(3, 4)]) + 1.1041655362137777 + """ + weights, values = _process_weights_values(weights, relative_weights, values) + + if len(values) == 1: + return sample(values[0], n=samples) + + if samples > 100: + return _mixture_sample_for_large_n( + values=values, + weights=weights, + samples=samples, + verbose=verbose, + _multicore_tqdm_n=_multicore_tqdm_n, + _multicore_tqdm_cores=_multicore_tqdm_cores, + ) + else: + return _mixture_sample_for_small_n( + values=values, + weights=weights, + samples=samples, + verbose=verbose, + _multicore_tqdm_n=_multicore_tqdm_n, + _multicore_tqdm_cores=_multicore_tqdm_cores, + )
+ + + +
+[docs] +def sample_correlated_group( + requested_dist: BaseDistribution, n: int, verbose=False +) -> NDArray[np.float64]: + """ + Samples a correlated distribution, alongside + all other correlated distributions in the same group. + + The samples for other variables are stored in the distributions themselves + (in `_correlated_samples`). + + This is necessary, because the sampling needs to happen all at once, regardless + of where the distributions are used in the binary tree of operations. + """ + group = requested_dist.correlation_group + assert group is not None + + samples = np.column_stack( + [ + # Skip correlation to prevent infinite recursion + # TODO: Check that this does not interfere + # with other correlated distributions downstream + sample(dist, n, verbose=verbose, _correlate_if_needed=False) + for dist in group.correlated_dists + ] + ) + # Induce correlation + samples = group.induce_correlation(samples) + + # Store the samples in each distribution + # except the one we are sampling from + # so it requires resampling next time + requested_samples = None + for i, target_distribution in enumerate(group.correlated_dists): + if requested_dist is not target_distribution: + # Store the samples in the distribution + target_distribution._correlated_samples = samples[:, i] + else: + # Store the samples we requested + requested_samples = samples[:, i] + + assert requested_samples is not None + + return requested_samples
+ + + +
+[docs] +def sample( + dist=None, + n=1, + lclip=None, + rclip=None, + memcache=False, + reload_cache=False, + dump_cache_file=None, + load_cache_file=None, + cache_file_primary=False, + verbose=None, + cores=1, + _multicore_tqdm_n=1, + _multicore_tqdm_cores=1, + _correlate_if_needed=True, +): + """ + Sample random numbers from a given distribution. + + Parameters + ---------- + dist : Distribution + The distribution to sample random number from. + n : int + The number of random numbers to sample from the distribution. Default to 1. + lclip : float or None + If not None, any value below ``lclip`` will be coerced to ``lclip``. + rclip : float or None + If not None, any value below ``rclip`` will be coerced to ``rclip``. + memcache : bool + If True, will attempt to load the results in-memory for future calculations if + a cache is present. Otherwise will save the results to an in-memory cache. Each cache + will be matched based on ``dist``. Default ``False``. + reload_cache : bool + If True, any existing cache will be ignored and recalculated. Default ``False``. + dump_cache_file : str or None + If present, will write out the cache to a numpy file with this path with + ``.sqlcache.npy`` appended to the file name. + load_cache_file : str or None + If present, will first attempt to load and use a cache from a file with this + path with ``.sqlcache.npy`` appended to the file name. + cache_file_primary : bool + If both an in-memory cache and file cache are present, the file + cache will be used for the cache if this is True, and the in-memory cache + will be used otherwise. Defaults to False. + verbose : bool + If True, will print out statements on computational progress. If False, will not. + If None (default), will be True when ``n`` is greater than or equal to 1M. + cores : int + If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing + pool with that many cores / processes. + _multicore_tqdm_n : int + The total number of samples to use for printing tqdm's interface. This is meant to only + be used internally by squigglepy to make the progress bar printing work well for + multicore. This parameter can be safely ignored by the user. + _multicore_tqdm_cores : int + The total number of cores to use for printing tqdm's interface. This is meant to only + be used internally by squigglepy to make the progress bar printing work well for + multicore. This parameter can be safely ignored by the user. + + Returns + ------- + Various, based on ``dist``. + + Examples + -------- + >>> set_seed(42) + >>> sample(norm(1, 2)) + 1.592627415218455 + >>> sample(mixture([norm(1, 2), norm(3, 4)])) + 1.7281209657534462 + >>> sample(lognorm(1, 10), n=5, lclip=3) + array([6.10817361, 3. , 3. , 3.45828454, 3. ]) + """ + n = int(n) + if n <= 0: + raise ValueError("n must be >= 1") + + if not is_sampleable(dist): + error = "input to sample is malformed - {} is not a sampleable type.".format(type(dist)) + raise ValueError(error) + + if verbose is None: + verbose = n >= 1000000 + + # Handle loading from cache + samples = None + has_in_mem_cache = str(dist) in _squigglepy_internal_sample_caches + if load_cache_file: + cache_path = load_cache_file + ".sqcache.npy" + has_file_cache = os.path.exists(cache_path) if load_cache_file else False + + if load_cache_file and not has_file_cache and verbose: + print("Warning: cache file `{}.sqcache.npy` not found.".format(load_cache_file)) + + if (load_cache_file or memcache) and not reload_cache: + if load_cache_file and has_file_cache and (not has_in_mem_cache or cache_file_primary): + if verbose: + print("Loading from cache file (`{}`)...".format(cache_path)) + with open(cache_path, "rb") as f: + samples = np.load(f) + + elif memcache and has_in_mem_cache: + if verbose: + print("Loading from in-memory cache...") + samples = _squigglepy_internal_sample_caches.get(str(dist)) + + # Handle multicore + if samples is None and cores > 1: + if verbose: + print("Generating samples with {} cores...".format(cores)) + with mp.ProcessingPool(cores) as pool: + cuts = _core_cuts(n, cores) + + def multicore_sample(core, total_n=n, total_cores=cores, verbose=False): + batch = sample( + dist=dist, + n=cuts[core], + _multicore_tqdm_n=total_n, + _multicore_tqdm_cores=total_cores, + lclip=lclip, + rclip=rclip, + memcache=False, + verbose=verbose, + cores=1, + ) + if verbose: + print("Shuffling data...") + with open("test-core-{}.npy".format(core), "wb") as f: + np.save(f, batch) + return None + + pool_results = pool.amap(multicore_sample, range(cores - 1)) + multicore_sample(cores - 1, verbose=verbose) + if verbose: + print("Waiting for other cores...") + while not pool_results.ready(): + if verbose: + print(".", end="", flush=True) + time.sleep(1) + + if verbose: + print("Collecting data...") + samples = np.array([]) + pbar = _init_tqdm(verbose=verbose, total=cores) + for core in range(cores): + with open("test-core-{}.npy".format(core), "rb") as f: + samples = np.concatenate((samples, np.load(f, allow_pickle=True)), axis=None) + os.remove("test-core-{}.npy".format(core)) + _tick_tqdm(pbar, 1) + _flush_tqdm(pbar) + if verbose: + print("...Collected!") + + # Handle lclip/rclip + if samples is None: + lclip_ = None + rclip_ = None + if is_dist(dist): + lclip_ = dist.lclip + rclip_ = dist.rclip + + if lclip is None and lclip_ is not None: + lclip = lclip_ + elif lclip is not None and lclip_ is not None: + lclip = max(lclip, lclip_) + + if rclip is None and rclip_ is not None: + rclip = rclip_ + elif rclip is not None and rclip_ is not None: + rclip = min(rclip, rclip_) + + # Start sampling + if samples is None: + if callable(dist): + if n > 1: + + def run_dist(dist, pbar=None, tick=1): + dist = dist() + _tick_tqdm(pbar, tick) + return dist + + tqdm_samples = n if _multicore_tqdm_cores == 1 else _multicore_tqdm_n + pbar = _init_tqdm(verbose=verbose, total=tqdm_samples) + out = np.array( + [run_dist(dist=dist, pbar=pbar, tick=_multicore_tqdm_cores) for _ in range(n)] + ) + _flush_tqdm(pbar) + else: + out = [dist()] + + def run_dist(dist, pbar=None, tick=1): + samp = sample(dist) if is_dist(dist) or callable(dist) else dist + _tick_tqdm(pbar, tick) + return samp + + pbar = _init_tqdm(verbose=verbose, total=len(out) * _multicore_tqdm_cores) + samples = _simplify( + np.array([run_dist(dist=o, pbar=pbar, tick=_multicore_tqdm_cores) for o in out]) + ) + _flush_tqdm(pbar) + + elif ( + isinstance(dist, float) + or isinstance(dist, int) + or isinstance(dist, str) + or dist is None + ): + samples = _simplify(np.array([dist for _ in range(n)])) + + # Distribution is part of a correlation group + # and has not been sampled yet + elif ( + isinstance(dist, BaseDistribution) + and _correlate_if_needed + and dist.correlation_group is not None + and dist._correlated_samples is None + ): + # Samples the entire correlated group at once + samples = sample_correlated_group(dist, n=n, verbose=verbose) + + # Distribution has already been sampled + # as part of a correlation group + elif ( + isinstance(dist, BaseDistribution) + and _correlate_if_needed + and dist.correlation_group is not None + and dist._correlated_samples is not None + ): + samples = dist._correlated_samples + # This forces the distribution to be resampled + # if the user attempts to sample from it again + dist._correlated_samples = None + + elif isinstance(dist, ConstantDistribution): + samples = _simplify(np.array([dist.x for _ in range(n)])) + + elif isinstance(dist, UniformDistribution): + samples = uniform_sample(dist.x, dist.y, samples=n) + + elif isinstance(dist, CategoricalDistribution): + samples = discrete_sample( + dist.items, + samples=n, + _multicore_tqdm_n=_multicore_tqdm_n, + _multicore_tqdm_cores=_multicore_tqdm_cores, + ) + + elif isinstance(dist, NormalDistribution): + samples = normal_sample(mean=dist.mean, sd=dist.sd, samples=n) + + elif isinstance(dist, LognormalDistribution): + samples = lognormal_sample(mean=dist.norm_mean, sd=dist.norm_sd, samples=n) + + elif isinstance(dist, BinomialDistribution): + samples = binomial_sample(n=dist.n, p=dist.p, samples=n) + + elif isinstance(dist, BetaDistribution): + samples = beta_sample(a=dist.a, b=dist.b, samples=n) + + elif isinstance(dist, BernoulliDistribution): + samples = bernoulli_sample(p=dist.p, samples=n) + + elif isinstance(dist, PoissonDistribution): + samples = poisson_sample(lam=dist.lam, samples=n) + + elif isinstance(dist, ChiSquareDistribution): + samples = chi_square_sample(df=dist.df, samples=n) + + elif isinstance(dist, ExponentialDistribution): + samples = exponential_sample(scale=dist.scale, samples=n) + + elif isinstance(dist, GammaDistribution): + samples = gamma_sample(shape=dist.shape, scale=dist.scale, samples=n) + + elif isinstance(dist, ParetoDistribution): + samples = pareto_sample(shape=dist.shape, samples=n) + + elif isinstance(dist, TriangularDistribution): + samples = triangular_sample(dist.left, dist.mode, dist.right, samples=n) + + elif isinstance(dist, PERTDistribution): + samples = pert_sample(dist.left, dist.mode, dist.right, dist.lam, samples=n) + + elif isinstance(dist, TDistribution): + samples = t_sample(dist.x, dist.y, dist.t, credibility=dist.credibility, samples=n) + + elif isinstance(dist, LogTDistribution): + samples = log_t_sample(dist.x, dist.y, dist.t, credibility=dist.credibility, samples=n) + + elif isinstance(dist, MixtureDistribution): + samples = mixture_sample( + dist.dists, + dist.weights, + samples=n, + verbose=verbose, + _multicore_tqdm_n=_multicore_tqdm_n, + _multicore_tqdm_cores=_multicore_tqdm_cores, + ) + + elif isinstance(dist, GeometricDistribution): + samples = geometric_sample(p=dist.p, samples=n) + + elif isinstance(dist, ComplexDistribution): + if dist.right is None: + samples = dist.fn(sample(dist.left, n=n, verbose=verbose)) + else: + samples = dist.fn( + sample(dist.left, n=n, verbose=verbose), + sample(dist.right, n=n, verbose=verbose), + ) + + if is_dist(samples) or callable(samples): + samples = sample(samples, n=n) + + else: + raise ValueError("{} sampler not found".format(type(dist))) + + # Use lclip / rclip + if _safe_len(samples) > 1: + if lclip is not None: + samples = np.maximum(samples, lclip) + if rclip is not None: + samples = np.minimum(samples, rclip) + else: + if lclip is not None: + samples = lclip if samples < lclip else samples + if rclip is not None: + samples = rclip if samples > rclip else samples + + # Save to cache + if memcache and (not has_in_mem_cache or reload_cache): + if verbose: + print("Caching in-memory...") + _squigglepy_internal_sample_caches[str(dist)] = samples + if verbose: + print("...Cached") + + if dump_cache_file: + cache_path = dump_cache_file + ".sqcache.npy" + if verbose: + print("Writing cache to file `{}`...".format(cache_path)) + with open(cache_path, "wb") as f: + np.save(f, samples) + if verbose: + print("...Cached") + + # Return + return np.array(samples) if isinstance(samples, list) else samples
+ +
+ +
+ + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/_modules/squigglepy/utils.html b/docs/build/html/_modules/squigglepy/utils.html new file mode 100644 index 0000000..14ac1bf --- /dev/null +++ b/docs/build/html/_modules/squigglepy/utils.html @@ -0,0 +1,1628 @@ + + + + + + + + + + squigglepy.utils — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +

Source code for squigglepy.utils

+import math
+import numpy as np
+
+from tqdm import tqdm
+from datetime import datetime
+from collections import Counter
+from collections.abc import Iterable
+
+import importlib
+import importlib.util
+import sys
+
+
+def _check_pandas_series(values):
+    """Check if values is a pandas series. Only imports pandas if necessary."""
+    if "pandas" not in sys.modules:
+        return False
+
+    pd = importlib.import_module("pandas")
+    return isinstance(values, pd.core.series.Series)
+
+
+def _process_weights_values(weights=None, relative_weights=None, values=None, drop_na=False):
+    if weights is not None and relative_weights is not None:
+        raise ValueError("can only pass either `weights` or `relative_weights`, not both.")
+    if values is None or _safe_len(values) == 0:
+        raise ValueError("must pass `values`")
+
+    relative = False
+    if relative_weights is not None:
+        weights = relative_weights
+        relative = True
+
+    if isinstance(weights, float):
+        weights = [weights]
+    elif isinstance(weights, np.ndarray):
+        weights = list(weights)
+    elif weights is not None and not _is_iterable(weights):
+        raise ValueError("passed weights must be an iterable")
+
+    if isinstance(values, np.ndarray):
+        values = list(values)
+    elif _check_pandas_series(values):
+        values = values.values.tolist()
+    elif isinstance(values, dict):
+        if weights is None:
+            weights = list(values.values())
+            values = list(values.keys())
+        else:
+            raise ValueError("cannot pass dict and weights separately")
+    elif values is not None and not _is_iterable(values):
+        raise ValueError("passed values must be an iterable")
+
+    if weights is None:
+        if isinstance(values[0], list) and len(values[0]) == 2:
+            weights = [v[0] for v in values]
+            values = [v[1] for v in values]
+            if drop_na and any([_is_na_like(v) for v in values]):
+                raise ValueError("cannot drop NA and process weights")
+        else:
+            if drop_na:
+                values = [v for v in values if not _is_na_like(v)]
+            len_ = len(values)
+            weights = [1 / len_ for _ in range(len_)]
+    elif drop_na and any([_is_na_like(v) for v in values]):
+        raise ValueError("cannot drop NA and process weights")
+
+    if any([_is_na_like(w) for w in weights]):
+        raise ValueError("cannot handle NA-like values in weights")
+    sum_weights = sum(weights)
+
+    if relative:
+        weights = normalize(weights)
+    else:
+        if len(weights) == len(values) - 1 and sum_weights < 1:
+            weights.append(1 - sum_weights)
+        elif sum_weights <= 0.99 or sum_weights >= 1.01:
+            raise ValueError("weights don't sum to 1 -" + " they sum to {}".format(sum_weights))
+
+    if len(weights) != len(values):
+        raise ValueError("weights and values not same length")
+
+    new_weights = []
+    new_values = []
+    for i, w in enumerate(weights):
+        if w < 0:
+            raise ValueError("weight cannot be negative")
+        if w > 0:  # Note that w = 0 is dropped here
+            new_weights.append(w)
+            new_values.append(values[i])
+
+    return new_weights, new_values
+
+
+def _process_discrete_weights_values(items):
+    if (
+        len(items) >= 100
+        and not isinstance(items, dict)
+        and not isinstance(items[0], list)
+        and _safe_len(_safe_set(items)) < _safe_len(items)
+    ):
+        vcounter = Counter(items)
+        sumv = sum([v for k, v in vcounter.items()])
+        items = {k: v / sumv for k, v in vcounter.items()}
+
+    return _process_weights_values(values=items)
+
+
+def _is_numpy(a):
+    return type(a).__module__ == np.__name__
+
+
+def _is_iterable(a):
+    iterx = isinstance(a, dict) or isinstance(a, Iterable)
+    return iterx and not isinstance(a, str)
+
+
+def _is_na_like(a):
+    return a is None or np.isnan(a)
+
+
+def _round(x, digits=0):
+    if digits is None:
+        return x
+
+    x = np.round(x, digits)
+
+    if _safe_len(x) > 1:
+        return np.array([int(y) if digits == 0 else y for y in x])
+    else:
+        return int(x) if digits <= 0 else x
+
+
+def _simplify(a):
+    if _is_numpy(a):
+        a = a.tolist() if a.size == 1 else a
+    if isinstance(a, list):
+        a = a[0] if len(a) == 1 else a
+    return a
+
+
+def _enlist(a):
+    if _is_numpy(a) and isinstance(a, np.ndarray):
+        return a.tolist()
+    elif _is_iterable(a):
+        return a
+    else:
+        return [a]
+
+
+def _safe_len(a):
+    if _is_numpy(a):
+        return a.size
+    elif is_dist(a):
+        return 1
+    elif isinstance(a, list):
+        return len(a)
+    elif a is None:
+        return 0
+    else:
+        return 1
+
+
+def _safe_set(a):
+    if _is_numpy(a):
+        return set(_enlist(a))
+    elif is_dist(a):
+        return a
+    elif isinstance(a, list):
+        try:
+            return set(a)
+        except TypeError:
+            return a
+    elif a is None:
+        return None
+    else:
+        return a
+
+
+def _core_cuts(n, cores):
+    cuts = [math.floor(n / cores) for _ in range(cores)]
+    delta = n - sum(cuts)
+    cuts[-1] += delta
+    return cuts
+
+
+def _init_tqdm(verbose=True, total=None):
+    if verbose:
+        return tqdm(total=total)
+    else:
+        return None
+
+
+def _tick_tqdm(pbar, tick_size=1):
+    if pbar:
+        pbar.update(tick_size)
+    return pbar
+
+
+def _flush_tqdm(pbar):
+    if pbar is not None:
+        pbar.close()
+    return pbar
+
+
+
+[docs] +def is_dist(obj): + """ + Test if a given object is a Squigglepy distribution. + + Parameters + ---------- + obj : object + The object to test. + + Returns + ------- + bool + True, if the object is a distribution. False if not. + + Examples + -------- + >>> is_dist(norm(0, 1)) + True + >>> is_dist(0) + False + """ + from .distributions import BaseDistribution + + return isinstance(obj, BaseDistribution)
+ + + +
+[docs] +def is_continuous_dist(obj): + from .distributions import ( + ContinuousDistribution, + CompositeDistribution, + ComplexDistribution, + MixtureDistribution, + ) + + if isinstance(obj, ContinuousDistribution): + return True + elif isinstance(obj, CompositeDistribution): + if isinstance(obj, ComplexDistribution): + return is_continuous_dist(obj.left) and is_continuous_dist(obj.right) + elif isinstance(obj, MixtureDistribution): + return all([is_continuous_dist(d) for d in obj.dists]) + else: + raise ValueError("Unknown composite distribution") + return False
+ + + +
+[docs] +def is_sampleable(obj): + """ + Test if a given object can be sampled from. + + This includes distributions, integers, floats, `None`, + strings, and callables. + + Parameters + ---------- + obj : object + The object to test. + + Returns + ------- + bool + True, if the object can be sampled from. False if not. + + Examples + -------- + >>> is_sampleable(norm(0, 1)) + True + >>> is_sampleable(0) + True + >>> is_sampleable([0, 1]) + False + """ + return ( + is_dist(obj) + or isinstance(obj, int) + or isinstance(obj, float) + or isinstance(obj, str) + or obj is None + or callable(obj) + )
+ + + +
+[docs] +def normalize(lst): + """ + Normalize a list to sum to 1. + + Parameters + ---------- + lst : list + The list to normalize. + + Returns + ------- + list + A list where each value is normalized such that the list sums to 1. + + Examples + -------- + >>> normalize([0.1, 0.2, 0.2]) + [0.2, 0.4, 0.4] + """ + sum_lst = sum(lst) + return [lx / sum_lst for lx in lst]
+ + + +
+[docs] +def event_occurs(p): + """ + Return True with probability ``p`` and False with probability ``1 - p``. + + Parameters + ---------- + p : float + The probability of returning True. Must be between 0 and 1. + + Examples + -------- + >>> set_seed(42) + >>> event_occurs(p=0.5) + False + """ + if is_dist(p) or callable(p): + from .samplers import sample + + p = sample(p) + from .rng import _squigglepy_internal_rng + + return _squigglepy_internal_rng.uniform(0, 1) < p
+ + + +
+[docs] +def event_happens(p): + """ + Return True with probability ``p`` and False with probability ``1 - p``. + + Alias for ``event_occurs``. + + Parameters + ---------- + p : float + The probability of returning True. Must be between 0 and 1. + + Examples + -------- + >>> set_seed(42) + >>> event_happens(p=0.5) + False + """ + return event_occurs(p)
+ + + +
+[docs] +def event(p): + """ + Return True with probability ``p`` and False with probability ``1 - p``. + + Alias for ``event_occurs``. + + Parameters + ---------- + p : float + The probability of returning True. Must be between 0 and 1. + + Returns + ------- + bool + + Examples + -------- + >>> set_seed(42) + >>> event(p=0.5) + False + """ + return event_occurs(p)
+ + + +
+[docs] +def one_in(p, digits=0, verbose=True): + """ + Convert a probability into "1 in X" notation. + + Parameters + ---------- + p : float + The probability to convert. + digits : int + The number of digits to round the result to. Defaults to 0. If ``digits`` + is 0, the result will be converted to int instead of float. + verbose : logical + If True, will return a string with "1 in X". If False, will just return X. + + Returns + ------- + str if ``verbose`` is True. Otherwise, int if ``digits`` is 0 or float if ``digits`` > 0. + + Examples + -------- + >>> one_in(0.1) + "1 in 10" + """ + p = _round(1 / p, digits) + return "1 in {:,}".format(p) if verbose else p
+ + + +
+[docs] +def get_percentiles( + data, + percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], + reverse=False, + digits=None, +): + """ + Print the percentiles of the data. + + Parameters + ---------- + data : list or np.array + The data to calculate percentiles for. + percentiles : list + A list of percentiles to calculate. Must be values between 0 and 100. + reverse : bool + If `True`, the percentile values are reversed (e.g., 95th and 5th percentile + swap values.) + digits : int or None + The number of digits to display (using rounding). + + Returns + ------- + dict + A dictionary of the given percentiles. + + Examples + -------- + >>> get_percentiles(range(100), percentiles=[25, 50, 75]) + {25: 24.75, 50: 49.5, 75: 74.25} + """ + percentiles = percentiles if isinstance(percentiles, list) else [percentiles] + percentile_labels = list(reversed(percentiles)) if reverse else percentiles + percentiles = np.percentile(data, percentiles) + percentiles = [_round(p, digits) for p in percentiles] + if len(percentile_labels) == 1: + return percentiles[0] + else: + return dict(list(zip(percentile_labels, percentiles)))
+ + + +
+[docs] +def get_log_percentiles( + data, + percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], + reverse=False, + display=True, + digits=1, +): + """ + Print the log (base 10) of the percentiles of the data. + + Parameters + ---------- + data : list or np.array + The data to calculate percentiles for. + percentiles : list + A list of percentiles to calculate. Must be values between 0 and 100. + reverse : bool + If True, the percentile values are reversed (e.g., 95th and 5th percentile + swap values.) + display : bool + If True, the function returns an easy to read display. + digits : int or None + The number of digits to display (using rounding). + + Returns + ------- + dict + A dictionary of the given percentiles. If ``display`` is true, will be str values. + Otherwise will be float values. 10 to the power of the value gives the true percentile. + + Examples + -------- + >>> get_percentiles(range(100), percentiles=[25, 50, 75]) + {25: 24.75, 50: 49.5, 75: 74.25} + """ + percentiles = get_percentiles(data, percentiles=percentiles, reverse=reverse, digits=digits) + if isinstance(percentiles, dict): + if display: + return dict( + [(k, ("{:." + str(digits) + "e}").format(v)) for k, v in percentiles.items()] + ) + else: + return dict([(k, _round(np.log10(v), digits)) for k, v in percentiles.items()]) + else: + if display: + digit_str = "{:." + str(digits) + "e}" + digit_str.format(percentiles) + else: + return _round(np.log10(percentiles), digits)
+ + + +
+[docs] +def get_mean_and_ci(data, credibility=90, digits=None): + """ + Return the mean and percentiles of the data. + + Parameters + ---------- + data : list or np.array + The data to calculate the mean and CI for. + credibility : float + The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI. + digits : int or None + The number of digits to display (using rounding). + + Returns + ------- + dict + A dictionary with the mean and CI. + + Examples + -------- + >>> get_mean_and_ci(range(100)) + {'mean': 49.5, 'ci_low': 4.95, 'ci_high': 94.05} + """ + ci_low = (100 - credibility) / 2 + ci_high = 100 - ci_low + percentiles = get_percentiles(data, percentiles=[ci_low, ci_high], digits=digits) + return { + "mean": _round(np.mean(data), digits), + "ci_low": percentiles[ci_low], + "ci_high": percentiles[ci_high], + }
+ + + +
+[docs] +def get_median_and_ci(data, credibility=90, digits=None): + """ + Return the median and percentiles of the data. + + Parameters + ---------- + data : list or np.array + The data to calculate the mean and CI for. + credibility : float + The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI. + digits : int or None + The number of digits to display (using rounding). + + Returns + ------- + dict + A dictionary with the median and CI. + + Examples + -------- + >>> get_median_and_ci(range(100)) + {'mean': 49.5, 'ci_low': 4.95, 'ci_high': 94.05} + """ + ci_low = (100 - credibility) / 2 + ci_high = 100 - ci_low + percentiles = get_percentiles(data, percentiles=[ci_low, 50, ci_high], digits=digits) + return { + "median": percentiles[50], + "ci_low": percentiles[ci_low], + "ci_high": percentiles[ci_high], + }
+ + + +
+[docs] +def geomean(a, weights=None, relative_weights=None, drop_na=True): + """ + Calculate the geometric mean. + + Parameters + ---------- + a : list or np.array + The values to calculate the geometric mean of. + weights : list or None + The weights, if a weighted geometric mean is desired. + relative_weights : list or None + Relative weights, which if given will be weights that are normalized + to sum to 1. + drop_na : boolean + Should NA-like values be dropped when calculating the geomean? + + Returns + ------- + float + + Examples + -------- + >>> geomean([1, 3, 10]) + 3.1072325059538595 + """ + weights, a = _process_weights_values(weights, relative_weights, a, drop_na=drop_na) + log_a = np.log(a) + return np.exp(np.average(log_a, weights=weights))
+ + + +
+[docs] +def p_to_odds(p): + """ + Calculate the decimal odds from a given probability. + + Parameters + ---------- + p : float + The probability to calculate decimal odds for. Must be between 0 and 1. + + Returns + ------- + float + Decimal odds + + Examples + -------- + >>> p_to_odds(0.1) + 0.1111111111111111 + """ + + def _convert(p): + if _is_na_like(p): + return p + if p <= 0 or p >= 1: + raise ValueError("p must be between 0 and 1") + return p / (1 - p) + + return _simplify(np.array([_convert(p) for p in _enlist(p)]))
+ + + +
+[docs] +def odds_to_p(odds): + """ + Calculate the probability from given decimal odds. + + Parameters + ---------- + odds : float + The decimal odds to calculate the probability for. + + Returns + ------- + float + Probability + + Examples + -------- + >>> odds_to_p(0.1) + 0.09090909090909091 + """ + + def _convert(o): + if _is_na_like(o): + return o + if o <= 0: + raise ValueError("odds must be greater than 0") + return o / (1 + o) + + return _simplify(np.array([_convert(o) for o in _enlist(odds)]))
+ + + +
+[docs] +def geomean_odds(a, weights=None, relative_weights=None, drop_na=True): + """ + Calculate the geometric mean of odds. + + Parameters + ---------- + a : list or np.array + The probabilities to calculate the geometric mean of. These are converted to odds + before the geometric mean is taken.. + weights : list or None + The weights, if a weighted geometric mean is desired. + relative_weights : list or None + Relative weights, which if given will be weights that are normalized + to sum to 1. + drop_na : boolean + Should NA-like values be dropped when calculating the geomean? + + Returns + ------- + float + + Examples + -------- + >>> geomean_odds([0.1, 0.3, 0.9]) + 0.42985748800076845 + """ + weights, a = _process_weights_values(weights, relative_weights, a, drop_na=drop_na) + return odds_to_p(geomean(p_to_odds(a), weights=weights))
+ + + +
+[docs] +def laplace(s, n=None, time_passed=None, time_remaining=None, time_fixed=False): + """ + Return probability of success on next trial given Laplace's law of succession. + + Also can be used to calculate a time-invariant version defined in + https://www.lesswrong.com/posts/wE7SK8w8AixqknArs/a-time-invariant-version-of-laplace-s-rule + + Parameters + ---------- + s : int + The number of successes among ``n`` past trials or among ``time_passed`` amount of time. + n : int or None + The number of trials that contain the successes (and/or failures). Leave as None if + time-invariant mode is desired. + time_passed : float or None + The amount of time that has passed when the successes (and/or failures) occured for + calculating a time-invariant Laplace. + time_remaining : float or None + We are calculating the likelihood of observing at least one success over this time + period. + time_fixed : bool + This should be False if the time period is variable - that is, if the time period + was chosen specifically to include the most recent success. Otherwise the time period + is fixed and this should be True. Defaults to False. + + Returns + ------- + float + The probability of at least one success in the next trial or ``time_remaining`` amount + of time. + + Examples + -------- + >>> # The sun has risen the past 100,000 days. What are the odds it rises again tomorrow? + >>> laplace(s=100*K, n=100*K) + 0.999990000199996 + >>> # The last time a nuke was used in war was 77 years ago. What are the odds a nuke + >>> # is used in the next year, not considering any information other than this naive prior? + >>> laplace(s=1, time_passed=77, time_remaining=1, time_fixed=False) + 0.012820512820512664 + """ + if n is not None and s > n: + raise ValueError("`s` cannot be greater than `n`") + elif time_passed is None and time_remaining is None and n is not None: + return (s + 1) / (n + 2) + elif time_passed is not None and time_remaining is not None and s == 0: + return 1 - ((1 + time_remaining / time_passed) ** -1) + elif time_passed is not None and time_remaining is not None and s > 0 and not time_fixed: + return 1 - ((1 + time_remaining / time_passed) ** -s) + elif time_passed is not None and time_remaining is not None and s > 0 and time_fixed: + return 1 - ((1 + time_remaining / time_passed) ** -(s + 1)) + elif time_passed is not None and time_remaining is None and s == 0: + return 1 - ((1 + 1 / time_passed) ** -1) + elif time_passed is not None and time_remaining is None and s > 0 and not time_fixed: + return 1 - ((1 + 1 / time_passed) ** -s) + elif time_passed is not None and time_remaining is None and s > 0 and time_fixed: + return 1 - ((1 + 1 / time_passed) ** -(s + 1)) + elif time_passed is None and n is None: + raise ValueError("Must define `time_passed` or `n`") + elif time_passed is None and time_remaining is not None: + raise ValueError("Must define `time_passed`") + else: + raise ValueError("Fatal logic error - programmer made mistake!")
+ + + +
+[docs] +def growth_rate_to_doubling_time(growth_rate): + """ + Convert a positive growth rate to a doubling rate. + + Growth rate must be expressed as a number, numpy array or distribution + where 0.05 means +5% to a doubling time. The time unit remains the same, so if we've + got +5% annual growth, the returned value is the doubling time in years. + + NOTE: This only works works for numbers, arrays and distributions where all numbers + are above 0. (Otherwise it makes no sense to talk about doubling times.) + + Parameters + ---------- + growth_rate : float or np.array or BaseDistribution + The growth rate expressed as a fraction (the percentage divided by 100). + + Returns + ------- + float or np.array or ComplexDistribution + Returns the doubling time. + + Examples + -------- + >>> growth_rate_to_doubling_time(0.01) + 69.66071689357483 + """ + if is_dist(growth_rate): + from .distributions import dist_log + + return math.log(2) / dist_log(1.0 + growth_rate) + elif _is_numpy(growth_rate): + return np.log(2) / np.log(1.0 + growth_rate) + else: + return math.log(2) / math.log(1.0 + growth_rate)
+ + + +
+[docs] +def doubling_time_to_growth_rate(doubling_time): + """ + Convert a doubling time to a growth rate. + + Doubling time is expressed as a number, numpy array or distribution in any + time unit. Growth rate is set where e.g. 0.05 means +5%. The time unit remains the + same, so if we've got a doubling time of 2 years, the returned value is the annual + growth rate. + + NOTE: This only works works for numbers, arrays and distributions where all numbers + are above 0. (Otherwise it makes no sense to talk about doubling times.) + + Parameters + ---------- + doubling_time : float or np.array or BaseDistribution + The doubling time expressed in any time unit. + + Returns + ------- + float or np.array or ComplexDistribution + Returns the growth rate expressed as a fraction (the percentage divided by 100). + + Examples + -------- + >>> doubling_time_to_growth_rate(12) + 0.05946309435929531 + """ + if is_dist(doubling_time): + from .distributions import dist_exp + + return dist_exp(math.log(2) / doubling_time) - 1 + elif _is_numpy(doubling_time): + return np.exp(np.log(2) / doubling_time) - 1 + else: + return math.exp(math.log(2) / doubling_time) - 1
+ + + +
+[docs] +def roll_die(sides, n=1): + """ + Roll a die. + + Parameters + ---------- + sides : int + The number of sides of the die that is rolled. + n : int + The number of dice to be rolled. + + Returns + ------- + int or list + Returns the value of each die roll. + + Examples + -------- + >>> set_seed(42) + >>> roll_die(6) + 5 + """ + if is_dist(sides) or callable(sides): + from .samplers import sample + + sides = sample(sides) + if not isinstance(n, int): + raise ValueError("can only roll an integer number of times") + elif sides < 2: + raise ValueError("cannot roll less than a 2-sided die.") + elif not isinstance(sides, int): + raise ValueError("can only roll an integer number of sides") + else: + from .samplers import sample + from .distributions import discrete + + return sample(discrete(list(range(1, sides + 1))), n=n) if sides > 0 else None
+ + + +
+[docs] +def flip_coin(n=1): + """ + Flip a coin. + + Parameters + ---------- + n : int + The number of coins to be flipped. + + Returns + ------- + str or list + Returns the value of each coin flip, as either "heads" or "tails" + + Examples + -------- + >>> set_seed(42) + >>> flip_coin() + 'heads' + """ + rolls = roll_die(2, n=n) + if isinstance(rolls, int): + rolls = [rolls] + flips = ["heads" if d == 2 else "tails" for d in rolls] + return flips[0] if len(flips) == 1 else flips
+ + + +
+[docs] +def kelly(my_price, market_price, deference=0, bankroll=1, resolve_date=None, current=0): + """ + Calculate the Kelly criterion. + + Parameters + ---------- + my_price : float + The price (or probability) you give for the given event. + market_price : float + The price the market is giving for that event. + deference : float + How much deference (or weight) do you give the market price? Use 0.5 for half Kelly + and 0.75 for quarter Kelly. Defaults to 0, which is full Kelly. + bankroll : float + How much money do you have to bet? Defaults to 1. + resolve_date : str or None + When will the event happen, the market resolve, and you get your money back? Used for + calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means + ARR is not calculated. + current : float + How much do you already have invested in this event? Used for calculating the + additional amount you should invest. Defaults to 0. + + Returns + ------- + dict + A dict of values specifying: + * ``my_price`` + * ``market_price`` + * ``deference`` + * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken + into account. + * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``. + * ``adj_delta_price`` : the absolute difference between ``adj_price`` and + ``market_price``. + * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll`` + you should bet. + * ``target`` : the target amount of money you should have invested + * ``current`` + * ``delta`` : the amount of money you should invest given what you already + have invested + * ``max_gain`` : the amount of money you would gain if you win + * ``modeled_gain`` : the expected value you would win given ``adj_price`` + * ``expected_roi`` : the expected return on investment + * ``expected_arr`` : the expected ARR given ``resolve_date`` + * ``resolve_date`` + + Examples + -------- + >>> kelly(my_price=0.7, market_price=0.4, deference=0.5, bankroll=100) + {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.5, 'adj_price': 0.55, + 'delta_price': 0.3, 'adj_delta_price': 0.15, 'kelly': 0.25, 'target': 25.0, + 'current': 0, 'delta': 25.0, 'max_gain': 62.5, 'modeled_gain': 23.13, + 'expected_roi': 0.375, 'expected_arr': None, 'resolve_date': None} + """ + if market_price >= 1 or market_price <= 0: + raise ValueError("market_price must be >0 and <1") + if my_price >= 1 or my_price <= 0: + raise ValueError("my_price must be >0 and <1") + if deference > 1 or deference < 0: + raise ValueError("deference must be >=0 and <=1") + adj_price = my_price * (1 - deference) + market_price * deference + kelly = np.abs(adj_price - ((1 - adj_price) * (market_price / (1 - market_price)))) + target = bankroll * kelly + expected_roi = np.abs((adj_price / market_price) - 1) + if resolve_date is None: + expected_arr = None + else: + resolve_date = datetime.strptime(resolve_date, "%Y-%m-%d") + expected_arr = ((expected_roi + 1) ** (365 / (resolve_date - datetime.now()).days)) - 1 + return { + "my_price": round(my_price, 2), + "market_price": round(market_price, 2), + "deference": round(deference, 3), + "adj_price": round(adj_price, 2), + "delta_price": round(np.abs(market_price - my_price), 2), + "adj_delta_price": round(np.abs(market_price - adj_price), 2), + "kelly": round(kelly, 3), + "target": round(target, 2), + "current": round(current, 2), + "delta": round(target - current, 2), + "max_gain": round(target / market_price, 2), + "modeled_gain": round( + (adj_price * (target / market_price) + (1 - adj_price) * -target), 2 + ), + "expected_roi": round(expected_roi, 3), + "expected_arr": round(expected_arr, 3) if expected_arr is not None else None, + "resolve_date": resolve_date, + }
+ + + +
+[docs] +def full_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): + """ + Alias for ``kelly`` where ``deference`` is 0. + + Parameters + ---------- + my_price : float + The price (or probability) you give for the given event. + market_price : float + The price the market is giving for that event. + bankroll : float + How much money do you have to bet? Defaults to 1. + resolve_date : str or None + When will the event happen, the market resolve, and you get your money back? Used for + calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means + ARR is not calculated. + current : float + How much do you already have invested in this event? Used for calculating the + additional amount you should invest. Defaults to 0. + + Returns + ------- + dict + A dict of values specifying: + * ``my_price`` + * ``market_price`` + * ``deference`` + * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken + into account. + * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``. + * ``adj_delta_price`` : the absolute difference between ``adj_price`` and + ``market_price``. + * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll`` + you should bet. + * ``target`` : the target amount of money you should have invested + * ``current`` + * ``delta`` : the amount of money you should invest given what you already + have invested + * ``max_gain`` : the amount of money you would gain if you win + * ``modeled_gain`` : the expected value you would win given ``adj_price`` + * ``expected_roi`` : the expected return on investment + * ``expected_arr`` : the expected ARR given ``resolve_date`` + * ``resolve_date`` + + Examples + -------- + >>> full_kelly(my_price=0.7, market_price=0.4, bankroll=100) + {'my_price': 0.7, 'market_price': 0.4, 'deference': 0, 'adj_price': 0.7, + 'delta_price': 0.3, 'adj_delta_price': 0.3, 'kelly': 0.5, 'target': 50.0, + 'current': 0, 'delta': 50.0, 'max_gain': 125.0, 'modeled_gain': 72.5, + 'expected_roi': 0.75, 'expected_arr': None, 'resolve_date': None} + """ + return kelly( + my_price=my_price, + market_price=market_price, + bankroll=bankroll, + resolve_date=resolve_date, + current=current, + deference=0, + )
+ + + +
+[docs] +def half_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): + """ + Alias for ``kelly`` where ``deference`` is 0.5. + + Parameters + ---------- + my_price : float + The price (or probability) you give for the given event. + market_price : float + The price the market is giving for that event. + bankroll : float + How much money do you have to bet? Defaults to 1. + resolve_date : str or None + When will the event happen, the market resolve, and you get your money back? Used for + calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means + ARR is not calculated. + current : float + How much do you already have invested in this event? Used for calculating the + additional amount you should invest. Defaults to 0. + + Returns + ------- + dict + A dict of values specifying: + * ``my_price`` + * ``market_price`` + * ``deference`` + * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken + into account. + * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``. + * ``adj_delta_price`` : the absolute difference between ``adj_price`` and + ``market_price``. + * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll`` + you should bet. + * ``target`` : the target amount of money you should have invested + * ``current`` + * ``delta`` : the amount of money you should invest given what you already + have invested + * ``max_gain`` : the amount of money you would gain if you win + * ``modeled_gain`` : the expected value you would win given ``adj_price`` + * ``expected_roi`` : the expected return on investment + * ``expected_arr`` : the expected ARR given ``resolve_date`` + * ``resolve_date`` + + Examples + -------- + >>> half_kelly(my_price=0.7, market_price=0.4, bankroll=100) + {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.5, 'adj_price': 0.55, + 'delta_price': 0.3, 'adj_delta_price': 0.15, 'kelly': 0.25, 'target': 25.0, + 'current': 0, 'delta': 25.0, 'max_gain': 62.5, 'modeled_gain': 23.13, + 'expected_roi': 0.375, 'expected_arr': None, 'resolve_date': None} + """ + return kelly( + my_price=my_price, + market_price=market_price, + bankroll=bankroll, + resolve_date=resolve_date, + current=current, + deference=0.5, + )
+ + + +
+[docs] +def quarter_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): + """ + Alias for ``kelly`` where ``deference`` is 0.75. + + Parameters + ---------- + my_price : float + The price (or probability) you give for the given event. + market_price : float + The price the market is giving for that event. + bankroll : float + How much money do you have to bet? Defaults to 1. + resolve_date : str or None + When will the event happen, the market resolve, and you get your money back? Used for + calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means + ARR is not calculated. + current : float + How much do you already have invested in this event? Used for calculating the + additional amount you should invest. Defaults to 0. + + Returns + ------- + dict + A dict of values specifying: + * ``my_price`` + * ``market_price`` + * ``deference`` + * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken + into account. + * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``. + * ``adj_delta_price`` : the absolute difference between ``adj_price`` and + ``market_price``. + * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll`` + you should bet. + * ``target`` : the target amount of money you should have invested + * ``current`` + * ``delta`` : the amount of money you should invest given what you already + have invested + * ``max_gain`` : the amount of money you would gain if you win + * ``modeled_gain`` : the expected value you would win given ``adj_price`` + * ``expected_roi`` : the expected return on investment + * ``expected_arr`` : the expected ARR given ``resolve_date`` + * ``resolve_date`` + + Examples + -------- + >>> quarter_kelly(my_price=0.7, market_price=0.4, bankroll=100) + {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.75, 'adj_price': 0.48, + 'delta_price': 0.3, 'adj_delta_price': 0.08, 'kelly': 0.125, 'target': 12.5, + 'current': 0, 'delta': 12.5, 'max_gain': 31.25, 'modeled_gain': 8.28, + 'expected_roi': 0.188, 'expected_arr': None, 'resolve_date': None} + """ + return kelly( + my_price=my_price, + market_price=market_price, + bankroll=bankroll, + resolve_date=resolve_date, + current=current, + deference=0.75, + )
+ + + +
+[docs] +def extremize(p, e): + """ + Extremize a prediction. + + Parameters + ---------- + p : float + The prediction to extremize. Must be within 0-1. + e : float + The extremization factor. + + Returns + ------- + float + The extremized prediction + + Examples + -------- + >>> # Extremizing of 1.73 per https://arxiv.org/abs/2111.03153 + >>> extremize(p=0.7, e=1.73) + 0.875428191155692 + """ + if p <= 0 or p >= 1: + raise ValueError("`p` must be greater than 0 and less than 1") + + if p > 0.5: + return 1 - ((1 - p) ** e) + else: + return p**e
+ +
+ +
+ + + + + +
+ +
+
+
+ +
+ + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/_sources/examples.rst.txt b/docs/build/html/_sources/examples.rst.txt new file mode 100644 index 0000000..c00053f --- /dev/null +++ b/docs/build/html/_sources/examples.rst.txt @@ -0,0 +1,468 @@ +Examples +======== + +Piano Tuners Example +~~~~~~~~~~~~~~~~~~~~ + +Here’s the Squigglepy implementation of `the example from Squiggle +Docs `__: + +.. code:: python + + import squigglepy as sq + import numpy as np + import matplotlib.pyplot as plt + from squigglepy.numbers import K, M + from pprint import pprint + + pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) # This means that you're 90% confident the value is between 8.1 and 8.4 Million. + pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 # We assume there are almost no people with multiple pianos + pianos_per_piano_tuner = sq.to(2*K, 50*K) + piano_tuners_per_piano = 1 / pianos_per_piano_tuner + total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano + samples = total_tuners_in_2022 @ 1000 # Note: `@ 1000` is shorthand to get 1000 samples + + # Get mean and SD + print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2), + round(np.std(samples), 2))) + + # Get percentiles + pprint(sq.get_percentiles(samples, digits=0)) + + # Histogram + plt.hist(samples, bins=200) + plt.show() + + # Shorter histogram + total_tuners_in_2022.plot() + +And the version from the Squiggle doc that incorporates time: + +.. code:: python + + import squigglepy as sq + from squigglepy.numbers import K, M + + pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) + pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 + pianos_per_piano_tuner = sq.to(2*K, 50*K) + piano_tuners_per_piano = 1 / pianos_per_piano_tuner + + def pop_at_time(t): # t = Time in years after 2022 + avg_yearly_pct_change = sq.to(-0.01, 0.05) # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year + return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t) + + def total_tuners_at_time(t): + return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano + + # Get total piano tuners at 2030 + sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000) + +**WARNING:** Be careful about dividing by ``K``, ``M``, etc. ``1/2*K`` = +500 in Python. Use ``1/(2*K)`` instead to get the expected outcome. + +**WARNING:** Be careful about using ``K`` to get sample counts. Use +``sq.norm(2, 3) @ (2*K)``\ … ``sq.norm(2, 3) @ 2*K`` will return only +two samples, multiplied by 1000. + +Distributions +~~~~~~~~~~~~~ + +.. code:: python + + import squigglepy as sq + + # Normal distribution + sq.norm(1, 3) # 90% interval from 1 to 3 + + # Distribution can be sampled with mean and sd too + sq.norm(mean=0, sd=1) + + # Shorthand to get one sample + ~sq.norm(1, 3) + + # Shorthand to get more than one sample + sq.norm(1, 3) @ 100 + + # Longhand version to get more than one sample + sq.sample(sq.norm(1, 3), n=100) + + # Nice progress reporter + sq.sample(sq.norm(1, 3), n=1000, verbose=True) + + # Other distributions exist + sq.lognorm(1, 10) + sq.tdist(1, 10, t=5) + sq.triangular(1, 2, 3) + sq.pert(1, 2, 3, lam=2) + sq.binomial(p=0.5, n=5) + sq.beta(a=1, b=2) + sq.bernoulli(p=0.5) + sq.poisson(10) + sq.chisquare(2) + sq.gamma(3, 2) + sq.pareto(1) + sq.exponential(scale=1) + sq.geometric(p=0.5) + + # Discrete sampling + sq.discrete({'A': 0.1, 'B': 0.9}) + + # Can return integers + sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15}) + + # Alternate format (also can be used to return more complex objects) + sq.discrete([[0.1, 0], + [0.3, 1], + [0.3, 2], + [0.15, 3], + [0.15, 4]]) + + sq.discrete([0, 1, 2]) # No weights assumes equal weights + + # You can mix distributions together + sq.mixture([sq.norm(1, 3), + sq.norm(4, 10), + sq.lognorm(1, 10)], # Distributions to mix + [0.3, 0.3, 0.4]) # These are the weights on each distribution + + # This is equivalent to the above, just a different way of doing the notation + sq.mixture([[0.3, sq.norm(1,3)], + [0.3, sq.norm(4,10)], + [0.4, sq.lognorm(1,10)]]) + + # Make a zero-inflated distribution + # 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`. + sq.zero_inflated(0.6, sq.norm(1, 2)) + +Additional Features +~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + import squigglepy as sq + + # You can add and subtract distributions + (sq.norm(1,3) + sq.norm(4,5)) @ 100 + (sq.norm(1,3) - sq.norm(4,5)) @ 100 + (sq.norm(1,3) * sq.norm(4,5)) @ 100 + (sq.norm(1,3) / sq.norm(4,5)) @ 100 + + # You can also do math with numbers + ~((sq.norm(sd=5) + 2) * 2) + ~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10) + + # You can change the CI from 90% (default) to 80% + sq.norm(1, 3, credibility=80) + + # You can clip + sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5. + + # You can also clip with a function, and use pipes + sq.norm(0, 3) >> sq.clip(0, 5) + + # You can correlate continuous distributions + a, b = sq.uniform(-1, 1), sq.to(0, 3) + a, b = sq.correlate((a, b), 0.5) # Correlate a and b with a correlation of 0.5 + # You can even pass your own correlation matrix! + a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]]) + +Example: Rolling a Die +^^^^^^^^^^^^^^^^^^^^^^ + +An example of how to use distributions to build tools: + +.. code:: python + + import squigglepy as sq + + def roll_die(sides, n=1): + return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None + + roll_die(sides=6, n=10) + # [2, 6, 5, 2, 6, 2, 3, 1, 5, 2] + +This is already included standard in the utils of this package. Use +``sq.roll_die``. + +Bayesian inference +~~~~~~~~~~~~~~~~~~ + +1% of women at age forty who participate in routine screening have +breast cancer. 80% of women with breast cancer will get positive +mammographies. 9.6% of women without breast cancer will also get +positive mammographies. + +A woman in this age group had a positive mammography in a routine +screening. What is the probability that she actually has breast cancer? + +We can approximate the answer with a Bayesian network (uses rejection +sampling): + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import M + + def mammography(has_cancer): + return sq.event(0.8 if has_cancer else 0.096) + + def define_event(): + cancer = ~sq.bernoulli(0.01) + return({'mammography': mammography(cancer), + 'cancer': cancer}) + + bayes.bayesnet(define_event, + find=lambda e: e['cancer'], + conditional_on=lambda e: e['mammography'], + n=1*M) + # 0.07723995880535531 + +Or if we have the information immediately on hand, we can directly +calculate it. Though this doesn’t work for very complex stuff. + +.. code:: python + + from squigglepy import bayes + bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) + # 0.07763975155279504 + +You can also make distributions and update them: + +.. code:: python + + import matplotlib.pyplot as plt + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import K + import numpy as np + + print('Prior') + prior = sq.norm(1,5) + prior_samples = prior @ (10*K) + plt.hist(prior_samples, bins = 200) + plt.show() + print(sq.get_percentiles(prior_samples)) + print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples))) + print('-') + + print('Evidence') + evidence = sq.norm(2,3) + evidence_samples = evidence @ (10*K) + plt.hist(evidence_samples, bins = 200) + plt.show() + print(sq.get_percentiles(evidence_samples)) + print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples))) + print('-') + + print('Posterior') + posterior = bayes.update(prior, evidence) + posterior_samples = posterior @ (10*K) + plt.hist(posterior_samples, bins = 200) + plt.show() + print(sq.get_percentiles(posterior_samples)) + print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples))) + + print('Average') + average = bayes.average(prior, evidence) + average_samples = average @ (10*K) + plt.hist(average_samples, bins = 200) + plt.show() + print(sq.get_percentiles(average_samples)) + print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples))) + +Example: Alarm net +^^^^^^^^^^^^^^^^^^ + +This is the alarm network from `Bayesian Artificial Intelligence - +Section +2.5.1 `__: + + Assume your house has an alarm system against burglary. + + You live in the seismically active area and the alarm system can get + occasionally set off by an earthquake. + + You have two neighbors, Mary and John, who do not know each other. If + they hear the alarm they call you, but this is not guaranteed. + + The chance of a burglary on a particular day is 0.1%. The chance of + an earthquake on a particular day is 0.2%. + + The alarm will go off 95% of the time with both a burglary and an + earthquake, 94% of the time with just a burglary, 29% of the time + with just an earthquake, and 0.1% of the time with nothing (total + false alarm). + + John will call you 90% of the time when the alarm goes off. But on 5% + of the days, John will just call to say “hi”. Mary will call you 70% + of the time when the alarm goes off. But on 1% of the days, Mary will + just call to say “hi”. + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import M + + def p_alarm_goes_off(burglary, earthquake): + if burglary and earthquake: + return 0.95 + elif burglary and not earthquake: + return 0.94 + elif not burglary and earthquake: + return 0.29 + elif not burglary and not earthquake: + return 0.001 + + def p_john_calls(alarm_goes_off): + return 0.9 if alarm_goes_off else 0.05 + + def p_mary_calls(alarm_goes_off): + return 0.7 if alarm_goes_off else 0.01 + + def define_event(): + burglary_happens = sq.event(p=0.001) + earthquake_happens = sq.event(p=0.002) + alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens)) + john_calls = sq.event(p_john_calls(alarm_goes_off)) + mary_calls = sq.event(p_mary_calls(alarm_goes_off)) + return {'burglary': burglary_happens, + 'earthquake': earthquake_happens, + 'alarm_goes_off': alarm_goes_off, + 'john_calls': john_calls, + 'mary_calls': mary_calls} + + # What are the chances that both John and Mary call if an earthquake happens? + bayes.bayesnet(define_event, + n=1*M, + find=lambda e: (e['mary_calls'] and e['john_calls']), + conditional_on=lambda e: e['earthquake']) + # Result will be ~0.19, though it varies because it is based on a random sample. + # This also may take a minute to run. + + # If both John and Mary call, what is the chance there's been a burglary? + bayes.bayesnet(define_event, + n=1*M, + find=lambda e: e['burglary'], + conditional_on=lambda e: (e['mary_calls'] and e['john_calls'])) + # Result will be ~0.27, though it varies because it is based on a random sample. + # This will run quickly because there is a built-in cache. + # Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache. + +Note that the amount of Bayesian analysis that squigglepy can do is +pretty limited. For more complex bayesian analysis, consider +`sorobn `__, +`pomegranate `__, +`bnlearn `__, or +`pyMC `__. + +Example: A Demonstration of the Monty Hall Problem +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code:: python + + import squigglepy as sq + from squigglepy import bayes + from squigglepy.numbers import K, M, B, T + + + def monte_hall(door_picked, switch=False): + doors = ['A', 'B', 'C'] + car_is_behind_door = ~sq.discrete(doors) + reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door]) + + if switch: + old_door_picked = door_picked + door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0] + + won_car = (car_is_behind_door == door_picked) + return won_car + + + def define_event(): + door = ~sq.discrete(['A', 'B', 'C']) + switch = sq.event(0.5) + return {'won': monte_hall(door_picked=door, switch=switch), + 'switched': switch} + + RUNS = 10*K + r = bayes.bayesnet(define_event, + find=lambda e: e['won'], + conditional_on=lambda e: e['switched'], + verbose=True, + n=RUNS) + print('Win {}% of the time when switching'.format(int(r * 100))) + + r = bayes.bayesnet(define_event, + find=lambda e: e['won'], + conditional_on=lambda e: not e['switched'], + verbose=True, + n=RUNS) + print('Win {}% of the time when not switching'.format(int(r * 100))) + + # Win 66% of the time when switching + # Win 34% of the time when not switching + +Example: More complex coin/dice interactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Imagine that I flip a coin. If heads, I take a random die out of my + blue bag. If tails, I take a random die out of my red bag. The blue + bag contains only 6-sided dice. The red bag contains a 4-sided die, a + 6-sided die, a 10-sided die, and a 20-sided die. I then roll the + random die I took. What is the chance that I roll a 6? + +.. code:: python + + import squigglepy as sq + from squigglepy.numbers import K, M, B, T + from squigglepy import bayes + + def define_event(): + if sq.flip_coin() == 'heads': # Blue bag + return sq.roll_die(6) + else: # Red bag + return sq.discrete([4, 6, 10, 20]) >> sq.roll_die + + + bayes.bayesnet(define_event, + find=lambda e: e == 6, + verbose=True, + n=100*K) + # This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292 + +Kelly betting +~~~~~~~~~~~~~ + +You can use probability generated, combine with a bankroll to determine +bet sizing using `Kelly +criterion `__. + +For example, if you want to Kelly bet and you’ve… + +- determined that your price (your probability of the event in question + happening / the market in question resolving in your favor) is $0.70 + (70%) +- see that the market is pricing at $0.65 +- you have a bankroll of $1000 that you are willing to bet + +You should bet as follows: + +.. code:: python + + import squigglepy as sq + kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000) + kelly_data['kelly'] # What fraction of my bankroll should I bet on this? + # 0.143 + kelly_data['target'] # How much money should be invested in this? + # 142.86 + kelly_data['expected_roi'] # What is the expected ROI of this bet? + # 0.077 + +More examples +~~~~~~~~~~~~~ + +You can see more examples of squigglepy in action +`here `__. diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt index 9a79421..1fdb7aa 100644 --- a/docs/build/html/_sources/index.rst.txt +++ b/docs/build/html/_sources/index.rst.txt @@ -1,8 +1,8 @@ Squigglepy: Implementation of Squiggle in Python ================================================ -`Squiggle `__ is a “simple -programming language for intuitive probabilistic estimation”. It serves +`Squiggle `__ is a "simple +programming language for intuitive probabilistic estimation". It serves as its own standalone programming language with its own syntax, but it is implemented in JavaScript. I like the features of Squiggle and intend to use it frequently, but I also sometimes want to use similar @@ -12,7 +12,58 @@ programming packages like Numpy, Pandas, and Matplotlib. The functionalities in Python. .. toctree:: - :maxdepth: 2 - :caption: Contents: + :maxdepth: 3 + :caption: Contents -Check out the :doc:`README ` to get started. + API Reference + Examples + +Installation +------------ + +.. code:: shell + + pip install squigglepy + +For plotting support, you can also use the ``plots`` extra: + +.. code:: shell + + pip install squigglepy[plots] + +Run tests +--------- + +Use ``black .`` for formatting. + +Run +``ruff check . && pytest && pip3 install . && python3 tests/integration.py`` + +Disclaimers +----------- + +This package is unofficial and supported by Peter Wildeford and Rethink +Priorities. It is not affiliated with or associated with the Quantified +Uncertainty Research Institute, which maintains the Squiggle language +(in JavaScript). + +This package is also new and not yet in a stable production version, so +you may encounter bugs and other errors. Please report those so they can +be fixed. It’s also possible that future versions of the package may +introduce breaking changes. + +This package is available under an MIT License. + +Acknowledgements +---------------- + +- The primary author of this package is Peter Wildeford. Agustín + Covarrubias and Bernardo Baron contributed several key features and + developments. +- Thanks to Ozzie Gooen and the Quantified Uncertainty Research + Institute for creating and maintaining the original Squiggle + language. +- Thanks to Dawn Drescher for helping me implement math between + distributions. +- Thanks to Dawn Drescher for coming up with the idea to use ``~`` as a + shorthand for ``sample``, as well as helping me implement it. diff --git a/docs/build/html/_sources/reference/modules.rst.txt b/docs/build/html/_sources/reference/modules.rst.txt new file mode 100644 index 0000000..57192bd --- /dev/null +++ b/docs/build/html/_sources/reference/modules.rst.txt @@ -0,0 +1,7 @@ +squigglepy +========== + +.. toctree:: + :maxdepth: 4 + + squigglepy diff --git a/docs/build/html/_sources/reference/squigglepy.bayes.rst.txt b/docs/build/html/_sources/reference/squigglepy.bayes.rst.txt new file mode 100644 index 0000000..8a445be --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.bayes.rst.txt @@ -0,0 +1,7 @@ +squigglepy.bayes module +======================= + +.. automodule:: squigglepy.bayes + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.correlation.rst.txt b/docs/build/html/_sources/reference/squigglepy.correlation.rst.txt new file mode 100644 index 0000000..c99cf14 --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.correlation.rst.txt @@ -0,0 +1,7 @@ +squigglepy.correlation module +============================= + +.. automodule:: squigglepy.correlation + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.distributions.rst.txt b/docs/build/html/_sources/reference/squigglepy.distributions.rst.txt new file mode 100644 index 0000000..bfbdb38 --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.distributions.rst.txt @@ -0,0 +1,7 @@ +squigglepy.distributions module +=============================== + +.. automodule:: squigglepy.distributions + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.numbers.rst.txt b/docs/build/html/_sources/reference/squigglepy.numbers.rst.txt new file mode 100644 index 0000000..524cbcd --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.numbers.rst.txt @@ -0,0 +1,7 @@ +squigglepy.numbers module +========================= + +.. automodule:: squigglepy.numbers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.rng.rst.txt b/docs/build/html/_sources/reference/squigglepy.rng.rst.txt new file mode 100644 index 0000000..84ec740 --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.rng.rst.txt @@ -0,0 +1,7 @@ +squigglepy.rng module +===================== + +.. automodule:: squigglepy.rng + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.rst.txt b/docs/build/html/_sources/reference/squigglepy.rst.txt new file mode 100644 index 0000000..b629fda --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.rst.txt @@ -0,0 +1,22 @@ +squigglepy package +================== + +.. automodule:: squigglepy + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + squigglepy.bayes + squigglepy.correlation + squigglepy.distributions + squigglepy.numbers + squigglepy.rng + squigglepy.samplers + squigglepy.utils + squigglepy.version diff --git a/docs/build/html/_sources/reference/squigglepy.samplers.rst.txt b/docs/build/html/_sources/reference/squigglepy.samplers.rst.txt new file mode 100644 index 0000000..ae3e754 --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.samplers.rst.txt @@ -0,0 +1,7 @@ +squigglepy.samplers module +========================== + +.. automodule:: squigglepy.samplers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.squigglepy.rst.txt b/docs/build/html/_sources/reference/squigglepy.squigglepy.rst.txt new file mode 100644 index 0000000..9271ec8 --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.squigglepy.rst.txt @@ -0,0 +1,78 @@ +squigglepy.squigglepy package +============================= + +Submodules +---------- + +squigglepy.squigglepy.bayes module +---------------------------------- + +.. automodule:: squigglepy.squigglepy.bayes + :members: + :undoc-members: + :show-inheritance: + +squigglepy.squigglepy.correlation module +---------------------------------------- + +.. automodule:: squigglepy.squigglepy.correlation + :members: + :undoc-members: + :show-inheritance: + +squigglepy.squigglepy.distributions module +------------------------------------------ + +.. automodule:: squigglepy.squigglepy.distributions + :members: + :undoc-members: + :show-inheritance: + +squigglepy.squigglepy.numbers module +------------------------------------ + +.. automodule:: squigglepy.squigglepy.numbers + :members: + :undoc-members: + :show-inheritance: + +squigglepy.squigglepy.rng module +-------------------------------- + +.. automodule:: squigglepy.squigglepy.rng + :members: + :undoc-members: + :show-inheritance: + +squigglepy.squigglepy.samplers module +------------------------------------- + +.. automodule:: squigglepy.squigglepy.samplers + :members: + :undoc-members: + :show-inheritance: + +squigglepy.squigglepy.utils module +---------------------------------- + +.. automodule:: squigglepy.squigglepy.utils + :members: + :undoc-members: + :show-inheritance: + +squigglepy.squigglepy.version module +------------------------------------ + +.. automodule:: squigglepy.squigglepy.version + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: squigglepy.squigglepy + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.tests.rst.txt b/docs/build/html/_sources/reference/squigglepy.tests.rst.txt new file mode 100644 index 0000000..cf175cf --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.tests.rst.txt @@ -0,0 +1,86 @@ +squigglepy.tests package +======================== + +Submodules +---------- + +squigglepy.tests.integration module +----------------------------------- + +.. automodule:: squigglepy.tests.integration + :members: + :undoc-members: + :show-inheritance: + +squigglepy.tests.strategies module +---------------------------------- + +.. automodule:: squigglepy.tests.strategies + :members: + :undoc-members: + :show-inheritance: + +squigglepy.tests.test\_bayes module +----------------------------------- + +.. automodule:: squigglepy.tests.test_bayes + :members: + :undoc-members: + :show-inheritance: + +squigglepy.tests.test\_correlation module +----------------------------------------- + +.. automodule:: squigglepy.tests.test_correlation + :members: + :undoc-members: + :show-inheritance: + +squigglepy.tests.test\_distributions module +------------------------------------------- + +.. automodule:: squigglepy.tests.test_distributions + :members: + :undoc-members: + :show-inheritance: + +squigglepy.tests.test\_numbers module +------------------------------------- + +.. automodule:: squigglepy.tests.test_numbers + :members: + :undoc-members: + :show-inheritance: + +squigglepy.tests.test\_rng module +--------------------------------- + +.. automodule:: squigglepy.tests.test_rng + :members: + :undoc-members: + :show-inheritance: + +squigglepy.tests.test\_samplers module +-------------------------------------- + +.. automodule:: squigglepy.tests.test_samplers + :members: + :undoc-members: + :show-inheritance: + +squigglepy.tests.test\_utils module +----------------------------------- + +.. automodule:: squigglepy.tests.test_utils + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: squigglepy.tests + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.utils.rst.txt b/docs/build/html/_sources/reference/squigglepy.utils.rst.txt new file mode 100644 index 0000000..8af5f44 --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.utils.rst.txt @@ -0,0 +1,7 @@ +squigglepy.utils module +======================= + +.. automodule:: squigglepy.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/reference/squigglepy.version.rst.txt b/docs/build/html/_sources/reference/squigglepy.version.rst.txt new file mode 100644 index 0000000..efe11f5 --- /dev/null +++ b/docs/build/html/_sources/reference/squigglepy.version.rst.txt @@ -0,0 +1,7 @@ +squigglepy.version module +========================= + +.. automodule:: squigglepy.version + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/examples.html b/docs/build/html/examples.html new file mode 100644 index 0000000..0011e57 --- /dev/null +++ b/docs/build/html/examples.html @@ -0,0 +1,891 @@ + + + + + + + + + + + Examples — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +
+

Examples#

+
+

Piano Tuners Example#

+

Here’s the Squigglepy implementation of the example from Squiggle +Docs:

+
import squigglepy as sq
+import numpy as np
+import matplotlib.pyplot as plt
+from squigglepy.numbers import K, M
+from pprint import pprint
+
+pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)  # This means that you're 90% confident the value is between 8.1 and 8.4 Million.
+pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01  # We assume there are almost no people with multiple pianos
+pianos_per_piano_tuner = sq.to(2*K, 50*K)
+piano_tuners_per_piano = 1 / pianos_per_piano_tuner
+total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano
+samples = total_tuners_in_2022 @ 1000  # Note: `@ 1000` is shorthand to get 1000 samples
+
+# Get mean and SD
+print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2),
+                                round(np.std(samples), 2)))
+
+# Get percentiles
+pprint(sq.get_percentiles(samples, digits=0))
+
+# Histogram
+plt.hist(samples, bins=200)
+plt.show()
+
+# Shorter histogram
+total_tuners_in_2022.plot()
+
+
+

And the version from the Squiggle doc that incorporates time:

+
import squigglepy as sq
+from squigglepy.numbers import K, M
+
+pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)
+pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01
+pianos_per_piano_tuner = sq.to(2*K, 50*K)
+piano_tuners_per_piano = 1 / pianos_per_piano_tuner
+
+def pop_at_time(t):  # t = Time in years after 2022
+    avg_yearly_pct_change = sq.to(-0.01, 0.05)  # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year
+    return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t)
+
+def total_tuners_at_time(t):
+    return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano
+
+# Get total piano tuners at 2030
+sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000)
+
+
+

WARNING: Be careful about dividing by K, M, etc. 1/2*K = +500 in Python. Use 1/(2*K) instead to get the expected outcome.

+

WARNING: Be careful about using K to get sample counts. Use +sq.norm(2, 3) @ (2*K)sq.norm(2, 3) @ 2*K will return only +two samples, multiplied by 1000.

+
+
+

Distributions#

+
import squigglepy as sq
+
+# Normal distribution
+sq.norm(1, 3)  # 90% interval from 1 to 3
+
+# Distribution can be sampled with mean and sd too
+sq.norm(mean=0, sd=1)
+
+# Shorthand to get one sample
+~sq.norm(1, 3)
+
+# Shorthand to get more than one sample
+sq.norm(1, 3) @ 100
+
+# Longhand version to get more than one sample
+sq.sample(sq.norm(1, 3), n=100)
+
+# Nice progress reporter
+sq.sample(sq.norm(1, 3), n=1000, verbose=True)
+
+# Other distributions exist
+sq.lognorm(1, 10)
+sq.tdist(1, 10, t=5)
+sq.triangular(1, 2, 3)
+sq.pert(1, 2, 3, lam=2)
+sq.binomial(p=0.5, n=5)
+sq.beta(a=1, b=2)
+sq.bernoulli(p=0.5)
+sq.poisson(10)
+sq.chisquare(2)
+sq.gamma(3, 2)
+sq.pareto(1)
+sq.exponential(scale=1)
+sq.geometric(p=0.5)
+
+# Discrete sampling
+sq.discrete({'A': 0.1, 'B': 0.9})
+
+# Can return integers
+sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15})
+
+# Alternate format (also can be used to return more complex objects)
+sq.discrete([[0.1,  0],
+             [0.3,  1],
+             [0.3,  2],
+             [0.15, 3],
+             [0.15, 4]])
+
+sq.discrete([0, 1, 2]) # No weights assumes equal weights
+
+# You can mix distributions together
+sq.mixture([sq.norm(1, 3),
+            sq.norm(4, 10),
+            sq.lognorm(1, 10)],  # Distributions to mix
+           [0.3, 0.3, 0.4])     # These are the weights on each distribution
+
+# This is equivalent to the above, just a different way of doing the notation
+sq.mixture([[0.3, sq.norm(1,3)],
+            [0.3, sq.norm(4,10)],
+            [0.4, sq.lognorm(1,10)]])
+
+# Make a zero-inflated distribution
+# 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`.
+sq.zero_inflated(0.6, sq.norm(1, 2))
+
+
+
+
+

Additional Features#

+
import squigglepy as sq
+
+# You can add and subtract distributions
+(sq.norm(1,3) + sq.norm(4,5)) @ 100
+(sq.norm(1,3) - sq.norm(4,5)) @ 100
+(sq.norm(1,3) * sq.norm(4,5)) @ 100
+(sq.norm(1,3) / sq.norm(4,5)) @ 100
+
+# You can also do math with numbers
+~((sq.norm(sd=5) + 2) * 2)
+~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10)
+
+# You can change the CI from 90% (default) to 80%
+sq.norm(1, 3, credibility=80)
+
+# You can clip
+sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5.
+
+# You can also clip with a function, and use pipes
+sq.norm(0, 3) >> sq.clip(0, 5)
+
+# You can correlate continuous distributions
+a, b = sq.uniform(-1, 1), sq.to(0, 3)
+a, b = sq.correlate((a, b), 0.5)  # Correlate a and b with a correlation of 0.5
+# You can even pass your own correlation matrix!
+a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]])
+
+
+
+

Example: Rolling a Die#

+

An example of how to use distributions to build tools:

+
import squigglepy as sq
+
+def roll_die(sides, n=1):
+    return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None
+
+roll_die(sides=6, n=10)
+# [2, 6, 5, 2, 6, 2, 3, 1, 5, 2]
+
+
+

This is already included standard in the utils of this package. Use +sq.roll_die.

+
+
+
+

Bayesian inference#

+

1% of women at age forty who participate in routine screening have +breast cancer. 80% of women with breast cancer will get positive +mammographies. 9.6% of women without breast cancer will also get +positive mammographies.

+

A woman in this age group had a positive mammography in a routine +screening. What is the probability that she actually has breast cancer?

+

We can approximate the answer with a Bayesian network (uses rejection +sampling):

+
import squigglepy as sq
+from squigglepy import bayes
+from squigglepy.numbers import M
+
+def mammography(has_cancer):
+    return sq.event(0.8 if has_cancer else 0.096)
+
+def define_event():
+    cancer = ~sq.bernoulli(0.01)
+    return({'mammography': mammography(cancer),
+            'cancer': cancer})
+
+bayes.bayesnet(define_event,
+               find=lambda e: e['cancer'],
+               conditional_on=lambda e: e['mammography'],
+               n=1*M)
+# 0.07723995880535531
+
+
+

Or if we have the information immediately on hand, we can directly +calculate it. Though this doesn’t work for very complex stuff.

+
from squigglepy import bayes
+bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096)
+# 0.07763975155279504
+
+
+

You can also make distributions and update them:

+
import matplotlib.pyplot as plt
+import squigglepy as sq
+from squigglepy import bayes
+from squigglepy.numbers import K
+import numpy as np
+
+print('Prior')
+prior = sq.norm(1,5)
+prior_samples = prior @ (10*K)
+plt.hist(prior_samples, bins = 200)
+plt.show()
+print(sq.get_percentiles(prior_samples))
+print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples)))
+print('-')
+
+print('Evidence')
+evidence = sq.norm(2,3)
+evidence_samples = evidence @ (10*K)
+plt.hist(evidence_samples, bins = 200)
+plt.show()
+print(sq.get_percentiles(evidence_samples))
+print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples)))
+print('-')
+
+print('Posterior')
+posterior = bayes.update(prior, evidence)
+posterior_samples = posterior @ (10*K)
+plt.hist(posterior_samples, bins = 200)
+plt.show()
+print(sq.get_percentiles(posterior_samples))
+print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples)))
+
+print('Average')
+average = bayes.average(prior, evidence)
+average_samples = average @ (10*K)
+plt.hist(average_samples, bins = 200)
+plt.show()
+print(sq.get_percentiles(average_samples))
+print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples)))
+
+
+
+

Example: Alarm net#

+

This is the alarm network from Bayesian Artificial Intelligence - +Section +2.5.1:

+
+

Assume your house has an alarm system against burglary.

+

You live in the seismically active area and the alarm system can get +occasionally set off by an earthquake.

+

You have two neighbors, Mary and John, who do not know each other. If +they hear the alarm they call you, but this is not guaranteed.

+

The chance of a burglary on a particular day is 0.1%. The chance of +an earthquake on a particular day is 0.2%.

+

The alarm will go off 95% of the time with both a burglary and an +earthquake, 94% of the time with just a burglary, 29% of the time +with just an earthquake, and 0.1% of the time with nothing (total +false alarm).

+

John will call you 90% of the time when the alarm goes off. But on 5% +of the days, John will just call to say “hi”. Mary will call you 70% +of the time when the alarm goes off. But on 1% of the days, Mary will +just call to say “hi”.

+
+
import squigglepy as sq
+from squigglepy import bayes
+from squigglepy.numbers import M
+
+def p_alarm_goes_off(burglary, earthquake):
+    if burglary and earthquake:
+        return 0.95
+    elif burglary and not earthquake:
+        return 0.94
+    elif not burglary and earthquake:
+        return 0.29
+    elif not burglary and not earthquake:
+        return 0.001
+
+def p_john_calls(alarm_goes_off):
+    return 0.9 if alarm_goes_off else 0.05
+
+def p_mary_calls(alarm_goes_off):
+    return 0.7 if alarm_goes_off else 0.01
+
+def define_event():
+    burglary_happens = sq.event(p=0.001)
+    earthquake_happens = sq.event(p=0.002)
+    alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens))
+    john_calls = sq.event(p_john_calls(alarm_goes_off))
+    mary_calls = sq.event(p_mary_calls(alarm_goes_off))
+    return {'burglary': burglary_happens,
+            'earthquake': earthquake_happens,
+            'alarm_goes_off': alarm_goes_off,
+            'john_calls': john_calls,
+            'mary_calls': mary_calls}
+
+# What are the chances that both John and Mary call if an earthquake happens?
+bayes.bayesnet(define_event,
+               n=1*M,
+               find=lambda e: (e['mary_calls'] and e['john_calls']),
+               conditional_on=lambda e: e['earthquake'])
+# Result will be ~0.19, though it varies because it is based on a random sample.
+# This also may take a minute to run.
+
+# If both John and Mary call, what is the chance there's been a burglary?
+bayes.bayesnet(define_event,
+               n=1*M,
+               find=lambda e: e['burglary'],
+               conditional_on=lambda e: (e['mary_calls'] and e['john_calls']))
+# Result will be ~0.27, though it varies because it is based on a random sample.
+# This will run quickly because there is a built-in cache.
+# Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache.
+
+
+

Note that the amount of Bayesian analysis that squigglepy can do is +pretty limited. For more complex bayesian analysis, consider +sorobn, +pomegranate, +bnlearn, or +pyMC.

+
+
+

Example: A Demonstration of the Monty Hall Problem#

+
import squigglepy as sq
+from squigglepy import bayes
+from squigglepy.numbers import K, M, B, T
+
+
+def monte_hall(door_picked, switch=False):
+    doors = ['A', 'B', 'C']
+    car_is_behind_door = ~sq.discrete(doors)
+    reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door])
+
+    if switch:
+        old_door_picked = door_picked
+        door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0]
+
+    won_car = (car_is_behind_door == door_picked)
+    return won_car
+
+
+def define_event():
+    door = ~sq.discrete(['A', 'B', 'C'])
+    switch = sq.event(0.5)
+    return {'won': monte_hall(door_picked=door, switch=switch),
+            'switched': switch}
+
+RUNS = 10*K
+r = bayes.bayesnet(define_event,
+                   find=lambda e: e['won'],
+                   conditional_on=lambda e: e['switched'],
+                   verbose=True,
+                   n=RUNS)
+print('Win {}% of the time when switching'.format(int(r * 100)))
+
+r = bayes.bayesnet(define_event,
+                   find=lambda e: e['won'],
+                   conditional_on=lambda e: not e['switched'],
+                   verbose=True,
+                   n=RUNS)
+print('Win {}% of the time when not switching'.format(int(r * 100)))
+
+# Win 66% of the time when switching
+# Win 34% of the time when not switching
+
+
+
+
+

Example: More complex coin/dice interactions#

+
+

Imagine that I flip a coin. If heads, I take a random die out of my +blue bag. If tails, I take a random die out of my red bag. The blue +bag contains only 6-sided dice. The red bag contains a 4-sided die, a +6-sided die, a 10-sided die, and a 20-sided die. I then roll the +random die I took. What is the chance that I roll a 6?

+
+
import squigglepy as sq
+from squigglepy.numbers import K, M, B, T
+from squigglepy import bayes
+
+def define_event():
+    if sq.flip_coin() == 'heads': # Blue bag
+        return sq.roll_die(6)
+    else: # Red bag
+        return sq.discrete([4, 6, 10, 20]) >> sq.roll_die
+
+
+bayes.bayesnet(define_event,
+               find=lambda e: e == 6,
+               verbose=True,
+               n=100*K)
+# This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292
+
+
+
+
+
+

Kelly betting#

+

You can use probability generated, combine with a bankroll to determine +bet sizing using Kelly +criterion.

+

For example, if you want to Kelly bet and you’ve…

+
    +
  • determined that your price (your probability of the event in question +happening / the market in question resolving in your favor) is $0.70 +(70%)

  • +
  • see that the market is pricing at $0.65

  • +
  • you have a bankroll of $1000 that you are willing to bet

  • +
+

You should bet as follows:

+
import squigglepy as sq
+kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000)
+kelly_data['kelly']  # What fraction of my bankroll should I bet on this?
+# 0.143
+kelly_data['target']  # How much money should be invested in this?
+# 142.86
+kelly_data['expected_roi']  # What is the expected ROI of this bet?
+# 0.077
+
+
+
+
+

More examples#

+

You can see more examples of squigglepy in action +here.

+
+
+ + +
+ + + + + + + +
+ + + + + + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index 23b4876..2671007 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -131,6 +131,19 @@

@@ -208,6 +221,19 @@

@@ -259,8 +285,509 @@

Index

+ A + | B + | C + | D + | E + | F + | G + | H + | I + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | Z
+

A

+ + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

K

+ + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
    +
  • + squigglepy.numbers + +
  • +
  • + squigglepy.rng + +
  • +
  • + squigglepy.samplers + +
  • +
  • + squigglepy.utils + +
  • +
  • + squigglepy.version + +
  • +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

Z

+ + +
+ diff --git a/docs/build/html/index.html b/docs/build/html/index.html index acead48..f6b31ee 100644 --- a/docs/build/html/index.html +++ b/docs/build/html/index.html @@ -41,6 +41,7 @@ + @@ -132,6 +133,19 @@

@@ -213,6 +227,19 @@

@@ -272,8 +299,77 @@

Squigglepy: Implementation of Squiggle in Python +

Contents

+
+ +
+

Installation#

+
pip install squigglepy
+
-

Check out the README to get started.

+

For plotting support, you can also use the plots extra:

+
pip install squigglepy[plots]
+
+
+
+
+

Run tests#

+

Use black . for formatting.

+

Run +ruff check . && pytest && pip3 install . && python3 tests/integration.py

+
+
+

Disclaimers#

+

This package is unofficial and supported by Peter Wildeford and Rethink +Priorities. It is not affiliated with or associated with the Quantified +Uncertainty Research Institute, which maintains the Squiggle language +(in JavaScript).

+

This package is also new and not yet in a stable production version, so +you may encounter bugs and other errors. Please report those so they can +be fixed. It’s also possible that future versions of the package may +introduce breaking changes.

+

This package is available under an MIT License.

+
+
+

Acknowledgements#

+
    +
  • The primary author of this package is Peter Wildeford. Agustín +Covarrubias and Bernardo Baron contributed several key features and +developments.

  • +
  • Thanks to Ozzie Gooen and the Quantified Uncertainty Research +Institute for creating and maintaining the original Squiggle +language.

  • +
  • Thanks to Dawn Drescher for helping me implement math between +distributions.

  • +
  • Thanks to Dawn Drescher for coming up with the idea to use ~ as a +shorthand for sample, as well as helping me implement it.

  • +
+
@@ -286,6 +382,15 @@

Squigglepy: Implementation of Squiggle in Python @@ -295,6 +400,19 @@

Squigglepy: Implementation of Squiggle in Python @@ -208,6 +221,19 @@

@@ -340,7 +366,7 @@

Source code for squigglepy.correlation

 
 
 
-[docs] +[docs] def correlate( variables: tuple[OperableDistribution, ...], correlation: Union[NDArray[np.float64], list[list[float]], np.float64, float], @@ -396,9 +422,10 @@

Source code for squigglepy.correlation

     >>> solar_radiation, temperature = sq.gamma(300, 100), sq.to(22, 28)
     >>> solar_radiation, temperature = sq.correlate((solar_radiation, temperature), 0.7)
     >>> print(np.corrcoef(solar_radiation @ 1000, temperature @ 1000)[0, 1])
-        0.6975960649767123
+    0.6975960649767123
 
     Or you could pass a correlation matrix:
+
     >>> funding_gap, cost_per_delivery, effect_size = (
             sq.to(20_000, 80_000), sq.to(30, 80), sq.beta(2, 5)
         )
@@ -407,9 +434,9 @@ 

Source code for squigglepy.correlation

             [[1, 0.6, -0.5], [0.6, 1, -0.2], [-0.5, -0.2, 1]]
         )
     >>> print(np.corrcoef(funding_gap @ 1000, cost_per_delivery @ 1000, effect_size @ 1000))
-        array([[ 1.      ,  0.580520  , -0.480149],
-               [ 0.580962,  1.        , -0.187831],
-               [-0.480149, -0.187831  ,  1.        ]])
+    array([[ 1.      ,  0.580520  , -0.480149],
+           [ 0.580962,  1.        , -0.187831],
+           [-0.480149, -0.187831  ,  1.        ]])
 
     """
     if not isinstance(variables, tuple):
@@ -455,7 +482,7 @@ 

Source code for squigglepy.correlation

 
 
 
-[docs] +[docs] @dataclass class CorrelationGroup: """ @@ -500,7 +527,7 @@

Source code for squigglepy.correlation

             dist.correlation_group = self
 
 
-[docs] +[docs] def induce_correlation(self, data: NDArray[np.float64]) -> NDArray[np.float64]: """ Induce a set of correlations on a column-wise dataset @@ -623,7 +650,7 @@

Source code for squigglepy.correlation

             )
 
 
-[docs] +[docs] def has_sufficient_sample_diversity( self, samples: NDArray[np.float64], diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt index 1fdb7aa..89b8383 100644 --- a/docs/build/html/_sources/index.rst.txt +++ b/docs/build/html/_sources/index.rst.txt @@ -12,32 +12,12 @@ programming packages like Numpy, Pandas, and Matplotlib. The functionalities in Python. .. toctree:: - :maxdepth: 3 + :maxdepth: 2 :caption: Contents + Installation + Usage API Reference - Examples - -Installation ------------- - -.. code:: shell - - pip install squigglepy - -For plotting support, you can also use the ``plots`` extra: - -.. code:: shell - - pip install squigglepy[plots] - -Run tests ---------- - -Use ``black .`` for formatting. - -Run -``ruff check . && pytest && pip3 install . && python3 tests/integration.py`` Disclaimers ----------- diff --git a/docs/build/html/_sources/installation.rst.txt b/docs/build/html/_sources/installation.rst.txt new file mode 100644 index 0000000..fb5e8d9 --- /dev/null +++ b/docs/build/html/_sources/installation.rst.txt @@ -0,0 +1,12 @@ +Installation +============ + +.. code:: shell + + pip install squigglepy + +For plotting support, you can also use the ``plots`` extra: + +.. code:: shell + + pip install squigglepy[plots] diff --git a/docs/source/examples.rst b/docs/build/html/_sources/usage.rst.txt similarity index 98% rename from docs/source/examples.rst rename to docs/build/html/_sources/usage.rst.txt index c00053f..3e03a70 100644 --- a/docs/source/examples.rst +++ b/docs/build/html/_sources/usage.rst.txt @@ -1,7 +1,7 @@ Examples ======== -Piano Tuners Example +Piano tuners example ~~~~~~~~~~~~~~~~~~~~ Here’s the Squigglepy implementation of `the example from Squiggle @@ -135,7 +135,7 @@ Distributions # 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`. sq.zero_inflated(0.6, sq.norm(1, 2)) -Additional Features +Additional features ~~~~~~~~~~~~~~~~~~~ .. code:: python @@ -167,7 +167,7 @@ Additional Features # You can even pass your own correlation matrix! a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]]) -Example: Rolling a Die +Example: Rolling a die ^^^^^^^^^^^^^^^^^^^^^^ An example of how to use distributions to build tools: @@ -358,7 +358,7 @@ pretty limited. For more complex bayesian analysis, consider `bnlearn `__, or `pyMC `__. -Example: A Demonstration of the Monty Hall Problem +Example: A demonstration of the Monty Hall Problem ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: python @@ -466,3 +466,11 @@ More examples You can see more examples of squigglepy in action `here `__. + +Run tests +--------- + +Use ``black .`` for formatting. + +Run +``ruff check . && pytest && pip3 install . && python3 tests/integration.py`` diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index 2671007..0709a93 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -132,15 +132,22 @@
-
-

Installation#

-
pip install squigglepy
-
-
-

For plotting support, you can also use the plots extra:

-
pip install squigglepy[plots]
-
-
-
-
-

Run tests#

-

Use black . for formatting.

-

Run -ruff check . && pytest && pip3 install . && python3 tests/integration.py

-

Disclaimers#

This package is unofficial and supported by Peter Wildeford and Rethink @@ -383,11 +371,11 @@

Acknowledgements

next

-

squigglepy

+

Installation

@@ -406,8 +394,6 @@

Acknowledgements diff --git a/docs/build/html/installation.html b/docs/build/html/installation.html new file mode 100644 index 0000000..58f24e1 --- /dev/null +++ b/docs/build/html/installation.html @@ -0,0 +1,454 @@ + + + + + + + + + + + Installation — Squigglepy documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +
+

Installation#

+
pip install squigglepy
+
+
+

For plotting support, you can also use the plots extra:

+
pip install squigglepy[plots]
+
+
+
+ + +
+ + + + + + + +
+ + + +
+ + +
+
+ +
+ +
+
+
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv index e0602553fc716976229bdff18ba9472893628d7d..a26aeaca7cfc918c5d1e4c861ed4d7cf4da80055 100644 GIT binary patch delta 1231 zcmV;=1Tg!y3b+c8d4HQtZ`?KzhVT0;1hiMX$<@cYh7q7?jV3)4Txlc`p-7n@>27{~ zNl{<>CCTtiF2+I{J}*UaMz1K^zIstr653QAcnR5u%s>eSR1Uw{G2p&-jr=8r z-2Ix}?PjO;{0MfP(1opX?)i5xyn@Ipy~>@?D*L!fyo&1nDt~YoEGwE;0voUOy*%F* z+`aQEb8QSr-Zfqw{#o$SO_+y0PQRax_H7i&CAaogS1&Z)03T06!3tqrH_F^OBlbQF z6s2M~z#1Nu4nJ4ZX&L5vpwr9N+%oISQse@ZW0rTbxey`QtZ*s+!PUATQ5UN4Ik5Bj zN+;L|#k>-)9)J2v#h*>%blsA}Yv4HHyRLgwl=Rl2qg|Or1&_kyGo`;>)Y&hW5@s>X>B*at$4-74?-U>$q~%B2Fl; zy(N_i@Z13LfIS^rt-?cvI$@r9)6nMqGwAS43Momd@_(nUzETS)Z5ra+@mU<4C$1`g z(O<^jZLnZ_2|r!rzLnao+n~2fy*&LxJG)-Oqr_=i2`#MEid2JkkiHthRpli&q%!|1 zQHB&D)z}Z7Zi~--JKS*+ZtvhI*m*5%XQ)WvQnV!8=xQjyMQ<^P*pB5OBpDnIEg8F% zS{pjLB7Z|mU6HXHexPFux-l`@tAc_KlY6GXSJ5<+fCsNk0T-(LK*5z%(eXtK#nbL-sbw<+j8*=!2*4=|dAa@T$L zz!6Zs37&n!DsmsVw0>+=s*9A0Z!dapr85AO)*;F)`R}j zK`ag@)dGWGb6Mg|O<_aM3?Jax);HY^RDVQNs_pTkAqEg_=p=6?&r$l6j2coQjHMyY zycPwffZ>$XHuedtY{i!|2L>+>j1C3A5bwMJ-4?&>KOoL|Uy}dY@IMcB2uHB34gtP75 zGf39*{2Q-ecYBBODstM#oL#g{ec!F^om|y8-)EWK;4JB#?!{bFyj+jVZnBnChgG{Z zz4@YDcBTE2MqJHX;}5HE*;%_K?nt;Yw+26XVacu$mSoZ!&6>tksIrT;OZ1_Pt?}no tEW6Ua*Ra4%UY}-rI@Xt~bp9nKmACO99%jPbffV<2Nc)#}{{uK^%~;ghU&#Of delta 1229 zcmV;;1Ty=$3bqQ6d4HPAa-296hWGsxs+!r_lWe`qI4)PJ;)yHCtW|0_fGR@5x@5ZZ z^dk_^^bK(NoNQceIDEgZhhIYOCCIW=(Ck^WzpG6i6tH*9LID(iztOX^yhZmcF5d13ieo*}>18Y7xC=!gGYQ&rC%Vy`%Q)Gb^lAQsuS`y&E_EI<;HTr2 zPOz4m2Q6O$^nX>wA5G(MT{DN5!0mwViWUP_q|&4Cx!HUi__uKIadKsGK3~w87XYhG zP)ZW3ctI;5wW+00q$2lm=#<9Fj9RCX-(G^Sv^{@s+F7|xg!9bYQc6XsFWHSN5A1QXv$aY~Y^e1A6OcWMD`Y)#x9Pjcr2aaQ?< zz8YVeXu-A$e!IwRql{m+L9dm1e)vi|x}M{!#2Z=(Bb_svRD-sWzFR4D8I-W3GXH8> z#3@3mu^l|!8lU@mxECbc-oa6@vr4+oP?5luY)H7RtDykry~QA6d!B(*WN_FuWb8s2 zW9jIc41cXmNye_lj*czq+Qgcma|${f+%pBfY)vx>c<{;;aH)%T6kJ7>UgMPEzP&^Q zZ~Z(4x=tpZ0!>xqrt_a9WUwUt*CabjfwoiwnrtxBbe$jlHU&K-n@xfK1=jGG?z-MUf@Ifl?^&LE^ByN*Px?^H3B+#VxG|1opZvc4z>xM+*uF`YT8RgC->F^ol8{Q zWIOP&(R1KKli@(;((w4?!+$v(Gr$qRZ`y;=Ku7m31B)9Sf?Dye?84?=lqn!LVXLH$ zDSt-Rz~e-SJ@ucjxLx@Hd?Is^4?klXM+5OnG!1Bn2Q*n0EDmqyE!6TCO0yNw{>S;V zZsTJS7F`hk0ZQ#LXx*DmXhak@dG2s{-6j{0$v11=g90>cS5BdGo=H4pF43XbRX=2d zHaQ$+3k-fGRDm}%rHgZB_yEt>u5?#W5r0uBx3?b+F@R`Ir$nPfhEk?v)Q}Qkn;P1Y z*Py^OaGaFdv}M9dTkYb^gTO3+g0uz%}9 zmDqx6gNLgr_*46Ha|r8+lZaQBFxLHoY_q=^ZY1tgYRy!D$=!v=lF0GXhyFVtfK&jmUn85;oTlIWHm)N1@r-v#IQxrQ?^28mC7!*%i*5-tlqH zCB^eCJ$98fr#fu>E$L17{n&-)=SDQz4Z$V;uz|-;o}1&2n|n*}qcsn^M3|FFi=ris rL#|_I&(6_@Ot{3KCPH@M`Ch|;uvv9H+tal^@1* + + + @@ -225,15 +232,22 @@

diff --git a/docs/build/html/search.html b/docs/build/html/search.html index 814b3e6..ccbf991 100644 --- a/docs/build/html/search.html +++ b/docs/build/html/search.html @@ -134,15 +134,22 @@
@@ -208,6 +228,26 @@

@@ -491,7 +531,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def is_dist(obj): """ Test if a given object is a Squigglepy distribution. @@ -520,7 +560,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def is_continuous_dist(obj): from .distributions import ( ContinuousDistribution, @@ -543,7 +583,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def is_sampleable(obj): """ Test if a given object can be sampled from. @@ -582,7 +622,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def normalize(lst): """ Normalize a list to sum to 1. @@ -608,7 +648,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def event_occurs(p): """ Return True with probability ``p`` and False with probability ``1 - p``. @@ -635,7 +675,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def event_happens(p): """ Return True with probability ``p`` and False with probability ``1 - p``. @@ -658,7 +698,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def event(p): """ Return True with probability ``p`` and False with probability ``1 - p``. @@ -685,7 +725,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def one_in(p, digits=0, verbose=True): """ Convert a probability into "1 in X" notation. @@ -715,7 +755,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def get_percentiles( data, percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], @@ -759,7 +799,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def get_log_percentiles( data, percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], @@ -813,7 +853,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def get_mean_and_ci(data, credibility=90, digits=None): """ Return the mean and percentiles of the data. @@ -849,7 +889,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def get_median_and_ci(data, credibility=90, digits=None): """ Return the median and percentiles of the data. @@ -885,7 +925,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def geomean(a, weights=None, relative_weights=None, drop_na=True): """ Calculate the geometric mean. @@ -918,7 +958,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def p_to_odds(p): """ Calculate the decimal odds from a given probability. @@ -951,7 +991,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def odds_to_p(odds): """ Calculate the probability from given decimal odds. @@ -984,7 +1024,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def geomean_odds(a, weights=None, relative_weights=None, drop_na=True): """ Calculate the geometric mean of odds. @@ -1017,7 +1057,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def laplace(s, n=None, time_passed=None, time_remaining=None, time_fixed=False): """ Return probability of success on next trial given Laplace's law of succession. @@ -1085,7 +1125,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def growth_rate_to_doubling_time(growth_rate): """ Convert a positive growth rate to a doubling rate. @@ -1124,7 +1164,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def doubling_time_to_growth_rate(doubling_time): """ Convert a doubling time to a growth rate. @@ -1164,7 +1204,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def roll_die(sides, n=1): """ Roll a die. @@ -1206,7 +1246,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def flip_coin(n=1): """ Flip a coin. @@ -1236,7 +1276,7 @@

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def kelly(my_price, market_price, deference=0, bankroll=1, resolve_date=None, current=0): """ Calculate the Kelly criterion. @@ -1264,25 +1304,25 @@

Source code for squigglepy.utils

     -------
     dict
         A dict of values specifying:
-        * ``my_price``
-        * ``market_price``
-        * ``deference``
-        * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken
-          into account.
-        * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``.
-        * ``adj_delta_price`` : the absolute difference between ``adj_price`` and
-          ``market_price``.
-        * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll``
-          you should bet.
-        * ``target`` : the target amount of money you should have invested
-        * ``current``
-        * ``delta`` : the amount of money you should invest given what you already
-          have invested
-        * ``max_gain`` : the amount of money you would gain if you win
-        * ``modeled_gain`` : the expected value you would win given ``adj_price``
-        * ``expected_roi`` : the expected return on investment
-        * ``expected_arr`` : the expected ARR given ``resolve_date``
-        * ``resolve_date``
+            * ``my_price``
+            * ``market_price``
+            * ``deference``
+            * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken
+              into account.
+            * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``.
+            * ``adj_delta_price`` : the absolute difference between ``adj_price`` and
+              ``market_price``.
+            * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll``
+              you should bet.
+            * ``target`` : the target amount of money you should have invested
+            * ``current``
+            * ``delta`` : the amount of money you should invest given what you already
+              have invested
+            * ``max_gain`` : the amount of money you would gain if you win
+            * ``modeled_gain`` : the expected value you would win given ``adj_price``
+            * ``expected_roi`` : the expected return on investment
+            * ``expected_arr`` : the expected ARR given ``resolve_date``
+            * ``resolve_date``
 
     Examples
     --------
@@ -1330,7 +1370,7 @@ 

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def full_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): """ Alias for ``kelly`` where ``deference`` is 0. @@ -1355,25 +1395,25 @@

Source code for squigglepy.utils

     -------
     dict
         A dict of values specifying:
-        * ``my_price``
-        * ``market_price``
-        * ``deference``
-        * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken
-          into account.
-        * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``.
-        * ``adj_delta_price`` : the absolute difference between ``adj_price`` and
-          ``market_price``.
-        * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll``
-          you should bet.
-        * ``target`` : the target amount of money you should have invested
-        * ``current``
-        * ``delta`` : the amount of money you should invest given what you already
-          have invested
-        * ``max_gain`` : the amount of money you would gain if you win
-        * ``modeled_gain`` : the expected value you would win given ``adj_price``
-        * ``expected_roi`` : the expected return on investment
-        * ``expected_arr`` : the expected ARR given ``resolve_date``
-        * ``resolve_date``
+            * ``my_price``
+            * ``market_price``
+            * ``deference``
+            * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken
+              into account.
+            * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``.
+            * ``adj_delta_price`` : the absolute difference between ``adj_price`` and
+              ``market_price``.
+            * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll``
+              you should bet.
+            * ``target`` : the target amount of money you should have invested
+            * ``current``
+            * ``delta`` : the amount of money you should invest given what you already
+              have invested
+            * ``max_gain`` : the amount of money you would gain if you win
+            * ``modeled_gain`` : the expected value you would win given ``adj_price``
+            * ``expected_roi`` : the expected return on investment
+            * ``expected_arr`` : the expected ARR given ``resolve_date``
+            * ``resolve_date``
 
     Examples
     --------
@@ -1395,7 +1435,7 @@ 

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def half_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): """ Alias for ``kelly`` where ``deference`` is 0.5. @@ -1420,25 +1460,25 @@

Source code for squigglepy.utils

     -------
     dict
         A dict of values specifying:
-        * ``my_price``
-        * ``market_price``
-        * ``deference``
-        * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken
-          into account.
-        * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``.
-        * ``adj_delta_price`` : the absolute difference between ``adj_price`` and
-          ``market_price``.
-        * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll``
-          you should bet.
-        * ``target`` : the target amount of money you should have invested
-        * ``current``
-        * ``delta`` : the amount of money you should invest given what you already
-          have invested
-        * ``max_gain`` : the amount of money you would gain if you win
-        * ``modeled_gain`` : the expected value you would win given ``adj_price``
-        * ``expected_roi`` : the expected return on investment
-        * ``expected_arr`` : the expected ARR given ``resolve_date``
-        * ``resolve_date``
+            * ``my_price``
+            * ``market_price``
+            * ``deference``
+            * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken
+              into account.
+            * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``.
+            * ``adj_delta_price`` : the absolute difference between ``adj_price`` and
+              ``market_price``.
+            * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll``
+              you should bet.
+            * ``target`` : the target amount of money you should have invested
+            * ``current``
+            * ``delta`` : the amount of money you should invest given what you already
+              have invested
+            * ``max_gain`` : the amount of money you would gain if you win
+            * ``modeled_gain`` : the expected value you would win given ``adj_price``
+            * ``expected_roi`` : the expected return on investment
+            * ``expected_arr`` : the expected ARR given ``resolve_date``
+            * ``resolve_date``
 
     Examples
     --------
@@ -1460,7 +1500,7 @@ 

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def quarter_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): """ Alias for ``kelly`` where ``deference`` is 0.75. @@ -1485,25 +1525,25 @@

Source code for squigglepy.utils

     -------
     dict
         A dict of values specifying:
-        * ``my_price``
-        * ``market_price``
-        * ``deference``
-        * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken
-          into account.
-        * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``.
-        * ``adj_delta_price`` : the absolute difference between ``adj_price`` and
-          ``market_price``.
-        * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll``
-          you should bet.
-        * ``target`` : the target amount of money you should have invested
-        * ``current``
-        * ``delta`` : the amount of money you should invest given what you already
-          have invested
-        * ``max_gain`` : the amount of money you would gain if you win
-        * ``modeled_gain`` : the expected value you would win given ``adj_price``
-        * ``expected_roi`` : the expected return on investment
-        * ``expected_arr`` : the expected ARR given ``resolve_date``
-        * ``resolve_date``
+            * ``my_price``
+            * ``market_price``
+            * ``deference``
+            * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken
+              into account.
+            * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``.
+            * ``adj_delta_price`` : the absolute difference between ``adj_price`` and
+              ``market_price``.
+            * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll``
+              you should bet.
+            * ``target`` : the target amount of money you should have invested
+            * ``current``
+            * ``delta`` : the amount of money you should invest given what you already
+              have invested
+            * ``max_gain`` : the amount of money you would gain if you win
+            * ``modeled_gain`` : the expected value you would win given ``adj_price``
+            * ``expected_roi`` : the expected return on investment
+            * ``expected_arr`` : the expected ARR given ``resolve_date``
+            * ``resolve_date``
 
     Examples
     --------
@@ -1525,7 +1565,7 @@ 

Source code for squigglepy.utils

 
 
 
-[docs] +[docs] def extremize(p, e): """ Extremize a prediction. diff --git a/docs/build/html/_sources/README.rst.txt b/doc/build/html/_sources/README.rst.txt similarity index 100% rename from docs/build/html/_sources/README.rst.txt rename to doc/build/html/_sources/README.rst.txt diff --git a/docs/build/html/_sources/examples.rst.txt b/doc/build/html/_sources/examples.rst.txt similarity index 100% rename from docs/build/html/_sources/examples.rst.txt rename to doc/build/html/_sources/examples.rst.txt diff --git a/docs/build/html/_sources/index.rst.txt b/doc/build/html/_sources/index.rst.txt similarity index 100% rename from docs/build/html/_sources/index.rst.txt rename to doc/build/html/_sources/index.rst.txt diff --git a/docs/build/html/_sources/installation.rst.txt b/doc/build/html/_sources/installation.rst.txt similarity index 100% rename from docs/build/html/_sources/installation.rst.txt rename to doc/build/html/_sources/installation.rst.txt diff --git a/docs/build/html/_sources/reference/modules.rst.txt b/doc/build/html/_sources/reference/modules.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/modules.rst.txt rename to doc/build/html/_sources/reference/modules.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.bayes.rst.txt b/doc/build/html/_sources/reference/squigglepy.bayes.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.bayes.rst.txt rename to doc/build/html/_sources/reference/squigglepy.bayes.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.correlation.rst.txt b/doc/build/html/_sources/reference/squigglepy.correlation.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.correlation.rst.txt rename to doc/build/html/_sources/reference/squigglepy.correlation.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.distributions.rst.txt b/doc/build/html/_sources/reference/squigglepy.distributions.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.distributions.rst.txt rename to doc/build/html/_sources/reference/squigglepy.distributions.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.numbers.rst.txt b/doc/build/html/_sources/reference/squigglepy.numbers.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.numbers.rst.txt rename to doc/build/html/_sources/reference/squigglepy.numbers.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.rng.rst.txt b/doc/build/html/_sources/reference/squigglepy.rng.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.rng.rst.txt rename to doc/build/html/_sources/reference/squigglepy.rng.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.rst.txt b/doc/build/html/_sources/reference/squigglepy.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.rst.txt rename to doc/build/html/_sources/reference/squigglepy.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.samplers.rst.txt b/doc/build/html/_sources/reference/squigglepy.samplers.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.samplers.rst.txt rename to doc/build/html/_sources/reference/squigglepy.samplers.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.squigglepy.rst.txt b/doc/build/html/_sources/reference/squigglepy.squigglepy.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.squigglepy.rst.txt rename to doc/build/html/_sources/reference/squigglepy.squigglepy.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.tests.rst.txt b/doc/build/html/_sources/reference/squigglepy.tests.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.tests.rst.txt rename to doc/build/html/_sources/reference/squigglepy.tests.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.utils.rst.txt b/doc/build/html/_sources/reference/squigglepy.utils.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.utils.rst.txt rename to doc/build/html/_sources/reference/squigglepy.utils.rst.txt diff --git a/docs/build/html/_sources/reference/squigglepy.version.rst.txt b/doc/build/html/_sources/reference/squigglepy.version.rst.txt similarity index 100% rename from docs/build/html/_sources/reference/squigglepy.version.rst.txt rename to doc/build/html/_sources/reference/squigglepy.version.rst.txt diff --git a/docs/build/html/_sources/usage.rst.txt b/doc/build/html/_sources/usage.rst.txt similarity index 100% rename from docs/build/html/_sources/usage.rst.txt rename to doc/build/html/_sources/usage.rst.txt diff --git a/docs/build/html/_static/alabaster.css b/doc/build/html/_static/alabaster.css similarity index 100% rename from docs/build/html/_static/alabaster.css rename to doc/build/html/_static/alabaster.css diff --git a/docs/build/html/_static/basic.css b/doc/build/html/_static/basic.css similarity index 100% rename from docs/build/html/_static/basic.css rename to doc/build/html/_static/basic.css diff --git a/docs/build/html/_static/custom.css b/doc/build/html/_static/custom.css similarity index 100% rename from docs/build/html/_static/custom.css rename to doc/build/html/_static/custom.css diff --git a/docs/build/html/_static/doctools.js b/doc/build/html/_static/doctools.js similarity index 100% rename from docs/build/html/_static/doctools.js rename to doc/build/html/_static/doctools.js diff --git a/docs/build/html/_static/documentation_options.js b/doc/build/html/_static/documentation_options.js similarity index 100% rename from docs/build/html/_static/documentation_options.js rename to doc/build/html/_static/documentation_options.js diff --git a/docs/build/html/_static/file.png b/doc/build/html/_static/file.png similarity index 100% rename from docs/build/html/_static/file.png rename to doc/build/html/_static/file.png diff --git a/docs/build/html/_static/jquery.js b/doc/build/html/_static/jquery.js similarity index 100% rename from docs/build/html/_static/jquery.js rename to doc/build/html/_static/jquery.js diff --git a/docs/build/html/_static/language_data.js b/doc/build/html/_static/language_data.js similarity index 100% rename from docs/build/html/_static/language_data.js rename to doc/build/html/_static/language_data.js diff --git a/docs/build/html/_static/minus.png b/doc/build/html/_static/minus.png similarity index 100% rename from docs/build/html/_static/minus.png rename to doc/build/html/_static/minus.png diff --git a/docs/build/html/_static/plus.png b/doc/build/html/_static/plus.png similarity index 100% rename from docs/build/html/_static/plus.png rename to doc/build/html/_static/plus.png diff --git a/docs/build/html/_static/pygments.css b/doc/build/html/_static/pygments.css similarity index 100% rename from docs/build/html/_static/pygments.css rename to doc/build/html/_static/pygments.css diff --git a/docs/build/html/_static/scripts/bootstrap.js b/doc/build/html/_static/scripts/bootstrap.js similarity index 100% rename from docs/build/html/_static/scripts/bootstrap.js rename to doc/build/html/_static/scripts/bootstrap.js diff --git a/docs/build/html/_static/scripts/bootstrap.js.LICENSE.txt b/doc/build/html/_static/scripts/bootstrap.js.LICENSE.txt similarity index 100% rename from docs/build/html/_static/scripts/bootstrap.js.LICENSE.txt rename to doc/build/html/_static/scripts/bootstrap.js.LICENSE.txt diff --git a/docs/build/html/_static/scripts/bootstrap.js.map b/doc/build/html/_static/scripts/bootstrap.js.map similarity index 100% rename from docs/build/html/_static/scripts/bootstrap.js.map rename to doc/build/html/_static/scripts/bootstrap.js.map diff --git a/docs/build/html/_static/scripts/pydata-sphinx-theme.js b/doc/build/html/_static/scripts/pydata-sphinx-theme.js similarity index 100% rename from docs/build/html/_static/scripts/pydata-sphinx-theme.js rename to doc/build/html/_static/scripts/pydata-sphinx-theme.js diff --git a/docs/build/html/_static/scripts/pydata-sphinx-theme.js.map b/doc/build/html/_static/scripts/pydata-sphinx-theme.js.map similarity index 100% rename from docs/build/html/_static/scripts/pydata-sphinx-theme.js.map rename to doc/build/html/_static/scripts/pydata-sphinx-theme.js.map diff --git a/docs/build/html/_static/searchtools.js b/doc/build/html/_static/searchtools.js similarity index 100% rename from docs/build/html/_static/searchtools.js rename to doc/build/html/_static/searchtools.js diff --git a/docs/build/html/_static/sphinx_highlight.js b/doc/build/html/_static/sphinx_highlight.js similarity index 100% rename from docs/build/html/_static/sphinx_highlight.js rename to doc/build/html/_static/sphinx_highlight.js diff --git a/docs/build/html/_static/styles/bootstrap.css b/doc/build/html/_static/styles/bootstrap.css similarity index 100% rename from docs/build/html/_static/styles/bootstrap.css rename to doc/build/html/_static/styles/bootstrap.css diff --git a/docs/build/html/_static/styles/bootstrap.css.map b/doc/build/html/_static/styles/bootstrap.css.map similarity index 100% rename from docs/build/html/_static/styles/bootstrap.css.map rename to doc/build/html/_static/styles/bootstrap.css.map diff --git a/docs/build/html/_static/styles/pydata-sphinx-theme.css b/doc/build/html/_static/styles/pydata-sphinx-theme.css similarity index 100% rename from docs/build/html/_static/styles/pydata-sphinx-theme.css rename to doc/build/html/_static/styles/pydata-sphinx-theme.css diff --git a/docs/build/html/_static/styles/pydata-sphinx-theme.css.map b/doc/build/html/_static/styles/pydata-sphinx-theme.css.map similarity index 100% rename from docs/build/html/_static/styles/pydata-sphinx-theme.css.map rename to doc/build/html/_static/styles/pydata-sphinx-theme.css.map diff --git a/docs/build/html/_static/styles/theme.css b/doc/build/html/_static/styles/theme.css similarity index 100% rename from docs/build/html/_static/styles/theme.css rename to doc/build/html/_static/styles/theme.css diff --git a/docs/build/html/_static/underscore.js b/doc/build/html/_static/underscore.js similarity index 100% rename from docs/build/html/_static/underscore.js rename to doc/build/html/_static/underscore.js diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt b/doc/build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt rename to doc/build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css b/doc/build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css rename to doc/build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js b/doc/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js rename to doc/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js.LICENSE.txt b/doc/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js.LICENSE.txt similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js.LICENSE.txt rename to doc/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js.LICENSE.txt diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf b/doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf rename to doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 b/doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 rename to doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf b/doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf rename to doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 b/doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 rename to doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf b/doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf rename to doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 b/doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 rename to doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf b/doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf rename to doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf diff --git a/docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 b/doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 similarity index 100% rename from docs/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 rename to doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 diff --git a/docs/build/html/_static/webpack-macros.html b/doc/build/html/_static/webpack-macros.html similarity index 100% rename from docs/build/html/_static/webpack-macros.html rename to doc/build/html/_static/webpack-macros.html diff --git a/docs/build/html/examples.html b/doc/build/html/examples.html similarity index 100% rename from docs/build/html/examples.html rename to doc/build/html/examples.html diff --git a/docs/build/html/genindex.html b/doc/build/html/genindex.html similarity index 100% rename from docs/build/html/genindex.html rename to doc/build/html/genindex.html diff --git a/docs/build/html/index.html b/doc/build/html/index.html similarity index 100% rename from docs/build/html/index.html rename to doc/build/html/index.html diff --git a/docs/build/html/installation.html b/doc/build/html/installation.html similarity index 96% rename from docs/build/html/installation.html rename to doc/build/html/installation.html index 58f24e1..24b281c 100644 --- a/docs/build/html/installation.html +++ b/doc/build/html/installation.html @@ -41,7 +41,7 @@ - + @@ -148,13 +148,6 @@ - - - - - -
- -
-

next

-

Examples

-
- -
diff --git a/docs/build/html/search.html b/doc/build/html/search.html similarity index 100% rename from docs/build/html/search.html rename to doc/build/html/search.html diff --git a/docs/build/html/searchindex.js b/doc/build/html/searchindex.js similarity index 62% rename from docs/build/html/searchindex.js rename to doc/build/html/searchindex.js index b9d59de..8cb21c2 100644 --- a/docs/build/html/searchindex.js +++ b/doc/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index", "installation", "reference/modules", "reference/squigglepy", "reference/squigglepy.bayes", "reference/squigglepy.correlation", "reference/squigglepy.distributions", "reference/squigglepy.numbers", "reference/squigglepy.rng", "reference/squigglepy.samplers", "reference/squigglepy.utils", "reference/squigglepy.version", "usage"], "filenames": ["index.rst", "installation.rst", "reference/modules.rst", "reference/squigglepy.rst", "reference/squigglepy.bayes.rst", "reference/squigglepy.correlation.rst", "reference/squigglepy.distributions.rst", "reference/squigglepy.numbers.rst", "reference/squigglepy.rng.rst", "reference/squigglepy.samplers.rst", "reference/squigglepy.utils.rst", "reference/squigglepy.version.rst", "usage.rst"], "titles": ["Squigglepy: Implementation of Squiggle in Python", "Installation", "squigglepy", "squigglepy package", "squigglepy.bayes module", "squigglepy.correlation module", "squigglepy.distributions module", "squigglepy.numbers module", "squigglepy.rng module", "squigglepy.samplers module", "squigglepy.utils module", "squigglepy.version module", "Examples"], "terms": {"index": [], "modul": [2, 3], "search": [], "page": [], "i": [0, 4, 5, 6, 8, 9, 10, 12], "simpl": 0, "program": 0, "languag": 0, "intuit": 0, "probabilist": 0, "estim": 0, "It": [0, 9], "serv": 0, "its": 0, "own": [0, 12], "standalon": 0, "syntax": 0, "javascript": 0, "like": [0, 10], "intend": [0, 5], "us": [0, 1, 4, 5, 6, 8, 9, 10, 12], "frequent": 0, "also": [0, 1, 5, 6, 9, 10, 12], "sometim": 0, "want": [0, 4, 5, 12], "similar": 0, "function": [0, 4, 6, 10, 12], "especi": 0, "alongsid": [0, 9], "other": [0, 4, 9, 10, 12], "statist": 0, "packag": [0, 2, 5, 12], "numpi": [0, 9, 10, 12], "panda": 0, "matplotlib": [0, 12], "The": [0, 4, 5, 6, 8, 9, 10, 12], "here": [0, 12], "mani": [0, 4, 9], "pip": 1, "For": [1, 12], "plot": [1, 3, 6, 12], "support": [0, 1, 4], "you": [0, 1, 4, 5, 6, 9, 10, 12], "can": [0, 1, 5, 6, 9, 10, 12], "extra": 1, "": [0, 5, 6, 9, 10, 12], "from": [4, 5, 6, 9, 10, 12], "doc": 12, "import": 12, "sq": [4, 5, 6, 12], "np": [4, 5, 8, 10, 12], "pyplot": 12, "plt": 12, "number": [2, 3, 4, 5, 6, 8, 9, 10, 12], "k": [10, 12], "m": [4, 5, 12], "pprint": 12, "pop_of_ny_2022": 12, "8": [4, 6, 10, 12], "1": [4, 5, 6, 9, 10, 12], "4": [6, 9, 10, 12], "thi": [0, 4, 5, 6, 9, 10, 12], "mean": [4, 6, 9, 10, 12], "re": 12, "90": [6, 9, 10, 12], "confid": 12, "valu": [6, 9, 10, 12], "between": [0, 5, 6, 9, 10, 12], "million": 12, "pct_of_pop_w_piano": 12, "0": [4, 5, 6, 9, 10, 12], "2": [4, 5, 6, 9, 10, 12], "01": [4, 10, 12], "we": [4, 5, 10, 12], "assum": 12, "ar": [4, 5, 6, 9, 10, 12], "almost": 12, "peopl": 12, "multipl": 12, "pianos_per_piano_tun": 12, "50": [4, 10, 12], "piano_tuners_per_piano": 12, "total_tuners_in_2022": 12, "sampl": [0, 2, 3, 4, 5, 6, 9, 10, 12], "1000": [5, 6, 12], "note": [5, 10, 12], "shorthand": [0, 12], "get": [10, 12], "sd": [4, 6, 9, 12], "print": [4, 5, 9, 10, 12], "format": [10, 12], "round": [6, 10, 12], "std": 12, "percentil": [10, 12], "get_percentil": [2, 3, 10, 12], "digit": [6, 10, 12], "histogram": [6, 12], "hist": 12, "bin": [6, 12], "200": [6, 12], "show": 12, "shorter": 12, "And": 12, "version": [0, 2, 3, 10, 12], "incorpor": 12, "time": [10, 12], "def": [4, 6, 12], "pop_at_tim": 12, "t": [6, 9, 12], "year": [10, 12], "after": 12, "2022": 12, "avg_yearly_pct_chang": 12, "05": [5, 6, 10, 12], "expect": [10, 12], "nyc": 12, "continu": 12, "grow": 12, "an": [0, 4, 5, 6, 9, 10, 12], "roughli": 12, "per": [10, 12], "return": 12, "total_tuners_at_tim": 12, "total": [4, 9, 12], "2030": 12, "warn": 12, "Be": 12, "care": 12, "about": [10, 12], "divid": [10, 12], "etc": 12, "500": 12, "instead": [6, 10, 12], "outcom": 12, "count": 12, "norm": [2, 3, 4, 6, 9, 10, 12], "3": [4, 6, 9, 10, 12], "onli": [4, 5, 9, 10, 12], "two": [4, 5, 6, 12], "multipli": 12, "normal": [2, 3, 4, 6, 9, 10, 12], "interv": [6, 9, 10, 12], "too": 12, "one": [4, 10, 12], "than": [4, 6, 9, 10, 12], "100": [5, 10, 12], "longhand": 12, "n": [4, 5, 6, 9, 10, 12], "nice": 12, "progress": [4, 9, 12], "report": [0, 12], "verbos": [4, 9, 10, 12], "true": [4, 6, 9, 10, 12], "exist": [4, 9, 12], "lognorm": [2, 3, 6, 9, 12], "10": [6, 9, 10, 12], "tdist": [2, 3, 6, 12], "5": [4, 5, 6, 9, 10, 12], "triangular": [2, 3, 6, 9, 12], "pert": [2, 3, 6, 9, 12], "lam": [6, 9, 12], "binomi": [2, 3, 6, 9, 12], "p": [4, 6, 9, 10, 12], "beta": [2, 3, 4, 5, 6, 9, 12], "b": [6, 9, 12], "bernoulli": [2, 3, 4, 6, 12], "poisson": [2, 3, 6, 9, 12], "chisquar": [2, 3, 6, 12], "gamma": [2, 3, 5, 6, 9, 12], "pareto": [2, 3, 6, 9, 12], "exponenti": [2, 3, 6, 9, 12], "scale": [6, 9, 12], "geometr": [2, 3, 6, 9, 10, 12], "discret": [2, 3, 5, 6, 9, 12], "9": [4, 6, 9, 10, 12], "integ": [10, 12], "15": [6, 10, 12], "altern": 12, "object": [5, 10, 12], "No": 12, "weight": [4, 6, 9, 10, 12], "equal": [6, 9, 12], "mix": [6, 9, 12], "togeth": 12, "mixtur": [2, 3, 4, 6, 9, 12], "These": [10, 12], "each": [4, 5, 6, 9, 10, 12], "equival": [4, 12], "abov": [10, 12], "just": [4, 6, 10, 12], "differ": [6, 9, 10, 12], "wai": [5, 12], "do": [4, 6, 9, 10, 12], "notat": [6, 9, 10, 12], "make": [4, 9, 10, 12], "zero": [6, 12], "inflat": [6, 12], "60": [10, 12], "chanc": [6, 9, 12], "40": [10, 12], "zero_infl": [2, 3, 6, 12], "6": [4, 5, 6, 9, 10, 12], "add": [6, 12], "subtract": 12, "math": [0, 12], "chang": [0, 9, 12], "ci": [6, 9, 10, 12], "default": [4, 5, 6, 9, 10, 12], "80": [4, 5, 10, 12], "credibl": [6, 9, 10, 12], "clip": [2, 3, 6, 12], "lclip": [2, 3, 6, 9, 12], "rclip": [2, 3, 6, 9, 12], "anyth": [6, 12], "lower": [6, 12], "higher": 12, "pipe": [6, 12], "correl": [2, 3, 9, 12], "uniform": [2, 3, 6, 9, 12], "even": 12, "pass": [4, 5, 6, 10, 12], "your": [10, 12], "matrix": [5, 12], "how": [4, 10, 12], "build": 12, "tool": 12, "roll_di": [2, 3, 10, 12], "side": [10, 12], "list": [4, 5, 6, 9, 10, 12], "rang": [6, 9, 10, 12], "els": [4, 12], "none": [4, 5, 6, 9, 10, 12], "alreadi": [10, 12], "includ": [4, 5, 10, 12], "standard": [6, 9, 12], "util": [2, 3, 12], "women": 12, "ag": 12, "forti": 12, "who": 12, "particip": 12, "routin": 12, "screen": 12, "have": [4, 6, 9, 10, 12], "breast": 12, "cancer": [4, 12], "posit": [4, 5, 6, 10, 12], "mammographi": [4, 12], "without": [4, 12], "woman": 12, "group": [5, 9, 12], "had": 12, "what": [4, 6, 10, 12], "probabl": [4, 6, 9, 10, 12], "she": 12, "actual": 12, "ha": [5, 6, 10, 12], "approxim": [5, 6, 9, 12], "answer": [4, 12], "network": [4, 12], "reject": [4, 12], "bay": [2, 3, 12], "has_canc": [4, 12], "event": [2, 3, 4, 6, 10, 12], "096": [4, 12], "define_ev": [4, 12], "bayesnet": [2, 3, 4, 12], "find": [4, 12], "lambda": [4, 6, 9, 12], "e": [4, 10, 12], "conditional_on": [4, 12], "07723995880535531": [4, 12], "Or": [5, 12], "inform": [10, 12], "immedi": 12, "hand": 12, "directli": [5, 12], "calcul": [4, 6, 9, 10, 12], "though": 12, "doesn": 12, "work": [5, 9, 10, 12], "veri": [5, 12], "stuff": 12, "simple_bay": [2, 3, 4, 12], "prior": [4, 10, 12], "likelihood_h": [4, 12], "likelihood_not_h": [4, 12], "07763975155279504": [4, 12], "updat": [2, 3, 4, 12], "them": [4, 5, 6, 12], "prior_sampl": 12, "evid": [4, 12], "evidence_sampl": 12, "posterior": [4, 12], "posterior_sampl": 12, "averag": [2, 3, 4, 12], "average_sampl": 12, "artifici": 12, "intellig": 12, "section": 12, "hous": 12, "system": 12, "against": 12, "burglari": 12, "live": 12, "seismic": 12, "activ": 12, "area": 12, "occasion": 12, "set": [5, 6, 8, 10, 12], "off": 12, "earthquak": 12, "neighbor": 12, "mari": 12, "john": 12, "know": [4, 12], "If": [4, 5, 6, 9, 10, 12], "thei": [0, 12], "hear": 12, "call": [4, 12], "guarante": 12, "particular": 12, "dai": [10, 12], "go": 12, "95": [10, 12], "both": [4, 9, 12], "94": [10, 12], "29": [4, 12], "noth": 12, "fals": [4, 9, 10, 12], "when": [4, 6, 9, 10, 12], "goe": 12, "But": [6, 12], "sai": 12, "hi": 12, "70": [10, 12], "p_alarm_goes_off": 12, "elif": 12, "001": 12, "p_john_cal": 12, "alarm_goes_off": 12, "p_mary_cal": 12, "7": [5, 6, 10, 12], "burglary_happen": 12, "earthquake_happen": 12, "002": 12, "john_cal": 12, "mary_cal": 12, "happen": [6, 9, 10, 12], "result": [4, 5, 6, 9, 10, 12], "19": 12, "vari": 12, "becaus": [9, 12], "base": [4, 5, 6, 9, 10, 12], "random": [6, 8, 9, 12], "mai": [0, 5, 12], "take": [4, 6, 9, 12], "minut": 12, "been": [5, 12], "27": [6, 12], "quickli": 12, "built": [6, 12], "cach": [4, 9, 12], "reload_cach": [4, 9, 12], "recalcul": [4, 9, 12], "amount": [10, 12], "analysi": 12, "pretti": 12, "limit": 12, "consid": [10, 12], "sorobn": 12, "pomegran": 12, "bnlearn": 12, "pymc": 12, "monte_hal": 12, "door_pick": 12, "switch": 12, "door": 12, "c": 12, "car_is_behind_door": 12, "reveal_door": 12, "d": 12, "old_door_pick": 12, "won_car": 12, "won": [6, 12], "r": 12, "win": [10, 12], "int": [4, 5, 6, 9, 10, 12], "66": 12, "34": 12, "imagin": 12, "flip": [10, 12], "head": [10, 12], "out": [4, 9, 12], "my": 12, "blue": 12, "bag": 12, "tail": [10, 12], "red": 12, "contain": [10, 12], "20": [6, 9, 10, 12], "took": 12, "flip_coin": [2, 3, 10, 12], "me": [0, 12], "12306": 12, "which": [0, 4, 6, 9, 10, 12], "close": [5, 12], "correct": 12, "12292": 12, "gener": [4, 8, 12], "combin": [6, 12], "bankrol": [10, 12], "determin": [6, 12], "size": 12, "criterion": [10, 12], "ve": [10, 12], "price": [10, 12], "question": 12, "market": [10, 12], "resolv": [10, 12], "favor": 12, "see": 12, "65": [5, 12], "willing": 12, "should": [4, 6, 9, 10, 12], "follow": 12, "kelly_data": 12, "my_pric": [10, 12], "market_pric": [10, 12], "fraction": [10, 12], "143": 12, "target": [10, 12], "much": [4, 10, 12], "monei": [10, 12], "invest": [10, 12], "142": 12, "86": 12, "expected_roi": [10, 12], "roi": 12, "077": 12, "action": 12, "black": 12, "ruff": 12, "check": [5, 12], "pytest": 12, "pip3": 12, "python3": 12, "integr": 12, "py": 12, "unoffici": 0, "myself": [], "rethink": 0, "prioriti": 0, "affili": 0, "associ": [0, 6, 9], "quantifi": 0, "uncertainti": 0, "research": 0, "institut": 0, "maintain": 0, "new": 0, "yet": [0, 4], "stabl": 0, "product": 0, "so": [0, 10], "encount": 0, "bug": 0, "error": 0, "pleas": 0, "those": 0, "fix": [0, 10], "possibl": 0, "futur": [0, 4, 9], "introduc": 0, "break": 0, "avail": 0, "under": [0, 8], "mit": 0, "licens": 0, "primari": 0, "author": 0, "peter": 0, "wildeford": 0, "agust\u00edn": 0, "covarrubia": 0, "bernardo": 0, "baron": 0, "contribut": 0, "sever": 0, "kei": 0, "develop": 0, "thank": 0, "ozzi": 0, "gooen": 0, "creat": 0, "origin": [0, 5], "dawn": 0, "drescher": 0, "help": 0, "come": 0, "up": 0, "idea": 0, "well": [0, 9], "featur": 0, "start": 4, "readm": [], "subpackag": [], "submodul": 2, "distribut": [0, 2, 3, 4, 5, 9, 10], "rng": [2, 3], "sampler": [2, 3], "content": [], "test": [10, 12], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "correlationgroup": [2, 3, 5], "correlated_dist": [3, 5], "correlation_matrix": [3, 5], "correlation_toler": [3, 5], "has_sufficient_sample_divers": [3, 5], "induce_correl": [3, 5], "min_unique_sampl": [3, 5], "basedistribut": [2, 3, 6, 9, 10], "bernoullidistribut": [2, 3, 6], "betadistribut": [2, 3, 6], "binomialdistribut": [2, 3, 6], "categoricaldistribut": [2, 3, 6], "chisquaredistribut": [2, 3, 6], "complexdistribut": [2, 3, 6, 10], "compositedistribut": [2, 3, 6], "constantdistribut": [2, 3, 6], "continuousdistribut": [2, 3, 6], "discretedistribut": [2, 3, 6], "exponentialdistribut": [2, 3, 6], "gammadistribut": [2, 3, 6], "geometricdistribut": [2, 3, 6], "logtdistribut": [2, 3, 6], "lognormaldistribut": [2, 3, 6], "mixturedistribut": [2, 3, 6], "normaldistribut": [2, 3, 6], "operabledistribut": [2, 3, 5, 6], "pertdistribut": [2, 3, 6], "paretodistribut": [2, 3, 6], "poissondistribut": [2, 3, 6], "tdistribut": [2, 3, 6], "triangulardistribut": [2, 3, 6], "uniformdistribut": [2, 3, 6], "const": [2, 3, 6], "dist_ceil": [2, 3, 6], "dist_exp": [2, 3, 6], "dist_floor": [2, 3, 6], "dist_fn": [2, 3, 6], "dist_log": [2, 3, 6], "dist_max": [2, 3, 6], "dist_min": [2, 3, 6], "dist_round": [2, 3, 6], "inf0": [2, 3, 6], "log_tdist": [2, 3, 6], "set_se": [2, 3, 8, 9, 10], "bernoulli_sampl": [2, 3, 9], "beta_sampl": [2, 3, 9], "binomial_sampl": [2, 3, 9], "chi_square_sampl": [2, 3, 9], "discrete_sampl": [2, 3, 9], "exponential_sampl": [2, 3, 9], "gamma_sampl": [2, 3, 9], "geometric_sampl": [2, 3, 9], "log_t_sampl": [2, 3, 9], "lognormal_sampl": [2, 3, 9], "mixture_sampl": [2, 3, 9], "normal_sampl": [2, 3, 9], "pareto_sampl": [2, 3, 9], "pert_sampl": [2, 3, 9], "poisson_sampl": [2, 3, 9], "sample_correlated_group": [2, 3, 9], "t_sampl": [2, 3, 9], "triangular_sampl": [2, 3, 9], "uniform_sampl": [2, 3, 9], "doubling_time_to_growth_r": [2, 3, 10], "event_happen": [2, 3, 10], "event_occur": [2, 3, 10], "extrem": [2, 3, 5, 10], "full_kelli": [2, 3, 10], "geomean": [2, 3, 10], "geomean_odd": [2, 3, 10], "get_log_percentil": [2, 3, 10], "get_mean_and_ci": [2, 3, 10], "get_median_and_ci": [2, 3, 10], "growth_rate_to_doubling_tim": [2, 3, 10], "half_kelli": [2, 3, 10], "is_continuous_dist": [2, 3, 10], "is_dist": [2, 3, 10], "is_sampl": [2, 3, 10], "kelli": [0, 2, 3, 10], "laplac": [2, 3, 10], "odds_to_p": [2, 3, 10], "one_in": [2, 3, 10], "p_to_odd": [2, 3, 10], "quarter_kelli": [2, 3, 10], "relative_weight": [4, 6, 9, 10], "sourc": [4, 5, 6, 8, 9, 10], "arrai": [4, 5, 9, 10], "float": [4, 5, 6, 8, 9, 10], "put": 4, "versu": 4, "infer": [0, 4], "sum": [4, 6, 9, 10], "rel": [4, 6, 9, 10], "given": [4, 6, 9, 10], "A": [4, 6, 9, 10], "accord": [4, 5, 9], "event_fn": 4, "reduce_fn": 4, "raw": 4, "memcach": [4, 9], "memcache_load": 4, "memcache_sav": 4, "dump_cache_fil": [4, 9], "load_cache_fil": [4, 9], "cache_file_primari": [4, 9], "core": [4, 9], "bayesian": [0, 4], "allow": 4, "condit": 4, "custom": [4, 6], "defin": [4, 5, 6, 9, 10], "all": [4, 5, 6, 9, 10], "simul": 4, "aggreg": 4, "final": 4, "bool": [4, 5, 9, 10], "memori": [4, 9], "match": [4, 5, 9], "load": [4, 9], "save": [4, 9], "ani": [4, 5, 6, 9, 10], "ignor": [4, 6, 9], "str": [4, 6, 9, 10], "present": [4, 9], "write": [4, 9], "binari": [4, 6, 9], "file": [4, 9], "path": [4, 9], "sqlcach": [4, 9], "append": [4, 9], "name": [4, 6, 9], "first": [4, 9], "attempt": [4, 9], "otherwis": [4, 6, 9, 10], "statement": [4, 9], "comput": [4, 9], "run": [4, 9, 12], "singl": [4, 9], "process": [4, 9], "greater": [4, 6, 9], "multiprocess": [4, 9], "pool": [4, 9], "variou": [4, 9], "likelihood": [4, 6, 9, 10], "rate": [4, 10], "rule": [4, 10], "h": 4, "hypothesi": 4, "aka": [4, 6, 9], "evidence_weight": 4, "perform": 4, "produc": [4, 5], "current": [4, 10], "must": [4, 5, 6, 9, 10], "either": [4, 6, 9, 10], "type": 4, "matter": [4, 6], "where": [4, 5, 9, 10], "53": 4, "implement": [5, 12], "iman": 5, "conov": 5, "method": 5, "induc": 5, "some": 5, "code": 5, "adapt": 5, "abraham": 5, "lee": 5, "mcerp": 5, "tisimst": 5, "class": [5, 6], "tupl": 5, "ndarrai": [5, 9], "float64": [5, 9], "hold": 5, "metadata": 5, "user": [5, 9], "rather": 5, "dure": 5, "dtype": [5, 9], "relative_threshold": 5, "absolute_threshold": 5, "suffici": 5, "uniqu": 5, "data": [5, 10], "column": 5, "wise": 5, "dataset": 5, "2d": 5, "independ": 5, "variabl": [5, 9, 10], "correspond": 5, "corrmat": 5, "desir": [5, 6, 10], "coeffici": 5, "symmetr": 5, "definit": 5, "order": 5, "new_data": 5, "toler": 5, "_min_unique_sampl": 5, "rank": 5, "emploi": 5, "while": 5, "preserv": 5, "margin": 5, "best": 5, "effort": 5, "basi": 5, "fail": 5, "depend": 5, "provid": 5, "except": 5, "rais": 5, "case": [5, 6], "abl": 5, "enough": 5, "shuffl": 5, "notabl": 5, "hard": 5, "common": [5, 6, 9], "few": 5, "spearman": 5, "semi": 5, "confus": 5, "covari": 5, "exclus": 5, "same": [5, 6, 9, 10], "option": 5, "overrid": 5, "absolut": [5, 10], "disabl": 5, "correlated_vari": 5, "input": 5, "suppos": 5, "solar_radi": 5, "temperatur": 5, "300": 5, "22": 5, "28": [5, 10], "corrcoef": 5, "6975960649767123": 5, "could": [5, 6], "funding_gap": 5, "cost_per_deliveri": 5, "effect_s": 5, "20_000": 5, "80_000": 5, "30": [5, 10], "580520": 5, "480149": 5, "580962": 5, "187831": 5, "abc": 6, "item": [6, 9], "df": [6, 9], "left": [6, 9], "right": [6, 9], "fn": 6, "fn_str": 6, "infix": 6, "x": [6, 10], "shape": [6, 9], "y": 6, "norm_mean": 6, "norm_sd": 6, "lognorm_mean": 6, "lognorm_sd": 6, "dist": [6, 9], "num_sampl": 6, "draw": 6, "mode": [6, 9, 10], "initi": 6, "alpha": [6, 9], "typic": [6, 9], "trial": [6, 9, 10], "success": [6, 9, 10], "failur": [6, 9, 10], "chi": [6, 9], "squar": [6, 9], "degre": [6, 9], "freedom": [6, 9], "chiaquar": 6, "dist1": 6, "bound": 6, "output": 6, "appli": 6, "until": 6, "funciton": 6, "partial": 6, "suitabl": 6, "upper": 6, "lazi": 6, "evalu": 6, "constant": 6, "alwai": 6, "categor": [6, 9], "dict": [6, 9, 10], "being": [6, 9], "thing": [6, 9], "ceil": 6, "exp": 6, "floor": 6, "dist2": 6, "second": 6, "argument": 6, "By": 6, "__name__": 6, "doubl": [6, 10], "718281828459045": 6, "log": [6, 9, 10], "maximum": 6, "max": 6, "minimum": 6, "min": 6, "below": [6, 9], "coerc": [6, 9], "individu": [6, 9], "p_zero": 6, "arbitrari": 6, "alia": [6, 10], "val": 6, "space": [6, 9], "via": [6, 9], "loos": [6, 9], "unlik": [6, 9], "precis": [6, 9], "classic": 6, "low": [6, 9], "high": [6, 9], "underli": 6, "deviat": [6, 9], "04": 6, "21": [6, 9], "09": 6, "147": 6, "smallest": [6, 9], "most": [6, 9, 10], "largest": [6, 9], "unless": [6, 9], "less": 6, "becom": 6, "08": [6, 10], "seed": 8, "default_rng": 8, "hood": 8, "intern": [8, 9], "42": [8, 9, 10], "pcg64": 8, "0x127ede9e0": 8, "22145847498048798": 9, "808417207931989": 9, "_multicore_tqdm_n": 9, "_multicore_tqdm_cor": 9, "tqdm": 9, "interfac": 9, "meant": 9, "bar": 9, "multicor": 9, "safe": 9, "24": [9, 10], "042086039659946": 9, "290716894247602": 9, "addition": 9, "052949773846356": 9, "3562412406168636": 9, "ranom": 9, "183867278765718": 9, "7859113725925972": 9, "1041655362137777": 9, "30471707975443135": 9, "069666324736094": 9, "327625176788963": 9, "13": [9, 10], "_correlate_if_need": 9, "npy": 9, "1m": 9, "592627415218455": 9, "7281209657534462": 9, "10817361": 9, "45828454": 9, "requested_dist": 9, "store": 9, "themselv": 9, "_correlated_sampl": 9, "necessari": 9, "need": 9, "onc": [9, 10], "regardless": 9, "tree": 9, "oper": [6, 9], "7887113716855985": 9, "7739560485559633": 9, "doubling_tim": 10, "convert": 10, "growth": 10, "express": 10, "unit": 10, "g": 10, "remain": 10, "got": 10, "annual": 10, "sens": 10, "talk": 10, "percentag": 10, "12": 10, "05946309435929531": 10, "predict": 10, "within": 10, "factor": 10, "73": 10, "http": 10, "arxiv": 10, "org": 10, "ab": 10, "2111": 10, "03153": 10, "875428191155692": 10, "coin": 10, "resolve_d": 10, "defer": 10, "give": 10, "bet": [0, 10], "back": 10, "arr": 10, "yyyi": 10, "mm": 10, "dd": 10, "addit": [0, 10], "specifi": 10, "adj_pric": 10, "adjust": 10, "taken": 10, "account": 10, "delta_pric": 10, "adj_delta_pric": 10, "indic": 10, "delta": 10, "max_gain": 10, "would": 10, "gain": 10, "modeled_gain": 10, "expected_arr": 10, "125": 10, "72": 10, "75": 10, "drop_na": 10, "boolean": 10, "na": 10, "drop": 10, "1072325059538595": 10, "odd": 10, "befor": 10, "42985748800076845": 10, "99": 10, "revers": 10, "displai": 10, "95th": 10, "5th": 10, "swap": 10, "easi": 10, "read": 10, "dictionari": 10, "power": 10, "25": 10, "49": 10, "74": 10, "ci_low": 10, "ci_high": 10, "median": 10, "growth_rat": 10, "69": 10, "66071689357483": 10, "55": 10, "62": 10, "23": 10, "375": 10, "obj": 10, "string": 10, "callabl": 10, "half": 10, "quarter": 10, "full": 10, "time_pass": 10, "time_remain": 10, "time_fix": 10, "next": 10, "law": 10, "invari": 10, "www": 10, "lesswrong": 10, "com": 10, "post": 10, "we7sk8w8aixqknar": 10, "among": 10, "past": 10, "leav": 10, "occur": 10, "observ": 10, "least": 10, "over": 10, "period": 10, "wa": 10, "chosen": 10, "specif": 10, "recent": 10, "sun": 10, "risen": 10, "000": 10, "rise": 10, "again": 10, "tomorrow": 10, "999990000199996": 10, "last": 10, "nuke": 10, "war": 10, "77": 10, "ago": 10, "naiv": 10, "012820512820512664": 10, "lst": 10, "decim": 10, "09090909090909091": 10, "logic": 10, "1111111111111111": 10, "48": 10, "31": 10, "188": 10, "roll": 10, "die": 10, "dice": 10, "collect": 6, "squigglepi": [1, 12], "squiggl": 12, "python": 12, "api": 0, "refer": 0, "exampl": 0, "piano": 0, "tuner": 0, "more": 0, "instal": [0, 12], "usag": 0, "disclaim": [], "acknowledg": [], "alarm": [], "net": [], "demonstr": [], "monti": [], "hall": [], "problem": [], "complex": [], "interact": []}, "objects": {"": [[3, 0, 0, "-", "squigglepy"]], "squigglepy": [[4, 0, 0, "-", "bayes"], [5, 0, 0, "-", "correlation"], [6, 0, 0, "-", "distributions"], [7, 0, 0, "-", "numbers"], [8, 0, 0, "-", "rng"], [9, 0, 0, "-", "samplers"], [10, 0, 0, "-", "utils"], [11, 0, 0, "-", "version"]], "squigglepy.bayes": [[4, 1, 1, "", "average"], [4, 1, 1, "", "bayesnet"], [4, 1, 1, "", "simple_bayes"], [4, 1, 1, "", "update"]], "squigglepy.correlation": [[5, 2, 1, "", "CorrelationGroup"], [5, 1, 1, "", "correlate"]], "squigglepy.correlation.CorrelationGroup": [[5, 3, 1, "", "correlated_dists"], [5, 3, 1, "", "correlation_matrix"], [5, 3, 1, "", "correlation_tolerance"], [5, 4, 1, "", "has_sufficient_sample_diversity"], [5, 4, 1, "", "induce_correlation"], [5, 3, 1, "", "min_unique_samples"]], "squigglepy.distributions": [[6, 2, 1, "", "BaseDistribution"], [6, 2, 1, "", "BernoulliDistribution"], [6, 2, 1, "", "BetaDistribution"], [6, 2, 1, "", "BinomialDistribution"], [6, 2, 1, "", "CategoricalDistribution"], [6, 2, 1, "", "ChiSquareDistribution"], [6, 2, 1, "", "ComplexDistribution"], [6, 2, 1, "", "CompositeDistribution"], [6, 2, 1, "", "ConstantDistribution"], [6, 2, 1, "", "ContinuousDistribution"], [6, 2, 1, "", "DiscreteDistribution"], [6, 2, 1, "", "ExponentialDistribution"], [6, 2, 1, "", "GammaDistribution"], [6, 2, 1, "", "GeometricDistribution"], [6, 2, 1, "", "LogTDistribution"], [6, 2, 1, "", "LognormalDistribution"], [6, 2, 1, "", "MixtureDistribution"], [6, 2, 1, "", "NormalDistribution"], [6, 2, 1, "", "OperableDistribution"], [6, 2, 1, "", "PERTDistribution"], [6, 2, 1, "", "ParetoDistribution"], [6, 2, 1, "", "PoissonDistribution"], [6, 2, 1, "", "TDistribution"], [6, 2, 1, "", "TriangularDistribution"], [6, 2, 1, "", "UniformDistribution"], [6, 1, 1, "", "bernoulli"], [6, 1, 1, "", "beta"], [6, 1, 1, "", "binomial"], [6, 1, 1, "", "chisquare"], [6, 1, 1, "", "clip"], [6, 1, 1, "", "const"], [6, 1, 1, "", "discrete"], [6, 1, 1, "", "dist_ceil"], [6, 1, 1, "", "dist_exp"], [6, 1, 1, "", "dist_floor"], [6, 1, 1, "", "dist_fn"], [6, 1, 1, "", "dist_log"], [6, 1, 1, "", "dist_max"], [6, 1, 1, "", "dist_min"], [6, 1, 1, "", "dist_round"], [6, 1, 1, "", "exponential"], [6, 1, 1, "", "gamma"], [6, 1, 1, "", "geometric"], [6, 1, 1, "", "inf0"], [6, 1, 1, "", "lclip"], [6, 1, 1, "", "log_tdist"], [6, 1, 1, "", "lognorm"], [6, 1, 1, "", "mixture"], [6, 1, 1, "", "norm"], [6, 1, 1, "", "pareto"], [6, 1, 1, "", "pert"], [6, 1, 1, "", "poisson"], [6, 1, 1, "", "rclip"], [6, 1, 1, "", "tdist"], [6, 1, 1, "", "to"], [6, 1, 1, "", "triangular"], [6, 1, 1, "", "uniform"], [6, 1, 1, "", "zero_inflated"]], "squigglepy.distributions.OperableDistribution": [[6, 4, 1, "", "plot"]], "squigglepy.rng": [[8, 1, 1, "", "set_seed"]], "squigglepy.samplers": [[9, 1, 1, "", "bernoulli_sample"], [9, 1, 1, "", "beta_sample"], [9, 1, 1, "", "binomial_sample"], [9, 1, 1, "", "chi_square_sample"], [9, 1, 1, "", "discrete_sample"], [9, 1, 1, "", "exponential_sample"], [9, 1, 1, "", "gamma_sample"], [9, 1, 1, "", "geometric_sample"], [9, 1, 1, "", "log_t_sample"], [9, 1, 1, "", "lognormal_sample"], [9, 1, 1, "", "mixture_sample"], [9, 1, 1, "", "normal_sample"], [9, 1, 1, "", "pareto_sample"], [9, 1, 1, "", "pert_sample"], [9, 1, 1, "", "poisson_sample"], [9, 1, 1, "", "sample"], [9, 1, 1, "", "sample_correlated_group"], [9, 1, 1, "", "t_sample"], [9, 1, 1, "", "triangular_sample"], [9, 1, 1, "", "uniform_sample"]], "squigglepy.utils": [[10, 1, 1, "", "doubling_time_to_growth_rate"], [10, 1, 1, "", "event"], [10, 1, 1, "", "event_happens"], [10, 1, 1, "", "event_occurs"], [10, 1, 1, "", "extremize"], [10, 1, 1, "", "flip_coin"], [10, 1, 1, "", "full_kelly"], [10, 1, 1, "", "geomean"], [10, 1, 1, "", "geomean_odds"], [10, 1, 1, "", "get_log_percentiles"], [10, 1, 1, "", "get_mean_and_ci"], [10, 1, 1, "", "get_median_and_ci"], [10, 1, 1, "", "get_percentiles"], [10, 1, 1, "", "growth_rate_to_doubling_time"], [10, 1, 1, "", "half_kelly"], [10, 1, 1, "", "is_continuous_dist"], [10, 1, 1, "", "is_dist"], [10, 1, 1, "", "is_sampleable"], [10, 1, 1, "", "kelly"], [10, 1, 1, "", "laplace"], [10, 1, 1, "", "normalize"], [10, 1, 1, "", "odds_to_p"], [10, 1, 1, "", "one_in"], [10, 1, 1, "", "p_to_odds"], [10, 1, 1, "", "quarter_kelly"], [10, 1, 1, "", "roll_die"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "method", "Python method"]}, "titleterms": {"welcom": [], "squigglepi": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "": [], "document": [], "indic": [], "tabl": [], "implement": 0, "squiggl": 0, "python": 0, "instal": 1, "usag": [], "piano": 12, "tuner": 12, "exampl": [4, 5, 6, 8, 9, 10, 12], "distribut": [6, 12], "addit": 12, "featur": 12, "roll": 12, "die": 12, "bayesian": 12, "infer": 12, "alarm": 12, "net": 12, "A": 12, "demonstr": 12, "monti": 12, "hall": 12, "problem": 12, "more": 12, "complex": 12, "coin": 12, "dice": 12, "interact": 12, "kelli": 12, "bet": 12, "run": [], "test": [], "disclaim": 0, "acknowledg": 0, "packag": 3, "subpackag": [], "modul": [4, 5, 6, 7, 8, 9, 10, 11], "content": 0, "submodul": 3, "bay": 4, "correl": 5, "number": 7, "rng": 8, "sampler": 9, "util": 10, "version": 11, "integr": [], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "paramet": [4, 5, 6, 8, 9, 10], "return": [4, 5, 6, 8, 9, 10], "api": [], "refer": []}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"squigglepy": [[2, "squigglepy"]], "Examples": [[4, "examples"], [4, "id3"], [4, "id6"], [4, "id9"], [8, "examples"], [9, "examples"], [9, "id3"], [9, "id6"], [9, "id9"], [9, "id12"], [9, "id15"], [9, "id18"], [9, "id21"], [9, "id24"], [9, "id27"], [9, "id30"], [9, "id33"], [9, "id36"], [9, "id39"], [9, "id42"], [9, "id45"], [9, "id48"], [9, "id51"], [9, "id54"], [10, "examples"], [10, "id3"], [10, "id5"], [10, "id7"], [10, "id10"], [10, "id13"], [10, "id16"], [10, "id19"], [10, "id22"], [10, "id25"], [10, "id28"], [10, "id31"], [10, "id34"], [10, "id37"], [10, "id40"], [10, "id43"], [10, "id46"], [10, "id49"], [10, "id52"], [10, "id55"], [10, "id58"], [10, "id61"], [10, "id64"], [10, "id67"], [10, "id70"], [5, "examples"], [6, "examples"], [6, "id2"], [6, "id5"], [6, "id8"], [6, "id11"], [6, "id14"], [6, "id17"], [6, "id20"], [6, "id23"], [6, "id26"], [6, "id29"], [6, "id32"], [6, "id35"], [6, "id38"], [6, "id41"], [6, "id44"], [6, "id47"], [6, "id50"], [6, "id53"], [6, "id56"], [6, "id59"], [6, "id62"], [6, "id65"], [6, "id68"], [6, "id71"], [6, "id74"], [6, "id77"], [6, "id80"], [6, "id83"], [6, "id86"], [6, "id89"], [6, "id92"], [6, "id95"], [6, "id98"], [12, "examples"]], "squigglepy.bayes module": [[4, "module-squigglepy.bayes"]], "Parameters": [[4, "parameters"], [4, "id1"], [4, "id4"], [4, "id7"], [8, "parameters"], [9, "parameters"], [9, "id1"], [9, "id4"], [9, "id7"], [9, "id10"], [9, "id13"], [9, "id16"], [9, "id19"], [9, "id22"], [9, "id25"], [9, "id28"], [9, "id31"], [9, "id34"], [9, "id37"], [9, "id40"], [9, "id43"], [9, "id46"], [9, "id49"], [9, "id52"], [10, "parameters"], [10, "id1"], [10, "id4"], [10, "id6"], [10, "id8"], [10, "id11"], [10, "id14"], [10, "id17"], [10, "id20"], [10, "id23"], [10, "id26"], [10, "id29"], [10, "id32"], [10, "id35"], [10, "id38"], [10, "id41"], [10, "id44"], [10, "id47"], [10, "id50"], [10, "id53"], [10, "id56"], [10, "id59"], [10, "id62"], [10, "id65"], [10, "id68"], [5, "parameters"], [5, "id1"], [6, "parameters"], [6, "id1"], [6, "id3"], [6, "id6"], [6, "id9"], [6, "id12"], [6, "id15"], [6, "id18"], [6, "id21"], [6, "id24"], [6, "id27"], [6, "id30"], [6, "id33"], [6, "id36"], [6, "id39"], [6, "id42"], [6, "id45"], [6, "id48"], [6, "id51"], [6, "id54"], [6, "id57"], [6, "id60"], [6, "id63"], [6, "id66"], [6, "id69"], [6, "id72"], [6, "id75"], [6, "id78"], [6, "id81"], [6, "id84"], [6, "id87"], [6, "id90"], [6, "id93"], [6, "id96"]], "Returns": [[4, "returns"], [4, "id2"], [4, "id5"], [4, "id8"], [8, "returns"], [9, "returns"], [9, "id2"], [9, "id5"], [9, "id8"], [9, "id11"], [9, "id14"], [9, "id17"], [9, "id20"], [9, "id23"], [9, "id26"], [9, "id29"], [9, "id32"], [9, "id35"], [9, "id38"], [9, "id41"], [9, "id44"], [9, "id47"], [9, "id50"], [9, "id53"], [10, "returns"], [10, "id2"], [10, "id9"], [10, "id12"], [10, "id15"], [10, "id18"], [10, "id21"], [10, "id24"], [10, "id27"], [10, "id30"], [10, "id33"], [10, "id36"], [10, "id39"], [10, "id42"], [10, "id45"], [10, "id48"], [10, "id51"], [10, "id54"], [10, "id57"], [10, "id60"], [10, "id63"], [10, "id66"], [10, "id69"], [5, "returns"], [5, "id2"], [6, "returns"], [6, "id4"], [6, "id7"], [6, "id10"], [6, "id13"], [6, "id16"], [6, "id19"], [6, "id22"], [6, "id25"], [6, "id28"], [6, "id31"], [6, "id34"], [6, "id37"], [6, "id40"], [6, "id43"], [6, "id46"], [6, "id49"], [6, "id52"], [6, "id55"], [6, "id58"], [6, "id61"], [6, "id64"], [6, "id67"], [6, "id70"], [6, "id73"], [6, "id76"], [6, "id79"], [6, "id82"], [6, "id85"], [6, "id88"], [6, "id91"], [6, "id94"], [6, "id97"]], "squigglepy.numbers module": [[7, "module-squigglepy.numbers"]], "squigglepy.rng module": [[8, "module-squigglepy.rng"]], "squigglepy.samplers module": [[9, "module-squigglepy.samplers"]], "squigglepy.utils module": [[10, "module-squigglepy.utils"]], "squigglepy.version module": [[11, "module-squigglepy.version"]], "squigglepy package": [[3, "module-squigglepy"]], "Submodules": [[3, "submodules"]], "squigglepy.correlation module": [[5, "module-squigglepy.correlation"]], "squigglepy.distributions module": [[6, "module-squigglepy.distributions"]], "Installation": [[1, "installation"]], "Squigglepy: Implementation of Squiggle in Python": [[0, "squigglepy-implementation-of-squiggle-in-python"]], "Contents": [[0, null]], "Disclaimers": [[0, "disclaimers"]], "Acknowledgements": [[0, "acknowledgements"]], "Piano tuners example": [[12, "piano-tuners-example"]], "Distributions": [[12, "distributions"]], "Additional features": [[12, "additional-features"]], "Example: Rolling a die": [[12, "example-rolling-a-die"]], "Bayesian inference": [[12, "bayesian-inference"]], "Example: Alarm net": [[12, "example-alarm-net"]], "Example: A demonstration of the Monty Hall Problem": [[12, "example-a-demonstration-of-the-monty-hall-problem"]], "Example: More complex coin/dice interactions": [[12, "example-more-complex-coin-dice-interactions"]], "Kelly betting": [[12, "kelly-betting"]], "More examples": [[12, "more-examples"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["index", "installation", "reference/modules", "reference/squigglepy", "reference/squigglepy.bayes", "reference/squigglepy.correlation", "reference/squigglepy.distributions", "reference/squigglepy.numbers", "reference/squigglepy.rng", "reference/squigglepy.samplers", "reference/squigglepy.utils", "reference/squigglepy.version", "usage"], "filenames": ["index.rst", "installation.rst", "reference/modules.rst", "reference/squigglepy.rst", "reference/squigglepy.bayes.rst", "reference/squigglepy.correlation.rst", "reference/squigglepy.distributions.rst", "reference/squigglepy.numbers.rst", "reference/squigglepy.rng.rst", "reference/squigglepy.samplers.rst", "reference/squigglepy.utils.rst", "reference/squigglepy.version.rst", "usage.rst"], "titles": ["Squigglepy: Implementation of Squiggle in Python", "Installation", "squigglepy", "squigglepy package", "squigglepy.bayes module", "squigglepy.correlation module", "squigglepy.distributions module", "squigglepy.numbers module", "squigglepy.rng module", "squigglepy.samplers module", "squigglepy.utils module", "squigglepy.version module", "Examples"], "terms": {"index": [], "modul": [2, 3], "search": [], "page": [], "i": [0, 4, 5, 6, 8, 9, 10, 12], "simpl": 0, "program": 0, "languag": 0, "intuit": 0, "probabilist": 0, "estim": 0, "It": [0, 9], "serv": 0, "its": 0, "own": [0, 12], "standalon": 0, "syntax": 0, "javascript": 0, "like": [0, 10], "intend": [0, 5], "us": [0, 1, 4, 5, 6, 8, 9, 10, 12], "frequent": 0, "also": [0, 1, 5, 6, 9, 10, 12], "sometim": 0, "want": [0, 4, 5, 12], "similar": 0, "function": [0, 4, 6, 10, 12], "especi": 0, "alongsid": [0, 9], "other": [0, 4, 9, 10, 12], "statist": 0, "packag": [0, 2, 5, 12], "numpi": [0, 9, 10, 12], "panda": 0, "matplotlib": [0, 12], "The": [0, 4, 5, 6, 8, 9, 10, 12], "here": [0, 12], "mani": [0, 4, 9], "pip": 1, "For": [1, 12], "plot": [1, 3, 6, 12], "support": [0, 1, 4], "you": [0, 1, 4, 5, 6, 9, 10, 12], "can": [0, 1, 5, 6, 9, 10, 12], "extra": 1, "": [0, 5, 6, 9, 10, 12], "from": [4, 5, 6, 9, 10, 12], "doc": 12, "import": 12, "sq": [4, 5, 6, 12], "np": [4, 5, 8, 10, 12], "pyplot": 12, "plt": 12, "number": [2, 3, 4, 5, 6, 8, 9, 10, 12], "k": [10, 12], "m": [4, 5, 12], "pprint": 12, "pop_of_ny_2022": 12, "8": [4, 6, 10, 12], "1": [4, 5, 6, 9, 10, 12], "4": [6, 9, 10, 12], "thi": [0, 4, 5, 6, 9, 10, 12], "mean": [4, 6, 9, 10, 12], "re": 12, "90": [6, 9, 10, 12], "confid": 12, "valu": [6, 9, 10, 12], "between": [0, 5, 6, 9, 10, 12], "million": 12, "pct_of_pop_w_piano": 12, "0": [4, 5, 6, 9, 10, 12], "2": [4, 5, 6, 9, 10, 12], "01": [4, 10, 12], "we": [4, 5, 10, 12], "assum": 12, "ar": [4, 5, 6, 9, 10, 12], "almost": 12, "peopl": 12, "multipl": 12, "pianos_per_piano_tun": 12, "50": [4, 10, 12], "piano_tuners_per_piano": 12, "total_tuners_in_2022": 12, "sampl": [0, 2, 3, 4, 5, 6, 9, 10, 12], "1000": [5, 6, 12], "note": [5, 10, 12], "shorthand": [0, 12], "get": [10, 12], "sd": [4, 6, 9, 12], "print": [4, 5, 9, 10, 12], "format": [10, 12], "round": [6, 10, 12], "std": 12, "percentil": [10, 12], "get_percentil": [2, 3, 10, 12], "digit": [6, 10, 12], "histogram": [6, 12], "hist": 12, "bin": [6, 12], "200": [6, 12], "show": 12, "shorter": 12, "And": 12, "version": [0, 2, 3, 10, 12], "incorpor": 12, "time": [10, 12], "def": [4, 6, 12], "pop_at_tim": 12, "t": [6, 9, 12], "year": [10, 12], "after": 12, "2022": 12, "avg_yearly_pct_chang": 12, "05": [5, 6, 10, 12], "expect": [10, 12], "nyc": 12, "continu": 12, "grow": 12, "an": [0, 4, 5, 6, 9, 10, 12], "roughli": 12, "per": [10, 12], "return": 12, "total_tuners_at_tim": 12, "total": [4, 9, 12], "2030": 12, "warn": 12, "Be": 12, "care": 12, "about": [10, 12], "divid": [10, 12], "etc": 12, "500": 12, "instead": [6, 10, 12], "outcom": 12, "count": 12, "norm": [2, 3, 4, 6, 9, 10, 12], "3": [4, 6, 9, 10, 12], "onli": [4, 5, 9, 10, 12], "two": [4, 5, 6, 12], "multipli": 12, "normal": [2, 3, 4, 6, 9, 10, 12], "interv": [6, 9, 10, 12], "too": 12, "one": [4, 10, 12], "than": [4, 6, 9, 10, 12], "100": [5, 10, 12], "longhand": 12, "n": [4, 5, 6, 9, 10, 12], "nice": 12, "progress": [4, 9, 12], "report": [0, 12], "verbos": [4, 9, 10, 12], "true": [4, 6, 9, 10, 12], "exist": [4, 9, 12], "lognorm": [2, 3, 6, 9, 12], "10": [6, 9, 10, 12], "tdist": [2, 3, 6, 12], "5": [4, 5, 6, 9, 10, 12], "triangular": [2, 3, 6, 9, 12], "pert": [2, 3, 6, 9, 12], "lam": [6, 9, 12], "binomi": [2, 3, 6, 9, 12], "p": [4, 6, 9, 10, 12], "beta": [2, 3, 4, 5, 6, 9, 12], "b": [6, 9, 12], "bernoulli": [2, 3, 4, 6, 12], "poisson": [2, 3, 6, 9, 12], "chisquar": [2, 3, 6, 12], "gamma": [2, 3, 5, 6, 9, 12], "pareto": [2, 3, 6, 9, 12], "exponenti": [2, 3, 6, 9, 12], "scale": [6, 9, 12], "geometr": [2, 3, 6, 9, 10, 12], "discret": [2, 3, 5, 6, 9, 12], "9": [4, 6, 9, 10, 12], "integ": [10, 12], "15": [6, 10, 12], "altern": 12, "object": [5, 10, 12], "No": 12, "weight": [4, 6, 9, 10, 12], "equal": [6, 9, 12], "mix": [6, 9, 12], "togeth": 12, "mixtur": [2, 3, 4, 6, 9, 12], "These": [10, 12], "each": [4, 5, 6, 9, 10, 12], "equival": [4, 12], "abov": [10, 12], "just": [4, 6, 10, 12], "differ": [6, 9, 10, 12], "wai": [5, 12], "do": [4, 6, 9, 10, 12], "notat": [6, 9, 10, 12], "make": [4, 9, 10, 12], "zero": [6, 12], "inflat": [6, 12], "60": [10, 12], "chanc": [6, 9, 12], "40": [10, 12], "zero_infl": [2, 3, 6, 12], "6": [4, 5, 6, 9, 10, 12], "add": [6, 12], "subtract": 12, "math": [0, 12], "chang": [0, 9, 12], "ci": [6, 9, 10, 12], "default": [4, 5, 6, 9, 10, 12], "80": [4, 5, 10, 12], "credibl": [6, 9, 10, 12], "clip": [2, 3, 6, 12], "lclip": [2, 3, 6, 9, 12], "rclip": [2, 3, 6, 9, 12], "anyth": [6, 12], "lower": [6, 12], "higher": 12, "pipe": [6, 12], "correl": [2, 3, 9, 12], "uniform": [2, 3, 6, 9, 12], "even": 12, "pass": [4, 5, 6, 10, 12], "your": [10, 12], "matrix": [5, 12], "how": [4, 10, 12], "build": 12, "tool": 12, "roll_di": [2, 3, 10, 12], "side": [10, 12], "list": [4, 5, 6, 9, 10, 12], "rang": [6, 9, 10, 12], "els": [4, 12], "none": [4, 5, 6, 9, 10, 12], "alreadi": [10, 12], "includ": [4, 5, 10, 12], "standard": [6, 9, 12], "util": [2, 3, 12], "women": 12, "ag": 12, "forti": 12, "who": 12, "particip": 12, "routin": 12, "screen": 12, "have": [4, 6, 9, 10, 12], "breast": 12, "cancer": [4, 12], "posit": [4, 5, 6, 10, 12], "mammographi": [4, 12], "without": [4, 12], "woman": 12, "group": [5, 9, 12], "had": 12, "what": [4, 6, 10, 12], "probabl": [4, 6, 9, 10, 12], "she": 12, "actual": 12, "ha": [5, 6, 10, 12], "approxim": [5, 6, 9, 12], "answer": [4, 12], "network": [4, 12], "reject": [4, 12], "bay": [2, 3, 12], "has_canc": [4, 12], "event": [2, 3, 4, 6, 10, 12], "096": [4, 12], "define_ev": [4, 12], "bayesnet": [2, 3, 4, 12], "find": [4, 12], "lambda": [4, 6, 9, 12], "e": [4, 10, 12], "conditional_on": [4, 12], "07723995880535531": [4, 12], "Or": [5, 12], "inform": [10, 12], "immedi": 12, "hand": 12, "directli": [5, 12], "calcul": [4, 6, 9, 10, 12], "though": 12, "doesn": 12, "work": [5, 9, 10, 12], "veri": [5, 12], "stuff": 12, "simple_bay": [2, 3, 4, 12], "prior": [4, 10, 12], "likelihood_h": [4, 12], "likelihood_not_h": [4, 12], "07763975155279504": [4, 12], "updat": [2, 3, 4, 12], "them": [4, 5, 6, 12], "prior_sampl": 12, "evid": [4, 12], "evidence_sampl": 12, "posterior": [4, 12], "posterior_sampl": 12, "averag": [2, 3, 4, 12], "average_sampl": 12, "artifici": 12, "intellig": 12, "section": 12, "hous": 12, "system": 12, "against": 12, "burglari": 12, "live": 12, "seismic": 12, "activ": 12, "area": 12, "occasion": 12, "set": [5, 6, 8, 10, 12], "off": 12, "earthquak": 12, "neighbor": 12, "mari": 12, "john": 12, "know": [4, 12], "If": [4, 5, 6, 9, 10, 12], "thei": [0, 12], "hear": 12, "call": [4, 12], "guarante": 12, "particular": 12, "dai": [10, 12], "go": 12, "95": [10, 12], "both": [4, 9, 12], "94": [10, 12], "29": [4, 12], "noth": 12, "fals": [4, 9, 10, 12], "when": [4, 6, 9, 10, 12], "goe": 12, "But": [6, 12], "sai": 12, "hi": 12, "70": [10, 12], "p_alarm_goes_off": 12, "elif": 12, "001": 12, "p_john_cal": 12, "alarm_goes_off": 12, "p_mary_cal": 12, "7": [5, 6, 10, 12], "burglary_happen": 12, "earthquake_happen": 12, "002": 12, "john_cal": 12, "mary_cal": 12, "happen": [6, 9, 10, 12], "result": [4, 5, 6, 9, 10, 12], "19": 12, "vari": 12, "becaus": [9, 12], "base": [4, 5, 6, 9, 10, 12], "random": [6, 8, 9, 12], "mai": [0, 5, 12], "take": [4, 6, 9, 12], "minut": 12, "been": [5, 12], "27": [6, 12], "quickli": 12, "built": [6, 12], "cach": [4, 9, 12], "reload_cach": [4, 9, 12], "recalcul": [4, 9, 12], "amount": [10, 12], "analysi": 12, "pretti": 12, "limit": 12, "consid": [10, 12], "sorobn": 12, "pomegran": 12, "bnlearn": 12, "pymc": 12, "monte_hal": 12, "door_pick": 12, "switch": 12, "door": 12, "c": 12, "car_is_behind_door": 12, "reveal_door": 12, "d": 12, "old_door_pick": 12, "won_car": 12, "won": [6, 12], "r": 12, "win": [10, 12], "int": [4, 5, 6, 9, 10, 12], "66": 12, "34": 12, "imagin": 12, "flip": [10, 12], "head": [10, 12], "out": [4, 9, 12], "my": 12, "blue": 12, "bag": 12, "tail": [10, 12], "red": 12, "contain": [10, 12], "20": [6, 9, 10, 12], "took": 12, "flip_coin": [2, 3, 10, 12], "me": [0, 12], "12306": 12, "which": [0, 4, 6, 9, 10, 12], "close": [5, 12], "correct": 12, "12292": 12, "gener": [4, 8, 12], "combin": [6, 12], "bankrol": [10, 12], "determin": [6, 12], "size": 12, "criterion": [10, 12], "ve": [10, 12], "price": [10, 12], "question": 12, "market": [10, 12], "resolv": [10, 12], "favor": 12, "see": 12, "65": [5, 12], "willing": 12, "should": [4, 6, 9, 10, 12], "follow": 12, "kelly_data": 12, "my_pric": [10, 12], "market_pric": [10, 12], "fraction": [10, 12], "143": 12, "target": [10, 12], "much": [4, 10, 12], "monei": [10, 12], "invest": [10, 12], "142": 12, "86": 12, "expected_roi": [10, 12], "roi": 12, "077": 12, "action": 12, "black": 12, "ruff": 12, "check": [5, 12], "pytest": 12, "pip3": 12, "python3": 12, "integr": 12, "py": 12, "unoffici": 0, "myself": [], "rethink": 0, "prioriti": 0, "affili": 0, "associ": [0, 6, 9], "quantifi": 0, "uncertainti": 0, "research": 0, "institut": 0, "maintain": 0, "new": 0, "yet": [0, 4], "stabl": 0, "product": 0, "so": [0, 10], "encount": 0, "bug": 0, "error": 0, "pleas": 0, "those": 0, "fix": [0, 10], "possibl": 0, "futur": [0, 4, 9], "introduc": 0, "break": 0, "avail": 0, "under": [0, 8], "mit": 0, "licens": 0, "primari": 0, "author": 0, "peter": 0, "wildeford": 0, "agust\u00edn": 0, "covarrubia": 0, "bernardo": 0, "baron": 0, "contribut": 0, "sever": 0, "kei": 0, "develop": 0, "thank": 0, "ozzi": 0, "gooen": 0, "creat": 0, "origin": [0, 5], "dawn": 0, "drescher": 0, "help": 0, "come": 0, "up": 0, "idea": 0, "well": [0, 9], "featur": 0, "start": 4, "readm": [], "subpackag": [], "submodul": 2, "distribut": [0, 2, 3, 4, 5, 9, 10], "rng": [2, 3], "sampler": [2, 3], "content": [], "test": [10, 12], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "correlationgroup": [2, 3, 5], "correlated_dist": [3, 5], "correlation_matrix": [3, 5], "correlation_toler": [3, 5], "has_sufficient_sample_divers": [3, 5], "induce_correl": [3, 5], "min_unique_sampl": [3, 5], "basedistribut": [2, 3, 6, 9, 10], "bernoullidistribut": [2, 3, 6], "betadistribut": [2, 3, 6], "binomialdistribut": [2, 3, 6], "categoricaldistribut": [2, 3, 6], "chisquaredistribut": [2, 3, 6], "complexdistribut": [2, 3, 6, 10], "compositedistribut": [2, 3, 6], "constantdistribut": [2, 3, 6], "continuousdistribut": [2, 3, 6], "discretedistribut": [2, 3, 6], "exponentialdistribut": [2, 3, 6], "gammadistribut": [2, 3, 6], "geometricdistribut": [2, 3, 6], "logtdistribut": [2, 3, 6], "lognormaldistribut": [2, 3, 6], "mixturedistribut": [2, 3, 6], "normaldistribut": [2, 3, 6], "operabledistribut": [2, 3, 5, 6], "pertdistribut": [2, 3, 6], "paretodistribut": [2, 3, 6], "poissondistribut": [2, 3, 6], "tdistribut": [2, 3, 6], "triangulardistribut": [2, 3, 6], "uniformdistribut": [2, 3, 6], "const": [2, 3, 6], "dist_ceil": [2, 3, 6], "dist_exp": [2, 3, 6], "dist_floor": [2, 3, 6], "dist_fn": [2, 3, 6], "dist_log": [2, 3, 6], "dist_max": [2, 3, 6], "dist_min": [2, 3, 6], "dist_round": [2, 3, 6], "inf0": [2, 3, 6], "log_tdist": [2, 3, 6], "set_se": [2, 3, 8, 9, 10], "bernoulli_sampl": [2, 3, 9], "beta_sampl": [2, 3, 9], "binomial_sampl": [2, 3, 9], "chi_square_sampl": [2, 3, 9], "discrete_sampl": [2, 3, 9], "exponential_sampl": [2, 3, 9], "gamma_sampl": [2, 3, 9], "geometric_sampl": [2, 3, 9], "log_t_sampl": [2, 3, 9], "lognormal_sampl": [2, 3, 9], "mixture_sampl": [2, 3, 9], "normal_sampl": [2, 3, 9], "pareto_sampl": [2, 3, 9], "pert_sampl": [2, 3, 9], "poisson_sampl": [2, 3, 9], "sample_correlated_group": [2, 3, 9], "t_sampl": [2, 3, 9], "triangular_sampl": [2, 3, 9], "uniform_sampl": [2, 3, 9], "doubling_time_to_growth_r": [2, 3, 10], "event_happen": [2, 3, 10], "event_occur": [2, 3, 10], "extrem": [2, 3, 5, 10], "full_kelli": [2, 3, 10], "geomean": [2, 3, 10], "geomean_odd": [2, 3, 10], "get_log_percentil": [2, 3, 10], "get_mean_and_ci": [2, 3, 10], "get_median_and_ci": [2, 3, 10], "growth_rate_to_doubling_tim": [2, 3, 10], "half_kelli": [2, 3, 10], "is_continuous_dist": [2, 3, 10], "is_dist": [2, 3, 10], "is_sampl": [2, 3, 10], "kelli": [0, 2, 3, 10], "laplac": [2, 3, 10], "odds_to_p": [2, 3, 10], "one_in": [2, 3, 10], "p_to_odd": [2, 3, 10], "quarter_kelli": [2, 3, 10], "relative_weight": [4, 6, 9, 10], "sourc": [4, 5, 6, 8, 9, 10], "arrai": [4, 5, 9, 10], "float": [4, 5, 6, 8, 9, 10], "put": 4, "versu": 4, "infer": [0, 4], "sum": [4, 6, 9, 10], "rel": [4, 6, 9, 10], "given": [4, 6, 9, 10], "A": [4, 6, 9, 10], "accord": [4, 5, 9], "event_fn": 4, "reduce_fn": 4, "raw": 4, "memcach": [4, 9], "memcache_load": 4, "memcache_sav": 4, "dump_cache_fil": [4, 9], "load_cache_fil": [4, 9], "cache_file_primari": [4, 9], "core": [4, 9], "bayesian": [0, 4], "allow": 4, "condit": 4, "custom": [4, 6], "defin": [4, 5, 6, 9, 10], "all": [4, 5, 6, 9, 10], "simul": 4, "aggreg": 4, "final": 4, "bool": [4, 5, 9, 10], "memori": [4, 9], "match": [4, 5, 9], "load": [4, 9], "save": [4, 9], "ani": [4, 5, 6, 9, 10], "ignor": [4, 6, 9], "str": [4, 6, 9, 10], "present": [4, 9], "write": [4, 9], "binari": [4, 6, 9], "file": [4, 9], "path": [4, 9], "sqlcach": [4, 9], "append": [4, 9], "name": [4, 6, 9], "first": [4, 9], "attempt": [4, 9], "otherwis": [4, 6, 9, 10], "statement": [4, 9], "comput": [4, 9], "run": [4, 9, 12], "singl": [4, 9], "process": [4, 9], "greater": [4, 6, 9], "multiprocess": [4, 9], "pool": [4, 9], "variou": [4, 9], "likelihood": [4, 6, 9, 10], "rate": [4, 10], "rule": [4, 10], "h": 4, "hypothesi": 4, "aka": [4, 6, 9], "evidence_weight": 4, "perform": 4, "produc": [4, 5], "current": [4, 10], "must": [4, 5, 6, 9, 10], "either": [4, 6, 9, 10], "type": 4, "matter": [4, 6], "where": [4, 5, 9, 10], "53": 4, "implement": [5, 12], "iman": 5, "conov": 5, "method": 5, "induc": 5, "some": 5, "code": 5, "adapt": 5, "abraham": 5, "lee": 5, "mcerp": 5, "tisimst": 5, "class": [5, 6], "tupl": 5, "ndarrai": [5, 9], "float64": [5, 9], "hold": 5, "metadata": 5, "user": [5, 9], "rather": 5, "dure": 5, "dtype": [5, 9], "relative_threshold": 5, "absolute_threshold": 5, "suffici": 5, "uniqu": 5, "data": [5, 10], "column": 5, "wise": 5, "dataset": 5, "2d": 5, "independ": 5, "variabl": [5, 9, 10], "correspond": 5, "corrmat": 5, "desir": [5, 6, 10], "coeffici": 5, "symmetr": 5, "definit": 5, "order": 5, "new_data": 5, "toler": 5, "_min_unique_sampl": 5, "rank": 5, "emploi": 5, "while": 5, "preserv": 5, "margin": 5, "best": 5, "effort": 5, "basi": 5, "fail": 5, "depend": 5, "provid": 5, "except": 5, "rais": 5, "case": [5, 6], "abl": 5, "enough": 5, "shuffl": 5, "notabl": 5, "hard": 5, "common": [5, 6, 9], "few": 5, "spearman": 5, "semi": 5, "confus": 5, "covari": 5, "exclus": 5, "same": [5, 6, 9, 10], "option": 5, "overrid": 5, "absolut": [5, 10], "disabl": 5, "correlated_vari": 5, "input": 5, "suppos": 5, "solar_radi": 5, "temperatur": 5, "300": 5, "22": 5, "28": [5, 10], "corrcoef": 5, "6975960649767123": 5, "could": [5, 6], "funding_gap": 5, "cost_per_deliveri": 5, "effect_s": 5, "20_000": 5, "80_000": 5, "30": [5, 10], "580520": 5, "480149": 5, "580962": 5, "187831": 5, "abc": 6, "item": [6, 9], "df": [6, 9], "left": [6, 9], "right": [6, 9], "fn": 6, "fn_str": 6, "infix": 6, "x": [6, 10], "shape": [6, 9], "y": 6, "norm_mean": 6, "norm_sd": 6, "lognorm_mean": 6, "lognorm_sd": 6, "dist": [6, 9], "num_sampl": 6, "draw": 6, "mode": [6, 9, 10], "initi": 6, "alpha": [6, 9], "typic": [6, 9], "trial": [6, 9, 10], "success": [6, 9, 10], "failur": [6, 9, 10], "chi": [6, 9], "squar": [6, 9], "degre": [6, 9], "freedom": [6, 9], "chiaquar": 6, "dist1": 6, "bound": 6, "output": 6, "appli": 6, "until": 6, "funciton": 6, "partial": 6, "suitabl": 6, "upper": 6, "lazi": 6, "evalu": 6, "constant": 6, "alwai": 6, "categor": [6, 9], "dict": [6, 9, 10], "being": [6, 9], "thing": [6, 9], "ceil": 6, "exp": 6, "floor": 6, "dist2": 6, "second": 6, "argument": 6, "By": 6, "__name__": 6, "doubl": [6, 10], "718281828459045": 6, "log": [6, 9, 10], "maximum": 6, "max": 6, "minimum": 6, "min": 6, "below": [6, 9], "coerc": [6, 9], "individu": [6, 9], "p_zero": 6, "arbitrari": 6, "alia": [6, 10], "val": 6, "space": [6, 9], "via": [6, 9], "loos": [6, 9], "unlik": [6, 9], "precis": [6, 9], "classic": 6, "low": [6, 9], "high": [6, 9], "underli": 6, "deviat": [6, 9], "04": 6, "21": [6, 9], "09": 6, "147": 6, "smallest": [6, 9], "most": [6, 9, 10], "largest": [6, 9], "unless": [6, 9], "less": 6, "becom": 6, "08": [6, 10], "seed": 8, "default_rng": 8, "hood": 8, "intern": [8, 9], "42": [8, 9, 10], "pcg64": 8, "0x127ede9e0": 8, "22145847498048798": 9, "808417207931989": 9, "_multicore_tqdm_n": 9, "_multicore_tqdm_cor": 9, "tqdm": 9, "interfac": 9, "meant": 9, "bar": 9, "multicor": 9, "safe": 9, "24": [9, 10], "042086039659946": 9, "290716894247602": 9, "addition": 9, "052949773846356": 9, "3562412406168636": 9, "ranom": 9, "183867278765718": 9, "7859113725925972": 9, "1041655362137777": 9, "30471707975443135": 9, "069666324736094": 9, "327625176788963": 9, "13": [9, 10], "_correlate_if_need": 9, "npy": 9, "1m": 9, "592627415218455": 9, "7281209657534462": 9, "10817361": 9, "45828454": 9, "requested_dist": 9, "store": 9, "themselv": 9, "_correlated_sampl": 9, "necessari": 9, "need": 9, "onc": [9, 10], "regardless": 9, "tree": 9, "oper": [6, 9], "7887113716855985": 9, "7739560485559633": 9, "doubling_tim": 10, "convert": 10, "growth": 10, "express": 10, "unit": 10, "g": 10, "remain": 10, "got": 10, "annual": 10, "sens": 10, "talk": 10, "percentag": 10, "12": 10, "05946309435929531": 10, "predict": 10, "within": 10, "factor": 10, "73": 10, "http": 10, "arxiv": 10, "org": 10, "ab": 10, "2111": 10, "03153": 10, "875428191155692": 10, "coin": 10, "resolve_d": 10, "defer": 10, "give": 10, "bet": [0, 10], "back": 10, "arr": 10, "yyyi": 10, "mm": 10, "dd": 10, "addit": [0, 10], "specifi": 10, "adj_pric": 10, "adjust": 10, "taken": 10, "account": 10, "delta_pric": 10, "adj_delta_pric": 10, "indic": 10, "delta": 10, "max_gain": 10, "would": 10, "gain": 10, "modeled_gain": 10, "expected_arr": 10, "125": 10, "72": 10, "75": 10, "drop_na": 10, "boolean": 10, "na": 10, "drop": 10, "1072325059538595": 10, "odd": 10, "befor": 10, "42985748800076845": 10, "99": 10, "revers": 10, "displai": 10, "95th": 10, "5th": 10, "swap": 10, "easi": 10, "read": 10, "dictionari": 10, "power": 10, "25": 10, "49": 10, "74": 10, "ci_low": 10, "ci_high": 10, "median": 10, "growth_rat": 10, "69": 10, "66071689357483": 10, "55": 10, "62": 10, "23": 10, "375": 10, "obj": 10, "string": 10, "callabl": 10, "half": 10, "quarter": 10, "full": 10, "time_pass": 10, "time_remain": 10, "time_fix": 10, "next": 10, "law": 10, "invari": 10, "www": 10, "lesswrong": 10, "com": 10, "post": 10, "we7sk8w8aixqknar": 10, "among": 10, "past": 10, "leav": 10, "occur": 10, "observ": 10, "least": 10, "over": 10, "period": 10, "wa": 10, "chosen": 10, "specif": 10, "recent": 10, "sun": 10, "risen": 10, "000": 10, "rise": 10, "again": 10, "tomorrow": 10, "999990000199996": 10, "last": 10, "nuke": 10, "war": 10, "77": 10, "ago": 10, "naiv": 10, "012820512820512664": 10, "lst": 10, "decim": 10, "09090909090909091": 10, "logic": 10, "1111111111111111": 10, "48": 10, "31": 10, "188": 10, "roll": 10, "die": 10, "dice": 10, "collect": 6, "squigglepi": [1, 12], "squiggl": 12, "python": 12, "api": 0, "refer": 0, "exampl": 0, "piano": 0, "tuner": 0, "more": 0, "instal": [0, 12], "usag": 0, "disclaim": [], "acknowledg": [], "alarm": [], "net": [], "demonstr": [], "monti": [], "hall": [], "problem": [], "complex": [], "interact": []}, "objects": {"": [[3, 0, 0, "-", "squigglepy"]], "squigglepy": [[4, 0, 0, "-", "bayes"], [5, 0, 0, "-", "correlation"], [6, 0, 0, "-", "distributions"], [7, 0, 0, "-", "numbers"], [8, 0, 0, "-", "rng"], [9, 0, 0, "-", "samplers"], [10, 0, 0, "-", "utils"], [11, 0, 0, "-", "version"]], "squigglepy.bayes": [[4, 1, 1, "", "average"], [4, 1, 1, "", "bayesnet"], [4, 1, 1, "", "simple_bayes"], [4, 1, 1, "", "update"]], "squigglepy.correlation": [[5, 2, 1, "", "CorrelationGroup"], [5, 1, 1, "", "correlate"]], "squigglepy.correlation.CorrelationGroup": [[5, 3, 1, "", "correlated_dists"], [5, 3, 1, "", "correlation_matrix"], [5, 3, 1, "", "correlation_tolerance"], [5, 4, 1, "", "has_sufficient_sample_diversity"], [5, 4, 1, "", "induce_correlation"], [5, 3, 1, "", "min_unique_samples"]], "squigglepy.distributions": [[6, 2, 1, "", "BaseDistribution"], [6, 2, 1, "", "BernoulliDistribution"], [6, 2, 1, "", "BetaDistribution"], [6, 2, 1, "", "BinomialDistribution"], [6, 2, 1, "", "CategoricalDistribution"], [6, 2, 1, "", "ChiSquareDistribution"], [6, 2, 1, "", "ComplexDistribution"], [6, 2, 1, "", "CompositeDistribution"], [6, 2, 1, "", "ConstantDistribution"], [6, 2, 1, "", "ContinuousDistribution"], [6, 2, 1, "", "DiscreteDistribution"], [6, 2, 1, "", "ExponentialDistribution"], [6, 2, 1, "", "GammaDistribution"], [6, 2, 1, "", "GeometricDistribution"], [6, 2, 1, "", "LogTDistribution"], [6, 2, 1, "", "LognormalDistribution"], [6, 2, 1, "", "MixtureDistribution"], [6, 2, 1, "", "NormalDistribution"], [6, 2, 1, "", "OperableDistribution"], [6, 2, 1, "", "PERTDistribution"], [6, 2, 1, "", "ParetoDistribution"], [6, 2, 1, "", "PoissonDistribution"], [6, 2, 1, "", "TDistribution"], [6, 2, 1, "", "TriangularDistribution"], [6, 2, 1, "", "UniformDistribution"], [6, 1, 1, "", "bernoulli"], [6, 1, 1, "", "beta"], [6, 1, 1, "", "binomial"], [6, 1, 1, "", "chisquare"], [6, 1, 1, "", "clip"], [6, 1, 1, "", "const"], [6, 1, 1, "", "discrete"], [6, 1, 1, "", "dist_ceil"], [6, 1, 1, "", "dist_exp"], [6, 1, 1, "", "dist_floor"], [6, 1, 1, "", "dist_fn"], [6, 1, 1, "", "dist_log"], [6, 1, 1, "", "dist_max"], [6, 1, 1, "", "dist_min"], [6, 1, 1, "", "dist_round"], [6, 1, 1, "", "exponential"], [6, 1, 1, "", "gamma"], [6, 1, 1, "", "geometric"], [6, 1, 1, "", "inf0"], [6, 1, 1, "", "lclip"], [6, 1, 1, "", "log_tdist"], [6, 1, 1, "", "lognorm"], [6, 1, 1, "", "mixture"], [6, 1, 1, "", "norm"], [6, 1, 1, "", "pareto"], [6, 1, 1, "", "pert"], [6, 1, 1, "", "poisson"], [6, 1, 1, "", "rclip"], [6, 1, 1, "", "tdist"], [6, 1, 1, "", "to"], [6, 1, 1, "", "triangular"], [6, 1, 1, "", "uniform"], [6, 1, 1, "", "zero_inflated"]], "squigglepy.distributions.OperableDistribution": [[6, 4, 1, "", "plot"]], "squigglepy.rng": [[8, 1, 1, "", "set_seed"]], "squigglepy.samplers": [[9, 1, 1, "", "bernoulli_sample"], [9, 1, 1, "", "beta_sample"], [9, 1, 1, "", "binomial_sample"], [9, 1, 1, "", "chi_square_sample"], [9, 1, 1, "", "discrete_sample"], [9, 1, 1, "", "exponential_sample"], [9, 1, 1, "", "gamma_sample"], [9, 1, 1, "", "geometric_sample"], [9, 1, 1, "", "log_t_sample"], [9, 1, 1, "", "lognormal_sample"], [9, 1, 1, "", "mixture_sample"], [9, 1, 1, "", "normal_sample"], [9, 1, 1, "", "pareto_sample"], [9, 1, 1, "", "pert_sample"], [9, 1, 1, "", "poisson_sample"], [9, 1, 1, "", "sample"], [9, 1, 1, "", "sample_correlated_group"], [9, 1, 1, "", "t_sample"], [9, 1, 1, "", "triangular_sample"], [9, 1, 1, "", "uniform_sample"]], "squigglepy.utils": [[10, 1, 1, "", "doubling_time_to_growth_rate"], [10, 1, 1, "", "event"], [10, 1, 1, "", "event_happens"], [10, 1, 1, "", "event_occurs"], [10, 1, 1, "", "extremize"], [10, 1, 1, "", "flip_coin"], [10, 1, 1, "", "full_kelly"], [10, 1, 1, "", "geomean"], [10, 1, 1, "", "geomean_odds"], [10, 1, 1, "", "get_log_percentiles"], [10, 1, 1, "", "get_mean_and_ci"], [10, 1, 1, "", "get_median_and_ci"], [10, 1, 1, "", "get_percentiles"], [10, 1, 1, "", "growth_rate_to_doubling_time"], [10, 1, 1, "", "half_kelly"], [10, 1, 1, "", "is_continuous_dist"], [10, 1, 1, "", "is_dist"], [10, 1, 1, "", "is_sampleable"], [10, 1, 1, "", "kelly"], [10, 1, 1, "", "laplace"], [10, 1, 1, "", "normalize"], [10, 1, 1, "", "odds_to_p"], [10, 1, 1, "", "one_in"], [10, 1, 1, "", "p_to_odds"], [10, 1, 1, "", "quarter_kelly"], [10, 1, 1, "", "roll_die"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "method", "Python method"]}, "titleterms": {"welcom": [], "squigglepi": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "": [], "document": [], "indic": [], "tabl": [], "implement": 0, "squiggl": 0, "python": 0, "instal": 1, "usag": [], "piano": 12, "tuner": 12, "exampl": [4, 5, 6, 8, 9, 10, 12], "distribut": [6, 12], "addit": 12, "featur": 12, "roll": 12, "die": 12, "bayesian": 12, "infer": 12, "alarm": 12, "net": 12, "A": 12, "demonstr": 12, "monti": 12, "hall": 12, "problem": 12, "more": 12, "complex": 12, "coin": 12, "dice": 12, "interact": 12, "kelli": 12, "bet": 12, "run": [], "test": [], "disclaim": 0, "acknowledg": 0, "packag": 3, "subpackag": [], "modul": [4, 5, 6, 7, 8, 9, 10, 11], "content": 0, "submodul": 3, "bay": 4, "correl": 5, "number": 7, "rng": 8, "sampler": 9, "util": 10, "version": 11, "integr": [], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "paramet": [4, 5, 6, 8, 9, 10], "return": [4, 5, 6, 8, 9, 10], "api": [], "refer": []}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Squigglepy: Implementation of Squiggle in Python": [[0, "squigglepy-implementation-of-squiggle-in-python"]], "Contents": [[0, null]], "Disclaimers": [[0, "disclaimers"]], "Acknowledgements": [[0, "acknowledgements"]], "Installation": [[1, "installation"]], "squigglepy": [[2, "squigglepy"]], "squigglepy.bayes module": [[4, "module-squigglepy.bayes"]], "Parameters": [[4, "parameters"], [4, "id1"], [4, "id4"], [4, "id7"], [5, "parameters"], [5, "id1"], [8, "parameters"], [6, "parameters"], [6, "id1"], [6, "id3"], [6, "id6"], [6, "id9"], [6, "id12"], [6, "id15"], [6, "id18"], [6, "id21"], [6, "id24"], [6, "id27"], [6, "id30"], [6, "id33"], [6, "id36"], [6, "id39"], [6, "id42"], [6, "id45"], [6, "id48"], [6, "id51"], [6, "id54"], [6, "id57"], [6, "id60"], [6, "id63"], [6, "id66"], [6, "id69"], [6, "id72"], [6, "id75"], [6, "id78"], [6, "id81"], [6, "id84"], [6, "id87"], [6, "id90"], [6, "id93"], [6, "id96"], [9, "parameters"], [9, "id1"], [9, "id4"], [9, "id7"], [9, "id10"], [9, "id13"], [9, "id16"], [9, "id19"], [9, "id22"], [9, "id25"], [9, "id28"], [9, "id31"], [9, "id34"], [9, "id37"], [9, "id40"], [9, "id43"], [9, "id46"], [9, "id49"], [9, "id52"], [10, "parameters"], [10, "id1"], [10, "id4"], [10, "id6"], [10, "id8"], [10, "id11"], [10, "id14"], [10, "id17"], [10, "id20"], [10, "id23"], [10, "id26"], [10, "id29"], [10, "id32"], [10, "id35"], [10, "id38"], [10, "id41"], [10, "id44"], [10, "id47"], [10, "id50"], [10, "id53"], [10, "id56"], [10, "id59"], [10, "id62"], [10, "id65"], [10, "id68"]], "Returns": [[4, "returns"], [4, "id2"], [4, "id5"], [4, "id8"], [5, "returns"], [5, "id2"], [8, "returns"], [6, "returns"], [6, "id4"], [6, "id7"], [6, "id10"], [6, "id13"], [6, "id16"], [6, "id19"], [6, "id22"], [6, "id25"], [6, "id28"], [6, "id31"], [6, "id34"], [6, "id37"], [6, "id40"], [6, "id43"], [6, "id46"], [6, "id49"], [6, "id52"], [6, "id55"], [6, "id58"], [6, "id61"], [6, "id64"], [6, "id67"], [6, "id70"], [6, "id73"], [6, "id76"], [6, "id79"], [6, "id82"], [6, "id85"], [6, "id88"], [6, "id91"], [6, "id94"], [6, "id97"], [9, "returns"], [9, "id2"], [9, "id5"], [9, "id8"], [9, "id11"], [9, "id14"], [9, "id17"], [9, "id20"], [9, "id23"], [9, "id26"], [9, "id29"], [9, "id32"], [9, "id35"], [9, "id38"], [9, "id41"], [9, "id44"], [9, "id47"], [9, "id50"], [9, "id53"], [10, "returns"], [10, "id2"], [10, "id9"], [10, "id12"], [10, "id15"], [10, "id18"], [10, "id21"], [10, "id24"], [10, "id27"], [10, "id30"], [10, "id33"], [10, "id36"], [10, "id39"], [10, "id42"], [10, "id45"], [10, "id48"], [10, "id51"], [10, "id54"], [10, "id57"], [10, "id60"], [10, "id63"], [10, "id66"], [10, "id69"]], "Examples": [[4, "examples"], [4, "id3"], [4, "id6"], [4, "id9"], [5, "examples"], [8, "examples"], [12, "examples"], [6, "examples"], [6, "id2"], [6, "id5"], [6, "id8"], [6, "id11"], [6, "id14"], [6, "id17"], [6, "id20"], [6, "id23"], [6, "id26"], [6, "id29"], [6, "id32"], [6, "id35"], [6, "id38"], [6, "id41"], [6, "id44"], [6, "id47"], [6, "id50"], [6, "id53"], [6, "id56"], [6, "id59"], [6, "id62"], [6, "id65"], [6, "id68"], [6, "id71"], [6, "id74"], [6, "id77"], [6, "id80"], [6, "id83"], [6, "id86"], [6, "id89"], [6, "id92"], [6, "id95"], [6, "id98"], [9, "examples"], [9, "id3"], [9, "id6"], [9, "id9"], [9, "id12"], [9, "id15"], [9, "id18"], [9, "id21"], [9, "id24"], [9, "id27"], [9, "id30"], [9, "id33"], [9, "id36"], [9, "id39"], [9, "id42"], [9, "id45"], [9, "id48"], [9, "id51"], [9, "id54"], [10, "examples"], [10, "id3"], [10, "id5"], [10, "id7"], [10, "id10"], [10, "id13"], [10, "id16"], [10, "id19"], [10, "id22"], [10, "id25"], [10, "id28"], [10, "id31"], [10, "id34"], [10, "id37"], [10, "id40"], [10, "id43"], [10, "id46"], [10, "id49"], [10, "id52"], [10, "id55"], [10, "id58"], [10, "id61"], [10, "id64"], [10, "id67"], [10, "id70"]], "squigglepy.correlation module": [[5, "module-squigglepy.correlation"]], "squigglepy.numbers module": [[7, "module-squigglepy.numbers"]], "squigglepy.rng module": [[8, "module-squigglepy.rng"]], "squigglepy.version module": [[11, "module-squigglepy.version"]], "Piano tuners example": [[12, "piano-tuners-example"]], "Distributions": [[12, "distributions"]], "Additional features": [[12, "additional-features"]], "Example: Rolling a die": [[12, "example-rolling-a-die"]], "Bayesian inference": [[12, "bayesian-inference"]], "Example: Alarm net": [[12, "example-alarm-net"]], "Example: A demonstration of the Monty Hall Problem": [[12, "example-a-demonstration-of-the-monty-hall-problem"]], "Example: More complex coin/dice interactions": [[12, "example-more-complex-coin-dice-interactions"]], "Kelly betting": [[12, "kelly-betting"]], "More examples": [[12, "more-examples"]], "squigglepy package": [[3, "module-squigglepy"]], "Submodules": [[3, "submodules"]], "squigglepy.distributions module": [[6, "module-squigglepy.distributions"]], "squigglepy.samplers module": [[9, "module-squigglepy.samplers"]], "squigglepy.utils module": [[10, "module-squigglepy.utils"]]}, "indexentries": {"module": [[3, "module-squigglepy"], [6, "module-squigglepy.distributions"], [9, "module-squigglepy.samplers"], [10, "module-squigglepy.utils"]], "squigglepy": [[3, "module-squigglepy"]], "basedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BaseDistribution"]], "bernoullidistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BernoulliDistribution"]], "betadistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BetaDistribution"]], "binomialdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BinomialDistribution"]], "categoricaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.CategoricalDistribution"]], "chisquaredistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ChiSquareDistribution"]], "complexdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ComplexDistribution"]], "compositedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.CompositeDistribution"]], "constantdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ConstantDistribution"]], "continuousdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ContinuousDistribution"]], "discretedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.DiscreteDistribution"]], "exponentialdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ExponentialDistribution"]], "gammadistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.GammaDistribution"]], "geometricdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.GeometricDistribution"]], "logtdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.LogTDistribution"]], "lognormaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.LognormalDistribution"]], "mixturedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.MixtureDistribution"]], "normaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.NormalDistribution"]], "operabledistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.OperableDistribution"]], "pertdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.PERTDistribution"]], "paretodistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ParetoDistribution"]], "poissondistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.PoissonDistribution"]], "tdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.TDistribution"]], "triangulardistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.TriangularDistribution"]], "uniformdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.UniformDistribution"]], "bernoulli() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.bernoulli"]], "beta() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.beta"]], "binomial() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.binomial"]], "chisquare() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.chisquare"]], "clip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.clip"]], "const() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.const"]], "discrete() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.discrete"]], "dist_ceil() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_ceil"]], "dist_exp() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_exp"]], "dist_floor() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_floor"]], "dist_fn() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_fn"]], "dist_log() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_log"]], "dist_max() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_max"]], "dist_min() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_min"]], "dist_round() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_round"]], "exponential() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.exponential"]], "gamma() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.gamma"]], "geometric() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.geometric"]], "inf0() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.inf0"]], "lclip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.lclip"]], "log_tdist() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.log_tdist"]], "lognorm() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.lognorm"]], "mixture() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.mixture"]], "norm() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.norm"]], "pareto() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.pareto"]], "pert() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.pert"]], "plot() (squigglepy.distributions.operabledistribution method)": [[6, "squigglepy.distributions.OperableDistribution.plot"]], "poisson() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.poisson"]], "rclip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.rclip"]], "squigglepy.distributions": [[6, "module-squigglepy.distributions"]], "tdist() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.tdist"]], "to() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.to"]], "triangular() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.triangular"]], "uniform() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.uniform"]], "zero_inflated() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.zero_inflated"]], "bernoulli_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.bernoulli_sample"]], "beta_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.beta_sample"]], "binomial_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.binomial_sample"]], "chi_square_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.chi_square_sample"]], "discrete_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.discrete_sample"]], "exponential_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.exponential_sample"]], "gamma_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.gamma_sample"]], "geometric_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.geometric_sample"]], "log_t_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.log_t_sample"]], "lognormal_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.lognormal_sample"]], "mixture_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.mixture_sample"]], "normal_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.normal_sample"]], "pareto_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.pareto_sample"]], "pert_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.pert_sample"]], "poisson_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.poisson_sample"]], "sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.sample"]], "sample_correlated_group() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.sample_correlated_group"]], "squigglepy.samplers": [[9, "module-squigglepy.samplers"]], "t_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.t_sample"]], "triangular_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.triangular_sample"]], "uniform_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.uniform_sample"]], "doubling_time_to_growth_rate() (in module squigglepy.utils)": [[10, "squigglepy.utils.doubling_time_to_growth_rate"]], "event() (in module squigglepy.utils)": [[10, "squigglepy.utils.event"]], "event_happens() (in module squigglepy.utils)": [[10, "squigglepy.utils.event_happens"]], "event_occurs() (in module squigglepy.utils)": [[10, "squigglepy.utils.event_occurs"]], "extremize() (in module squigglepy.utils)": [[10, "squigglepy.utils.extremize"]], "flip_coin() (in module squigglepy.utils)": [[10, "squigglepy.utils.flip_coin"]], "full_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.full_kelly"]], "geomean() (in module squigglepy.utils)": [[10, "squigglepy.utils.geomean"]], "geomean_odds() (in module squigglepy.utils)": [[10, "squigglepy.utils.geomean_odds"]], "get_log_percentiles() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_log_percentiles"]], "get_mean_and_ci() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_mean_and_ci"]], "get_median_and_ci() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_median_and_ci"]], "get_percentiles() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_percentiles"]], "growth_rate_to_doubling_time() (in module squigglepy.utils)": [[10, "squigglepy.utils.growth_rate_to_doubling_time"]], "half_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.half_kelly"]], "is_continuous_dist() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_continuous_dist"]], "is_dist() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_dist"]], "is_sampleable() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_sampleable"]], "kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.kelly"]], "laplace() (in module squigglepy.utils)": [[10, "squigglepy.utils.laplace"]], "normalize() (in module squigglepy.utils)": [[10, "squigglepy.utils.normalize"]], "odds_to_p() (in module squigglepy.utils)": [[10, "squigglepy.utils.odds_to_p"]], "one_in() (in module squigglepy.utils)": [[10, "squigglepy.utils.one_in"]], "p_to_odds() (in module squigglepy.utils)": [[10, "squigglepy.utils.p_to_odds"]], "quarter_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.quarter_kelly"]], "roll_die() (in module squigglepy.utils)": [[10, "squigglepy.utils.roll_die"]], "squigglepy.utils": [[10, "module-squigglepy.utils"]]}}) \ No newline at end of file diff --git a/docs/build/html/usage.html b/doc/build/html/usage.html similarity index 100% rename from docs/build/html/usage.html rename to doc/build/html/usage.html diff --git a/docs/make.bat b/doc/make.bat similarity index 100% rename from docs/make.bat rename to doc/make.bat diff --git a/docs/source/conf.py b/doc/source/conf.py similarity index 85% rename from docs/source/conf.py rename to doc/source/conf.py index 1a3efc3..372fb64 100644 --- a/docs/source/conf.py +++ b/doc/source/conf.py @@ -19,14 +19,14 @@ # -- Project information ----------------------------------------------------- -project = 'Squigglepy' -copyright = '2023, Peter Wildeford' -author = 'Peter Wildeford' +project = "Squigglepy" +copyright = "2023, Peter Wildeford" +author = "Peter Wildeford" # The short X.Y version -version = '' +version = "" # The full version, including alpha/beta/rc tags -release = '' +release = "" # -- General configuration --------------------------------------------------- @@ -39,29 +39,29 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.imgmath', - 'sphinx.ext.viewcode', + "sphinx.ext.autodoc", + "sphinx.ext.imgmath", + "sphinx.ext.viewcode", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The master toctree document. -master_doc = 'index' +master_doc = "index" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = 'en' +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -88,7 +88,7 @@ # 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_static_path = ["_static"] # Custom sidebar templates, must be a dictionary that maps document names # to template names. @@ -104,7 +104,7 @@ # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. -htmlhelp_basename = 'Squigglepydoc' +htmlhelp_basename = "Squigglepydoc" # -- Options for LaTeX output ------------------------------------------------ @@ -113,15 +113,12 @@ # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # # 'preamble': '', - # Latex figure (float) alignment # # 'figure_align': 'htbp', @@ -131,8 +128,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'Squigglepy.tex', 'Squigglepy Documentation', - 'Peter Wildeford', 'manual'), + (master_doc, "Squigglepy.tex", "Squigglepy Documentation", "Peter Wildeford", "manual"), ] @@ -140,10 +136,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'squigglepy', 'Squigglepy Documentation', - [author], 1) -] +man_pages = [(master_doc, "squigglepy", "Squigglepy Documentation", [author], 1)] # -- Options for Texinfo output ---------------------------------------------- @@ -152,9 +145,15 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'Squigglepy', 'Squigglepy Documentation', - author, 'Squigglepy', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "Squigglepy", + "Squigglepy Documentation", + author, + "Squigglepy", + "One line description of project.", + "Miscellaneous", + ), ] @@ -173,7 +172,7 @@ # epub_uid = '' # A list of files that should not be packed into the epub file. -epub_exclude_files = ['search.html'] +epub_exclude_files = ["search.html"] # -- Extension configuration ------------------------------------------------- diff --git a/docs/source/index.rst b/doc/source/index.rst similarity index 100% rename from docs/source/index.rst rename to doc/source/index.rst diff --git a/docs/source/installation.rst b/doc/source/installation.rst similarity index 100% rename from docs/source/installation.rst rename to doc/source/installation.rst diff --git a/docs/source/reference/modules.rst b/doc/source/reference/modules.rst similarity index 100% rename from docs/source/reference/modules.rst rename to doc/source/reference/modules.rst diff --git a/docs/source/reference/squigglepy.bayes.rst b/doc/source/reference/squigglepy.bayes.rst similarity index 100% rename from docs/source/reference/squigglepy.bayes.rst rename to doc/source/reference/squigglepy.bayes.rst diff --git a/docs/source/reference/squigglepy.correlation.rst b/doc/source/reference/squigglepy.correlation.rst similarity index 100% rename from docs/source/reference/squigglepy.correlation.rst rename to doc/source/reference/squigglepy.correlation.rst diff --git a/docs/source/reference/squigglepy.distributions.rst b/doc/source/reference/squigglepy.distributions.rst similarity index 100% rename from docs/source/reference/squigglepy.distributions.rst rename to doc/source/reference/squigglepy.distributions.rst diff --git a/docs/source/reference/squigglepy.numbers.rst b/doc/source/reference/squigglepy.numbers.rst similarity index 100% rename from docs/source/reference/squigglepy.numbers.rst rename to doc/source/reference/squigglepy.numbers.rst diff --git a/docs/source/reference/squigglepy.rng.rst b/doc/source/reference/squigglepy.rng.rst similarity index 100% rename from docs/source/reference/squigglepy.rng.rst rename to doc/source/reference/squigglepy.rng.rst diff --git a/docs/source/reference/squigglepy.rst b/doc/source/reference/squigglepy.rst similarity index 100% rename from docs/source/reference/squigglepy.rst rename to doc/source/reference/squigglepy.rst diff --git a/docs/source/reference/squigglepy.samplers.rst b/doc/source/reference/squigglepy.samplers.rst similarity index 100% rename from docs/source/reference/squigglepy.samplers.rst rename to doc/source/reference/squigglepy.samplers.rst diff --git a/docs/source/reference/squigglepy.utils.rst b/doc/source/reference/squigglepy.utils.rst similarity index 100% rename from docs/source/reference/squigglepy.utils.rst rename to doc/source/reference/squigglepy.utils.rst diff --git a/docs/source/reference/squigglepy.version.rst b/doc/source/reference/squigglepy.version.rst similarity index 100% rename from docs/source/reference/squigglepy.version.rst rename to doc/source/reference/squigglepy.version.rst diff --git a/docs/source/usage.rst b/doc/source/usage.rst similarity index 100% rename from docs/source/usage.rst rename to doc/source/usage.rst diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle deleted file mode 100644 index b68a1ed502c8e4df47bbf6a9f5debec660fddee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536662 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 diff --git a/docs/build/doctrees/reference/squigglepy.utils.doctree b/docs/build/doctrees/reference/squigglepy.utils.doctree deleted file mode 100644 index 8ea7c64cfb19aa1288d77f6517b794b49dda66bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210728 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 h+TJq*+qXp$xhVJO809`IjZtnc Date: Thu, 23 Nov 2023 13:36:18 -0800 Subject: [PATCH 5/7] docs: update Poetry dependencies for Sphinx requirements --- poetry.lock | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 268 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 86c4e93..42f9236 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,30 @@ # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +[[package]] +name = "accessible-pygments" +version = "0.0.4" +description = "A collection of accessible pygments styles" +optional = false +python-versions = "*" +files = [ + {file = "accessible-pygments-0.0.4.tar.gz", hash = "sha256:e7b57a9b15958e9601c7e9eb07a440c813283545a20973f2574a5f453d0e953e"}, + {file = "accessible_pygments-0.0.4-py2.py3-none-any.whl", hash = "sha256:416c6d8c1ea1c5ad8701903a20fcedf953c6e720d64f33dc47bfb2d3f2fa4e8d"}, +] + +[package.dependencies] +pygments = ">=1.5" + +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +optional = false +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] + [[package]] name = "ansi2html" version = "1.8.0" @@ -33,6 +58,38 @@ docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib- tests = ["attrs[tests-no-zope]", "zope-interface"] tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +[[package]] +name = "babel" +version = "2.13.1" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" version = "23.3.0" @@ -438,6 +495,17 @@ files = [ [package.extras] graph = ["objgraph (>=1.7.2)"] +[[package]] +name = "docutils" +version = "0.20.1" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] + [[package]] name = "exceptiongroup" version = "1.1.1" @@ -602,6 +670,17 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + [[package]] name = "importlib-metadata" version = "6.7.0" @@ -1369,6 +1448,33 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +[[package]] +name = "pydata-sphinx-theme" +version = "0.14.3" +description = "Bootstrap-based Sphinx theme from the PyData community" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydata_sphinx_theme-0.14.3-py3-none-any.whl", hash = "sha256:b7e40cd75a20449adfe2d7525be379b9fe92f6d31e5233e449fa34ddcd4398d9"}, + {file = "pydata_sphinx_theme-0.14.3.tar.gz", hash = "sha256:bd474f347895f3fc5b6ce87390af64330ee54f11ebf9660d5bc3f87d532d4e5c"}, +] + +[package.dependencies] +accessible-pygments = "*" +Babel = "*" +beautifulsoup4 = "*" +docutils = "!=0.17.0" +packaging = "*" +pygments = ">=2.7" +sphinx = ">=5.0" +typing-extensions = "*" + +[package.extras] +a11y = ["pytest-playwright"] +dev = ["nox", "pre-commit", "pydata-sphinx-theme[doc,test]", "pyyaml"] +doc = ["ablog (>=0.11.0rc2)", "colorama", "ipykernel", "ipyleaflet", "jupyter_sphinx", "jupyterlite-sphinx", "linkify-it-py", "matplotlib", "myst-parser", "nbsphinx", "numpy", "numpydoc", "pandas", "plotly", "rich", "sphinx-autoapi (>=3.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-favicon (>=1.0.1)", "sphinx-sitemap", "sphinx-togglebutton", "sphinxcontrib-youtube (<1.4)", "sphinxext-rediraffe", "xarray"] +test = ["pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "pygments" version = "2.15.1" @@ -1659,6 +1765,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + [[package]] name = "sortedcontainers" version = "2.4.0" @@ -1670,6 +1787,156 @@ files = [ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sphinx" +version = "7.2.6" +description = "Python documentation generator" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, + {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.21" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.14" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.9" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.7" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, + {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.5" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, + {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.4" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, + {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.6" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, + {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.9" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, + {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + [[package]] name = "tenacity" version = "8.2.2" @@ -1809,4 +2076,4 @@ plots = ["matplotlib"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "5625f6f3eec6de2121f93d9cb0591c23402a9c232f824ce8353c50b7441e3a9d" +content-hash = "f9f1beabf7d339e2173f854e8559f6bd9f1fbb28d711802c3d0d831a7b1fa2b5" From ffd5250ae5968900eb86226e76d0d752ed0522b4 Mon Sep 17 00:00:00 2001 From: Michael Dickens Date: Thu, 23 Nov 2023 13:36:41 -0800 Subject: [PATCH 6/7] docs: support numpydoc docstring style --- doc/build/doctrees/environment.pickle | Bin 1424287 -> 1521208 bytes doc/build/doctrees/index.doctree | Bin 8841 -> 9496 bytes .../reference/squigglepy.bayes.doctree | Bin 53324 -> 57815 bytes .../reference/squigglepy.correlation.doctree | Bin 54191 -> 61358 bytes .../squigglepy.distributions.doctree | Bin 332702 -> 390640 bytes .../doctrees/reference/squigglepy.doctree | Bin 3632 -> 3886 bytes .../reference/squigglepy.numbers.doctree | Bin 2849 -> 3110 bytes .../doctrees/reference/squigglepy.rng.doctree | Bin 7309 -> 7951 bytes .../reference/squigglepy.samplers.doctree | Bin 171574 -> 176788 bytes .../reference/squigglepy.utils.doctree | Bin 214438 -> 219063 bytes .../reference/squigglepy.version.doctree | Bin 2849 -> 3110 bytes doc/build/html/.buildinfo | 2 +- .../_modules/squigglepy/distributions.html | 158 ++- doc/build/html/_sources/index.rst.txt | 2 + doc/build/html/index.html | 4 + .../html/reference/squigglepy.bayes.html | 130 +- .../reference/squigglepy.correlation.html | 61 +- .../reference/squigglepy.distributions.html | 1101 ++++++++++------- doc/build/html/reference/squigglepy.rng.html | 22 +- .../html/reference/squigglepy.samplers.html | 532 ++++---- .../html/reference/squigglepy.utils.html | 628 +++++----- doc/build/html/searchindex.js | 2 +- doc/source/conf.py | 3 + doc/source/index.rst | 2 + pyproject.toml | 1 + 25 files changed, 1398 insertions(+), 1250 deletions(-) diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle index 456a719c76a64ecbca44be6ea25533047f2d6c83..8945c72dd012e574ee5b7bf717599676ac920a65 100644 GIT binary patch literal 1521208 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

-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≥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

  • d4tUWmmWb>q6}jsuqbIgfke~^ZqjWPZVrN6 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ŐB=V5Eg6gPZ)<^tEW28w_1Q{^WrD!{i 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 z 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

    4v$6q3 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 diff --git a/doc/build/doctrees/index.doctree b/doc/build/doctrees/index.doctree index 7f9e77d024ebca52e3e146fb65ed8763eb7ab265..e87e59add7cad7b0b116433923d8f637f7d364d8 100644 GIT binary patch delta 600 zcmZWmTT22#6!x~7cA>%y$u1I+RutAt^d3~c)LTU&s|}u()m?UXN)fw2FTxPfj#N-T zqI~RE6bSVY1ob~^W=z;pywb54ErW0#K&dOw1?x@ZJdgtGK}-j#@QbyGn5QD8Zx13r9!(Y zGE6bTG~3CHX!KP($Ax_v9$z5Aa#39|bvchH>Cz2kBI6JV9ud6118F`**Swx?Pg5HG z^sav}hVss7EqGC0xz}O`Cc%#dCLf2wd39*j1*MK5&L2fw54=D_X*E;vZTAlV CfzAH_ delta 115 zcmbQ?)#=LGz&f=~X(MZZ*yLAYoty8A-DleDBjd)*w2g7|6#2)@p52TL3|SpOBI9bt zrL1NUuK`Gu_HgDU=BAcZ7NizWshy&c1ya|UakUeyq_Z?b5hMuK$CGg>V`^5z<^#$R Fi~tO6C&>T+ diff --git a/doc/build/doctrees/reference/squigglepy.bayes.doctree b/doc/build/doctrees/reference/squigglepy.bayes.doctree index e54058edafd4efb1d2888f2594f7a5ce7055c062..9ebd35876238834abe56b868917ae4a0e334f6e4 100644 GIT binary patch literal 57815 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 PI9Vm%E!-UE`TYL_Ssr4F literal 53324 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 diff --git a/doc/build/doctrees/reference/squigglepy.correlation.doctree b/doc/build/doctrees/reference/squigglepy.correlation.doctree index 72d86c6b45e27ec4c74d78b9e6bcc72bc04d8b3f..f5a1114e38a425507a291892d4538547bb5458e2 100644 GIT binary patch literal 61358 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 s$i9befnd*8l(j literal 54191 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 Z_Ew(7MIK_AjP-P#rZ!?0z<2TI|39Hg`_2FW diff --git a/doc/build/doctrees/reference/squigglepy.distributions.doctree b/doc/build/doctrees/reference/squigglepy.distributions.doctree index 5ba4c59fa626153f2d4052d0bc142e39e6770534..6dd67cdb73a0c89805725d4e7db834c1a5230a73 100644 GIT binary patch literal 390640 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

    SIeR$5AXTY;P`Wucjc#PtNzs)d3LGB*OXERM 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

    J#u%=j3?6? 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 diff --git a/doc/build/doctrees/reference/squigglepy.doctree b/doc/build/doctrees/reference/squigglepy.doctree index 52234e6a5bd1dab29bce26161608c9bfe285924f..5864f8f532f0557054590f8cc31166c3343886a5 100644 GIT binary patch delta 311 zcmdlWvrdk+fpw}f|3+4QrWDQ|_T>EB+|<01DU+vYHcqLXqLIPcBdw^YP*9YgoLXF* znxc?YsgPHiTTq#jpRAy$I3CBkZS(>2;^7O*VnmisHqKpg- QNUpGBo(VMSE>AEc0MWN=@&Et; delta 144 zcmZ1{w?T%rfpw}X-$qt_rpZRkE{u+o%bE2U?KUrCUdzazl#!B=mXVQ>m64N?mr*b| zi8YHiBttesCqvGgCqp_TaPm!7V^)74%WktE8$UDSp3RD!51CabX7purX0(;|aONfE trj}F|q!v%9ouZL3u`{Eyvou2y#O|A{&g;R*G`WB`gSic;|2A(hBLE1ZFirpf diff --git a/doc/build/doctrees/reference/squigglepy.numbers.doctree b/doc/build/doctrees/reference/squigglepy.numbers.doctree index c681073644806d45613a546a1fb397e825029d25..1748e4356048c693dc07c32f32266c1858ffa6f2 100644 GIT binary patch delta 253 zcmZ1|woHPxfpw}h&qme|ruq!d9`@w?+}zZ>k|~p?Xf{r%ouZM!+9R!~s8CRppPX7; zoSLGLRH=|xnp;qrlAo-gs5m8qJ$6cl7=AUaQ$R*#NM|?{CnaXcgG^Nf>QV+`RUlRe zV$IkoJ?fklxj9zF1&PV2Q+hZGic*VHi^@``lxApW*a0>3WXNPNXUO(MOwMFfp4`Q0 z$;iApoarbNW8-F7)(6b8VHv^2J)C)oxv3?U1*yd#8^bz_GZaDA1y7dZ^k6*>)4jQi Hb2=jcCbd~q delta 71 zcmV-N0J#6A7@-ygfCZHn3$X=M0<&HN!vXF9|}kTw3GV+V6(^yUI9=^81VoA diff --git a/doc/build/doctrees/reference/squigglepy.rng.doctree b/doc/build/doctrees/reference/squigglepy.rng.doctree index 62729feb7089ab83fafdc4bacc2bb8b0a1c10fb0..bc874cf79920fa112b445f3c97371e10ee956362 100644 GIT binary patch delta 1711 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 TXsEMjGyQoSVaOSCoyh)ww{tn{ literal 171574 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 diff --git a/doc/build/doctrees/reference/squigglepy.utils.doctree b/doc/build/doctrees/reference/squigglepy.utils.doctree index a8274d1ee9d8156e0e720bd9e192e0fdebbe7496..93bf9e9769ed2039bfd2b45e89584921e18f2c1a 100644 GIT binary patch literal 219063 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

    ^D?0La;a?ja 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
    ZKBEMCs|QlXT}Otl&D@$&yl1PFOi@=8FqU); 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 GiT@uzAl$bA literal 332702 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

  • (R!DSaWaLW7)){AW_6|;RtClh6nq%tepgFX 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 N5)ccM6qcvC{{f~1R2~2T literal 214438 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 Hb2=jcCbd~q delta 71 zcmV-N0J#6A7@-ygfCZHn3$X=M0<&HN!vXF9|}kTw3GV+V6(^yUI9=^81VoA diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo index 89a4dd5..67b86aa 100644 --- a/doc/build/html/.buildinfo +++ b/doc/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 9f8d51c5fcb3931d93e7669f4628efd8 +config: de91ded5cec9d4685caf230095b3197b tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/html/_modules/squigglepy/distributions.html b/doc/build/html/_modules/squigglepy/distributions.html index 2ac9dc3..8353a85 100644 --- a/doc/build/html/_modules/squigglepy/distributions.html +++ b/doc/build/html/_modules/squigglepy/distributions.html @@ -131,6 +131,26 @@

  • @@ -208,6 +228,26 @@

    @@ -306,7 +346,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class BaseDistribution(ABC): def __init__(self): self.x = None @@ -353,13 +393,13 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class OperableDistribution(BaseDistribution): def __init__(self): super().__init__()
    -[docs] +[docs] def plot(self, num_samples=None, bins=None): """ Plot a histogram of the samples. @@ -477,21 +517,21 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class DiscreteDistribution(OperableDistribution, ABC): ...
    -[docs] +[docs] class ContinuousDistribution(OperableDistribution, ABC): ...
    -[docs] +[docs] class CompositeDistribution(OperableDistribution): def __init__(self): super().__init__() @@ -514,7 +554,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class ComplexDistribution(CompositeDistribution): def __init__(self, left, right=None, fn=operator.add, fn_str="+", infix=True): super().__init__() @@ -565,7 +605,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def dist_fn(dist1, dist2=None, fn=None, name=None): """ Initialize a distribution that has a custom function applied to the result. @@ -636,7 +676,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def dist_max(dist1, dist2=None): """ Initialize the calculation of the maximum value of two distributions. @@ -669,7 +709,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def dist_min(dist1, dist2=None): """ Initialize the calculation of the minimum value of two distributions. @@ -701,7 +741,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def dist_round(dist1, digits=0): """ Initialize the rounding of the output of the distribution. @@ -733,7 +773,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def dist_ceil(dist1): """ Initialize the ceiling rounding of the output of the distribution. @@ -760,7 +800,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def dist_floor(dist1): """ Initialize the floor rounding of the output of the distribution. @@ -787,7 +827,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def dist_log(dist1, base=math.e): """ Initialize the log of the output of the distribution. @@ -814,7 +854,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def dist_exp(dist1): """ Initialize the exp of the output of the distribution. @@ -849,7 +889,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def lclip(dist1, val=None): """ Initialize the clipping/bounding of the output of the distribution by the lower value. @@ -892,7 +932,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def rclip(dist1, val=None): """ Initialize the clipping/bounding of the output of the distribution by the upper value. @@ -927,7 +967,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def clip(dist1, left, right=None): """ Initialize the clipping/bounding of the output of the distribution. @@ -966,7 +1006,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class ConstantDistribution(DiscreteDistribution): def __init__(self, x): super().__init__() @@ -978,7 +1018,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def const(x): """ Initialize a constant distribution. @@ -1004,7 +1044,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class UniformDistribution(ContinuousDistribution): def __init__(self, x, y): super().__init__() @@ -1018,7 +1058,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def uniform(x, y): """ Initialize a uniform random distribution. @@ -1044,7 +1084,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class NormalDistribution(ContinuousDistribution): def __init__(self, x=None, y=None, mean=None, sd=None, credibility=90, lclip=None, rclip=None): super().__init__() @@ -1084,7 +1124,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def norm( x=None, y=None, credibility=90, mean=None, sd=None, lclip=None, rclip=None ) -> NormalDistribution: @@ -1130,7 +1170,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class LognormalDistribution(ContinuousDistribution): def __init__( self, @@ -1216,7 +1256,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def lognorm( x=None, y=None, @@ -1286,7 +1326,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def to( x, y, credibility=90, lclip=None, rclip=None ) -> Union[LognormalDistribution, NormalDistribution]: @@ -1331,7 +1371,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class BinomialDistribution(DiscreteDistribution): def __init__(self, n, p): super().__init__() @@ -1346,7 +1386,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def binomial(n, p): """ Initialize a binomial distribution. @@ -1372,7 +1412,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class BetaDistribution(ContinuousDistribution): def __init__(self, a, b): super().__init__() @@ -1385,7 +1425,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def beta(a, b): """ Initialize a beta distribution. @@ -1413,7 +1453,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class BernoulliDistribution(DiscreteDistribution): def __init__(self, p): super().__init__() @@ -1429,7 +1469,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def bernoulli(p): """ Initialize a Bernoulli distribution. @@ -1453,7 +1493,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class CategoricalDistribution(DiscreteDistribution): def __init__(self, items): super().__init__() @@ -1468,7 +1508,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def discrete(items): """ Initialize a discrete distribution (aka categorical distribution). @@ -1499,7 +1539,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class TDistribution(ContinuousDistribution): def __init__(self, x=None, y=None, t=20, credibility=90, lclip=None, rclip=None): super().__init__() @@ -1536,7 +1576,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def tdist(x=None, y=None, t=20, credibility=90, lclip=None, rclip=None): """ Initialize a t-distribution. @@ -1579,7 +1619,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class LogTDistribution(ContinuousDistribution): def __init__(self, x=None, y=None, t=1, credibility=90, lclip=None, rclip=None): super().__init__() @@ -1618,7 +1658,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def log_tdist(x=None, y=None, t=1, credibility=90, lclip=None, rclip=None): """ Initialize a log t-distribution, which is a t-distribution in log-space. @@ -1662,7 +1702,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class TriangularDistribution(ContinuousDistribution): def __init__(self, left, mode, right): super().__init__() @@ -1682,7 +1722,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def triangular(left, mode, right, lclip=None, rclip=None): """ Initialize a triangular distribution. @@ -1710,7 +1750,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class PERTDistribution(ContinuousDistribution): def __init__(self, left, mode, right, lam=4, lclip=None, rclip=None): super().__init__() @@ -1744,7 +1784,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def pert(left, mode, right, lam=4, lclip=None, rclip=None): """ Initialize a PERT distribution. @@ -1778,7 +1818,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class PoissonDistribution(DiscreteDistribution): def __init__(self, lam, lclip=None, rclip=None): super().__init__() @@ -1798,7 +1838,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def poisson(lam, lclip=None, rclip=None): """ Initialize a poisson distribution. @@ -1826,7 +1866,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class ChiSquareDistribution(ContinuousDistribution): def __init__(self, df): super().__init__() @@ -1840,7 +1880,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def chisquare(df): """ Initialize a chi-square distribution. @@ -1864,7 +1904,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class ExponentialDistribution(ContinuousDistribution): def __init__(self, scale, lclip=None, rclip=None): super().__init__() @@ -1887,7 +1927,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def exponential(scale, lclip=None, rclip=None): """ Initialize an exponential distribution. @@ -1915,7 +1955,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class GammaDistribution(ContinuousDistribution): def __init__(self, shape, scale=1, lclip=None, rclip=None): super().__init__() @@ -1936,7 +1976,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def gamma(shape, scale=1, lclip=None, rclip=None): """ Initialize a gamma distribution. @@ -1966,7 +2006,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class ParetoDistribution(ContinuousDistribution): def __init__(self, shape): super().__init__() @@ -1978,7 +2018,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def pareto(shape): """ Initialize a pareto distribution. @@ -2002,7 +2042,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class MixtureDistribution(CompositeDistribution): def __init__(self, dists, weights=None, relative_weights=None, lclip=None, rclip=None): super().__init__() @@ -2022,7 +2062,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def mixture(dists, weights=None, relative_weights=None, lclip=None, rclip=None): """ Initialize a mixture distribution, which is a combination of different distributions. @@ -2072,7 +2112,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def zero_inflated(p_zero, dist): """ Initialize an arbitrary zero-inflated distribution. @@ -2102,7 +2142,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def inf0(p_zero, dist): """ Initialize an arbitrary zero-inflated distribution. @@ -2132,7 +2172,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] class GeometricDistribution(OperableDistribution): def __init__(self, p): super().__init__() @@ -2146,7 +2186,7 @@

    Source code for squigglepy.distributions

     
     
     
    -[docs] +[docs] def geometric(p): """ Initialize a geometric distribution. diff --git a/doc/build/html/_sources/index.rst.txt b/doc/build/html/_sources/index.rst.txt index 89b8383..3461183 100644 --- a/doc/build/html/_sources/index.rst.txt +++ b/doc/build/html/_sources/index.rst.txt @@ -47,3 +47,5 @@ Acknowledgements distributions. - Thanks to Dawn Drescher for coming up with the idea to use ``~`` as a shorthand for ``sample``, as well as helping me implement it. + +.. autosummary:: diff --git a/doc/build/html/index.html b/doc/build/html/index.html index 196b18e..50ecd3c 100644 --- a/doc/build/html/index.html +++ b/doc/build/html/index.html @@ -357,6 +357,10 @@

    Acknowledgements~ as a shorthand for sample, as well as helping me implement it.

    + + + +
    diff --git a/doc/build/html/reference/squigglepy.bayes.html b/doc/build/html/reference/squigglepy.bayes.html index 5a322dc..ada266d 100644 --- a/doc/build/html/reference/squigglepy.bayes.html +++ b/doc/build/html/reference/squigglepy.bayes.html @@ -362,36 +362,34 @@
    squigglepy.bayes.average(prior, evidence, weights=[0.5, 0.5], relative_weights=None)[source]#

    Average two distributions.

    -
    -

    Parameters#

    -
    -
    priorDistribution

    The prior distribution.

    +
    +
    Parameters:
    +
    +
    priorDistribution

    The prior distribution.

    -
    evidenceDistribution

    The distribution used to average with the prior.

    +
    evidenceDistribution

    The distribution used to average with the prior.

    -
    weightslist or np.array or float

    How much weight to put on prior versus evidence when averaging? If +

    weightslist or np.array or float

    How much weight to put on prior versus evidence when averaging? If only one weight is passed, the other weight will be inferred to make the total weights sum to 1. Defaults to 50-50 weights.

    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized +

    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized to sum to 1.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    Distribution

    A mixture distribution that accords weights to prior and evidence.

    - -
    -

    Examples#

    +
    + +

    Examples

    >> prior = sq.norm(1,5) >> evidence = sq.norm(2,3) >> bayes.average(prior, evidence) <Distribution> mixture

    -
    @@ -400,59 +398,58 @@

    Examples

    Calculate a Bayesian network.

    Allows you to find conditional probabilities of custom events based on rejection sampling.

    -
    -

    Parameters#

    -
    -
    event_fnfunction

    A function that defines the bayesian network

    +
    +
    Parameters:
    +
    +
    event_fnfunction

    A function that defines the bayesian network

    -
    nint

    The number of samples to generate

    +
    nint

    The number of samples to generate

    -
    finda function or None

    What do we want to know the probability of?

    +
    finda function or None

    What do we want to know the probability of?

    -
    conditional_ona function or None

    When finding the probability, what do we want to condition on?

    +
    conditional_ona function or None

    When finding the probability, what do we want to condition on?

    -
    reduce_fna function or None

    When taking all the results of the simulations, how do we aggregate them +

    reduce_fna function or None

    When taking all the results of the simulations, how do we aggregate them into a final answer? Defaults to np.mean.

    -
    rawbool

    If True, just return the results of each simulation without aggregating.

    +
    rawbool

    If True, just return the results of each simulation without aggregating.

    -
    memcachebool

    If True, cache the results in-memory for future calculations. Each cache +

    memcachebool

    If True, cache the results in-memory for future calculations. Each cache will be matched based on the event_fn. Default True.

    -
    memcache_loadbool

    If True, load cache from the in-memory. This will be true if memcache +

    memcache_loadbool

    If True, load cache from the in-memory. This will be true if memcache is True. Cache will be matched based on the event_fn. Default True.

    -
    memcache_savebool

    If True, save results to an in-memory cache. This will be true if memcache +

    memcache_savebool

    If True, save results to an in-memory cache. This will be true if memcache is True. Cache will be matched based on the event_fn. Default True.

    -
    reload_cachebool

    If True, any existing cache will be ignored and recalculated. Default False.

    +
    reload_cachebool

    If True, any existing cache will be ignored and recalculated. Default False.

    -
    dump_cache_filestr or None

    If present, will write out the cache to a binary file with this path with +

    dump_cache_filestr or None

    If present, will write out the cache to a binary file with this path with .sqlcache appended to the file name.

    -
    load_cache_filestr or None

    If present, will first attempt to load and use a cache from a file with this +

    load_cache_filestr or None

    If present, will first attempt to load and use a cache from a file with this path with .sqlcache appended to the file name.

    -
    cache_file_primarybool

    If both an in-memory cache and file cache are present, the file +

    cache_file_primarybool

    If both an in-memory cache and file cache are present, the file cache will be used for the cache if this is True, and the in-memory cache will be used otherwise. Defaults to False.

    -
    verbosebool

    If True, will print out statements on computational progress.

    +
    verbosebool

    If True, will print out statements on computational progress.

    -
    coresint

    If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing +

    coresint

    If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing pool with that many cores / processes.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    various

    The result of reduce_fn on n simulations of event_fn.

    - -
    -

    Examples#

    +
    +

    +

    Examples

    # Cancer example: prior of having cancer is 1%, the likelihood of a positive # mammography given cancer is 80% (true positive rate), and the likelihood of # a positive mammography given no cancer is 9.6% (false positive rate). @@ -471,7 +468,6 @@

    Examples# >> conditional_on=lambda e: e[‘mammography’], >> n=1*M) 0.07723995880535531

    -
    @@ -482,33 +478,31 @@

    Examples# p(h|e) is called posterior p(e|h) is called likelihood p(h) is called prior

    -
    -

    Parameters#

    -
    -
    likelihood_hfloat

    The likelihood (given that the hypothesis is true), aka p(e|h)

    +
    +
    Parameters:
    +
    +
    likelihood_hfloat

    The likelihood (given that the hypothesis is true), aka p(e|h)

    -
    likelihood_not_hfloat

    The likelihood given the hypothesis is not true, aka p(e|~h)

    +
    likelihood_not_hfloat

    The likelihood given the hypothesis is not true, aka p(e|~h)

    -
    priorfloat

    The prior probability, aka p(h)

    +
    priorfloat

    The prior probability, aka p(h)

    -
    -
    -

    Returns#

    -
    + +
    Returns:
    +
    float

    The result of Bayes rule, aka p(h|e)

    -
    -
    -

    Examples#

    + +

    +

    Examples

    # Cancer example: prior of having cancer is 1%, the likelihood of a positive # mammography given cancer is 80% (true positive rate), and the likelihood of # a positive mammography given no cancer is 9.6% (false positive rate). # Given this, what is the probability of cancer given a positive mammography? >>> simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) 0.07763975155279504

    -
    @@ -517,34 +511,32 @@

    Examples#

    Update a distribution.

    Starting with a prior distribution, use Bayesian inference to perform an update, producing a posterior distribution from the evidence distribution.

    -
    -

    Parameters#

    -
    -
    priorDistribution

    The prior distribution. Currently must either be normal or beta type. Other +

    +
    Parameters:
    +
    +
    priorDistribution

    The prior distribution. Currently must either be normal or beta type. Other types are not yet supported.

    -
    evidenceDistribution

    The distribution used to update the prior. Currently must either be normal +

    evidenceDistribution

    The distribution used to update the prior. Currently must either be normal or beta type. Other types are not yet supported.

    -
    evidence_weightfloat

    How much weight to put on the evidence distribution? Currently this only matters +

    evidence_weightfloat

    How much weight to put on the evidence distribution? Currently this only matters for normal distributions, where this should be equivalent to the sample weight.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    Distribution

    The posterior distribution

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >> prior = sq.norm(1,5) >> evidence = sq.norm(2,3) >> bayes.update(prior, evidence) <Distribution> norm(mean=2.53, sd=0.29)

    - diff --git a/doc/build/html/reference/squigglepy.correlation.html b/doc/build/html/reference/squigglepy.correlation.html index d19ed30..df78a95 100644 --- a/doc/build/html/reference/squigglepy.correlation.html +++ b/doc/build/html/reference/squigglepy.correlation.html @@ -366,6 +366,17 @@

    An object that holds metadata for a group of correlated distributions. This object is not intended to be used directly by the user, but rather during sampling to induce correlations between distributions.

    +

    Methods

    + + + + + + + + + +

    has_sufficient_sample_diversity(samples[, ...])

    Check if there is there are sufficient unique samples to work with in the data.

    induce_correlation(data)

    Induce a set of correlations on a column-wise dataset

    correlated_dists: tuple[OperableDistribution]#
    @@ -391,26 +402,26 @@
    induce_correlation(data: ndarray[Any, dtype[float64]]) ndarray[Any, dtype[float64]][source]#

    Induce a set of correlations on a column-wise dataset

    -
    -

    Parameters#

    -
    -
    data2d-array

    An m-by-n array where m is the number of samples and n is the +

    +
    Parameters:
    +
    +
    data2d-array

    An m-by-n array where m is the number of samples and n is the number of independent variables, each column of the array corresponding to each variable

    -
    corrmat2d-array

    An n-by-n array that defines the desired correlation coefficients +

    corrmat2d-array

    An n-by-n array that defines the desired correlation coefficients (between -1 and 1). Note: the matrix must be symmetric and positive-definite in order to induce.

    -
    -
    -

    Returns#

    -
    -
    new_data2d-array

    An m-by-n array that has the desired correlations.

    +
    +
    Returns:
    +
    +
    new_data2d-array

    An m-by-n array that has the desired correlations.

    +
    +
    -
    @@ -429,38 +440,37 @@

    Returns#<

    This method works on a best-effort basis, and may fail to induce the desired correlation depending on the distributions provided. An exception will be raised if that’s the case.

    -
    -

    Parameters#

    -
    -
    variablestuple of distributions

    The variables to correlate as a tuple of distributions.

    +
    +
    Parameters:
    +
    +
    variablestuple of distributions

    The variables to correlate as a tuple of distributions.

    The distributions must be able to produce enough unique samples for the method to be able to induce the desired correlation by shuffling the samples.

    Discrete distributions are notably hard to correlate this way, as it’s common for them to result in very few unique samples.

    -
    correlation2d-array or float

    An n-by-n array that defines the desired Spearman rank correlation coefficients. +

    correlation2d-array or float

    An n-by-n array that defines the desired Spearman rank correlation coefficients. This matrix must be symmetric and positive semi-definite; and must not be confused with a covariance matrix.

    Correlation parameters can only be between -1 and 1, exclusive (including extremely close approximations).

    If a float is provided, all variables will be correlated with the same coefficient.

    -
    tolerancefloat, optional

    If provided, overrides the absolute tolerance used to check if the resulting +

    tolerancefloat, optional

    If provided, overrides the absolute tolerance used to check if the resulting correlation matrix matches the desired correlation matrix. Defaults to 0.05.

    Checking can also be disabled by passing None.

    -
    -
    -

    Returns#

    -
    -
    correlated_variablestuple of distributions

    The correlated variables as a tuple of distributions in the same order as +

    +
    Returns:
    +
    +
    correlated_variablestuple of distributions

    The correlated variables as a tuple of distributions in the same order as the input variables.

    -
    -
    -

    Examples#

    + +

    +

    Examples

    Suppose we want to correlate two variables with a correlation coefficient of 0.65: >>> solar_radiation, temperature = sq.gamma(300, 100), sq.to(22, 28) >>> solar_radiation, temperature = sq.correlate((solar_radiation, temperature), 0.7) @@ -480,7 +490,6 @@

    Examples [-0.480149, -0.187831 , 1. ]])

    - diff --git a/doc/build/html/reference/squigglepy.distributions.html b/doc/build/html/reference/squigglepy.distributions.html index 5ac9aa9..233fb54 100644 --- a/doc/build/html/reference/squigglepy.distributions.html +++ b/doc/build/html/reference/squigglepy.distributions.html @@ -368,127 +368,270 @@
    class squigglepy.distributions.BernoulliDistribution(p)[source]#

    Bases: DiscreteDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.BetaDistribution(a, b)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.BinomialDistribution(n, p)[source]#

    Bases: DiscreteDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.CategoricalDistribution(items)[source]#

    Bases: DiscreteDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.ChiSquareDistribution(df)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.ComplexDistribution(left, right=None, fn=<built-in function add>, fn_str='+', infix=True)[source]#

    Bases: CompositeDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.CompositeDistribution[source]#

    Bases: OperableDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.ConstantDistribution(x)[source]#

    Bases: DiscreteDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.ContinuousDistribution[source]#

    Bases: OperableDistribution, ABC

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.DiscreteDistribution[source]#

    Bases: OperableDistribution, ABC

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.ExponentialDistribution(scale, lclip=None, rclip=None)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.GammaDistribution(shape, scale=1, lclip=None, rclip=None)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.GeometricDistribution(p)[source]#

    Bases: OperableDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.LogTDistribution(x=None, y=None, t=1, credibility=90, lclip=None, rclip=None)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.LognormalDistribution(x=None, y=None, norm_mean=None, norm_sd=None, lognorm_mean=None, lognorm_sd=None, credibility=90, lclip=None, rclip=None)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.MixtureDistribution(dists, weights=None, relative_weights=None, lclip=None, rclip=None)[source]#

    Bases: CompositeDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.NormalDistribution(x=None, y=None, mean=None, sd=None, credibility=90, lclip=None, rclip=None)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.OperableDistribution[source]#

    Bases: BaseDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    plot(num_samples=None, bins=None)[source]#

    Plot a histogram of the samples.

    -
    -

    Parameters#

    -
    -
    num_samplesint

    The number of samples to draw for plotting. Defaults to 1000 if not set.

    +
    +
    Parameters:
    +
    +
    num_samplesint

    The number of samples to draw for plotting. Defaults to 1000 if not set.

    -
    binsint

    The number of bins to plot. Defaults to 200 if not set.

    +
    binsint

    The number of bins to plot. Defaults to 200 if not set.

    -
    -
    -

    Examples#

    +
    +
    +

    Examples

    >>> sq.norm(5, 10).plot()
     
    -
    @@ -497,138 +640,186 @@

    Examples
    class squigglepy.distributions.PERTDistribution(left, mode, right, lam=4, lclip=None, rclip=None)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.ParetoDistribution(shape)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.PoissonDistribution(lam, lclip=None, rclip=None)[source]#

    Bases: DiscreteDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.TDistribution(x=None, y=None, t=20, credibility=90, lclip=None, rclip=None)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.TriangularDistribution(left, mode, right)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    class squigglepy.distributions.UniformDistribution(x, y)[source]#

    Bases: ContinuousDistribution

    +

    Methods

    + + + + + + +

    plot([num_samples, bins])

    Plot a histogram of the samples.

    squigglepy.distributions.bernoulli(p)[source]#

    Initialize a Bernoulli distribution.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability of the binary event. Must be between 0 and 1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability of the binary event. Must be between 0 and 1.

    -
    -
    -

    Returns#

    -

    BernoulliDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    BernoulliDistribution
    +
    +
    +
    +

    Examples

    >>> bernoulli(0.1)
     <Distribution> bernoulli(p=0.1)
     
    -
    squigglepy.distributions.beta(a, b)[source]#

    Initialize a beta distribution.

    -
    -

    Parameters#

    -
    -
    afloat

    The alpha shape value of the distribution. Typically takes the value of the +

    +
    Parameters:
    +
    +
    afloat

    The alpha shape value of the distribution. Typically takes the value of the number of trials that resulted in a success.

    -
    bfloat

    The beta shape value of the distribution. Typically takes the value of the +

    bfloat

    The beta shape value of the distribution. Typically takes the value of the number of trials that resulted in a failure.

    -
    -
    -

    Returns#

    -

    BetaDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    BetaDistribution
    +
    +
    +
    +

    Examples

    >>> beta(1, 2)
     <Distribution> beta(1, 2)
     
    -
    squigglepy.distributions.binomial(n, p)[source]#

    Initialize a binomial distribution.

    -
    -

    Parameters#

    -
    -
    nint

    The number of trials.

    +
    +
    Parameters:
    +
    +
    nint

    The number of trials.

    -
    pfloat

    The probability of success for each trial. Must be between 0 and 1.

    +
    pfloat

    The probability of success for each trial. Must be between 0 and 1.

    -
    -
    -

    Returns#

    -

    BinomialDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    BinomialDistribution
    +
    +
    +
    +

    Examples

    >>> binomial(1, 0.1)
     <Distribution> binomial(1, 0.1)
     
    -
    squigglepy.distributions.chisquare(df)[source]#

    Initialize a chi-square distribution.

    -
    -

    Parameters#

    -
    -
    dffloat

    The degrees of freedom. Must be positive.

    +
    +
    Parameters:
    +
    +
    dffloat

    The degrees of freedom. Must be positive.

    -
    -
    -

    Returns#

    -

    ChiSquareDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    ChiSquareDistribution
    +
    +
    +
    +

    Examples

    >>> chisquare(2)
     <Distribution> chiaquare(2)
     
    -
    @@ -636,32 +827,30 @@

    Examples#squigglepy.distributions.clip(dist1, left, right=None)[source]#

    Initialize the clipping/bounding of the output of the distribution.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will +

    +
    Parameters:
    +
    +
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will be suitable for use in piping.

    -
    leftint or float or None

    The value to use as the lower bound for clipping.

    +
    leftint or float or None

    The value to use as the lower bound for clipping.

    -
    rightint or float or None

    The value to use as the upper bound for clipping.

    +
    rightint or float or None

    The value to use as the upper bound for clipping.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> clip(norm(0, 1), 0.5, 0.9)
     <Distribution> rclip(lclip(norm(mean=0.5, sd=0.3), 0.5), 0.9)
     
    -
    @@ -669,44 +858,45 @@

    Examples#squigglepy.distributions.const(x)[source]#

    Initialize a constant distribution.

    Constant distributions always return the same value no matter what.

    -
    -

    Parameters#

    -
    -
    xanything

    The value the constant distribution should always return.

    +
    +
    Parameters:
    +
    +
    xanything

    The value the constant distribution should always return.

    -
    -
    -

    Returns#

    -

    ConstantDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    ConstantDistribution
    +
    +
    +

    +

    Examples

    >>> const(1)
     <Distribution> const(1)
     
    -
    squigglepy.distributions.discrete(items)[source]#

    Initialize a discrete distribution (aka categorical distribution).

    -
    -

    Parameters#

    -
    -
    itemslist or dict

    The values that the discrete distribution will return and their associated +

    +
    Parameters:
    +
    +
    itemslist or dict

    The values that the discrete distribution will return and their associated weights (or likelihoods of being returned when sampled).

    -
    -
    -

    Returns#

    -

    CategoricalDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    CategoricalDistribution
    +
    +
    +
    +

    Examples

    >>> discrete({0: 0.1, 1: 0.9})  # 10% chance of returning 0, 90% chance of returning 1
     <Distribution> categorical({0: 0.1, 1: 0.9})
     >>> discrete([[0.1, 0], [0.9, 1]])  # Different notation for the same thing.
    @@ -717,7 +907,6 @@ 

    Examples#<Distribution> categorical({'a': 0.1, 'b': 0.9})

    -
    @@ -725,27 +914,25 @@

    Examples#squigglepy.distributions.dist_ceil(dist1)[source]#

    Initialize the ceiling rounding of the output of the distribution.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution

    The distribution to sample and then ceiling round.

    +
    +
    Parameters:
    +
    +
    dist1Distribution

    The distribution to sample and then ceiling round.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> dist_ceil(norm(0, 1))
     <Distribution> ceil(norm(mean=0.5, sd=0.3))
     
    -
    @@ -753,27 +940,25 @@

    Examples#squigglepy.distributions.dist_exp(dist1)[source]#

    Initialize the exp of the output of the distribution.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution

    The distribution to sample and then take the exp of.

    +
    +
    Parameters:
    +
    +
    dist1Distribution

    The distribution to sample and then take the exp of.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> dist_exp(norm(0, 1))
     <Distribution> exp(norm(mean=0.5, sd=0.3))
     
    -
    @@ -781,27 +966,25 @@

    Examples#squigglepy.distributions.dist_floor(dist1)[source]#

    Initialize the floor rounding of the output of the distribution.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution

    The distribution to sample and then floor round.

    +
    +
    Parameters:
    +
    +
    dist1Distribution

    The distribution to sample and then floor round.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> dist_floor(norm(0, 1))
     <Distribution> floor(norm(mean=0.5, sd=0.3))
     
    -
    @@ -809,33 +992,32 @@

    Examples#squigglepy.distributions.dist_fn(dist1, dist2=None, fn=None, name=None)[source]#

    Initialize a distribution that has a custom function applied to the result.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution or function or list

    Typically, the distribution to apply the function to. Could also be a function +

    +
    Parameters:
    +
    +
    dist1Distribution or function or list

    Typically, the distribution to apply the function to. Could also be a function or list of functions if dist_fn is being used in a pipe.

    -
    dist2Distribution or function or list or None

    Typically, the second distribution to apply the function to if the function takes +

    dist2Distribution or function or list or None

    Typically, the second distribution to apply the function to if the function takes two arguments. Could also be a function or list of functions if dist_fn is being used in a pipe.

    -
    fnfunction or None

    The function to apply to the distribution(s).

    +
    fnfunction or None

    The function to apply to the distribution(s).

    -
    namestr or None

    By default, fn.__name__ will be used to name the function. But you can pass +

    namestr or None

    By default, fn.__name__ will be used to name the function. But you can pass a custom name.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated when it is sampled.

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> def double(x):
     >>>     return x * 2
     >>> dist_fn(norm(0, 1), double)
    @@ -844,7 +1026,6 @@ 

    Examples#<Distribution> double(norm(mean=0.5, sd=0.3))

    -
    @@ -852,27 +1033,25 @@

    Examples#squigglepy.distributions.dist_log(dist1, base=2.718281828459045)[source]#

    Initialize the log of the output of the distribution.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution

    The distribution to sample and then take the log of.

    +
    +
    Parameters:
    +
    +
    dist1Distribution

    The distribution to sample and then take the log of.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> dist_log(norm(0, 1), 10)
     <Distribution> log(norm(mean=0.5, sd=0.3), const(10))
     
    -
    @@ -880,30 +1059,28 @@

    Examples#squigglepy.distributions.dist_max(dist1, dist2=None)[source]#

    Initialize the calculation of the maximum value of two distributions.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution

    The distribution to sample and determine the max of.

    +
    +
    Parameters:
    +
    +
    dist1Distribution

    The distribution to sample and determine the max of.

    -
    dist2Distribution

    The second distribution to sample and determine the max of.

    +
    dist2Distribution

    The second distribution to sample and determine the max of.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated when it is sampled.

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> dist_max(norm(0, 1), norm(1, 2))
     <Distribution> max(norm(mean=0.5, sd=0.3), norm(mean=1.5, sd=0.3))
     
    -
    @@ -911,29 +1088,27 @@

    Examples#squigglepy.distributions.dist_min(dist1, dist2=None)[source]#

    Initialize the calculation of the minimum value of two distributions.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution

    The distribution to sample and determine the min of.

    +
    +
    Parameters:
    +
    +
    dist1Distribution

    The distribution to sample and determine the min of.

    -
    dist2Distribution

    The second distribution to sample and determine the min of.

    +
    dist2Distribution

    The second distribution to sample and determine the min of.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> dist_min(norm(0, 1), norm(1, 2))
     <Distribution> min(norm(mean=0.5, sd=0.3), norm(mean=1.5, sd=0.3))
     
    -
    @@ -941,111 +1116,109 @@

    Examples#squigglepy.distributions.dist_round(dist1, digits=0)[source]#

    Initialize the rounding of the output of the distribution.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution

    The distribution to sample and then round.

    +
    +
    Parameters:
    +
    +
    dist1Distribution

    The distribution to sample and then round.

    -
    digitsint

    The number of digits to round to.

    +
    digitsint

    The number of digits to round to.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> dist_round(norm(0, 1))
     <Distribution> round(norm(mean=0.5, sd=0.3), 0)
     
    -
    squigglepy.distributions.exponential(scale, lclip=None, rclip=None)[source]#

    Initialize an exponential distribution.

    -
    -

    Parameters#

    -
    -
    scalefloat

    The scale value of the exponential distribution (> 0)

    +
    +
    Parameters:
    +
    +
    scalefloat

    The scale value of the exponential distribution (> 0)

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    ExponentialDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    ExponentialDistribution
    +
    +
    +
    +

    Examples

    >>> exponential(1)
     <Distribution> exponential(1)
     
    -
    squigglepy.distributions.gamma(shape, scale=1, lclip=None, rclip=None)[source]#

    Initialize a gamma distribution.

    -
    -

    Parameters#

    -
    -
    shapefloat

    The shape value of the gamma distribution.

    +
    +
    Parameters:
    +
    +
    shapefloat

    The shape value of the gamma distribution.

    -
    scalefloat

    The scale value of the gamma distribution. Defaults to 1.

    +
    scalefloat

    The scale value of the gamma distribution. Defaults to 1.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    GammaDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    GammaDistribution
    +
    +
    +
    +

    Examples

    >>> gamma(10, 1)
     <Distribution> gamma(shape=10, scale=1)
     
    -
    squigglepy.distributions.geometric(p)[source]#

    Initialize a geometric distribution.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability of success of an individual trial. Must be between 0 and 1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability of success of an individual trial. Must be between 0 and 1.

    -
    -
    -

    Returns#

    -

    GeometricDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    GeometricDistribution
    +
    +
    +
    +

    Examples

    >>> geometric(0.1)
     <Distribution> geometric(0.1)
     
    -
    @@ -1053,28 +1226,28 @@

    Examples#squigglepy.distributions.inf0(p_zero, dist)[source]#

    Initialize an arbitrary zero-inflated distribution.

    Alias for zero_inflated.

    -
    -

    Parameters#

    -
    -
    p_zerofloat

    The chance of the distribution returning zero

    +
    +
    Parameters:
    +
    +
    p_zerofloat

    The chance of the distribution returning zero

    -
    distDistribution

    The distribution to sample from when not zero

    +
    distDistribution

    The distribution to sample from when not zero

    -
    -
    -

    Returns#

    -

    MixtureDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    MixtureDistribution
    +
    +
    +

    +

    Examples

    >>> inf0(0.6, norm(1, 2))
     <Distribution> mixture
      - 0
      - <Distribution> norm(mean=1.5, sd=0.3)
     
    -
    @@ -1082,30 +1255,28 @@

    Examples#squigglepy.distributions.lclip(dist1, val=None)[source]#

    Initialize the clipping/bounding of the output of the distribution by the lower value.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will +

    +
    Parameters:
    +
    +
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will be suitable for use in piping.

    -
    valint or float or None

    The value to use as the lower bound for clipping.

    +
    valint or float or None

    The value to use as the lower bound for clipping.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> lclip(norm(0, 1), 0.5)
     <Distribution> lclip(norm(mean=0.5, sd=0.3), 0.5)
     
    -
    @@ -1117,37 +1288,37 @@

    Examples#

    If x and y are not defined, can just return a classic t-distribution defined via t as the number of degrees of freedom, but in log-space.

    -
    -

    Parameters#

    -
    -
    xfloat or None

    The low value of a credible interval defined by credibility. Must be greater than 0. +

    +
    Parameters:
    +
    +
    xfloat or None

    The low value of a credible interval defined by credibility. Must be greater than 0. Defaults to a 90% CI.

    -
    yfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    yfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 1.

    +
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 1.

    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    +
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    LogTDistribution

    -
    -
    -

    Examples#

    + +
    Returns:
    +
    +
    LogTDistribution
    +
    +
    +

    +

    Examples

    >>> log_tdist(0, 1, 2)
     <Distribution> log_tdist(x=0, y=1, t=2)
     >>> log_tdist()
     <Distribution> log_tdist(t=1)
     
    -
    @@ -1156,38 +1327,39 @@

    Examples#

    Initialize a lognormal distribution.

    Can be defined either via a credible interval from x to y (use credibility or it will default to being a 90% CI) or defined via mean and sd.

    -
    -

    Parameters#

    -
    -
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI. +

    +
    Parameters:
    +
    +
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI. Must be a value greater than 0.

    -
    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI. +

    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI. Must be a value greater than 0.

    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90. Ignored if the distribution is +

    credibilityfloat

    The range of the credibility interval. Defaults to 90. Ignored if the distribution is defined instead by mean and sd.

    -
    norm_meanfloat or None

    The mean of the underlying normal distribution. If not defined, defaults to 0.

    +
    norm_meanfloat or None

    The mean of the underlying normal distribution. If not defined, defaults to 0.

    -
    norm_sdfloat

    The standard deviation of the underlying normal distribution.

    +
    norm_sdfloat

    The standard deviation of the underlying normal distribution.

    -
    lognorm_meanfloat or None

    The mean of the lognormal distribution. If not defined, defaults to 1.

    +
    lognorm_meanfloat or None

    The mean of the lognormal distribution. If not defined, defaults to 1.

    -
    lognorm_sdfloat

    The standard deviation of the lognormal distribution.

    +
    lognorm_sdfloat

    The standard deviation of the lognormal distribution.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    LognormalDistribution

    -
    -
    -

    Examples#

    + +
    Returns:
    +
    +
    LognormalDistribution
    +
    +
    +

    +

    Examples

    >>> lognorm(1, 10)
     <Distribution> lognorm(lognorm_mean=4.04, lognorm_sd=3.21, norm_mean=1.15, norm_sd=0.7)
     >>> lognorm(norm_mean=1, norm_sd=2)
    @@ -1196,35 +1368,35 @@ 

    Examples#<Distribution> lognorm(lognorm_mean=1, lognorm_sd=2, norm_mean=-0.8, norm_sd=1.27)

    -
    squigglepy.distributions.mixture(dists, weights=None, relative_weights=None, lclip=None, rclip=None)[source]#

    Initialize a mixture distribution, which is a combination of different distributions.

    -
    -

    Parameters#

    -
    -
    distslist or dict

    The distributions to mix. Can also be defined as a list of weights and distributions.

    +
    +
    Parameters:
    +
    +
    distslist or dict

    The distributions to mix. Can also be defined as a list of weights and distributions.

    -
    weightslist or None

    The weights for each distribution.

    +
    weightslist or None

    The weights for each distribution.

    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized +

    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized to sum to 1.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    MixtureDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    MixtureDistribution
    +
    +
    +
    +

    Examples

    >>> mixture([norm(1, 2), norm(3, 4)], weights=[0.1, 0.9])
     <Distribution> mixture
      - <Distribution> norm(mean=1.5, sd=0.3)
    @@ -1240,7 +1412,6 @@ 

    Examples# - <Distribution> norm(mean=3.5, sd=0.3)

    -
    @@ -1249,125 +1420,125 @@

    Examples#

    Initialize a normal distribution.

    Can be defined either via a credible interval from x to y (use credibility or it will default to being a 90% CI) or defined via mean and sd.

    -
    -

    Parameters#

    -
    -
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    +
    Parameters:
    +
    +
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90. Ignored if the distribution is +

    credibilityfloat

    The range of the credibility interval. Defaults to 90. Ignored if the distribution is defined instead by mean and sd.

    -
    meanfloat or None

    The mean of the normal distribution. If not defined, defaults to 0.

    +
    meanfloat or None

    The mean of the normal distribution. If not defined, defaults to 0.

    -
    sdfloat

    The standard deviation of the normal distribution.

    +
    sdfloat

    The standard deviation of the normal distribution.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    NormalDistribution

    -
    -
    -

    Examples#

    + +
    Returns:
    +
    +
    NormalDistribution
    +
    +
    +

    +

    Examples

    >>> norm(0, 1)
     <Distribution> norm(mean=0.5, sd=0.3)
     >>> norm(mean=1, sd=2)
     <Distribution> norm(mean=1, sd=2)
     
    -
    squigglepy.distributions.pareto(shape)[source]#

    Initialize a pareto distribution.

    -
    -

    Parameters#

    -
    -
    shapefloat

    The shape value of the pareto distribution.

    +
    +
    Parameters:
    +
    +
    shapefloat

    The shape value of the pareto distribution.

    -
    -
    -

    Returns#

    -

    ParetoDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    ParetoDistribution
    +
    +
    +
    +

    Examples

    >>> pareto(1)
     <Distribution> pareto(1)
     
    -
    squigglepy.distributions.pert(left, mode, right, lam=4, lclip=None, rclip=None)[source]#

    Initialize a PERT distribution.

    -
    -

    Parameters#

    -
    -
    leftfloat

    The smallest value of the PERT distribution.

    +
    +
    Parameters:
    +
    +
    leftfloat

    The smallest value of the PERT distribution.

    -
    modefloat

    The most common value of the PERT distribution.

    +
    modefloat

    The most common value of the PERT distribution.

    -
    rightfloat

    The largest value of the PERT distribution.

    +
    rightfloat

    The largest value of the PERT distribution.

    -
    lamfloat

    The lambda value of the PERT distribution. Defaults to 4.

    +
    lamfloat

    The lambda value of the PERT distribution. Defaults to 4.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    PERTDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    PERTDistribution
    +
    +
    +
    +

    Examples

    >>> pert(1, 2, 3)
     <Distribution> PERT(1, 2, 3)
     
    -
    squigglepy.distributions.poisson(lam, lclip=None, rclip=None)[source]#

    Initialize a poisson distribution.

    -
    -

    Parameters#

    -
    -
    lamfloat

    The lambda value of the poisson distribution.

    +
    +
    Parameters:
    +
    +
    lamfloat

    The lambda value of the poisson distribution.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    PoissonDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    PoissonDistribution
    +
    +
    +
    +

    Examples

    >>> poisson(1)
     <Distribution> poisson(1)
     
    -
    @@ -1375,30 +1546,28 @@

    Examples#squigglepy.distributions.rclip(dist1, val=None)[source]#

    Initialize the clipping/bounding of the output of the distribution by the upper value.

    The function won’t be applied until the distribution is sampled.

    -
    -

    Parameters#

    -
    -
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will +

    +
    Parameters:
    +
    +
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will be suitable for use in piping.

    -
    valint or float or None

    The value to use as the upper bound for clipping.

    +
    valint or float or None

    The value to use as the upper bound for clipping.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> rclip(norm(0, 1), 0.5)
     <Distribution> rclip(norm(mean=0.5, sd=0.3), 0.5)
     
    -
    @@ -1410,36 +1579,36 @@

    Examples#

    If x and y are not defined, can just return a classic t-distribution defined via t as the number of degrees of freedom.

    -
    -

    Parameters#

    -
    -
    xfloat or None

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    +
    Parameters:
    +
    +
    xfloat or None

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    yfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    yfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    +
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    +
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    TDistribution

    -
    -
    -

    Examples#

    + +
    Returns:
    +
    +
    TDistribution
    +
    +
    +

    +

    Examples

    >>> tdist(0, 1, 2)
     <Distribution> tdist(x=0, y=1, t=2)
     >>> tdist()
     <Distribution> tdist(t=1)
     
    -
    @@ -1450,116 +1619,116 @@

    Examples#

    The distribution will default to be a 90% credible interval between x and y unless credibility is passed.

    -
    -

    Parameters#

    -
    -
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    +
    Parameters:
    +
    +
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    +
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -

    Returns#

    -

    LognormalDistribution if x > 0, otherwise a NormalDistribution

    -
    -
    -

    Examples#

    + +
    Returns:
    +
    +
    LognormalDistribution if x > 0, otherwise a NormalDistribution
    +
    +
    +

    +

    Examples

    >>> to(1, 10)
     <Distribution> lognorm(mean=1.15, sd=0.7)
     >>> to(-10, 10)
     <Distribution> norm(mean=0.0, sd=6.08)
     
    -
    squigglepy.distributions.triangular(left, mode, right, lclip=None, rclip=None)[source]#

    Initialize a triangular distribution.

    -
    -

    Parameters#

    -
    -
    leftfloat

    The smallest value of the triangular distribution.

    +
    +
    Parameters:
    +
    +
    leftfloat

    The smallest value of the triangular distribution.

    -
    modefloat

    The most common value of the triangular distribution.

    +
    modefloat

    The most common value of the triangular distribution.

    -
    rightfloat

    The largest value of the triangular distribution.

    +
    rightfloat

    The largest value of the triangular distribution.

    -
    -
    -

    Returns#

    -

    TriangularDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    TriangularDistribution
    +
    +
    +
    +

    Examples

    >>> triangular(1, 2, 3)
     <Distribution> triangular(1, 2, 3)
     
    -
    squigglepy.distributions.uniform(x, y)[source]#

    Initialize a uniform random distribution.

    -
    -

    Parameters#

    -
    -
    xfloat

    The smallest value the uniform distribution will return.

    +
    +
    Parameters:
    +
    +
    xfloat

    The smallest value the uniform distribution will return.

    -
    yfloat

    The largest value the uniform distribution will return.

    +
    yfloat

    The largest value the uniform distribution will return.

    -
    -
    -

    Returns#

    -

    UniformDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    UniformDistribution
    +
    +
    +
    +

    Examples

    >>> uniform(0, 1)
     <Distribution> uniform(0, 1)
     
    -
    squigglepy.distributions.zero_inflated(p_zero, dist)[source]#

    Initialize an arbitrary zero-inflated distribution.

    -
    -

    Parameters#

    -
    -
    p_zerofloat

    The chance of the distribution returning zero

    +
    +
    Parameters:
    +
    +
    p_zerofloat

    The chance of the distribution returning zero

    -
    distDistribution

    The distribution to sample from when not zero

    +
    distDistribution

    The distribution to sample from when not zero

    -
    -
    -

    Returns#

    -

    MixtureDistribution

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    MixtureDistribution
    +
    +
    +
    +

    Examples

    >>> zero_inflated(0.6, norm(1, 2))
     <Distribution> mixture
      - 0
      - <Distribution> norm(mean=1.5, sd=0.3)
     
    - diff --git a/doc/build/html/reference/squigglepy.rng.html b/doc/build/html/reference/squigglepy.rng.html index 2827765..5399ed3 100644 --- a/doc/build/html/reference/squigglepy.rng.html +++ b/doc/build/html/reference/squigglepy.rng.html @@ -362,27 +362,25 @@ squigglepy.rng.set_seed(seed)[source]#

    Set the seed of the random number generator used by Squigglepy.

    The RNG is a np.random.default_rng under the hood.

    -
    -

    Parameters#

    -
    -
    seedfloat

    The seed to use for the RNG.

    +
    +
    Parameters:
    +
    +
    seedfloat

    The seed to use for the RNG.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    np.random.default_rng

    The RNG used internally.

    - -
    -

    Examples#

    +
    + +

    Examples

    >>> set_seed(42)
     Generator(PCG64) at 0x127EDE9E0
     
    - diff --git a/doc/build/html/reference/squigglepy.samplers.html b/doc/build/html/reference/squigglepy.samplers.html index ed8dd05..24cd126 100644 --- a/doc/build/html/reference/squigglepy.samplers.html +++ b/doc/build/html/reference/squigglepy.samplers.html @@ -361,160 +361,153 @@
    squigglepy.samplers.bernoulli_sample(p, samples=1)[source]#

    Sample 1 with probability p and 0 otherwise.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability of success. Must be between 0 and 1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability of success. Must be between 0 and 1.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    int

    Either 0 or 1

    - -
    -

    Examples#

    +
    + +

    Examples

    >>> set_seed(42)
     >>> bernoulli_sample(0.5)
     0
     
    -
    squigglepy.samplers.beta_sample(a, b, samples=1)[source]#

    Sample a random number according to a beta distribution.

    -
    -

    Parameters#

    -
    -
    afloat

    The alpha shape value of the distribution. Typically takes the value of the +

    +
    Parameters:
    +
    +
    afloat

    The alpha shape value of the distribution. Typically takes the value of the number of trials that resulted in a success.

    -
    bfloat

    The beta shape value of the distribution. Typically takes the value of the +

    bfloat

    The beta shape value of the distribution. Typically takes the value of the number of trials that resulted in a failure.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    A random number sampled from a beta distribution defined by a and b.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> beta_sample(1, 1)
     0.22145847498048798
     
    -
    squigglepy.samplers.binomial_sample(n, p, samples=1)[source]#

    Sample a random number according to a binomial distribution.

    -
    -

    Parameters#

    -
    -
    nint

    The number of trials.

    +
    +
    Parameters:
    +
    +
    nint

    The number of trials.

    -
    pfloat

    The probability of success for each trial. Must be between 0 and 1.

    +
    pfloat

    The probability of success for each trial. Must be between 0 and 1.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    int

    A random number sampled from a binomial distribution defined by n and p. The random number should be between 0 and n.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> binomial_sample(10, 0.1)
     2
     
    -
    squigglepy.samplers.chi_square_sample(df, samples=1)[source]#

    Sample a random number according to a chi-square distribution.

    -
    -

    Parameters#

    -
    -
    dffloat

    The number of degrees of freedom

    +
    +
    Parameters:
    +
    +
    dffloat

    The number of degrees of freedom

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    A random number sampled from a chi-square distribution.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> chi_square_sample(2)
     4.808417207931989
     
    -
    squigglepy.samplers.discrete_sample(items, samples=1, verbose=False, _multicore_tqdm_n=1, _multicore_tqdm_cores=1)[source]#

    Sample a random value from a discrete distribution (aka categorical distribution).

    -
    -

    Parameters#

    -
    -
    itemslist or dict

    The values that the discrete distribution will return and their associated +

    +
    Parameters:
    +
    +
    itemslist or dict

    The values that the discrete distribution will return and their associated weights (or likelihoods of being returned when sampled).

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    verbosebool

    If True, will print out statements on computational progress.

    +
    verbosebool

    If True, will print out statements on computational progress.

    -
    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only +

    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only be used internally by squigglepy to make the progress bar printing work well for multicore. This parameter can be safely ignored by the user.

    -
    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only +

    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only be used internally by squigglepy to make the progress bar printing work well for multicore. This parameter can be safely ignored by the user.

    -
    -
    -

    Returns#

    -

    Various, based on items in items

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    Various, based on items in items
    +
    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> # 10% chance of returning 0, 90% chance of returning 1
     >>> discrete_sample({0: 0.1, 1: 0.9})
    @@ -528,99 +521,92 @@ 

    Examples#'b'

    -
    squigglepy.samplers.exponential_sample(scale, samples=1)[source]#

    Sample a random number according to an exponential distribution.

    -
    -

    Parameters#

    -
    -
    scalefloat

    The scale value of the exponential distribution.

    +
    +
    Parameters:
    +
    +
    scalefloat

    The scale value of the exponential distribution.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    int

    A random number sampled from an exponential distribution.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> exponential_sample(10)
     24.042086039659946
     
    -
    squigglepy.samplers.gamma_sample(shape, scale, samples=1)[source]#

    Sample a random number according to a gamma distribution.

    -
    -

    Parameters#

    -
    -
    shapefloat

    The shape value of the gamma distribution.

    +
    +
    Parameters:
    +
    +
    shapefloat

    The shape value of the gamma distribution.

    -
    scalefloat

    The scale value of the gamma distribution. Defaults to 1.

    +
    scalefloat

    The scale value of the gamma distribution. Defaults to 1.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    int

    A random number sampled from an gamma distribution.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> gamma_sample(10, 2)
     21.290716894247602
     
    -
    squigglepy.samplers.geometric_sample(p, samples=1)[source]#

    Sample a random number according to a geometric distribution.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability of success of an individual trial. Must be between 0 and 1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability of success of an individual trial. Must be between 0 and 1.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    int

    A random number sampled from a geometric distribution.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> geometric_sample(0.1)
     2
     
    -
    @@ -633,107 +619,104 @@

    Examples#credibility. Unlike the normal and lognormal samplers, this credible interval is an approximation and is not precisely defined.

    -
    -

    Parameters#

    -
    -
    lowfloat or None

    The low value of a credible interval defined by credibility. +

    +
    Parameters:
    +
    +
    lowfloat or None

    The low value of a credible interval defined by credibility. Must be greater than 0. Defaults to a 90% CI.

    -
    highfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    highfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    +
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    +
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    -
    -

    Returns#

    -
    + +
    Returns:
    +
    float

    A random number sampled from a lognormal distribution defined by mean and sd.

    -
    -
    -

    Examples#

    + +

    +

    Examples

    >>> set_seed(42)
     >>> log_t_sample(1, 2, t=4)
     2.052949773846356
     
    -
    squigglepy.samplers.lognormal_sample(mean, sd, samples=1)[source]#

    Sample a random number according to a lognormal distribution.

    -
    -

    Parameters#

    -
    -
    meanfloat

    The mean of the lognormal distribution that is being sampled.

    +
    +
    Parameters:
    +
    +
    meanfloat

    The mean of the lognormal distribution that is being sampled.

    -
    sdfloat

    The standard deviation of the lognormal distribution that is being sampled.

    +
    sdfloat

    The standard deviation of the lognormal distribution that is being sampled.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    A random number sampled from a lognormal distribution defined by mean and sd.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> lognormal_sample(0, 1)
     1.3562412406168636
     
    -
    squigglepy.samplers.mixture_sample(values, weights=None, relative_weights=None, samples=1, verbose=False, _multicore_tqdm_n=1, _multicore_tqdm_cores=1)[source]#

    Sample a ranom number from a mixture distribution.

    -
    -

    Parameters#

    -
    -
    valueslist or dict

    The distributions to mix. Can also be defined as a list of weights and distributions.

    +
    +
    Parameters:
    +
    +
    valueslist or dict

    The distributions to mix. Can also be defined as a list of weights and distributions.

    -
    weightslist or None

    The weights for each distribution.

    +
    weightslist or None

    The weights for each distribution.

    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized +

    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized to sum to 1.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    verbosebool

    If True, will print out statements on computational progress.

    +
    verbosebool

    If True, will print out statements on computational progress.

    -
    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only +

    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only be used internally by squigglepy to make the progress bar printing work well for multicore. This parameter can be safely ignored by the user.

    -
    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only +

    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only be used internally by squigglepy to make the progress bar printing work well for multicore. This parameter can be safely ignored by the user.

    -
    -
    -

    Returns#

    -

    Various, based on items in values

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    Various, based on items in values
    +
    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> mixture_sample([norm(1, 2), norm(3, 4)], weights=[0.1, 0.9])
     3.183867278765718
    @@ -745,189 +728,181 @@ 

    Examples#1.1041655362137777

    -
    squigglepy.samplers.normal_sample(mean, sd, samples=1)[source]#

    Sample a random number according to a normal distribution.

    -
    -

    Parameters#

    -
    -
    meanfloat

    The mean of the normal distribution that is being sampled.

    +
    +
    Parameters:
    +
    +
    meanfloat

    The mean of the normal distribution that is being sampled.

    -
    sdfloat

    The standard deviation of the normal distribution that is being sampled.

    +
    sdfloat

    The standard deviation of the normal distribution that is being sampled.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    A random number sampled from a normal distribution defined by mean and sd.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> normal_sample(0, 1)
     0.30471707975443135
     
    -
    squigglepy.samplers.pareto_sample(shape, samples=1)[source]#

    Sample a random number according to a pareto distribution.

    -
    -

    Parameters#

    -
    -
    shapefloat

    The shape value of the pareto distribution.

    +
    +
    Parameters:
    +
    +
    shapefloat

    The shape value of the pareto distribution.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    int

    A random number sampled from an pareto distribution.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> pareto_sample(1)
     10.069666324736094
     
    -
    squigglepy.samplers.pert_sample(left, mode, right, lam, samples=1)[source]#

    Sample a random number according to a PERT distribution.

    -
    -

    Parameters#

    -
    -
    leftfloat

    The smallest value of the PERT distribution.

    +
    +
    Parameters:
    +
    +
    leftfloat

    The smallest value of the PERT distribution.

    -
    modefloat

    The most common value of the PERT distribution.

    +
    modefloat

    The most common value of the PERT distribution.

    -
    rightfloat

    The largest value of the PERT distribution.

    +
    rightfloat

    The largest value of the PERT distribution.

    -
    lamfloat

    The lambda of the PERT distribution.

    +
    lamfloat

    The lambda of the PERT distribution.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    A random number sampled from a PERT distribution.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> pert_sample(1, 2, 3, 4)
     2.327625176788963
     
    -
    squigglepy.samplers.poisson_sample(lam, samples=1)[source]#

    Sample a random number according to a poisson distribution.

    -
    -

    Parameters#

    -
    -
    lamfloat

    The lambda value of the poisson distribution.

    +
    +
    Parameters:
    +
    +
    lamfloat

    The lambda value of the poisson distribution.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    int

    A random number sampled from a poisson distribution.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> poisson_sample(10)
     13
     
    -
    squigglepy.samplers.sample(dist=None, n=1, lclip=None, rclip=None, memcache=False, reload_cache=False, dump_cache_file=None, load_cache_file=None, cache_file_primary=False, verbose=None, cores=1, _multicore_tqdm_n=1, _multicore_tqdm_cores=1, _correlate_if_needed=True)[source]#

    Sample random numbers from a given distribution.

    -
    -

    Parameters#

    -
    -
    distDistribution

    The distribution to sample random number from.

    +
    +
    Parameters:
    +
    +
    distDistribution

    The distribution to sample random number from.

    -
    nint

    The number of random numbers to sample from the distribution. Default to 1.

    +
    nint

    The number of random numbers to sample from the distribution. Default to 1.

    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    +
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    +
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    memcachebool

    If True, will attempt to load the results in-memory for future calculations if +

    memcachebool

    If True, will attempt to load the results in-memory for future calculations if a cache is present. Otherwise will save the results to an in-memory cache. Each cache will be matched based on dist. Default False.

    -
    reload_cachebool

    If True, any existing cache will be ignored and recalculated. Default False.

    +
    reload_cachebool

    If True, any existing cache will be ignored and recalculated. Default False.

    -
    dump_cache_filestr or None

    If present, will write out the cache to a numpy file with this path with +

    dump_cache_filestr or None

    If present, will write out the cache to a numpy file with this path with .sqlcache.npy appended to the file name.

    -
    load_cache_filestr or None

    If present, will first attempt to load and use a cache from a file with this +

    load_cache_filestr or None

    If present, will first attempt to load and use a cache from a file with this path with .sqlcache.npy appended to the file name.

    -
    cache_file_primarybool

    If both an in-memory cache and file cache are present, the file +

    cache_file_primarybool

    If both an in-memory cache and file cache are present, the file cache will be used for the cache if this is True, and the in-memory cache will be used otherwise. Defaults to False.

    -
    verbosebool

    If True, will print out statements on computational progress. If False, will not. +

    verbosebool

    If True, will print out statements on computational progress. If False, will not. If None (default), will be True when n is greater than or equal to 1M.

    -
    coresint

    If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing +

    coresint

    If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing pool with that many cores / processes.

    -
    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only +

    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only be used internally by squigglepy to make the progress bar printing work well for multicore. This parameter can be safely ignored by the user.

    -
    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only +

    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only be used internally by squigglepy to make the progress bar printing work well for multicore. This parameter can be safely ignored by the user.

    -
    -
    -

    Returns#

    -

    Various, based on dist.

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    Various, based on dist.
    +
    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> sample(norm(1, 2))
     1.592627415218455
    @@ -937,7 +912,6 @@ 

    Examples#array([6.10817361, 3. , 3. , 3.45828454, 3. ])

    -
    @@ -961,104 +935,98 @@

    Examples#credibility. Unlike the normal and lognormal samplers, this credible interval is an approximation and is not precisely defined.

    -
    -

    Parameters#

    -
    -
    lowfloat or None

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    +
    Parameters:
    +
    +
    lowfloat or None

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    highfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    +
    highfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    +
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    +
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    -
    -

    Returns#

    -
    + +
    Returns:
    +
    float

    A random number sampled from a lognormal distribution defined by mean and sd.

    -
    -
    -

    Examples#

    + +

    +

    Examples

    >>> set_seed(42)
     >>> t_sample(1, 2, t=4)
     2.7887113716855985
     
    -
    squigglepy.samplers.triangular_sample(left, mode, right, samples=1)[source]#

    Sample a random number according to a triangular distribution.

    -
    -

    Parameters#

    -
    -
    leftfloat

    The smallest value of the triangular distribution.

    +
    +
    Parameters:
    +
    +
    leftfloat

    The smallest value of the triangular distribution.

    -
    modefloat

    The most common value of the triangular distribution.

    +
    modefloat

    The most common value of the triangular distribution.

    -
    rightfloat

    The largest value of the triangular distribution.

    +
    rightfloat

    The largest value of the triangular distribution.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    A random number sampled from a triangular distribution.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> triangular_sample(1, 2, 3)
     2.327625176788963
     
    -
    squigglepy.samplers.uniform_sample(low, high, samples=1)[source]#

    Sample a random number according to a uniform distribution.

    -
    -

    Parameters#

    -
    -
    lowfloat

    The smallest value the uniform distribution will return.

    +
    +
    Parameters:
    +
    +
    lowfloat

    The smallest value the uniform distribution will return.

    -
    highfloat

    The largest value the uniform distribution will return.

    +
    highfloat

    The largest value the uniform distribution will return.

    -
    samplesint

    The number of samples to return.

    +
    samplesint

    The number of samples to return.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    A random number sampled from a uniform distribution between `low` and `high`.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> uniform_sample(0, 1)
     0.7739560485559633
     
    - diff --git a/doc/build/html/reference/squigglepy.utils.html b/doc/build/html/reference/squigglepy.utils.html index 37d8b94..b1bb86d 100644 --- a/doc/build/html/reference/squigglepy.utils.html +++ b/doc/build/html/reference/squigglepy.utils.html @@ -367,27 +367,25 @@ growth rate.

    NOTE: This only works works for numbers, arrays and distributions where all numbers are above 0. (Otherwise it makes no sense to talk about doubling times.)

    -
    -

    Parameters#

    -
    -
    doubling_timefloat or np.array or BaseDistribution

    The doubling time expressed in any time unit.

    +
    +
    Parameters:
    +
    +
    doubling_timefloat or np.array or BaseDistribution

    The doubling time expressed in any time unit.

    -
    -
    -

    Returns#

    -
    + +
    Returns:
    +
    float or np.array or ComplexDistribution

    Returns the growth rate expressed as a fraction (the percentage divided by 100).

    -
    -
    -

    Examples#

    + + +

    Examples

    >>> doubling_time_to_growth_rate(12)
     0.05946309435929531
     
    -
    @@ -395,25 +393,25 @@

    Examples squigglepy.utils.event(p)[source]#

    Return True with probability p and False with probability 1 - p.

    Alias for event_occurs.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability of returning True. Must be between 0 and 1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability of returning True. Must be between 0 and 1.

    -
    -
    -

    Returns#

    -

    bool

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    bool
    +
    +
    +

    +

    Examples

    >>> set_seed(42)
     >>> event(p=0.5)
     False
     
    -
    @@ -421,127 +419,120 @@

    Examples# squigglepy.utils.event_happens(p)[source]#

    Return True with probability p and False with probability 1 - p.

    Alias for event_occurs.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability of returning True. Must be between 0 and 1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability of returning True. Must be between 0 and 1.

    -
    -
    -

    Examples#

    +
    +

    +

    Examples

    >>> set_seed(42)
     >>> event_happens(p=0.5)
     False
     
    -
    squigglepy.utils.event_occurs(p)[source]#

    Return True with probability p and False with probability 1 - p.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability of returning True. Must be between 0 and 1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability of returning True. Must be between 0 and 1.

    -
    -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> event_occurs(p=0.5)
     False
     
    -
    squigglepy.utils.extremize(p, e)[source]#

    Extremize a prediction.

    -
    -

    Parameters#

    -
    -
    pfloat

    The prediction to extremize. Must be within 0-1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The prediction to extremize. Must be within 0-1.

    -
    efloat

    The extremization factor.

    +
    efloat

    The extremization factor.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    The extremized prediction

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> # Extremizing of 1.73 per https://arxiv.org/abs/2111.03153
     >>> extremize(p=0.7, e=1.73)
     0.875428191155692
     
    -
    squigglepy.utils.flip_coin(n=1)[source]#

    Flip a coin.

    -
    -

    Parameters#

    -
    -
    nint

    The number of coins to be flipped.

    +
    +
    Parameters:
    +
    +
    nint

    The number of coins to be flipped.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    str or list

    Returns the value of each coin flip, as either “heads” or “tails”

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> flip_coin()
     'heads'
     
    -
    squigglepy.utils.full_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0)[source]#

    Alias for kelly where deference is 0.

    -
    -

    Parameters#

    -
    -
    my_pricefloat

    The price (or probability) you give for the given event.

    +
    +
    Parameters:
    +
    +
    my_pricefloat

    The price (or probability) you give for the given event.

    -
    market_pricefloat

    The price the market is giving for that event.

    +
    market_pricefloat

    The price the market is giving for that event.

    -
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    +
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    -
    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for +

    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means ARR is not calculated.

    -
    currentfloat

    How much do you already have invested in this event? Used for calculating the +

    currentfloat

    How much do you already have invested in this event? Used for calculating the additional amount you should invest. Defaults to 0.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    dict
    A dict of values specifying:
    • my_price

    • @@ -568,9 +559,9 @@

      Returns#

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> full_kelly(my_price=0.7, market_price=0.4, bankroll=100)
     {'my_price': 0.7, 'market_price': 0.4, 'deference': 0, 'adj_price': 0.7,
      'delta_price': 0.3, 'adj_delta_price': 0.3, 'kelly': 0.5, 'target': 50.0,
    @@ -578,203 +569,194 @@ 

    Examples# 'expected_roi': 0.75, 'expected_arr': None, 'resolve_date': None}

    -
    squigglepy.utils.geomean(a, weights=None, relative_weights=None, drop_na=True)[source]#

    Calculate the geometric mean.

    -
    -

    Parameters#

    -
    -
    alist or np.array

    The values to calculate the geometric mean of.

    +
    +
    Parameters:
    +
    +
    alist or np.array

    The values to calculate the geometric mean of.

    -
    weightslist or None

    The weights, if a weighted geometric mean is desired.

    +
    weightslist or None

    The weights, if a weighted geometric mean is desired.

    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized +

    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized to sum to 1.

    -
    drop_naboolean

    Should NA-like values be dropped when calculating the geomean?

    +
    drop_naboolean

    Should NA-like values be dropped when calculating the geomean?

    -
    -
    -

    Returns#

    -

    float

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    float
    +
    +
    +
    +

    Examples

    >>> geomean([1, 3, 10])
     3.1072325059538595
     
    -
    squigglepy.utils.geomean_odds(a, weights=None, relative_weights=None, drop_na=True)[source]#

    Calculate the geometric mean of odds.

    -
    -

    Parameters#

    -
    -
    alist or np.array

    The probabilities to calculate the geometric mean of. These are converted to odds +

    +
    Parameters:
    +
    +
    alist or np.array

    The probabilities to calculate the geometric mean of. These are converted to odds before the geometric mean is taken..

    -
    weightslist or None

    The weights, if a weighted geometric mean is desired.

    +
    weightslist or None

    The weights, if a weighted geometric mean is desired.

    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized +

    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized to sum to 1.

    -
    drop_naboolean

    Should NA-like values be dropped when calculating the geomean?

    +
    drop_naboolean

    Should NA-like values be dropped when calculating the geomean?

    -
    -
    -

    Returns#

    -

    float

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    float
    +
    +
    +
    +

    Examples

    >>> geomean_odds([0.1, 0.3, 0.9])
     0.42985748800076845
     
    -
    squigglepy.utils.get_log_percentiles(data, percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], reverse=False, display=True, digits=1)[source]#

    Print the log (base 10) of the percentiles of the data.

    -
    -

    Parameters#

    -
    -
    datalist or np.array

    The data to calculate percentiles for.

    +
    +
    Parameters:
    +
    +
    datalist or np.array

    The data to calculate percentiles for.

    -
    percentileslist

    A list of percentiles to calculate. Must be values between 0 and 100.

    +
    percentileslist

    A list of percentiles to calculate. Must be values between 0 and 100.

    -
    reversebool

    If True, the percentile values are reversed (e.g., 95th and 5th percentile +

    reversebool

    If True, the percentile values are reversed (e.g., 95th and 5th percentile swap values.)

    -
    displaybool

    If True, the function returns an easy to read display.

    +
    displaybool

    If True, the function returns an easy to read display.

    -
    digitsint or None

    The number of digits to display (using rounding).

    +
    digitsint or None

    The number of digits to display (using rounding).

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    dict

    A dictionary of the given percentiles. If display is true, will be str values. Otherwise will be float values. 10 to the power of the value gives the true percentile.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> get_percentiles(range(100), percentiles=[25, 50, 75])
     {25: 24.75, 50: 49.5, 75: 74.25}
     
    -
    squigglepy.utils.get_mean_and_ci(data, credibility=90, digits=None)[source]#

    Return the mean and percentiles of the data.

    -
    -

    Parameters#

    -
    -
    datalist or np.array

    The data to calculate the mean and CI for.

    +
    +
    Parameters:
    +
    +
    datalist or np.array

    The data to calculate the mean and CI for.

    -
    credibilityfloat

    The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI.

    +
    credibilityfloat

    The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI.

    -
    digitsint or None

    The number of digits to display (using rounding).

    +
    digitsint or None

    The number of digits to display (using rounding).

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    dict

    A dictionary with the mean and CI.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> get_mean_and_ci(range(100))
     {'mean': 49.5, 'ci_low': 4.95, 'ci_high': 94.05}
     
    -
    squigglepy.utils.get_median_and_ci(data, credibility=90, digits=None)[source]#

    Return the median and percentiles of the data.

    -
    -

    Parameters#

    -
    -
    datalist or np.array

    The data to calculate the mean and CI for.

    +
    +
    Parameters:
    +
    +
    datalist or np.array

    The data to calculate the mean and CI for.

    -
    credibilityfloat

    The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI.

    +
    credibilityfloat

    The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI.

    -
    digitsint or None

    The number of digits to display (using rounding).

    +
    digitsint or None

    The number of digits to display (using rounding).

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    dict

    A dictionary with the median and CI.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> get_median_and_ci(range(100))
     {'mean': 49.5, 'ci_low': 4.95, 'ci_high': 94.05}
     
    -
    squigglepy.utils.get_percentiles(data, percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], reverse=False, digits=None)[source]#

    Print the percentiles of the data.

    -
    -

    Parameters#

    -
    -
    datalist or np.array

    The data to calculate percentiles for.

    +
    +
    Parameters:
    +
    +
    datalist or np.array

    The data to calculate percentiles for.

    -
    percentileslist

    A list of percentiles to calculate. Must be values between 0 and 100.

    +
    percentileslist

    A list of percentiles to calculate. Must be values between 0 and 100.

    -
    reversebool

    If True, the percentile values are reversed (e.g., 95th and 5th percentile +

    reversebool

    If True, the percentile values are reversed (e.g., 95th and 5th percentile swap values.)

    -
    digitsint or None

    The number of digits to display (using rounding).

    +
    digitsint or None

    The number of digits to display (using rounding).

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    dict

    A dictionary of the given percentiles.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> get_percentiles(range(100), percentiles=[25, 50, 75])
     {25: 24.75, 50: 49.5, 75: 74.25}
     
    -
    @@ -786,54 +768,51 @@

    Examples#

    NOTE: This only works works for numbers, arrays and distributions where all numbers are above 0. (Otherwise it makes no sense to talk about doubling times.)

    -
    -

    Parameters#

    -
    -
    growth_ratefloat or np.array or BaseDistribution

    The growth rate expressed as a fraction (the percentage divided by 100).

    +
    +
    Parameters:
    +
    +
    growth_ratefloat or np.array or BaseDistribution

    The growth rate expressed as a fraction (the percentage divided by 100).

    -
    -
    -

    Returns#

    -
    + +
    Returns:
    +
    float or np.array or ComplexDistribution

    Returns the doubling time.

    -
    -
    -

    Examples#

    + +

    +

    Examples

    >>> growth_rate_to_doubling_time(0.01)
     69.66071689357483
     
    -
    squigglepy.utils.half_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0)[source]#

    Alias for kelly where deference is 0.5.

    -
    -

    Parameters#

    -
    -
    my_pricefloat

    The price (or probability) you give for the given event.

    +
    +
    Parameters:
    +
    +
    my_pricefloat

    The price (or probability) you give for the given event.

    -
    market_pricefloat

    The price the market is giving for that event.

    +
    market_pricefloat

    The price the market is giving for that event.

    -
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    +
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    -
    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for +

    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means ARR is not calculated.

    -
    currentfloat

    How much do you already have invested in this event? Used for calculating the +

    currentfloat

    How much do you already have invested in this event? Used for calculating the additional amount you should invest. Defaults to 0.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    dict
    A dict of values specifying:
    • my_price

    • @@ -860,9 +839,9 @@

      Returns#

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> half_kelly(my_price=0.7, market_price=0.4, bankroll=100)
     {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.5, 'adj_price': 0.55,
      'delta_price': 0.3, 'adj_delta_price': 0.15, 'kelly': 0.25, 'target': 25.0,
    @@ -870,7 +849,6 @@ 

    Examples# 'expected_roi': 0.375, 'expected_arr': None, 'resolve_date': None}

    -
    @@ -882,29 +860,27 @@

    Examples# squigglepy.utils.is_dist(obj)[source]#

    Test if a given object is a Squigglepy distribution.

    -
    -

    Parameters#

    -
    -
    objobject

    The object to test.

    +
    +
    Parameters:
    +
    +
    objobject

    The object to test.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    bool

    True, if the object is a distribution. False if not.

    - -
    -

    Examples#

    +
    +

    +

    Examples

    >>> is_dist(norm(0, 1))
     True
     >>> is_dist(0)
     False
     
    -
    @@ -913,22 +889,21 @@

    Examples#

    Test if a given object can be sampled from.

    This includes distributions, integers, floats, None, strings, and callables.

    -
    -

    Parameters#

    -
    -
    objobject

    The object to test.

    +
    +
    Parameters:
    +
    +
    objobject

    The object to test.

    -
    -
    -

    Returns#

    -
    + +
    Returns:
    +
    bool

    True, if the object can be sampled from. False if not.

    -
    -
    -

    Examples#

    + +

    +

    Examples

    >>> is_sampleable(norm(0, 1))
     True
     >>> is_sampleable(0)
    @@ -937,37 +912,35 @@ 

    Examples#False

    -
    squigglepy.utils.kelly(my_price, market_price, deference=0, bankroll=1, resolve_date=None, current=0)[source]#

    Calculate the Kelly criterion.

    -
    -

    Parameters#

    -
    -
    my_pricefloat

    The price (or probability) you give for the given event.

    +
    +
    Parameters:
    +
    +
    my_pricefloat

    The price (or probability) you give for the given event.

    -
    market_pricefloat

    The price the market is giving for that event.

    +
    market_pricefloat

    The price the market is giving for that event.

    -
    deferencefloat

    How much deference (or weight) do you give the market price? Use 0.5 for half Kelly +

    deferencefloat

    How much deference (or weight) do you give the market price? Use 0.5 for half Kelly and 0.75 for quarter Kelly. Defaults to 0, which is full Kelly.

    -
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    +
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    -
    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for +

    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means ARR is not calculated.

    -
    currentfloat

    How much do you already have invested in this event? Used for calculating the +

    currentfloat

    How much do you already have invested in this event? Used for calculating the additional amount you should invest. Defaults to 0.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    dict
    A dict of values specifying:
    • my_price

    • @@ -994,9 +967,9 @@

      Returns#

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> kelly(my_price=0.7, market_price=0.4, deference=0.5, bankroll=100)
     {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.5, 'adj_price': 0.55,
      'delta_price': 0.3, 'adj_delta_price': 0.15, 'kelly': 0.25, 'target': 25.0,
    @@ -1004,7 +977,6 @@ 

    Examples# 'expected_roi': 0.375, 'expected_arr': None, 'resolve_date': None}

    -
    @@ -1013,36 +985,35 @@

    Examples#

    Return probability of success on next trial given Laplace’s law of succession.

    Also can be used to calculate a time-invariant version defined in https://www.lesswrong.com/posts/wE7SK8w8AixqknArs/a-time-invariant-version-of-laplace-s-rule

    -
    -

    Parameters#

    -
    -
    sint

    The number of successes among n past trials or among time_passed amount of time.

    +
    +
    Parameters:
    +
    +
    sint

    The number of successes among n past trials or among time_passed amount of time.

    -
    nint or None

    The number of trials that contain the successes (and/or failures). Leave as None if +

    nint or None

    The number of trials that contain the successes (and/or failures). Leave as None if time-invariant mode is desired.

    -
    time_passedfloat or None

    The amount of time that has passed when the successes (and/or failures) occured for +

    time_passedfloat or None

    The amount of time that has passed when the successes (and/or failures) occured for calculating a time-invariant Laplace.

    -
    time_remainingfloat or None

    We are calculating the likelihood of observing at least one success over this time +

    time_remainingfloat or None

    We are calculating the likelihood of observing at least one success over this time period.

    -
    time_fixedbool

    This should be False if the time period is variable - that is, if the time period +

    time_fixedbool

    This should be False if the time period is variable - that is, if the time period was chosen specifically to include the most recent success. Otherwise the time period is fixed and this should be True. Defaults to False.

    -
    -
    -

    Returns#

    -
    + +
    Returns:
    +
    float

    The probability of at least one success in the next trial or time_remaining amount of time.

    -
    -
    -

    Examples#

    + +

    +

    Examples

    >>> # The sun has risen the past 100,000 days. What are the odds it rises again tomorrow?
     >>> laplace(s=100*K, n=100*K)
     0.999990000199996
    @@ -1052,144 +1023,136 @@ 

    Examples#0.012820512820512664

    -
    squigglepy.utils.normalize(lst)[source]#

    Normalize a list to sum to 1.

    -
    -

    Parameters#

    -
    -
    lstlist

    The list to normalize.

    +
    +
    Parameters:
    +
    +
    lstlist

    The list to normalize.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    list

    A list where each value is normalized such that the list sums to 1.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> normalize([0.1, 0.2, 0.2])
     [0.2, 0.4, 0.4]
     
    -
    squigglepy.utils.odds_to_p(odds)[source]#

    Calculate the probability from given decimal odds.

    -
    -

    Parameters#

    -
    -
    oddsfloat

    The decimal odds to calculate the probability for.

    +
    +
    Parameters:
    +
    +
    oddsfloat

    The decimal odds to calculate the probability for.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    Probability

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> odds_to_p(0.1)
     0.09090909090909091
     
    -
    squigglepy.utils.one_in(p, digits=0, verbose=True)[source]#

    Convert a probability into “1 in X” notation.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability to convert.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability to convert.

    -
    digitsint

    The number of digits to round the result to. Defaults to 0. If digits +

    digitsint

    The number of digits to round the result to. Defaults to 0. If digits is 0, the result will be converted to int instead of float.

    -
    verboselogical

    If True, will return a string with “1 in X”. If False, will just return X.

    +
    verboselogical

    If True, will return a string with “1 in X”. If False, will just return X.

    -
    -
    -

    Returns#

    -

    str if verbose is True. Otherwise, int if digits is 0 or float if digits > 0.

    -
    -
    -

    Examples#

    +
    +
    Returns:
    +
    +
    str if verbose is True. Otherwise, int if digits is 0 or float if digits > 0.
    +
    +
    +
    +

    Examples

    >>> one_in(0.1)
     "1 in 10"
     
    -
    squigglepy.utils.p_to_odds(p)[source]#

    Calculate the decimal odds from a given probability.

    -
    -

    Parameters#

    -
    -
    pfloat

    The probability to calculate decimal odds for. Must be between 0 and 1.

    +
    +
    Parameters:
    +
    +
    pfloat

    The probability to calculate decimal odds for. Must be between 0 and 1.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    float

    Decimal odds

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> p_to_odds(0.1)
     0.1111111111111111
     
    -
    squigglepy.utils.quarter_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0)[source]#

    Alias for kelly where deference is 0.75.

    -
    -

    Parameters#

    -
    -
    my_pricefloat

    The price (or probability) you give for the given event.

    +
    +
    Parameters:
    +
    +
    my_pricefloat

    The price (or probability) you give for the given event.

    -
    market_pricefloat

    The price the market is giving for that event.

    +
    market_pricefloat

    The price the market is giving for that event.

    -
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    +
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    -
    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for +

    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means ARR is not calculated.

    -
    currentfloat

    How much do you already have invested in this event? Used for calculating the +

    currentfloat

    How much do you already have invested in this event? Used for calculating the additional amount you should invest. Defaults to 0.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    dict
    A dict of values specifying:
    • my_price

    • @@ -1216,9 +1179,9 @@

      Returns#

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> quarter_kelly(my_price=0.7, market_price=0.4, bankroll=100)
     {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.75, 'adj_price': 0.48,
      'delta_price': 0.3, 'adj_delta_price': 0.08, 'kelly': 0.125, 'target': 12.5,
    @@ -1226,37 +1189,34 @@ 

    Examples# 'expected_roi': 0.188, 'expected_arr': None, 'resolve_date': None}

    -
    squigglepy.utils.roll_die(sides, n=1)[source]#

    Roll a die.

    -
    -

    Parameters#

    -
    -
    sidesint

    The number of sides of the die that is rolled.

    +
    +
    Parameters:
    +
    +
    sidesint

    The number of sides of the die that is rolled.

    -
    nint

    The number of dice to be rolled.

    +
    nint

    The number of dice to be rolled.

    -
    -
    -

    Returns#

    -
    +
    +
    Returns:
    +
    int or list

    Returns the value of each die roll.

    - -
    -

    Examples#

    +
    +
    +

    Examples

    >>> set_seed(42)
     >>> roll_die(6)
     5
     
    - diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js index 8cb21c2..49ba701 100644 --- a/doc/build/html/searchindex.js +++ b/doc/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index", "installation", "reference/modules", "reference/squigglepy", "reference/squigglepy.bayes", "reference/squigglepy.correlation", "reference/squigglepy.distributions", "reference/squigglepy.numbers", "reference/squigglepy.rng", "reference/squigglepy.samplers", "reference/squigglepy.utils", "reference/squigglepy.version", "usage"], "filenames": ["index.rst", "installation.rst", "reference/modules.rst", "reference/squigglepy.rst", "reference/squigglepy.bayes.rst", "reference/squigglepy.correlation.rst", "reference/squigglepy.distributions.rst", "reference/squigglepy.numbers.rst", "reference/squigglepy.rng.rst", "reference/squigglepy.samplers.rst", "reference/squigglepy.utils.rst", "reference/squigglepy.version.rst", "usage.rst"], "titles": ["Squigglepy: Implementation of Squiggle in Python", "Installation", "squigglepy", "squigglepy package", "squigglepy.bayes module", "squigglepy.correlation module", "squigglepy.distributions module", "squigglepy.numbers module", "squigglepy.rng module", "squigglepy.samplers module", "squigglepy.utils module", "squigglepy.version module", "Examples"], "terms": {"index": [], "modul": [2, 3], "search": [], "page": [], "i": [0, 4, 5, 6, 8, 9, 10, 12], "simpl": 0, "program": 0, "languag": 0, "intuit": 0, "probabilist": 0, "estim": 0, "It": [0, 9], "serv": 0, "its": 0, "own": [0, 12], "standalon": 0, "syntax": 0, "javascript": 0, "like": [0, 10], "intend": [0, 5], "us": [0, 1, 4, 5, 6, 8, 9, 10, 12], "frequent": 0, "also": [0, 1, 5, 6, 9, 10, 12], "sometim": 0, "want": [0, 4, 5, 12], "similar": 0, "function": [0, 4, 6, 10, 12], "especi": 0, "alongsid": [0, 9], "other": [0, 4, 9, 10, 12], "statist": 0, "packag": [0, 2, 5, 12], "numpi": [0, 9, 10, 12], "panda": 0, "matplotlib": [0, 12], "The": [0, 4, 5, 6, 8, 9, 10, 12], "here": [0, 12], "mani": [0, 4, 9], "pip": 1, "For": [1, 12], "plot": [1, 3, 6, 12], "support": [0, 1, 4], "you": [0, 1, 4, 5, 6, 9, 10, 12], "can": [0, 1, 5, 6, 9, 10, 12], "extra": 1, "": [0, 5, 6, 9, 10, 12], "from": [4, 5, 6, 9, 10, 12], "doc": 12, "import": 12, "sq": [4, 5, 6, 12], "np": [4, 5, 8, 10, 12], "pyplot": 12, "plt": 12, "number": [2, 3, 4, 5, 6, 8, 9, 10, 12], "k": [10, 12], "m": [4, 5, 12], "pprint": 12, "pop_of_ny_2022": 12, "8": [4, 6, 10, 12], "1": [4, 5, 6, 9, 10, 12], "4": [6, 9, 10, 12], "thi": [0, 4, 5, 6, 9, 10, 12], "mean": [4, 6, 9, 10, 12], "re": 12, "90": [6, 9, 10, 12], "confid": 12, "valu": [6, 9, 10, 12], "between": [0, 5, 6, 9, 10, 12], "million": 12, "pct_of_pop_w_piano": 12, "0": [4, 5, 6, 9, 10, 12], "2": [4, 5, 6, 9, 10, 12], "01": [4, 10, 12], "we": [4, 5, 10, 12], "assum": 12, "ar": [4, 5, 6, 9, 10, 12], "almost": 12, "peopl": 12, "multipl": 12, "pianos_per_piano_tun": 12, "50": [4, 10, 12], "piano_tuners_per_piano": 12, "total_tuners_in_2022": 12, "sampl": [0, 2, 3, 4, 5, 6, 9, 10, 12], "1000": [5, 6, 12], "note": [5, 10, 12], "shorthand": [0, 12], "get": [10, 12], "sd": [4, 6, 9, 12], "print": [4, 5, 9, 10, 12], "format": [10, 12], "round": [6, 10, 12], "std": 12, "percentil": [10, 12], "get_percentil": [2, 3, 10, 12], "digit": [6, 10, 12], "histogram": [6, 12], "hist": 12, "bin": [6, 12], "200": [6, 12], "show": 12, "shorter": 12, "And": 12, "version": [0, 2, 3, 10, 12], "incorpor": 12, "time": [10, 12], "def": [4, 6, 12], "pop_at_tim": 12, "t": [6, 9, 12], "year": [10, 12], "after": 12, "2022": 12, "avg_yearly_pct_chang": 12, "05": [5, 6, 10, 12], "expect": [10, 12], "nyc": 12, "continu": 12, "grow": 12, "an": [0, 4, 5, 6, 9, 10, 12], "roughli": 12, "per": [10, 12], "return": 12, "total_tuners_at_tim": 12, "total": [4, 9, 12], "2030": 12, "warn": 12, "Be": 12, "care": 12, "about": [10, 12], "divid": [10, 12], "etc": 12, "500": 12, "instead": [6, 10, 12], "outcom": 12, "count": 12, "norm": [2, 3, 4, 6, 9, 10, 12], "3": [4, 6, 9, 10, 12], "onli": [4, 5, 9, 10, 12], "two": [4, 5, 6, 12], "multipli": 12, "normal": [2, 3, 4, 6, 9, 10, 12], "interv": [6, 9, 10, 12], "too": 12, "one": [4, 10, 12], "than": [4, 6, 9, 10, 12], "100": [5, 10, 12], "longhand": 12, "n": [4, 5, 6, 9, 10, 12], "nice": 12, "progress": [4, 9, 12], "report": [0, 12], "verbos": [4, 9, 10, 12], "true": [4, 6, 9, 10, 12], "exist": [4, 9, 12], "lognorm": [2, 3, 6, 9, 12], "10": [6, 9, 10, 12], "tdist": [2, 3, 6, 12], "5": [4, 5, 6, 9, 10, 12], "triangular": [2, 3, 6, 9, 12], "pert": [2, 3, 6, 9, 12], "lam": [6, 9, 12], "binomi": [2, 3, 6, 9, 12], "p": [4, 6, 9, 10, 12], "beta": [2, 3, 4, 5, 6, 9, 12], "b": [6, 9, 12], "bernoulli": [2, 3, 4, 6, 12], "poisson": [2, 3, 6, 9, 12], "chisquar": [2, 3, 6, 12], "gamma": [2, 3, 5, 6, 9, 12], "pareto": [2, 3, 6, 9, 12], "exponenti": [2, 3, 6, 9, 12], "scale": [6, 9, 12], "geometr": [2, 3, 6, 9, 10, 12], "discret": [2, 3, 5, 6, 9, 12], "9": [4, 6, 9, 10, 12], "integ": [10, 12], "15": [6, 10, 12], "altern": 12, "object": [5, 10, 12], "No": 12, "weight": [4, 6, 9, 10, 12], "equal": [6, 9, 12], "mix": [6, 9, 12], "togeth": 12, "mixtur": [2, 3, 4, 6, 9, 12], "These": [10, 12], "each": [4, 5, 6, 9, 10, 12], "equival": [4, 12], "abov": [10, 12], "just": [4, 6, 10, 12], "differ": [6, 9, 10, 12], "wai": [5, 12], "do": [4, 6, 9, 10, 12], "notat": [6, 9, 10, 12], "make": [4, 9, 10, 12], "zero": [6, 12], "inflat": [6, 12], "60": [10, 12], "chanc": [6, 9, 12], "40": [10, 12], "zero_infl": [2, 3, 6, 12], "6": [4, 5, 6, 9, 10, 12], "add": [6, 12], "subtract": 12, "math": [0, 12], "chang": [0, 9, 12], "ci": [6, 9, 10, 12], "default": [4, 5, 6, 9, 10, 12], "80": [4, 5, 10, 12], "credibl": [6, 9, 10, 12], "clip": [2, 3, 6, 12], "lclip": [2, 3, 6, 9, 12], "rclip": [2, 3, 6, 9, 12], "anyth": [6, 12], "lower": [6, 12], "higher": 12, "pipe": [6, 12], "correl": [2, 3, 9, 12], "uniform": [2, 3, 6, 9, 12], "even": 12, "pass": [4, 5, 6, 10, 12], "your": [10, 12], "matrix": [5, 12], "how": [4, 10, 12], "build": 12, "tool": 12, "roll_di": [2, 3, 10, 12], "side": [10, 12], "list": [4, 5, 6, 9, 10, 12], "rang": [6, 9, 10, 12], "els": [4, 12], "none": [4, 5, 6, 9, 10, 12], "alreadi": [10, 12], "includ": [4, 5, 10, 12], "standard": [6, 9, 12], "util": [2, 3, 12], "women": 12, "ag": 12, "forti": 12, "who": 12, "particip": 12, "routin": 12, "screen": 12, "have": [4, 6, 9, 10, 12], "breast": 12, "cancer": [4, 12], "posit": [4, 5, 6, 10, 12], "mammographi": [4, 12], "without": [4, 12], "woman": 12, "group": [5, 9, 12], "had": 12, "what": [4, 6, 10, 12], "probabl": [4, 6, 9, 10, 12], "she": 12, "actual": 12, "ha": [5, 6, 10, 12], "approxim": [5, 6, 9, 12], "answer": [4, 12], "network": [4, 12], "reject": [4, 12], "bay": [2, 3, 12], "has_canc": [4, 12], "event": [2, 3, 4, 6, 10, 12], "096": [4, 12], "define_ev": [4, 12], "bayesnet": [2, 3, 4, 12], "find": [4, 12], "lambda": [4, 6, 9, 12], "e": [4, 10, 12], "conditional_on": [4, 12], "07723995880535531": [4, 12], "Or": [5, 12], "inform": [10, 12], "immedi": 12, "hand": 12, "directli": [5, 12], "calcul": [4, 6, 9, 10, 12], "though": 12, "doesn": 12, "work": [5, 9, 10, 12], "veri": [5, 12], "stuff": 12, "simple_bay": [2, 3, 4, 12], "prior": [4, 10, 12], "likelihood_h": [4, 12], "likelihood_not_h": [4, 12], "07763975155279504": [4, 12], "updat": [2, 3, 4, 12], "them": [4, 5, 6, 12], "prior_sampl": 12, "evid": [4, 12], "evidence_sampl": 12, "posterior": [4, 12], "posterior_sampl": 12, "averag": [2, 3, 4, 12], "average_sampl": 12, "artifici": 12, "intellig": 12, "section": 12, "hous": 12, "system": 12, "against": 12, "burglari": 12, "live": 12, "seismic": 12, "activ": 12, "area": 12, "occasion": 12, "set": [5, 6, 8, 10, 12], "off": 12, "earthquak": 12, "neighbor": 12, "mari": 12, "john": 12, "know": [4, 12], "If": [4, 5, 6, 9, 10, 12], "thei": [0, 12], "hear": 12, "call": [4, 12], "guarante": 12, "particular": 12, "dai": [10, 12], "go": 12, "95": [10, 12], "both": [4, 9, 12], "94": [10, 12], "29": [4, 12], "noth": 12, "fals": [4, 9, 10, 12], "when": [4, 6, 9, 10, 12], "goe": 12, "But": [6, 12], "sai": 12, "hi": 12, "70": [10, 12], "p_alarm_goes_off": 12, "elif": 12, "001": 12, "p_john_cal": 12, "alarm_goes_off": 12, "p_mary_cal": 12, "7": [5, 6, 10, 12], "burglary_happen": 12, "earthquake_happen": 12, "002": 12, "john_cal": 12, "mary_cal": 12, "happen": [6, 9, 10, 12], "result": [4, 5, 6, 9, 10, 12], "19": 12, "vari": 12, "becaus": [9, 12], "base": [4, 5, 6, 9, 10, 12], "random": [6, 8, 9, 12], "mai": [0, 5, 12], "take": [4, 6, 9, 12], "minut": 12, "been": [5, 12], "27": [6, 12], "quickli": 12, "built": [6, 12], "cach": [4, 9, 12], "reload_cach": [4, 9, 12], "recalcul": [4, 9, 12], "amount": [10, 12], "analysi": 12, "pretti": 12, "limit": 12, "consid": [10, 12], "sorobn": 12, "pomegran": 12, "bnlearn": 12, "pymc": 12, "monte_hal": 12, "door_pick": 12, "switch": 12, "door": 12, "c": 12, "car_is_behind_door": 12, "reveal_door": 12, "d": 12, "old_door_pick": 12, "won_car": 12, "won": [6, 12], "r": 12, "win": [10, 12], "int": [4, 5, 6, 9, 10, 12], "66": 12, "34": 12, "imagin": 12, "flip": [10, 12], "head": [10, 12], "out": [4, 9, 12], "my": 12, "blue": 12, "bag": 12, "tail": [10, 12], "red": 12, "contain": [10, 12], "20": [6, 9, 10, 12], "took": 12, "flip_coin": [2, 3, 10, 12], "me": [0, 12], "12306": 12, "which": [0, 4, 6, 9, 10, 12], "close": [5, 12], "correct": 12, "12292": 12, "gener": [4, 8, 12], "combin": [6, 12], "bankrol": [10, 12], "determin": [6, 12], "size": 12, "criterion": [10, 12], "ve": [10, 12], "price": [10, 12], "question": 12, "market": [10, 12], "resolv": [10, 12], "favor": 12, "see": 12, "65": [5, 12], "willing": 12, "should": [4, 6, 9, 10, 12], "follow": 12, "kelly_data": 12, "my_pric": [10, 12], "market_pric": [10, 12], "fraction": [10, 12], "143": 12, "target": [10, 12], "much": [4, 10, 12], "monei": [10, 12], "invest": [10, 12], "142": 12, "86": 12, "expected_roi": [10, 12], "roi": 12, "077": 12, "action": 12, "black": 12, "ruff": 12, "check": [5, 12], "pytest": 12, "pip3": 12, "python3": 12, "integr": 12, "py": 12, "unoffici": 0, "myself": [], "rethink": 0, "prioriti": 0, "affili": 0, "associ": [0, 6, 9], "quantifi": 0, "uncertainti": 0, "research": 0, "institut": 0, "maintain": 0, "new": 0, "yet": [0, 4], "stabl": 0, "product": 0, "so": [0, 10], "encount": 0, "bug": 0, "error": 0, "pleas": 0, "those": 0, "fix": [0, 10], "possibl": 0, "futur": [0, 4, 9], "introduc": 0, "break": 0, "avail": 0, "under": [0, 8], "mit": 0, "licens": 0, "primari": 0, "author": 0, "peter": 0, "wildeford": 0, "agust\u00edn": 0, "covarrubia": 0, "bernardo": 0, "baron": 0, "contribut": 0, "sever": 0, "kei": 0, "develop": 0, "thank": 0, "ozzi": 0, "gooen": 0, "creat": 0, "origin": [0, 5], "dawn": 0, "drescher": 0, "help": 0, "come": 0, "up": 0, "idea": 0, "well": [0, 9], "featur": 0, "start": 4, "readm": [], "subpackag": [], "submodul": 2, "distribut": [0, 2, 3, 4, 5, 9, 10], "rng": [2, 3], "sampler": [2, 3], "content": [], "test": [10, 12], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "correlationgroup": [2, 3, 5], "correlated_dist": [3, 5], "correlation_matrix": [3, 5], "correlation_toler": [3, 5], "has_sufficient_sample_divers": [3, 5], "induce_correl": [3, 5], "min_unique_sampl": [3, 5], "basedistribut": [2, 3, 6, 9, 10], "bernoullidistribut": [2, 3, 6], "betadistribut": [2, 3, 6], "binomialdistribut": [2, 3, 6], "categoricaldistribut": [2, 3, 6], "chisquaredistribut": [2, 3, 6], "complexdistribut": [2, 3, 6, 10], "compositedistribut": [2, 3, 6], "constantdistribut": [2, 3, 6], "continuousdistribut": [2, 3, 6], "discretedistribut": [2, 3, 6], "exponentialdistribut": [2, 3, 6], "gammadistribut": [2, 3, 6], "geometricdistribut": [2, 3, 6], "logtdistribut": [2, 3, 6], "lognormaldistribut": [2, 3, 6], "mixturedistribut": [2, 3, 6], "normaldistribut": [2, 3, 6], "operabledistribut": [2, 3, 5, 6], "pertdistribut": [2, 3, 6], "paretodistribut": [2, 3, 6], "poissondistribut": [2, 3, 6], "tdistribut": [2, 3, 6], "triangulardistribut": [2, 3, 6], "uniformdistribut": [2, 3, 6], "const": [2, 3, 6], "dist_ceil": [2, 3, 6], "dist_exp": [2, 3, 6], "dist_floor": [2, 3, 6], "dist_fn": [2, 3, 6], "dist_log": [2, 3, 6], "dist_max": [2, 3, 6], "dist_min": [2, 3, 6], "dist_round": [2, 3, 6], "inf0": [2, 3, 6], "log_tdist": [2, 3, 6], "set_se": [2, 3, 8, 9, 10], "bernoulli_sampl": [2, 3, 9], "beta_sampl": [2, 3, 9], "binomial_sampl": [2, 3, 9], "chi_square_sampl": [2, 3, 9], "discrete_sampl": [2, 3, 9], "exponential_sampl": [2, 3, 9], "gamma_sampl": [2, 3, 9], "geometric_sampl": [2, 3, 9], "log_t_sampl": [2, 3, 9], "lognormal_sampl": [2, 3, 9], "mixture_sampl": [2, 3, 9], "normal_sampl": [2, 3, 9], "pareto_sampl": [2, 3, 9], "pert_sampl": [2, 3, 9], "poisson_sampl": [2, 3, 9], "sample_correlated_group": [2, 3, 9], "t_sampl": [2, 3, 9], "triangular_sampl": [2, 3, 9], "uniform_sampl": [2, 3, 9], "doubling_time_to_growth_r": [2, 3, 10], "event_happen": [2, 3, 10], "event_occur": [2, 3, 10], "extrem": [2, 3, 5, 10], "full_kelli": [2, 3, 10], "geomean": [2, 3, 10], "geomean_odd": [2, 3, 10], "get_log_percentil": [2, 3, 10], "get_mean_and_ci": [2, 3, 10], "get_median_and_ci": [2, 3, 10], "growth_rate_to_doubling_tim": [2, 3, 10], "half_kelli": [2, 3, 10], "is_continuous_dist": [2, 3, 10], "is_dist": [2, 3, 10], "is_sampl": [2, 3, 10], "kelli": [0, 2, 3, 10], "laplac": [2, 3, 10], "odds_to_p": [2, 3, 10], "one_in": [2, 3, 10], "p_to_odd": [2, 3, 10], "quarter_kelli": [2, 3, 10], "relative_weight": [4, 6, 9, 10], "sourc": [4, 5, 6, 8, 9, 10], "arrai": [4, 5, 9, 10], "float": [4, 5, 6, 8, 9, 10], "put": 4, "versu": 4, "infer": [0, 4], "sum": [4, 6, 9, 10], "rel": [4, 6, 9, 10], "given": [4, 6, 9, 10], "A": [4, 6, 9, 10], "accord": [4, 5, 9], "event_fn": 4, "reduce_fn": 4, "raw": 4, "memcach": [4, 9], "memcache_load": 4, "memcache_sav": 4, "dump_cache_fil": [4, 9], "load_cache_fil": [4, 9], "cache_file_primari": [4, 9], "core": [4, 9], "bayesian": [0, 4], "allow": 4, "condit": 4, "custom": [4, 6], "defin": [4, 5, 6, 9, 10], "all": [4, 5, 6, 9, 10], "simul": 4, "aggreg": 4, "final": 4, "bool": [4, 5, 9, 10], "memori": [4, 9], "match": [4, 5, 9], "load": [4, 9], "save": [4, 9], "ani": [4, 5, 6, 9, 10], "ignor": [4, 6, 9], "str": [4, 6, 9, 10], "present": [4, 9], "write": [4, 9], "binari": [4, 6, 9], "file": [4, 9], "path": [4, 9], "sqlcach": [4, 9], "append": [4, 9], "name": [4, 6, 9], "first": [4, 9], "attempt": [4, 9], "otherwis": [4, 6, 9, 10], "statement": [4, 9], "comput": [4, 9], "run": [4, 9, 12], "singl": [4, 9], "process": [4, 9], "greater": [4, 6, 9], "multiprocess": [4, 9], "pool": [4, 9], "variou": [4, 9], "likelihood": [4, 6, 9, 10], "rate": [4, 10], "rule": [4, 10], "h": 4, "hypothesi": 4, "aka": [4, 6, 9], "evidence_weight": 4, "perform": 4, "produc": [4, 5], "current": [4, 10], "must": [4, 5, 6, 9, 10], "either": [4, 6, 9, 10], "type": 4, "matter": [4, 6], "where": [4, 5, 9, 10], "53": 4, "implement": [5, 12], "iman": 5, "conov": 5, "method": 5, "induc": 5, "some": 5, "code": 5, "adapt": 5, "abraham": 5, "lee": 5, "mcerp": 5, "tisimst": 5, "class": [5, 6], "tupl": 5, "ndarrai": [5, 9], "float64": [5, 9], "hold": 5, "metadata": 5, "user": [5, 9], "rather": 5, "dure": 5, "dtype": [5, 9], "relative_threshold": 5, "absolute_threshold": 5, "suffici": 5, "uniqu": 5, "data": [5, 10], "column": 5, "wise": 5, "dataset": 5, "2d": 5, "independ": 5, "variabl": [5, 9, 10], "correspond": 5, "corrmat": 5, "desir": [5, 6, 10], "coeffici": 5, "symmetr": 5, "definit": 5, "order": 5, "new_data": 5, "toler": 5, "_min_unique_sampl": 5, "rank": 5, "emploi": 5, "while": 5, "preserv": 5, "margin": 5, "best": 5, "effort": 5, "basi": 5, "fail": 5, "depend": 5, "provid": 5, "except": 5, "rais": 5, "case": [5, 6], "abl": 5, "enough": 5, "shuffl": 5, "notabl": 5, "hard": 5, "common": [5, 6, 9], "few": 5, "spearman": 5, "semi": 5, "confus": 5, "covari": 5, "exclus": 5, "same": [5, 6, 9, 10], "option": 5, "overrid": 5, "absolut": [5, 10], "disabl": 5, "correlated_vari": 5, "input": 5, "suppos": 5, "solar_radi": 5, "temperatur": 5, "300": 5, "22": 5, "28": [5, 10], "corrcoef": 5, "6975960649767123": 5, "could": [5, 6], "funding_gap": 5, "cost_per_deliveri": 5, "effect_s": 5, "20_000": 5, "80_000": 5, "30": [5, 10], "580520": 5, "480149": 5, "580962": 5, "187831": 5, "abc": 6, "item": [6, 9], "df": [6, 9], "left": [6, 9], "right": [6, 9], "fn": 6, "fn_str": 6, "infix": 6, "x": [6, 10], "shape": [6, 9], "y": 6, "norm_mean": 6, "norm_sd": 6, "lognorm_mean": 6, "lognorm_sd": 6, "dist": [6, 9], "num_sampl": 6, "draw": 6, "mode": [6, 9, 10], "initi": 6, "alpha": [6, 9], "typic": [6, 9], "trial": [6, 9, 10], "success": [6, 9, 10], "failur": [6, 9, 10], "chi": [6, 9], "squar": [6, 9], "degre": [6, 9], "freedom": [6, 9], "chiaquar": 6, "dist1": 6, "bound": 6, "output": 6, "appli": 6, "until": 6, "funciton": 6, "partial": 6, "suitabl": 6, "upper": 6, "lazi": 6, "evalu": 6, "constant": 6, "alwai": 6, "categor": [6, 9], "dict": [6, 9, 10], "being": [6, 9], "thing": [6, 9], "ceil": 6, "exp": 6, "floor": 6, "dist2": 6, "second": 6, "argument": 6, "By": 6, "__name__": 6, "doubl": [6, 10], "718281828459045": 6, "log": [6, 9, 10], "maximum": 6, "max": 6, "minimum": 6, "min": 6, "below": [6, 9], "coerc": [6, 9], "individu": [6, 9], "p_zero": 6, "arbitrari": 6, "alia": [6, 10], "val": 6, "space": [6, 9], "via": [6, 9], "loos": [6, 9], "unlik": [6, 9], "precis": [6, 9], "classic": 6, "low": [6, 9], "high": [6, 9], "underli": 6, "deviat": [6, 9], "04": 6, "21": [6, 9], "09": 6, "147": 6, "smallest": [6, 9], "most": [6, 9, 10], "largest": [6, 9], "unless": [6, 9], "less": 6, "becom": 6, "08": [6, 10], "seed": 8, "default_rng": 8, "hood": 8, "intern": [8, 9], "42": [8, 9, 10], "pcg64": 8, "0x127ede9e0": 8, "22145847498048798": 9, "808417207931989": 9, "_multicore_tqdm_n": 9, "_multicore_tqdm_cor": 9, "tqdm": 9, "interfac": 9, "meant": 9, "bar": 9, "multicor": 9, "safe": 9, "24": [9, 10], "042086039659946": 9, "290716894247602": 9, "addition": 9, "052949773846356": 9, "3562412406168636": 9, "ranom": 9, "183867278765718": 9, "7859113725925972": 9, "1041655362137777": 9, "30471707975443135": 9, "069666324736094": 9, "327625176788963": 9, "13": [9, 10], "_correlate_if_need": 9, "npy": 9, "1m": 9, "592627415218455": 9, "7281209657534462": 9, "10817361": 9, "45828454": 9, "requested_dist": 9, "store": 9, "themselv": 9, "_correlated_sampl": 9, "necessari": 9, "need": 9, "onc": [9, 10], "regardless": 9, "tree": 9, "oper": [6, 9], "7887113716855985": 9, "7739560485559633": 9, "doubling_tim": 10, "convert": 10, "growth": 10, "express": 10, "unit": 10, "g": 10, "remain": 10, "got": 10, "annual": 10, "sens": 10, "talk": 10, "percentag": 10, "12": 10, "05946309435929531": 10, "predict": 10, "within": 10, "factor": 10, "73": 10, "http": 10, "arxiv": 10, "org": 10, "ab": 10, "2111": 10, "03153": 10, "875428191155692": 10, "coin": 10, "resolve_d": 10, "defer": 10, "give": 10, "bet": [0, 10], "back": 10, "arr": 10, "yyyi": 10, "mm": 10, "dd": 10, "addit": [0, 10], "specifi": 10, "adj_pric": 10, "adjust": 10, "taken": 10, "account": 10, "delta_pric": 10, "adj_delta_pric": 10, "indic": 10, "delta": 10, "max_gain": 10, "would": 10, "gain": 10, "modeled_gain": 10, "expected_arr": 10, "125": 10, "72": 10, "75": 10, "drop_na": 10, "boolean": 10, "na": 10, "drop": 10, "1072325059538595": 10, "odd": 10, "befor": 10, "42985748800076845": 10, "99": 10, "revers": 10, "displai": 10, "95th": 10, "5th": 10, "swap": 10, "easi": 10, "read": 10, "dictionari": 10, "power": 10, "25": 10, "49": 10, "74": 10, "ci_low": 10, "ci_high": 10, "median": 10, "growth_rat": 10, "69": 10, "66071689357483": 10, "55": 10, "62": 10, "23": 10, "375": 10, "obj": 10, "string": 10, "callabl": 10, "half": 10, "quarter": 10, "full": 10, "time_pass": 10, "time_remain": 10, "time_fix": 10, "next": 10, "law": 10, "invari": 10, "www": 10, "lesswrong": 10, "com": 10, "post": 10, "we7sk8w8aixqknar": 10, "among": 10, "past": 10, "leav": 10, "occur": 10, "observ": 10, "least": 10, "over": 10, "period": 10, "wa": 10, "chosen": 10, "specif": 10, "recent": 10, "sun": 10, "risen": 10, "000": 10, "rise": 10, "again": 10, "tomorrow": 10, "999990000199996": 10, "last": 10, "nuke": 10, "war": 10, "77": 10, "ago": 10, "naiv": 10, "012820512820512664": 10, "lst": 10, "decim": 10, "09090909090909091": 10, "logic": 10, "1111111111111111": 10, "48": 10, "31": 10, "188": 10, "roll": 10, "die": 10, "dice": 10, "collect": 6, "squigglepi": [1, 12], "squiggl": 12, "python": 12, "api": 0, "refer": 0, "exampl": 0, "piano": 0, "tuner": 0, "more": 0, "instal": [0, 12], "usag": 0, "disclaim": [], "acknowledg": [], "alarm": [], "net": [], "demonstr": [], "monti": [], "hall": [], "problem": [], "complex": [], "interact": []}, "objects": {"": [[3, 0, 0, "-", "squigglepy"]], "squigglepy": [[4, 0, 0, "-", "bayes"], [5, 0, 0, "-", "correlation"], [6, 0, 0, "-", "distributions"], [7, 0, 0, "-", "numbers"], [8, 0, 0, "-", "rng"], [9, 0, 0, "-", "samplers"], [10, 0, 0, "-", "utils"], [11, 0, 0, "-", "version"]], "squigglepy.bayes": [[4, 1, 1, "", "average"], [4, 1, 1, "", "bayesnet"], [4, 1, 1, "", "simple_bayes"], [4, 1, 1, "", "update"]], "squigglepy.correlation": [[5, 2, 1, "", "CorrelationGroup"], [5, 1, 1, "", "correlate"]], "squigglepy.correlation.CorrelationGroup": [[5, 3, 1, "", "correlated_dists"], [5, 3, 1, "", "correlation_matrix"], [5, 3, 1, "", "correlation_tolerance"], [5, 4, 1, "", "has_sufficient_sample_diversity"], [5, 4, 1, "", "induce_correlation"], [5, 3, 1, "", "min_unique_samples"]], "squigglepy.distributions": [[6, 2, 1, "", "BaseDistribution"], [6, 2, 1, "", "BernoulliDistribution"], [6, 2, 1, "", "BetaDistribution"], [6, 2, 1, "", "BinomialDistribution"], [6, 2, 1, "", "CategoricalDistribution"], [6, 2, 1, "", "ChiSquareDistribution"], [6, 2, 1, "", "ComplexDistribution"], [6, 2, 1, "", "CompositeDistribution"], [6, 2, 1, "", "ConstantDistribution"], [6, 2, 1, "", "ContinuousDistribution"], [6, 2, 1, "", "DiscreteDistribution"], [6, 2, 1, "", "ExponentialDistribution"], [6, 2, 1, "", "GammaDistribution"], [6, 2, 1, "", "GeometricDistribution"], [6, 2, 1, "", "LogTDistribution"], [6, 2, 1, "", "LognormalDistribution"], [6, 2, 1, "", "MixtureDistribution"], [6, 2, 1, "", "NormalDistribution"], [6, 2, 1, "", "OperableDistribution"], [6, 2, 1, "", "PERTDistribution"], [6, 2, 1, "", "ParetoDistribution"], [6, 2, 1, "", "PoissonDistribution"], [6, 2, 1, "", "TDistribution"], [6, 2, 1, "", "TriangularDistribution"], [6, 2, 1, "", "UniformDistribution"], [6, 1, 1, "", "bernoulli"], [6, 1, 1, "", "beta"], [6, 1, 1, "", "binomial"], [6, 1, 1, "", "chisquare"], [6, 1, 1, "", "clip"], [6, 1, 1, "", "const"], [6, 1, 1, "", "discrete"], [6, 1, 1, "", "dist_ceil"], [6, 1, 1, "", "dist_exp"], [6, 1, 1, "", "dist_floor"], [6, 1, 1, "", "dist_fn"], [6, 1, 1, "", "dist_log"], [6, 1, 1, "", "dist_max"], [6, 1, 1, "", "dist_min"], [6, 1, 1, "", "dist_round"], [6, 1, 1, "", "exponential"], [6, 1, 1, "", "gamma"], [6, 1, 1, "", "geometric"], [6, 1, 1, "", "inf0"], [6, 1, 1, "", "lclip"], [6, 1, 1, "", "log_tdist"], [6, 1, 1, "", "lognorm"], [6, 1, 1, "", "mixture"], [6, 1, 1, "", "norm"], [6, 1, 1, "", "pareto"], [6, 1, 1, "", "pert"], [6, 1, 1, "", "poisson"], [6, 1, 1, "", "rclip"], [6, 1, 1, "", "tdist"], [6, 1, 1, "", "to"], [6, 1, 1, "", "triangular"], [6, 1, 1, "", "uniform"], [6, 1, 1, "", "zero_inflated"]], "squigglepy.distributions.OperableDistribution": [[6, 4, 1, "", "plot"]], "squigglepy.rng": [[8, 1, 1, "", "set_seed"]], "squigglepy.samplers": [[9, 1, 1, "", "bernoulli_sample"], [9, 1, 1, "", "beta_sample"], [9, 1, 1, "", "binomial_sample"], [9, 1, 1, "", "chi_square_sample"], [9, 1, 1, "", "discrete_sample"], [9, 1, 1, "", "exponential_sample"], [9, 1, 1, "", "gamma_sample"], [9, 1, 1, "", "geometric_sample"], [9, 1, 1, "", "log_t_sample"], [9, 1, 1, "", "lognormal_sample"], [9, 1, 1, "", "mixture_sample"], [9, 1, 1, "", "normal_sample"], [9, 1, 1, "", "pareto_sample"], [9, 1, 1, "", "pert_sample"], [9, 1, 1, "", "poisson_sample"], [9, 1, 1, "", "sample"], [9, 1, 1, "", "sample_correlated_group"], [9, 1, 1, "", "t_sample"], [9, 1, 1, "", "triangular_sample"], [9, 1, 1, "", "uniform_sample"]], "squigglepy.utils": [[10, 1, 1, "", "doubling_time_to_growth_rate"], [10, 1, 1, "", "event"], [10, 1, 1, "", "event_happens"], [10, 1, 1, "", "event_occurs"], [10, 1, 1, "", "extremize"], [10, 1, 1, "", "flip_coin"], [10, 1, 1, "", "full_kelly"], [10, 1, 1, "", "geomean"], [10, 1, 1, "", "geomean_odds"], [10, 1, 1, "", "get_log_percentiles"], [10, 1, 1, "", "get_mean_and_ci"], [10, 1, 1, "", "get_median_and_ci"], [10, 1, 1, "", "get_percentiles"], [10, 1, 1, "", "growth_rate_to_doubling_time"], [10, 1, 1, "", "half_kelly"], [10, 1, 1, "", "is_continuous_dist"], [10, 1, 1, "", "is_dist"], [10, 1, 1, "", "is_sampleable"], [10, 1, 1, "", "kelly"], [10, 1, 1, "", "laplace"], [10, 1, 1, "", "normalize"], [10, 1, 1, "", "odds_to_p"], [10, 1, 1, "", "one_in"], [10, 1, 1, "", "p_to_odds"], [10, 1, 1, "", "quarter_kelly"], [10, 1, 1, "", "roll_die"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "method", "Python method"]}, "titleterms": {"welcom": [], "squigglepi": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "": [], "document": [], "indic": [], "tabl": [], "implement": 0, "squiggl": 0, "python": 0, "instal": 1, "usag": [], "piano": 12, "tuner": 12, "exampl": [4, 5, 6, 8, 9, 10, 12], "distribut": [6, 12], "addit": 12, "featur": 12, "roll": 12, "die": 12, "bayesian": 12, "infer": 12, "alarm": 12, "net": 12, "A": 12, "demonstr": 12, "monti": 12, "hall": 12, "problem": 12, "more": 12, "complex": 12, "coin": 12, "dice": 12, "interact": 12, "kelli": 12, "bet": 12, "run": [], "test": [], "disclaim": 0, "acknowledg": 0, "packag": 3, "subpackag": [], "modul": [4, 5, 6, 7, 8, 9, 10, 11], "content": 0, "submodul": 3, "bay": 4, "correl": 5, "number": 7, "rng": 8, "sampler": 9, "util": 10, "version": 11, "integr": [], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "paramet": [4, 5, 6, 8, 9, 10], "return": [4, 5, 6, 8, 9, 10], "api": [], "refer": []}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Squigglepy: Implementation of Squiggle in Python": [[0, "squigglepy-implementation-of-squiggle-in-python"]], "Contents": [[0, null]], "Disclaimers": [[0, "disclaimers"]], "Acknowledgements": [[0, "acknowledgements"]], "Installation": [[1, "installation"]], "squigglepy": [[2, "squigglepy"]], "squigglepy.bayes module": [[4, "module-squigglepy.bayes"]], "Parameters": [[4, "parameters"], [4, "id1"], [4, "id4"], [4, "id7"], [5, "parameters"], [5, "id1"], [8, "parameters"], [6, "parameters"], [6, "id1"], [6, "id3"], [6, "id6"], [6, "id9"], [6, "id12"], [6, "id15"], [6, "id18"], [6, "id21"], [6, "id24"], [6, "id27"], [6, "id30"], [6, "id33"], [6, "id36"], [6, "id39"], [6, "id42"], [6, "id45"], [6, "id48"], [6, "id51"], [6, "id54"], [6, "id57"], [6, "id60"], [6, "id63"], [6, "id66"], [6, "id69"], [6, "id72"], [6, "id75"], [6, "id78"], [6, "id81"], [6, "id84"], [6, "id87"], [6, "id90"], [6, "id93"], [6, "id96"], [9, "parameters"], [9, "id1"], [9, "id4"], [9, "id7"], [9, "id10"], [9, "id13"], [9, "id16"], [9, "id19"], [9, "id22"], [9, "id25"], [9, "id28"], [9, "id31"], [9, "id34"], [9, "id37"], [9, "id40"], [9, "id43"], [9, "id46"], [9, "id49"], [9, "id52"], [10, "parameters"], [10, "id1"], [10, "id4"], [10, "id6"], [10, "id8"], [10, "id11"], [10, "id14"], [10, "id17"], [10, "id20"], [10, "id23"], [10, "id26"], [10, "id29"], [10, "id32"], [10, "id35"], [10, "id38"], [10, "id41"], [10, "id44"], [10, "id47"], [10, "id50"], [10, "id53"], [10, "id56"], [10, "id59"], [10, "id62"], [10, "id65"], [10, "id68"]], "Returns": [[4, "returns"], [4, "id2"], [4, "id5"], [4, "id8"], [5, "returns"], [5, "id2"], [8, "returns"], [6, "returns"], [6, "id4"], [6, "id7"], [6, "id10"], [6, "id13"], [6, "id16"], [6, "id19"], [6, "id22"], [6, "id25"], [6, "id28"], [6, "id31"], [6, "id34"], [6, "id37"], [6, "id40"], [6, "id43"], [6, "id46"], [6, "id49"], [6, "id52"], [6, "id55"], [6, "id58"], [6, "id61"], [6, "id64"], [6, "id67"], [6, "id70"], [6, "id73"], [6, "id76"], [6, "id79"], [6, "id82"], [6, "id85"], [6, "id88"], [6, "id91"], [6, "id94"], [6, "id97"], [9, "returns"], [9, "id2"], [9, "id5"], [9, "id8"], [9, "id11"], [9, "id14"], [9, "id17"], [9, "id20"], [9, "id23"], [9, "id26"], [9, "id29"], [9, "id32"], [9, "id35"], [9, "id38"], [9, "id41"], [9, "id44"], [9, "id47"], [9, "id50"], [9, "id53"], [10, "returns"], [10, "id2"], [10, "id9"], [10, "id12"], [10, "id15"], [10, "id18"], [10, "id21"], [10, "id24"], [10, "id27"], [10, "id30"], [10, "id33"], [10, "id36"], [10, "id39"], [10, "id42"], [10, "id45"], [10, "id48"], [10, "id51"], [10, "id54"], [10, "id57"], [10, "id60"], [10, "id63"], [10, "id66"], [10, "id69"]], "Examples": [[4, "examples"], [4, "id3"], [4, "id6"], [4, "id9"], [5, "examples"], [8, "examples"], [12, "examples"], [6, "examples"], [6, "id2"], [6, "id5"], [6, "id8"], [6, "id11"], [6, "id14"], [6, "id17"], [6, "id20"], [6, "id23"], [6, "id26"], [6, "id29"], [6, "id32"], [6, "id35"], [6, "id38"], [6, "id41"], [6, "id44"], [6, "id47"], [6, "id50"], [6, "id53"], [6, "id56"], [6, "id59"], [6, "id62"], [6, "id65"], [6, "id68"], [6, "id71"], [6, "id74"], [6, "id77"], [6, "id80"], [6, "id83"], [6, "id86"], [6, "id89"], [6, "id92"], [6, "id95"], [6, "id98"], [9, "examples"], [9, "id3"], [9, "id6"], [9, "id9"], [9, "id12"], [9, "id15"], [9, "id18"], [9, "id21"], [9, "id24"], [9, "id27"], [9, "id30"], [9, "id33"], [9, "id36"], [9, "id39"], [9, "id42"], [9, "id45"], [9, "id48"], [9, "id51"], [9, "id54"], [10, "examples"], [10, "id3"], [10, "id5"], [10, "id7"], [10, "id10"], [10, "id13"], [10, "id16"], [10, "id19"], [10, "id22"], [10, "id25"], [10, "id28"], [10, "id31"], [10, "id34"], [10, "id37"], [10, "id40"], [10, "id43"], [10, "id46"], [10, "id49"], [10, "id52"], [10, "id55"], [10, "id58"], [10, "id61"], [10, "id64"], [10, "id67"], [10, "id70"]], "squigglepy.correlation module": [[5, "module-squigglepy.correlation"]], "squigglepy.numbers module": [[7, "module-squigglepy.numbers"]], "squigglepy.rng module": [[8, "module-squigglepy.rng"]], "squigglepy.version module": [[11, "module-squigglepy.version"]], "Piano tuners example": [[12, "piano-tuners-example"]], "Distributions": [[12, "distributions"]], "Additional features": [[12, "additional-features"]], "Example: Rolling a die": [[12, "example-rolling-a-die"]], "Bayesian inference": [[12, "bayesian-inference"]], "Example: Alarm net": [[12, "example-alarm-net"]], "Example: A demonstration of the Monty Hall Problem": [[12, "example-a-demonstration-of-the-monty-hall-problem"]], "Example: More complex coin/dice interactions": [[12, "example-more-complex-coin-dice-interactions"]], "Kelly betting": [[12, "kelly-betting"]], "More examples": [[12, "more-examples"]], "squigglepy package": [[3, "module-squigglepy"]], "Submodules": [[3, "submodules"]], "squigglepy.distributions module": [[6, "module-squigglepy.distributions"]], "squigglepy.samplers module": [[9, "module-squigglepy.samplers"]], "squigglepy.utils module": [[10, "module-squigglepy.utils"]]}, "indexentries": {"module": [[3, "module-squigglepy"], [6, "module-squigglepy.distributions"], [9, "module-squigglepy.samplers"], [10, "module-squigglepy.utils"]], "squigglepy": [[3, "module-squigglepy"]], "basedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BaseDistribution"]], "bernoullidistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BernoulliDistribution"]], "betadistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BetaDistribution"]], "binomialdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BinomialDistribution"]], "categoricaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.CategoricalDistribution"]], "chisquaredistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ChiSquareDistribution"]], "complexdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ComplexDistribution"]], "compositedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.CompositeDistribution"]], "constantdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ConstantDistribution"]], "continuousdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ContinuousDistribution"]], "discretedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.DiscreteDistribution"]], "exponentialdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ExponentialDistribution"]], "gammadistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.GammaDistribution"]], "geometricdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.GeometricDistribution"]], "logtdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.LogTDistribution"]], "lognormaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.LognormalDistribution"]], "mixturedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.MixtureDistribution"]], "normaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.NormalDistribution"]], "operabledistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.OperableDistribution"]], "pertdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.PERTDistribution"]], "paretodistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ParetoDistribution"]], "poissondistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.PoissonDistribution"]], "tdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.TDistribution"]], "triangulardistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.TriangularDistribution"]], "uniformdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.UniformDistribution"]], "bernoulli() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.bernoulli"]], "beta() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.beta"]], "binomial() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.binomial"]], "chisquare() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.chisquare"]], "clip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.clip"]], "const() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.const"]], "discrete() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.discrete"]], "dist_ceil() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_ceil"]], "dist_exp() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_exp"]], "dist_floor() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_floor"]], "dist_fn() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_fn"]], "dist_log() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_log"]], "dist_max() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_max"]], "dist_min() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_min"]], "dist_round() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_round"]], "exponential() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.exponential"]], "gamma() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.gamma"]], "geometric() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.geometric"]], "inf0() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.inf0"]], "lclip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.lclip"]], "log_tdist() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.log_tdist"]], "lognorm() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.lognorm"]], "mixture() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.mixture"]], "norm() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.norm"]], "pareto() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.pareto"]], "pert() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.pert"]], "plot() (squigglepy.distributions.operabledistribution method)": [[6, "squigglepy.distributions.OperableDistribution.plot"]], "poisson() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.poisson"]], "rclip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.rclip"]], "squigglepy.distributions": [[6, "module-squigglepy.distributions"]], "tdist() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.tdist"]], "to() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.to"]], "triangular() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.triangular"]], "uniform() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.uniform"]], "zero_inflated() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.zero_inflated"]], "bernoulli_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.bernoulli_sample"]], "beta_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.beta_sample"]], "binomial_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.binomial_sample"]], "chi_square_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.chi_square_sample"]], "discrete_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.discrete_sample"]], "exponential_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.exponential_sample"]], "gamma_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.gamma_sample"]], "geometric_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.geometric_sample"]], "log_t_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.log_t_sample"]], "lognormal_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.lognormal_sample"]], "mixture_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.mixture_sample"]], "normal_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.normal_sample"]], "pareto_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.pareto_sample"]], "pert_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.pert_sample"]], "poisson_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.poisson_sample"]], "sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.sample"]], "sample_correlated_group() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.sample_correlated_group"]], "squigglepy.samplers": [[9, "module-squigglepy.samplers"]], "t_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.t_sample"]], "triangular_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.triangular_sample"]], "uniform_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.uniform_sample"]], "doubling_time_to_growth_rate() (in module squigglepy.utils)": [[10, "squigglepy.utils.doubling_time_to_growth_rate"]], "event() (in module squigglepy.utils)": [[10, "squigglepy.utils.event"]], "event_happens() (in module squigglepy.utils)": [[10, "squigglepy.utils.event_happens"]], "event_occurs() (in module squigglepy.utils)": [[10, "squigglepy.utils.event_occurs"]], "extremize() (in module squigglepy.utils)": [[10, "squigglepy.utils.extremize"]], "flip_coin() (in module squigglepy.utils)": [[10, "squigglepy.utils.flip_coin"]], "full_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.full_kelly"]], "geomean() (in module squigglepy.utils)": [[10, "squigglepy.utils.geomean"]], "geomean_odds() (in module squigglepy.utils)": [[10, "squigglepy.utils.geomean_odds"]], "get_log_percentiles() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_log_percentiles"]], "get_mean_and_ci() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_mean_and_ci"]], "get_median_and_ci() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_median_and_ci"]], "get_percentiles() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_percentiles"]], "growth_rate_to_doubling_time() (in module squigglepy.utils)": [[10, "squigglepy.utils.growth_rate_to_doubling_time"]], "half_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.half_kelly"]], "is_continuous_dist() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_continuous_dist"]], "is_dist() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_dist"]], "is_sampleable() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_sampleable"]], "kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.kelly"]], "laplace() (in module squigglepy.utils)": [[10, "squigglepy.utils.laplace"]], "normalize() (in module squigglepy.utils)": [[10, "squigglepy.utils.normalize"]], "odds_to_p() (in module squigglepy.utils)": [[10, "squigglepy.utils.odds_to_p"]], "one_in() (in module squigglepy.utils)": [[10, "squigglepy.utils.one_in"]], "p_to_odds() (in module squigglepy.utils)": [[10, "squigglepy.utils.p_to_odds"]], "quarter_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.quarter_kelly"]], "roll_die() (in module squigglepy.utils)": [[10, "squigglepy.utils.roll_die"]], "squigglepy.utils": [[10, "module-squigglepy.utils"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["index", "installation", "reference/modules", "reference/squigglepy", "reference/squigglepy.bayes", "reference/squigglepy.correlation", "reference/squigglepy.distributions", "reference/squigglepy.numbers", "reference/squigglepy.rng", "reference/squigglepy.samplers", "reference/squigglepy.utils", "reference/squigglepy.version", "usage"], "filenames": ["index.rst", "installation.rst", "reference/modules.rst", "reference/squigglepy.rst", "reference/squigglepy.bayes.rst", "reference/squigglepy.correlation.rst", "reference/squigglepy.distributions.rst", "reference/squigglepy.numbers.rst", "reference/squigglepy.rng.rst", "reference/squigglepy.samplers.rst", "reference/squigglepy.utils.rst", "reference/squigglepy.version.rst", "usage.rst"], "titles": ["Squigglepy: Implementation of Squiggle in Python", "Installation", "squigglepy", "squigglepy package", "squigglepy.bayes module", "squigglepy.correlation module", "squigglepy.distributions module", "squigglepy.numbers module", "squigglepy.rng module", "squigglepy.samplers module", "squigglepy.utils module", "squigglepy.version module", "Examples"], "terms": {"index": [], "modul": [2, 3], "search": [], "page": [], "i": [0, 4, 5, 6, 8, 9, 10, 12], "simpl": 0, "program": 0, "languag": 0, "intuit": 0, "probabilist": 0, "estim": 0, "It": [0, 9], "serv": 0, "its": 0, "own": [0, 12], "standalon": 0, "syntax": 0, "javascript": 0, "like": [0, 10], "intend": [0, 5], "us": [0, 1, 4, 5, 6, 8, 9, 10, 12], "frequent": 0, "also": [0, 1, 5, 6, 9, 10, 12], "sometim": 0, "want": [0, 4, 5, 12], "similar": 0, "function": [0, 4, 6, 10, 12], "especi": 0, "alongsid": [0, 9], "other": [0, 4, 9, 10, 12], "statist": 0, "packag": [0, 2, 5, 12], "numpi": [0, 9, 10, 12], "panda": 0, "matplotlib": [0, 12], "The": [0, 4, 5, 6, 8, 9, 10, 12], "here": [0, 12], "mani": [0, 4, 9], "pip": 1, "For": [1, 12], "plot": [1, 3, 6, 12], "support": [0, 1, 4], "you": [0, 1, 4, 5, 6, 9, 10, 12], "can": [0, 1, 5, 6, 9, 10, 12], "extra": 1, "": [0, 5, 6, 9, 10, 12], "from": [4, 5, 6, 9, 10, 12], "doc": 12, "import": 12, "sq": [4, 5, 6, 12], "np": [4, 5, 8, 10, 12], "pyplot": 12, "plt": 12, "number": [2, 3, 4, 5, 6, 8, 9, 10, 12], "k": [10, 12], "m": [4, 5, 12], "pprint": 12, "pop_of_ny_2022": 12, "8": [4, 6, 10, 12], "1": [4, 5, 6, 9, 10, 12], "4": [6, 9, 10, 12], "thi": [0, 4, 5, 6, 9, 10, 12], "mean": [4, 6, 9, 10, 12], "re": 12, "90": [6, 9, 10, 12], "confid": 12, "valu": [6, 9, 10, 12], "between": [0, 5, 6, 9, 10, 12], "million": 12, "pct_of_pop_w_piano": 12, "0": [4, 5, 6, 9, 10, 12], "2": [4, 5, 6, 9, 10, 12], "01": [4, 10, 12], "we": [4, 5, 10, 12], "assum": 12, "ar": [4, 5, 6, 9, 10, 12], "almost": 12, "peopl": 12, "multipl": 12, "pianos_per_piano_tun": 12, "50": [4, 10, 12], "piano_tuners_per_piano": 12, "total_tuners_in_2022": 12, "sampl": [0, 2, 3, 4, 5, 6, 9, 10, 12], "1000": [5, 6, 12], "note": [5, 10, 12], "shorthand": [0, 12], "get": [10, 12], "sd": [4, 6, 9, 12], "print": [4, 5, 9, 10, 12], "format": [10, 12], "round": [6, 10, 12], "std": 12, "percentil": [10, 12], "get_percentil": [2, 3, 10, 12], "digit": [6, 10, 12], "histogram": [6, 12], "hist": 12, "bin": [6, 12], "200": [6, 12], "show": 12, "shorter": 12, "And": 12, "version": [0, 2, 3, 10, 12], "incorpor": 12, "time": [10, 12], "def": [4, 6, 12], "pop_at_tim": 12, "t": [6, 9, 12], "year": [10, 12], "after": 12, "2022": 12, "avg_yearly_pct_chang": 12, "05": [5, 6, 10, 12], "expect": [10, 12], "nyc": 12, "continu": 12, "grow": 12, "an": [0, 4, 5, 6, 9, 10, 12], "roughli": 12, "per": [10, 12], "return": [4, 5, 6, 8, 9, 10, 12], "total_tuners_at_tim": 12, "total": [4, 9, 12], "2030": 12, "warn": 12, "Be": 12, "care": 12, "about": [10, 12], "divid": [10, 12], "etc": 12, "500": 12, "instead": [6, 10, 12], "outcom": 12, "count": 12, "norm": [2, 3, 4, 6, 9, 10, 12], "3": [4, 6, 9, 10, 12], "onli": [4, 5, 9, 10, 12], "two": [4, 5, 6, 12], "multipli": 12, "normal": [2, 3, 4, 6, 9, 10, 12], "interv": [6, 9, 10, 12], "too": 12, "one": [4, 10, 12], "than": [4, 6, 9, 10, 12], "100": [5, 10, 12], "longhand": 12, "n": [4, 5, 6, 9, 10, 12], "nice": 12, "progress": [4, 9, 12], "report": [0, 12], "verbos": [4, 9, 10, 12], "true": [4, 6, 9, 10, 12], "exist": [4, 9, 12], "lognorm": [2, 3, 6, 9, 12], "10": [6, 9, 10, 12], "tdist": [2, 3, 6, 12], "5": [4, 5, 6, 9, 10, 12], "triangular": [2, 3, 6, 9, 12], "pert": [2, 3, 6, 9, 12], "lam": [6, 9, 12], "binomi": [2, 3, 6, 9, 12], "p": [4, 6, 9, 10, 12], "beta": [2, 3, 4, 5, 6, 9, 12], "b": [6, 9, 12], "bernoulli": [2, 3, 4, 6, 12], "poisson": [2, 3, 6, 9, 12], "chisquar": [2, 3, 6, 12], "gamma": [2, 3, 5, 6, 9, 12], "pareto": [2, 3, 6, 9, 12], "exponenti": [2, 3, 6, 9, 12], "scale": [6, 9, 12], "geometr": [2, 3, 6, 9, 10, 12], "discret": [2, 3, 5, 6, 9, 12], "9": [4, 6, 9, 10, 12], "integ": [10, 12], "15": [6, 10, 12], "altern": 12, "object": [5, 10, 12], "No": 12, "weight": [4, 6, 9, 10, 12], "equal": [6, 9, 12], "mix": [6, 9, 12], "togeth": 12, "mixtur": [2, 3, 4, 6, 9, 12], "These": [10, 12], "each": [4, 5, 6, 9, 10, 12], "equival": [4, 12], "abov": [10, 12], "just": [4, 6, 10, 12], "differ": [6, 9, 10, 12], "wai": [5, 12], "do": [4, 6, 9, 10, 12], "notat": [6, 9, 10, 12], "make": [4, 9, 10, 12], "zero": [6, 12], "inflat": [6, 12], "60": [10, 12], "chanc": [6, 9, 12], "40": [10, 12], "zero_infl": [2, 3, 6, 12], "6": [4, 5, 6, 9, 10, 12], "add": [6, 12], "subtract": 12, "math": [0, 12], "chang": [0, 9, 12], "ci": [6, 9, 10, 12], "default": [4, 5, 6, 9, 10, 12], "80": [4, 5, 10, 12], "credibl": [6, 9, 10, 12], "clip": [2, 3, 6, 12], "lclip": [2, 3, 6, 9, 12], "rclip": [2, 3, 6, 9, 12], "anyth": [6, 12], "lower": [6, 12], "higher": 12, "pipe": [6, 12], "correl": [2, 3, 9, 12], "uniform": [2, 3, 6, 9, 12], "even": 12, "pass": [4, 5, 6, 10, 12], "your": [10, 12], "matrix": [5, 12], "how": [4, 10, 12], "build": 12, "tool": 12, "roll_di": [2, 3, 10, 12], "side": [10, 12], "list": [4, 5, 6, 9, 10, 12], "rang": [6, 9, 10, 12], "els": [4, 12], "none": [4, 5, 6, 9, 10, 12], "alreadi": [10, 12], "includ": [4, 5, 10, 12], "standard": [6, 9, 12], "util": [2, 3, 12], "women": 12, "ag": 12, "forti": 12, "who": 12, "particip": 12, "routin": 12, "screen": 12, "have": [4, 6, 9, 10, 12], "breast": 12, "cancer": [4, 12], "posit": [4, 5, 6, 10, 12], "mammographi": [4, 12], "without": [4, 12], "woman": 12, "group": [5, 9, 12], "had": 12, "what": [4, 6, 10, 12], "probabl": [4, 6, 9, 10, 12], "she": 12, "actual": 12, "ha": [5, 6, 10, 12], "approxim": [5, 6, 9, 12], "answer": [4, 12], "network": [4, 12], "reject": [4, 12], "bay": [2, 3, 12], "has_canc": [4, 12], "event": [2, 3, 4, 6, 10, 12], "096": [4, 12], "define_ev": [4, 12], "bayesnet": [2, 3, 4, 12], "find": [4, 12], "lambda": [4, 6, 9, 12], "e": [4, 10, 12], "conditional_on": [4, 12], "07723995880535531": [4, 12], "Or": [5, 12], "inform": [10, 12], "immedi": 12, "hand": 12, "directli": [5, 12], "calcul": [4, 6, 9, 10, 12], "though": 12, "doesn": 12, "work": [5, 9, 10, 12], "veri": [5, 12], "stuff": 12, "simple_bay": [2, 3, 4, 12], "prior": [4, 10, 12], "likelihood_h": [4, 12], "likelihood_not_h": [4, 12], "07763975155279504": [4, 12], "updat": [2, 3, 4, 12], "them": [4, 5, 6, 12], "prior_sampl": 12, "evid": [4, 12], "evidence_sampl": 12, "posterior": [4, 12], "posterior_sampl": 12, "averag": [2, 3, 4, 12], "average_sampl": 12, "artifici": 12, "intellig": 12, "section": 12, "hous": 12, "system": 12, "against": 12, "burglari": 12, "live": 12, "seismic": 12, "activ": 12, "area": 12, "occasion": 12, "set": [5, 6, 8, 10, 12], "off": 12, "earthquak": 12, "neighbor": 12, "mari": 12, "john": 12, "know": [4, 12], "If": [4, 5, 6, 9, 10, 12], "thei": [0, 12], "hear": 12, "call": [4, 12], "guarante": 12, "particular": 12, "dai": [10, 12], "go": 12, "95": [10, 12], "both": [4, 9, 12], "94": [10, 12], "29": [4, 12], "noth": 12, "fals": [4, 9, 10, 12], "when": [4, 6, 9, 10, 12], "goe": 12, "But": [6, 12], "sai": 12, "hi": 12, "70": [10, 12], "p_alarm_goes_off": 12, "elif": 12, "001": 12, "p_john_cal": 12, "alarm_goes_off": 12, "p_mary_cal": 12, "7": [5, 6, 10, 12], "burglary_happen": 12, "earthquake_happen": 12, "002": 12, "john_cal": 12, "mary_cal": 12, "happen": [6, 9, 10, 12], "result": [4, 5, 6, 9, 10, 12], "19": 12, "vari": 12, "becaus": [9, 12], "base": [4, 5, 6, 9, 10, 12], "random": [6, 8, 9, 12], "mai": [0, 5, 12], "take": [4, 6, 9, 12], "minut": 12, "been": [5, 12], "27": [6, 12], "quickli": 12, "built": [6, 12], "cach": [4, 9, 12], "reload_cach": [4, 9, 12], "recalcul": [4, 9, 12], "amount": [10, 12], "analysi": 12, "pretti": 12, "limit": 12, "consid": [10, 12], "sorobn": 12, "pomegran": 12, "bnlearn": 12, "pymc": 12, "monte_hal": 12, "door_pick": 12, "switch": 12, "door": 12, "c": 12, "car_is_behind_door": 12, "reveal_door": 12, "d": 12, "old_door_pick": 12, "won_car": 12, "won": [6, 12], "r": 12, "win": [10, 12], "int": [4, 5, 6, 9, 10, 12], "66": 12, "34": 12, "imagin": 12, "flip": [10, 12], "head": [10, 12], "out": [4, 9, 12], "my": 12, "blue": 12, "bag": 12, "tail": [10, 12], "red": 12, "contain": [10, 12], "20": [6, 9, 10, 12], "took": 12, "flip_coin": [2, 3, 10, 12], "me": [0, 12], "12306": 12, "which": [0, 4, 6, 9, 10, 12], "close": [5, 12], "correct": 12, "12292": 12, "gener": [4, 8, 12], "combin": [6, 12], "bankrol": [10, 12], "determin": [6, 12], "size": 12, "criterion": [10, 12], "ve": [10, 12], "price": [10, 12], "question": 12, "market": [10, 12], "resolv": [10, 12], "favor": 12, "see": 12, "65": [5, 12], "willing": 12, "should": [4, 6, 9, 10, 12], "follow": 12, "kelly_data": 12, "my_pric": [10, 12], "market_pric": [10, 12], "fraction": [10, 12], "143": 12, "target": [10, 12], "much": [4, 10, 12], "monei": [10, 12], "invest": [10, 12], "142": 12, "86": 12, "expected_roi": [10, 12], "roi": 12, "077": 12, "action": 12, "black": 12, "ruff": 12, "check": [5, 12], "pytest": 12, "pip3": 12, "python3": 12, "integr": 12, "py": 12, "unoffici": 0, "myself": [], "rethink": 0, "prioriti": 0, "affili": 0, "associ": [0, 6, 9], "quantifi": 0, "uncertainti": 0, "research": 0, "institut": 0, "maintain": 0, "new": 0, "yet": [0, 4], "stabl": 0, "product": 0, "so": [0, 10], "encount": 0, "bug": 0, "error": 0, "pleas": 0, "those": 0, "fix": [0, 10], "possibl": 0, "futur": [0, 4, 9], "introduc": 0, "break": 0, "avail": 0, "under": [0, 8], "mit": 0, "licens": 0, "primari": 0, "author": 0, "peter": 0, "wildeford": 0, "agust\u00edn": 0, "covarrubia": 0, "bernardo": 0, "baron": 0, "contribut": 0, "sever": 0, "kei": 0, "develop": 0, "thank": 0, "ozzi": 0, "gooen": 0, "creat": 0, "origin": [0, 5], "dawn": 0, "drescher": 0, "help": 0, "come": 0, "up": 0, "idea": 0, "well": [0, 9], "featur": 0, "start": 4, "readm": [], "subpackag": [], "submodul": 2, "distribut": [0, 2, 3, 4, 5, 9, 10], "rng": [2, 3], "sampler": [2, 3], "content": [], "test": [10, 12], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "correlationgroup": [2, 3, 5], "correlated_dist": [3, 5], "correlation_matrix": [3, 5], "correlation_toler": [3, 5], "has_sufficient_sample_divers": [3, 5], "induce_correl": [3, 5], "min_unique_sampl": [3, 5], "basedistribut": [2, 3, 6, 9, 10], "bernoullidistribut": [2, 3, 6], "betadistribut": [2, 3, 6], "binomialdistribut": [2, 3, 6], "categoricaldistribut": [2, 3, 6], "chisquaredistribut": [2, 3, 6], "complexdistribut": [2, 3, 6, 10], "compositedistribut": [2, 3, 6], "constantdistribut": [2, 3, 6], "continuousdistribut": [2, 3, 6], "discretedistribut": [2, 3, 6], "exponentialdistribut": [2, 3, 6], "gammadistribut": [2, 3, 6], "geometricdistribut": [2, 3, 6], "logtdistribut": [2, 3, 6], "lognormaldistribut": [2, 3, 6], "mixturedistribut": [2, 3, 6], "normaldistribut": [2, 3, 6], "operabledistribut": [2, 3, 5, 6], "pertdistribut": [2, 3, 6], "paretodistribut": [2, 3, 6], "poissondistribut": [2, 3, 6], "tdistribut": [2, 3, 6], "triangulardistribut": [2, 3, 6], "uniformdistribut": [2, 3, 6], "const": [2, 3, 6], "dist_ceil": [2, 3, 6], "dist_exp": [2, 3, 6], "dist_floor": [2, 3, 6], "dist_fn": [2, 3, 6], "dist_log": [2, 3, 6], "dist_max": [2, 3, 6], "dist_min": [2, 3, 6], "dist_round": [2, 3, 6], "inf0": [2, 3, 6], "log_tdist": [2, 3, 6], "set_se": [2, 3, 8, 9, 10], "bernoulli_sampl": [2, 3, 9], "beta_sampl": [2, 3, 9], "binomial_sampl": [2, 3, 9], "chi_square_sampl": [2, 3, 9], "discrete_sampl": [2, 3, 9], "exponential_sampl": [2, 3, 9], "gamma_sampl": [2, 3, 9], "geometric_sampl": [2, 3, 9], "log_t_sampl": [2, 3, 9], "lognormal_sampl": [2, 3, 9], "mixture_sampl": [2, 3, 9], "normal_sampl": [2, 3, 9], "pareto_sampl": [2, 3, 9], "pert_sampl": [2, 3, 9], "poisson_sampl": [2, 3, 9], "sample_correlated_group": [2, 3, 9], "t_sampl": [2, 3, 9], "triangular_sampl": [2, 3, 9], "uniform_sampl": [2, 3, 9], "doubling_time_to_growth_r": [2, 3, 10], "event_happen": [2, 3, 10], "event_occur": [2, 3, 10], "extrem": [2, 3, 5, 10], "full_kelli": [2, 3, 10], "geomean": [2, 3, 10], "geomean_odd": [2, 3, 10], "get_log_percentil": [2, 3, 10], "get_mean_and_ci": [2, 3, 10], "get_median_and_ci": [2, 3, 10], "growth_rate_to_doubling_tim": [2, 3, 10], "half_kelli": [2, 3, 10], "is_continuous_dist": [2, 3, 10], "is_dist": [2, 3, 10], "is_sampl": [2, 3, 10], "kelli": [0, 2, 3, 10], "laplac": [2, 3, 10], "odds_to_p": [2, 3, 10], "one_in": [2, 3, 10], "p_to_odd": [2, 3, 10], "quarter_kelli": [2, 3, 10], "relative_weight": [4, 6, 9, 10], "sourc": [4, 5, 6, 8, 9, 10], "arrai": [4, 5, 9, 10], "float": [4, 5, 6, 8, 9, 10], "put": 4, "versu": 4, "infer": [0, 4], "sum": [4, 6, 9, 10], "rel": [4, 6, 9, 10], "given": [4, 6, 9, 10], "A": [4, 6, 9, 10], "accord": [4, 5, 9], "event_fn": 4, "reduce_fn": 4, "raw": 4, "memcach": [4, 9], "memcache_load": 4, "memcache_sav": 4, "dump_cache_fil": [4, 9], "load_cache_fil": [4, 9], "cache_file_primari": [4, 9], "core": [4, 9], "bayesian": [0, 4], "allow": 4, "condit": 4, "custom": [4, 6], "defin": [4, 5, 6, 9, 10], "all": [4, 5, 6, 9, 10], "simul": 4, "aggreg": 4, "final": 4, "bool": [4, 5, 9, 10], "memori": [4, 9], "match": [4, 5, 9], "load": [4, 9], "save": [4, 9], "ani": [4, 5, 6, 9, 10], "ignor": [4, 6, 9], "str": [4, 6, 9, 10], "present": [4, 9], "write": [4, 9], "binari": [4, 6, 9], "file": [4, 9], "path": [4, 9], "sqlcach": [4, 9], "append": [4, 9], "name": [4, 6, 9], "first": [4, 9], "attempt": [4, 9], "otherwis": [4, 6, 9, 10], "statement": [4, 9], "comput": [4, 9], "run": [4, 9, 12], "singl": [4, 9], "process": [4, 9], "greater": [4, 6, 9], "multiprocess": [4, 9], "pool": [4, 9], "variou": [4, 9], "likelihood": [4, 6, 9, 10], "rate": [4, 10], "rule": [4, 10], "h": 4, "hypothesi": 4, "aka": [4, 6, 9], "evidence_weight": 4, "perform": 4, "produc": [4, 5], "current": [4, 10], "must": [4, 5, 6, 9, 10], "either": [4, 6, 9, 10], "type": 4, "matter": [4, 6], "where": [4, 5, 9, 10], "53": 4, "implement": [5, 12], "iman": 5, "conov": 5, "method": [5, 6], "induc": 5, "some": 5, "code": 5, "adapt": 5, "abraham": 5, "lee": 5, "mcerp": 5, "tisimst": 5, "class": [5, 6], "tupl": 5, "ndarrai": [5, 9], "float64": [5, 9], "hold": 5, "metadata": 5, "user": [5, 9], "rather": 5, "dure": 5, "dtype": [5, 9], "relative_threshold": 5, "absolute_threshold": 5, "suffici": 5, "uniqu": 5, "data": [5, 10], "column": 5, "wise": 5, "dataset": 5, "2d": 5, "independ": 5, "variabl": [5, 9, 10], "correspond": 5, "corrmat": 5, "desir": [5, 6, 10], "coeffici": 5, "symmetr": 5, "definit": 5, "order": 5, "new_data": 5, "toler": 5, "_min_unique_sampl": 5, "rank": 5, "emploi": 5, "while": 5, "preserv": 5, "margin": 5, "best": 5, "effort": 5, "basi": 5, "fail": 5, "depend": 5, "provid": 5, "except": 5, "rais": 5, "case": [5, 6], "abl": 5, "enough": 5, "shuffl": 5, "notabl": 5, "hard": 5, "common": [5, 6, 9], "few": 5, "spearman": 5, "semi": 5, "confus": 5, "covari": 5, "exclus": 5, "same": [5, 6, 9, 10], "option": 5, "overrid": 5, "absolut": [5, 10], "disabl": 5, "correlated_vari": 5, "input": 5, "suppos": 5, "solar_radi": 5, "temperatur": 5, "300": 5, "22": 5, "28": [5, 10], "corrcoef": 5, "6975960649767123": 5, "could": [5, 6], "funding_gap": 5, "cost_per_deliveri": 5, "effect_s": 5, "20_000": 5, "80_000": 5, "30": [5, 10], "580520": 5, "480149": 5, "580962": 5, "187831": 5, "abc": 6, "item": [6, 9], "df": [6, 9], "left": [6, 9], "right": [6, 9], "fn": 6, "fn_str": 6, "infix": 6, "x": [6, 10], "shape": [6, 9], "y": 6, "norm_mean": 6, "norm_sd": 6, "lognorm_mean": 6, "lognorm_sd": 6, "dist": [6, 9], "num_sampl": 6, "draw": 6, "mode": [6, 9, 10], "initi": 6, "alpha": [6, 9], "typic": [6, 9], "trial": [6, 9, 10], "success": [6, 9, 10], "failur": [6, 9, 10], "chi": [6, 9], "squar": [6, 9], "degre": [6, 9], "freedom": [6, 9], "chiaquar": 6, "dist1": 6, "bound": 6, "output": 6, "appli": 6, "until": 6, "funciton": 6, "partial": 6, "suitabl": 6, "upper": 6, "lazi": 6, "evalu": 6, "constant": 6, "alwai": 6, "categor": [6, 9], "dict": [6, 9, 10], "being": [6, 9], "thing": [6, 9], "ceil": 6, "exp": 6, "floor": 6, "dist2": 6, "second": 6, "argument": 6, "By": 6, "__name__": 6, "doubl": [6, 10], "718281828459045": 6, "log": [6, 9, 10], "maximum": 6, "max": 6, "minimum": 6, "min": 6, "below": [6, 9], "coerc": [6, 9], "individu": [6, 9], "p_zero": 6, "arbitrari": 6, "alia": [6, 10], "val": 6, "space": [6, 9], "via": [6, 9], "loos": [6, 9], "unlik": [6, 9], "precis": [6, 9], "classic": 6, "low": [6, 9], "high": [6, 9], "underli": 6, "deviat": [6, 9], "04": 6, "21": [6, 9], "09": 6, "147": 6, "smallest": [6, 9], "most": [6, 9, 10], "largest": [6, 9], "unless": [6, 9], "less": 6, "becom": 6, "08": [6, 10], "seed": 8, "default_rng": 8, "hood": 8, "intern": [8, 9], "42": [8, 9, 10], "pcg64": 8, "0x127ede9e0": 8, "22145847498048798": 9, "808417207931989": 9, "_multicore_tqdm_n": 9, "_multicore_tqdm_cor": 9, "tqdm": 9, "interfac": 9, "meant": 9, "bar": 9, "multicor": 9, "safe": 9, "24": [9, 10], "042086039659946": 9, "290716894247602": 9, "addition": 9, "052949773846356": 9, "3562412406168636": 9, "ranom": 9, "183867278765718": 9, "7859113725925972": 9, "1041655362137777": 9, "30471707975443135": 9, "069666324736094": 9, "327625176788963": 9, "13": [9, 10], "_correlate_if_need": 9, "npy": 9, "1m": 9, "592627415218455": 9, "7281209657534462": 9, "10817361": 9, "45828454": 9, "requested_dist": 9, "store": 9, "themselv": 9, "_correlated_sampl": 9, "necessari": 9, "need": 9, "onc": [9, 10], "regardless": 9, "tree": 9, "oper": [6, 9], "7887113716855985": 9, "7739560485559633": 9, "doubling_tim": 10, "convert": 10, "growth": 10, "express": 10, "unit": 10, "g": 10, "remain": 10, "got": 10, "annual": 10, "sens": 10, "talk": 10, "percentag": 10, "12": 10, "05946309435929531": 10, "predict": 10, "within": 10, "factor": 10, "73": 10, "http": 10, "arxiv": 10, "org": 10, "ab": 10, "2111": 10, "03153": 10, "875428191155692": 10, "coin": 10, "resolve_d": 10, "defer": 10, "give": 10, "bet": [0, 10], "back": 10, "arr": 10, "yyyi": 10, "mm": 10, "dd": 10, "addit": [0, 10], "specifi": 10, "adj_pric": 10, "adjust": 10, "taken": 10, "account": 10, "delta_pric": 10, "adj_delta_pric": 10, "indic": 10, "delta": 10, "max_gain": 10, "would": 10, "gain": 10, "modeled_gain": 10, "expected_arr": 10, "125": 10, "72": 10, "75": 10, "drop_na": 10, "boolean": 10, "na": 10, "drop": 10, "1072325059538595": 10, "odd": 10, "befor": 10, "42985748800076845": 10, "99": 10, "revers": 10, "displai": 10, "95th": 10, "5th": 10, "swap": 10, "easi": 10, "read": 10, "dictionari": 10, "power": 10, "25": 10, "49": 10, "74": 10, "ci_low": 10, "ci_high": 10, "median": 10, "growth_rat": 10, "69": 10, "66071689357483": 10, "55": 10, "62": 10, "23": 10, "375": 10, "obj": 10, "string": 10, "callabl": 10, "half": 10, "quarter": 10, "full": 10, "time_pass": 10, "time_remain": 10, "time_fix": 10, "next": 10, "law": 10, "invari": 10, "www": 10, "lesswrong": 10, "com": 10, "post": 10, "we7sk8w8aixqknar": 10, "among": 10, "past": 10, "leav": 10, "occur": 10, "observ": 10, "least": 10, "over": 10, "period": 10, "wa": 10, "chosen": 10, "specif": 10, "recent": 10, "sun": 10, "risen": 10, "000": 10, "rise": 10, "again": 10, "tomorrow": 10, "999990000199996": 10, "last": 10, "nuke": 10, "war": 10, "77": 10, "ago": 10, "naiv": 10, "012820512820512664": 10, "lst": 10, "decim": 10, "09090909090909091": 10, "logic": 10, "1111111111111111": 10, "48": 10, "31": 10, "188": 10, "roll": 10, "die": 10, "dice": 10, "collect": 6, "squigglepi": [1, 12], "squiggl": 12, "python": 12, "api": 0, "refer": 0, "exampl": [0, 4, 5, 6, 8, 9, 10], "piano": 0, "tuner": 0, "more": 0, "instal": [0, 12], "usag": 0, "disclaim": [], "acknowledg": [], "alarm": [], "net": [], "demonstr": [], "monti": [], "hall": [], "problem": [], "complex": [], "interact": [], "paramet": [4, 5, 6, 8, 9, 10]}, "objects": {"": [[3, 0, 0, "-", "squigglepy"]], "squigglepy": [[4, 0, 0, "-", "bayes"], [5, 0, 0, "-", "correlation"], [6, 0, 0, "-", "distributions"], [7, 0, 0, "-", "numbers"], [8, 0, 0, "-", "rng"], [9, 0, 0, "-", "samplers"], [10, 0, 0, "-", "utils"], [11, 0, 0, "-", "version"]], "squigglepy.bayes": [[4, 1, 1, "", "average"], [4, 1, 1, "", "bayesnet"], [4, 1, 1, "", "simple_bayes"], [4, 1, 1, "", "update"]], "squigglepy.correlation": [[5, 2, 1, "", "CorrelationGroup"], [5, 1, 1, "", "correlate"]], "squigglepy.correlation.CorrelationGroup": [[5, 3, 1, "", "correlated_dists"], [5, 3, 1, "", "correlation_matrix"], [5, 3, 1, "", "correlation_tolerance"], [5, 4, 1, "", "has_sufficient_sample_diversity"], [5, 4, 1, "", "induce_correlation"], [5, 3, 1, "", "min_unique_samples"]], "squigglepy.distributions": [[6, 2, 1, "", "BaseDistribution"], [6, 2, 1, "", "BernoulliDistribution"], [6, 2, 1, "", "BetaDistribution"], [6, 2, 1, "", "BinomialDistribution"], [6, 2, 1, "", "CategoricalDistribution"], [6, 2, 1, "", "ChiSquareDistribution"], [6, 2, 1, "", "ComplexDistribution"], [6, 2, 1, "", "CompositeDistribution"], [6, 2, 1, "", "ConstantDistribution"], [6, 2, 1, "", "ContinuousDistribution"], [6, 2, 1, "", "DiscreteDistribution"], [6, 2, 1, "", "ExponentialDistribution"], [6, 2, 1, "", "GammaDistribution"], [6, 2, 1, "", "GeometricDistribution"], [6, 2, 1, "", "LogTDistribution"], [6, 2, 1, "", "LognormalDistribution"], [6, 2, 1, "", "MixtureDistribution"], [6, 2, 1, "", "NormalDistribution"], [6, 2, 1, "", "OperableDistribution"], [6, 2, 1, "", "PERTDistribution"], [6, 2, 1, "", "ParetoDistribution"], [6, 2, 1, "", "PoissonDistribution"], [6, 2, 1, "", "TDistribution"], [6, 2, 1, "", "TriangularDistribution"], [6, 2, 1, "", "UniformDistribution"], [6, 1, 1, "", "bernoulli"], [6, 1, 1, "", "beta"], [6, 1, 1, "", "binomial"], [6, 1, 1, "", "chisquare"], [6, 1, 1, "", "clip"], [6, 1, 1, "", "const"], [6, 1, 1, "", "discrete"], [6, 1, 1, "", "dist_ceil"], [6, 1, 1, "", "dist_exp"], [6, 1, 1, "", "dist_floor"], [6, 1, 1, "", "dist_fn"], [6, 1, 1, "", "dist_log"], [6, 1, 1, "", "dist_max"], [6, 1, 1, "", "dist_min"], [6, 1, 1, "", "dist_round"], [6, 1, 1, "", "exponential"], [6, 1, 1, "", "gamma"], [6, 1, 1, "", "geometric"], [6, 1, 1, "", "inf0"], [6, 1, 1, "", "lclip"], [6, 1, 1, "", "log_tdist"], [6, 1, 1, "", "lognorm"], [6, 1, 1, "", "mixture"], [6, 1, 1, "", "norm"], [6, 1, 1, "", "pareto"], [6, 1, 1, "", "pert"], [6, 1, 1, "", "poisson"], [6, 1, 1, "", "rclip"], [6, 1, 1, "", "tdist"], [6, 1, 1, "", "to"], [6, 1, 1, "", "triangular"], [6, 1, 1, "", "uniform"], [6, 1, 1, "", "zero_inflated"]], "squigglepy.distributions.OperableDistribution": [[6, 4, 1, "", "plot"]], "squigglepy.rng": [[8, 1, 1, "", "set_seed"]], "squigglepy.samplers": [[9, 1, 1, "", "bernoulli_sample"], [9, 1, 1, "", "beta_sample"], [9, 1, 1, "", "binomial_sample"], [9, 1, 1, "", "chi_square_sample"], [9, 1, 1, "", "discrete_sample"], [9, 1, 1, "", "exponential_sample"], [9, 1, 1, "", "gamma_sample"], [9, 1, 1, "", "geometric_sample"], [9, 1, 1, "", "log_t_sample"], [9, 1, 1, "", "lognormal_sample"], [9, 1, 1, "", "mixture_sample"], [9, 1, 1, "", "normal_sample"], [9, 1, 1, "", "pareto_sample"], [9, 1, 1, "", "pert_sample"], [9, 1, 1, "", "poisson_sample"], [9, 1, 1, "", "sample"], [9, 1, 1, "", "sample_correlated_group"], [9, 1, 1, "", "t_sample"], [9, 1, 1, "", "triangular_sample"], [9, 1, 1, "", "uniform_sample"]], "squigglepy.utils": [[10, 1, 1, "", "doubling_time_to_growth_rate"], [10, 1, 1, "", "event"], [10, 1, 1, "", "event_happens"], [10, 1, 1, "", "event_occurs"], [10, 1, 1, "", "extremize"], [10, 1, 1, "", "flip_coin"], [10, 1, 1, "", "full_kelly"], [10, 1, 1, "", "geomean"], [10, 1, 1, "", "geomean_odds"], [10, 1, 1, "", "get_log_percentiles"], [10, 1, 1, "", "get_mean_and_ci"], [10, 1, 1, "", "get_median_and_ci"], [10, 1, 1, "", "get_percentiles"], [10, 1, 1, "", "growth_rate_to_doubling_time"], [10, 1, 1, "", "half_kelly"], [10, 1, 1, "", "is_continuous_dist"], [10, 1, 1, "", "is_dist"], [10, 1, 1, "", "is_sampleable"], [10, 1, 1, "", "kelly"], [10, 1, 1, "", "laplace"], [10, 1, 1, "", "normalize"], [10, 1, 1, "", "odds_to_p"], [10, 1, 1, "", "one_in"], [10, 1, 1, "", "p_to_odds"], [10, 1, 1, "", "quarter_kelly"], [10, 1, 1, "", "roll_die"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "method", "Python method"]}, "titleterms": {"welcom": [], "squigglepi": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "": [], "document": [], "indic": [], "tabl": [], "implement": 0, "squiggl": 0, "python": 0, "instal": 1, "usag": [], "piano": 12, "tuner": 12, "exampl": 12, "distribut": [6, 12], "addit": 12, "featur": 12, "roll": 12, "die": 12, "bayesian": 12, "infer": 12, "alarm": 12, "net": 12, "A": 12, "demonstr": 12, "monti": 12, "hall": 12, "problem": 12, "more": 12, "complex": 12, "coin": 12, "dice": 12, "interact": 12, "kelli": 12, "bet": 12, "run": [], "test": [], "disclaim": 0, "acknowledg": 0, "packag": 3, "subpackag": [], "modul": [4, 5, 6, 7, 8, 9, 10, 11], "content": 0, "submodul": 3, "bay": 4, "correl": 5, "number": 7, "rng": 8, "sampler": 9, "util": 10, "version": 11, "integr": [], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "paramet": [], "return": [], "api": [], "refer": []}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Squigglepy: Implementation of Squiggle in Python": [[0, "squigglepy-implementation-of-squiggle-in-python"]], "Contents": [[0, null]], "Disclaimers": [[0, "disclaimers"]], "Acknowledgements": [[0, "acknowledgements"]], "Installation": [[1, "installation"]], "squigglepy": [[2, "squigglepy"]], "squigglepy package": [[3, "module-squigglepy"]], "Submodules": [[3, "submodules"]], "squigglepy.bayes module": [[4, "module-squigglepy.bayes"]], "squigglepy.correlation module": [[5, "module-squigglepy.correlation"]], "squigglepy.distributions module": [[6, "module-squigglepy.distributions"]], "squigglepy.numbers module": [[7, "module-squigglepy.numbers"]], "squigglepy.rng module": [[8, "module-squigglepy.rng"]], "squigglepy.samplers module": [[9, "module-squigglepy.samplers"]], "squigglepy.utils module": [[10, "module-squigglepy.utils"]], "squigglepy.version module": [[11, "module-squigglepy.version"]], "Examples": [[12, "examples"]], "Piano tuners example": [[12, "piano-tuners-example"]], "Distributions": [[12, "distributions"]], "Additional features": [[12, "additional-features"]], "Example: Rolling a die": [[12, "example-rolling-a-die"]], "Bayesian inference": [[12, "bayesian-inference"]], "Example: Alarm net": [[12, "example-alarm-net"]], "Example: A demonstration of the Monty Hall Problem": [[12, "example-a-demonstration-of-the-monty-hall-problem"]], "Example: More complex coin/dice interactions": [[12, "example-more-complex-coin-dice-interactions"]], "Kelly betting": [[12, "kelly-betting"]], "More examples": [[12, "more-examples"]]}, "indexentries": {"module": [[3, "module-squigglepy"], [4, "module-squigglepy.bayes"], [5, "module-squigglepy.correlation"], [6, "module-squigglepy.distributions"], [7, "module-squigglepy.numbers"], [8, "module-squigglepy.rng"], [9, "module-squigglepy.samplers"], [10, "module-squigglepy.utils"], [11, "module-squigglepy.version"]], "squigglepy": [[3, "module-squigglepy"]], "average() (in module squigglepy.bayes)": [[4, "squigglepy.bayes.average"]], "bayesnet() (in module squigglepy.bayes)": [[4, "squigglepy.bayes.bayesnet"]], "simple_bayes() (in module squigglepy.bayes)": [[4, "squigglepy.bayes.simple_bayes"]], "squigglepy.bayes": [[4, "module-squigglepy.bayes"]], "update() (in module squigglepy.bayes)": [[4, "squigglepy.bayes.update"]], "correlationgroup (class in squigglepy.correlation)": [[5, "squigglepy.correlation.CorrelationGroup"]], "correlate() (in module squigglepy.correlation)": [[5, "squigglepy.correlation.correlate"]], "correlated_dists (squigglepy.correlation.correlationgroup attribute)": [[5, "squigglepy.correlation.CorrelationGroup.correlated_dists"]], "correlation_matrix (squigglepy.correlation.correlationgroup attribute)": [[5, "squigglepy.correlation.CorrelationGroup.correlation_matrix"]], "correlation_tolerance (squigglepy.correlation.correlationgroup attribute)": [[5, "squigglepy.correlation.CorrelationGroup.correlation_tolerance"]], "has_sufficient_sample_diversity() (squigglepy.correlation.correlationgroup method)": [[5, "squigglepy.correlation.CorrelationGroup.has_sufficient_sample_diversity"]], "induce_correlation() (squigglepy.correlation.correlationgroup method)": [[5, "squigglepy.correlation.CorrelationGroup.induce_correlation"]], "min_unique_samples (squigglepy.correlation.correlationgroup attribute)": [[5, "squigglepy.correlation.CorrelationGroup.min_unique_samples"]], "squigglepy.correlation": [[5, "module-squigglepy.correlation"]], "basedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BaseDistribution"]], "bernoullidistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BernoulliDistribution"]], "betadistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BetaDistribution"]], "binomialdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BinomialDistribution"]], "categoricaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.CategoricalDistribution"]], "chisquaredistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ChiSquareDistribution"]], "complexdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ComplexDistribution"]], "compositedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.CompositeDistribution"]], "constantdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ConstantDistribution"]], "continuousdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ContinuousDistribution"]], "discretedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.DiscreteDistribution"]], "exponentialdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ExponentialDistribution"]], "gammadistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.GammaDistribution"]], "geometricdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.GeometricDistribution"]], "logtdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.LogTDistribution"]], "lognormaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.LognormalDistribution"]], "mixturedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.MixtureDistribution"]], "normaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.NormalDistribution"]], "operabledistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.OperableDistribution"]], "pertdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.PERTDistribution"]], "paretodistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ParetoDistribution"]], "poissondistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.PoissonDistribution"]], "tdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.TDistribution"]], "triangulardistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.TriangularDistribution"]], "uniformdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.UniformDistribution"]], "bernoulli() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.bernoulli"]], "beta() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.beta"]], "binomial() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.binomial"]], "chisquare() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.chisquare"]], "clip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.clip"]], "const() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.const"]], "discrete() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.discrete"]], "dist_ceil() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_ceil"]], "dist_exp() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_exp"]], "dist_floor() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_floor"]], "dist_fn() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_fn"]], "dist_log() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_log"]], "dist_max() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_max"]], "dist_min() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_min"]], "dist_round() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_round"]], "exponential() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.exponential"]], "gamma() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.gamma"]], "geometric() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.geometric"]], "inf0() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.inf0"]], "lclip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.lclip"]], "log_tdist() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.log_tdist"]], "lognorm() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.lognorm"]], "mixture() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.mixture"]], "norm() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.norm"]], "pareto() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.pareto"]], "pert() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.pert"]], "plot() (squigglepy.distributions.operabledistribution method)": [[6, "squigglepy.distributions.OperableDistribution.plot"]], "poisson() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.poisson"]], "rclip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.rclip"]], "squigglepy.distributions": [[6, "module-squigglepy.distributions"]], "tdist() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.tdist"]], "to() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.to"]], "triangular() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.triangular"]], "uniform() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.uniform"]], "zero_inflated() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.zero_inflated"]], "squigglepy.numbers": [[7, "module-squigglepy.numbers"]], "set_seed() (in module squigglepy.rng)": [[8, "squigglepy.rng.set_seed"]], "squigglepy.rng": [[8, "module-squigglepy.rng"]], "bernoulli_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.bernoulli_sample"]], "beta_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.beta_sample"]], "binomial_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.binomial_sample"]], "chi_square_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.chi_square_sample"]], "discrete_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.discrete_sample"]], "exponential_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.exponential_sample"]], "gamma_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.gamma_sample"]], "geometric_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.geometric_sample"]], "log_t_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.log_t_sample"]], "lognormal_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.lognormal_sample"]], "mixture_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.mixture_sample"]], "normal_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.normal_sample"]], "pareto_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.pareto_sample"]], "pert_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.pert_sample"]], "poisson_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.poisson_sample"]], "sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.sample"]], "sample_correlated_group() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.sample_correlated_group"]], "squigglepy.samplers": [[9, "module-squigglepy.samplers"]], "t_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.t_sample"]], "triangular_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.triangular_sample"]], "uniform_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.uniform_sample"]], "doubling_time_to_growth_rate() (in module squigglepy.utils)": [[10, "squigglepy.utils.doubling_time_to_growth_rate"]], "event() (in module squigglepy.utils)": [[10, "squigglepy.utils.event"]], "event_happens() (in module squigglepy.utils)": [[10, "squigglepy.utils.event_happens"]], "event_occurs() (in module squigglepy.utils)": [[10, "squigglepy.utils.event_occurs"]], "extremize() (in module squigglepy.utils)": [[10, "squigglepy.utils.extremize"]], "flip_coin() (in module squigglepy.utils)": [[10, "squigglepy.utils.flip_coin"]], "full_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.full_kelly"]], "geomean() (in module squigglepy.utils)": [[10, "squigglepy.utils.geomean"]], "geomean_odds() (in module squigglepy.utils)": [[10, "squigglepy.utils.geomean_odds"]], "get_log_percentiles() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_log_percentiles"]], "get_mean_and_ci() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_mean_and_ci"]], "get_median_and_ci() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_median_and_ci"]], "get_percentiles() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_percentiles"]], "growth_rate_to_doubling_time() (in module squigglepy.utils)": [[10, "squigglepy.utils.growth_rate_to_doubling_time"]], "half_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.half_kelly"]], "is_continuous_dist() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_continuous_dist"]], "is_dist() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_dist"]], "is_sampleable() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_sampleable"]], "kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.kelly"]], "laplace() (in module squigglepy.utils)": [[10, "squigglepy.utils.laplace"]], "normalize() (in module squigglepy.utils)": [[10, "squigglepy.utils.normalize"]], "odds_to_p() (in module squigglepy.utils)": [[10, "squigglepy.utils.odds_to_p"]], "one_in() (in module squigglepy.utils)": [[10, "squigglepy.utils.one_in"]], "p_to_odds() (in module squigglepy.utils)": [[10, "squigglepy.utils.p_to_odds"]], "quarter_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.quarter_kelly"]], "roll_die() (in module squigglepy.utils)": [[10, "squigglepy.utils.roll_die"]], "squigglepy.utils": [[10, "module-squigglepy.utils"]], "squigglepy.version": [[11, "module-squigglepy.version"]]}}) \ No newline at end of file diff --git a/doc/source/conf.py b/doc/source/conf.py index 372fb64..ebbe282 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -42,6 +42,7 @@ "sphinx.ext.autodoc", "sphinx.ext.imgmath", "sphinx.ext.viewcode", + "numpydoc", ] # Add any paths that contain templates here, relative to this directory. @@ -176,3 +177,5 @@ # -- Extension configuration ------------------------------------------------- + +numpydoc_class_members_toctree = False diff --git a/doc/source/index.rst b/doc/source/index.rst index 89b8383..3461183 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -47,3 +47,5 @@ Acknowledgements distributions. - Thanks to Dawn Drescher for coming up with the idea to use ``~`` as a shorthand for ``sample``, as well as helping me implement it. + +.. autosummary:: diff --git a/pyproject.toml b/pyproject.toml index d4e93d2..b35de76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ pathos = "^0.3.0" msgspec = "^0.15.1" matplotlib = { version = "^3.7.1", optional = true } pandas = { version = "^2.0.2", optional = true } +pydata-sphinx-theme = "^0.14.3" [tool.poetry.group.dev.dependencies] From ffd514253624bc8abdef800ef1dac01aebfe345e Mon Sep 17 00:00:00 2001 From: Michael Dickens Date: Thu, 23 Nov 2023 13:39:57 -0800 Subject: [PATCH 7/7] docs: don't track build/ --- .gitignore | 1 + doc/build/doctrees/README.doctree | Bin 50071 -> 0 bytes doc/build/doctrees/environment.pickle | Bin 1521208 -> 0 bytes doc/build/doctrees/examples.doctree | Bin 41989 -> 0 bytes doc/build/doctrees/index.doctree | Bin 9496 -> 0 bytes doc/build/doctrees/installation.doctree | Bin 3196 -> 0 bytes doc/build/doctrees/reference/modules.doctree | Bin 2791 -> 0 bytes .../reference/squigglepy.bayes.doctree | Bin 57815 -> 0 bytes .../reference/squigglepy.correlation.doctree | Bin 61358 -> 0 bytes .../squigglepy.distributions.doctree | Bin 390640 -> 0 bytes .../doctrees/reference/squigglepy.doctree | Bin 3886 -> 0 bytes .../reference/squigglepy.numbers.doctree | Bin 3110 -> 0 bytes .../doctrees/reference/squigglepy.rng.doctree | Bin 7951 -> 0 bytes .../reference/squigglepy.samplers.doctree | Bin 176788 -> 0 bytes .../reference/squigglepy.squigglepy.doctree | Bin 5627 -> 0 bytes .../reference/squigglepy.tests.doctree | Bin 5947 -> 0 bytes .../reference/squigglepy.utils.doctree | Bin 219063 -> 0 bytes .../reference/squigglepy.version.doctree | Bin 3110 -> 0 bytes doc/build/doctrees/usage.doctree | Bin 43098 -> 0 bytes doc/build/html/.buildinfo | 4 - doc/build/html/README.html | 893 -- doc/build/html/_modules/index.html | 400 - doc/build/html/_modules/squigglepy/bayes.html | 804 -- .../html/_modules/squigglepy/correlation.html | 744 -- .../_modules/squigglepy/distributions.html | 2279 ---- doc/build/html/_modules/squigglepy/rng.html | 389 - .../html/_modules/squigglepy/samplers.html | 1560 --- doc/build/html/_modules/squigglepy/utils.html | 1668 --- doc/build/html/_sources/README.rst.txt | 531 - doc/build/html/_sources/examples.rst.txt | 468 - doc/build/html/_sources/index.rst.txt | 51 - doc/build/html/_sources/installation.rst.txt | 12 - .../html/_sources/reference/modules.rst.txt | 7 - .../reference/squigglepy.bayes.rst.txt | 7 - .../reference/squigglepy.correlation.rst.txt | 7 - .../squigglepy.distributions.rst.txt | 7 - .../reference/squigglepy.numbers.rst.txt | 7 - .../_sources/reference/squigglepy.rng.rst.txt | 7 - .../_sources/reference/squigglepy.rst.txt | 22 - .../reference/squigglepy.samplers.rst.txt | 7 - .../reference/squigglepy.squigglepy.rst.txt | 78 - .../reference/squigglepy.tests.rst.txt | 86 - .../reference/squigglepy.utils.rst.txt | 7 - .../reference/squigglepy.version.rst.txt | 7 - doc/build/html/_sources/usage.rst.txt | 476 - doc/build/html/_static/alabaster.css | 703 -- doc/build/html/_static/basic.css | 925 -- doc/build/html/_static/custom.css | 1 - doc/build/html/_static/doctools.js | 156 - .../html/_static/documentation_options.js | 13 - doc/build/html/_static/file.png | Bin 286 -> 0 bytes doc/build/html/_static/jquery.js | 10365 ---------------- doc/build/html/_static/language_data.js | 199 - doc/build/html/_static/minus.png | Bin 90 -> 0 bytes doc/build/html/_static/plus.png | Bin 90 -> 0 bytes doc/build/html/_static/pygments.css | 152 - doc/build/html/_static/scripts/bootstrap.js | 3 - .../_static/scripts/bootstrap.js.LICENSE.txt | 5 - .../html/_static/scripts/bootstrap.js.map | 1 - .../_static/scripts/pydata-sphinx-theme.js | 2 - .../scripts/pydata-sphinx-theme.js.map | 1 - doc/build/html/_static/searchtools.js | 574 - doc/build/html/_static/sphinx_highlight.js | 154 - doc/build/html/_static/styles/bootstrap.css | 6 - .../html/_static/styles/bootstrap.css.map | 1 - .../_static/styles/pydata-sphinx-theme.css | 2 - .../styles/pydata-sphinx-theme.css.map | 1 - doc/build/html/_static/styles/theme.css | 2 - doc/build/html/_static/underscore.js | 1707 --- .../vendor/fontawesome/6.1.2/LICENSE.txt | 165 - .../vendor/fontawesome/6.1.2/css/all.min.css | 5 - .../vendor/fontawesome/6.1.2/js/all.min.js | 2 - .../6.1.2/js/all.min.js.LICENSE.txt | 5 - .../6.1.2/webfonts/fa-brands-400.ttf | Bin 181264 -> 0 bytes .../6.1.2/webfonts/fa-brands-400.woff2 | Bin 105112 -> 0 bytes .../6.1.2/webfonts/fa-regular-400.ttf | Bin 60236 -> 0 bytes .../6.1.2/webfonts/fa-regular-400.woff2 | Bin 24028 -> 0 bytes .../6.1.2/webfonts/fa-solid-900.ttf | Bin 389948 -> 0 bytes .../6.1.2/webfonts/fa-solid-900.woff2 | Bin 154840 -> 0 bytes .../6.1.2/webfonts/fa-v4compatibility.ttf | Bin 10084 -> 0 bytes .../6.1.2/webfonts/fa-v4compatibility.woff2 | Bin 4776 -> 0 bytes doc/build/html/_static/webpack-macros.html | 31 - doc/build/html/examples.html | 891 -- doc/build/html/genindex.html | 874 -- doc/build/html/index.html | 467 - doc/build/html/installation.html | 440 - doc/build/html/objects.inv | Bin 1336 -> 0 bytes doc/build/html/py-modindex.html | 428 - doc/build/html/reference/modules.html | 595 - .../html/reference/squigglepy.bayes.html | 655 - .../reference/squigglepy.correlation.html | 614 - .../reference/squigglepy.distributions.html | 1904 --- doc/build/html/reference/squigglepy.html | 616 - .../html/reference/squigglepy.numbers.html | 460 - doc/build/html/reference/squigglepy.rng.html | 496 - .../html/reference/squigglepy.samplers.html | 1161 -- .../html/reference/squigglepy.squigglepy.html | 434 - .../html/reference/squigglepy.tests.html | 438 - .../html/reference/squigglepy.utils.html | 1357 -- .../html/reference/squigglepy.version.html | 450 - doc/build/html/search.html | 397 - doc/build/html/searchindex.js | 1 - doc/build/html/usage.html | 894 -- 103 files changed, 1 insertion(+), 39281 deletions(-) delete mode 100644 doc/build/doctrees/README.doctree delete mode 100644 doc/build/doctrees/environment.pickle delete mode 100644 doc/build/doctrees/examples.doctree delete mode 100644 doc/build/doctrees/index.doctree delete mode 100644 doc/build/doctrees/installation.doctree delete mode 100644 doc/build/doctrees/reference/modules.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.bayes.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.correlation.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.distributions.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.numbers.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.rng.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.samplers.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.squigglepy.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.tests.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.utils.doctree delete mode 100644 doc/build/doctrees/reference/squigglepy.version.doctree delete mode 100644 doc/build/doctrees/usage.doctree delete mode 100644 doc/build/html/.buildinfo delete mode 100644 doc/build/html/README.html delete mode 100644 doc/build/html/_modules/index.html delete mode 100644 doc/build/html/_modules/squigglepy/bayes.html delete mode 100644 doc/build/html/_modules/squigglepy/correlation.html delete mode 100644 doc/build/html/_modules/squigglepy/distributions.html delete mode 100644 doc/build/html/_modules/squigglepy/rng.html delete mode 100644 doc/build/html/_modules/squigglepy/samplers.html delete mode 100644 doc/build/html/_modules/squigglepy/utils.html delete mode 100644 doc/build/html/_sources/README.rst.txt delete mode 100644 doc/build/html/_sources/examples.rst.txt delete mode 100644 doc/build/html/_sources/index.rst.txt delete mode 100644 doc/build/html/_sources/installation.rst.txt delete mode 100644 doc/build/html/_sources/reference/modules.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.bayes.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.correlation.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.distributions.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.numbers.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.rng.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.samplers.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.squigglepy.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.tests.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.utils.rst.txt delete mode 100644 doc/build/html/_sources/reference/squigglepy.version.rst.txt delete mode 100644 doc/build/html/_sources/usage.rst.txt delete mode 100644 doc/build/html/_static/alabaster.css delete mode 100644 doc/build/html/_static/basic.css delete mode 100644 doc/build/html/_static/custom.css delete mode 100644 doc/build/html/_static/doctools.js delete mode 100644 doc/build/html/_static/documentation_options.js delete mode 100644 doc/build/html/_static/file.png delete mode 100644 doc/build/html/_static/jquery.js delete mode 100644 doc/build/html/_static/language_data.js delete mode 100644 doc/build/html/_static/minus.png delete mode 100644 doc/build/html/_static/plus.png delete mode 100644 doc/build/html/_static/pygments.css delete mode 100644 doc/build/html/_static/scripts/bootstrap.js delete mode 100644 doc/build/html/_static/scripts/bootstrap.js.LICENSE.txt delete mode 100644 doc/build/html/_static/scripts/bootstrap.js.map delete mode 100644 doc/build/html/_static/scripts/pydata-sphinx-theme.js delete mode 100644 doc/build/html/_static/scripts/pydata-sphinx-theme.js.map delete mode 100644 doc/build/html/_static/searchtools.js delete mode 100644 doc/build/html/_static/sphinx_highlight.js delete mode 100644 doc/build/html/_static/styles/bootstrap.css delete mode 100644 doc/build/html/_static/styles/bootstrap.css.map delete mode 100644 doc/build/html/_static/styles/pydata-sphinx-theme.css delete mode 100644 doc/build/html/_static/styles/pydata-sphinx-theme.css.map delete mode 100644 doc/build/html/_static/styles/theme.css delete mode 100644 doc/build/html/_static/underscore.js delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/js/all.min.js.LICENSE.txt delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf delete mode 100644 doc/build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 delete mode 100644 doc/build/html/_static/webpack-macros.html delete mode 100644 doc/build/html/examples.html delete mode 100644 doc/build/html/genindex.html delete mode 100644 doc/build/html/index.html delete mode 100644 doc/build/html/installation.html delete mode 100644 doc/build/html/objects.inv delete mode 100644 doc/build/html/py-modindex.html delete mode 100644 doc/build/html/reference/modules.html delete mode 100644 doc/build/html/reference/squigglepy.bayes.html delete mode 100644 doc/build/html/reference/squigglepy.correlation.html delete mode 100644 doc/build/html/reference/squigglepy.distributions.html delete mode 100644 doc/build/html/reference/squigglepy.html delete mode 100644 doc/build/html/reference/squigglepy.numbers.html delete mode 100644 doc/build/html/reference/squigglepy.rng.html delete mode 100644 doc/build/html/reference/squigglepy.samplers.html delete mode 100644 doc/build/html/reference/squigglepy.squigglepy.html delete mode 100644 doc/build/html/reference/squigglepy.tests.html delete mode 100644 doc/build/html/reference/squigglepy.utils.html delete mode 100644 doc/build/html/reference/squigglepy.version.html delete mode 100644 doc/build/html/search.html delete mode 100644 doc/build/html/searchindex.js delete mode 100644 doc/build/html/usage.html diff --git a/.gitignore b/.gitignore index 1c4e86d..e41947a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ build/* dist/* +doc/build/* *.egg-info __pycache__ .ruff_cache diff --git a/doc/build/doctrees/README.doctree b/doc/build/doctrees/README.doctree deleted file mode 100644 index 460644ca272d21b9bdb5ed6a9c882765a2f14d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50071 zcmeHwdyHJyc^^q}`53+=N@5K!Q#Z1jq|T(iBCE6e&_PZX2{vn!te3A_$VeZk?t^{|I0d zMd1cW>n82*`_4U&d*`takrpj40nX0cdmi8U&Ue1^z0P;u9r>B$y&e27ITE!Ru79^= z*Xw>zccN~xuO8IeO~;SB|FApuqusZ=#bkeIuSP*TtU29e2TIf$u2&Bozk8>f9H!#2 z>qVus{@%!`#ctrM>Wz`cp2prg-C|>ZG7`J7=NPY&@{Kpz?&6~7v^wXl%gvVOP~SGS zUOWD{9z{hmt+%Xs;%_ zJ=b@-SKC!PDcErwy47|JED=^7a_bRcU~kQ{qX-Z2eZ;q$;@iG@yQP0r?b>qaEKr$t zvNyID=~cIJr16o)!NwDfhZ;{N=O!CL)0u46-P*F_N0Y5ESPboEG#M!bO#(*z=9!qh z{``eYbI+H;2=IUO%C2@5IN6T@*{IcO7%0AVYS)e(^9qrlY{YRZIzKtNy1H7DZBKZ% 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 diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle deleted file mode 100644 index 8945c72dd012e574ee5b7bf717599676ac920a65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1521208 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≥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

  • d4tUWmmWb>q6}jsuqbIgfke~^ZqjWPZVrN6 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 HjSl|?%<%5+ diff --git a/doc/build/doctrees/reference/modules.doctree b/doc/build/doctrees/reference/modules.doctree deleted file mode 100644 index 3487ee1a2c5c282fd28a82e4c794292be34a65b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2791 zcmZWrTWcIQ6n1RydUw6Mz9cDy#4VxZMq_U&eJFh@9cW}+$lNd$-^DOa>P|>|(VRc9EOSDu_BikGEB)+X@5w-i!HMvhp@2Ehz2(#umx@#@?q`$I>k+JiEwGLZ7su^1aY)BD@Ow zQYaR${FH_PbeQ zBmRgF`D4Dv&%)~o*9DstxyY`WvXj#2xuJ!ftdg1_#z`I81lAaW&u~KLUNU=OEHe4( za@S9hcQ4aLslCeA@TsBWI|x8$&aidtn!T@)7=HrfzQOM)e$VlHiQl7e@;{GA9q1WR zC43bgtQ1xu$G;*CL!mP1b2bx*6AHL*j_GUtSvqgzkf_L~{490Pem z_YIXEMQi)FtGz3|i&y;UD)i?}F+-g;5sRFnH5@HUEDmdj1YWMO95hRBBvvD!PEt#x zT{!NflHJB|I@8)I?bzDp<-IUUQvfw5igk)?%yOMz8X}DOJd{j%AWR-;62*=5? zG2yW}&~)lm7#db;Ui~4H|~g z0+K#Tl(Cdl{5y<=0!9SwsdH$>(D!b3{^Pk7_

    (NtiL(5KdJtK|qupxn(YfqZ;Wo zE1k+p3};(ATPFCQVO$$s1+YB&cynXxWH?R=ZDiLckpTnOf7m5+3}a92n;>pMC{3*~7#_re(nS&+6j z+XRR$6GQI8vAtD}E(jNMF7X3-_oYs}AKHSV%ieo5wFOZ3t9893QfIWj5W-o;DdIul z>t+MW6@)l_?Mt{wPlIaGH$wo|0whAsz=7pdI8AfH`stRQC=z+4rgbZ(8~r+hGq^)? z^zSV~;EXvqd6+@#ny`WjN$`p>n6g#aC(SzqWRSzS_sb!$PbdR{^oD_8yosb z;BHGq_%ZUgca}fF|2KSS!)U!&)#*_tQ1av+7HdiB$)#Q$=DMWTL+~hWG1aoIf2I0h zOW11nH!Sv-UaLc=8}>0aE%%P9){IaNb?XVpj8{)%OT$Svwd0&7c^Hi-to@QG!2GVWqrx*VLAM9Gc diff --git a/doc/build/doctrees/reference/squigglepy.bayes.doctree b/doc/build/doctrees/reference/squigglepy.bayes.doctree deleted file mode 100644 index 9ebd35876238834abe56b868917ae4a0e334f6e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57815 zcmeHw3zQ^RdEUO}xwB76DWM}4Goku#;$wbRJ7lrLs#qA{PP@>}b^=iuvIuCb}tyDbr>(RWZ zKNh)_*bjrWx;NsDdSefFroD+|B=+OFt7RpZM`zmp(o)@RF3&GG%WhO^gw;06P!-hJ zbkaRfr1UQMXopid+H^ou-0^lK6XmoK-o|89(0(G>RQCh7bE3WAB$G}YxBP{6j5bpn zH~Q6x+A~(EJ5hv0{2mFM2LCl)Z8z1&f>Sx&au=ygI~j|eCCch}+q|p1DevXpMsIiW zhW%dHaQ8Q=e&w_qMEjeqaH-`qqW!A5`$6M=PTGDzb3uH?)$%zz=35b(boJdE+6&&g zWW*1u?s<)WoVDIHXo9x~47(Qp?ZtoB;lCMb4mi^CStF*CO-;vdb&{8H4*#8!qJ`rE zlX=#@t{iXlMBH)O-u2!-)yfmz)!-$BGy&E-XkXLQNK0-$>G@KeQOOS~^)@uDwAc=q zg5X!!D!qne?mGeU1q5wgtH(PGxw$8d8V!#_Ejoxk#47+<1Xr1RCK$>t*2AX;{ z8i5rs;pCOhSr>}oPS2F4{XkfD7lUS?l8UQB?M2OwP4U(xo1jn?P3NSiSqHy_oO0yD zHsf~7a5=Y2s+ui7Y|WM2vwoFqZ?1IC^_RRjI`+_k`9pIh{CRk;)N<=i?4NbZGV??j zxHC*7)3C@XhKJlI`2guMAU}Af%zrf;nLDLbDw7rRP!x}eGQ1^FJ^8KZ{V#>-{WjC89Zai8l3^2`E)H9| z)Yl)ADDg`n`$2DH$@;KcivI(`A#@YTs2{KqjHbAgnTEr(^rRGPZQc5H>nw=jOctGX zJuaVh>TTB~BDo}LH=AKAE=LWg6`yH`G-|p)8uouVZSD{nc3G}x?ULU1Y%$5x?hMt~ zE3J*qSHapYR05lyOI1Bzezj>k@aMbq8v>NTUr2#(qJBiSg?}jeZ?dAOZAP|%#V#R% zd|)Bj3no`IpeKHrG_jm|JAA^UGM)GsbVBqw(gA}$KF`2le*UcQo~vN8(Mh(+pJgYg zc!u%x8`w@@$Q(PZB{%LQSCsj%)fio~!5PNzDCbu@-ushL{K9yulU&(*v`qt{+M9{_ zX%qO^QDaHq&?p--2AF*(nWTOxT&Q8v(=mGBWK>LKlI_`%0H|W!HU>Az_+qiM^%w{N+_k9y`>@vf~Y;BCySRV&^TV&nLEAcT&B@AMH8Yc&F z)84JA5?*;5AE1@ub783p39=~>W^YkC3bz$e3VYtFu-Sfz#@cH>8rcA=YYVcN_nchx z-FlTPs`8+6$cV`)%hw#Z$`Vzx-Sy;~ImaHc!_B>gHJ+*&GrLU^JkN&s2_89%| z>buD`O(cSlg|ND;5&FP}4eQp;&ay$q>}=^s>9v|DCrkKu(sMDrz;M@)^8DoF?5ynQ zdsoyIqtvGPNgS4hB9_kiu~&*Ecm`4QuM8l$g%Z#P&3UKQa+c}$Vm)+XM%L@YbEQVR z;)#(r!ELrtJ}8|!#mGH%sss&<+7S{Yp-4ODxq+YnQ;l0ocP=t;VNeHxz?I-I{cO@~ zzBxP@9p&wXnTlm&|WaQ3JuJ8G_np@V~U5yT|6{h#`es z9M|F6KhZHv=@>+TFWCz~ztt>Dad#ZPT-QuHtAvVgLZz&VQ<@IQ&PY?mH$zhE7|hz& zjaC#<>uWLu*jpmhny{v7UHh(vyi1i26qTIR@!}Pgcn%b4l&<{5(tV7jc0LH@=iIl; z%v63tkf;1Vn4KN0M_$F=c-4C1A$s9F^W3cQAkR9x@@a{xYn`BWUlHNggl(Q+LN~h~ zN*mTTw?oc%F_@-pUeR-`CH3A?LMgbPA!fJ`00j>65|No(8T#KM4SN3j?TJ)*C zHN#bmlE&&7a|hN>9|+QtZNAL3mHgu`MjG-U&YW<|B#H!@wA1u+Rvj>+ILRr zBX3DnUdQ#zD%&^0$KX=fD-)+9r+Ygv;kfZG~PlT|T*jJePlV zcDDaSWK||1m;|L$BR&C{HU~zR=8?jUr)CV0dKZM++7|o%Wg)#2PWhiRv6xPo(uQ@) zmqHT1%V3&Lc}hBEeYwv}RIc}%83OF4EnF{Q9nkgOyXqpB{$LFtE4KVa5w_^|cL{{@ zXG|z|P73?u@+)G0Bz10o_FA9BFcw9B4gc%s3!dUdY4NAu+$W);>D*@o2rf_xTL!GX z7eA#B7YkXn_iJg%*nKW`MuT+aD*aZBzhWZ?=j|R~2VE{(?V?I4RcJ)*<2qVbpFyxS zjN3{L|2%EdnzJyzD9pW3_Lt~ctupLpSMtCbw0X7yaF2WYSvIYPlQ9{%43C| z8IX|5T|WQ<;SjGIpr~+&Qq0$B&C;{9_2CLC9UJF@13E(99&# zV;U#1FF zRVBpQ9($crk5IqiHY!fVbB~>DwYASOw$G~Bv|5SF0Gq9ye4sOQpgmHOCe=Xq^%uSSv`nD##6{c3L85Y48wt+tN9 zZ~~r63HV=sJM~VCHC4>o7K0BWTg8E4&5E0+?AcU;lGEi@IrWGfx&)P=5`80w_S%8x zM-B<#14a(rXhl&ta)=}EJ$8~NhycRcHqHelkBxAET~a`tq8K&dm*V>ytaSI_`|CNz zzI=bs4m_Xl0=VM)dfpgJZtzP{?pc8s<~T0enCSecg(pu!K1BAtkic9CLLE2eE}>OeW=`r6`g7rL{>tMDk|?isZ+3;Q1mE zzy}n`*obXNQdlG$`H&)^BW8S9*(HsQ$dYnkzm)_^))w@Tz{^o-kj{GE4m@810=SaE z2pfP)`o))O!BH!c!ZP6Khm^q13bd){JgPY;RQJD@}=cHsFE5x|v1 zHqmTKwt;^r`p;NV6qW}^KBPQ$N`|WmUzbo)nXxjmRhd-PynkSAUJvm+HlTPuXa}Az z9sztn@qEIHqOf>4@)e6GoqJovLuIYUIytB&y-$9O2|4WqWc*vl7=0Ir17r?c5^MN(Ki z9Q}~uxioJ@s!KrIGNq)9y3&=HW~`0uA*Q{kG{~6XW;^hFF$v&GOxCH)9aa>Dg~X8$ zE2O*y!fqjDN~J=|rYj-+J!>O-2vA3d@6|A5tE;j)CoCbV*`_Wk@-QFC~S) zwzi>%6n;FQ6gH0yF(44Yl@xj`SzciUUYPqFZ4vI<%hvA2rkXrTn!o!|JBcE414JAQ z=y?fB!Ly>ZjaYk0kBin8fJq$-)yT=746S`1drDSLfOziWqPVEfUoRm9F)9LZgbVmpa@P8@xz!2{fqqxZ){n+R3+nsu) zje9NJlA~^5!7k{zuyr~;`PrwGGK71q>Xdi*bM3e2==A4Zf-a2gZk5bP9=xqy56?xV z<*-fBWV9+?(iUUs5|#yL!AER1uFawQTq^A-4jTxsz~)g@T5#z6V;D@fTsrfMBX*^T zf&U?1v)tz~v$)nc24s#b&tWoP9}cMxt?laVV=?>3wm;TyQlNjMD# zmX1?!%|&Y^8xY4z4HWH{B(g=l9(2;=ilZzow&0&gBq^oyIPi_b&ytQ9py_P!sZ$d2 zsZ(4s5##H8>2``UNz1R8Zd%vsK{sWksziE0SAR(cGZtPX;`Ozl9<)2ba>+f96YXRc zTu~&8anTe;kyREu+H$3KxK&-kY%4&BIJ2<95aL9%;Y6VIO}e2gh+)}uApBelCx%L- z)Ff?A05h!xm=@_LLVK9rBcGjp$I*N`pU-3s#L<~LtArEuPP6IaE;)9TpMbHdbiVu?WjtSsn%#gvch@N)z_u92!F2AYsMVC6QEdjzfWz)2 zIOj)hswnJY0j4TU6k;~m)hLdK!9tW4x)@T6D2C&utL5OO0}N{#xJ`k%XgFSW1tG4N zV^G=5hQXBG9+VByYOQv_sygtbbcY*YfGhi{GF?qKkDC@s@bADv&4=xx4x<4T38jPU z9B?^|C=L)@vhd?lFVR6Y$c`8V3bG5j*i0)YXn)#_+P|Y$-+!Cxi`n4;YroHDd*)ds zc8FV!DntR}j8b<2I#MV7xfT@i-a^A3aVF^kDq*Z@+*3eldKhu$2^*lKBKw6R zWb2AaEcyv!k-eotF*!GjC?+AuQ_Q>Ulb<3JpFE`0TVP`k)JhSLk3jp)v|0TwHJCB4xaVZrsC_<2DP#>lX0YrQyn}Kw@#Yx8H)mVNiw)B)|gIf%8^UN=& z1S~H%Wb_L~q$Q2+vrI~+(NWs4Mt3;`^BD$nm5lCd8Di`TC5(UL1AcvW6&Y zFCKnv0`^RXtL8E2&Dxr&^eSUw6;%WBrx_r2(TJnagqa3JiE-#SOOMqT=$?ko;eLyO zv||^ZhO4F(dd-|ekwWKrng?LI`bsj^F8Hd+N>`Ed{KS|*mggaiJn%IW#=K*~G-f-S z#He)(DrHBlls2qaxDrg9U@%Ruu!$DorH1hj)%#3m5ZWmhmQPp)wEWkvmdIoSRu7xJ&<%rFeiLK4oo~W0xO9pb1|i5Z40OSABS5VyrmW_xowRx>cYM?;CM|pR+X0d5 zn?vm)~7gDA9B}DI+MJG-}hv|*ySWTT*A#d+{tto zpfoUP<8tdzl9fHv@X-~KWQ+l_OtLy7-PP@e&cBnj(#{a!>bQAWp=ZVbWK?;s?zfch z$n2)38pgJ%xYHYMCspkFtjaE`aBs%lvOBukAW9i~6Fo}7n0g)u`TatgAqE~_5z4CH zrc7zWxSdA!X7i+}y~U`{_t|#F_VwAjS45KG zv$K>~y{hiB_rNfpV=}TcMEGoO!&c}SpG}sZ=d(Yr`8zX`Bvt#>i6SYYcKyP3`Z;di zkbaI^D`hxtO4l^@&O+)T9QPfll$|kB+OUqBE?T;c!7SjoPh}9=RZBQ-!ZM)a{_smz zMN;qmnw8V2>B5-|M~8Ib%Na0s!3Y;lxL4-F`%*9cwcUlkXGPTKyKp;ceO>rRS45KG z!n2fEoviM{_rgR2CL_Bzg$w7_Y=xe2;p7AIT)0oG<}|S8mrmuZGOSiCU7p|Fp2eQ$ zcJm9t>-IVT`ul|hDo4wV`{v@oS2BR?3>SBLig=M3F#Puz%mPmLI~jy_Wssv~s>Fk^ z`^ECSDRpS8B-PYazHW6OYwq%g8D5y~61R(rC{0EJw4v+Dh974D*qJHEx~Rk)rD4}u zTC9qo+cjyya}1;%yBwOaqE_e`yCwvAcKw0b*?y6$kXRZ;$(90#j#?c!3^dONT#`d+ zo*U>{4zjl#Gv2$|95~tKAe_M-RLYLPC~epg*gi;UH-l+9gUwnbvD9NDO)Xv@&7ilp zL%0UQIiPE3z4+?Dr3~@iwR*TU2Xaq_W2OVyVkoU-{zMwjtO0sU29TZg!jTYm=18ux zgm7y}vea6gfbL@Epj&q_WOllQi{WZ$g`ROSq`Y}9=Hs)oYT&>EyV>YLQ|ZYrxvnJi ze2B1f;YW-`I{1+;vPC&#nXYF!@;4a>njGI%NLhrxc|<6SzEnqP!}^M$n10pPsA0}3O(bANUifc(bEXOqjOO`PM1KyD>_-SdZ$X{jw?HvVn0!m=el;~ zw=>Us*^0t}*{_j!rjVKmANEb5X1Wifv|)YNO%V1UGnl3iv&K36RR*D55rx+xECYJ2 z&;L!-C8i$``rl0A)ev}O%G4&SaCOJ@DyY&1RPOhri*QU_>xwug($zf2bnonJ*Re2Y z&>~>UKcPeFI~zokPM7xEzYu0U^k_>zbJ}MZ_ZQr@_Qw+7G1-Yd^;z0iVG% z?Z+uXayKaa+lW+`ZJ@2@9^AAXA3dc+$^~pvVMjsw*3LL+g996?%UzM zx0;}|+4_$%4e6S#Yf_c`$UQ{zdP3Quh@yOUyM zY|rZJz$6VEih1>l2sAcova++fG2OMk1{(MS#(Fz@glpx>YK5LzyC4<+)&K~EYyHLm zMTKi62UX0q-fFm3dn?3)Yj+7xEZ=~teR!j~xNNY8)*dV*X7SLP!Ygl?IsxlQZwY(g zdAu5WEpEjLD!Ayv<J{_;oCpyB#HE=dl#hQ+JWzLF{ua8ANadDXBJaTbfx|b6V&ak~I(;&Yr|$SYT=WYU za|L0$UiYV)Gc)wOoy5zp`zW(+Z#qRMn9Lr<%L4+O2N@WmjU%0Y+jW|-t~+A1NVH~7 zkV&=Z-*r44h53(1BxUTvvGkd-X`RR{41z-kh>z8s#zNI8xkpOwLlW@Ad8O0Kz4(h_ zMm@a=xs~xc&+I)jlVHHjH{WpM;lqb+x#hs28xI}2QNDBYz$A?Er&ho&1Ej0k{ihI!T4)w-NadwCm40UbU(v5WoGlI z7|ldwz+X&h&3oD0{v4xfXYC6FCi@)Y-ho6WW{m2!yeYjJpK+2PtSL*po{9xp zUPh7mlVQmG--XFEovXgcMWQk9%+6KOHN7+YchH`mcV;Vcy6(*WN2s^*JF^KpzcYJg zD}K?Zyfb^N?iRFrv!&^xL;e_w)518`;OzHiU#9NOevPw?8--i#x|?46+#^>h%6`zM zFTh)u1ZdRoBKc9eD|=4Rrq64W=NiJ3`J6SGO&g<8iwqnOy@(n!pokwu_rqA9YJ^Pp;aj%JR#UMkcmc^)q+&)PAn z!EfMJ3}53LxbG`MrCgnUBURch>Frvb{t<%R(v^;~$M)YA5xk~u&{o-{X})T}uH>Yp z1#h`YF)9%hfEF9D>Ot!qr?INQ6oc+)R<-#s$Bsb4&w@rz#K0@)&`|=<)G7xiOV^h^ zWKC3KokGsSdFFCb+&Q8VuXE<4xja;qD-3^T`5Z?WOk|>v5pbAa2uszyh7VyOg%M#o zr%{R4m-R3mO4I#a?;cFMyHuFS6nxSWgK2I!jxaUjJv91a{-sRvu?$M9iE0L$PmX!ffw(@L|#_G00%>B=dxpw{tTj6pjVk?9o&sJ{e?yHEQ zefz0QKY=I{(dFeSekPYcV$n1z+a~hV*9t}D+$^G~gn%omy_VQ+JjKLi z*OsSv2SX#yert~+l0$Sb6QJb{Bqu&~Ta8GL2a7OXj+O7HO1;O*x0nNC7002bkm)cJ zlPwvjG1+s(X?CZt;^0XM3xdu#i9S6=RERYq4ns()1WAQVE$wj_uNb5i(w+t@tc>ax ziZnnsD!N|qU5t9WA`7G94YiwxIZ`6_)CWKyjLI9Js4yy0&09HU)wWB0*B(k(^` z8_83_!#9ad<(qCieDk4$hYsCv^Wj4WUM1}Ir(zi{v|`P~qCDi6i&&xVAzuNfA+2$Z zb~V2a+6LX#l%%LmdA^?$6uX*oB^Wj3`f#@9AiJ912eEut^DpQZ+tp;hF4C^%-gdK! zaH78ZnU{C%XYz`}?qtpiyv&Ep;R!{*>LM0M{VJbx{Ut9xc5u};FgI?u^(6KU%okGq zPaay64NS>RzGL`A`X=S5%;1}r@>5yn&OWXBi1(|;L!)xD?tL&!)vDSK0+ZdY{F(mJ z;j>0-X~#*<%jZ%ZU4KlX!Y>7U(GEQS zwP*pn?>oh@6?oxyiaFZeW7=+AvX?dYTyyPgP4`?c1$%n#xhitH_FSKbpIiB!D`Dq* zt{*qMl_i@WuxJ9>={M2Xh84R`oW^xqTZC= zmTkH%+|1peM-Dmb=O!`A#3LINrOd*0`QEDmP`w)}eTtEtGWsP+o09Tx7nO4Di&TT} z!YW~`@hPAOh);$6x&QZ9o>-%*L)$)v5-Wfu=lwwukc z72};#+EH=c#t!+-%Ao8Xa$ zh<3aa3@m5b{#mCE=@5Ft%Y)VhO#?rY`R<;IaWdUN(CO*R^IWB{Dg+<9m@jN*_8O*Z z##VJEH*Y86&kNa+*opWaDrGmPDNXMjdUy5O=Ctq}o8iX4!(f^_5mUO(%i)rlsQlIo z83OEUUSeN@unLdRZ>!pSu>>s}`r;u}Ox(W1l%kc1Y{^21klse!g37kJg|<_|rES*{ zv8b!*$TM6=J_A3Uj-x+lbCV=8-6~h$A`836Jac95-SUai?5rqYSZsFz7_FLJDM8&( zL{M^*e4Yu&+(D$YVeOW-S!Wr{71-^a83L>-CqqmK>wtFqwu`6)(v&YM4N7SqEW&Et zy0=2m_cKA;r6aa%xK0$YZqlSY>;7lTy1U01t3JM1ld(l+TM+lv$zfgEqC8K~vm6|P zWpU!|MMNz9!g(fI(=SlkuzrD_DvTLS(=YVd5`8j*(ynWw2PZrOdV-I=)D=d$imVoG9{v+yZgpNjYt(n9W2?6t%;@Hg4u!cNOmJhp=7k=cC={QvGO$e&BXaB;%1A)5by6Np@7j3ie3q(LCO<3t~5@c9PM*>(twB)OoVQS0Iwn zupKwsap#1$?L;!M^X~P@mdLHdLAy~tPn#4Sq->@AoMyQaHX5iJ0pwLY z#jU$6rA*r(=TXxm?F}A7I~xWYTl$>E}qY!#(fEWwa)4N3zgJ zGE#LH+Dm}9^_^VWT?zX^jBDE5Cl5L#R8k7+RrIYN=a^pqtdf!qKGbUqdkrF0K`@pj;4Vho(t;~z0ER!Jz?7TBuacUP z+pdP?^9@p|?e2M;5Om9WO{OK4xO~>fB|1z+x0S1Y(umnY{`wc(t+_U|< zWNXuHmcbOh_ePDGqLc*(w3BfpFZ1HK86DZbAIZ^tb2;{~XBoDZ_IHxYs3ao*CCjmk zC_7kOCmBcjzP$%t1%7UAEmkt%DMf*Qr34RSbx37TyRCWOjTadXIDq|L+^7TDMC>fU zimI{KxqCd>4V`S1Q}aw4P>!0UAs3SE(Q*(w=gS`Aaq1M4(@8efLsI>zsDZ7?@|ia5 zIs&6EVc+}{Pio=}Cz8S1-4)LPJrF#%H*lG;5VcRYn?SJ@)Wv=b{&PQY0ooH{hjI}* zARWU_aurc~Aydw8kn+;)_{;A{ssKPBVboxpyfinxNuhjGMZ?8z>BlKgP$7zE13~*tK`{Y_gHnH0n z&^b==`Jxwi=W5@_?Hsk|=ntLouF)Cr8buzkfTVV^MOQ|~oh=m~Dor8+$9M|)99fQw zK~Lf3ARH)fVar{>k%L|v9Q$srjF4_-kc^gmE7zHm3q5MCa^@> PI9Vm%E!-UE`TYL_Ssr4F diff --git a/doc/build/doctrees/reference/squigglepy.correlation.doctree b/doc/build/doctrees/reference/squigglepy.correlation.doctree deleted file mode 100644 index f5a1114e38a425507a291892d4538547bb5458e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61358 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 s$i9befnd*8l(j diff --git a/doc/build/doctrees/reference/squigglepy.distributions.doctree b/doc/build/doctrees/reference/squigglepy.distributions.doctree deleted file mode 100644 index 6dd67cdb73a0c89805725d4e7db834c1a5230a73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390640 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

    SIeR$5AXTY;P`Wucjc#PtNzs)d3LGB*OXERM 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 TXsEMjGyQoSVaOSCoyh)ww{tn{ diff --git a/doc/build/doctrees/reference/squigglepy.squigglepy.doctree b/doc/build/doctrees/reference/squigglepy.squigglepy.doctree deleted file mode 100644 index c704ca0881c3d61b25c5025f45cf71c5d9195c39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5627 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 L#-)!K>FD@>YDLSF diff --git a/doc/build/doctrees/reference/squigglepy.utils.doctree b/doc/build/doctrees/reference/squigglepy.utils.doctree deleted file mode 100644 index 93bf9e9769ed2039bfd2b45e89584921e18f2c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219063 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

    ^D?0La;a?ja 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
    ZKBEMCs|QlXT}Otl&D@$&yl1PFOi@=8FqU); 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 GiT@uzAl$bA diff --git a/doc/build/doctrees/reference/squigglepy.doctree b/doc/build/doctrees/reference/squigglepy.doctree deleted file mode 100644 index 5864f8f532f0557054590f8cc31166c3343886a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3886 zcmcInQEwx+5%!%eS(0tpzT5>t@0{8V(l|(L&{`uD7R{gVw zx@5eVUy?K}WJN+s0UEodZ+i&W9Vedg@gs~ax# zWwU=*)5LIDblX{v_1W%c?wk#6&u}B?%94Gczo>YY30f{rOOjlXj5@Ck<(*II+z4$c7{`w7FzQ@q+qU0$JheN57t~FwnAj09M)9~Zh}1{6%~S28*i8h{8bUnx z3X+GXL0Xl|ml)nDI`cY}-8CfhOO73~$84WHVcYD){$;{sPA7TFlPg;2NvUL}NUkT# zASdu~5?q_W8in%-U0J_W8o|8z{C*X)E!*QoO6M#23aMnjhx6L z$c5sy`{#D2BwQhVxlAiTKR#W0;p}k`UaZJie`*}5*n8|^8Pk-#iOk_Pb`zPe!GiVd zQ3q*K&b{1~&_5Z9BZV{*bS;yqJqZ-b0@l*pI0N|ihR8w_L zo%i%lOHb{K{~`O!a3@j33vQz5vRpic%NltrvQs%*O%pC+8`1BDLRcdCs1?}J->W#J zQnwMWiW->0%TEJFLOy>xRv(my)Qh0b-iHgL`T_>HfKpaP`tNYq0v=^z6kRQ?{{j{E z*go6@z;z5w?e8`zUB+YqkbUo__H^TVB9)?o)I{L5{;*Lipp zG~U>#p^B{b=49ilCV44Z1DgY?IjlCZ*@bIt_pJ84qjsMciKtRK<04cVtJn=&urJw5 z_7(eveM{{iC-an+hPmfEC>>JPnE)4MLdNda_8Cu8FzBs4XpD7&L5P;7?)jD-)r6^K zAr{abfrys{?xB*glNuuXfJ_R8TdN^^*r4L#Mv=0l%8^yF@cZL+sG-zpXTpy365FJu znmf{lc)YCnkkl_@LZrtENPhZ!xXB1S4y$S@`7N(M;9%U(Dz!YNmH9W}3& z5_mhntwz2Z`Bfa;^N?78=VwxyLK?cV`23zd@C_N5ismz^atF!SS6vx3gsx%oagb0! zJ;m$jh8q^OJrO518=59Lwfl;eQkh85Yl`&Uwh30sEvc4EmrKE}&DNlWx?LRzQe+jT z8l*c#`?`;!x34J*f=nYY1Ym+=e8-;JejZg+l#2RhgFj-tml}(&|fG(*!Lq-u~c2hNWFB?3*#!`Vf#%j8=|y44JYqa!0)K#aM@WzReVr3j*%uXxS|d@f)$ido z5;7s7|Jaj+5%`1a3&n;k*D1vAtExof@Kbu-Ng5JB+ku1^Ghm=)g$JG|!1#Ccc<#X~ zBnhSHhv_Q^%%CHusNV%#V3Zmh@+g7URYY^bMT8Fu%xQk4er1oFPXd5d%mSy~+HG1~ z`=Q(p0+*n80Y%Ka9K~TGLsUjhJ&+&6DL~8AV*+4?5&Wh9C|H$-F&$!9n{_XJUqYDh zA>Z}F@O;jGVL!8<*pHPRdZ}5IaMMrJzudB)ZYy@?pMOR#dxp8UA3W(Oyd46&Hp!lK zy|L|9nA&*lnU45T diff --git a/doc/build/doctrees/reference/squigglepy.numbers.doctree b/doc/build/doctrees/reference/squigglepy.numbers.doctree deleted file mode 100644 index 1748e4356048c693dc07c32f32266c1858ffa6f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3110 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 diff --git a/doc/build/doctrees/reference/squigglepy.samplers.doctree b/doc/build/doctrees/reference/squigglepy.samplers.doctree deleted file mode 100644 index 6aa49f8587d54138219a4d254b4dc1604cb34e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176788 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

  • (R!DSaWaLW7)){AW_6|;RtClh6nq%tepgFX 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 N5)ccM6qcvC{{f~1R2~2T diff --git a/doc/build/doctrees/reference/squigglepy.version.doctree b/doc/build/doctrees/reference/squigglepy.version.doctree deleted file mode 100644 index 351088f9d8f959c6e4125752965adde0b7ae54ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3110 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 diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo deleted file mode 100644 index 67b86aa..0000000 --- a/doc/build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: de91ded5cec9d4685caf230095b3197b -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/html/README.html b/doc/build/html/README.html deleted file mode 100644 index 5a57e12..0000000 --- a/doc/build/html/README.html +++ /dev/null @@ -1,893 +0,0 @@ - - - - - - - - - - - Squigglepy: Implementation of Squiggle in Python — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    Squigglepy: Implementation of Squiggle in Python#

    -

    Squiggle is a “simple -programming language for intuitive probabilistic estimation”. It serves -as its own standalone programming language with its own syntax, but it -is implemented in JavaScript. I like the features of Squiggle and intend -to use it frequently, but I also sometimes want to use similar -functionalities in Python, especially alongside other Python statistical -programming packages like Numpy, Pandas, and Matplotlib. The -squigglepy package here implements many Squiggle-like -functionalities in Python.

    -
    -

    Installation#

    -
    pip install squigglepy
    -
    -
    -

    For plotting support, you can also use the plots extra:

    -
    pip install squigglepy[plots]
    -
    -
    -
    -
    -

    Usage#

    -
    -

    Piano Tuners Example#

    -

    Here’s the Squigglepy implementation of the example from Squiggle -Docs:

    -
    import squigglepy as sq
    -import numpy as np
    -import matplotlib.pyplot as plt
    -from squigglepy.numbers import K, M
    -from pprint import pprint
    -
    -pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)  # This means that you're 90% confident the value is between 8.1 and 8.4 Million.
    -pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01  # We assume there are almost no people with multiple pianos
    -pianos_per_piano_tuner = sq.to(2*K, 50*K)
    -piano_tuners_per_piano = 1 / pianos_per_piano_tuner
    -total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano
    -samples = total_tuners_in_2022 @ 1000  # Note: `@ 1000` is shorthand to get 1000 samples
    -
    -# Get mean and SD
    -print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2),
    -                                round(np.std(samples), 2)))
    -
    -# Get percentiles
    -pprint(sq.get_percentiles(samples, digits=0))
    -
    -# Histogram
    -plt.hist(samples, bins=200)
    -plt.show()
    -
    -# Shorter histogram
    -total_tuners_in_2022.plot()
    -
    -
    -

    And the version from the Squiggle doc that incorporates time:

    -
    import squigglepy as sq
    -from squigglepy.numbers import K, M
    -
    -pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)
    -pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01
    -pianos_per_piano_tuner = sq.to(2*K, 50*K)
    -piano_tuners_per_piano = 1 / pianos_per_piano_tuner
    -
    -def pop_at_time(t):  # t = Time in years after 2022
    -    avg_yearly_pct_change = sq.to(-0.01, 0.05)  # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year
    -    return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t)
    -
    -def total_tuners_at_time(t):
    -    return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano
    -
    -# Get total piano tuners at 2030
    -sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000)
    -
    -
    -

    WARNING: Be careful about dividing by K, M, etc. 1/2*K = -500 in Python. Use 1/(2*K) instead to get the expected outcome.

    -

    WARNING: Be careful about using K to get sample counts. Use -sq.norm(2, 3) @ (2*K)sq.norm(2, 3) @ 2*K will return only -two samples, multiplied by 1000.

    -
    -
    -

    Distributions#

    -
    import squigglepy as sq
    -
    -# Normal distribution
    -sq.norm(1, 3)  # 90% interval from 1 to 3
    -
    -# Distribution can be sampled with mean and sd too
    -sq.norm(mean=0, sd=1)
    -
    -# Shorthand to get one sample
    -~sq.norm(1, 3)
    -
    -# Shorthand to get more than one sample
    -sq.norm(1, 3) @ 100
    -
    -# Longhand version to get more than one sample
    -sq.sample(sq.norm(1, 3), n=100)
    -
    -# Nice progress reporter
    -sq.sample(sq.norm(1, 3), n=1000, verbose=True)
    -
    -# Other distributions exist
    -sq.lognorm(1, 10)
    -sq.tdist(1, 10, t=5)
    -sq.triangular(1, 2, 3)
    -sq.pert(1, 2, 3, lam=2)
    -sq.binomial(p=0.5, n=5)
    -sq.beta(a=1, b=2)
    -sq.bernoulli(p=0.5)
    -sq.poisson(10)
    -sq.chisquare(2)
    -sq.gamma(3, 2)
    -sq.pareto(1)
    -sq.exponential(scale=1)
    -sq.geometric(p=0.5)
    -
    -# Discrete sampling
    -sq.discrete({'A': 0.1, 'B': 0.9})
    -
    -# Can return integers
    -sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15})
    -
    -# Alternate format (also can be used to return more complex objects)
    -sq.discrete([[0.1,  0],
    -             [0.3,  1],
    -             [0.3,  2],
    -             [0.15, 3],
    -             [0.15, 4]])
    -
    -sq.discrete([0, 1, 2]) # No weights assumes equal weights
    -
    -# You can mix distributions together
    -sq.mixture([sq.norm(1, 3),
    -            sq.norm(4, 10),
    -            sq.lognorm(1, 10)],  # Distributions to mix
    -           [0.3, 0.3, 0.4])     # These are the weights on each distribution
    -
    -# This is equivalent to the above, just a different way of doing the notation
    -sq.mixture([[0.3, sq.norm(1,3)],
    -            [0.3, sq.norm(4,10)],
    -            [0.4, sq.lognorm(1,10)]])
    -
    -# Make a zero-inflated distribution
    -# 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`.
    -sq.zero_inflated(0.6, sq.norm(1, 2))
    -
    -
    -
    -
    -

    Additional Features#

    -
    import squigglepy as sq
    -
    -# You can add and subtract distributions
    -(sq.norm(1,3) + sq.norm(4,5)) @ 100
    -(sq.norm(1,3) - sq.norm(4,5)) @ 100
    -(sq.norm(1,3) * sq.norm(4,5)) @ 100
    -(sq.norm(1,3) / sq.norm(4,5)) @ 100
    -
    -# You can also do math with numbers
    -~((sq.norm(sd=5) + 2) * 2)
    -~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10)
    -
    -# You can change the CI from 90% (default) to 80%
    -sq.norm(1, 3, credibility=80)
    -
    -# You can clip
    -sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5.
    -
    -# You can also clip with a function, and use pipes
    -sq.norm(0, 3) >> sq.clip(0, 5)
    -
    -# You can correlate continuous distributions
    -a, b = sq.uniform(-1, 1), sq.to(0, 3)
    -a, b = sq.correlate((a, b), 0.5)  # Correlate a and b with a correlation of 0.5
    -# You can even pass your own correlation matrix!
    -a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]])
    -
    -
    -
    -

    Example: Rolling a Die#

    -

    An example of how to use distributions to build tools:

    -
    import squigglepy as sq
    -
    -def roll_die(sides, n=1):
    -    return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None
    -
    -roll_die(sides=6, n=10)
    -# [2, 6, 5, 2, 6, 2, 3, 1, 5, 2]
    -
    -
    -

    This is already included standard in the utils of this package. Use -sq.roll_die.

    -
    -
    -
    -

    Bayesian inference#

    -

    1% of women at age forty who participate in routine screening have -breast cancer. 80% of women with breast cancer will get positive -mammographies. 9.6% of women without breast cancer will also get -positive mammographies.

    -

    A woman in this age group had a positive mammography in a routine -screening. What is the probability that she actually has breast cancer?

    -

    We can approximate the answer with a Bayesian network (uses rejection -sampling):

    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import M
    -
    -def mammography(has_cancer):
    -    return sq.event(0.8 if has_cancer else 0.096)
    -
    -def define_event():
    -    cancer = ~sq.bernoulli(0.01)
    -    return({'mammography': mammography(cancer),
    -            'cancer': cancer})
    -
    -bayes.bayesnet(define_event,
    -               find=lambda e: e['cancer'],
    -               conditional_on=lambda e: e['mammography'],
    -               n=1*M)
    -# 0.07723995880535531
    -
    -
    -

    Or if we have the information immediately on hand, we can directly -calculate it. Though this doesn’t work for very complex stuff.

    -
    from squigglepy import bayes
    -bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096)
    -# 0.07763975155279504
    -
    -
    -

    You can also make distributions and update them:

    -
    import matplotlib.pyplot as plt
    -import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import K
    -import numpy as np
    -
    -print('Prior')
    -prior = sq.norm(1,5)
    -prior_samples = prior @ (10*K)
    -plt.hist(prior_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(prior_samples))
    -print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples)))
    -print('-')
    -
    -print('Evidence')
    -evidence = sq.norm(2,3)
    -evidence_samples = evidence @ (10*K)
    -plt.hist(evidence_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(evidence_samples))
    -print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples)))
    -print('-')
    -
    -print('Posterior')
    -posterior = bayes.update(prior, evidence)
    -posterior_samples = posterior @ (10*K)
    -plt.hist(posterior_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(posterior_samples))
    -print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples)))
    -
    -print('Average')
    -average = bayes.average(prior, evidence)
    -average_samples = average @ (10*K)
    -plt.hist(average_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(average_samples))
    -print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples)))
    -
    -
    -
    -

    Example: Alarm net#

    -

    This is the alarm network from Bayesian Artificial Intelligence - -Section -2.5.1:

    -
    -

    Assume your house has an alarm system against burglary.

    -

    You live in the seismically active area and the alarm system can get -occasionally set off by an earthquake.

    -

    You have two neighbors, Mary and John, who do not know each other. If -they hear the alarm they call you, but this is not guaranteed.

    -

    The chance of a burglary on a particular day is 0.1%. The chance of -an earthquake on a particular day is 0.2%.

    -

    The alarm will go off 95% of the time with both a burglary and an -earthquake, 94% of the time with just a burglary, 29% of the time -with just an earthquake, and 0.1% of the time with nothing (total -false alarm).

    -

    John will call you 90% of the time when the alarm goes off. But on 5% -of the days, John will just call to say “hi”. Mary will call you 70% -of the time when the alarm goes off. But on 1% of the days, Mary will -just call to say “hi”.

    -
    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import M
    -
    -def p_alarm_goes_off(burglary, earthquake):
    -    if burglary and earthquake:
    -        return 0.95
    -    elif burglary and not earthquake:
    -        return 0.94
    -    elif not burglary and earthquake:
    -        return 0.29
    -    elif not burglary and not earthquake:
    -        return 0.001
    -
    -def p_john_calls(alarm_goes_off):
    -    return 0.9 if alarm_goes_off else 0.05
    -
    -def p_mary_calls(alarm_goes_off):
    -    return 0.7 if alarm_goes_off else 0.01
    -
    -def define_event():
    -    burglary_happens = sq.event(p=0.001)
    -    earthquake_happens = sq.event(p=0.002)
    -    alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens))
    -    john_calls = sq.event(p_john_calls(alarm_goes_off))
    -    mary_calls = sq.event(p_mary_calls(alarm_goes_off))
    -    return {'burglary': burglary_happens,
    -            'earthquake': earthquake_happens,
    -            'alarm_goes_off': alarm_goes_off,
    -            'john_calls': john_calls,
    -            'mary_calls': mary_calls}
    -
    -# What are the chances that both John and Mary call if an earthquake happens?
    -bayes.bayesnet(define_event,
    -               n=1*M,
    -               find=lambda e: (e['mary_calls'] and e['john_calls']),
    -               conditional_on=lambda e: e['earthquake'])
    -# Result will be ~0.19, though it varies because it is based on a random sample.
    -# This also may take a minute to run.
    -
    -# If both John and Mary call, what is the chance there's been a burglary?
    -bayes.bayesnet(define_event,
    -               n=1*M,
    -               find=lambda e: e['burglary'],
    -               conditional_on=lambda e: (e['mary_calls'] and e['john_calls']))
    -# Result will be ~0.27, though it varies because it is based on a random sample.
    -# This will run quickly because there is a built-in cache.
    -# Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache.
    -
    -
    -

    Note that the amount of Bayesian analysis that squigglepy can do is -pretty limited. For more complex bayesian analysis, consider -sorobn, -pomegranate, -bnlearn, or -pyMC.

    -
    -
    -

    Example: A Demonstration of the Monty Hall Problem#

    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import K, M, B, T
    -
    -
    -def monte_hall(door_picked, switch=False):
    -    doors = ['A', 'B', 'C']
    -    car_is_behind_door = ~sq.discrete(doors)
    -    reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door])
    -
    -    if switch:
    -        old_door_picked = door_picked
    -        door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0]
    -
    -    won_car = (car_is_behind_door == door_picked)
    -    return won_car
    -
    -
    -def define_event():
    -    door = ~sq.discrete(['A', 'B', 'C'])
    -    switch = sq.event(0.5)
    -    return {'won': monte_hall(door_picked=door, switch=switch),
    -            'switched': switch}
    -
    -RUNS = 10*K
    -r = bayes.bayesnet(define_event,
    -                   find=lambda e: e['won'],
    -                   conditional_on=lambda e: e['switched'],
    -                   verbose=True,
    -                   n=RUNS)
    -print('Win {}% of the time when switching'.format(int(r * 100)))
    -
    -r = bayes.bayesnet(define_event,
    -                   find=lambda e: e['won'],
    -                   conditional_on=lambda e: not e['switched'],
    -                   verbose=True,
    -                   n=RUNS)
    -print('Win {}% of the time when not switching'.format(int(r * 100)))
    -
    -# Win 66% of the time when switching
    -# Win 34% of the time when not switching
    -
    -
    -
    -
    -

    Example: More complex coin/dice interactions#

    -
    -

    Imagine that I flip a coin. If heads, I take a random die out of my -blue bag. If tails, I take a random die out of my red bag. The blue -bag contains only 6-sided dice. The red bag contains a 4-sided die, a -6-sided die, a 10-sided die, and a 20-sided die. I then roll the -random die I took. What is the chance that I roll a 6?

    -
    -
    import squigglepy as sq
    -from squigglepy.numbers import K, M, B, T
    -from squigglepy import bayes
    -
    -def define_event():
    -    if sq.flip_coin() == 'heads': # Blue bag
    -        return sq.roll_die(6)
    -    else: # Red bag
    -        return sq.discrete([4, 6, 10, 20]) >> sq.roll_die
    -
    -
    -bayes.bayesnet(define_event,
    -               find=lambda e: e == 6,
    -               verbose=True,
    -               n=100*K)
    -# This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292
    -
    -
    -
    -
    -
    -

    Kelly betting#

    -

    You can use probability generated, combine with a bankroll to determine -bet sizing using Kelly -criterion.

    -

    For example, if you want to Kelly bet and you’ve…

    -
      -
    • determined that your price (your probability of the event in question -happening / the market in question resolving in your favor) is $0.70 -(70%)

    • -
    • see that the market is pricing at $0.65

    • -
    • you have a bankroll of $1000 that you are willing to bet

    • -
    -

    You should bet as follows:

    -
    import squigglepy as sq
    -kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000)
    -kelly_data['kelly']  # What fraction of my bankroll should I bet on this?
    -# 0.143
    -kelly_data['target']  # How much money should be invested in this?
    -# 142.86
    -kelly_data['expected_roi']  # What is the expected ROI of this bet?
    -# 0.077
    -
    -
    -
    -
    -

    More examples#

    -

    You can see more examples of squigglepy in action -here.

    -
    -
    -
    -

    Run tests#

    -

    Use black . for formatting.

    -

    Run -ruff check . && pytest && pip3 install . && python3 tests/integration.py

    -
    -
    -

    Disclaimers#

    -

    This package is unofficial and supported by myself and Rethink -Priorities. It is not affiliated with or associated with the Quantified -Uncertainty Research Institute, which maintains the Squiggle language -(in JavaScript).

    -

    This package is also new and not yet in a stable production version, so -you may encounter bugs and other errors. Please report those so they can -be fixed. It’s also possible that future versions of the package may -introduce breaking changes.

    -

    This package is available under an MIT License.

    -
    -
    -

    Acknowledgements#

    -
      -
    • The primary author of this package is Peter Wildeford. Agustín -Covarrubias and Bernardo Baron contributed several key features and -developments.

    • -
    • Thanks to Ozzie Gooen and the Quantified Uncertainty Research -Institute for creating and maintaining the original Squiggle -language.

    • -
    • Thanks to Dawn Drescher for helping me implement math between -distributions.

    • -
    • Thanks to Dawn Drescher for coming up with the idea to use ~ as a -shorthand for sample, as well as helping me implement it.

    • -
    -
    -
    - - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/_modules/index.html b/doc/build/html/_modules/index.html deleted file mode 100644 index a6e43c9..0000000 --- a/doc/build/html/_modules/index.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - - - - - Overview: module code — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - - - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/_modules/squigglepy/bayes.html b/doc/build/html/_modules/squigglepy/bayes.html deleted file mode 100644 index c759bab..0000000 --- a/doc/build/html/_modules/squigglepy/bayes.html +++ /dev/null @@ -1,804 +0,0 @@ - - - - - - - - - - squigglepy.bayes — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -

    Source code for squigglepy.bayes

    -"""
    -This modules includes functions for Bayesian inference.
    -"""
    -
    -import os
    -import time
    -import math
    -import msgspec
    -
    -import numpy as np
    -import pathos.multiprocessing as mp
    -
    -from datetime import datetime
    -
    -from .distributions import BetaDistribution, NormalDistribution, norm, beta, mixture
    -from .utils import _core_cuts, _init_tqdm, _tick_tqdm, _flush_tqdm
    -
    -
    -_squigglepy_internal_bayesnet_caches = {}
    -
    -
    -
    -[docs] -def simple_bayes(likelihood_h, likelihood_not_h, prior): - """ - Calculate Bayes rule. - - p(h|e) = (p(e|h)*p(h)) / (p(e|h)*p(h) + p(e|~h)*(1-p(h))) - p(h|e) is called posterior - p(e|h) is called likelihood - p(h) is called prior - - Parameters - ---------- - likelihood_h : float - The likelihood (given that the hypothesis is true), aka p(e|h) - likelihood_not_h : float - The likelihood given the hypothesis is not true, aka p(e|~h) - prior : float - The prior probability, aka p(h) - - Returns - ------- - float - The result of Bayes rule, aka p(h|e) - - Examples - -------- - # Cancer example: prior of having cancer is 1%, the likelihood of a positive - # mammography given cancer is 80% (true positive rate), and the likelihood of - # a positive mammography given no cancer is 9.6% (false positive rate). - # Given this, what is the probability of cancer given a positive mammography? - >>> simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) - 0.07763975155279504 - """ - return (likelihood_h * prior) / (likelihood_h * prior + likelihood_not_h * (1 - prior))
    - - - -
    -[docs] -def bayesnet( - event_fn=None, - n=1, - find=None, - conditional_on=None, - reduce_fn=None, - raw=False, - memcache=True, - memcache_load=True, - memcache_save=True, - reload_cache=False, - dump_cache_file=None, - load_cache_file=None, - cache_file_primary=False, - verbose=False, - cores=1, -): - """ - Calculate a Bayesian network. - - Allows you to find conditional probabilities of custom events based on - rejection sampling. - - Parameters - ---------- - event_fn : function - A function that defines the bayesian network - n : int - The number of samples to generate - find : a function or None - What do we want to know the probability of? - conditional_on : a function or None - When finding the probability, what do we want to condition on? - reduce_fn : a function or None - When taking all the results of the simulations, how do we aggregate them - into a final answer? Defaults to ``np.mean``. - raw : bool - If True, just return the results of each simulation without aggregating. - memcache : bool - If True, cache the results in-memory for future calculations. Each cache - will be matched based on the ``event_fn``. Default ``True``. - memcache_load : bool - If True, load cache from the in-memory. This will be true if ``memcache`` - is True. Cache will be matched based on the ``event_fn``. Default ``True``. - memcache_save : bool - If True, save results to an in-memory cache. This will be true if ``memcache`` - is True. Cache will be matched based on the ``event_fn``. Default ``True``. - reload_cache : bool - If True, any existing cache will be ignored and recalculated. Default ``False``. - dump_cache_file : str or None - If present, will write out the cache to a binary file with this path with - ``.sqlcache`` appended to the file name. - load_cache_file : str or None - If present, will first attempt to load and use a cache from a file with this - path with ``.sqlcache`` appended to the file name. - cache_file_primary : bool - If both an in-memory cache and file cache are present, the file - cache will be used for the cache if this is True, and the in-memory cache - will be used otherwise. Defaults to False. - verbose : bool - If True, will print out statements on computational progress. - cores : int - If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing - pool with that many cores / processes. - - Returns - ------- - various - The result of ``reduce_fn`` on ``n`` simulations of ``event_fn``. - - Examples - -------- - # Cancer example: prior of having cancer is 1%, the likelihood of a positive - # mammography given cancer is 80% (true positive rate), and the likelihood of - # a positive mammography given no cancer is 9.6% (false positive rate). - # Given this, what is the probability of cancer given a positive mammography? - >> def mammography(has_cancer): - >> p = 0.8 if has_cancer else 0.096 - >> return bool(sq.sample(sq.bernoulli(p))) - >> - >> def define_event(): - >> cancer = sq.sample(sq.bernoulli(0.01)) - >> return({'mammography': mammography(cancer), - >> 'cancer': cancer}) - >> - >> bayes.bayesnet(define_event, - >> find=lambda e: e['cancer'], - >> conditional_on=lambda e: e['mammography'], - >> n=1*M) - 0.07723995880535531 - """ - events = None - if memcache is True: - memcache_load = True - memcache_save = True - elif memcache is False: - memcache_load = False - memcache_save = False - has_in_mem_cache = event_fn in _squigglepy_internal_bayesnet_caches - cache_path = load_cache_file + ".sqcache" if load_cache_file else None - has_file_cache = os.path.exists(cache_path) if load_cache_file else False - - if load_cache_file or dump_cache_file or cores > 1: - encoder = msgspec.msgpack.Encoder() - decoder = msgspec.msgpack.Decoder() - - if load_cache_file and not has_file_cache and verbose: - print("Warning: cache file `{}.sqcache` not found.".format(load_cache_file)) - - if not reload_cache: - if load_cache_file and has_file_cache and (not has_in_mem_cache or cache_file_primary): - if verbose: - print("Loading from cache file (`{}`)...".format(cache_path)) - with open(cache_path, "rb") as f: - events = decoder.decode(f.read()) - - elif memcache_load and has_in_mem_cache: - if verbose: - print("Loading from in-memory cache...") - events = _squigglepy_internal_bayesnet_caches.get(event_fn) - - if events: - if events["metadata"]["n"] < n: - raise ValueError( - ("insufficient samples - {} results cached but " + "requested {}").format( - events["metadata"]["n"], n - ) - ) - - events = events["events"] - if verbose: - print("...Loaded") - - elif verbose: - print("Reloading cache...") - - if events is None: - if event_fn is None: - return None - - def run_event_fn(pbar=None, total_cores=1): - _tick_tqdm(pbar, total_cores) - return event_fn() - - if cores == 1: - if verbose: - print("Generating Bayes net...") - r_ = range(n) - pbar = _init_tqdm(verbose=verbose, total=n) - events = [run_event_fn(pbar=pbar, total_cores=1) for _ in r_] - _flush_tqdm(pbar) - else: - if verbose: - print("Generating Bayes net with {} cores...".format(cores)) - with mp.ProcessingPool(cores) as pool: - cuts = _core_cuts(n, cores) - - def multicore_event_fn(core, total_cores=1, verbose=False): - r_ = range(cuts[core]) - pbar = _init_tqdm(verbose=verbose, total=n) - batch = [run_event_fn(pbar=pbar, total_cores=total_cores) for _ in r_] - _flush_tqdm(pbar) - - if verbose: - print("Shuffling data...") - - while not os.path.exists("test-core-{}.sqcache".format(core)): - with open("test-core-{}.sqcache".format(core), "wb") as outfile: - encoder = msgspec.msgpack.Encoder() - outfile.write(encoder.encode(batch)) - if verbose: - print("Writing data...") - time.sleep(1) - - pool_results = pool.amap(multicore_event_fn, list(range(cores - 1))) - multicore_event_fn(cores - 1, total_cores=cores, verbose=verbose) - if verbose: - print("Waiting for other cores...") - while not pool_results.ready(): - if verbose: - print(".", end="", flush=True) - time.sleep(1) - - if cores > 1: - if verbose: - print("Collecting data...") - events = [] - pbar = _init_tqdm(verbose=verbose, total=cores) - for c in range(cores): - _tick_tqdm(pbar, 1) - with open("test-core-{}.sqcache".format(c), "rb") as infile: - events += decoder.decode(infile.read()) - os.remove("test-core-{}.sqcache".format(c)) - _flush_tqdm(pbar) - if verbose: - print("...Collected!") - - metadata = {"n": n, "last_generated": datetime.now()} - cache_data = {"events": events, "metadata": metadata} - if memcache_save and (not has_in_mem_cache or reload_cache): - if verbose: - print("Caching in-memory...") - _squigglepy_internal_bayesnet_caches[event_fn] = cache_data - if verbose: - print("...Cached!") - - if dump_cache_file: - cache_path = dump_cache_file + ".sqcache" - if verbose: - print("Writing cache to file `{}`...".format(cache_path)) - with open(cache_path, "wb") as f: - f.write(encoder.encode(cache_data)) - if verbose: - print("...Cached!") - - if conditional_on is not None: - if verbose: - print("Filtering conditional...") - events = [e for e in events if conditional_on(e)] - - if len(events) < 1: - raise ValueError("insufficient samples for condition") - - if conditional_on and verbose: - print("...Filtered!") - - if find is None: - if verbose: - print("...Reducing") - events = events if reduce_fn is None else reduce_fn(events) - if verbose: - print("...Reduced!") - else: - if verbose: - print("...Finding") - events = [find(e) for e in events] - if verbose: - print("...Found!") - if not raw: - if verbose: - print("...Reducing") - reduce_fn = np.mean if reduce_fn is None else reduce_fn - events = reduce_fn(events) - if verbose: - print("...Reduced!") - if verbose: - print("...All done!") - return events
    - - - -
    -[docs] -def update(prior, evidence, evidence_weight=1): - """ - Update a distribution. - - Starting with a prior distribution, use Bayesian inference to perform an update, - producing a posterior distribution from the evidence distribution. - - Parameters - ---------- - prior : Distribution - The prior distribution. Currently must either be normal or beta type. Other - types are not yet supported. - evidence : Distribution - The distribution used to update the prior. Currently must either be normal - or beta type. Other types are not yet supported. - evidence_weight : float - How much weight to put on the evidence distribution? Currently this only matters - for normal distributions, where this should be equivalent to the sample weight. - - Returns - ------- - Distribution - The posterior distribution - - Examples - -------- - >> prior = sq.norm(1,5) - >> evidence = sq.norm(2,3) - >> bayes.update(prior, evidence) - <Distribution> norm(mean=2.53, sd=0.29) - """ - if isinstance(prior, NormalDistribution) and isinstance(evidence, NormalDistribution): - prior_mean = prior.mean - prior_var = prior.sd**2 - evidence_mean = evidence.mean - evidence_var = evidence.sd**2 - return norm( - mean=( - (evidence_var * prior_mean + evidence_weight * (prior_var * evidence_mean)) - / (evidence_weight * prior_var + evidence_var) - ), - sd=math.sqrt( - (evidence_var * prior_var) / (evidence_weight * prior_var + evidence_var) - ), - ) - elif isinstance(prior, BetaDistribution) and isinstance(evidence, BetaDistribution): - prior_a = prior.a - prior_b = prior.b - evidence_a = evidence.a - evidence_b = evidence.b - return beta(prior_a + evidence_a, prior_b + evidence_b) - elif type(prior) != type(evidence): - print(type(prior), type(evidence)) - raise ValueError("can only update distributions of the same type.") - else: - raise ValueError("type `{}` not supported.".format(prior.__class__.__name__))
    - - - -
    -[docs] -def average(prior, evidence, weights=[0.5, 0.5], relative_weights=None): - """ - Average two distributions. - - Parameters - ---------- - prior : Distribution - The prior distribution. - evidence : Distribution - The distribution used to average with the prior. - weights : list or np.array or float - How much weight to put on ``prior`` versus ``evidence`` when averaging? If - only one weight is passed, the other weight will be inferred to make the - total weights sum to 1. Defaults to 50-50 weights. - relative_weights : list or None - Relative weights, which if given will be weights that are normalized - to sum to 1. - - Returns - ------- - Distribution - A mixture distribution that accords weights to ``prior`` and ``evidence``. - - Examples - -------- - >> prior = sq.norm(1,5) - >> evidence = sq.norm(2,3) - >> bayes.average(prior, evidence) - <Distribution> mixture - """ - return mixture(dists=[prior, evidence], weights=weights, relative_weights=relative_weights)
    - -
    - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/_modules/squigglepy/correlation.html b/doc/build/html/_modules/squigglepy/correlation.html deleted file mode 100644 index 58fa49e..0000000 --- a/doc/build/html/_modules/squigglepy/correlation.html +++ /dev/null @@ -1,744 +0,0 @@ - - - - - - - - - - squigglepy.correlation — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -

    Source code for squigglepy.correlation

    -"""
    -This module implements the Iman-Conover method for inducing correlations between distributions.
    -
    -Some of the code has been adapted from Abraham Lee's mcerp package (https://github.com/tisimst/mcerp/).
    -"""
    -
    -# Parts of `induce_correlation` are licensed as follows:
    -
    -# BSD 3-Clause License
    -
    -# Copyright (c) 2018, Abraham Lee
    -# All rights reserved.
    -
    -# Redistribution and use in source and binary forms, with or without
    -# modification, are permitted provided that the following conditions are met:
    -
    -# * Redistributions of source code must retain the above copyright notice, this
    -#   list of conditions and the following disclaimer.
    -
    -# * Redistributions in binary form must reproduce the above copyright notice,
    -#   this list of conditions and the following disclaimer in the documentation
    -#   and/or other materials provided with the distribution.
    -
    -# * Neither the name of the copyright holder nor the names of its
    -#   contributors may be used to endorse or promote products derived from
    -#   this software without specific prior written permission.
    -
    -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    -
    -from __future__ import annotations
    -
    -from dataclasses import dataclass
    -import numpy as np
    -from scipy.linalg import cholesky
    -from scipy.stats import rankdata, spearmanr
    -from scipy.stats.distributions import norm as _scipy_norm
    -from numpy.typing import NDArray
    -from copy import deepcopy
    -
    -from typing import TYPE_CHECKING, Union
    -
    -if TYPE_CHECKING:
    -    from .distributions import OperableDistribution
    -
    -
    -
    -[docs] -def correlate( - variables: tuple[OperableDistribution, ...], - correlation: Union[NDArray[np.float64], list[list[float]], np.float64, float], - tolerance: Union[float, np.float64, None] = 0.05, - _min_unique_samples: int = 100, -): - """ - Correlate a set of variables according to a rank correlation matrix. - - This employs the Iman-Conover method to induce the correlation while - preserving the original marginal distributions. - - This method works on a best-effort basis, and may fail to induce the desired - correlation depending on the distributions provided. An exception will be raised - if that's the case. - - Parameters - ---------- - variables : tuple of distributions - The variables to correlate as a tuple of distributions. - - The distributions must be able to produce enough unique samples for the method - to be able to induce the desired correlation by shuffling the samples. - - Discrete distributions are notably hard to correlate this way, - as it's common for them to result in very few unique samples. - - correlation : 2d-array or float - An n-by-n array that defines the desired Spearman rank correlation coefficients. - This matrix must be symmetric and positive semi-definite; and must not be confused with - a covariance matrix. - - Correlation parameters can only be between -1 and 1, exclusive - (including extremely close approximations). - - If a float is provided, all variables will be correlated with the same coefficient. - - tolerance : float, optional - If provided, overrides the absolute tolerance used to check if the resulting - correlation matrix matches the desired correlation matrix. Defaults to 0.05. - - Checking can also be disabled by passing None. - - Returns - ------- - correlated_variables : tuple of distributions - The correlated variables as a tuple of distributions in the same order as - the input variables. - - Examples - -------- - Suppose we want to correlate two variables with a correlation coefficient of 0.65: - >>> solar_radiation, temperature = sq.gamma(300, 100), sq.to(22, 28) - >>> solar_radiation, temperature = sq.correlate((solar_radiation, temperature), 0.7) - >>> print(np.corrcoef(solar_radiation @ 1000, temperature @ 1000)[0, 1]) - 0.6975960649767123 - - Or you could pass a correlation matrix: - - >>> funding_gap, cost_per_delivery, effect_size = ( - sq.to(20_000, 80_000), sq.to(30, 80), sq.beta(2, 5) - ) - >>> funding_gap, cost_per_delivery, effect_size = sq.correlate( - (funding_gap, cost_per_delivery, effect_size), - [[1, 0.6, -0.5], [0.6, 1, -0.2], [-0.5, -0.2, 1]] - ) - >>> print(np.corrcoef(funding_gap @ 1000, cost_per_delivery @ 1000, effect_size @ 1000)) - array([[ 1. , 0.580520 , -0.480149], - [ 0.580962, 1. , -0.187831], - [-0.480149, -0.187831 , 1. ]]) - - """ - if not isinstance(variables, tuple): - variables = tuple(variables) - - if len(variables) < 2: - raise ValueError("You must provide at least two variables to correlate.") - - assert all(v.correlation_group is None for v in variables) - - # Convert a float to a correlation matrix - if ( - isinstance(correlation, float) - or isinstance(correlation, np.floating) - or isinstance(correlation, int) - ): - correlation_parameter = np.float64(correlation) - - assert ( - -1 < correlation_parameter < 1 - ), "Correlation parameter must be between -1 and 1, exclusive." - # Generate a correlation matrix with - # pairwise correlations equal to the correlation parameter - correlation_matrix: NDArray[np.float64] = np.full( - (len(variables), len(variables)), correlation_parameter - ) - # Set the diagonal to 1 - np.fill_diagonal(correlation_matrix, 1) - else: - # Coerce the correlation matrix into a numpy array - correlation_matrix: NDArray[np.float64] = np.array(correlation, dtype=np.float64) - - tolerance = float(tolerance) if tolerance is not None else None - - # Deepcopy the variables to avoid modifying the originals - variables = deepcopy(variables) - - # Create the correlation group - CorrelationGroup(variables, correlation_matrix, tolerance, _min_unique_samples) - - return variables
    - - - -
    -[docs] -@dataclass -class CorrelationGroup: - """ - An object that holds metadata for a group of correlated distributions. - This object is not intended to be used directly by the user, but - rather during sampling to induce correlations between distributions. - """ - - correlated_dists: tuple[OperableDistribution] - correlation_matrix: NDArray[np.float64] - correlation_tolerance: Union[float, None] = 0.05 - min_unique_samples: int = 100 - - def __post_init__(self): - # Check that the correlation matrix is square of the expected size - assert ( - self.correlation_matrix.shape[0] - == self.correlation_matrix.shape[1] - == len(self.correlated_dists) - ), "Correlation matrix must be square, and of the length of the number of dists. provided." - - # Check that the diagonal of the correlation matrix is all ones - assert np.all(np.diag(self.correlation_matrix) == 1), "Diagonal must be all ones." - - # Check that values are between -1 and 1 - assert ( - -1 <= np.min(self.correlation_matrix) and np.max(self.correlation_matrix) <= 1 - ), "Correlation matrix values must be between -1 and 1." - - # Check that the correlation matrix is positive semi-definite - assert np.all( - np.linalg.eigvals(self.correlation_matrix) >= 0 - ), "Matrix must be positive semi-definite." - - # Check that the correlation matrix is symmetric - assert np.all( - self.correlation_matrix == self.correlation_matrix.T - ), "Matrix must be symmetric." - - # Link the correlation group to each distribution - for dist in self.correlated_dists: - dist.correlation_group = self - -
    -[docs] - def induce_correlation(self, data: NDArray[np.float64]) -> NDArray[np.float64]: - """ - Induce a set of correlations on a column-wise dataset - - Parameters - ---------- - data : 2d-array - An m-by-n array where m is the number of samples and n is the - number of independent variables, each column of the array corresponding - to each variable - corrmat : 2d-array - An n-by-n array that defines the desired correlation coefficients - (between -1 and 1). Note: the matrix must be symmetric and - positive-definite in order to induce. - - Returns - ------- - new_data : 2d-array - An m-by-n array that has the desired correlations. - - """ - # Check that each column doesn't have too little unique values - for column in data.T: - if not self.has_sufficient_sample_diversity(column): - raise ValueError( - "The data has too many repeated values to induce a correlation. " - "This might be because of too few samples, or too many repeated samples." - ) - - # If the correlation matrix is the identity matrix, just return the data - if np.all(self.correlation_matrix == np.eye(self.correlation_matrix.shape[0])): - return data - - # Create a rank-matrix - data_rank = np.vstack([rankdata(datai, method="min") for datai in data.T]).T - - # Generate van der Waerden scores - data_rank_score = data_rank / (data_rank.shape[0] + 1.0) - data_rank_score = _scipy_norm(0, 1).ppf(data_rank_score) - - # Calculate the lower triangular matrix of the Cholesky decomposition - # of the desired correlation matrix - p = cholesky(self.correlation_matrix, lower=True) - - # Calculate the current correlations - t = np.corrcoef(data_rank_score, rowvar=False) - - # Calculate the lower triangular matrix of the Cholesky decomposition - # of the current correlation matrix - q = cholesky(t, lower=True) - - # Calculate the re-correlation matrix - s = np.dot(p, np.linalg.inv(q)) - - # Calculate the re-sampled matrix - new_data = np.dot(data_rank_score, s.T) - - # Create the new rank matrix - new_data_rank = np.vstack([rankdata(datai, method="min") for datai in new_data.T]).T - - # Sort the original data according to the new rank matrix - self._sort_data_according_to_rank(data, data_rank, new_data_rank) - - # # Check correlation - if self.correlation_tolerance: - self._check_empirical_correlation(data) - - return data
    - - - def _sort_data_according_to_rank( - self, - data: NDArray[np.float64], - data_rank: NDArray[np.float64], - new_data_rank: NDArray[np.float64], - ): - """Sorts the original data according to new_data_rank, in place.""" - assert ( - data.shape == data_rank.shape == new_data_rank.shape - ), "All input arrays must have the same shape" - for i in range(data.shape[1]): - _, order = np.unique( - np.hstack((data_rank[:, i], new_data_rank[:, i])), return_inverse=True - ) - old_order = order[: new_data_rank.shape[0]] - new_order = order[-new_data_rank.shape[0] :] - tmp = data[np.argsort(old_order), i][new_order] - data[:, i] = tmp[:] - - def _check_empirical_correlation(self, samples: NDArray[np.float64]): - """ - Ensures that the empirical correlation matrix is - the same as the desired correlation matrix. - """ - assert self.correlation_tolerance is not None - - # Compute the empirical correlation matrix - empirical_correlation = spearmanr(samples).statistic - if len(self.correlated_dists) == 2: - # empirical_correlation is a scalar - properly_correlated = np.isclose( - empirical_correlation, - self.correlation_matrix[0, 1], - atol=self.correlation_tolerance, - rtol=0, - ) - else: - # empirical_correlation is a matrix - properly_correlated = np.allclose( - empirical_correlation, - self.correlation_matrix, - atol=self.correlation_tolerance, - rtol=0, - ) - if not properly_correlated: - raise RuntimeError( - "Failed to induce the desired correlation between samples. " - "This might be because of too little diversity in the samples. " - "You can relax the tolerance by passing `tolerance` to correlate()." - ) - -
    -[docs] - def has_sufficient_sample_diversity( - self, - samples: NDArray[np.float64], - relative_threshold: float = 0.7, - absolute_threshold=None, - ) -> bool: - """ - Check if there is there are sufficient unique samples to work with in the data. - """ - - if absolute_threshold is None: - absolute_threshold = self.min_unique_samples - - unique_samples = len(np.unique(samples, axis=0)) - n_samples = len(samples) - - diversity = unique_samples / n_samples - - return (diversity >= relative_threshold) and (unique_samples >= absolute_threshold)
    -
    - -
    - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/_modules/squigglepy/distributions.html b/doc/build/html/_modules/squigglepy/distributions.html deleted file mode 100644 index 8353a85..0000000 --- a/doc/build/html/_modules/squigglepy/distributions.html +++ /dev/null @@ -1,2279 +0,0 @@ - - - - - - - - - - squigglepy.distributions — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -

    Source code for squigglepy.distributions

    -"""
    -A collection of probability distributions and functions to operate on them.
    -"""
    -
    -import operator
    -import math
    -import numpy as np
    -import scipy.stats
    -
    -from typing import Optional, Union
    -
    -from .utils import _process_weights_values, _is_numpy, is_dist, _round
    -from .version import __version__
    -from .correlation import CorrelationGroup
    -
    -from collections.abc import Iterable
    -
    -from abc import ABC, abstractmethod
    -
    -
    -
    -[docs] -class BaseDistribution(ABC): - def __init__(self): - self.x = None - self.y = None - self.n = None - self.p = None - self.t = None - self.a = None - self.b = None - self.shape = None - self.scale = None - self.credibility = None - self.mean = None - self.sd = None - self.left = None - self.mode = None - self.right = None - self.fn = None - self.fn_str = None - self.lclip = None - self.rclip = None - self.lam = None - self.df = None - self.items = None - self.dists = None - self.weights = None - self._version = __version__ - - # Correlation metadata - self.correlation_group: Optional[CorrelationGroup] = None - self._correlated_samples: Optional[np.ndarray] = None - - @abstractmethod - def __str__(self) -> str: - ... - - def __repr__(self): - if self.correlation_group: - return ( - self.__str__() + f" (version {self._version}, corr_group {self.correlation_group})" - ) - return self.__str__() + f" (version {self._version})"
    - - - -
    -[docs] -class OperableDistribution(BaseDistribution): - def __init__(self): - super().__init__() - -
    -[docs] - def plot(self, num_samples=None, bins=None): - """ - Plot a histogram of the samples. - - Parameters - ---------- - num_samples : int - The number of samples to draw for plotting. Defaults to 1000 if not set. - bins : int - The number of bins to plot. Defaults to 200 if not set. - - Examples - -------- - >>> sq.norm(5, 10).plot() - """ - from matplotlib import pyplot as plt - - num_samples = 1000 if num_samples is None else num_samples - bins = 200 if bins is None else bins - - samples = self @ num_samples - - plt.hist(samples, bins=bins) - plt.show()
    - - - def __invert__(self): - from .samplers import sample - - return sample(self) - - def __matmul__(self, n): - try: - n = int(n) - except ValueError: - raise ValueError("number of samples must be an integer") - from .samplers import sample - - return sample(self, n=n) - - def __rshift__(self, fn): - if callable(fn): - return fn(self) - elif isinstance(fn, ComplexDistribution): - return ComplexDistribution(self, fn.left, fn.fn, fn.fn_str, infix=False) - else: - raise ValueError - - def __rmatmul__(self, n): - return self.__matmul__(n) - - def __gt__(self, dist): - return ComplexDistribution(self, dist, operator.gt, ">") - - def __ge__(self, dist): - return ComplexDistribution(self, dist, operator.ge, ">=") - - def __lt__(self, dist): - return ComplexDistribution(self, dist, operator.lt, "<") - - def __le__(self, dist): - return ComplexDistribution(self, dist, operator.le, "<=") - - def __eq__(self, dist): - return ComplexDistribution(self, dist, operator.le, "==") - - def __ne__(self, dist): - return ComplexDistribution(self, dist, operator.le, "!=") - - def __neg__(self): - return ComplexDistribution(self, None, operator.neg, "-") - - def __add__(self, dist): - return ComplexDistribution(self, dist, operator.add, "+") - - def __radd__(self, dist): - return ComplexDistribution(dist, self, operator.add, "+") - - def __sub__(self, dist): - return ComplexDistribution(self, dist, operator.sub, "-") - - def __rsub__(self, dist): - return ComplexDistribution(dist, self, operator.sub, "-") - - def __mul__(self, dist): - return ComplexDistribution(self, dist, operator.mul, "*") - - def __rmul__(self, dist): - return ComplexDistribution(dist, self, operator.mul, "*") - - def __truediv__(self, dist): - return ComplexDistribution(self, dist, operator.truediv, "/") - - def __rtruediv__(self, dist): - return ComplexDistribution(dist, self, operator.truediv, "/") - - def __floordiv__(self, dist): - return ComplexDistribution(self, dist, operator.floordiv, "//") - - def __rfloordiv__(self, dist): - return ComplexDistribution(dist, self, operator.floordiv, "//") - - def __pow__(self, dist): - return ComplexDistribution(self, dist, operator.pow, "**") - - def __rpow__(self, dist): - return ComplexDistribution(dist, self, operator.pow, "**") - - def __hash__(self): - return hash(repr(self))
    - - - -# Distribution are either discrete, continuous, or composite - - -
    -[docs] -class DiscreteDistribution(OperableDistribution, ABC): - ...
    - - - -
    -[docs] -class ContinuousDistribution(OperableDistribution, ABC): - ...
    - - - -
    -[docs] -class CompositeDistribution(OperableDistribution): - def __init__(self): - super().__init__() - # Whether this distribution contains any correlated variables - self.contains_correlated: Optional[bool] = None - - def __post_init__(self): - assert self.contains_correlated is not None, "contains_correlated must be set" - - def _check_correlated(self, dists: Iterable) -> None: - for dist in dists: - if isinstance(dist, BaseDistribution) and dist.correlation_group is not None: - self.contains_correlated = True - break - if isinstance(dist, CompositeDistribution): - if dist.contains_correlated: - self.contains_correlated = True - break
    - - - -
    -[docs] -class ComplexDistribution(CompositeDistribution): - def __init__(self, left, right=None, fn=operator.add, fn_str="+", infix=True): - super().__init__() - self.left = left - self.right = right - self.fn = fn - self.fn_str = fn_str - self.infix = infix - self._check_correlated((left, right)) - - def __str__(self): - if self.right is None and self.infix: - if self.fn_str == "-": - out = "<Distribution> {}{}" - else: - out = "<Distribution> {} {}" - out = out.format(self.fn_str, str(self.left).replace("<Distribution> ", "")) - elif self.right is None and not self.infix: - out = "<Distribution> {}({})".format( - self.fn_str, str(self.left).replace("<Distribution> ", "") - ) - elif self.right is not None and self.infix: - out = "<Distribution> {} {} {}".format( - str(self.left).replace("<Distribution> ", ""), - self.fn_str, - str(self.right).replace("<Distribution> ", ""), - ) - elif self.right is not None and not self.infix: - out = "<Distribution> {}({}, {})" - out = out.format( - self.fn_str, - str(self.left).replace("<Distribution> ", ""), - str(self.right).replace("<Distribution> ", ""), - ) - else: - raise ValueError - return out
    - - - -def _get_fname(f, name): - if name is None: - if isinstance(f, np.vectorize): - name = f.pyfunc.__name__ - else: - name = f.__name__ - return name - - -
    -[docs] -def dist_fn(dist1, dist2=None, fn=None, name=None): - """ - Initialize a distribution that has a custom function applied to the result. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution or function or list - Typically, the distribution to apply the function to. Could also be a function - or list of functions if ``dist_fn`` is being used in a pipe. - dist2 : Distribution or function or list or None - Typically, the second distribution to apply the function to if the function takes - two arguments. Could also be a function or list of functions if ``dist_fn`` is - being used in a pipe. - fn : function or None - The function to apply to the distribution(s). - name : str or None - By default, ``fn.__name__`` will be used to name the function. But you can pass - a custom name. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - when it is sampled. - - Examples - -------- - >>> def double(x): - >>> return x * 2 - >>> dist_fn(norm(0, 1), double) - <Distribution> double(norm(mean=0.5, sd=0.3)) - >>> norm(0, 1) >> dist_fn(double) - <Distribution> double(norm(mean=0.5, sd=0.3)) - """ - if isinstance(dist1, list) and callable(dist1[0]) and dist2 is None and fn is None: - fn = dist1 - - def out_fn(d): - out = d - for f in fn: - out = ComplexDistribution(out, None, fn=f, fn_str=_get_fname(f, name), infix=False) - return out - - return out_fn - - if callable(dist1) and dist2 is None and fn is None: - return lambda d: dist_fn(d, fn=dist1) - - if isinstance(dist2, list) and callable(dist2[0]) and fn is None: - fn = dist2 - dist2 = None - - if callable(dist2) and fn is None: - fn = dist2 - dist2 = None - - if not isinstance(fn, list): - fn = [fn] - - out = dist1 - for f in fn: - out = ComplexDistribution(out, dist2, fn=f, fn_str=_get_fname(f, name), infix=False) - - return out
    - - - -
    -[docs] -def dist_max(dist1, dist2=None): - """ - Initialize the calculation of the maximum value of two distributions. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution - The distribution to sample and determine the max of. - dist2 : Distribution - The second distribution to sample and determine the max of. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - when it is sampled. - - Examples - -------- - >>> dist_max(norm(0, 1), norm(1, 2)) - <Distribution> max(norm(mean=0.5, sd=0.3), norm(mean=1.5, sd=0.3)) - """ - if is_dist(dist1) and dist2 is None: - return lambda d: dist_fn(d, dist1, np.maximum, name="max") - else: - return dist_fn(dist1, dist2, np.maximum, name="max")
    - - - -
    -[docs] -def dist_min(dist1, dist2=None): - """ - Initialize the calculation of the minimum value of two distributions. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution - The distribution to sample and determine the min of. - dist2 : Distribution - The second distribution to sample and determine the min of. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> dist_min(norm(0, 1), norm(1, 2)) - <Distribution> min(norm(mean=0.5, sd=0.3), norm(mean=1.5, sd=0.3)) - """ - if is_dist(dist1) and dist2 is None: - return lambda d: dist_fn(d, dist1, np.minimum, name="min") - else: - return dist_fn(dist1, dist2, np.minimum, name="min")
    - - - -
    -[docs] -def dist_round(dist1, digits=0): - """ - Initialize the rounding of the output of the distribution. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution - The distribution to sample and then round. - digits : int - The number of digits to round to. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> dist_round(norm(0, 1)) - <Distribution> round(norm(mean=0.5, sd=0.3), 0) - """ - if isinstance(dist1, int) and digits == 0: - return lambda d: dist_round(d, digits=dist1) - else: - return dist_fn(dist1, digits, _round, name="round")
    - - - -
    -[docs] -def dist_ceil(dist1): - """ - Initialize the ceiling rounding of the output of the distribution. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution - The distribution to sample and then ceiling round. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> dist_ceil(norm(0, 1)) - <Distribution> ceil(norm(mean=0.5, sd=0.3)) - """ - return dist_fn(dist1, None, np.ceil)
    - - - -
    -[docs] -def dist_floor(dist1): - """ - Initialize the floor rounding of the output of the distribution. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution - The distribution to sample and then floor round. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> dist_floor(norm(0, 1)) - <Distribution> floor(norm(mean=0.5, sd=0.3)) - """ - return dist_fn(dist1, None, np.floor)
    - - - -
    -[docs] -def dist_log(dist1, base=math.e): - """ - Initialize the log of the output of the distribution. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution - The distribution to sample and then take the log of. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> dist_log(norm(0, 1), 10) - <Distribution> log(norm(mean=0.5, sd=0.3), const(10)) - """ - return dist_fn(dist1, const(base), math.log)
    - - - -
    -[docs] -def dist_exp(dist1): - """ - Initialize the exp of the output of the distribution. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution - The distribution to sample and then take the exp of. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> dist_exp(norm(0, 1)) - <Distribution> exp(norm(mean=0.5, sd=0.3)) - """ - return dist_fn(dist1, None, math.exp)
    - - - -@np.vectorize -def _lclip(n, val=None): - if val is None: - return n - else: - return val if n < val else n - - -
    -[docs] -def lclip(dist1, val=None): - """ - Initialize the clipping/bounding of the output of the distribution by the lower value. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution or function - The distribution to clip. If this is a funciton, it will return a partial that will - be suitable for use in piping. - val : int or float or None - The value to use as the lower bound for clipping. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> lclip(norm(0, 1), 0.5) - <Distribution> lclip(norm(mean=0.5, sd=0.3), 0.5) - """ - if (isinstance(dist1, int) or isinstance(dist1, float)) and val is None: - return lambda d: lclip(d, dist1) - elif is_dist(dist1): - return dist_fn(dist1, val, _lclip, name="lclip") - else: - return _lclip(dist1, val)
    - - - -@np.vectorize -def _rclip(n, val=None): - if val is None: - return n - else: - return val if n > val else n - - -
    -[docs] -def rclip(dist1, val=None): - """ - Initialize the clipping/bounding of the output of the distribution by the upper value. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution or function - The distribution to clip. If this is a funciton, it will return a partial that will - be suitable for use in piping. - val : int or float or None - The value to use as the upper bound for clipping. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> rclip(norm(0, 1), 0.5) - <Distribution> rclip(norm(mean=0.5, sd=0.3), 0.5) - """ - if (isinstance(dist1, int) or isinstance(dist1, float)) and val is None: - return lambda d: rclip(d, dist1) - elif is_dist(dist1): - return dist_fn(dist1, val, _rclip, name="rclip") - else: - return _rclip(dist1, val)
    - - - -
    -[docs] -def clip(dist1, left, right=None): - """ - Initialize the clipping/bounding of the output of the distribution. - - The function won't be applied until the distribution is sampled. - - Parameters - ---------- - dist1 : Distribution or function - The distribution to clip. If this is a funciton, it will return a partial that will - be suitable for use in piping. - left : int or float or None - The value to use as the lower bound for clipping. - right : int or float or None - The value to use as the upper bound for clipping. - - Returns - ------- - ComplexDistribution or function - This will be a lazy evaluation of the desired function that will then be calculated - - Examples - -------- - >>> clip(norm(0, 1), 0.5, 0.9) - <Distribution> rclip(lclip(norm(mean=0.5, sd=0.3), 0.5), 0.9) - """ - if ( - (isinstance(dist1, int) or isinstance(dist1, float)) - and (isinstance(left, int) or isinstance(left, float)) - and right is None - ): - return lambda d: rclip(lclip(d, dist1), left) - else: - return rclip(lclip(dist1, left), right)
    - - - -
    -[docs] -class ConstantDistribution(DiscreteDistribution): - def __init__(self, x): - super().__init__() - self.x = x - - def __str__(self): - return "<Distribution> const({})".format(self.x)
    - - - -
    -[docs] -def const(x): - """ - Initialize a constant distribution. - - Constant distributions always return the same value no matter what. - - Parameters - ---------- - x : anything - The value the constant distribution should always return. - - Returns - ------- - ConstantDistribution - - Examples - -------- - >>> const(1) - <Distribution> const(1) - """ - return ConstantDistribution(x)
    - - - -
    -[docs] -class UniformDistribution(ContinuousDistribution): - def __init__(self, x, y): - super().__init__() - self.x = x - self.y = y - assert x < y, "x must be less than y" - - def __str__(self): - return "<Distribution> uniform({}, {})".format(self.x, self.y)
    - - - -
    -[docs] -def uniform(x, y): - """ - Initialize a uniform random distribution. - - Parameters - ---------- - x : float - The smallest value the uniform distribution will return. - y : float - The largest value the uniform distribution will return. - - Returns - ------- - UniformDistribution - - Examples - -------- - >>> uniform(0, 1) - <Distribution> uniform(0, 1) - """ - return UniformDistribution(x=x, y=y)
    - - - -
    -[docs] -class NormalDistribution(ContinuousDistribution): - def __init__(self, x=None, y=None, mean=None, sd=None, credibility=90, lclip=None, rclip=None): - super().__init__() - self.x = x - self.y = y - self.credibility = credibility - self.mean = mean - self.sd = sd - self.lclip = lclip - self.rclip = rclip - - if self.x is not None and self.y is not None and self.x > self.y: - raise ValueError("`high value` cannot be lower than `low value`") - - if (self.x is None or self.y is None) and self.sd is None: - raise ValueError("must define either x/y or mean/sd") - elif (self.x is not None or self.y is not None) and self.sd is not None: - raise ValueError("must define either x/y or mean/sd -- cannot define both") - elif self.sd is not None and self.mean is None: - self.mean = 0 - - if self.mean is None and self.sd is None: - self.mean = (self.x + self.y) / 2 - cdf_value = 0.5 + 0.5 * (self.credibility / 100) - normed_sigma = scipy.stats.norm.ppf(cdf_value) - self.sd = (self.y - self.mean) / normed_sigma - - def __str__(self): - out = "<Distribution> norm(mean={}, sd={}".format(round(self.mean, 2), round(self.sd, 2)) - if self.lclip is not None: - out += ", lclip={}".format(self.lclip) - if self.rclip is not None: - out += ", rclip={}".format(self.rclip) - out += ")" - return out
    - - - -
    -[docs] -def norm( - x=None, y=None, credibility=90, mean=None, sd=None, lclip=None, rclip=None -) -> NormalDistribution: - """ - Initialize a normal distribution. - - Can be defined either via a credible interval from ``x`` to ``y`` (use ``credibility`` or - it will default to being a 90% CI) or defined via ``mean`` and ``sd``. - - Parameters - ---------- - x : float - The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - y : float - The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - credibility : float - The range of the credibility interval. Defaults to 90. Ignored if the distribution is - defined instead by ``mean`` and ``sd``. - mean : float or None - The mean of the normal distribution. If not defined, defaults to 0. - sd : float - The standard deviation of the normal distribution. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - NormalDistribution - - Examples - -------- - >>> norm(0, 1) - <Distribution> norm(mean=0.5, sd=0.3) - >>> norm(mean=1, sd=2) - <Distribution> norm(mean=1, sd=2) - """ - return NormalDistribution( - x=x, y=y, credibility=credibility, mean=mean, sd=sd, lclip=lclip, rclip=rclip - )
    - - - -
    -[docs] -class LognormalDistribution(ContinuousDistribution): - def __init__( - self, - x=None, - y=None, - norm_mean=None, - norm_sd=None, - lognorm_mean=None, - lognorm_sd=None, - credibility=90, - lclip=None, - rclip=None, - ): - super().__init__() - self.x = x - self.y = y - self.credibility = credibility - self.norm_mean = norm_mean - self.norm_sd = norm_sd - self.lognorm_mean = lognorm_mean - self.lognorm_sd = lognorm_sd - self.lclip = lclip - self.rclip = rclip - - if self.x is not None and self.y is not None and self.x > self.y: - raise ValueError("`high value` cannot be lower than `low value`") - if self.x is not None and self.x <= 0: - raise ValueError("lognormal distribution must have values > 0") - - if (self.x is None or self.y is None) and self.norm_sd is None and self.lognorm_sd is None: - raise ValueError( - ("must define only one of x/y, norm_mean/norm_sd, " "or lognorm_mean/lognorm_sd") - ) - elif (self.x is not None or self.y is not None) and ( - self.norm_sd is not None or self.lognorm_sd is not None - ): - raise ValueError( - ("must define only one of x/y, norm_mean/norm_sd, " "or lognorm_mean/lognorm_sd") - ) - elif (self.norm_sd is not None or self.norm_mean is not None) and ( - self.lognorm_sd is not None or self.lognorm_mean is not None - ): - raise ValueError( - ("must define only one of x/y, norm_mean/norm_sd, " "or lognorm_mean/lognorm_sd") - ) - elif self.norm_sd is not None and self.norm_mean is None: - self.norm_mean = 0 - elif self.lognorm_sd is not None and self.lognorm_mean is None: - self.lognorm_mean = 1 - - if self.x is not None: - self.norm_mean = (np.log(self.x) + np.log(self.y)) / 2 - cdf_value = 0.5 + 0.5 * (self.credibility / 100) - normed_sigma = scipy.stats.norm.ppf(cdf_value) - self.norm_sd = (np.log(self.y) - self.norm_mean) / normed_sigma - - if self.lognorm_sd is None: - self.lognorm_mean = np.exp(self.norm_mean + self.norm_sd**2 / 2) - self.lognorm_sd = ( - (np.exp(self.norm_sd**2) - 1) * np.exp(2 * self.norm_mean + self.norm_sd**2) - ) ** 0.5 - elif self.norm_sd is None: - self.norm_mean = np.log( - (self.lognorm_mean**2 / np.sqrt(self.lognorm_sd**2 + self.lognorm_mean**2)) - ) - self.norm_sd = np.sqrt(np.log(1 + self.lognorm_sd**2 / self.lognorm_mean**2)) - - def __str__(self): - out = "<Distribution> lognorm(lognorm_mean={}, lognorm_sd={}, norm_mean={}, norm_sd={}" - out = out.format( - round(self.lognorm_mean, 2), - round(self.lognorm_sd, 2), - round(self.norm_mean, 2), - round(self.norm_sd, 2), - ) - if self.lclip is not None: - out += ", lclip={}".format(self.lclip) - if self.rclip is not None: - out += ", rclip={}".format(self.rclip) - out += ")" - return out
    - - - -
    -[docs] -def lognorm( - x=None, - y=None, - credibility=90, - norm_mean=None, - norm_sd=None, - lognorm_mean=None, - lognorm_sd=None, - lclip=None, - rclip=None, -): - """ - Initialize a lognormal distribution. - - Can be defined either via a credible interval from ``x`` to ``y`` (use ``credibility`` or - it will default to being a 90% CI) or defined via ``mean`` and ``sd``. - - Parameters - ---------- - x : float - The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - Must be a value greater than 0. - y : float - The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - Must be a value greater than 0. - credibility : float - The range of the credibility interval. Defaults to 90. Ignored if the distribution is - defined instead by ``mean`` and ``sd``. - norm_mean : float or None - The mean of the underlying normal distribution. If not defined, defaults to 0. - norm_sd : float - The standard deviation of the underlying normal distribution. - lognorm_mean : float or None - The mean of the lognormal distribution. If not defined, defaults to 1. - lognorm_sd : float - The standard deviation of the lognormal distribution. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - LognormalDistribution - - Examples - -------- - >>> lognorm(1, 10) - <Distribution> lognorm(lognorm_mean=4.04, lognorm_sd=3.21, norm_mean=1.15, norm_sd=0.7) - >>> lognorm(norm_mean=1, norm_sd=2) - <Distribution> lognorm(lognorm_mean=20.09, lognorm_sd=147.05, norm_mean=1, norm_sd=2) - >>> lognorm(lognorm_mean=1, lognorm_sd=2) - <Distribution> lognorm(lognorm_mean=1, lognorm_sd=2, norm_mean=-0.8, norm_sd=1.27) - """ - return LognormalDistribution( - x=x, - y=y, - credibility=credibility, - norm_mean=norm_mean, - norm_sd=norm_sd, - lognorm_mean=lognorm_mean, - lognorm_sd=lognorm_sd, - lclip=lclip, - rclip=rclip, - )
    - - - -
    -[docs] -def to( - x, y, credibility=90, lclip=None, rclip=None -) -> Union[LognormalDistribution, NormalDistribution]: - """ - Initialize a distribution from ``x`` to ``y``. - - The distribution will be lognormal by default, unless ``x`` is less than or equal to 0, - in which case it will become a normal distribution. - - The distribution will default to be a 90% credible interval between ``x`` and ``y`` unless - ``credibility`` is passed. - - Parameters - ---------- - x : float - The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - y : float - The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - credibility : float - The range of the credibility interval. Defaults to 90. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - ``LognormalDistribution`` if ``x`` > 0, otherwise a ``NormalDistribution`` - - Examples - -------- - >>> to(1, 10) - <Distribution> lognorm(mean=1.15, sd=0.7) - >>> to(-10, 10) - <Distribution> norm(mean=0.0, sd=6.08) - """ - if x > 0: - return lognorm(x=x, y=y, credibility=credibility, lclip=lclip, rclip=rclip) - else: - return norm(x=x, y=y, credibility=credibility, lclip=lclip, rclip=rclip)
    - - - -
    -[docs] -class BinomialDistribution(DiscreteDistribution): - def __init__(self, n, p): - super().__init__() - self.n = n - self.p = p - if self.p <= 0 or self.p >= 1: - raise ValueError("p must be between 0 and 1 (exclusive)") - - def __str__(self): - return "<Distribution> binomial(n={}, p={})".format(self.n, self.p)
    - - - -
    -[docs] -def binomial(n, p): - """ - Initialize a binomial distribution. - - Parameters - ---------- - n : int - The number of trials. - p : float - The probability of success for each trial. Must be between 0 and 1. - - Returns - ------- - BinomialDistribution - - Examples - -------- - >>> binomial(1, 0.1) - <Distribution> binomial(1, 0.1) - """ - return BinomialDistribution(n=n, p=p)
    - - - -
    -[docs] -class BetaDistribution(ContinuousDistribution): - def __init__(self, a, b): - super().__init__() - self.a = a - self.b = b - - def __str__(self): - return "<Distribution> beta(a={}, b={})".format(self.a, self.b)
    - - - -
    -[docs] -def beta(a, b): - """ - Initialize a beta distribution. - - Parameters - ---------- - a : float - The alpha shape value of the distribution. Typically takes the value of the - number of trials that resulted in a success. - b : float - The beta shape value of the distribution. Typically takes the value of the - number of trials that resulted in a failure. - - Returns - ------- - BetaDistribution - - Examples - -------- - >>> beta(1, 2) - <Distribution> beta(1, 2) - """ - return BetaDistribution(a, b)
    - - - -
    -[docs] -class BernoulliDistribution(DiscreteDistribution): - def __init__(self, p): - super().__init__() - if not isinstance(p, float) or isinstance(p, int): - raise ValueError("bernoulli p must be a float or int") - if p <= 0 or p >= 1: - raise ValueError("bernoulli p must be 0-1 (exclusive)") - self.p = p - - def __str__(self): - return "<Distribution> bernoulli(p={})".format(self.p)
    - - - -
    -[docs] -def bernoulli(p): - """ - Initialize a Bernoulli distribution. - - Parameters - ---------- - p : float - The probability of the binary event. Must be between 0 and 1. - - Returns - ------- - BernoulliDistribution - - Examples - -------- - >>> bernoulli(0.1) - <Distribution> bernoulli(p=0.1) - """ - return BernoulliDistribution(p)
    - - - -
    -[docs] -class CategoricalDistribution(DiscreteDistribution): - def __init__(self, items): - super().__init__() - if not isinstance(items, dict) and not isinstance(items, list) and not _is_numpy(items): - raise ValueError("inputs to categorical must be a dict or list") - assert len(items) > 0, "inputs to categorical must be non-empty" - self.items = list(items) if _is_numpy(items) else items - - def __str__(self): - return "<Distribution> categorical({})".format(self.items)
    - - - -
    -[docs] -def discrete(items): - """ - Initialize a discrete distribution (aka categorical distribution). - - Parameters - ---------- - items : list or dict - The values that the discrete distribution will return and their associated - weights (or likelihoods of being returned when sampled). - - Returns - ------- - CategoricalDistribution - - Examples - -------- - >>> discrete({0: 0.1, 1: 0.9}) # 10% chance of returning 0, 90% chance of returning 1 - <Distribution> categorical({0: 0.1, 1: 0.9}) - >>> discrete([[0.1, 0], [0.9, 1]]) # Different notation for the same thing. - <Distribution> categorical([[0.1, 0], [0.9, 1]]) - >>> discrete([0, 1, 2]) # When no weights are given, all have equal chance of happening. - <Distribution> categorical([0, 1, 2]) - >>> discrete({'a': 0.1, 'b': 0.9}) # Values do not have to be numbers. - <Distribution> categorical({'a': 0.1, 'b': 0.9}) - """ - return CategoricalDistribution(items)
    - - - -
    -[docs] -class TDistribution(ContinuousDistribution): - def __init__(self, x=None, y=None, t=20, credibility=90, lclip=None, rclip=None): - super().__init__() - self.x = x - self.y = y - self.t = t - self.df = t - self.credibility = credibility - self.lclip = lclip - self.rclip = rclip - - if (self.x is None or self.y is None) and not (self.x is None and self.y is None): - raise ValueError("must define either both `x` and `y` or neither.") - elif self.x is not None and self.y is not None and self.x > self.y: - raise ValueError("`high value` cannot be lower than `low value`") - - if self.x is None: - self.credibility = None - - def __str__(self): - if self.x is not None: - out = "<Distribution> tdist(x={}, y={}, t={}".format(self.x, self.y, self.t) - else: - out = "<Distribution> tdist(t={}".format(self.t) - if self.credibility != 90 and self.credibility is not None: - out += ", credibility={}".format(self.credibility) - if self.lclip is not None: - out += ", lclip={}".format(self.lclip) - if self.rclip is not None: - out += ", rclip={}".format(self.rclip) - out += ")" - return out
    - - - -
    -[docs] -def tdist(x=None, y=None, t=20, credibility=90, lclip=None, rclip=None): - """ - Initialize a t-distribution. - - Is defined either via a loose credible interval from ``x`` to ``y`` (use ``credibility`` or - it will default to being a 90% CI). Unlike the normal and lognormal distributions, this - credible interval is an approximation and is not precisely defined. - - If ``x`` and ``y`` are not defined, can just return a classic t-distribution defined via - ``t`` as the number of degrees of freedom. - - Parameters - ---------- - x : float or None - The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - y : float or None - The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - t : float - The number of degrees of freedom of the t-distribution. Defaults to 20. - credibility : float - The range of the credibility interval. Defaults to 90. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - TDistribution - - Examples - -------- - >>> tdist(0, 1, 2) - <Distribution> tdist(x=0, y=1, t=2) - >>> tdist() - <Distribution> tdist(t=1) - """ - return TDistribution(x=x, y=y, t=t, credibility=credibility, lclip=lclip, rclip=rclip)
    - - - -
    -[docs] -class LogTDistribution(ContinuousDistribution): - def __init__(self, x=None, y=None, t=1, credibility=90, lclip=None, rclip=None): - super().__init__() - self.x = x - self.y = y - self.t = t - self.df = t - self.credibility = credibility - self.lclip = lclip - self.rclip = rclip - - if (self.x is None or self.y is None) and not (self.x is None and self.y is None): - raise ValueError("must define either both `x` and `y` or neither.") - if self.x is not None and self.y is not None and self.x > self.y: - raise ValueError("`high value` cannot be lower than `low value`") - if self.x is not None and self.x <= 0: - raise ValueError("`low value` must be greater than 0.") - - if self.x is None: - self.credibility = None - - def __str__(self): - if self.x is not None: - out = "<Distribution> log_tdist(x={}, y={}, t={}".format(self.x, self.y, self.t) - else: - out = "<Distribution> log_tdist(t={}".format(self.t) - if self.credibility != 90 and self.credibility is not None: - out += ", credibility={}".format(self.credibility) - if self.lclip is not None: - out += ", lclip={}".format(self.lclip) - if self.rclip is not None: - out += ", rclip={}".format(self.rclip) - out += ")" - return out
    - - - -
    -[docs] -def log_tdist(x=None, y=None, t=1, credibility=90, lclip=None, rclip=None): - """ - Initialize a log t-distribution, which is a t-distribution in log-space. - - Is defined either via a loose credible interval from ``x`` to ``y`` (use ``credibility`` or - it will default to being a 90% CI). Unlike the normal and lognormal distributions, this - credible interval is an approximation and is not precisely defined. - - If ``x`` and ``y`` are not defined, can just return a classic t-distribution defined via - ``t`` as the number of degrees of freedom, but in log-space. - - Parameters - ---------- - x : float or None - The low value of a credible interval defined by ``credibility``. Must be greater than 0. - Defaults to a 90% CI. - y : float or None - The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - t : float - The number of degrees of freedom of the t-distribution. Defaults to 1. - credibility : float - The range of the credibility interval. Defaults to 90. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - LogTDistribution - - Examples - -------- - >>> log_tdist(0, 1, 2) - <Distribution> log_tdist(x=0, y=1, t=2) - >>> log_tdist() - <Distribution> log_tdist(t=1) - """ - return LogTDistribution(x=x, y=y, t=t, credibility=credibility, lclip=lclip, rclip=rclip)
    - - - -
    -[docs] -class TriangularDistribution(ContinuousDistribution): - def __init__(self, left, mode, right): - super().__init__() - if left > mode: - raise ValueError("left must be less than or equal to mode") - if right < mode: - raise ValueError("right must be greater than or equal to mode") - if left == right: - raise ValueError("left and right must be different") - self.left = left - self.mode = mode - self.right = right - - def __str__(self): - return "<Distribution> triangular({}, {}, {})".format(self.left, self.mode, self.right)
    - - - -
    -[docs] -def triangular(left, mode, right, lclip=None, rclip=None): - """ - Initialize a triangular distribution. - - Parameters - ---------- - left : float - The smallest value of the triangular distribution. - mode : float - The most common value of the triangular distribution. - right : float - The largest value of the triangular distribution. - - Returns - ------- - TriangularDistribution - - Examples - -------- - >>> triangular(1, 2, 3) - <Distribution> triangular(1, 2, 3) - """ - return TriangularDistribution(left=left, mode=mode, right=right)
    - - - -
    -[docs] -class PERTDistribution(ContinuousDistribution): - def __init__(self, left, mode, right, lam=4, lclip=None, rclip=None): - super().__init__() - if left > mode: - raise ValueError("left must be less than or equal to mode") - if right < mode: - raise ValueError("right must be greater than or equal to mode") - if lam < 0: - raise ValueError("the shape parameter must be positive") - if left == right: - raise ValueError("left and right must be different") - - self.left = left - self.mode = mode - self.right = right - self.lam = lam - self.lclip = lclip - self.rclip = rclip - - def __str__(self): - out = "<Distribution> PERT({}, {}, {}, lam={}".format( - self.left, self.mode, self.right, self.lam - ) - if self.lclip is not None: - out += ", lclip={}".format(self.lclip) - if self.rclip is not None: - out += ", rclip={}".format(self.rclip) - out += ")" - return out
    - - - -
    -[docs] -def pert(left, mode, right, lam=4, lclip=None, rclip=None): - """ - Initialize a PERT distribution. - - Parameters - ---------- - left : float - The smallest value of the PERT distribution. - mode : float - The most common value of the PERT distribution. - right : float - The largest value of the PERT distribution. - lam : float - The lambda value of the PERT distribution. Defaults to 4. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - PERTDistribution - - Examples - -------- - >>> pert(1, 2, 3) - <Distribution> PERT(1, 2, 3) - """ - return PERTDistribution(left=left, mode=mode, right=right, lam=lam, lclip=lclip, rclip=rclip)
    - - - -
    -[docs] -class PoissonDistribution(DiscreteDistribution): - def __init__(self, lam, lclip=None, rclip=None): - super().__init__() - self.lam = lam - self.lclip = lclip - self.rclip = rclip - - def __str__(self): - out = "<Distribution> poisson({}".format(self.lam) - if self.lclip is not None: - out += ", lclip={}".format(self.lclip) - if self.rclip is not None: - out += ", rclip={}".format(self.rclip) - out += ")" - return out
    - - - -
    -[docs] -def poisson(lam, lclip=None, rclip=None): - """ - Initialize a poisson distribution. - - Parameters - ---------- - lam : float - The lambda value of the poisson distribution. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - PoissonDistribution - - Examples - -------- - >>> poisson(1) - <Distribution> poisson(1) - """ - return PoissonDistribution(lam=lam, lclip=lclip, rclip=rclip)
    - - - -
    -[docs] -class ChiSquareDistribution(ContinuousDistribution): - def __init__(self, df): - super().__init__() - self.df = df - if self.df <= 0: - raise ValueError("df must be positive") - - def __str__(self): - return "<Distribution> chisquare({})".format(self.df)
    - - - -
    -[docs] -def chisquare(df): - """ - Initialize a chi-square distribution. - - Parameters - ---------- - df : float - The degrees of freedom. Must be positive. - - Returns - ------- - ChiSquareDistribution - - Examples - -------- - >>> chisquare(2) - <Distribution> chiaquare(2) - """ - return ChiSquareDistribution(df=df)
    - - - -
    -[docs] -class ExponentialDistribution(ContinuousDistribution): - def __init__(self, scale, lclip=None, rclip=None): - super().__init__() - assert scale > 0, "scale must be positive" - # Prevent numeric overflows - assert scale < 1e20, "scale must be less than 1e20" - self.scale = scale - self.lclip = lclip - self.rclip = rclip - - def __str__(self): - out = "<Distribution> exponential({}".format(self.scale) - if self.lclip is not None: - out += ", lclip={}".format(self.lclip) - if self.rclip is not None: - out += ", rclip={}".format(self.rclip) - out += ")" - return out
    - - - -
    -[docs] -def exponential(scale, lclip=None, rclip=None): - """ - Initialize an exponential distribution. - - Parameters - ---------- - scale : float - The scale value of the exponential distribution (> 0) - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - ExponentialDistribution - - Examples - -------- - >>> exponential(1) - <Distribution> exponential(1) - """ - return ExponentialDistribution(scale=scale, lclip=lclip, rclip=rclip)
    - - - -
    -[docs] -class GammaDistribution(ContinuousDistribution): - def __init__(self, shape, scale=1, lclip=None, rclip=None): - super().__init__() - self.shape = shape - self.scale = scale - self.lclip = lclip - self.rclip = rclip - - def __str__(self): - out = "<Distribution> gamma(shape={}, scale={}".format(self.shape, self.scale) - if self.lclip is not None: - out += ", lclip={}".format(self.lclip) - if self.rclip is not None: - out += ", rclip={}".format(self.rclip) - out += ")" - return out
    - - - -
    -[docs] -def gamma(shape, scale=1, lclip=None, rclip=None): - """ - Initialize a gamma distribution. - - Parameters - ---------- - shape : float - The shape value of the gamma distribution. - scale : float - The scale value of the gamma distribution. Defaults to 1. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - GammaDistribution - - Examples - -------- - >>> gamma(10, 1) - <Distribution> gamma(shape=10, scale=1) - """ - return GammaDistribution(shape=shape, scale=scale, lclip=lclip, rclip=rclip)
    - - - -
    -[docs] -class ParetoDistribution(ContinuousDistribution): - def __init__(self, shape): - super().__init__() - self.shape = shape - - def __str__(self): - return "<Distribution> pareto({})".format(self.shape)
    - - - -
    -[docs] -def pareto(shape): - """ - Initialize a pareto distribution. - - Parameters - ---------- - shape : float - The shape value of the pareto distribution. - - Returns - ------- - ParetoDistribution - - Examples - -------- - >>> pareto(1) - <Distribution> pareto(1) - """ - return ParetoDistribution(shape=shape)
    - - - -
    -[docs] -class MixtureDistribution(CompositeDistribution): - def __init__(self, dists, weights=None, relative_weights=None, lclip=None, rclip=None): - super().__init__() - weights, dists = _process_weights_values(weights, relative_weights, dists) - self.dists = dists - self.weights = weights - self.lclip = lclip - self.rclip = rclip - self._check_correlated(dists) - - def __str__(self): - out = "<Distribution> mixture" - for i in range(len(self.dists)): - out += "\n - {} weight on {}".format(self.weights[i], self.dists[i]) - return out
    - - - -
    -[docs] -def mixture(dists, weights=None, relative_weights=None, lclip=None, rclip=None): - """ - Initialize a mixture distribution, which is a combination of different distributions. - - Parameters - ---------- - dists : list or dict - The distributions to mix. Can also be defined as a list of weights and distributions. - weights : list or None - The weights for each distribution. - relative_weights : list or None - Relative weights, which if given will be weights that are normalized - to sum to 1. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - - Returns - ------- - MixtureDistribution - - Examples - -------- - >>> mixture([norm(1, 2), norm(3, 4)], weights=[0.1, 0.9]) - <Distribution> mixture - - <Distribution> norm(mean=1.5, sd=0.3) - - <Distribution> norm(mean=3.5, sd=0.3) - >>> mixture([[0.1, norm(1, 2)], [0.9, norm(3, 4)]]) # Different notation for the same thing. - <Distribution> mixture - - <Distribution> norm(mean=1.5, sd=0.3) - - <Distribution> norm(mean=3.5, sd=0.3) - >>> mixture([norm(1, 2), norm(3, 4)]) # When no weights are given, all have equal chance - >>> # of happening. - <Distribution> mixture - - <Distribution> norm(mean=1.5, sd=0.3) - - <Distribution> norm(mean=3.5, sd=0.3) - """ - return MixtureDistribution( - dists=dists, - weights=weights, - relative_weights=relative_weights, - lclip=lclip, - rclip=rclip, - )
    - - - -
    -[docs] -def zero_inflated(p_zero, dist): - """ - Initialize an arbitrary zero-inflated distribution. - - Parameters - ---------- - p_zero : float - The chance of the distribution returning zero - dist : Distribution - The distribution to sample from when not zero - - Returns - ------- - MixtureDistribution - - Examples - -------- - >>> zero_inflated(0.6, norm(1, 2)) - <Distribution> mixture - - 0 - - <Distribution> norm(mean=1.5, sd=0.3) - """ - if p_zero > 1 or p_zero < 0 or not isinstance(p_zero, float): - raise ValueError("`p_zero` must be between 0 and 1") - return MixtureDistribution(dists=[0, dist], weights=p_zero)
    - - - -
    -[docs] -def inf0(p_zero, dist): - """ - Initialize an arbitrary zero-inflated distribution. - - Alias for ``zero_inflated``. - - Parameters - ---------- - p_zero : float - The chance of the distribution returning zero - dist : Distribution - The distribution to sample from when not zero - - Returns - ------- - MixtureDistribution - - Examples - -------- - >>> inf0(0.6, norm(1, 2)) - <Distribution> mixture - - 0 - - <Distribution> norm(mean=1.5, sd=0.3) - """ - return zero_inflated(p_zero=p_zero, dist=dist)
    - - - -
    -[docs] -class GeometricDistribution(OperableDistribution): - def __init__(self, p): - super().__init__() - self.p = p - if self.p < 0 or self.p > 1: - raise ValueError("p must be between 0 and 1") - - def __str__(self): - return "<Distribution> geometric(p={})".format(self.p)
    - - - -
    -[docs] -def geometric(p): - """ - Initialize a geometric distribution. - - Parameters - ---------- - p : float - The probability of success of an individual trial. Must be between 0 and 1. - - Returns - ------- - GeometricDistribution - - Examples - -------- - >>> geometric(0.1) - <Distribution> geometric(0.1) - """ - return GeometricDistribution(p=p)
    - -
    - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/_modules/squigglepy/rng.html b/doc/build/html/_modules/squigglepy/rng.html deleted file mode 100644 index af027d7..0000000 --- a/doc/build/html/_modules/squigglepy/rng.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - - - squigglepy.rng — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -

    Source code for squigglepy.rng

    -import numpy as np
    -
    -_squigglepy_internal_rng = np.random.default_rng()
    -
    -
    -
    -[docs] -def set_seed(seed): - """ - Set the seed of the random number generator used by Squigglepy. - - The RNG is a ``np.random.default_rng`` under the hood. - - Parameters - ---------- - seed : float - The seed to use for the RNG. - - Returns - ------- - np.random.default_rng - The RNG used internally. - - Examples - -------- - >>> set_seed(42) - Generator(PCG64) at 0x127EDE9E0 - """ - global _squigglepy_internal_rng - _squigglepy_internal_rng = np.random.default_rng(seed) - return _squigglepy_internal_rng
    - -
    - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/_modules/squigglepy/samplers.html b/doc/build/html/_modules/squigglepy/samplers.html deleted file mode 100644 index 9118039..0000000 --- a/doc/build/html/_modules/squigglepy/samplers.html +++ /dev/null @@ -1,1560 +0,0 @@ - - - - - - - - - - squigglepy.samplers — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -

    Source code for squigglepy.samplers

    -import bisect
    -import os
    -import time
    -
    -import numpy as np
    -import pathos.multiprocessing as mp
    -
    -from numpy.typing import NDArray
    -
    -from scipy import stats
    -
    -from .utils import (
    -    _process_weights_values,
    -    _process_discrete_weights_values,
    -    is_dist,
    -    is_sampleable,
    -    _simplify,
    -    _enlist,
    -    _safe_len,
    -    _core_cuts,
    -    _init_tqdm,
    -    _tick_tqdm,
    -    _flush_tqdm,
    -)
    -
    -from .distributions import (
    -    BaseDistribution,
    -    BernoulliDistribution,
    -    BetaDistribution,
    -    BinomialDistribution,
    -    ChiSquareDistribution,
    -    ComplexDistribution,
    -    ConstantDistribution,
    -    CategoricalDistribution,
    -    ExponentialDistribution,
    -    GammaDistribution,
    -    GeometricDistribution,
    -    LogTDistribution,
    -    LognormalDistribution,
    -    MixtureDistribution,
    -    NormalDistribution,
    -    ParetoDistribution,
    -    PoissonDistribution,
    -    TDistribution,
    -    TriangularDistribution,
    -    PERTDistribution,
    -    UniformDistribution,
    -    const,
    -)
    -
    -_squigglepy_internal_sample_caches = {}
    -
    -
    -def _get_rng():
    -    from .rng import _squigglepy_internal_rng
    -
    -    return _squigglepy_internal_rng
    -
    -
    -
    -[docs] -def normal_sample(mean, sd, samples=1): - """ - Sample a random number according to a normal distribution. - - Parameters - ---------- - mean : float - The mean of the normal distribution that is being sampled. - sd : float - The standard deviation of the normal distribution that is being sampled. - samples : int - The number of samples to return. - - Returns - ------- - float - A random number sampled from a normal distribution defined by - ``mean`` and ``sd``. - - Examples - -------- - >>> set_seed(42) - >>> normal_sample(0, 1) - 0.30471707975443135 - """ - return _simplify(_get_rng().normal(mean, sd, samples))
    - - - -
    -[docs] -def lognormal_sample(mean, sd, samples=1): - """ - Sample a random number according to a lognormal distribution. - - Parameters - ---------- - mean : float - The mean of the lognormal distribution that is being sampled. - sd : float - The standard deviation of the lognormal distribution that is being sampled. - samples : int - The number of samples to return. - - Returns - ------- - float - A random number sampled from a lognormal distribution defined by - ``mean`` and ``sd``. - - Examples - -------- - >>> set_seed(42) - >>> lognormal_sample(0, 1) - 1.3562412406168636 - """ - return _simplify(_get_rng().lognormal(mean, sd, samples))
    - - - -
    -[docs] -def t_sample(low=None, high=None, t=20, samples=1, credibility=90): - """ - Sample a random number according to a t-distribution. - - The t-distribution is defined with degrees of freedom via the ``t`` - parameter. Additionally, a loose credibility interval can be defined - via the t-distribution using the ``low`` and ``high`` values. This will be a - 90% CI by default unless you change ``credibility.`` Unlike the normal and - lognormal samplers, this credible interval is an approximation and is - not precisely defined. - - Parameters - ---------- - low : float or None - The low value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - high : float or None - The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - t : float - The number of degrees of freedom of the t-distribution. Defaults to 20. - samples : int - The number of samples to return. - credibility : float - The range of the credibility interval. Defaults to 90. - - Returns - ------- - float - A random number sampled from a lognormal distribution defined by - ``mean`` and ``sd``. - - Examples - -------- - >>> set_seed(42) - >>> t_sample(1, 2, t=4) - 2.7887113716855985 - """ - if low is None and high is None: - return _get_rng().standard_t(t, samples) - elif low is None or high is None: - raise ValueError("must define either both `x` and `y` or neither.") - elif low > high: - raise ValueError("`high value` cannot be lower than `low value`") - elif low == high: - return low - else: - mu = (high + low) / 2 - cdf_value = 0.5 + 0.5 * (credibility / 100) - normed_sigma = stats.norm.ppf(cdf_value) - sigma = (high - mu) / normed_sigma - return _simplify( - normal_sample(mu, sigma, samples) / ((chi_square_sample(t, samples) / t) ** 0.5) - )
    - - - -
    -[docs] -def log_t_sample(low=None, high=None, t=20, samples=1, credibility=90): - """ - Sample a random number according to a log-t-distribution. - - The log-t-distribution is a t-distribution in log-space. It is defined with - degrees of freedom via the ``t`` parameter. Additionally, a loose credibility - interval can be defined via the t-distribution using the ``low`` and ``high`` - values. This will be a 90% CI by default unless you change ``credibility.`` - Unlike the normal and lognormal samplers, this credible interval is an - approximation and is not precisely defined. - - Parameters - ---------- - low : float or None - The low value of a credible interval defined by ``credibility``. - Must be greater than 0. Defaults to a 90% CI. - high : float or None - The high value of a credible interval defined by ``credibility``. Defaults to a 90% CI. - t : float - The number of degrees of freedom of the t-distribution. Defaults to 20. - samples : int - The number of samples to return. - credibility : float - The range of the credibility interval. Defaults to 90. - - Returns - ------- - float - A random number sampled from a lognormal distribution defined by - ``mean`` and ``sd``. - - Examples - -------- - >>> set_seed(42) - >>> log_t_sample(1, 2, t=4) - 2.052949773846356 - """ - if low is None and high is None: - return np.exp(_get_rng().standard_t(t)) - elif low > high: - raise ValueError("`high value` cannot be lower than `low value`") - elif low < 0: - raise ValueError("log_t_sample cannot handle negative values") - elif low == high: - return low - else: - log_low = np.log(low) - log_high = np.log(high) - mu = (log_high + log_low) / 2 - cdf_value = 0.5 + 0.5 * (credibility / 100) - normed_sigma = stats.norm.ppf(cdf_value) - sigma = (log_high - mu) / normed_sigma - return _simplify( - np.exp( - normal_sample(mu, sigma, samples) / ((chi_square_sample(t, samples) / t) ** 0.5) - ) - )
    - - - -
    -[docs] -def binomial_sample(n, p, samples=1): - """ - Sample a random number according to a binomial distribution. - - Parameters - ---------- - n : int - The number of trials. - p : float - The probability of success for each trial. Must be between 0 and 1. - samples : int - The number of samples to return. - - Returns - ------- - int - A random number sampled from a binomial distribution defined by - ``n`` and ``p``. The random number should be between 0 and ``n``. - - Examples - -------- - >>> set_seed(42) - >>> binomial_sample(10, 0.1) - 2 - """ - return _simplify(_get_rng().binomial(n, p, samples))
    - - - -
    -[docs] -def beta_sample(a, b, samples=1): - """ - Sample a random number according to a beta distribution. - - Parameters - ---------- - a : float - The alpha shape value of the distribution. Typically takes the value of the - number of trials that resulted in a success. - b : float - The beta shape value of the distribution. Typically takes the value of the - number of trials that resulted in a failure. - samples : int - The number of samples to return. - - Returns - ------- - float - A random number sampled from a beta distribution defined by - ``a`` and ``b``. - - Examples - -------- - >>> set_seed(42) - >>> beta_sample(1, 1) - 0.22145847498048798 - """ - return _simplify(_get_rng().beta(a, b, samples))
    - - - -
    -[docs] -def bernoulli_sample(p, samples=1): - """ - Sample 1 with probability ``p`` and 0 otherwise. - - Parameters - ---------- - p : float - The probability of success. Must be between 0 and 1. - samples : int - The number of samples to return. - - Returns - ------- - int - Either 0 or 1 - - Examples - -------- - >>> set_seed(42) - >>> bernoulli_sample(0.5) - 0 - """ - a = uniform_sample(0, 1, samples) - if _safe_len(a) == 1: - return int(a < p) - else: - return (a < p).astype(int)
    - - - -
    -[docs] -def triangular_sample(left, mode, right, samples=1): - """ - Sample a random number according to a triangular distribution. - - Parameters - ---------- - left : float - The smallest value of the triangular distribution. - mode : float - The most common value of the triangular distribution. - right : float - The largest value of the triangular distribution. - samples : int - The number of samples to return. - - Returns - ------- - float - A random number sampled from a triangular distribution. - - Examples - -------- - >>> set_seed(42) - >>> triangular_sample(1, 2, 3) - 2.327625176788963 - """ - return _simplify(_get_rng().triangular(left, mode, right, samples))
    - - - -
    -[docs] -def pert_sample(left, mode, right, lam, samples=1): - """ - Sample a random number according to a PERT distribution. - - Parameters - ---------- - left : float - The smallest value of the PERT distribution. - mode : float - The most common value of the PERT distribution. - right : float - The largest value of the PERT distribution. - lam : float - The lambda of the PERT distribution. - samples : int - The number of samples to return. - - Returns - ------- - float - A random number sampled from a PERT distribution. - - Examples - -------- - >>> set_seed(42) - >>> pert_sample(1, 2, 3, 4) - 2.327625176788963 - """ - r = right - left - alpha = 1 + lam * (mode - left) / r - beta = 1 + lam * (right - mode) / r - return left + beta_sample(a=alpha, b=beta, samples=samples) * r
    - - - -
    -[docs] -def poisson_sample(lam, samples=1): - """ - Sample a random number according to a poisson distribution. - - Parameters - ---------- - lam : float - The lambda value of the poisson distribution. - samples : int - The number of samples to return. - - Returns - ------- - int - A random number sampled from a poisson distribution. - - Examples - -------- - >>> set_seed(42) - >>> poisson_sample(10) - 13 - """ - return _simplify(_get_rng().poisson(lam, samples))
    - - - -
    -[docs] -def exponential_sample(scale, samples=1): - """ - Sample a random number according to an exponential distribution. - - Parameters - ---------- - scale : float - The scale value of the exponential distribution. - samples : int - The number of samples to return. - - Returns - ------- - int - A random number sampled from an exponential distribution. - - Examples - -------- - >>> set_seed(42) - >>> exponential_sample(10) - 24.042086039659946 - """ - return _simplify(_get_rng().exponential(scale, samples))
    - - - -
    -[docs] -def gamma_sample(shape, scale, samples=1): - """ - Sample a random number according to a gamma distribution. - - Parameters - ---------- - shape : float - The shape value of the gamma distribution. - scale : float - The scale value of the gamma distribution. Defaults to 1. - samples : int - The number of samples to return. - - Returns - ------- - int - A random number sampled from an gamma distribution. - - Examples - -------- - >>> set_seed(42) - >>> gamma_sample(10, 2) - 21.290716894247602 - """ - return _simplify(_get_rng().gamma(shape, scale, samples))
    - - - -
    -[docs] -def pareto_sample(shape, samples=1): - """ - Sample a random number according to a pareto distribution. - - Parameters - ---------- - shape : float - The shape value of the pareto distribution. - - Returns - ------- - int - A random number sampled from an pareto distribution. - - Examples - -------- - >>> set_seed(42) - >>> pareto_sample(1) - 10.069666324736094 - """ - return _simplify(_get_rng().pareto(shape, samples))
    - - - -
    -[docs] -def uniform_sample(low, high, samples=1): - """ - Sample a random number according to a uniform distribution. - - Parameters - ---------- - low : float - The smallest value the uniform distribution will return. - high : float - The largest value the uniform distribution will return. - samples : int - The number of samples to return. - - Returns - ------- - float - A random number sampled from a uniform distribution between - ```low``` and ```high```. - - Examples - -------- - >>> set_seed(42) - >>> uniform_sample(0, 1) - 0.7739560485559633 - """ - return _simplify(_get_rng().uniform(low, high, samples))
    - - - -
    -[docs] -def chi_square_sample(df, samples=1): - """ - Sample a random number according to a chi-square distribution. - - Parameters - ---------- - df : float - The number of degrees of freedom - samples : int - The number of samples to return. - - Returns - ------- - float - A random number sampled from a chi-square distribution. - - Examples - -------- - >>> set_seed(42) - >>> chi_square_sample(2) - 4.808417207931989 - """ - return _simplify(_get_rng().chisquare(df, samples))
    - - - -
    -[docs] -def discrete_sample(items, samples=1, verbose=False, _multicore_tqdm_n=1, _multicore_tqdm_cores=1): - """ - Sample a random value from a discrete distribution (aka categorical distribution). - - Parameters - ---------- - items : list or dict - The values that the discrete distribution will return and their associated - weights (or likelihoods of being returned when sampled). - samples : int - The number of samples to return. - verbose : bool - If True, will print out statements on computational progress. - _multicore_tqdm_n : int - The total number of samples to use for printing tqdm's interface. This is meant to only - be used internally by squigglepy to make the progress bar printing work well for - multicore. This parameter can be safely ignored by the user. - _multicore_tqdm_cores : int - The total number of cores to use for printing tqdm's interface. This is meant to only - be used internally by squigglepy to make the progress bar printing work well for - multicore. This parameter can be safely ignored by the user. - - Returns - ------- - Various, based on items in ``items`` - - Examples - -------- - >>> set_seed(42) - >>> # 10% chance of returning 0, 90% chance of returning 1 - >>> discrete_sample({0: 0.1, 1: 0.9}) - 1 - >>> discrete_sample([[0.1, 0], [0.9, 1]]) # Different notation for the same thing. - 1 - >>> # When no weights are given, all have equal chance of happening. - >>> discrete_sample([0, 1, 2]) - 2 - >>> discrete_sample({'a': 0.1, 'b': 0.9}) # Values do not have to be numbers. - 'b' - """ - weights, values = _process_discrete_weights_values(items) - - values = [const(v) for v in values] - - return mixture_sample( - values=values, - weights=weights, - samples=samples, - verbose=verbose, - _multicore_tqdm_n=_multicore_tqdm_n, - _multicore_tqdm_cores=_multicore_tqdm_cores, - )
    - - - -
    -[docs] -def geometric_sample(p, samples=1): - """ - Sample a random number according to a geometric distribution. - - Parameters - ---------- - p : float - The probability of success of an individual trial. Must be between 0 and 1. - samples : int - The number of samples to return. - - Returns - ------- - int - A random number sampled from a geometric distribution. - - Examples - -------- - >>> set_seed(42) - >>> geometric_sample(0.1) - 2 - """ - return _simplify(_get_rng().geometric(p, samples))
    - - - -def _mixture_sample_for_large_n( - values, - weights=None, - relative_weights=None, - samples=1, - verbose=False, - _multicore_tqdm_n=1, - _multicore_tqdm_cores=1, -): - def _run_presample(dist, pbar): - _tick_tqdm(pbar) - return _enlist(sample(dist, n=samples)) - - pbar = _init_tqdm(verbose=verbose, total=len(values)) - values = [_run_presample(v, pbar) for v in values] - _flush_tqdm(pbar) - - def _run_mixture(picker, i, pbar): - _tick_tqdm(pbar, _multicore_tqdm_cores) - index = bisect.bisect_left(weights, picker) - return values[index][i] - - weights = np.cumsum(weights) - picker = uniform_sample(0, 1, samples=samples) - - tqdm_samples = samples if _multicore_tqdm_cores == 1 else _multicore_tqdm_n - pbar = _init_tqdm(verbose=verbose, total=tqdm_samples) - out = _simplify([_run_mixture(p, i, pbar) for i, p in enumerate(_enlist(picker))]) - _flush_tqdm(pbar) - - return out - - -def _mixture_sample_for_small_n( - values, - weights=None, - relative_weights=None, - samples=1, - verbose=False, - _multicore_tqdm_n=1, - _multicore_tqdm_cores=1, -): - def _run_mixture(values, weights, pbar=None, tick=1): - r_ = uniform_sample(0, 1) - _tick_tqdm(pbar, tick) - for i, dist in enumerate(values): - weight = weights[i] - if r_ <= weight: - return sample(dist) - return sample(dist) - - weights = np.cumsum(weights) - tqdm_samples = samples if _multicore_tqdm_cores == 1 else _multicore_tqdm_n - pbar = _init_tqdm(verbose=verbose, total=tqdm_samples) - out = _simplify( - [ - _run_mixture(values=values, weights=weights, pbar=pbar, tick=_multicore_tqdm_cores) - for _ in range(samples) - ] - ) - _flush_tqdm(pbar) - return out - - -
    -[docs] -def mixture_sample( - values, - weights=None, - relative_weights=None, - samples=1, - verbose=False, - _multicore_tqdm_n=1, - _multicore_tqdm_cores=1, -): - """ - Sample a ranom number from a mixture distribution. - - Parameters - ---------- - values : list or dict - The distributions to mix. Can also be defined as a list of weights and distributions. - weights : list or None - The weights for each distribution. - relative_weights : list or None - Relative weights, which if given will be weights that are normalized - to sum to 1. - samples : int - The number of samples to return. - verbose : bool - If True, will print out statements on computational progress. - _multicore_tqdm_n : int - The total number of samples to use for printing tqdm's interface. This is meant to only - be used internally by squigglepy to make the progress bar printing work well for - multicore. This parameter can be safely ignored by the user. - _multicore_tqdm_cores : int - The total number of cores to use for printing tqdm's interface. This is meant to only - be used internally by squigglepy to make the progress bar printing work well for - multicore. This parameter can be safely ignored by the user. - - Returns - ------- - Various, based on items in ``values`` - - Examples - -------- - >>> set_seed(42) - >>> mixture_sample([norm(1, 2), norm(3, 4)], weights=[0.1, 0.9]) - 3.183867278765718 - >>> # Different notation for the same thing. - >>> mixture_sample([[0.1, norm(1, 2)], [0.9, norm(3, 4)]]) - 3.7859113725925972 - >>> # When no weights are given, all have equal chance of happening. - >>> mixture_sample([norm(1, 2), norm(3, 4)]) - 1.1041655362137777 - """ - weights, values = _process_weights_values(weights, relative_weights, values) - - if len(values) == 1: - return sample(values[0], n=samples) - - if samples > 100: - return _mixture_sample_for_large_n( - values=values, - weights=weights, - samples=samples, - verbose=verbose, - _multicore_tqdm_n=_multicore_tqdm_n, - _multicore_tqdm_cores=_multicore_tqdm_cores, - ) - else: - return _mixture_sample_for_small_n( - values=values, - weights=weights, - samples=samples, - verbose=verbose, - _multicore_tqdm_n=_multicore_tqdm_n, - _multicore_tqdm_cores=_multicore_tqdm_cores, - )
    - - - -
    -[docs] -def sample_correlated_group( - requested_dist: BaseDistribution, n: int, verbose=False -) -> NDArray[np.float64]: - """ - Samples a correlated distribution, alongside - all other correlated distributions in the same group. - - The samples for other variables are stored in the distributions themselves - (in `_correlated_samples`). - - This is necessary, because the sampling needs to happen all at once, regardless - of where the distributions are used in the binary tree of operations. - """ - group = requested_dist.correlation_group - assert group is not None - - samples = np.column_stack( - [ - # Skip correlation to prevent infinite recursion - # TODO: Check that this does not interfere - # with other correlated distributions downstream - sample(dist, n, verbose=verbose, _correlate_if_needed=False) - for dist in group.correlated_dists - ] - ) - # Induce correlation - samples = group.induce_correlation(samples) - - # Store the samples in each distribution - # except the one we are sampling from - # so it requires resampling next time - requested_samples = None - for i, target_distribution in enumerate(group.correlated_dists): - if requested_dist is not target_distribution: - # Store the samples in the distribution - target_distribution._correlated_samples = samples[:, i] - else: - # Store the samples we requested - requested_samples = samples[:, i] - - assert requested_samples is not None - - return requested_samples
    - - - -
    -[docs] -def sample( - dist=None, - n=1, - lclip=None, - rclip=None, - memcache=False, - reload_cache=False, - dump_cache_file=None, - load_cache_file=None, - cache_file_primary=False, - verbose=None, - cores=1, - _multicore_tqdm_n=1, - _multicore_tqdm_cores=1, - _correlate_if_needed=True, -): - """ - Sample random numbers from a given distribution. - - Parameters - ---------- - dist : Distribution - The distribution to sample random number from. - n : int - The number of random numbers to sample from the distribution. Default to 1. - lclip : float or None - If not None, any value below ``lclip`` will be coerced to ``lclip``. - rclip : float or None - If not None, any value below ``rclip`` will be coerced to ``rclip``. - memcache : bool - If True, will attempt to load the results in-memory for future calculations if - a cache is present. Otherwise will save the results to an in-memory cache. Each cache - will be matched based on ``dist``. Default ``False``. - reload_cache : bool - If True, any existing cache will be ignored and recalculated. Default ``False``. - dump_cache_file : str or None - If present, will write out the cache to a numpy file with this path with - ``.sqlcache.npy`` appended to the file name. - load_cache_file : str or None - If present, will first attempt to load and use a cache from a file with this - path with ``.sqlcache.npy`` appended to the file name. - cache_file_primary : bool - If both an in-memory cache and file cache are present, the file - cache will be used for the cache if this is True, and the in-memory cache - will be used otherwise. Defaults to False. - verbose : bool - If True, will print out statements on computational progress. If False, will not. - If None (default), will be True when ``n`` is greater than or equal to 1M. - cores : int - If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing - pool with that many cores / processes. - _multicore_tqdm_n : int - The total number of samples to use for printing tqdm's interface. This is meant to only - be used internally by squigglepy to make the progress bar printing work well for - multicore. This parameter can be safely ignored by the user. - _multicore_tqdm_cores : int - The total number of cores to use for printing tqdm's interface. This is meant to only - be used internally by squigglepy to make the progress bar printing work well for - multicore. This parameter can be safely ignored by the user. - - Returns - ------- - Various, based on ``dist``. - - Examples - -------- - >>> set_seed(42) - >>> sample(norm(1, 2)) - 1.592627415218455 - >>> sample(mixture([norm(1, 2), norm(3, 4)])) - 1.7281209657534462 - >>> sample(lognorm(1, 10), n=5, lclip=3) - array([6.10817361, 3. , 3. , 3.45828454, 3. ]) - """ - n = int(n) - if n <= 0: - raise ValueError("n must be >= 1") - - if not is_sampleable(dist): - error = "input to sample is malformed - {} is not a sampleable type.".format(type(dist)) - raise ValueError(error) - - if verbose is None: - verbose = n >= 1000000 - - # Handle loading from cache - samples = None - has_in_mem_cache = str(dist) in _squigglepy_internal_sample_caches - if load_cache_file: - cache_path = load_cache_file + ".sqcache.npy" - has_file_cache = os.path.exists(cache_path) if load_cache_file else False - - if load_cache_file and not has_file_cache and verbose: - print("Warning: cache file `{}.sqcache.npy` not found.".format(load_cache_file)) - - if (load_cache_file or memcache) and not reload_cache: - if load_cache_file and has_file_cache and (not has_in_mem_cache or cache_file_primary): - if verbose: - print("Loading from cache file (`{}`)...".format(cache_path)) - with open(cache_path, "rb") as f: - samples = np.load(f) - - elif memcache and has_in_mem_cache: - if verbose: - print("Loading from in-memory cache...") - samples = _squigglepy_internal_sample_caches.get(str(dist)) - - # Handle multicore - if samples is None and cores > 1: - if verbose: - print("Generating samples with {} cores...".format(cores)) - with mp.ProcessingPool(cores) as pool: - cuts = _core_cuts(n, cores) - - def multicore_sample(core, total_n=n, total_cores=cores, verbose=False): - batch = sample( - dist=dist, - n=cuts[core], - _multicore_tqdm_n=total_n, - _multicore_tqdm_cores=total_cores, - lclip=lclip, - rclip=rclip, - memcache=False, - verbose=verbose, - cores=1, - ) - if verbose: - print("Shuffling data...") - with open("test-core-{}.npy".format(core), "wb") as f: - np.save(f, batch) - return None - - pool_results = pool.amap(multicore_sample, range(cores - 1)) - multicore_sample(cores - 1, verbose=verbose) - if verbose: - print("Waiting for other cores...") - while not pool_results.ready(): - if verbose: - print(".", end="", flush=True) - time.sleep(1) - - if verbose: - print("Collecting data...") - samples = np.array([]) - pbar = _init_tqdm(verbose=verbose, total=cores) - for core in range(cores): - with open("test-core-{}.npy".format(core), "rb") as f: - samples = np.concatenate((samples, np.load(f, allow_pickle=True)), axis=None) - os.remove("test-core-{}.npy".format(core)) - _tick_tqdm(pbar, 1) - _flush_tqdm(pbar) - if verbose: - print("...Collected!") - - # Handle lclip/rclip - if samples is None: - lclip_ = None - rclip_ = None - if is_dist(dist): - lclip_ = dist.lclip - rclip_ = dist.rclip - - if lclip is None and lclip_ is not None: - lclip = lclip_ - elif lclip is not None and lclip_ is not None: - lclip = max(lclip, lclip_) - - if rclip is None and rclip_ is not None: - rclip = rclip_ - elif rclip is not None and rclip_ is not None: - rclip = min(rclip, rclip_) - - # Start sampling - if samples is None: - if callable(dist): - if n > 1: - - def run_dist(dist, pbar=None, tick=1): - dist = dist() - _tick_tqdm(pbar, tick) - return dist - - tqdm_samples = n if _multicore_tqdm_cores == 1 else _multicore_tqdm_n - pbar = _init_tqdm(verbose=verbose, total=tqdm_samples) - out = np.array( - [run_dist(dist=dist, pbar=pbar, tick=_multicore_tqdm_cores) for _ in range(n)] - ) - _flush_tqdm(pbar) - else: - out = [dist()] - - def run_dist(dist, pbar=None, tick=1): - samp = sample(dist) if is_dist(dist) or callable(dist) else dist - _tick_tqdm(pbar, tick) - return samp - - pbar = _init_tqdm(verbose=verbose, total=len(out) * _multicore_tqdm_cores) - samples = _simplify( - np.array([run_dist(dist=o, pbar=pbar, tick=_multicore_tqdm_cores) for o in out]) - ) - _flush_tqdm(pbar) - - elif ( - isinstance(dist, float) - or isinstance(dist, int) - or isinstance(dist, str) - or dist is None - ): - samples = _simplify(np.array([dist for _ in range(n)])) - - # Distribution is part of a correlation group - # and has not been sampled yet - elif ( - isinstance(dist, BaseDistribution) - and _correlate_if_needed - and dist.correlation_group is not None - and dist._correlated_samples is None - ): - # Samples the entire correlated group at once - samples = sample_correlated_group(dist, n=n, verbose=verbose) - - # Distribution has already been sampled - # as part of a correlation group - elif ( - isinstance(dist, BaseDistribution) - and _correlate_if_needed - and dist.correlation_group is not None - and dist._correlated_samples is not None - ): - samples = dist._correlated_samples - # This forces the distribution to be resampled - # if the user attempts to sample from it again - dist._correlated_samples = None - - elif isinstance(dist, ConstantDistribution): - samples = _simplify(np.array([dist.x for _ in range(n)])) - - elif isinstance(dist, UniformDistribution): - samples = uniform_sample(dist.x, dist.y, samples=n) - - elif isinstance(dist, CategoricalDistribution): - samples = discrete_sample( - dist.items, - samples=n, - _multicore_tqdm_n=_multicore_tqdm_n, - _multicore_tqdm_cores=_multicore_tqdm_cores, - ) - - elif isinstance(dist, NormalDistribution): - samples = normal_sample(mean=dist.mean, sd=dist.sd, samples=n) - - elif isinstance(dist, LognormalDistribution): - samples = lognormal_sample(mean=dist.norm_mean, sd=dist.norm_sd, samples=n) - - elif isinstance(dist, BinomialDistribution): - samples = binomial_sample(n=dist.n, p=dist.p, samples=n) - - elif isinstance(dist, BetaDistribution): - samples = beta_sample(a=dist.a, b=dist.b, samples=n) - - elif isinstance(dist, BernoulliDistribution): - samples = bernoulli_sample(p=dist.p, samples=n) - - elif isinstance(dist, PoissonDistribution): - samples = poisson_sample(lam=dist.lam, samples=n) - - elif isinstance(dist, ChiSquareDistribution): - samples = chi_square_sample(df=dist.df, samples=n) - - elif isinstance(dist, ExponentialDistribution): - samples = exponential_sample(scale=dist.scale, samples=n) - - elif isinstance(dist, GammaDistribution): - samples = gamma_sample(shape=dist.shape, scale=dist.scale, samples=n) - - elif isinstance(dist, ParetoDistribution): - samples = pareto_sample(shape=dist.shape, samples=n) - - elif isinstance(dist, TriangularDistribution): - samples = triangular_sample(dist.left, dist.mode, dist.right, samples=n) - - elif isinstance(dist, PERTDistribution): - samples = pert_sample(dist.left, dist.mode, dist.right, dist.lam, samples=n) - - elif isinstance(dist, TDistribution): - samples = t_sample(dist.x, dist.y, dist.t, credibility=dist.credibility, samples=n) - - elif isinstance(dist, LogTDistribution): - samples = log_t_sample(dist.x, dist.y, dist.t, credibility=dist.credibility, samples=n) - - elif isinstance(dist, MixtureDistribution): - samples = mixture_sample( - dist.dists, - dist.weights, - samples=n, - verbose=verbose, - _multicore_tqdm_n=_multicore_tqdm_n, - _multicore_tqdm_cores=_multicore_tqdm_cores, - ) - - elif isinstance(dist, GeometricDistribution): - samples = geometric_sample(p=dist.p, samples=n) - - elif isinstance(dist, ComplexDistribution): - if dist.right is None: - samples = dist.fn(sample(dist.left, n=n, verbose=verbose)) - else: - samples = dist.fn( - sample(dist.left, n=n, verbose=verbose), - sample(dist.right, n=n, verbose=verbose), - ) - - if is_dist(samples) or callable(samples): - samples = sample(samples, n=n) - - else: - raise ValueError("{} sampler not found".format(type(dist))) - - # Use lclip / rclip - if _safe_len(samples) > 1: - if lclip is not None: - samples = np.maximum(samples, lclip) - if rclip is not None: - samples = np.minimum(samples, rclip) - else: - if lclip is not None: - samples = lclip if samples < lclip else samples - if rclip is not None: - samples = rclip if samples > rclip else samples - - # Save to cache - if memcache and (not has_in_mem_cache or reload_cache): - if verbose: - print("Caching in-memory...") - _squigglepy_internal_sample_caches[str(dist)] = samples - if verbose: - print("...Cached") - - if dump_cache_file: - cache_path = dump_cache_file + ".sqcache.npy" - if verbose: - print("Writing cache to file `{}`...".format(cache_path)) - with open(cache_path, "wb") as f: - np.save(f, samples) - if verbose: - print("...Cached") - - # Return - return np.array(samples) if isinstance(samples, list) else samples
    - -
    - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/_modules/squigglepy/utils.html b/doc/build/html/_modules/squigglepy/utils.html deleted file mode 100644 index 3040079..0000000 --- a/doc/build/html/_modules/squigglepy/utils.html +++ /dev/null @@ -1,1668 +0,0 @@ - - - - - - - - - - squigglepy.utils — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -

    Source code for squigglepy.utils

    -import math
    -import numpy as np
    -
    -from tqdm import tqdm
    -from datetime import datetime
    -from collections import Counter
    -from collections.abc import Iterable
    -
    -import importlib
    -import importlib.util
    -import sys
    -
    -
    -def _check_pandas_series(values):
    -    """Check if values is a pandas series. Only imports pandas if necessary."""
    -    if "pandas" not in sys.modules:
    -        return False
    -
    -    pd = importlib.import_module("pandas")
    -    return isinstance(values, pd.core.series.Series)
    -
    -
    -def _process_weights_values(weights=None, relative_weights=None, values=None, drop_na=False):
    -    if weights is not None and relative_weights is not None:
    -        raise ValueError("can only pass either `weights` or `relative_weights`, not both.")
    -    if values is None or _safe_len(values) == 0:
    -        raise ValueError("must pass `values`")
    -
    -    relative = False
    -    if relative_weights is not None:
    -        weights = relative_weights
    -        relative = True
    -
    -    if isinstance(weights, float):
    -        weights = [weights]
    -    elif isinstance(weights, np.ndarray):
    -        weights = list(weights)
    -    elif weights is not None and not _is_iterable(weights):
    -        raise ValueError("passed weights must be an iterable")
    -
    -    if isinstance(values, np.ndarray):
    -        values = list(values)
    -    elif _check_pandas_series(values):
    -        values = values.values.tolist()
    -    elif isinstance(values, dict):
    -        if weights is None:
    -            weights = list(values.values())
    -            values = list(values.keys())
    -        else:
    -            raise ValueError("cannot pass dict and weights separately")
    -    elif values is not None and not _is_iterable(values):
    -        raise ValueError("passed values must be an iterable")
    -
    -    if weights is None:
    -        if isinstance(values[0], list) and len(values[0]) == 2:
    -            weights = [v[0] for v in values]
    -            values = [v[1] for v in values]
    -            if drop_na and any([_is_na_like(v) for v in values]):
    -                raise ValueError("cannot drop NA and process weights")
    -        else:
    -            if drop_na:
    -                values = [v for v in values if not _is_na_like(v)]
    -            len_ = len(values)
    -            weights = [1 / len_ for _ in range(len_)]
    -    elif drop_na and any([_is_na_like(v) for v in values]):
    -        raise ValueError("cannot drop NA and process weights")
    -
    -    if any([_is_na_like(w) for w in weights]):
    -        raise ValueError("cannot handle NA-like values in weights")
    -    sum_weights = sum(weights)
    -
    -    if relative:
    -        weights = normalize(weights)
    -    else:
    -        if len(weights) == len(values) - 1 and sum_weights < 1:
    -            weights.append(1 - sum_weights)
    -        elif sum_weights <= 0.99 or sum_weights >= 1.01:
    -            raise ValueError("weights don't sum to 1 -" + " they sum to {}".format(sum_weights))
    -
    -    if len(weights) != len(values):
    -        raise ValueError("weights and values not same length")
    -
    -    new_weights = []
    -    new_values = []
    -    for i, w in enumerate(weights):
    -        if w < 0:
    -            raise ValueError("weight cannot be negative")
    -        if w > 0:  # Note that w = 0 is dropped here
    -            new_weights.append(w)
    -            new_values.append(values[i])
    -
    -    return new_weights, new_values
    -
    -
    -def _process_discrete_weights_values(items):
    -    if (
    -        len(items) >= 100
    -        and not isinstance(items, dict)
    -        and not isinstance(items[0], list)
    -        and _safe_len(_safe_set(items)) < _safe_len(items)
    -    ):
    -        vcounter = Counter(items)
    -        sumv = sum([v for k, v in vcounter.items()])
    -        items = {k: v / sumv for k, v in vcounter.items()}
    -
    -    return _process_weights_values(values=items)
    -
    -
    -def _is_numpy(a):
    -    return type(a).__module__ == np.__name__
    -
    -
    -def _is_iterable(a):
    -    iterx = isinstance(a, dict) or isinstance(a, Iterable)
    -    return iterx and not isinstance(a, str)
    -
    -
    -def _is_na_like(a):
    -    return a is None or np.isnan(a)
    -
    -
    -def _round(x, digits=0):
    -    if digits is None:
    -        return x
    -
    -    x = np.round(x, digits)
    -
    -    if _safe_len(x) > 1:
    -        return np.array([int(y) if digits == 0 else y for y in x])
    -    else:
    -        return int(x) if digits <= 0 else x
    -
    -
    -def _simplify(a):
    -    if _is_numpy(a):
    -        a = a.tolist() if a.size == 1 else a
    -    if isinstance(a, list):
    -        a = a[0] if len(a) == 1 else a
    -    return a
    -
    -
    -def _enlist(a):
    -    if _is_numpy(a) and isinstance(a, np.ndarray):
    -        return a.tolist()
    -    elif _is_iterable(a):
    -        return a
    -    else:
    -        return [a]
    -
    -
    -def _safe_len(a):
    -    if _is_numpy(a):
    -        return a.size
    -    elif is_dist(a):
    -        return 1
    -    elif isinstance(a, list):
    -        return len(a)
    -    elif a is None:
    -        return 0
    -    else:
    -        return 1
    -
    -
    -def _safe_set(a):
    -    if _is_numpy(a):
    -        return set(_enlist(a))
    -    elif is_dist(a):
    -        return a
    -    elif isinstance(a, list):
    -        try:
    -            return set(a)
    -        except TypeError:
    -            return a
    -    elif a is None:
    -        return None
    -    else:
    -        return a
    -
    -
    -def _core_cuts(n, cores):
    -    cuts = [math.floor(n / cores) for _ in range(cores)]
    -    delta = n - sum(cuts)
    -    cuts[-1] += delta
    -    return cuts
    -
    -
    -def _init_tqdm(verbose=True, total=None):
    -    if verbose:
    -        return tqdm(total=total)
    -    else:
    -        return None
    -
    -
    -def _tick_tqdm(pbar, tick_size=1):
    -    if pbar:
    -        pbar.update(tick_size)
    -    return pbar
    -
    -
    -def _flush_tqdm(pbar):
    -    if pbar is not None:
    -        pbar.close()
    -    return pbar
    -
    -
    -
    -[docs] -def is_dist(obj): - """ - Test if a given object is a Squigglepy distribution. - - Parameters - ---------- - obj : object - The object to test. - - Returns - ------- - bool - True, if the object is a distribution. False if not. - - Examples - -------- - >>> is_dist(norm(0, 1)) - True - >>> is_dist(0) - False - """ - from .distributions import BaseDistribution - - return isinstance(obj, BaseDistribution)
    - - - -
    -[docs] -def is_continuous_dist(obj): - from .distributions import ( - ContinuousDistribution, - CompositeDistribution, - ComplexDistribution, - MixtureDistribution, - ) - - if isinstance(obj, ContinuousDistribution): - return True - elif isinstance(obj, CompositeDistribution): - if isinstance(obj, ComplexDistribution): - return is_continuous_dist(obj.left) and is_continuous_dist(obj.right) - elif isinstance(obj, MixtureDistribution): - return all([is_continuous_dist(d) for d in obj.dists]) - else: - raise ValueError("Unknown composite distribution") - return False
    - - - -
    -[docs] -def is_sampleable(obj): - """ - Test if a given object can be sampled from. - - This includes distributions, integers, floats, `None`, - strings, and callables. - - Parameters - ---------- - obj : object - The object to test. - - Returns - ------- - bool - True, if the object can be sampled from. False if not. - - Examples - -------- - >>> is_sampleable(norm(0, 1)) - True - >>> is_sampleable(0) - True - >>> is_sampleable([0, 1]) - False - """ - return ( - is_dist(obj) - or isinstance(obj, int) - or isinstance(obj, float) - or isinstance(obj, str) - or obj is None - or callable(obj) - )
    - - - -
    -[docs] -def normalize(lst): - """ - Normalize a list to sum to 1. - - Parameters - ---------- - lst : list - The list to normalize. - - Returns - ------- - list - A list where each value is normalized such that the list sums to 1. - - Examples - -------- - >>> normalize([0.1, 0.2, 0.2]) - [0.2, 0.4, 0.4] - """ - sum_lst = sum(lst) - return [lx / sum_lst for lx in lst]
    - - - -
    -[docs] -def event_occurs(p): - """ - Return True with probability ``p`` and False with probability ``1 - p``. - - Parameters - ---------- - p : float - The probability of returning True. Must be between 0 and 1. - - Examples - -------- - >>> set_seed(42) - >>> event_occurs(p=0.5) - False - """ - if is_dist(p) or callable(p): - from .samplers import sample - - p = sample(p) - from .rng import _squigglepy_internal_rng - - return _squigglepy_internal_rng.uniform(0, 1) < p
    - - - -
    -[docs] -def event_happens(p): - """ - Return True with probability ``p`` and False with probability ``1 - p``. - - Alias for ``event_occurs``. - - Parameters - ---------- - p : float - The probability of returning True. Must be between 0 and 1. - - Examples - -------- - >>> set_seed(42) - >>> event_happens(p=0.5) - False - """ - return event_occurs(p)
    - - - -
    -[docs] -def event(p): - """ - Return True with probability ``p`` and False with probability ``1 - p``. - - Alias for ``event_occurs``. - - Parameters - ---------- - p : float - The probability of returning True. Must be between 0 and 1. - - Returns - ------- - bool - - Examples - -------- - >>> set_seed(42) - >>> event(p=0.5) - False - """ - return event_occurs(p)
    - - - -
    -[docs] -def one_in(p, digits=0, verbose=True): - """ - Convert a probability into "1 in X" notation. - - Parameters - ---------- - p : float - The probability to convert. - digits : int - The number of digits to round the result to. Defaults to 0. If ``digits`` - is 0, the result will be converted to int instead of float. - verbose : logical - If True, will return a string with "1 in X". If False, will just return X. - - Returns - ------- - str if ``verbose`` is True. Otherwise, int if ``digits`` is 0 or float if ``digits`` > 0. - - Examples - -------- - >>> one_in(0.1) - "1 in 10" - """ - p = _round(1 / p, digits) - return "1 in {:,}".format(p) if verbose else p
    - - - -
    -[docs] -def get_percentiles( - data, - percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], - reverse=False, - digits=None, -): - """ - Print the percentiles of the data. - - Parameters - ---------- - data : list or np.array - The data to calculate percentiles for. - percentiles : list - A list of percentiles to calculate. Must be values between 0 and 100. - reverse : bool - If `True`, the percentile values are reversed (e.g., 95th and 5th percentile - swap values.) - digits : int or None - The number of digits to display (using rounding). - - Returns - ------- - dict - A dictionary of the given percentiles. - - Examples - -------- - >>> get_percentiles(range(100), percentiles=[25, 50, 75]) - {25: 24.75, 50: 49.5, 75: 74.25} - """ - percentiles = percentiles if isinstance(percentiles, list) else [percentiles] - percentile_labels = list(reversed(percentiles)) if reverse else percentiles - percentiles = np.percentile(data, percentiles) - percentiles = [_round(p, digits) for p in percentiles] - if len(percentile_labels) == 1: - return percentiles[0] - else: - return dict(list(zip(percentile_labels, percentiles)))
    - - - -
    -[docs] -def get_log_percentiles( - data, - percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], - reverse=False, - display=True, - digits=1, -): - """ - Print the log (base 10) of the percentiles of the data. - - Parameters - ---------- - data : list or np.array - The data to calculate percentiles for. - percentiles : list - A list of percentiles to calculate. Must be values between 0 and 100. - reverse : bool - If True, the percentile values are reversed (e.g., 95th and 5th percentile - swap values.) - display : bool - If True, the function returns an easy to read display. - digits : int or None - The number of digits to display (using rounding). - - Returns - ------- - dict - A dictionary of the given percentiles. If ``display`` is true, will be str values. - Otherwise will be float values. 10 to the power of the value gives the true percentile. - - Examples - -------- - >>> get_percentiles(range(100), percentiles=[25, 50, 75]) - {25: 24.75, 50: 49.5, 75: 74.25} - """ - percentiles = get_percentiles(data, percentiles=percentiles, reverse=reverse, digits=digits) - if isinstance(percentiles, dict): - if display: - return dict( - [(k, ("{:." + str(digits) + "e}").format(v)) for k, v in percentiles.items()] - ) - else: - return dict([(k, _round(np.log10(v), digits)) for k, v in percentiles.items()]) - else: - if display: - digit_str = "{:." + str(digits) + "e}" - digit_str.format(percentiles) - else: - return _round(np.log10(percentiles), digits)
    - - - -
    -[docs] -def get_mean_and_ci(data, credibility=90, digits=None): - """ - Return the mean and percentiles of the data. - - Parameters - ---------- - data : list or np.array - The data to calculate the mean and CI for. - credibility : float - The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI. - digits : int or None - The number of digits to display (using rounding). - - Returns - ------- - dict - A dictionary with the mean and CI. - - Examples - -------- - >>> get_mean_and_ci(range(100)) - {'mean': 49.5, 'ci_low': 4.95, 'ci_high': 94.05} - """ - ci_low = (100 - credibility) / 2 - ci_high = 100 - ci_low - percentiles = get_percentiles(data, percentiles=[ci_low, ci_high], digits=digits) - return { - "mean": _round(np.mean(data), digits), - "ci_low": percentiles[ci_low], - "ci_high": percentiles[ci_high], - }
    - - - -
    -[docs] -def get_median_and_ci(data, credibility=90, digits=None): - """ - Return the median and percentiles of the data. - - Parameters - ---------- - data : list or np.array - The data to calculate the mean and CI for. - credibility : float - The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI. - digits : int or None - The number of digits to display (using rounding). - - Returns - ------- - dict - A dictionary with the median and CI. - - Examples - -------- - >>> get_median_and_ci(range(100)) - {'mean': 49.5, 'ci_low': 4.95, 'ci_high': 94.05} - """ - ci_low = (100 - credibility) / 2 - ci_high = 100 - ci_low - percentiles = get_percentiles(data, percentiles=[ci_low, 50, ci_high], digits=digits) - return { - "median": percentiles[50], - "ci_low": percentiles[ci_low], - "ci_high": percentiles[ci_high], - }
    - - - -
    -[docs] -def geomean(a, weights=None, relative_weights=None, drop_na=True): - """ - Calculate the geometric mean. - - Parameters - ---------- - a : list or np.array - The values to calculate the geometric mean of. - weights : list or None - The weights, if a weighted geometric mean is desired. - relative_weights : list or None - Relative weights, which if given will be weights that are normalized - to sum to 1. - drop_na : boolean - Should NA-like values be dropped when calculating the geomean? - - Returns - ------- - float - - Examples - -------- - >>> geomean([1, 3, 10]) - 3.1072325059538595 - """ - weights, a = _process_weights_values(weights, relative_weights, a, drop_na=drop_na) - log_a = np.log(a) - return np.exp(np.average(log_a, weights=weights))
    - - - -
    -[docs] -def p_to_odds(p): - """ - Calculate the decimal odds from a given probability. - - Parameters - ---------- - p : float - The probability to calculate decimal odds for. Must be between 0 and 1. - - Returns - ------- - float - Decimal odds - - Examples - -------- - >>> p_to_odds(0.1) - 0.1111111111111111 - """ - - def _convert(p): - if _is_na_like(p): - return p - if p <= 0 or p >= 1: - raise ValueError("p must be between 0 and 1") - return p / (1 - p) - - return _simplify(np.array([_convert(p) for p in _enlist(p)]))
    - - - -
    -[docs] -def odds_to_p(odds): - """ - Calculate the probability from given decimal odds. - - Parameters - ---------- - odds : float - The decimal odds to calculate the probability for. - - Returns - ------- - float - Probability - - Examples - -------- - >>> odds_to_p(0.1) - 0.09090909090909091 - """ - - def _convert(o): - if _is_na_like(o): - return o - if o <= 0: - raise ValueError("odds must be greater than 0") - return o / (1 + o) - - return _simplify(np.array([_convert(o) for o in _enlist(odds)]))
    - - - -
    -[docs] -def geomean_odds(a, weights=None, relative_weights=None, drop_na=True): - """ - Calculate the geometric mean of odds. - - Parameters - ---------- - a : list or np.array - The probabilities to calculate the geometric mean of. These are converted to odds - before the geometric mean is taken.. - weights : list or None - The weights, if a weighted geometric mean is desired. - relative_weights : list or None - Relative weights, which if given will be weights that are normalized - to sum to 1. - drop_na : boolean - Should NA-like values be dropped when calculating the geomean? - - Returns - ------- - float - - Examples - -------- - >>> geomean_odds([0.1, 0.3, 0.9]) - 0.42985748800076845 - """ - weights, a = _process_weights_values(weights, relative_weights, a, drop_na=drop_na) - return odds_to_p(geomean(p_to_odds(a), weights=weights))
    - - - -
    -[docs] -def laplace(s, n=None, time_passed=None, time_remaining=None, time_fixed=False): - """ - Return probability of success on next trial given Laplace's law of succession. - - Also can be used to calculate a time-invariant version defined in - https://www.lesswrong.com/posts/wE7SK8w8AixqknArs/a-time-invariant-version-of-laplace-s-rule - - Parameters - ---------- - s : int - The number of successes among ``n`` past trials or among ``time_passed`` amount of time. - n : int or None - The number of trials that contain the successes (and/or failures). Leave as None if - time-invariant mode is desired. - time_passed : float or None - The amount of time that has passed when the successes (and/or failures) occured for - calculating a time-invariant Laplace. - time_remaining : float or None - We are calculating the likelihood of observing at least one success over this time - period. - time_fixed : bool - This should be False if the time period is variable - that is, if the time period - was chosen specifically to include the most recent success. Otherwise the time period - is fixed and this should be True. Defaults to False. - - Returns - ------- - float - The probability of at least one success in the next trial or ``time_remaining`` amount - of time. - - Examples - -------- - >>> # The sun has risen the past 100,000 days. What are the odds it rises again tomorrow? - >>> laplace(s=100*K, n=100*K) - 0.999990000199996 - >>> # The last time a nuke was used in war was 77 years ago. What are the odds a nuke - >>> # is used in the next year, not considering any information other than this naive prior? - >>> laplace(s=1, time_passed=77, time_remaining=1, time_fixed=False) - 0.012820512820512664 - """ - if n is not None and s > n: - raise ValueError("`s` cannot be greater than `n`") - elif time_passed is None and time_remaining is None and n is not None: - return (s + 1) / (n + 2) - elif time_passed is not None and time_remaining is not None and s == 0: - return 1 - ((1 + time_remaining / time_passed) ** -1) - elif time_passed is not None and time_remaining is not None and s > 0 and not time_fixed: - return 1 - ((1 + time_remaining / time_passed) ** -s) - elif time_passed is not None and time_remaining is not None and s > 0 and time_fixed: - return 1 - ((1 + time_remaining / time_passed) ** -(s + 1)) - elif time_passed is not None and time_remaining is None and s == 0: - return 1 - ((1 + 1 / time_passed) ** -1) - elif time_passed is not None and time_remaining is None and s > 0 and not time_fixed: - return 1 - ((1 + 1 / time_passed) ** -s) - elif time_passed is not None and time_remaining is None and s > 0 and time_fixed: - return 1 - ((1 + 1 / time_passed) ** -(s + 1)) - elif time_passed is None and n is None: - raise ValueError("Must define `time_passed` or `n`") - elif time_passed is None and time_remaining is not None: - raise ValueError("Must define `time_passed`") - else: - raise ValueError("Fatal logic error - programmer made mistake!")
    - - - -
    -[docs] -def growth_rate_to_doubling_time(growth_rate): - """ - Convert a positive growth rate to a doubling rate. - - Growth rate must be expressed as a number, numpy array or distribution - where 0.05 means +5% to a doubling time. The time unit remains the same, so if we've - got +5% annual growth, the returned value is the doubling time in years. - - NOTE: This only works works for numbers, arrays and distributions where all numbers - are above 0. (Otherwise it makes no sense to talk about doubling times.) - - Parameters - ---------- - growth_rate : float or np.array or BaseDistribution - The growth rate expressed as a fraction (the percentage divided by 100). - - Returns - ------- - float or np.array or ComplexDistribution - Returns the doubling time. - - Examples - -------- - >>> growth_rate_to_doubling_time(0.01) - 69.66071689357483 - """ - if is_dist(growth_rate): - from .distributions import dist_log - - return math.log(2) / dist_log(1.0 + growth_rate) - elif _is_numpy(growth_rate): - return np.log(2) / np.log(1.0 + growth_rate) - else: - return math.log(2) / math.log(1.0 + growth_rate)
    - - - -
    -[docs] -def doubling_time_to_growth_rate(doubling_time): - """ - Convert a doubling time to a growth rate. - - Doubling time is expressed as a number, numpy array or distribution in any - time unit. Growth rate is set where e.g. 0.05 means +5%. The time unit remains the - same, so if we've got a doubling time of 2 years, the returned value is the annual - growth rate. - - NOTE: This only works works for numbers, arrays and distributions where all numbers - are above 0. (Otherwise it makes no sense to talk about doubling times.) - - Parameters - ---------- - doubling_time : float or np.array or BaseDistribution - The doubling time expressed in any time unit. - - Returns - ------- - float or np.array or ComplexDistribution - Returns the growth rate expressed as a fraction (the percentage divided by 100). - - Examples - -------- - >>> doubling_time_to_growth_rate(12) - 0.05946309435929531 - """ - if is_dist(doubling_time): - from .distributions import dist_exp - - return dist_exp(math.log(2) / doubling_time) - 1 - elif _is_numpy(doubling_time): - return np.exp(np.log(2) / doubling_time) - 1 - else: - return math.exp(math.log(2) / doubling_time) - 1
    - - - -
    -[docs] -def roll_die(sides, n=1): - """ - Roll a die. - - Parameters - ---------- - sides : int - The number of sides of the die that is rolled. - n : int - The number of dice to be rolled. - - Returns - ------- - int or list - Returns the value of each die roll. - - Examples - -------- - >>> set_seed(42) - >>> roll_die(6) - 5 - """ - if is_dist(sides) or callable(sides): - from .samplers import sample - - sides = sample(sides) - if not isinstance(n, int): - raise ValueError("can only roll an integer number of times") - elif sides < 2: - raise ValueError("cannot roll less than a 2-sided die.") - elif not isinstance(sides, int): - raise ValueError("can only roll an integer number of sides") - else: - from .samplers import sample - from .distributions import discrete - - return sample(discrete(list(range(1, sides + 1))), n=n) if sides > 0 else None
    - - - -
    -[docs] -def flip_coin(n=1): - """ - Flip a coin. - - Parameters - ---------- - n : int - The number of coins to be flipped. - - Returns - ------- - str or list - Returns the value of each coin flip, as either "heads" or "tails" - - Examples - -------- - >>> set_seed(42) - >>> flip_coin() - 'heads' - """ - rolls = roll_die(2, n=n) - if isinstance(rolls, int): - rolls = [rolls] - flips = ["heads" if d == 2 else "tails" for d in rolls] - return flips[0] if len(flips) == 1 else flips
    - - - -
    -[docs] -def kelly(my_price, market_price, deference=0, bankroll=1, resolve_date=None, current=0): - """ - Calculate the Kelly criterion. - - Parameters - ---------- - my_price : float - The price (or probability) you give for the given event. - market_price : float - The price the market is giving for that event. - deference : float - How much deference (or weight) do you give the market price? Use 0.5 for half Kelly - and 0.75 for quarter Kelly. Defaults to 0, which is full Kelly. - bankroll : float - How much money do you have to bet? Defaults to 1. - resolve_date : str or None - When will the event happen, the market resolve, and you get your money back? Used for - calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means - ARR is not calculated. - current : float - How much do you already have invested in this event? Used for calculating the - additional amount you should invest. Defaults to 0. - - Returns - ------- - dict - A dict of values specifying: - * ``my_price`` - * ``market_price`` - * ``deference`` - * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken - into account. - * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``. - * ``adj_delta_price`` : the absolute difference between ``adj_price`` and - ``market_price``. - * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll`` - you should bet. - * ``target`` : the target amount of money you should have invested - * ``current`` - * ``delta`` : the amount of money you should invest given what you already - have invested - * ``max_gain`` : the amount of money you would gain if you win - * ``modeled_gain`` : the expected value you would win given ``adj_price`` - * ``expected_roi`` : the expected return on investment - * ``expected_arr`` : the expected ARR given ``resolve_date`` - * ``resolve_date`` - - Examples - -------- - >>> kelly(my_price=0.7, market_price=0.4, deference=0.5, bankroll=100) - {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.5, 'adj_price': 0.55, - 'delta_price': 0.3, 'adj_delta_price': 0.15, 'kelly': 0.25, 'target': 25.0, - 'current': 0, 'delta': 25.0, 'max_gain': 62.5, 'modeled_gain': 23.13, - 'expected_roi': 0.375, 'expected_arr': None, 'resolve_date': None} - """ - if market_price >= 1 or market_price <= 0: - raise ValueError("market_price must be >0 and <1") - if my_price >= 1 or my_price <= 0: - raise ValueError("my_price must be >0 and <1") - if deference > 1 or deference < 0: - raise ValueError("deference must be >=0 and <=1") - adj_price = my_price * (1 - deference) + market_price * deference - kelly = np.abs(adj_price - ((1 - adj_price) * (market_price / (1 - market_price)))) - target = bankroll * kelly - expected_roi = np.abs((adj_price / market_price) - 1) - if resolve_date is None: - expected_arr = None - else: - resolve_date = datetime.strptime(resolve_date, "%Y-%m-%d") - expected_arr = ((expected_roi + 1) ** (365 / (resolve_date - datetime.now()).days)) - 1 - return { - "my_price": round(my_price, 2), - "market_price": round(market_price, 2), - "deference": round(deference, 3), - "adj_price": round(adj_price, 2), - "delta_price": round(np.abs(market_price - my_price), 2), - "adj_delta_price": round(np.abs(market_price - adj_price), 2), - "kelly": round(kelly, 3), - "target": round(target, 2), - "current": round(current, 2), - "delta": round(target - current, 2), - "max_gain": round(target / market_price, 2), - "modeled_gain": round( - (adj_price * (target / market_price) + (1 - adj_price) * -target), 2 - ), - "expected_roi": round(expected_roi, 3), - "expected_arr": round(expected_arr, 3) if expected_arr is not None else None, - "resolve_date": resolve_date, - }
    - - - -
    -[docs] -def full_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): - """ - Alias for ``kelly`` where ``deference`` is 0. - - Parameters - ---------- - my_price : float - The price (or probability) you give for the given event. - market_price : float - The price the market is giving for that event. - bankroll : float - How much money do you have to bet? Defaults to 1. - resolve_date : str or None - When will the event happen, the market resolve, and you get your money back? Used for - calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means - ARR is not calculated. - current : float - How much do you already have invested in this event? Used for calculating the - additional amount you should invest. Defaults to 0. - - Returns - ------- - dict - A dict of values specifying: - * ``my_price`` - * ``market_price`` - * ``deference`` - * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken - into account. - * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``. - * ``adj_delta_price`` : the absolute difference between ``adj_price`` and - ``market_price``. - * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll`` - you should bet. - * ``target`` : the target amount of money you should have invested - * ``current`` - * ``delta`` : the amount of money you should invest given what you already - have invested - * ``max_gain`` : the amount of money you would gain if you win - * ``modeled_gain`` : the expected value you would win given ``adj_price`` - * ``expected_roi`` : the expected return on investment - * ``expected_arr`` : the expected ARR given ``resolve_date`` - * ``resolve_date`` - - Examples - -------- - >>> full_kelly(my_price=0.7, market_price=0.4, bankroll=100) - {'my_price': 0.7, 'market_price': 0.4, 'deference': 0, 'adj_price': 0.7, - 'delta_price': 0.3, 'adj_delta_price': 0.3, 'kelly': 0.5, 'target': 50.0, - 'current': 0, 'delta': 50.0, 'max_gain': 125.0, 'modeled_gain': 72.5, - 'expected_roi': 0.75, 'expected_arr': None, 'resolve_date': None} - """ - return kelly( - my_price=my_price, - market_price=market_price, - bankroll=bankroll, - resolve_date=resolve_date, - current=current, - deference=0, - )
    - - - -
    -[docs] -def half_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): - """ - Alias for ``kelly`` where ``deference`` is 0.5. - - Parameters - ---------- - my_price : float - The price (or probability) you give for the given event. - market_price : float - The price the market is giving for that event. - bankroll : float - How much money do you have to bet? Defaults to 1. - resolve_date : str or None - When will the event happen, the market resolve, and you get your money back? Used for - calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means - ARR is not calculated. - current : float - How much do you already have invested in this event? Used for calculating the - additional amount you should invest. Defaults to 0. - - Returns - ------- - dict - A dict of values specifying: - * ``my_price`` - * ``market_price`` - * ``deference`` - * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken - into account. - * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``. - * ``adj_delta_price`` : the absolute difference between ``adj_price`` and - ``market_price``. - * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll`` - you should bet. - * ``target`` : the target amount of money you should have invested - * ``current`` - * ``delta`` : the amount of money you should invest given what you already - have invested - * ``max_gain`` : the amount of money you would gain if you win - * ``modeled_gain`` : the expected value you would win given ``adj_price`` - * ``expected_roi`` : the expected return on investment - * ``expected_arr`` : the expected ARR given ``resolve_date`` - * ``resolve_date`` - - Examples - -------- - >>> half_kelly(my_price=0.7, market_price=0.4, bankroll=100) - {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.5, 'adj_price': 0.55, - 'delta_price': 0.3, 'adj_delta_price': 0.15, 'kelly': 0.25, 'target': 25.0, - 'current': 0, 'delta': 25.0, 'max_gain': 62.5, 'modeled_gain': 23.13, - 'expected_roi': 0.375, 'expected_arr': None, 'resolve_date': None} - """ - return kelly( - my_price=my_price, - market_price=market_price, - bankroll=bankroll, - resolve_date=resolve_date, - current=current, - deference=0.5, - )
    - - - -
    -[docs] -def quarter_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0): - """ - Alias for ``kelly`` where ``deference`` is 0.75. - - Parameters - ---------- - my_price : float - The price (or probability) you give for the given event. - market_price : float - The price the market is giving for that event. - bankroll : float - How much money do you have to bet? Defaults to 1. - resolve_date : str or None - When will the event happen, the market resolve, and you get your money back? Used for - calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means - ARR is not calculated. - current : float - How much do you already have invested in this event? Used for calculating the - additional amount you should invest. Defaults to 0. - - Returns - ------- - dict - A dict of values specifying: - * ``my_price`` - * ``market_price`` - * ``deference`` - * ``adj_price`` : an adjustment to ``my_price`` once ``deference`` is taken - into account. - * ``delta_price`` : the absolute difference between ``my_price`` and ``market_price``. - * ``adj_delta_price`` : the absolute difference between ``adj_price`` and - ``market_price``. - * ``kelly`` : the kelly criterion indicating the percentage of ``bankroll`` - you should bet. - * ``target`` : the target amount of money you should have invested - * ``current`` - * ``delta`` : the amount of money you should invest given what you already - have invested - * ``max_gain`` : the amount of money you would gain if you win - * ``modeled_gain`` : the expected value you would win given ``adj_price`` - * ``expected_roi`` : the expected return on investment - * ``expected_arr`` : the expected ARR given ``resolve_date`` - * ``resolve_date`` - - Examples - -------- - >>> quarter_kelly(my_price=0.7, market_price=0.4, bankroll=100) - {'my_price': 0.7, 'market_price': 0.4, 'deference': 0.75, 'adj_price': 0.48, - 'delta_price': 0.3, 'adj_delta_price': 0.08, 'kelly': 0.125, 'target': 12.5, - 'current': 0, 'delta': 12.5, 'max_gain': 31.25, 'modeled_gain': 8.28, - 'expected_roi': 0.188, 'expected_arr': None, 'resolve_date': None} - """ - return kelly( - my_price=my_price, - market_price=market_price, - bankroll=bankroll, - resolve_date=resolve_date, - current=current, - deference=0.75, - )
    - - - -
    -[docs] -def extremize(p, e): - """ - Extremize a prediction. - - Parameters - ---------- - p : float - The prediction to extremize. Must be within 0-1. - e : float - The extremization factor. - - Returns - ------- - float - The extremized prediction - - Examples - -------- - >>> # Extremizing of 1.73 per https://arxiv.org/abs/2111.03153 - >>> extremize(p=0.7, e=1.73) - 0.875428191155692 - """ - if p <= 0 or p >= 1: - raise ValueError("`p` must be greater than 0 and less than 1") - - if p > 0.5: - return 1 - ((1 - p) ** e) - else: - return p**e
    - -
    - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/_sources/README.rst.txt b/doc/build/html/_sources/README.rst.txt deleted file mode 100644 index f5ec681..0000000 --- a/doc/build/html/_sources/README.rst.txt +++ /dev/null @@ -1,531 +0,0 @@ -Squigglepy: Implementation of Squiggle in Python -================================================ - -`Squiggle `__ is a “simple -programming language for intuitive probabilistic estimation”. It serves -as its own standalone programming language with its own syntax, but it -is implemented in JavaScript. I like the features of Squiggle and intend -to use it frequently, but I also sometimes want to use similar -functionalities in Python, especially alongside other Python statistical -programming packages like Numpy, Pandas, and Matplotlib. The -**squigglepy** package here implements many Squiggle-like -functionalities in Python. - -Installation ------------- - -.. code:: shell - - pip install squigglepy - -For plotting support, you can also use the ``plots`` extra: - -.. code:: shell - - pip install squigglepy[plots] - -Usage ------ - -Piano Tuners Example -~~~~~~~~~~~~~~~~~~~~ - -Here’s the Squigglepy implementation of `the example from Squiggle -Docs `__: - -.. code:: python - - import squigglepy as sq - import numpy as np - import matplotlib.pyplot as plt - from squigglepy.numbers import K, M - from pprint import pprint - - pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) # This means that you're 90% confident the value is between 8.1 and 8.4 Million. - pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 # We assume there are almost no people with multiple pianos - pianos_per_piano_tuner = sq.to(2*K, 50*K) - piano_tuners_per_piano = 1 / pianos_per_piano_tuner - total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano - samples = total_tuners_in_2022 @ 1000 # Note: `@ 1000` is shorthand to get 1000 samples - - # Get mean and SD - print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2), - round(np.std(samples), 2))) - - # Get percentiles - pprint(sq.get_percentiles(samples, digits=0)) - - # Histogram - plt.hist(samples, bins=200) - plt.show() - - # Shorter histogram - total_tuners_in_2022.plot() - -And the version from the Squiggle doc that incorporates time: - -.. code:: python - - import squigglepy as sq - from squigglepy.numbers import K, M - - pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) - pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 - pianos_per_piano_tuner = sq.to(2*K, 50*K) - piano_tuners_per_piano = 1 / pianos_per_piano_tuner - - def pop_at_time(t): # t = Time in years after 2022 - avg_yearly_pct_change = sq.to(-0.01, 0.05) # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year - return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t) - - def total_tuners_at_time(t): - return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano - - # Get total piano tuners at 2030 - sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000) - -**WARNING:** Be careful about dividing by ``K``, ``M``, etc. ``1/2*K`` = -500 in Python. Use ``1/(2*K)`` instead to get the expected outcome. - -**WARNING:** Be careful about using ``K`` to get sample counts. Use -``sq.norm(2, 3) @ (2*K)``\ … ``sq.norm(2, 3) @ 2*K`` will return only -two samples, multiplied by 1000. - -Distributions -~~~~~~~~~~~~~ - -.. code:: python - - import squigglepy as sq - - # Normal distribution - sq.norm(1, 3) # 90% interval from 1 to 3 - - # Distribution can be sampled with mean and sd too - sq.norm(mean=0, sd=1) - - # Shorthand to get one sample - ~sq.norm(1, 3) - - # Shorthand to get more than one sample - sq.norm(1, 3) @ 100 - - # Longhand version to get more than one sample - sq.sample(sq.norm(1, 3), n=100) - - # Nice progress reporter - sq.sample(sq.norm(1, 3), n=1000, verbose=True) - - # Other distributions exist - sq.lognorm(1, 10) - sq.tdist(1, 10, t=5) - sq.triangular(1, 2, 3) - sq.pert(1, 2, 3, lam=2) - sq.binomial(p=0.5, n=5) - sq.beta(a=1, b=2) - sq.bernoulli(p=0.5) - sq.poisson(10) - sq.chisquare(2) - sq.gamma(3, 2) - sq.pareto(1) - sq.exponential(scale=1) - sq.geometric(p=0.5) - - # Discrete sampling - sq.discrete({'A': 0.1, 'B': 0.9}) - - # Can return integers - sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15}) - - # Alternate format (also can be used to return more complex objects) - sq.discrete([[0.1, 0], - [0.3, 1], - [0.3, 2], - [0.15, 3], - [0.15, 4]]) - - sq.discrete([0, 1, 2]) # No weights assumes equal weights - - # You can mix distributions together - sq.mixture([sq.norm(1, 3), - sq.norm(4, 10), - sq.lognorm(1, 10)], # Distributions to mix - [0.3, 0.3, 0.4]) # These are the weights on each distribution - - # This is equivalent to the above, just a different way of doing the notation - sq.mixture([[0.3, sq.norm(1,3)], - [0.3, sq.norm(4,10)], - [0.4, sq.lognorm(1,10)]]) - - # Make a zero-inflated distribution - # 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`. - sq.zero_inflated(0.6, sq.norm(1, 2)) - -Additional Features -~~~~~~~~~~~~~~~~~~~ - -.. code:: python - - import squigglepy as sq - - # You can add and subtract distributions - (sq.norm(1,3) + sq.norm(4,5)) @ 100 - (sq.norm(1,3) - sq.norm(4,5)) @ 100 - (sq.norm(1,3) * sq.norm(4,5)) @ 100 - (sq.norm(1,3) / sq.norm(4,5)) @ 100 - - # You can also do math with numbers - ~((sq.norm(sd=5) + 2) * 2) - ~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10) - - # You can change the CI from 90% (default) to 80% - sq.norm(1, 3, credibility=80) - - # You can clip - sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5. - - # You can also clip with a function, and use pipes - sq.norm(0, 3) >> sq.clip(0, 5) - - # You can correlate continuous distributions - a, b = sq.uniform(-1, 1), sq.to(0, 3) - a, b = sq.correlate((a, b), 0.5) # Correlate a and b with a correlation of 0.5 - # You can even pass your own correlation matrix! - a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]]) - -Example: Rolling a Die -^^^^^^^^^^^^^^^^^^^^^^ - -An example of how to use distributions to build tools: - -.. code:: python - - import squigglepy as sq - - def roll_die(sides, n=1): - return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None - - roll_die(sides=6, n=10) - # [2, 6, 5, 2, 6, 2, 3, 1, 5, 2] - -This is already included standard in the utils of this package. Use -``sq.roll_die``. - -Bayesian inference -~~~~~~~~~~~~~~~~~~ - -1% of women at age forty who participate in routine screening have -breast cancer. 80% of women with breast cancer will get positive -mammographies. 9.6% of women without breast cancer will also get -positive mammographies. - -A woman in this age group had a positive mammography in a routine -screening. What is the probability that she actually has breast cancer? - -We can approximate the answer with a Bayesian network (uses rejection -sampling): - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import M - - def mammography(has_cancer): - return sq.event(0.8 if has_cancer else 0.096) - - def define_event(): - cancer = ~sq.bernoulli(0.01) - return({'mammography': mammography(cancer), - 'cancer': cancer}) - - bayes.bayesnet(define_event, - find=lambda e: e['cancer'], - conditional_on=lambda e: e['mammography'], - n=1*M) - # 0.07723995880535531 - -Or if we have the information immediately on hand, we can directly -calculate it. Though this doesn’t work for very complex stuff. - -.. code:: python - - from squigglepy import bayes - bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) - # 0.07763975155279504 - -You can also make distributions and update them: - -.. code:: python - - import matplotlib.pyplot as plt - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import K - import numpy as np - - print('Prior') - prior = sq.norm(1,5) - prior_samples = prior @ (10*K) - plt.hist(prior_samples, bins = 200) - plt.show() - print(sq.get_percentiles(prior_samples)) - print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples))) - print('-') - - print('Evidence') - evidence = sq.norm(2,3) - evidence_samples = evidence @ (10*K) - plt.hist(evidence_samples, bins = 200) - plt.show() - print(sq.get_percentiles(evidence_samples)) - print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples))) - print('-') - - print('Posterior') - posterior = bayes.update(prior, evidence) - posterior_samples = posterior @ (10*K) - plt.hist(posterior_samples, bins = 200) - plt.show() - print(sq.get_percentiles(posterior_samples)) - print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples))) - - print('Average') - average = bayes.average(prior, evidence) - average_samples = average @ (10*K) - plt.hist(average_samples, bins = 200) - plt.show() - print(sq.get_percentiles(average_samples)) - print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples))) - -Example: Alarm net -^^^^^^^^^^^^^^^^^^ - -This is the alarm network from `Bayesian Artificial Intelligence - -Section -2.5.1 `__: - - Assume your house has an alarm system against burglary. - - You live in the seismically active area and the alarm system can get - occasionally set off by an earthquake. - - You have two neighbors, Mary and John, who do not know each other. If - they hear the alarm they call you, but this is not guaranteed. - - The chance of a burglary on a particular day is 0.1%. The chance of - an earthquake on a particular day is 0.2%. - - The alarm will go off 95% of the time with both a burglary and an - earthquake, 94% of the time with just a burglary, 29% of the time - with just an earthquake, and 0.1% of the time with nothing (total - false alarm). - - John will call you 90% of the time when the alarm goes off. But on 5% - of the days, John will just call to say “hi”. Mary will call you 70% - of the time when the alarm goes off. But on 1% of the days, Mary will - just call to say “hi”. - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import M - - def p_alarm_goes_off(burglary, earthquake): - if burglary and earthquake: - return 0.95 - elif burglary and not earthquake: - return 0.94 - elif not burglary and earthquake: - return 0.29 - elif not burglary and not earthquake: - return 0.001 - - def p_john_calls(alarm_goes_off): - return 0.9 if alarm_goes_off else 0.05 - - def p_mary_calls(alarm_goes_off): - return 0.7 if alarm_goes_off else 0.01 - - def define_event(): - burglary_happens = sq.event(p=0.001) - earthquake_happens = sq.event(p=0.002) - alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens)) - john_calls = sq.event(p_john_calls(alarm_goes_off)) - mary_calls = sq.event(p_mary_calls(alarm_goes_off)) - return {'burglary': burglary_happens, - 'earthquake': earthquake_happens, - 'alarm_goes_off': alarm_goes_off, - 'john_calls': john_calls, - 'mary_calls': mary_calls} - - # What are the chances that both John and Mary call if an earthquake happens? - bayes.bayesnet(define_event, - n=1*M, - find=lambda e: (e['mary_calls'] and e['john_calls']), - conditional_on=lambda e: e['earthquake']) - # Result will be ~0.19, though it varies because it is based on a random sample. - # This also may take a minute to run. - - # If both John and Mary call, what is the chance there's been a burglary? - bayes.bayesnet(define_event, - n=1*M, - find=lambda e: e['burglary'], - conditional_on=lambda e: (e['mary_calls'] and e['john_calls'])) - # Result will be ~0.27, though it varies because it is based on a random sample. - # This will run quickly because there is a built-in cache. - # Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache. - -Note that the amount of Bayesian analysis that squigglepy can do is -pretty limited. For more complex bayesian analysis, consider -`sorobn `__, -`pomegranate `__, -`bnlearn `__, or -`pyMC `__. - -Example: A Demonstration of the Monty Hall Problem -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import K, M, B, T - - - def monte_hall(door_picked, switch=False): - doors = ['A', 'B', 'C'] - car_is_behind_door = ~sq.discrete(doors) - reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door]) - - if switch: - old_door_picked = door_picked - door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0] - - won_car = (car_is_behind_door == door_picked) - return won_car - - - def define_event(): - door = ~sq.discrete(['A', 'B', 'C']) - switch = sq.event(0.5) - return {'won': monte_hall(door_picked=door, switch=switch), - 'switched': switch} - - RUNS = 10*K - r = bayes.bayesnet(define_event, - find=lambda e: e['won'], - conditional_on=lambda e: e['switched'], - verbose=True, - n=RUNS) - print('Win {}% of the time when switching'.format(int(r * 100))) - - r = bayes.bayesnet(define_event, - find=lambda e: e['won'], - conditional_on=lambda e: not e['switched'], - verbose=True, - n=RUNS) - print('Win {}% of the time when not switching'.format(int(r * 100))) - - # Win 66% of the time when switching - # Win 34% of the time when not switching - -Example: More complex coin/dice interactions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - Imagine that I flip a coin. If heads, I take a random die out of my - blue bag. If tails, I take a random die out of my red bag. The blue - bag contains only 6-sided dice. The red bag contains a 4-sided die, a - 6-sided die, a 10-sided die, and a 20-sided die. I then roll the - random die I took. What is the chance that I roll a 6? - -.. code:: python - - import squigglepy as sq - from squigglepy.numbers import K, M, B, T - from squigglepy import bayes - - def define_event(): - if sq.flip_coin() == 'heads': # Blue bag - return sq.roll_die(6) - else: # Red bag - return sq.discrete([4, 6, 10, 20]) >> sq.roll_die - - - bayes.bayesnet(define_event, - find=lambda e: e == 6, - verbose=True, - n=100*K) - # This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292 - -Kelly betting -~~~~~~~~~~~~~ - -You can use probability generated, combine with a bankroll to determine -bet sizing using `Kelly -criterion `__. - -For example, if you want to Kelly bet and you’ve… - -- determined that your price (your probability of the event in question - happening / the market in question resolving in your favor) is $0.70 - (70%) -- see that the market is pricing at $0.65 -- you have a bankroll of $1000 that you are willing to bet - -You should bet as follows: - -.. code:: python - - import squigglepy as sq - kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000) - kelly_data['kelly'] # What fraction of my bankroll should I bet on this? - # 0.143 - kelly_data['target'] # How much money should be invested in this? - # 142.86 - kelly_data['expected_roi'] # What is the expected ROI of this bet? - # 0.077 - -More examples -~~~~~~~~~~~~~ - -You can see more examples of squigglepy in action -`here `__. - -Run tests ---------- - -Use ``black .`` for formatting. - -Run -``ruff check . && pytest && pip3 install . && python3 tests/integration.py`` - -Disclaimers ------------ - -This package is unofficial and supported by myself and Rethink -Priorities. It is not affiliated with or associated with the Quantified -Uncertainty Research Institute, which maintains the Squiggle language -(in JavaScript). - -This package is also new and not yet in a stable production version, so -you may encounter bugs and other errors. Please report those so they can -be fixed. It’s also possible that future versions of the package may -introduce breaking changes. - -This package is available under an MIT License. - -Acknowledgements ----------------- - -- The primary author of this package is Peter Wildeford. Agustín - Covarrubias and Bernardo Baron contributed several key features and - developments. -- Thanks to Ozzie Gooen and the Quantified Uncertainty Research - Institute for creating and maintaining the original Squiggle - language. -- Thanks to Dawn Drescher for helping me implement math between - distributions. -- Thanks to Dawn Drescher for coming up with the idea to use ``~`` as a - shorthand for ``sample``, as well as helping me implement it. diff --git a/doc/build/html/_sources/examples.rst.txt b/doc/build/html/_sources/examples.rst.txt deleted file mode 100644 index c00053f..0000000 --- a/doc/build/html/_sources/examples.rst.txt +++ /dev/null @@ -1,468 +0,0 @@ -Examples -======== - -Piano Tuners Example -~~~~~~~~~~~~~~~~~~~~ - -Here’s the Squigglepy implementation of `the example from Squiggle -Docs `__: - -.. code:: python - - import squigglepy as sq - import numpy as np - import matplotlib.pyplot as plt - from squigglepy.numbers import K, M - from pprint import pprint - - pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) # This means that you're 90% confident the value is between 8.1 and 8.4 Million. - pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 # We assume there are almost no people with multiple pianos - pianos_per_piano_tuner = sq.to(2*K, 50*K) - piano_tuners_per_piano = 1 / pianos_per_piano_tuner - total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano - samples = total_tuners_in_2022 @ 1000 # Note: `@ 1000` is shorthand to get 1000 samples - - # Get mean and SD - print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2), - round(np.std(samples), 2))) - - # Get percentiles - pprint(sq.get_percentiles(samples, digits=0)) - - # Histogram - plt.hist(samples, bins=200) - plt.show() - - # Shorter histogram - total_tuners_in_2022.plot() - -And the version from the Squiggle doc that incorporates time: - -.. code:: python - - import squigglepy as sq - from squigglepy.numbers import K, M - - pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) - pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 - pianos_per_piano_tuner = sq.to(2*K, 50*K) - piano_tuners_per_piano = 1 / pianos_per_piano_tuner - - def pop_at_time(t): # t = Time in years after 2022 - avg_yearly_pct_change = sq.to(-0.01, 0.05) # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year - return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t) - - def total_tuners_at_time(t): - return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano - - # Get total piano tuners at 2030 - sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000) - -**WARNING:** Be careful about dividing by ``K``, ``M``, etc. ``1/2*K`` = -500 in Python. Use ``1/(2*K)`` instead to get the expected outcome. - -**WARNING:** Be careful about using ``K`` to get sample counts. Use -``sq.norm(2, 3) @ (2*K)``\ … ``sq.norm(2, 3) @ 2*K`` will return only -two samples, multiplied by 1000. - -Distributions -~~~~~~~~~~~~~ - -.. code:: python - - import squigglepy as sq - - # Normal distribution - sq.norm(1, 3) # 90% interval from 1 to 3 - - # Distribution can be sampled with mean and sd too - sq.norm(mean=0, sd=1) - - # Shorthand to get one sample - ~sq.norm(1, 3) - - # Shorthand to get more than one sample - sq.norm(1, 3) @ 100 - - # Longhand version to get more than one sample - sq.sample(sq.norm(1, 3), n=100) - - # Nice progress reporter - sq.sample(sq.norm(1, 3), n=1000, verbose=True) - - # Other distributions exist - sq.lognorm(1, 10) - sq.tdist(1, 10, t=5) - sq.triangular(1, 2, 3) - sq.pert(1, 2, 3, lam=2) - sq.binomial(p=0.5, n=5) - sq.beta(a=1, b=2) - sq.bernoulli(p=0.5) - sq.poisson(10) - sq.chisquare(2) - sq.gamma(3, 2) - sq.pareto(1) - sq.exponential(scale=1) - sq.geometric(p=0.5) - - # Discrete sampling - sq.discrete({'A': 0.1, 'B': 0.9}) - - # Can return integers - sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15}) - - # Alternate format (also can be used to return more complex objects) - sq.discrete([[0.1, 0], - [0.3, 1], - [0.3, 2], - [0.15, 3], - [0.15, 4]]) - - sq.discrete([0, 1, 2]) # No weights assumes equal weights - - # You can mix distributions together - sq.mixture([sq.norm(1, 3), - sq.norm(4, 10), - sq.lognorm(1, 10)], # Distributions to mix - [0.3, 0.3, 0.4]) # These are the weights on each distribution - - # This is equivalent to the above, just a different way of doing the notation - sq.mixture([[0.3, sq.norm(1,3)], - [0.3, sq.norm(4,10)], - [0.4, sq.lognorm(1,10)]]) - - # Make a zero-inflated distribution - # 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`. - sq.zero_inflated(0.6, sq.norm(1, 2)) - -Additional Features -~~~~~~~~~~~~~~~~~~~ - -.. code:: python - - import squigglepy as sq - - # You can add and subtract distributions - (sq.norm(1,3) + sq.norm(4,5)) @ 100 - (sq.norm(1,3) - sq.norm(4,5)) @ 100 - (sq.norm(1,3) * sq.norm(4,5)) @ 100 - (sq.norm(1,3) / sq.norm(4,5)) @ 100 - - # You can also do math with numbers - ~((sq.norm(sd=5) + 2) * 2) - ~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10) - - # You can change the CI from 90% (default) to 80% - sq.norm(1, 3, credibility=80) - - # You can clip - sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5. - - # You can also clip with a function, and use pipes - sq.norm(0, 3) >> sq.clip(0, 5) - - # You can correlate continuous distributions - a, b = sq.uniform(-1, 1), sq.to(0, 3) - a, b = sq.correlate((a, b), 0.5) # Correlate a and b with a correlation of 0.5 - # You can even pass your own correlation matrix! - a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]]) - -Example: Rolling a Die -^^^^^^^^^^^^^^^^^^^^^^ - -An example of how to use distributions to build tools: - -.. code:: python - - import squigglepy as sq - - def roll_die(sides, n=1): - return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None - - roll_die(sides=6, n=10) - # [2, 6, 5, 2, 6, 2, 3, 1, 5, 2] - -This is already included standard in the utils of this package. Use -``sq.roll_die``. - -Bayesian inference -~~~~~~~~~~~~~~~~~~ - -1% of women at age forty who participate in routine screening have -breast cancer. 80% of women with breast cancer will get positive -mammographies. 9.6% of women without breast cancer will also get -positive mammographies. - -A woman in this age group had a positive mammography in a routine -screening. What is the probability that she actually has breast cancer? - -We can approximate the answer with a Bayesian network (uses rejection -sampling): - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import M - - def mammography(has_cancer): - return sq.event(0.8 if has_cancer else 0.096) - - def define_event(): - cancer = ~sq.bernoulli(0.01) - return({'mammography': mammography(cancer), - 'cancer': cancer}) - - bayes.bayesnet(define_event, - find=lambda e: e['cancer'], - conditional_on=lambda e: e['mammography'], - n=1*M) - # 0.07723995880535531 - -Or if we have the information immediately on hand, we can directly -calculate it. Though this doesn’t work for very complex stuff. - -.. code:: python - - from squigglepy import bayes - bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) - # 0.07763975155279504 - -You can also make distributions and update them: - -.. code:: python - - import matplotlib.pyplot as plt - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import K - import numpy as np - - print('Prior') - prior = sq.norm(1,5) - prior_samples = prior @ (10*K) - plt.hist(prior_samples, bins = 200) - plt.show() - print(sq.get_percentiles(prior_samples)) - print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples))) - print('-') - - print('Evidence') - evidence = sq.norm(2,3) - evidence_samples = evidence @ (10*K) - plt.hist(evidence_samples, bins = 200) - plt.show() - print(sq.get_percentiles(evidence_samples)) - print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples))) - print('-') - - print('Posterior') - posterior = bayes.update(prior, evidence) - posterior_samples = posterior @ (10*K) - plt.hist(posterior_samples, bins = 200) - plt.show() - print(sq.get_percentiles(posterior_samples)) - print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples))) - - print('Average') - average = bayes.average(prior, evidence) - average_samples = average @ (10*K) - plt.hist(average_samples, bins = 200) - plt.show() - print(sq.get_percentiles(average_samples)) - print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples))) - -Example: Alarm net -^^^^^^^^^^^^^^^^^^ - -This is the alarm network from `Bayesian Artificial Intelligence - -Section -2.5.1 `__: - - Assume your house has an alarm system against burglary. - - You live in the seismically active area and the alarm system can get - occasionally set off by an earthquake. - - You have two neighbors, Mary and John, who do not know each other. If - they hear the alarm they call you, but this is not guaranteed. - - The chance of a burglary on a particular day is 0.1%. The chance of - an earthquake on a particular day is 0.2%. - - The alarm will go off 95% of the time with both a burglary and an - earthquake, 94% of the time with just a burglary, 29% of the time - with just an earthquake, and 0.1% of the time with nothing (total - false alarm). - - John will call you 90% of the time when the alarm goes off. But on 5% - of the days, John will just call to say “hi”. Mary will call you 70% - of the time when the alarm goes off. But on 1% of the days, Mary will - just call to say “hi”. - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import M - - def p_alarm_goes_off(burglary, earthquake): - if burglary and earthquake: - return 0.95 - elif burglary and not earthquake: - return 0.94 - elif not burglary and earthquake: - return 0.29 - elif not burglary and not earthquake: - return 0.001 - - def p_john_calls(alarm_goes_off): - return 0.9 if alarm_goes_off else 0.05 - - def p_mary_calls(alarm_goes_off): - return 0.7 if alarm_goes_off else 0.01 - - def define_event(): - burglary_happens = sq.event(p=0.001) - earthquake_happens = sq.event(p=0.002) - alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens)) - john_calls = sq.event(p_john_calls(alarm_goes_off)) - mary_calls = sq.event(p_mary_calls(alarm_goes_off)) - return {'burglary': burglary_happens, - 'earthquake': earthquake_happens, - 'alarm_goes_off': alarm_goes_off, - 'john_calls': john_calls, - 'mary_calls': mary_calls} - - # What are the chances that both John and Mary call if an earthquake happens? - bayes.bayesnet(define_event, - n=1*M, - find=lambda e: (e['mary_calls'] and e['john_calls']), - conditional_on=lambda e: e['earthquake']) - # Result will be ~0.19, though it varies because it is based on a random sample. - # This also may take a minute to run. - - # If both John and Mary call, what is the chance there's been a burglary? - bayes.bayesnet(define_event, - n=1*M, - find=lambda e: e['burglary'], - conditional_on=lambda e: (e['mary_calls'] and e['john_calls'])) - # Result will be ~0.27, though it varies because it is based on a random sample. - # This will run quickly because there is a built-in cache. - # Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache. - -Note that the amount of Bayesian analysis that squigglepy can do is -pretty limited. For more complex bayesian analysis, consider -`sorobn `__, -`pomegranate `__, -`bnlearn `__, or -`pyMC `__. - -Example: A Demonstration of the Monty Hall Problem -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import K, M, B, T - - - def monte_hall(door_picked, switch=False): - doors = ['A', 'B', 'C'] - car_is_behind_door = ~sq.discrete(doors) - reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door]) - - if switch: - old_door_picked = door_picked - door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0] - - won_car = (car_is_behind_door == door_picked) - return won_car - - - def define_event(): - door = ~sq.discrete(['A', 'B', 'C']) - switch = sq.event(0.5) - return {'won': monte_hall(door_picked=door, switch=switch), - 'switched': switch} - - RUNS = 10*K - r = bayes.bayesnet(define_event, - find=lambda e: e['won'], - conditional_on=lambda e: e['switched'], - verbose=True, - n=RUNS) - print('Win {}% of the time when switching'.format(int(r * 100))) - - r = bayes.bayesnet(define_event, - find=lambda e: e['won'], - conditional_on=lambda e: not e['switched'], - verbose=True, - n=RUNS) - print('Win {}% of the time when not switching'.format(int(r * 100))) - - # Win 66% of the time when switching - # Win 34% of the time when not switching - -Example: More complex coin/dice interactions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - Imagine that I flip a coin. If heads, I take a random die out of my - blue bag. If tails, I take a random die out of my red bag. The blue - bag contains only 6-sided dice. The red bag contains a 4-sided die, a - 6-sided die, a 10-sided die, and a 20-sided die. I then roll the - random die I took. What is the chance that I roll a 6? - -.. code:: python - - import squigglepy as sq - from squigglepy.numbers import K, M, B, T - from squigglepy import bayes - - def define_event(): - if sq.flip_coin() == 'heads': # Blue bag - return sq.roll_die(6) - else: # Red bag - return sq.discrete([4, 6, 10, 20]) >> sq.roll_die - - - bayes.bayesnet(define_event, - find=lambda e: e == 6, - verbose=True, - n=100*K) - # This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292 - -Kelly betting -~~~~~~~~~~~~~ - -You can use probability generated, combine with a bankroll to determine -bet sizing using `Kelly -criterion `__. - -For example, if you want to Kelly bet and you’ve… - -- determined that your price (your probability of the event in question - happening / the market in question resolving in your favor) is $0.70 - (70%) -- see that the market is pricing at $0.65 -- you have a bankroll of $1000 that you are willing to bet - -You should bet as follows: - -.. code:: python - - import squigglepy as sq - kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000) - kelly_data['kelly'] # What fraction of my bankroll should I bet on this? - # 0.143 - kelly_data['target'] # How much money should be invested in this? - # 142.86 - kelly_data['expected_roi'] # What is the expected ROI of this bet? - # 0.077 - -More examples -~~~~~~~~~~~~~ - -You can see more examples of squigglepy in action -`here `__. diff --git a/doc/build/html/_sources/index.rst.txt b/doc/build/html/_sources/index.rst.txt deleted file mode 100644 index 3461183..0000000 --- a/doc/build/html/_sources/index.rst.txt +++ /dev/null @@ -1,51 +0,0 @@ -Squigglepy: Implementation of Squiggle in Python -================================================ - -`Squiggle `__ is a "simple -programming language for intuitive probabilistic estimation". It serves -as its own standalone programming language with its own syntax, but it -is implemented in JavaScript. I like the features of Squiggle and intend -to use it frequently, but I also sometimes want to use similar -functionalities in Python, especially alongside other Python statistical -programming packages like Numpy, Pandas, and Matplotlib. The -**squigglepy** package here implements many Squiggle-like -functionalities in Python. - -.. toctree:: - :maxdepth: 2 - :caption: Contents - - Installation - Usage - API Reference - -Disclaimers ------------ - -This package is unofficial and supported by Peter Wildeford and Rethink -Priorities. It is not affiliated with or associated with the Quantified -Uncertainty Research Institute, which maintains the Squiggle language -(in JavaScript). - -This package is also new and not yet in a stable production version, so -you may encounter bugs and other errors. Please report those so they can -be fixed. It’s also possible that future versions of the package may -introduce breaking changes. - -This package is available under an MIT License. - -Acknowledgements ----------------- - -- The primary author of this package is Peter Wildeford. Agustín - Covarrubias and Bernardo Baron contributed several key features and - developments. -- Thanks to Ozzie Gooen and the Quantified Uncertainty Research - Institute for creating and maintaining the original Squiggle - language. -- Thanks to Dawn Drescher for helping me implement math between - distributions. -- Thanks to Dawn Drescher for coming up with the idea to use ``~`` as a - shorthand for ``sample``, as well as helping me implement it. - -.. autosummary:: diff --git a/doc/build/html/_sources/installation.rst.txt b/doc/build/html/_sources/installation.rst.txt deleted file mode 100644 index fb5e8d9..0000000 --- a/doc/build/html/_sources/installation.rst.txt +++ /dev/null @@ -1,12 +0,0 @@ -Installation -============ - -.. code:: shell - - pip install squigglepy - -For plotting support, you can also use the ``plots`` extra: - -.. code:: shell - - pip install squigglepy[plots] diff --git a/doc/build/html/_sources/reference/modules.rst.txt b/doc/build/html/_sources/reference/modules.rst.txt deleted file mode 100644 index 57192bd..0000000 --- a/doc/build/html/_sources/reference/modules.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy -========== - -.. toctree:: - :maxdepth: 4 - - squigglepy diff --git a/doc/build/html/_sources/reference/squigglepy.bayes.rst.txt b/doc/build/html/_sources/reference/squigglepy.bayes.rst.txt deleted file mode 100644 index 8a445be..0000000 --- a/doc/build/html/_sources/reference/squigglepy.bayes.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy.bayes module -======================= - -.. automodule:: squigglepy.bayes - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.correlation.rst.txt b/doc/build/html/_sources/reference/squigglepy.correlation.rst.txt deleted file mode 100644 index c99cf14..0000000 --- a/doc/build/html/_sources/reference/squigglepy.correlation.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy.correlation module -============================= - -.. automodule:: squigglepy.correlation - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.distributions.rst.txt b/doc/build/html/_sources/reference/squigglepy.distributions.rst.txt deleted file mode 100644 index bfbdb38..0000000 --- a/doc/build/html/_sources/reference/squigglepy.distributions.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy.distributions module -=============================== - -.. automodule:: squigglepy.distributions - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.numbers.rst.txt b/doc/build/html/_sources/reference/squigglepy.numbers.rst.txt deleted file mode 100644 index 524cbcd..0000000 --- a/doc/build/html/_sources/reference/squigglepy.numbers.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy.numbers module -========================= - -.. automodule:: squigglepy.numbers - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.rng.rst.txt b/doc/build/html/_sources/reference/squigglepy.rng.rst.txt deleted file mode 100644 index 84ec740..0000000 --- a/doc/build/html/_sources/reference/squigglepy.rng.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy.rng module -===================== - -.. automodule:: squigglepy.rng - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.rst.txt b/doc/build/html/_sources/reference/squigglepy.rst.txt deleted file mode 100644 index b629fda..0000000 --- a/doc/build/html/_sources/reference/squigglepy.rst.txt +++ /dev/null @@ -1,22 +0,0 @@ -squigglepy package -================== - -.. automodule:: squigglepy - :members: - :undoc-members: - :show-inheritance: - -Submodules ----------- - -.. toctree:: - :maxdepth: 4 - - squigglepy.bayes - squigglepy.correlation - squigglepy.distributions - squigglepy.numbers - squigglepy.rng - squigglepy.samplers - squigglepy.utils - squigglepy.version diff --git a/doc/build/html/_sources/reference/squigglepy.samplers.rst.txt b/doc/build/html/_sources/reference/squigglepy.samplers.rst.txt deleted file mode 100644 index ae3e754..0000000 --- a/doc/build/html/_sources/reference/squigglepy.samplers.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy.samplers module -========================== - -.. automodule:: squigglepy.samplers - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.squigglepy.rst.txt b/doc/build/html/_sources/reference/squigglepy.squigglepy.rst.txt deleted file mode 100644 index 9271ec8..0000000 --- a/doc/build/html/_sources/reference/squigglepy.squigglepy.rst.txt +++ /dev/null @@ -1,78 +0,0 @@ -squigglepy.squigglepy package -============================= - -Submodules ----------- - -squigglepy.squigglepy.bayes module ----------------------------------- - -.. automodule:: squigglepy.squigglepy.bayes - :members: - :undoc-members: - :show-inheritance: - -squigglepy.squigglepy.correlation module ----------------------------------------- - -.. automodule:: squigglepy.squigglepy.correlation - :members: - :undoc-members: - :show-inheritance: - -squigglepy.squigglepy.distributions module ------------------------------------------- - -.. automodule:: squigglepy.squigglepy.distributions - :members: - :undoc-members: - :show-inheritance: - -squigglepy.squigglepy.numbers module ------------------------------------- - -.. automodule:: squigglepy.squigglepy.numbers - :members: - :undoc-members: - :show-inheritance: - -squigglepy.squigglepy.rng module --------------------------------- - -.. automodule:: squigglepy.squigglepy.rng - :members: - :undoc-members: - :show-inheritance: - -squigglepy.squigglepy.samplers module -------------------------------------- - -.. automodule:: squigglepy.squigglepy.samplers - :members: - :undoc-members: - :show-inheritance: - -squigglepy.squigglepy.utils module ----------------------------------- - -.. automodule:: squigglepy.squigglepy.utils - :members: - :undoc-members: - :show-inheritance: - -squigglepy.squigglepy.version module ------------------------------------- - -.. automodule:: squigglepy.squigglepy.version - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: squigglepy.squigglepy - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.tests.rst.txt b/doc/build/html/_sources/reference/squigglepy.tests.rst.txt deleted file mode 100644 index cf175cf..0000000 --- a/doc/build/html/_sources/reference/squigglepy.tests.rst.txt +++ /dev/null @@ -1,86 +0,0 @@ -squigglepy.tests package -======================== - -Submodules ----------- - -squigglepy.tests.integration module ------------------------------------ - -.. automodule:: squigglepy.tests.integration - :members: - :undoc-members: - :show-inheritance: - -squigglepy.tests.strategies module ----------------------------------- - -.. automodule:: squigglepy.tests.strategies - :members: - :undoc-members: - :show-inheritance: - -squigglepy.tests.test\_bayes module ------------------------------------ - -.. automodule:: squigglepy.tests.test_bayes - :members: - :undoc-members: - :show-inheritance: - -squigglepy.tests.test\_correlation module ------------------------------------------ - -.. automodule:: squigglepy.tests.test_correlation - :members: - :undoc-members: - :show-inheritance: - -squigglepy.tests.test\_distributions module -------------------------------------------- - -.. automodule:: squigglepy.tests.test_distributions - :members: - :undoc-members: - :show-inheritance: - -squigglepy.tests.test\_numbers module -------------------------------------- - -.. automodule:: squigglepy.tests.test_numbers - :members: - :undoc-members: - :show-inheritance: - -squigglepy.tests.test\_rng module ---------------------------------- - -.. automodule:: squigglepy.tests.test_rng - :members: - :undoc-members: - :show-inheritance: - -squigglepy.tests.test\_samplers module --------------------------------------- - -.. automodule:: squigglepy.tests.test_samplers - :members: - :undoc-members: - :show-inheritance: - -squigglepy.tests.test\_utils module ------------------------------------ - -.. automodule:: squigglepy.tests.test_utils - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: squigglepy.tests - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.utils.rst.txt b/doc/build/html/_sources/reference/squigglepy.utils.rst.txt deleted file mode 100644 index 8af5f44..0000000 --- a/doc/build/html/_sources/reference/squigglepy.utils.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy.utils module -======================= - -.. automodule:: squigglepy.utils - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/reference/squigglepy.version.rst.txt b/doc/build/html/_sources/reference/squigglepy.version.rst.txt deleted file mode 100644 index efe11f5..0000000 --- a/doc/build/html/_sources/reference/squigglepy.version.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -squigglepy.version module -========================= - -.. automodule:: squigglepy.version - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/build/html/_sources/usage.rst.txt b/doc/build/html/_sources/usage.rst.txt deleted file mode 100644 index 3e03a70..0000000 --- a/doc/build/html/_sources/usage.rst.txt +++ /dev/null @@ -1,476 +0,0 @@ -Examples -======== - -Piano tuners example -~~~~~~~~~~~~~~~~~~~~ - -Here’s the Squigglepy implementation of `the example from Squiggle -Docs `__: - -.. code:: python - - import squigglepy as sq - import numpy as np - import matplotlib.pyplot as plt - from squigglepy.numbers import K, M - from pprint import pprint - - pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) # This means that you're 90% confident the value is between 8.1 and 8.4 Million. - pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 # We assume there are almost no people with multiple pianos - pianos_per_piano_tuner = sq.to(2*K, 50*K) - piano_tuners_per_piano = 1 / pianos_per_piano_tuner - total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano - samples = total_tuners_in_2022 @ 1000 # Note: `@ 1000` is shorthand to get 1000 samples - - # Get mean and SD - print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2), - round(np.std(samples), 2))) - - # Get percentiles - pprint(sq.get_percentiles(samples, digits=0)) - - # Histogram - plt.hist(samples, bins=200) - plt.show() - - # Shorter histogram - total_tuners_in_2022.plot() - -And the version from the Squiggle doc that incorporates time: - -.. code:: python - - import squigglepy as sq - from squigglepy.numbers import K, M - - pop_of_ny_2022 = sq.to(8.1*M, 8.4*M) - pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01 - pianos_per_piano_tuner = sq.to(2*K, 50*K) - piano_tuners_per_piano = 1 / pianos_per_piano_tuner - - def pop_at_time(t): # t = Time in years after 2022 - avg_yearly_pct_change = sq.to(-0.01, 0.05) # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year - return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t) - - def total_tuners_at_time(t): - return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano - - # Get total piano tuners at 2030 - sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000) - -**WARNING:** Be careful about dividing by ``K``, ``M``, etc. ``1/2*K`` = -500 in Python. Use ``1/(2*K)`` instead to get the expected outcome. - -**WARNING:** Be careful about using ``K`` to get sample counts. Use -``sq.norm(2, 3) @ (2*K)``\ … ``sq.norm(2, 3) @ 2*K`` will return only -two samples, multiplied by 1000. - -Distributions -~~~~~~~~~~~~~ - -.. code:: python - - import squigglepy as sq - - # Normal distribution - sq.norm(1, 3) # 90% interval from 1 to 3 - - # Distribution can be sampled with mean and sd too - sq.norm(mean=0, sd=1) - - # Shorthand to get one sample - ~sq.norm(1, 3) - - # Shorthand to get more than one sample - sq.norm(1, 3) @ 100 - - # Longhand version to get more than one sample - sq.sample(sq.norm(1, 3), n=100) - - # Nice progress reporter - sq.sample(sq.norm(1, 3), n=1000, verbose=True) - - # Other distributions exist - sq.lognorm(1, 10) - sq.tdist(1, 10, t=5) - sq.triangular(1, 2, 3) - sq.pert(1, 2, 3, lam=2) - sq.binomial(p=0.5, n=5) - sq.beta(a=1, b=2) - sq.bernoulli(p=0.5) - sq.poisson(10) - sq.chisquare(2) - sq.gamma(3, 2) - sq.pareto(1) - sq.exponential(scale=1) - sq.geometric(p=0.5) - - # Discrete sampling - sq.discrete({'A': 0.1, 'B': 0.9}) - - # Can return integers - sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15}) - - # Alternate format (also can be used to return more complex objects) - sq.discrete([[0.1, 0], - [0.3, 1], - [0.3, 2], - [0.15, 3], - [0.15, 4]]) - - sq.discrete([0, 1, 2]) # No weights assumes equal weights - - # You can mix distributions together - sq.mixture([sq.norm(1, 3), - sq.norm(4, 10), - sq.lognorm(1, 10)], # Distributions to mix - [0.3, 0.3, 0.4]) # These are the weights on each distribution - - # This is equivalent to the above, just a different way of doing the notation - sq.mixture([[0.3, sq.norm(1,3)], - [0.3, sq.norm(4,10)], - [0.4, sq.lognorm(1,10)]]) - - # Make a zero-inflated distribution - # 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`. - sq.zero_inflated(0.6, sq.norm(1, 2)) - -Additional features -~~~~~~~~~~~~~~~~~~~ - -.. code:: python - - import squigglepy as sq - - # You can add and subtract distributions - (sq.norm(1,3) + sq.norm(4,5)) @ 100 - (sq.norm(1,3) - sq.norm(4,5)) @ 100 - (sq.norm(1,3) * sq.norm(4,5)) @ 100 - (sq.norm(1,3) / sq.norm(4,5)) @ 100 - - # You can also do math with numbers - ~((sq.norm(sd=5) + 2) * 2) - ~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10) - - # You can change the CI from 90% (default) to 80% - sq.norm(1, 3, credibility=80) - - # You can clip - sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5. - - # You can also clip with a function, and use pipes - sq.norm(0, 3) >> sq.clip(0, 5) - - # You can correlate continuous distributions - a, b = sq.uniform(-1, 1), sq.to(0, 3) - a, b = sq.correlate((a, b), 0.5) # Correlate a and b with a correlation of 0.5 - # You can even pass your own correlation matrix! - a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]]) - -Example: Rolling a die -^^^^^^^^^^^^^^^^^^^^^^ - -An example of how to use distributions to build tools: - -.. code:: python - - import squigglepy as sq - - def roll_die(sides, n=1): - return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None - - roll_die(sides=6, n=10) - # [2, 6, 5, 2, 6, 2, 3, 1, 5, 2] - -This is already included standard in the utils of this package. Use -``sq.roll_die``. - -Bayesian inference -~~~~~~~~~~~~~~~~~~ - -1% of women at age forty who participate in routine screening have -breast cancer. 80% of women with breast cancer will get positive -mammographies. 9.6% of women without breast cancer will also get -positive mammographies. - -A woman in this age group had a positive mammography in a routine -screening. What is the probability that she actually has breast cancer? - -We can approximate the answer with a Bayesian network (uses rejection -sampling): - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import M - - def mammography(has_cancer): - return sq.event(0.8 if has_cancer else 0.096) - - def define_event(): - cancer = ~sq.bernoulli(0.01) - return({'mammography': mammography(cancer), - 'cancer': cancer}) - - bayes.bayesnet(define_event, - find=lambda e: e['cancer'], - conditional_on=lambda e: e['mammography'], - n=1*M) - # 0.07723995880535531 - -Or if we have the information immediately on hand, we can directly -calculate it. Though this doesn’t work for very complex stuff. - -.. code:: python - - from squigglepy import bayes - bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) - # 0.07763975155279504 - -You can also make distributions and update them: - -.. code:: python - - import matplotlib.pyplot as plt - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import K - import numpy as np - - print('Prior') - prior = sq.norm(1,5) - prior_samples = prior @ (10*K) - plt.hist(prior_samples, bins = 200) - plt.show() - print(sq.get_percentiles(prior_samples)) - print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples))) - print('-') - - print('Evidence') - evidence = sq.norm(2,3) - evidence_samples = evidence @ (10*K) - plt.hist(evidence_samples, bins = 200) - plt.show() - print(sq.get_percentiles(evidence_samples)) - print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples))) - print('-') - - print('Posterior') - posterior = bayes.update(prior, evidence) - posterior_samples = posterior @ (10*K) - plt.hist(posterior_samples, bins = 200) - plt.show() - print(sq.get_percentiles(posterior_samples)) - print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples))) - - print('Average') - average = bayes.average(prior, evidence) - average_samples = average @ (10*K) - plt.hist(average_samples, bins = 200) - plt.show() - print(sq.get_percentiles(average_samples)) - print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples))) - -Example: Alarm net -^^^^^^^^^^^^^^^^^^ - -This is the alarm network from `Bayesian Artificial Intelligence - -Section -2.5.1 `__: - - Assume your house has an alarm system against burglary. - - You live in the seismically active area and the alarm system can get - occasionally set off by an earthquake. - - You have two neighbors, Mary and John, who do not know each other. If - they hear the alarm they call you, but this is not guaranteed. - - The chance of a burglary on a particular day is 0.1%. The chance of - an earthquake on a particular day is 0.2%. - - The alarm will go off 95% of the time with both a burglary and an - earthquake, 94% of the time with just a burglary, 29% of the time - with just an earthquake, and 0.1% of the time with nothing (total - false alarm). - - John will call you 90% of the time when the alarm goes off. But on 5% - of the days, John will just call to say “hi”. Mary will call you 70% - of the time when the alarm goes off. But on 1% of the days, Mary will - just call to say “hi”. - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import M - - def p_alarm_goes_off(burglary, earthquake): - if burglary and earthquake: - return 0.95 - elif burglary and not earthquake: - return 0.94 - elif not burglary and earthquake: - return 0.29 - elif not burglary and not earthquake: - return 0.001 - - def p_john_calls(alarm_goes_off): - return 0.9 if alarm_goes_off else 0.05 - - def p_mary_calls(alarm_goes_off): - return 0.7 if alarm_goes_off else 0.01 - - def define_event(): - burglary_happens = sq.event(p=0.001) - earthquake_happens = sq.event(p=0.002) - alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens)) - john_calls = sq.event(p_john_calls(alarm_goes_off)) - mary_calls = sq.event(p_mary_calls(alarm_goes_off)) - return {'burglary': burglary_happens, - 'earthquake': earthquake_happens, - 'alarm_goes_off': alarm_goes_off, - 'john_calls': john_calls, - 'mary_calls': mary_calls} - - # What are the chances that both John and Mary call if an earthquake happens? - bayes.bayesnet(define_event, - n=1*M, - find=lambda e: (e['mary_calls'] and e['john_calls']), - conditional_on=lambda e: e['earthquake']) - # Result will be ~0.19, though it varies because it is based on a random sample. - # This also may take a minute to run. - - # If both John and Mary call, what is the chance there's been a burglary? - bayes.bayesnet(define_event, - n=1*M, - find=lambda e: e['burglary'], - conditional_on=lambda e: (e['mary_calls'] and e['john_calls'])) - # Result will be ~0.27, though it varies because it is based on a random sample. - # This will run quickly because there is a built-in cache. - # Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache. - -Note that the amount of Bayesian analysis that squigglepy can do is -pretty limited. For more complex bayesian analysis, consider -`sorobn `__, -`pomegranate `__, -`bnlearn `__, or -`pyMC `__. - -Example: A demonstration of the Monty Hall Problem -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code:: python - - import squigglepy as sq - from squigglepy import bayes - from squigglepy.numbers import K, M, B, T - - - def monte_hall(door_picked, switch=False): - doors = ['A', 'B', 'C'] - car_is_behind_door = ~sq.discrete(doors) - reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door]) - - if switch: - old_door_picked = door_picked - door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0] - - won_car = (car_is_behind_door == door_picked) - return won_car - - - def define_event(): - door = ~sq.discrete(['A', 'B', 'C']) - switch = sq.event(0.5) - return {'won': monte_hall(door_picked=door, switch=switch), - 'switched': switch} - - RUNS = 10*K - r = bayes.bayesnet(define_event, - find=lambda e: e['won'], - conditional_on=lambda e: e['switched'], - verbose=True, - n=RUNS) - print('Win {}% of the time when switching'.format(int(r * 100))) - - r = bayes.bayesnet(define_event, - find=lambda e: e['won'], - conditional_on=lambda e: not e['switched'], - verbose=True, - n=RUNS) - print('Win {}% of the time when not switching'.format(int(r * 100))) - - # Win 66% of the time when switching - # Win 34% of the time when not switching - -Example: More complex coin/dice interactions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - Imagine that I flip a coin. If heads, I take a random die out of my - blue bag. If tails, I take a random die out of my red bag. The blue - bag contains only 6-sided dice. The red bag contains a 4-sided die, a - 6-sided die, a 10-sided die, and a 20-sided die. I then roll the - random die I took. What is the chance that I roll a 6? - -.. code:: python - - import squigglepy as sq - from squigglepy.numbers import K, M, B, T - from squigglepy import bayes - - def define_event(): - if sq.flip_coin() == 'heads': # Blue bag - return sq.roll_die(6) - else: # Red bag - return sq.discrete([4, 6, 10, 20]) >> sq.roll_die - - - bayes.bayesnet(define_event, - find=lambda e: e == 6, - verbose=True, - n=100*K) - # This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292 - -Kelly betting -~~~~~~~~~~~~~ - -You can use probability generated, combine with a bankroll to determine -bet sizing using `Kelly -criterion `__. - -For example, if you want to Kelly bet and you’ve… - -- determined that your price (your probability of the event in question - happening / the market in question resolving in your favor) is $0.70 - (70%) -- see that the market is pricing at $0.65 -- you have a bankroll of $1000 that you are willing to bet - -You should bet as follows: - -.. code:: python - - import squigglepy as sq - kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000) - kelly_data['kelly'] # What fraction of my bankroll should I bet on this? - # 0.143 - kelly_data['target'] # How much money should be invested in this? - # 142.86 - kelly_data['expected_roi'] # What is the expected ROI of this bet? - # 0.077 - -More examples -~~~~~~~~~~~~~ - -You can see more examples of squigglepy in action -`here `__. - -Run tests ---------- - -Use ``black .`` for formatting. - -Run -``ruff check . && pytest && pip3 install . && python3 tests/integration.py`` diff --git a/doc/build/html/_static/alabaster.css b/doc/build/html/_static/alabaster.css deleted file mode 100644 index 517d0b2..0000000 --- a/doc/build/html/_static/alabaster.css +++ /dev/null @@ -1,703 +0,0 @@ -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: Georgia, serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Georgia, serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: Georgia, serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -div.sphinxsidebar .badge { - border-bottom: none; -} - -div.sphinxsidebar .badge:hover { - border-bottom: none; -} - -/* To address an issue with donation coming after search */ -div.sphinxsidebar h3.donation { - margin-top: 10px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Georgia, serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: Georgia, serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -/* relbar */ - -.related { - line-height: 30px; - width: 100%; - font-size: 0.9rem; -} - -.related.top { - border-bottom: 1px solid #EEE; - margin-bottom: 20px; -} - -.related.bottom { - border-top: 1px solid #EEE; -} - -.related ul { - padding: 0; - margin: 0; - list-style: none; -} - -.related li { - display: inline; -} - -nav#rellinks { - float: right; -} - -nav#rellinks li+li:before { - content: "|"; -} - -nav#breadcrumbs li+li:before { - content: "\00BB"; -} - -/* Hide certain items when printing */ -@media print { - div.related { - display: none; - } -} \ No newline at end of file diff --git a/doc/build/html/_static/basic.css b/doc/build/html/_static/basic.css deleted file mode 100644 index e760386..0000000 --- a/doc/build/html/_static/basic.css +++ /dev/null @@ -1,925 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 270px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a:visited { - color: #551A8B; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -nav.contents, -aside.topic, -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -nav.contents, -aside.topic, -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -.sig dd { - margin-top: 0px; - margin-bottom: 0px; -} - -.sig dl { - margin-top: 0px; - margin-bottom: 0px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -.translated { - background-color: rgba(207, 255, 207, 0.2) -} - -.untranslated { - background-color: rgba(255, 207, 207, 0.2) -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/doc/build/html/_static/custom.css b/doc/build/html/_static/custom.css deleted file mode 100644 index 2a924f1..0000000 --- a/doc/build/html/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/doc/build/html/_static/doctools.js b/doc/build/html/_static/doctools.js deleted file mode 100644 index d06a71d..0000000 --- a/doc/build/html/_static/doctools.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", -]); - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/doc/build/html/_static/documentation_options.js b/doc/build/html/_static/documentation_options.js deleted file mode 100644 index 7e4c114..0000000 --- a/doc/build/html/_static/documentation_options.js +++ /dev/null @@ -1,13 +0,0 @@ -const DOCUMENTATION_OPTIONS = { - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/doc/build/html/_static/file.png b/doc/build/html/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/doc/build/html/_static/jquery.js b/doc/build/html/_static/jquery.js deleted file mode 100644 index 7e32910..0000000 --- a/doc/build/html/_static/jquery.js +++ /dev/null @@ -1,10365 +0,0 @@ -/*! - * jQuery JavaScript Library v3.3.1-dfsg - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2019-04-19T06:52Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. - - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - - - - var preservedScriptAttributes = { - type: true, - src: true, - noModule: true - }; - - function DOMEval( code, doc, node ) { - doc = doc || document; - - var i, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - if ( node[ i ] ) { - script[ i ] = node[ i ]; - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.3.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - div.style.position = "absolute"; - scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. -function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; - } - return ret; -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - ) ); - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - val = curCSS( elem, dimension, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox; - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = valueIsBorderBox && - ( support.boxSizingReliable() || val === elem.style[ dimension ] ); - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - if ( val === "auto" || - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { - - val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; - - // offsetWidth/offsetHeight provide border-box values - valueIsBorderBox = true; - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra && boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ); - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && support.scrollboxSize() === styles.position ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = Date.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " -{% endmacro %} - -{% macro body_post() %} - - - -{% endmacro %} \ No newline at end of file diff --git a/doc/build/html/examples.html b/doc/build/html/examples.html deleted file mode 100644 index 0011e57..0000000 --- a/doc/build/html/examples.html +++ /dev/null @@ -1,891 +0,0 @@ - - - - - - - - - - - Examples — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    Examples#

    -
    -

    Piano Tuners Example#

    -

    Here’s the Squigglepy implementation of the example from Squiggle -Docs:

    -
    import squigglepy as sq
    -import numpy as np
    -import matplotlib.pyplot as plt
    -from squigglepy.numbers import K, M
    -from pprint import pprint
    -
    -pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)  # This means that you're 90% confident the value is between 8.1 and 8.4 Million.
    -pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01  # We assume there are almost no people with multiple pianos
    -pianos_per_piano_tuner = sq.to(2*K, 50*K)
    -piano_tuners_per_piano = 1 / pianos_per_piano_tuner
    -total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano
    -samples = total_tuners_in_2022 @ 1000  # Note: `@ 1000` is shorthand to get 1000 samples
    -
    -# Get mean and SD
    -print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2),
    -                                round(np.std(samples), 2)))
    -
    -# Get percentiles
    -pprint(sq.get_percentiles(samples, digits=0))
    -
    -# Histogram
    -plt.hist(samples, bins=200)
    -plt.show()
    -
    -# Shorter histogram
    -total_tuners_in_2022.plot()
    -
    -
    -

    And the version from the Squiggle doc that incorporates time:

    -
    import squigglepy as sq
    -from squigglepy.numbers import K, M
    -
    -pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)
    -pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01
    -pianos_per_piano_tuner = sq.to(2*K, 50*K)
    -piano_tuners_per_piano = 1 / pianos_per_piano_tuner
    -
    -def pop_at_time(t):  # t = Time in years after 2022
    -    avg_yearly_pct_change = sq.to(-0.01, 0.05)  # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year
    -    return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t)
    -
    -def total_tuners_at_time(t):
    -    return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano
    -
    -# Get total piano tuners at 2030
    -sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000)
    -
    -
    -

    WARNING: Be careful about dividing by K, M, etc. 1/2*K = -500 in Python. Use 1/(2*K) instead to get the expected outcome.

    -

    WARNING: Be careful about using K to get sample counts. Use -sq.norm(2, 3) @ (2*K)sq.norm(2, 3) @ 2*K will return only -two samples, multiplied by 1000.

    -
    -
    -

    Distributions#

    -
    import squigglepy as sq
    -
    -# Normal distribution
    -sq.norm(1, 3)  # 90% interval from 1 to 3
    -
    -# Distribution can be sampled with mean and sd too
    -sq.norm(mean=0, sd=1)
    -
    -# Shorthand to get one sample
    -~sq.norm(1, 3)
    -
    -# Shorthand to get more than one sample
    -sq.norm(1, 3) @ 100
    -
    -# Longhand version to get more than one sample
    -sq.sample(sq.norm(1, 3), n=100)
    -
    -# Nice progress reporter
    -sq.sample(sq.norm(1, 3), n=1000, verbose=True)
    -
    -# Other distributions exist
    -sq.lognorm(1, 10)
    -sq.tdist(1, 10, t=5)
    -sq.triangular(1, 2, 3)
    -sq.pert(1, 2, 3, lam=2)
    -sq.binomial(p=0.5, n=5)
    -sq.beta(a=1, b=2)
    -sq.bernoulli(p=0.5)
    -sq.poisson(10)
    -sq.chisquare(2)
    -sq.gamma(3, 2)
    -sq.pareto(1)
    -sq.exponential(scale=1)
    -sq.geometric(p=0.5)
    -
    -# Discrete sampling
    -sq.discrete({'A': 0.1, 'B': 0.9})
    -
    -# Can return integers
    -sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15})
    -
    -# Alternate format (also can be used to return more complex objects)
    -sq.discrete([[0.1,  0],
    -             [0.3,  1],
    -             [0.3,  2],
    -             [0.15, 3],
    -             [0.15, 4]])
    -
    -sq.discrete([0, 1, 2]) # No weights assumes equal weights
    -
    -# You can mix distributions together
    -sq.mixture([sq.norm(1, 3),
    -            sq.norm(4, 10),
    -            sq.lognorm(1, 10)],  # Distributions to mix
    -           [0.3, 0.3, 0.4])     # These are the weights on each distribution
    -
    -# This is equivalent to the above, just a different way of doing the notation
    -sq.mixture([[0.3, sq.norm(1,3)],
    -            [0.3, sq.norm(4,10)],
    -            [0.4, sq.lognorm(1,10)]])
    -
    -# Make a zero-inflated distribution
    -# 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`.
    -sq.zero_inflated(0.6, sq.norm(1, 2))
    -
    -
    -
    -
    -

    Additional Features#

    -
    import squigglepy as sq
    -
    -# You can add and subtract distributions
    -(sq.norm(1,3) + sq.norm(4,5)) @ 100
    -(sq.norm(1,3) - sq.norm(4,5)) @ 100
    -(sq.norm(1,3) * sq.norm(4,5)) @ 100
    -(sq.norm(1,3) / sq.norm(4,5)) @ 100
    -
    -# You can also do math with numbers
    -~((sq.norm(sd=5) + 2) * 2)
    -~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10)
    -
    -# You can change the CI from 90% (default) to 80%
    -sq.norm(1, 3, credibility=80)
    -
    -# You can clip
    -sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5.
    -
    -# You can also clip with a function, and use pipes
    -sq.norm(0, 3) >> sq.clip(0, 5)
    -
    -# You can correlate continuous distributions
    -a, b = sq.uniform(-1, 1), sq.to(0, 3)
    -a, b = sq.correlate((a, b), 0.5)  # Correlate a and b with a correlation of 0.5
    -# You can even pass your own correlation matrix!
    -a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]])
    -
    -
    -
    -

    Example: Rolling a Die#

    -

    An example of how to use distributions to build tools:

    -
    import squigglepy as sq
    -
    -def roll_die(sides, n=1):
    -    return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None
    -
    -roll_die(sides=6, n=10)
    -# [2, 6, 5, 2, 6, 2, 3, 1, 5, 2]
    -
    -
    -

    This is already included standard in the utils of this package. Use -sq.roll_die.

    -
    -
    -
    -

    Bayesian inference#

    -

    1% of women at age forty who participate in routine screening have -breast cancer. 80% of women with breast cancer will get positive -mammographies. 9.6% of women without breast cancer will also get -positive mammographies.

    -

    A woman in this age group had a positive mammography in a routine -screening. What is the probability that she actually has breast cancer?

    -

    We can approximate the answer with a Bayesian network (uses rejection -sampling):

    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import M
    -
    -def mammography(has_cancer):
    -    return sq.event(0.8 if has_cancer else 0.096)
    -
    -def define_event():
    -    cancer = ~sq.bernoulli(0.01)
    -    return({'mammography': mammography(cancer),
    -            'cancer': cancer})
    -
    -bayes.bayesnet(define_event,
    -               find=lambda e: e['cancer'],
    -               conditional_on=lambda e: e['mammography'],
    -               n=1*M)
    -# 0.07723995880535531
    -
    -
    -

    Or if we have the information immediately on hand, we can directly -calculate it. Though this doesn’t work for very complex stuff.

    -
    from squigglepy import bayes
    -bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096)
    -# 0.07763975155279504
    -
    -
    -

    You can also make distributions and update them:

    -
    import matplotlib.pyplot as plt
    -import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import K
    -import numpy as np
    -
    -print('Prior')
    -prior = sq.norm(1,5)
    -prior_samples = prior @ (10*K)
    -plt.hist(prior_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(prior_samples))
    -print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples)))
    -print('-')
    -
    -print('Evidence')
    -evidence = sq.norm(2,3)
    -evidence_samples = evidence @ (10*K)
    -plt.hist(evidence_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(evidence_samples))
    -print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples)))
    -print('-')
    -
    -print('Posterior')
    -posterior = bayes.update(prior, evidence)
    -posterior_samples = posterior @ (10*K)
    -plt.hist(posterior_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(posterior_samples))
    -print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples)))
    -
    -print('Average')
    -average = bayes.average(prior, evidence)
    -average_samples = average @ (10*K)
    -plt.hist(average_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(average_samples))
    -print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples)))
    -
    -
    -
    -

    Example: Alarm net#

    -

    This is the alarm network from Bayesian Artificial Intelligence - -Section -2.5.1:

    -
    -

    Assume your house has an alarm system against burglary.

    -

    You live in the seismically active area and the alarm system can get -occasionally set off by an earthquake.

    -

    You have two neighbors, Mary and John, who do not know each other. If -they hear the alarm they call you, but this is not guaranteed.

    -

    The chance of a burglary on a particular day is 0.1%. The chance of -an earthquake on a particular day is 0.2%.

    -

    The alarm will go off 95% of the time with both a burglary and an -earthquake, 94% of the time with just a burglary, 29% of the time -with just an earthquake, and 0.1% of the time with nothing (total -false alarm).

    -

    John will call you 90% of the time when the alarm goes off. But on 5% -of the days, John will just call to say “hi”. Mary will call you 70% -of the time when the alarm goes off. But on 1% of the days, Mary will -just call to say “hi”.

    -
    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import M
    -
    -def p_alarm_goes_off(burglary, earthquake):
    -    if burglary and earthquake:
    -        return 0.95
    -    elif burglary and not earthquake:
    -        return 0.94
    -    elif not burglary and earthquake:
    -        return 0.29
    -    elif not burglary and not earthquake:
    -        return 0.001
    -
    -def p_john_calls(alarm_goes_off):
    -    return 0.9 if alarm_goes_off else 0.05
    -
    -def p_mary_calls(alarm_goes_off):
    -    return 0.7 if alarm_goes_off else 0.01
    -
    -def define_event():
    -    burglary_happens = sq.event(p=0.001)
    -    earthquake_happens = sq.event(p=0.002)
    -    alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens))
    -    john_calls = sq.event(p_john_calls(alarm_goes_off))
    -    mary_calls = sq.event(p_mary_calls(alarm_goes_off))
    -    return {'burglary': burglary_happens,
    -            'earthquake': earthquake_happens,
    -            'alarm_goes_off': alarm_goes_off,
    -            'john_calls': john_calls,
    -            'mary_calls': mary_calls}
    -
    -# What are the chances that both John and Mary call if an earthquake happens?
    -bayes.bayesnet(define_event,
    -               n=1*M,
    -               find=lambda e: (e['mary_calls'] and e['john_calls']),
    -               conditional_on=lambda e: e['earthquake'])
    -# Result will be ~0.19, though it varies because it is based on a random sample.
    -# This also may take a minute to run.
    -
    -# If both John and Mary call, what is the chance there's been a burglary?
    -bayes.bayesnet(define_event,
    -               n=1*M,
    -               find=lambda e: e['burglary'],
    -               conditional_on=lambda e: (e['mary_calls'] and e['john_calls']))
    -# Result will be ~0.27, though it varies because it is based on a random sample.
    -# This will run quickly because there is a built-in cache.
    -# Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache.
    -
    -
    -

    Note that the amount of Bayesian analysis that squigglepy can do is -pretty limited. For more complex bayesian analysis, consider -sorobn, -pomegranate, -bnlearn, or -pyMC.

    -
    -
    -

    Example: A Demonstration of the Monty Hall Problem#

    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import K, M, B, T
    -
    -
    -def monte_hall(door_picked, switch=False):
    -    doors = ['A', 'B', 'C']
    -    car_is_behind_door = ~sq.discrete(doors)
    -    reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door])
    -
    -    if switch:
    -        old_door_picked = door_picked
    -        door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0]
    -
    -    won_car = (car_is_behind_door == door_picked)
    -    return won_car
    -
    -
    -def define_event():
    -    door = ~sq.discrete(['A', 'B', 'C'])
    -    switch = sq.event(0.5)
    -    return {'won': monte_hall(door_picked=door, switch=switch),
    -            'switched': switch}
    -
    -RUNS = 10*K
    -r = bayes.bayesnet(define_event,
    -                   find=lambda e: e['won'],
    -                   conditional_on=lambda e: e['switched'],
    -                   verbose=True,
    -                   n=RUNS)
    -print('Win {}% of the time when switching'.format(int(r * 100)))
    -
    -r = bayes.bayesnet(define_event,
    -                   find=lambda e: e['won'],
    -                   conditional_on=lambda e: not e['switched'],
    -                   verbose=True,
    -                   n=RUNS)
    -print('Win {}% of the time when not switching'.format(int(r * 100)))
    -
    -# Win 66% of the time when switching
    -# Win 34% of the time when not switching
    -
    -
    -
    -
    -

    Example: More complex coin/dice interactions#

    -
    -

    Imagine that I flip a coin. If heads, I take a random die out of my -blue bag. If tails, I take a random die out of my red bag. The blue -bag contains only 6-sided dice. The red bag contains a 4-sided die, a -6-sided die, a 10-sided die, and a 20-sided die. I then roll the -random die I took. What is the chance that I roll a 6?

    -
    -
    import squigglepy as sq
    -from squigglepy.numbers import K, M, B, T
    -from squigglepy import bayes
    -
    -def define_event():
    -    if sq.flip_coin() == 'heads': # Blue bag
    -        return sq.roll_die(6)
    -    else: # Red bag
    -        return sq.discrete([4, 6, 10, 20]) >> sq.roll_die
    -
    -
    -bayes.bayesnet(define_event,
    -               find=lambda e: e == 6,
    -               verbose=True,
    -               n=100*K)
    -# This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292
    -
    -
    -
    -
    -
    -

    Kelly betting#

    -

    You can use probability generated, combine with a bankroll to determine -bet sizing using Kelly -criterion.

    -

    For example, if you want to Kelly bet and you’ve…

    -
      -
    • determined that your price (your probability of the event in question -happening / the market in question resolving in your favor) is $0.70 -(70%)

    • -
    • see that the market is pricing at $0.65

    • -
    • you have a bankroll of $1000 that you are willing to bet

    • -
    -

    You should bet as follows:

    -
    import squigglepy as sq
    -kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000)
    -kelly_data['kelly']  # What fraction of my bankroll should I bet on this?
    -# 0.143
    -kelly_data['target']  # How much money should be invested in this?
    -# 142.86
    -kelly_data['expected_roi']  # What is the expected ROI of this bet?
    -# 0.077
    -
    -
    -
    -
    -

    More examples#

    -

    You can see more examples of squigglepy in action -here.

    -
    -
    - - -
    - - - - - - - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html deleted file mode 100644 index 0709a93..0000000 --- a/doc/build/html/genindex.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - - - - - Index — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    - - - - - -
    - - -

    Index

    - -
    - A - | B - | C - | D - | E - | F - | G - | H - | I - | K - | L - | M - | N - | O - | P - | Q - | R - | S - | T - | U - | Z - -
    -

    A

    - - -
    - -

    B

    - - - -
    - -

    C

    - - - -
    - -

    D

    - - - -
    - -

    E

    - - - -
    - -

    F

    - - - -
    - -

    G

    - - - -
    - -

    H

    - - - -
    - -

    I

    - - - -
    - -

    K

    - - -
    - -

    L

    - - - -
    - -

    M

    - - -
    - -

    N

    - - - -
    - -

    O

    - - - -
    - -

    P

    - - - -
    - -

    Q

    - - -
    - -

    R

    - - - -
    - -

    S

    - - - -
      -
    • - squigglepy.numbers - -
    • -
    • - squigglepy.rng - -
    • -
    • - squigglepy.samplers - -
    • -
    • - squigglepy.utils - -
    • -
    • - squigglepy.version - -
    • -
    - -

    T

    - - - -
    - -

    U

    - - - -
    - -

    Z

    - - -
    - - - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/index.html b/doc/build/html/index.html deleted file mode 100644 index 50ecd3c..0000000 --- a/doc/build/html/index.html +++ /dev/null @@ -1,467 +0,0 @@ - - - - - - - - - - - Squigglepy: Implementation of Squiggle in Python — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    - - - - - -
    - -
    -

    Squigglepy: Implementation of Squiggle in Python#

    -

    Squiggle is a “simple -programming language for intuitive probabilistic estimation”. It serves -as its own standalone programming language with its own syntax, but it -is implemented in JavaScript. I like the features of Squiggle and intend -to use it frequently, but I also sometimes want to use similar -functionalities in Python, especially alongside other Python statistical -programming packages like Numpy, Pandas, and Matplotlib. The -squigglepy package here implements many Squiggle-like -functionalities in Python.

    - -
    -

    Disclaimers#

    -

    This package is unofficial and supported by Peter Wildeford and Rethink -Priorities. It is not affiliated with or associated with the Quantified -Uncertainty Research Institute, which maintains the Squiggle language -(in JavaScript).

    -

    This package is also new and not yet in a stable production version, so -you may encounter bugs and other errors. Please report those so they can -be fixed. It’s also possible that future versions of the package may -introduce breaking changes.

    -

    This package is available under an MIT License.

    -
    -
    -

    Acknowledgements#

    -
      -
    • The primary author of this package is Peter Wildeford. Agustín -Covarrubias and Bernardo Baron contributed several key features and -developments.

    • -
    • Thanks to Ozzie Gooen and the Quantified Uncertainty Research -Institute for creating and maintaining the original Squiggle -language.

    • -
    • Thanks to Dawn Drescher for helping me implement math between -distributions.

    • -
    • Thanks to Dawn Drescher for coming up with the idea to use ~ as a -shorthand for sample, as well as helping me implement it.

    • -
    - - - -
    -
    -
    - - -
    - - - - - - - -
    - - - -
    - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/installation.html b/doc/build/html/installation.html deleted file mode 100644 index 24b281c..0000000 --- a/doc/build/html/installation.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - - - - - - Installation — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    Installation#

    -
    pip install squigglepy
    -
    -
    -

    For plotting support, you can also use the plots extra:

    -
    pip install squigglepy[plots]
    -
    -
    -
    - - -
    - - - - - - - -
    - - - -
    - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/objects.inv b/doc/build/html/objects.inv deleted file mode 100644 index a26aeaca7cfc918c5d1e4c861ed4d7cf4da80055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1336 zcmV-81;_d$AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkYadl~D zXKZC~c?u&SR%LQ?X>V>iAPOTORA^-&a%F8{X>Md?av*PJAarPHb0B7EY-J#6b0A}H zZE$jBb8}^6Aa!$TZf78RY-wUH3V7PRn@w-rHV}sI`zr*rSG&p8$GV0QplOXJJri7M zBoU!VnIGwHetk(%U;8D=@JueoLK;3VMR7*2DB8YyQB@M!W7ZxY8eMn^*@w(P2?kUS zzu7V1zIKiLC57Dmn%(VYr}q2^cAe0Lt#a=9cQCwy$Sb|dozN=#xJtZ=>i#Nl7%VHA zRstKZ^}Rgb7Tmq_DsycNNZvJG9sXJH(oL9$Jx;%$jrMI6$tAb;R#z`H-T)s@Lct1Q zT{p_yIV1Ky3>2keIKUbnlny^v(`gyzdZ5$G*4#4d%TnY5lw+26v$+r<*{pCW|H0L| zAW;{p@Hw#a`AR3)2*tb-uO9kK#h*>%blsA}Yv4HHyRLgwl=Rl2qg|Or1&_kyGo`;>)Y&hW5@s>X>B*at$4-74?-U z>$q~%B2Fl;y(N_i@Z13LfIS^rt-?cvI$@r9)6nMqGwAS43Momd@~5u8QVS?;8sgjW zSsa`vt}1`gU&h~UuwZ)$KV9U$mD;V_ptnlBJpDsEyI#Vh#A#XyEv(gwRD*Vqz8b+* z^NXKS{`7NbX;o>?{S^P)%sE$xL(W+~~I{=swwO3iJ;! znuT)LefPi-P`(MCeZwkpAGoxBY*e+*2|+82dkcr5V_Q=F=l+f z>Aw_g>EfxtZL;I|(EiN^9UNY3SbDEPM-T4^=-`=oLT7i*37Lm?p+2JH#h{j;aS;*Ej=hx zK%xC!3KdF>Xn=)82zTl~S2MHm1NcnlDj&XwGL8mfHE&x`77wWN+#4L;!5L`850qgm zgZ&Trvu)vH6&73&`vy`TF=*YBjw?hI(?wx%c-`R}jK`ag@)dGWGb6Mg|O<_aM3?Jax);HY^R76y&?eU`_1`uuNByT0pQTmjO8d4#Q zr6JC|76qn&;gr-i_6e(O#g{V&1}_hc4h6pu@4Nxs7Q!t%Q2W3Ovr&N(s(?dgUGX6K z9%Od+F&mC{;n}D7b2o(*I*&oKh%ckiL-r}=P7~@|+H0uG@oZ?3y&PSwRe)K?WxpNq zggG4_#HS;>(D5t1ZI5@uiPYwE8j95K+1Zt5sc)yPr@>5vX6L=VIGH%pu_N+Q*z-v`u~At?iv$)i~d0ncd(l>7DMyTvNPUkIQbdmQ;sT zyEVP}qFr{S{gOsp&0FISt8dv^yCv?pGPedld11+}5td}q8_k-=RH(9xwoCM(jIHtK uRV=&GzSpq8O - - - - - - - - Python Module Index — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/modules.html b/doc/build/html/reference/modules.html deleted file mode 100644 index d999cee..0000000 --- a/doc/build/html/reference/modules.html +++ /dev/null @@ -1,595 +0,0 @@ - - - - - - - - - - - squigglepy — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy#

    -
    - -
    -
    - - -
    - - - - - - - -
    - - - -
    - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.bayes.html b/doc/build/html/reference/squigglepy.bayes.html deleted file mode 100644 index ada266d..0000000 --- a/doc/build/html/reference/squigglepy.bayes.html +++ /dev/null @@ -1,655 +0,0 @@ - - - - - - - - - - - squigglepy.bayes module — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.bayes module#

    -

    This modules includes functions for Bayesian inference.

    -
    -
    -squigglepy.bayes.average(prior, evidence, weights=[0.5, 0.5], relative_weights=None)[source]#
    -

    Average two distributions.

    -
    -
    Parameters:
    -
    -
    priorDistribution

    The prior distribution.

    -
    -
    evidenceDistribution

    The distribution used to average with the prior.

    -
    -
    weightslist or np.array or float

    How much weight to put on prior versus evidence when averaging? If -only one weight is passed, the other weight will be inferred to make the -total weights sum to 1. Defaults to 50-50 weights.

    -
    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized -to sum to 1.

    -
    -
    -
    -
    Returns:
    -
    -
    Distribution

    A mixture distribution that accords weights to prior and evidence.

    -
    -
    -
    -
    -

    Examples

    -

    >> prior = sq.norm(1,5) ->> evidence = sq.norm(2,3) ->> bayes.average(prior, evidence) -<Distribution> mixture

    -
    - -
    -
    -squigglepy.bayes.bayesnet(event_fn=None, n=1, find=None, conditional_on=None, reduce_fn=None, raw=False, memcache=True, memcache_load=True, memcache_save=True, reload_cache=False, dump_cache_file=None, load_cache_file=None, cache_file_primary=False, verbose=False, cores=1)[source]#
    -

    Calculate a Bayesian network.

    -

    Allows you to find conditional probabilities of custom events based on -rejection sampling.

    -
    -
    Parameters:
    -
    -
    event_fnfunction

    A function that defines the bayesian network

    -
    -
    nint

    The number of samples to generate

    -
    -
    finda function or None

    What do we want to know the probability of?

    -
    -
    conditional_ona function or None

    When finding the probability, what do we want to condition on?

    -
    -
    reduce_fna function or None

    When taking all the results of the simulations, how do we aggregate them -into a final answer? Defaults to np.mean.

    -
    -
    rawbool

    If True, just return the results of each simulation without aggregating.

    -
    -
    memcachebool

    If True, cache the results in-memory for future calculations. Each cache -will be matched based on the event_fn. Default True.

    -
    -
    memcache_loadbool

    If True, load cache from the in-memory. This will be true if memcache -is True. Cache will be matched based on the event_fn. Default True.

    -
    -
    memcache_savebool

    If True, save results to an in-memory cache. This will be true if memcache -is True. Cache will be matched based on the event_fn. Default True.

    -
    -
    reload_cachebool

    If True, any existing cache will be ignored and recalculated. Default False.

    -
    -
    dump_cache_filestr or None

    If present, will write out the cache to a binary file with this path with -.sqlcache appended to the file name.

    -
    -
    load_cache_filestr or None

    If present, will first attempt to load and use a cache from a file with this -path with .sqlcache appended to the file name.

    -
    -
    cache_file_primarybool

    If both an in-memory cache and file cache are present, the file -cache will be used for the cache if this is True, and the in-memory cache -will be used otherwise. Defaults to False.

    -
    -
    verbosebool

    If True, will print out statements on computational progress.

    -
    -
    coresint

    If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing -pool with that many cores / processes.

    -
    -
    -
    -
    Returns:
    -
    -
    various

    The result of reduce_fn on n simulations of event_fn.

    -
    -
    -
    -
    -

    Examples

    -

    # Cancer example: prior of having cancer is 1%, the likelihood of a positive -# mammography given cancer is 80% (true positive rate), and the likelihood of -# a positive mammography given no cancer is 9.6% (false positive rate). -# Given this, what is the probability of cancer given a positive mammography? ->> def mammography(has_cancer): ->> p = 0.8 if has_cancer else 0.096 ->> return bool(sq.sample(sq.bernoulli(p))) ->> ->> def define_event(): ->> cancer = sq.sample(sq.bernoulli(0.01)) ->> return({‘mammography’: mammography(cancer), ->> ‘cancer’: cancer}) ->> ->> bayes.bayesnet(define_event, ->> find=lambda e: e[‘cancer’], ->> conditional_on=lambda e: e[‘mammography’], ->> n=1*M) -0.07723995880535531

    -
    - -
    -
    -squigglepy.bayes.simple_bayes(likelihood_h, likelihood_not_h, prior)[source]#
    -

    Calculate Bayes rule.

    -

    p(h|e) = (p(e|h)*p(h)) / (p(e|h)*p(h) + p(e|~h)*(1-p(h))) -p(h|e) is called posterior -p(e|h) is called likelihood -p(h) is called prior

    -
    -
    Parameters:
    -
    -
    likelihood_hfloat

    The likelihood (given that the hypothesis is true), aka p(e|h)

    -
    -
    likelihood_not_hfloat

    The likelihood given the hypothesis is not true, aka p(e|~h)

    -
    -
    priorfloat

    The prior probability, aka p(h)

    -
    -
    -
    -
    Returns:
    -
    -
    float

    The result of Bayes rule, aka p(h|e)

    -
    -
    -
    -
    -

    Examples

    -

    # Cancer example: prior of having cancer is 1%, the likelihood of a positive -# mammography given cancer is 80% (true positive rate), and the likelihood of -# a positive mammography given no cancer is 9.6% (false positive rate). -# Given this, what is the probability of cancer given a positive mammography? ->>> simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096) -0.07763975155279504

    -
    - -
    -
    -squigglepy.bayes.update(prior, evidence, evidence_weight=1)[source]#
    -

    Update a distribution.

    -

    Starting with a prior distribution, use Bayesian inference to perform an update, -producing a posterior distribution from the evidence distribution.

    -
    -
    Parameters:
    -
    -
    priorDistribution

    The prior distribution. Currently must either be normal or beta type. Other -types are not yet supported.

    -
    -
    evidenceDistribution

    The distribution used to update the prior. Currently must either be normal -or beta type. Other types are not yet supported.

    -
    -
    evidence_weightfloat

    How much weight to put on the evidence distribution? Currently this only matters -for normal distributions, where this should be equivalent to the sample weight.

    -
    -
    -
    -
    Returns:
    -
    -
    Distribution

    The posterior distribution

    -
    -
    -
    -
    -

    Examples

    -

    >> prior = sq.norm(1,5) ->> evidence = sq.norm(2,3) ->> bayes.update(prior, evidence) -<Distribution> norm(mean=2.53, sd=0.29)

    -
    - -
    - - -
    - - - - - - - -
    - - - -
    - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.correlation.html b/doc/build/html/reference/squigglepy.correlation.html deleted file mode 100644 index df78a95..0000000 --- a/doc/build/html/reference/squigglepy.correlation.html +++ /dev/null @@ -1,614 +0,0 @@ - - - - - - - - - - - squigglepy.correlation module — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.correlation module#

    -

    This module implements the Iman-Conover method for inducing correlations between distributions.

    -

    Some of the code has been adapted from Abraham Lee’s mcerp package (tisimst/mcerp).

    -
    -
    -class squigglepy.correlation.CorrelationGroup(correlated_dists: tuple[OperableDistribution], correlation_matrix: NDArray[np.float64], correlation_tolerance: float | None = 0.05, min_unique_samples: int = 100)[source]#
    -

    Bases: object

    -

    An object that holds metadata for a group of correlated distributions. -This object is not intended to be used directly by the user, but -rather during sampling to induce correlations between distributions.

    -

    Methods

    - - - - - - - - - -

    has_sufficient_sample_diversity(samples[, ...])

    Check if there is there are sufficient unique samples to work with in the data.

    induce_correlation(data)

    Induce a set of correlations on a column-wise dataset

    -
    -
    -correlated_dists: tuple[OperableDistribution]#
    -
    - -
    -
    -correlation_matrix: NDArray[np.float64]#
    -
    - -
    -
    -correlation_tolerance: float | None = 0.05#
    -
    - -
    -
    -has_sufficient_sample_diversity(samples: ndarray[Any, dtype[float64]], relative_threshold: float = 0.7, absolute_threshold=None) bool[source]#
    -

    Check if there is there are sufficient unique samples to work with in the data.

    -
    - -
    -
    -induce_correlation(data: ndarray[Any, dtype[float64]]) ndarray[Any, dtype[float64]][source]#
    -

    Induce a set of correlations on a column-wise dataset

    -
    -
    Parameters:
    -
    -
    data2d-array

    An m-by-n array where m is the number of samples and n is the -number of independent variables, each column of the array corresponding -to each variable

    -
    -
    corrmat2d-array

    An n-by-n array that defines the desired correlation coefficients -(between -1 and 1). Note: the matrix must be symmetric and -positive-definite in order to induce.

    -
    -
    -
    -
    Returns:
    -
    -
    new_data2d-array

    An m-by-n array that has the desired correlations.

    -
    -
    -
    -
    -
    - -
    -
    -min_unique_samples: int = 100#
    -
    - -
    - -
    -
    -squigglepy.correlation.correlate(variables: tuple[OperableDistribution, ...], correlation: NDArray[np.float64] | list[list[float]] | np.float64 | float, tolerance: float | np.float64 | None = 0.05, _min_unique_samples: int = 100)[source]#
    -

    Correlate a set of variables according to a rank correlation matrix.

    -

    This employs the Iman-Conover method to induce the correlation while -preserving the original marginal distributions.

    -

    This method works on a best-effort basis, and may fail to induce the desired -correlation depending on the distributions provided. An exception will be raised -if that’s the case.

    -
    -
    Parameters:
    -
    -
    variablestuple of distributions

    The variables to correlate as a tuple of distributions.

    -

    The distributions must be able to produce enough unique samples for the method -to be able to induce the desired correlation by shuffling the samples.

    -

    Discrete distributions are notably hard to correlate this way, -as it’s common for them to result in very few unique samples.

    -
    -
    correlation2d-array or float

    An n-by-n array that defines the desired Spearman rank correlation coefficients. -This matrix must be symmetric and positive semi-definite; and must not be confused with -a covariance matrix.

    -

    Correlation parameters can only be between -1 and 1, exclusive -(including extremely close approximations).

    -

    If a float is provided, all variables will be correlated with the same coefficient.

    -
    -
    tolerancefloat, optional

    If provided, overrides the absolute tolerance used to check if the resulting -correlation matrix matches the desired correlation matrix. Defaults to 0.05.

    -

    Checking can also be disabled by passing None.

    -
    -
    -
    -
    Returns:
    -
    -
    correlated_variablestuple of distributions

    The correlated variables as a tuple of distributions in the same order as -the input variables.

    -
    -
    -
    -
    -

    Examples

    -

    Suppose we want to correlate two variables with a correlation coefficient of 0.65: ->>> solar_radiation, temperature = sq.gamma(300, 100), sq.to(22, 28) ->>> solar_radiation, temperature = sq.correlate((solar_radiation, temperature), 0.7) ->>> print(np.corrcoef(solar_radiation @ 1000, temperature @ 1000)[0, 1]) -0.6975960649767123

    -

    Or you could pass a correlation matrix:

    -
    >>> funding_gap, cost_per_delivery, effect_size = (
    -        sq.to(20_000, 80_000), sq.to(30, 80), sq.beta(2, 5)
    -    )
    ->>> funding_gap, cost_per_delivery, effect_size = sq.correlate(
    -        (funding_gap, cost_per_delivery, effect_size),
    -        [[1, 0.6, -0.5], [0.6, 1, -0.2], [-0.5, -0.2, 1]]
    -    )
    ->>> print(np.corrcoef(funding_gap @ 1000, cost_per_delivery @ 1000, effect_size @ 1000))
    -array([[ 1.      ,  0.580520  , -0.480149],
    -       [ 0.580962,  1.        , -0.187831],
    -       [-0.480149, -0.187831  ,  1.        ]])
    -
    -
    -
    - -
    - - -
    - - - - - - - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.distributions.html b/doc/build/html/reference/squigglepy.distributions.html deleted file mode 100644 index 233fb54..0000000 --- a/doc/build/html/reference/squigglepy.distributions.html +++ /dev/null @@ -1,1904 +0,0 @@ - - - - - - - - - - - squigglepy.distributions module — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.distributions module#

    -

    A collection of probability distributions and functions to operate on them.

    -
    -
    -class squigglepy.distributions.BaseDistribution[source]#
    -

    Bases: ABC

    -
    - -
    -
    -class squigglepy.distributions.BernoulliDistribution(p)[source]#
    -

    Bases: DiscreteDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.BetaDistribution(a, b)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.BinomialDistribution(n, p)[source]#
    -

    Bases: DiscreteDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.CategoricalDistribution(items)[source]#
    -

    Bases: DiscreteDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.ChiSquareDistribution(df)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.ComplexDistribution(left, right=None, fn=<built-in function add>, fn_str='+', infix=True)[source]#
    -

    Bases: CompositeDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.CompositeDistribution[source]#
    -

    Bases: OperableDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.ConstantDistribution(x)[source]#
    -

    Bases: DiscreteDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.ContinuousDistribution[source]#
    -

    Bases: OperableDistribution, ABC

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.DiscreteDistribution[source]#
    -

    Bases: OperableDistribution, ABC

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.ExponentialDistribution(scale, lclip=None, rclip=None)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.GammaDistribution(shape, scale=1, lclip=None, rclip=None)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.GeometricDistribution(p)[source]#
    -

    Bases: OperableDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.LogTDistribution(x=None, y=None, t=1, credibility=90, lclip=None, rclip=None)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.LognormalDistribution(x=None, y=None, norm_mean=None, norm_sd=None, lognorm_mean=None, lognorm_sd=None, credibility=90, lclip=None, rclip=None)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.MixtureDistribution(dists, weights=None, relative_weights=None, lclip=None, rclip=None)[source]#
    -

    Bases: CompositeDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.NormalDistribution(x=None, y=None, mean=None, sd=None, credibility=90, lclip=None, rclip=None)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.OperableDistribution[source]#
    -

    Bases: BaseDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    -
    -plot(num_samples=None, bins=None)[source]#
    -

    Plot a histogram of the samples.

    -
    -
    Parameters:
    -
    -
    num_samplesint

    The number of samples to draw for plotting. Defaults to 1000 if not set.

    -
    -
    binsint

    The number of bins to plot. Defaults to 200 if not set.

    -
    -
    -
    -
    -

    Examples

    -
    >>> sq.norm(5, 10).plot()
    -
    -
    -
    - -
    - -
    -
    -class squigglepy.distributions.PERTDistribution(left, mode, right, lam=4, lclip=None, rclip=None)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.ParetoDistribution(shape)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.PoissonDistribution(lam, lclip=None, rclip=None)[source]#
    -

    Bases: DiscreteDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.TDistribution(x=None, y=None, t=20, credibility=90, lclip=None, rclip=None)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.TriangularDistribution(left, mode, right)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -class squigglepy.distributions.UniformDistribution(x, y)[source]#
    -

    Bases: ContinuousDistribution

    -

    Methods

    - - - - - - -

    plot([num_samples, bins])

    Plot a histogram of the samples.

    -
    - -
    -
    -squigglepy.distributions.bernoulli(p)[source]#
    -

    Initialize a Bernoulli distribution.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability of the binary event. Must be between 0 and 1.

    -
    -
    -
    -
    Returns:
    -
    -
    BernoulliDistribution
    -
    -
    -
    -

    Examples

    -
    >>> bernoulli(0.1)
    -<Distribution> bernoulli(p=0.1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.beta(a, b)[source]#
    -

    Initialize a beta distribution.

    -
    -
    Parameters:
    -
    -
    afloat

    The alpha shape value of the distribution. Typically takes the value of the -number of trials that resulted in a success.

    -
    -
    bfloat

    The beta shape value of the distribution. Typically takes the value of the -number of trials that resulted in a failure.

    -
    -
    -
    -
    Returns:
    -
    -
    BetaDistribution
    -
    -
    -
    -

    Examples

    -
    >>> beta(1, 2)
    -<Distribution> beta(1, 2)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.binomial(n, p)[source]#
    -

    Initialize a binomial distribution.

    -
    -
    Parameters:
    -
    -
    nint

    The number of trials.

    -
    -
    pfloat

    The probability of success for each trial. Must be between 0 and 1.

    -
    -
    -
    -
    Returns:
    -
    -
    BinomialDistribution
    -
    -
    -
    -

    Examples

    -
    >>> binomial(1, 0.1)
    -<Distribution> binomial(1, 0.1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.chisquare(df)[source]#
    -

    Initialize a chi-square distribution.

    -
    -
    Parameters:
    -
    -
    dffloat

    The degrees of freedom. Must be positive.

    -
    -
    -
    -
    Returns:
    -
    -
    ChiSquareDistribution
    -
    -
    -
    -

    Examples

    -
    >>> chisquare(2)
    -<Distribution> chiaquare(2)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.clip(dist1, left, right=None)[source]#
    -

    Initialize the clipping/bounding of the output of the distribution.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will -be suitable for use in piping.

    -
    -
    leftint or float or None

    The value to use as the lower bound for clipping.

    -
    -
    rightint or float or None

    The value to use as the upper bound for clipping.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> clip(norm(0, 1), 0.5, 0.9)
    -<Distribution> rclip(lclip(norm(mean=0.5, sd=0.3), 0.5), 0.9)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.const(x)[source]#
    -

    Initialize a constant distribution.

    -

    Constant distributions always return the same value no matter what.

    -
    -
    Parameters:
    -
    -
    xanything

    The value the constant distribution should always return.

    -
    -
    -
    -
    Returns:
    -
    -
    ConstantDistribution
    -
    -
    -
    -

    Examples

    -
    >>> const(1)
    -<Distribution> const(1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.discrete(items)[source]#
    -

    Initialize a discrete distribution (aka categorical distribution).

    -
    -
    Parameters:
    -
    -
    itemslist or dict

    The values that the discrete distribution will return and their associated -weights (or likelihoods of being returned when sampled).

    -
    -
    -
    -
    Returns:
    -
    -
    CategoricalDistribution
    -
    -
    -
    -

    Examples

    -
    >>> discrete({0: 0.1, 1: 0.9})  # 10% chance of returning 0, 90% chance of returning 1
    -<Distribution> categorical({0: 0.1, 1: 0.9})
    ->>> discrete([[0.1, 0], [0.9, 1]])  # Different notation for the same thing.
    -<Distribution> categorical([[0.1, 0], [0.9, 1]])
    ->>> discrete([0, 1, 2])  # When no weights are given, all have equal chance of happening.
    -<Distribution> categorical([0, 1, 2])
    ->>> discrete({'a': 0.1, 'b': 0.9})  # Values do not have to be numbers.
    -<Distribution> categorical({'a': 0.1, 'b': 0.9})
    -
    -
    -
    - -
    -
    -squigglepy.distributions.dist_ceil(dist1)[source]#
    -

    Initialize the ceiling rounding of the output of the distribution.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution

    The distribution to sample and then ceiling round.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> dist_ceil(norm(0, 1))
    -<Distribution> ceil(norm(mean=0.5, sd=0.3))
    -
    -
    -
    - -
    -
    -squigglepy.distributions.dist_exp(dist1)[source]#
    -

    Initialize the exp of the output of the distribution.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution

    The distribution to sample and then take the exp of.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> dist_exp(norm(0, 1))
    -<Distribution> exp(norm(mean=0.5, sd=0.3))
    -
    -
    -
    - -
    -
    -squigglepy.distributions.dist_floor(dist1)[source]#
    -

    Initialize the floor rounding of the output of the distribution.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution

    The distribution to sample and then floor round.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> dist_floor(norm(0, 1))
    -<Distribution> floor(norm(mean=0.5, sd=0.3))
    -
    -
    -
    - -
    -
    -squigglepy.distributions.dist_fn(dist1, dist2=None, fn=None, name=None)[source]#
    -

    Initialize a distribution that has a custom function applied to the result.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution or function or list

    Typically, the distribution to apply the function to. Could also be a function -or list of functions if dist_fn is being used in a pipe.

    -
    -
    dist2Distribution or function or list or None

    Typically, the second distribution to apply the function to if the function takes -two arguments. Could also be a function or list of functions if dist_fn is -being used in a pipe.

    -
    -
    fnfunction or None

    The function to apply to the distribution(s).

    -
    -
    namestr or None

    By default, fn.__name__ will be used to name the function. But you can pass -a custom name.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated -when it is sampled.

    -
    -
    -
    -
    -

    Examples

    -
    >>> def double(x):
    ->>>     return x * 2
    ->>> dist_fn(norm(0, 1), double)
    -<Distribution> double(norm(mean=0.5, sd=0.3))
    ->>> norm(0, 1) >> dist_fn(double)
    -<Distribution> double(norm(mean=0.5, sd=0.3))
    -
    -
    -
    - -
    -
    -squigglepy.distributions.dist_log(dist1, base=2.718281828459045)[source]#
    -

    Initialize the log of the output of the distribution.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution

    The distribution to sample and then take the log of.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> dist_log(norm(0, 1), 10)
    -<Distribution> log(norm(mean=0.5, sd=0.3), const(10))
    -
    -
    -
    - -
    -
    -squigglepy.distributions.dist_max(dist1, dist2=None)[source]#
    -

    Initialize the calculation of the maximum value of two distributions.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution

    The distribution to sample and determine the max of.

    -
    -
    dist2Distribution

    The second distribution to sample and determine the max of.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated -when it is sampled.

    -
    -
    -
    -
    -

    Examples

    -
    >>> dist_max(norm(0, 1), norm(1, 2))
    -<Distribution> max(norm(mean=0.5, sd=0.3), norm(mean=1.5, sd=0.3))
    -
    -
    -
    - -
    -
    -squigglepy.distributions.dist_min(dist1, dist2=None)[source]#
    -

    Initialize the calculation of the minimum value of two distributions.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution

    The distribution to sample and determine the min of.

    -
    -
    dist2Distribution

    The second distribution to sample and determine the min of.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> dist_min(norm(0, 1), norm(1, 2))
    -<Distribution> min(norm(mean=0.5, sd=0.3), norm(mean=1.5, sd=0.3))
    -
    -
    -
    - -
    -
    -squigglepy.distributions.dist_round(dist1, digits=0)[source]#
    -

    Initialize the rounding of the output of the distribution.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution

    The distribution to sample and then round.

    -
    -
    digitsint

    The number of digits to round to.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> dist_round(norm(0, 1))
    -<Distribution> round(norm(mean=0.5, sd=0.3), 0)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.exponential(scale, lclip=None, rclip=None)[source]#
    -

    Initialize an exponential distribution.

    -
    -
    Parameters:
    -
    -
    scalefloat

    The scale value of the exponential distribution (> 0)

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    ExponentialDistribution
    -
    -
    -
    -

    Examples

    -
    >>> exponential(1)
    -<Distribution> exponential(1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.gamma(shape, scale=1, lclip=None, rclip=None)[source]#
    -

    Initialize a gamma distribution.

    -
    -
    Parameters:
    -
    -
    shapefloat

    The shape value of the gamma distribution.

    -
    -
    scalefloat

    The scale value of the gamma distribution. Defaults to 1.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    GammaDistribution
    -
    -
    -
    -

    Examples

    -
    >>> gamma(10, 1)
    -<Distribution> gamma(shape=10, scale=1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.geometric(p)[source]#
    -

    Initialize a geometric distribution.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability of success of an individual trial. Must be between 0 and 1.

    -
    -
    -
    -
    Returns:
    -
    -
    GeometricDistribution
    -
    -
    -
    -

    Examples

    -
    >>> geometric(0.1)
    -<Distribution> geometric(0.1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.inf0(p_zero, dist)[source]#
    -

    Initialize an arbitrary zero-inflated distribution.

    -

    Alias for zero_inflated.

    -
    -
    Parameters:
    -
    -
    p_zerofloat

    The chance of the distribution returning zero

    -
    -
    distDistribution

    The distribution to sample from when not zero

    -
    -
    -
    -
    Returns:
    -
    -
    MixtureDistribution
    -
    -
    -
    -

    Examples

    -
    >>> inf0(0.6, norm(1, 2))
    -<Distribution> mixture
    - - 0
    - - <Distribution> norm(mean=1.5, sd=0.3)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.lclip(dist1, val=None)[source]#
    -

    Initialize the clipping/bounding of the output of the distribution by the lower value.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will -be suitable for use in piping.

    -
    -
    valint or float or None

    The value to use as the lower bound for clipping.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> lclip(norm(0, 1), 0.5)
    -<Distribution> lclip(norm(mean=0.5, sd=0.3), 0.5)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.log_tdist(x=None, y=None, t=1, credibility=90, lclip=None, rclip=None)[source]#
    -

    Initialize a log t-distribution, which is a t-distribution in log-space.

    -

    Is defined either via a loose credible interval from x to y (use credibility or -it will default to being a 90% CI). Unlike the normal and lognormal distributions, this -credible interval is an approximation and is not precisely defined.

    -

    If x and y are not defined, can just return a classic t-distribution defined via -t as the number of degrees of freedom, but in log-space.

    -
    -
    Parameters:
    -
    -
    xfloat or None

    The low value of a credible interval defined by credibility. Must be greater than 0. -Defaults to a 90% CI.

    -
    -
    yfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 1.

    -
    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    LogTDistribution
    -
    -
    -
    -

    Examples

    -
    >>> log_tdist(0, 1, 2)
    -<Distribution> log_tdist(x=0, y=1, t=2)
    ->>> log_tdist()
    -<Distribution> log_tdist(t=1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.lognorm(x=None, y=None, credibility=90, norm_mean=None, norm_sd=None, lognorm_mean=None, lognorm_sd=None, lclip=None, rclip=None)[source]#
    -

    Initialize a lognormal distribution.

    -

    Can be defined either via a credible interval from x to y (use credibility or -it will default to being a 90% CI) or defined via mean and sd.

    -
    -
    Parameters:
    -
    -
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI. -Must be a value greater than 0.

    -
    -
    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI. -Must be a value greater than 0.

    -
    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90. Ignored if the distribution is -defined instead by mean and sd.

    -
    -
    norm_meanfloat or None

    The mean of the underlying normal distribution. If not defined, defaults to 0.

    -
    -
    norm_sdfloat

    The standard deviation of the underlying normal distribution.

    -
    -
    lognorm_meanfloat or None

    The mean of the lognormal distribution. If not defined, defaults to 1.

    -
    -
    lognorm_sdfloat

    The standard deviation of the lognormal distribution.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    LognormalDistribution
    -
    -
    -
    -

    Examples

    -
    >>> lognorm(1, 10)
    -<Distribution> lognorm(lognorm_mean=4.04, lognorm_sd=3.21, norm_mean=1.15, norm_sd=0.7)
    ->>> lognorm(norm_mean=1, norm_sd=2)
    -<Distribution> lognorm(lognorm_mean=20.09, lognorm_sd=147.05, norm_mean=1, norm_sd=2)
    ->>> lognorm(lognorm_mean=1, lognorm_sd=2)
    -<Distribution> lognorm(lognorm_mean=1, lognorm_sd=2, norm_mean=-0.8, norm_sd=1.27)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.mixture(dists, weights=None, relative_weights=None, lclip=None, rclip=None)[source]#
    -

    Initialize a mixture distribution, which is a combination of different distributions.

    -
    -
    Parameters:
    -
    -
    distslist or dict

    The distributions to mix. Can also be defined as a list of weights and distributions.

    -
    -
    weightslist or None

    The weights for each distribution.

    -
    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized -to sum to 1.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    MixtureDistribution
    -
    -
    -
    -

    Examples

    -
    >>> mixture([norm(1, 2), norm(3, 4)], weights=[0.1, 0.9])
    -<Distribution> mixture
    - - <Distribution> norm(mean=1.5, sd=0.3)
    - - <Distribution> norm(mean=3.5, sd=0.3)
    ->>> mixture([[0.1, norm(1, 2)], [0.9, norm(3, 4)]])  # Different notation for the same thing.
    -<Distribution> mixture
    - - <Distribution> norm(mean=1.5, sd=0.3)
    - - <Distribution> norm(mean=3.5, sd=0.3)
    ->>> mixture([norm(1, 2), norm(3, 4)])  # When no weights are given, all have equal chance
    ->>>                                    # of happening.
    -<Distribution> mixture
    - - <Distribution> norm(mean=1.5, sd=0.3)
    - - <Distribution> norm(mean=3.5, sd=0.3)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.norm(x=None, y=None, credibility=90, mean=None, sd=None, lclip=None, rclip=None) NormalDistribution[source]#
    -

    Initialize a normal distribution.

    -

    Can be defined either via a credible interval from x to y (use credibility or -it will default to being a 90% CI) or defined via mean and sd.

    -
    -
    Parameters:
    -
    -
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90. Ignored if the distribution is -defined instead by mean and sd.

    -
    -
    meanfloat or None

    The mean of the normal distribution. If not defined, defaults to 0.

    -
    -
    sdfloat

    The standard deviation of the normal distribution.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    NormalDistribution
    -
    -
    -
    -

    Examples

    -
    >>> norm(0, 1)
    -<Distribution> norm(mean=0.5, sd=0.3)
    ->>> norm(mean=1, sd=2)
    -<Distribution> norm(mean=1, sd=2)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.pareto(shape)[source]#
    -

    Initialize a pareto distribution.

    -
    -
    Parameters:
    -
    -
    shapefloat

    The shape value of the pareto distribution.

    -
    -
    -
    -
    Returns:
    -
    -
    ParetoDistribution
    -
    -
    -
    -

    Examples

    -
    >>> pareto(1)
    -<Distribution> pareto(1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.pert(left, mode, right, lam=4, lclip=None, rclip=None)[source]#
    -

    Initialize a PERT distribution.

    -
    -
    Parameters:
    -
    -
    leftfloat

    The smallest value of the PERT distribution.

    -
    -
    modefloat

    The most common value of the PERT distribution.

    -
    -
    rightfloat

    The largest value of the PERT distribution.

    -
    -
    lamfloat

    The lambda value of the PERT distribution. Defaults to 4.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    PERTDistribution
    -
    -
    -
    -

    Examples

    -
    >>> pert(1, 2, 3)
    -<Distribution> PERT(1, 2, 3)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.poisson(lam, lclip=None, rclip=None)[source]#
    -

    Initialize a poisson distribution.

    -
    -
    Parameters:
    -
    -
    lamfloat

    The lambda value of the poisson distribution.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    PoissonDistribution
    -
    -
    -
    -

    Examples

    -
    >>> poisson(1)
    -<Distribution> poisson(1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.rclip(dist1, val=None)[source]#
    -

    Initialize the clipping/bounding of the output of the distribution by the upper value.

    -

    The function won’t be applied until the distribution is sampled.

    -
    -
    Parameters:
    -
    -
    dist1Distribution or function

    The distribution to clip. If this is a funciton, it will return a partial that will -be suitable for use in piping.

    -
    -
    valint or float or None

    The value to use as the upper bound for clipping.

    -
    -
    -
    -
    Returns:
    -
    -
    ComplexDistribution or function

    This will be a lazy evaluation of the desired function that will then be calculated

    -
    -
    -
    -
    -

    Examples

    -
    >>> rclip(norm(0, 1), 0.5)
    -<Distribution> rclip(norm(mean=0.5, sd=0.3), 0.5)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.tdist(x=None, y=None, t=20, credibility=90, lclip=None, rclip=None)[source]#
    -

    Initialize a t-distribution.

    -

    Is defined either via a loose credible interval from x to y (use credibility or -it will default to being a 90% CI). Unlike the normal and lognormal distributions, this -credible interval is an approximation and is not precisely defined.

    -

    If x and y are not defined, can just return a classic t-distribution defined via -t as the number of degrees of freedom.

    -
    -
    Parameters:
    -
    -
    xfloat or None

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    yfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    -
    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    TDistribution
    -
    -
    -
    -

    Examples

    -
    >>> tdist(0, 1, 2)
    -<Distribution> tdist(x=0, y=1, t=2)
    ->>> tdist()
    -<Distribution> tdist(t=1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.to(x, y, credibility=90, lclip=None, rclip=None) LognormalDistribution | NormalDistribution[source]#
    -

    Initialize a distribution from x to y.

    -

    The distribution will be lognormal by default, unless x is less than or equal to 0, -in which case it will become a normal distribution.

    -

    The distribution will default to be a 90% credible interval between x and y unless -credibility is passed.

    -
    -
    Parameters:
    -
    -
    xfloat

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    yfloat

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    -
    -
    Returns:
    -
    -
    LognormalDistribution if x > 0, otherwise a NormalDistribution
    -
    -
    -
    -

    Examples

    -
    >>> to(1, 10)
    -<Distribution> lognorm(mean=1.15, sd=0.7)
    ->>> to(-10, 10)
    -<Distribution> norm(mean=0.0, sd=6.08)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.triangular(left, mode, right, lclip=None, rclip=None)[source]#
    -

    Initialize a triangular distribution.

    -
    -
    Parameters:
    -
    -
    leftfloat

    The smallest value of the triangular distribution.

    -
    -
    modefloat

    The most common value of the triangular distribution.

    -
    -
    rightfloat

    The largest value of the triangular distribution.

    -
    -
    -
    -
    Returns:
    -
    -
    TriangularDistribution
    -
    -
    -
    -

    Examples

    -
    >>> triangular(1, 2, 3)
    -<Distribution> triangular(1, 2, 3)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.uniform(x, y)[source]#
    -

    Initialize a uniform random distribution.

    -
    -
    Parameters:
    -
    -
    xfloat

    The smallest value the uniform distribution will return.

    -
    -
    yfloat

    The largest value the uniform distribution will return.

    -
    -
    -
    -
    Returns:
    -
    -
    UniformDistribution
    -
    -
    -
    -

    Examples

    -
    >>> uniform(0, 1)
    -<Distribution> uniform(0, 1)
    -
    -
    -
    - -
    -
    -squigglepy.distributions.zero_inflated(p_zero, dist)[source]#
    -

    Initialize an arbitrary zero-inflated distribution.

    -
    -
    Parameters:
    -
    -
    p_zerofloat

    The chance of the distribution returning zero

    -
    -
    distDistribution

    The distribution to sample from when not zero

    -
    -
    -
    -
    Returns:
    -
    -
    MixtureDistribution
    -
    -
    -
    -

    Examples

    -
    >>> zero_inflated(0.6, norm(1, 2))
    -<Distribution> mixture
    - - 0
    - - <Distribution> norm(mean=1.5, sd=0.3)
    -
    -
    -
    - -
    - - -
    - - - - - - - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.html b/doc/build/html/reference/squigglepy.html deleted file mode 100644 index b5939de..0000000 --- a/doc/build/html/reference/squigglepy.html +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - - - - - - squigglepy package — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy package#

    -
    -

    Submodules#

    -
    - -
    -
    -
    - - -
    - - - - - - - -
    - - - -
    - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.numbers.html b/doc/build/html/reference/squigglepy.numbers.html deleted file mode 100644 index 981a60c..0000000 --- a/doc/build/html/reference/squigglepy.numbers.html +++ /dev/null @@ -1,460 +0,0 @@ - - - - - - - - - - - squigglepy.numbers module — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.numbers module#

    -
    - - -
    - - - - - - - -
    - - - -
    - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.rng.html b/doc/build/html/reference/squigglepy.rng.html deleted file mode 100644 index 5399ed3..0000000 --- a/doc/build/html/reference/squigglepy.rng.html +++ /dev/null @@ -1,496 +0,0 @@ - - - - - - - - - - - squigglepy.rng module — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.rng module#

    -
    -
    -squigglepy.rng.set_seed(seed)[source]#
    -

    Set the seed of the random number generator used by Squigglepy.

    -

    The RNG is a np.random.default_rng under the hood.

    -
    -
    Parameters:
    -
    -
    seedfloat

    The seed to use for the RNG.

    -
    -
    -
    -
    Returns:
    -
    -
    np.random.default_rng

    The RNG used internally.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    -Generator(PCG64) at 0x127EDE9E0
    -
    -
    -
    - -
    - - -
    - - - - - - - -
    - - - -
    - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.samplers.html b/doc/build/html/reference/squigglepy.samplers.html deleted file mode 100644 index 24cd126..0000000 --- a/doc/build/html/reference/squigglepy.samplers.html +++ /dev/null @@ -1,1161 +0,0 @@ - - - - - - - - - - - squigglepy.samplers module — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.samplers module#

    -
    -
    -squigglepy.samplers.bernoulli_sample(p, samples=1)[source]#
    -

    Sample 1 with probability p and 0 otherwise.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability of success. Must be between 0 and 1.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    int

    Either 0 or 1

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> bernoulli_sample(0.5)
    -0
    -
    -
    -
    - -
    -
    -squigglepy.samplers.beta_sample(a, b, samples=1)[source]#
    -

    Sample a random number according to a beta distribution.

    -
    -
    Parameters:
    -
    -
    afloat

    The alpha shape value of the distribution. Typically takes the value of the -number of trials that resulted in a success.

    -
    -
    bfloat

    The beta shape value of the distribution. Typically takes the value of the -number of trials that resulted in a failure.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a beta distribution defined by -a and b.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> beta_sample(1, 1)
    -0.22145847498048798
    -
    -
    -
    - -
    -
    -squigglepy.samplers.binomial_sample(n, p, samples=1)[source]#
    -

    Sample a random number according to a binomial distribution.

    -
    -
    Parameters:
    -
    -
    nint

    The number of trials.

    -
    -
    pfloat

    The probability of success for each trial. Must be between 0 and 1.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    int

    A random number sampled from a binomial distribution defined by -n and p. The random number should be between 0 and n.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> binomial_sample(10, 0.1)
    -2
    -
    -
    -
    - -
    -
    -squigglepy.samplers.chi_square_sample(df, samples=1)[source]#
    -

    Sample a random number according to a chi-square distribution.

    -
    -
    Parameters:
    -
    -
    dffloat

    The number of degrees of freedom

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a chi-square distribution.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> chi_square_sample(2)
    -4.808417207931989
    -
    -
    -
    - -
    -
    -squigglepy.samplers.discrete_sample(items, samples=1, verbose=False, _multicore_tqdm_n=1, _multicore_tqdm_cores=1)[source]#
    -

    Sample a random value from a discrete distribution (aka categorical distribution).

    -
    -
    Parameters:
    -
    -
    itemslist or dict

    The values that the discrete distribution will return and their associated -weights (or likelihoods of being returned when sampled).

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    verbosebool

    If True, will print out statements on computational progress.

    -
    -
    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only -be used internally by squigglepy to make the progress bar printing work well for -multicore. This parameter can be safely ignored by the user.

    -
    -
    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only -be used internally by squigglepy to make the progress bar printing work well for -multicore. This parameter can be safely ignored by the user.

    -
    -
    -
    -
    Returns:
    -
    -
    Various, based on items in items
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> # 10% chance of returning 0, 90% chance of returning 1
    ->>> discrete_sample({0: 0.1, 1: 0.9})
    -1
    ->>> discrete_sample([[0.1, 0], [0.9, 1]])  # Different notation for the same thing.
    -1
    ->>> # When no weights are given, all have equal chance of happening.
    ->>> discrete_sample([0, 1, 2])
    -2
    ->>> discrete_sample({'a': 0.1, 'b': 0.9})  # Values do not have to be numbers.
    -'b'
    -
    -
    -
    - -
    -
    -squigglepy.samplers.exponential_sample(scale, samples=1)[source]#
    -

    Sample a random number according to an exponential distribution.

    -
    -
    Parameters:
    -
    -
    scalefloat

    The scale value of the exponential distribution.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    int

    A random number sampled from an exponential distribution.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> exponential_sample(10)
    -24.042086039659946
    -
    -
    -
    - -
    -
    -squigglepy.samplers.gamma_sample(shape, scale, samples=1)[source]#
    -

    Sample a random number according to a gamma distribution.

    -
    -
    Parameters:
    -
    -
    shapefloat

    The shape value of the gamma distribution.

    -
    -
    scalefloat

    The scale value of the gamma distribution. Defaults to 1.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    int

    A random number sampled from an gamma distribution.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> gamma_sample(10, 2)
    -21.290716894247602
    -
    -
    -
    - -
    -
    -squigglepy.samplers.geometric_sample(p, samples=1)[source]#
    -

    Sample a random number according to a geometric distribution.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability of success of an individual trial. Must be between 0 and 1.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    int

    A random number sampled from a geometric distribution.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> geometric_sample(0.1)
    -2
    -
    -
    -
    - -
    -
    -squigglepy.samplers.log_t_sample(low=None, high=None, t=20, samples=1, credibility=90)[source]#
    -

    Sample a random number according to a log-t-distribution.

    -

    The log-t-distribution is a t-distribution in log-space. It is defined with -degrees of freedom via the t parameter. Additionally, a loose credibility -interval can be defined via the t-distribution using the low and high -values. This will be a 90% CI by default unless you change credibility. -Unlike the normal and lognormal samplers, this credible interval is an -approximation and is not precisely defined.

    -
    -
    Parameters:
    -
    -
    lowfloat or None

    The low value of a credible interval defined by credibility. -Must be greater than 0. Defaults to a 90% CI.

    -
    -
    highfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a lognormal distribution defined by -mean and sd.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> log_t_sample(1, 2, t=4)
    -2.052949773846356
    -
    -
    -
    - -
    -
    -squigglepy.samplers.lognormal_sample(mean, sd, samples=1)[source]#
    -

    Sample a random number according to a lognormal distribution.

    -
    -
    Parameters:
    -
    -
    meanfloat

    The mean of the lognormal distribution that is being sampled.

    -
    -
    sdfloat

    The standard deviation of the lognormal distribution that is being sampled.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a lognormal distribution defined by -mean and sd.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> lognormal_sample(0, 1)
    -1.3562412406168636
    -
    -
    -
    - -
    -
    -squigglepy.samplers.mixture_sample(values, weights=None, relative_weights=None, samples=1, verbose=False, _multicore_tqdm_n=1, _multicore_tqdm_cores=1)[source]#
    -

    Sample a ranom number from a mixture distribution.

    -
    -
    Parameters:
    -
    -
    valueslist or dict

    The distributions to mix. Can also be defined as a list of weights and distributions.

    -
    -
    weightslist or None

    The weights for each distribution.

    -
    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized -to sum to 1.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    verbosebool

    If True, will print out statements on computational progress.

    -
    -
    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only -be used internally by squigglepy to make the progress bar printing work well for -multicore. This parameter can be safely ignored by the user.

    -
    -
    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only -be used internally by squigglepy to make the progress bar printing work well for -multicore. This parameter can be safely ignored by the user.

    -
    -
    -
    -
    Returns:
    -
    -
    Various, based on items in values
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> mixture_sample([norm(1, 2), norm(3, 4)], weights=[0.1, 0.9])
    -3.183867278765718
    ->>> # Different notation for the same thing.
    ->>> mixture_sample([[0.1, norm(1, 2)], [0.9, norm(3, 4)]])
    -3.7859113725925972
    ->>> # When no weights are given, all have equal chance of happening.
    ->>> mixture_sample([norm(1, 2), norm(3, 4)])
    -1.1041655362137777
    -
    -
    -
    - -
    -
    -squigglepy.samplers.normal_sample(mean, sd, samples=1)[source]#
    -

    Sample a random number according to a normal distribution.

    -
    -
    Parameters:
    -
    -
    meanfloat

    The mean of the normal distribution that is being sampled.

    -
    -
    sdfloat

    The standard deviation of the normal distribution that is being sampled.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a normal distribution defined by -mean and sd.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> normal_sample(0, 1)
    -0.30471707975443135
    -
    -
    -
    - -
    -
    -squigglepy.samplers.pareto_sample(shape, samples=1)[source]#
    -

    Sample a random number according to a pareto distribution.

    -
    -
    Parameters:
    -
    -
    shapefloat

    The shape value of the pareto distribution.

    -
    -
    -
    -
    Returns:
    -
    -
    int

    A random number sampled from an pareto distribution.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> pareto_sample(1)
    -10.069666324736094
    -
    -
    -
    - -
    -
    -squigglepy.samplers.pert_sample(left, mode, right, lam, samples=1)[source]#
    -

    Sample a random number according to a PERT distribution.

    -
    -
    Parameters:
    -
    -
    leftfloat

    The smallest value of the PERT distribution.

    -
    -
    modefloat

    The most common value of the PERT distribution.

    -
    -
    rightfloat

    The largest value of the PERT distribution.

    -
    -
    lamfloat

    The lambda of the PERT distribution.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a PERT distribution.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> pert_sample(1, 2, 3, 4)
    -2.327625176788963
    -
    -
    -
    - -
    -
    -squigglepy.samplers.poisson_sample(lam, samples=1)[source]#
    -

    Sample a random number according to a poisson distribution.

    -
    -
    Parameters:
    -
    -
    lamfloat

    The lambda value of the poisson distribution.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    int

    A random number sampled from a poisson distribution.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> poisson_sample(10)
    -13
    -
    -
    -
    - -
    -
    -squigglepy.samplers.sample(dist=None, n=1, lclip=None, rclip=None, memcache=False, reload_cache=False, dump_cache_file=None, load_cache_file=None, cache_file_primary=False, verbose=None, cores=1, _multicore_tqdm_n=1, _multicore_tqdm_cores=1, _correlate_if_needed=True)[source]#
    -

    Sample random numbers from a given distribution.

    -
    -
    Parameters:
    -
    -
    distDistribution

    The distribution to sample random number from.

    -
    -
    nint

    The number of random numbers to sample from the distribution. Default to 1.

    -
    -
    lclipfloat or None

    If not None, any value below lclip will be coerced to lclip.

    -
    -
    rclipfloat or None

    If not None, any value below rclip will be coerced to rclip.

    -
    -
    memcachebool

    If True, will attempt to load the results in-memory for future calculations if -a cache is present. Otherwise will save the results to an in-memory cache. Each cache -will be matched based on dist. Default False.

    -
    -
    reload_cachebool

    If True, any existing cache will be ignored and recalculated. Default False.

    -
    -
    dump_cache_filestr or None

    If present, will write out the cache to a numpy file with this path with -.sqlcache.npy appended to the file name.

    -
    -
    load_cache_filestr or None

    If present, will first attempt to load and use a cache from a file with this -path with .sqlcache.npy appended to the file name.

    -
    -
    cache_file_primarybool

    If both an in-memory cache and file cache are present, the file -cache will be used for the cache if this is True, and the in-memory cache -will be used otherwise. Defaults to False.

    -
    -
    verbosebool

    If True, will print out statements on computational progress. If False, will not. -If None (default), will be True when n is greater than or equal to 1M.

    -
    -
    coresint

    If 1, runs on a single core / process. If greater than 1, will run on a multiprocessing -pool with that many cores / processes.

    -
    -
    _multicore_tqdm_nint

    The total number of samples to use for printing tqdm’s interface. This is meant to only -be used internally by squigglepy to make the progress bar printing work well for -multicore. This parameter can be safely ignored by the user.

    -
    -
    _multicore_tqdm_coresint

    The total number of cores to use for printing tqdm’s interface. This is meant to only -be used internally by squigglepy to make the progress bar printing work well for -multicore. This parameter can be safely ignored by the user.

    -
    -
    -
    -
    Returns:
    -
    -
    Various, based on dist.
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> sample(norm(1, 2))
    -1.592627415218455
    ->>> sample(mixture([norm(1, 2), norm(3, 4)]))
    -1.7281209657534462
    ->>> sample(lognorm(1, 10), n=5, lclip=3)
    -array([6.10817361, 3.        , 3.        , 3.45828454, 3.        ])
    -
    -
    -
    - -
    -
    -squigglepy.samplers.sample_correlated_group(requested_dist: BaseDistribution, n: int, verbose=False) ndarray[Any, dtype[float64]][source]#
    -

    Samples a correlated distribution, alongside -all other correlated distributions in the same group.

    -

    The samples for other variables are stored in the distributions themselves -(in _correlated_samples).

    -

    This is necessary, because the sampling needs to happen all at once, regardless -of where the distributions are used in the binary tree of operations.

    -
    - -
    -
    -squigglepy.samplers.t_sample(low=None, high=None, t=20, samples=1, credibility=90)[source]#
    -

    Sample a random number according to a t-distribution.

    -

    The t-distribution is defined with degrees of freedom via the t -parameter. Additionally, a loose credibility interval can be defined -via the t-distribution using the low and high values. This will be a -90% CI by default unless you change credibility. Unlike the normal and -lognormal samplers, this credible interval is an approximation and is -not precisely defined.

    -
    -
    Parameters:
    -
    -
    lowfloat or None

    The low value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    highfloat or None

    The high value of a credible interval defined by credibility. Defaults to a 90% CI.

    -
    -
    tfloat

    The number of degrees of freedom of the t-distribution. Defaults to 20.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    credibilityfloat

    The range of the credibility interval. Defaults to 90.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a lognormal distribution defined by -mean and sd.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> t_sample(1, 2, t=4)
    -2.7887113716855985
    -
    -
    -
    - -
    -
    -squigglepy.samplers.triangular_sample(left, mode, right, samples=1)[source]#
    -

    Sample a random number according to a triangular distribution.

    -
    -
    Parameters:
    -
    -
    leftfloat

    The smallest value of the triangular distribution.

    -
    -
    modefloat

    The most common value of the triangular distribution.

    -
    -
    rightfloat

    The largest value of the triangular distribution.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a triangular distribution.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> triangular_sample(1, 2, 3)
    -2.327625176788963
    -
    -
    -
    - -
    -
    -squigglepy.samplers.uniform_sample(low, high, samples=1)[source]#
    -

    Sample a random number according to a uniform distribution.

    -
    -
    Parameters:
    -
    -
    lowfloat

    The smallest value the uniform distribution will return.

    -
    -
    highfloat

    The largest value the uniform distribution will return.

    -
    -
    samplesint

    The number of samples to return.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    A random number sampled from a uniform distribution between -`low` and `high`.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> uniform_sample(0, 1)
    -0.7739560485559633
    -
    -
    -
    - -
    - - -
    - - - - - - - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.squigglepy.html b/doc/build/html/reference/squigglepy.squigglepy.html deleted file mode 100644 index 0bf0f9c..0000000 --- a/doc/build/html/reference/squigglepy.squigglepy.html +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - - - - - - squigglepy.squigglepy package — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.squigglepy package#

    -
    -

    Submodules#

    -
    -
    -

    squigglepy.squigglepy.bayes module#

    -
    -
    -

    squigglepy.squigglepy.correlation module#

    -
    -
    -

    squigglepy.squigglepy.distributions module#

    -
    -
    -

    squigglepy.squigglepy.numbers module#

    -
    -
    -

    squigglepy.squigglepy.rng module#

    -
    -
    -

    squigglepy.squigglepy.samplers module#

    -
    -
    -

    squigglepy.squigglepy.utils module#

    -
    -
    -

    squigglepy.squigglepy.version module#

    -
    -
    -

    Module contents#

    -
    -
    - - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.tests.html b/doc/build/html/reference/squigglepy.tests.html deleted file mode 100644 index 32fb9e5..0000000 --- a/doc/build/html/reference/squigglepy.tests.html +++ /dev/null @@ -1,438 +0,0 @@ - - - - - - - - - - - squigglepy.tests package — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.tests package#

    -
    -

    Submodules#

    -
    -
    -

    squigglepy.tests.integration module#

    -
    -
    -

    squigglepy.tests.strategies module#

    -
    -
    -

    squigglepy.tests.test_bayes module#

    -
    -
    -

    squigglepy.tests.test_correlation module#

    -
    -
    -

    squigglepy.tests.test_distributions module#

    -
    -
    -

    squigglepy.tests.test_numbers module#

    -
    -
    -

    squigglepy.tests.test_rng module#

    -
    -
    -

    squigglepy.tests.test_samplers module#

    -
    -
    -

    squigglepy.tests.test_utils module#

    -
    -
    -

    Module contents#

    -
    -
    - - -
    - - - - - -
    - -
    -
    -
    - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.utils.html b/doc/build/html/reference/squigglepy.utils.html deleted file mode 100644 index b1bb86d..0000000 --- a/doc/build/html/reference/squigglepy.utils.html +++ /dev/null @@ -1,1357 +0,0 @@ - - - - - - - - - - - squigglepy.utils module — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.utils module#

    -
    -
    -squigglepy.utils.doubling_time_to_growth_rate(doubling_time)[source]#
    -

    Convert a doubling time to a growth rate.

    -

    Doubling time is expressed as a number, numpy array or distribution in any -time unit. Growth rate is set where e.g. 0.05 means +5%. The time unit remains the -same, so if we’ve got a doubling time of 2 years, the returned value is the annual -growth rate.

    -

    NOTE: This only works works for numbers, arrays and distributions where all numbers -are above 0. (Otherwise it makes no sense to talk about doubling times.)

    -
    -
    Parameters:
    -
    -
    doubling_timefloat or np.array or BaseDistribution

    The doubling time expressed in any time unit.

    -
    -
    -
    -
    Returns:
    -
    -
    float or np.array or ComplexDistribution

    Returns the growth rate expressed as a fraction (the percentage divided by 100).

    -
    -
    -
    -
    -

    Examples

    -
    >>> doubling_time_to_growth_rate(12)
    -0.05946309435929531
    -
    -
    -
    - -
    -
    -squigglepy.utils.event(p)[source]#
    -

    Return True with probability p and False with probability 1 - p.

    -

    Alias for event_occurs.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability of returning True. Must be between 0 and 1.

    -
    -
    -
    -
    Returns:
    -
    -
    bool
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> event(p=0.5)
    -False
    -
    -
    -
    - -
    -
    -squigglepy.utils.event_happens(p)[source]#
    -

    Return True with probability p and False with probability 1 - p.

    -

    Alias for event_occurs.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability of returning True. Must be between 0 and 1.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> event_happens(p=0.5)
    -False
    -
    -
    -
    - -
    -
    -squigglepy.utils.event_occurs(p)[source]#
    -

    Return True with probability p and False with probability 1 - p.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability of returning True. Must be between 0 and 1.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> event_occurs(p=0.5)
    -False
    -
    -
    -
    - -
    -
    -squigglepy.utils.extremize(p, e)[source]#
    -

    Extremize a prediction.

    -
    -
    Parameters:
    -
    -
    pfloat

    The prediction to extremize. Must be within 0-1.

    -
    -
    efloat

    The extremization factor.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    The extremized prediction

    -
    -
    -
    -
    -

    Examples

    -
    >>> # Extremizing of 1.73 per https://arxiv.org/abs/2111.03153
    ->>> extremize(p=0.7, e=1.73)
    -0.875428191155692
    -
    -
    -
    - -
    -
    -squigglepy.utils.flip_coin(n=1)[source]#
    -

    Flip a coin.

    -
    -
    Parameters:
    -
    -
    nint

    The number of coins to be flipped.

    -
    -
    -
    -
    Returns:
    -
    -
    str or list

    Returns the value of each coin flip, as either “heads” or “tails”

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> flip_coin()
    -'heads'
    -
    -
    -
    - -
    -
    -squigglepy.utils.full_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0)[source]#
    -

    Alias for kelly where deference is 0.

    -
    -
    Parameters:
    -
    -
    my_pricefloat

    The price (or probability) you give for the given event.

    -
    -
    market_pricefloat

    The price the market is giving for that event.

    -
    -
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    -
    -
    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for -calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means -ARR is not calculated.

    -
    -
    currentfloat

    How much do you already have invested in this event? Used for calculating the -additional amount you should invest. Defaults to 0.

    -
    -
    -
    -
    Returns:
    -
    -
    dict
    -
    A dict of values specifying:
      -
    • my_price

    • -
    • market_price

    • -
    • deference

    • -
    • adj_price : an adjustment to my_price once deference is taken -into account.

    • -
    • delta_price : the absolute difference between my_price and market_price.

    • -
    • adj_delta_price : the absolute difference between adj_price and -market_price.

    • -
    • kelly : the kelly criterion indicating the percentage of bankroll -you should bet.

    • -
    • target : the target amount of money you should have invested

    • -
    • current

    • -
    • delta : the amount of money you should invest given what you already -have invested

    • -
    • max_gain : the amount of money you would gain if you win

    • -
    • modeled_gain : the expected value you would win given adj_price

    • -
    • expected_roi : the expected return on investment

    • -
    • expected_arr : the expected ARR given resolve_date

    • -
    • resolve_date

    • -
    -
    -
    -
    -
    -
    -
    -

    Examples

    -
    >>> full_kelly(my_price=0.7, market_price=0.4, bankroll=100)
    -{'my_price': 0.7, 'market_price': 0.4, 'deference': 0, 'adj_price': 0.7,
    - 'delta_price': 0.3, 'adj_delta_price': 0.3, 'kelly': 0.5, 'target': 50.0,
    - 'current': 0, 'delta': 50.0, 'max_gain': 125.0, 'modeled_gain': 72.5,
    - 'expected_roi': 0.75, 'expected_arr': None, 'resolve_date': None}
    -
    -
    -
    - -
    -
    -squigglepy.utils.geomean(a, weights=None, relative_weights=None, drop_na=True)[source]#
    -

    Calculate the geometric mean.

    -
    -
    Parameters:
    -
    -
    alist or np.array

    The values to calculate the geometric mean of.

    -
    -
    weightslist or None

    The weights, if a weighted geometric mean is desired.

    -
    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized -to sum to 1.

    -
    -
    drop_naboolean

    Should NA-like values be dropped when calculating the geomean?

    -
    -
    -
    -
    Returns:
    -
    -
    float
    -
    -
    -
    -

    Examples

    -
    >>> geomean([1, 3, 10])
    -3.1072325059538595
    -
    -
    -
    - -
    -
    -squigglepy.utils.geomean_odds(a, weights=None, relative_weights=None, drop_na=True)[source]#
    -

    Calculate the geometric mean of odds.

    -
    -
    Parameters:
    -
    -
    alist or np.array

    The probabilities to calculate the geometric mean of. These are converted to odds -before the geometric mean is taken..

    -
    -
    weightslist or None

    The weights, if a weighted geometric mean is desired.

    -
    -
    relative_weightslist or None

    Relative weights, which if given will be weights that are normalized -to sum to 1.

    -
    -
    drop_naboolean

    Should NA-like values be dropped when calculating the geomean?

    -
    -
    -
    -
    Returns:
    -
    -
    float
    -
    -
    -
    -

    Examples

    -
    >>> geomean_odds([0.1, 0.3, 0.9])
    -0.42985748800076845
    -
    -
    -
    - -
    -
    -squigglepy.utils.get_log_percentiles(data, percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], reverse=False, display=True, digits=1)[source]#
    -

    Print the log (base 10) of the percentiles of the data.

    -
    -
    Parameters:
    -
    -
    datalist or np.array

    The data to calculate percentiles for.

    -
    -
    percentileslist

    A list of percentiles to calculate. Must be values between 0 and 100.

    -
    -
    reversebool

    If True, the percentile values are reversed (e.g., 95th and 5th percentile -swap values.)

    -
    -
    displaybool

    If True, the function returns an easy to read display.

    -
    -
    digitsint or None

    The number of digits to display (using rounding).

    -
    -
    -
    -
    Returns:
    -
    -
    dict

    A dictionary of the given percentiles. If display is true, will be str values. -Otherwise will be float values. 10 to the power of the value gives the true percentile.

    -
    -
    -
    -
    -

    Examples

    -
    >>> get_percentiles(range(100), percentiles=[25, 50, 75])
    -{25: 24.75, 50: 49.5, 75: 74.25}
    -
    -
    -
    - -
    -
    -squigglepy.utils.get_mean_and_ci(data, credibility=90, digits=None)[source]#
    -

    Return the mean and percentiles of the data.

    -
    -
    Parameters:
    -
    -
    datalist or np.array

    The data to calculate the mean and CI for.

    -
    -
    credibilityfloat

    The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI.

    -
    -
    digitsint or None

    The number of digits to display (using rounding).

    -
    -
    -
    -
    Returns:
    -
    -
    dict

    A dictionary with the mean and CI.

    -
    -
    -
    -
    -

    Examples

    -
    >>> get_mean_and_ci(range(100))
    -{'mean': 49.5, 'ci_low': 4.95, 'ci_high': 94.05}
    -
    -
    -
    - -
    -
    -squigglepy.utils.get_median_and_ci(data, credibility=90, digits=None)[source]#
    -

    Return the median and percentiles of the data.

    -
    -
    Parameters:
    -
    -
    datalist or np.array

    The data to calculate the mean and CI for.

    -
    -
    credibilityfloat

    The credibility of the interval. Must be values between 0 and 100. Default 90 for 90% CI.

    -
    -
    digitsint or None

    The number of digits to display (using rounding).

    -
    -
    -
    -
    Returns:
    -
    -
    dict

    A dictionary with the median and CI.

    -
    -
    -
    -
    -

    Examples

    -
    >>> get_median_and_ci(range(100))
    -{'mean': 49.5, 'ci_low': 4.95, 'ci_high': 94.05}
    -
    -
    -
    - -
    -
    -squigglepy.utils.get_percentiles(data, percentiles=[1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99], reverse=False, digits=None)[source]#
    -

    Print the percentiles of the data.

    -
    -
    Parameters:
    -
    -
    datalist or np.array

    The data to calculate percentiles for.

    -
    -
    percentileslist

    A list of percentiles to calculate. Must be values between 0 and 100.

    -
    -
    reversebool

    If True, the percentile values are reversed (e.g., 95th and 5th percentile -swap values.)

    -
    -
    digitsint or None

    The number of digits to display (using rounding).

    -
    -
    -
    -
    Returns:
    -
    -
    dict

    A dictionary of the given percentiles.

    -
    -
    -
    -
    -

    Examples

    -
    >>> get_percentiles(range(100), percentiles=[25, 50, 75])
    -{25: 24.75, 50: 49.5, 75: 74.25}
    -
    -
    -
    - -
    -
    -squigglepy.utils.growth_rate_to_doubling_time(growth_rate)[source]#
    -

    Convert a positive growth rate to a doubling rate.

    -

    Growth rate must be expressed as a number, numpy array or distribution -where 0.05 means +5% to a doubling time. The time unit remains the same, so if we’ve -got +5% annual growth, the returned value is the doubling time in years.

    -

    NOTE: This only works works for numbers, arrays and distributions where all numbers -are above 0. (Otherwise it makes no sense to talk about doubling times.)

    -
    -
    Parameters:
    -
    -
    growth_ratefloat or np.array or BaseDistribution

    The growth rate expressed as a fraction (the percentage divided by 100).

    -
    -
    -
    -
    Returns:
    -
    -
    float or np.array or ComplexDistribution

    Returns the doubling time.

    -
    -
    -
    -
    -

    Examples

    -
    >>> growth_rate_to_doubling_time(0.01)
    -69.66071689357483
    -
    -
    -
    - -
    -
    -squigglepy.utils.half_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0)[source]#
    -

    Alias for kelly where deference is 0.5.

    -
    -
    Parameters:
    -
    -
    my_pricefloat

    The price (or probability) you give for the given event.

    -
    -
    market_pricefloat

    The price the market is giving for that event.

    -
    -
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    -
    -
    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for -calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means -ARR is not calculated.

    -
    -
    currentfloat

    How much do you already have invested in this event? Used for calculating the -additional amount you should invest. Defaults to 0.

    -
    -
    -
    -
    Returns:
    -
    -
    dict
    -
    A dict of values specifying:
      -
    • my_price

    • -
    • market_price

    • -
    • deference

    • -
    • adj_price : an adjustment to my_price once deference is taken -into account.

    • -
    • delta_price : the absolute difference between my_price and market_price.

    • -
    • adj_delta_price : the absolute difference between adj_price and -market_price.

    • -
    • kelly : the kelly criterion indicating the percentage of bankroll -you should bet.

    • -
    • target : the target amount of money you should have invested

    • -
    • current

    • -
    • delta : the amount of money you should invest given what you already -have invested

    • -
    • max_gain : the amount of money you would gain if you win

    • -
    • modeled_gain : the expected value you would win given adj_price

    • -
    • expected_roi : the expected return on investment

    • -
    • expected_arr : the expected ARR given resolve_date

    • -
    • resolve_date

    • -
    -
    -
    -
    -
    -
    -
    -

    Examples

    -
    >>> half_kelly(my_price=0.7, market_price=0.4, bankroll=100)
    -{'my_price': 0.7, 'market_price': 0.4, 'deference': 0.5, 'adj_price': 0.55,
    - 'delta_price': 0.3, 'adj_delta_price': 0.15, 'kelly': 0.25, 'target': 25.0,
    - 'current': 0, 'delta': 25.0, 'max_gain': 62.5, 'modeled_gain': 23.13,
    - 'expected_roi': 0.375, 'expected_arr': None, 'resolve_date': None}
    -
    -
    -
    - -
    -
    -squigglepy.utils.is_continuous_dist(obj)[source]#
    -
    - -
    -
    -squigglepy.utils.is_dist(obj)[source]#
    -

    Test if a given object is a Squigglepy distribution.

    -
    -
    Parameters:
    -
    -
    objobject

    The object to test.

    -
    -
    -
    -
    Returns:
    -
    -
    bool

    True, if the object is a distribution. False if not.

    -
    -
    -
    -
    -

    Examples

    -
    >>> is_dist(norm(0, 1))
    -True
    ->>> is_dist(0)
    -False
    -
    -
    -
    - -
    -
    -squigglepy.utils.is_sampleable(obj)[source]#
    -

    Test if a given object can be sampled from.

    -

    This includes distributions, integers, floats, None, -strings, and callables.

    -
    -
    Parameters:
    -
    -
    objobject

    The object to test.

    -
    -
    -
    -
    Returns:
    -
    -
    bool

    True, if the object can be sampled from. False if not.

    -
    -
    -
    -
    -

    Examples

    -
    >>> is_sampleable(norm(0, 1))
    -True
    ->>> is_sampleable(0)
    -True
    ->>> is_sampleable([0, 1])
    -False
    -
    -
    -
    - -
    -
    -squigglepy.utils.kelly(my_price, market_price, deference=0, bankroll=1, resolve_date=None, current=0)[source]#
    -

    Calculate the Kelly criterion.

    -
    -
    Parameters:
    -
    -
    my_pricefloat

    The price (or probability) you give for the given event.

    -
    -
    market_pricefloat

    The price the market is giving for that event.

    -
    -
    deferencefloat

    How much deference (or weight) do you give the market price? Use 0.5 for half Kelly -and 0.75 for quarter Kelly. Defaults to 0, which is full Kelly.

    -
    -
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    -
    -
    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for -calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means -ARR is not calculated.

    -
    -
    currentfloat

    How much do you already have invested in this event? Used for calculating the -additional amount you should invest. Defaults to 0.

    -
    -
    -
    -
    Returns:
    -
    -
    dict
    -
    A dict of values specifying:
      -
    • my_price

    • -
    • market_price

    • -
    • deference

    • -
    • adj_price : an adjustment to my_price once deference is taken -into account.

    • -
    • delta_price : the absolute difference between my_price and market_price.

    • -
    • adj_delta_price : the absolute difference between adj_price and -market_price.

    • -
    • kelly : the kelly criterion indicating the percentage of bankroll -you should bet.

    • -
    • target : the target amount of money you should have invested

    • -
    • current

    • -
    • delta : the amount of money you should invest given what you already -have invested

    • -
    • max_gain : the amount of money you would gain if you win

    • -
    • modeled_gain : the expected value you would win given adj_price

    • -
    • expected_roi : the expected return on investment

    • -
    • expected_arr : the expected ARR given resolve_date

    • -
    • resolve_date

    • -
    -
    -
    -
    -
    -
    -
    -

    Examples

    -
    >>> kelly(my_price=0.7, market_price=0.4, deference=0.5, bankroll=100)
    -{'my_price': 0.7, 'market_price': 0.4, 'deference': 0.5, 'adj_price': 0.55,
    - 'delta_price': 0.3, 'adj_delta_price': 0.15, 'kelly': 0.25, 'target': 25.0,
    - 'current': 0, 'delta': 25.0, 'max_gain': 62.5, 'modeled_gain': 23.13,
    - 'expected_roi': 0.375, 'expected_arr': None, 'resolve_date': None}
    -
    -
    -
    - -
    -
    -squigglepy.utils.laplace(s, n=None, time_passed=None, time_remaining=None, time_fixed=False)[source]#
    -

    Return probability of success on next trial given Laplace’s law of succession.

    -

    Also can be used to calculate a time-invariant version defined in -https://www.lesswrong.com/posts/wE7SK8w8AixqknArs/a-time-invariant-version-of-laplace-s-rule

    -
    -
    Parameters:
    -
    -
    sint

    The number of successes among n past trials or among time_passed amount of time.

    -
    -
    nint or None

    The number of trials that contain the successes (and/or failures). Leave as None if -time-invariant mode is desired.

    -
    -
    time_passedfloat or None

    The amount of time that has passed when the successes (and/or failures) occured for -calculating a time-invariant Laplace.

    -
    -
    time_remainingfloat or None

    We are calculating the likelihood of observing at least one success over this time -period.

    -
    -
    time_fixedbool

    This should be False if the time period is variable - that is, if the time period -was chosen specifically to include the most recent success. Otherwise the time period -is fixed and this should be True. Defaults to False.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    The probability of at least one success in the next trial or time_remaining amount -of time.

    -
    -
    -
    -
    -

    Examples

    -
    >>> # The sun has risen the past 100,000 days. What are the odds it rises again tomorrow?
    ->>> laplace(s=100*K, n=100*K)
    -0.999990000199996
    ->>> # The last time a nuke was used in war was 77 years ago. What are the odds a nuke
    ->>> # is used in the next year, not considering any information other than this naive prior?
    ->>> laplace(s=1, time_passed=77, time_remaining=1, time_fixed=False)
    -0.012820512820512664
    -
    -
    -
    - -
    -
    -squigglepy.utils.normalize(lst)[source]#
    -

    Normalize a list to sum to 1.

    -
    -
    Parameters:
    -
    -
    lstlist

    The list to normalize.

    -
    -
    -
    -
    Returns:
    -
    -
    list

    A list where each value is normalized such that the list sums to 1.

    -
    -
    -
    -
    -

    Examples

    -
    >>> normalize([0.1, 0.2, 0.2])
    -[0.2, 0.4, 0.4]
    -
    -
    -
    - -
    -
    -squigglepy.utils.odds_to_p(odds)[source]#
    -

    Calculate the probability from given decimal odds.

    -
    -
    Parameters:
    -
    -
    oddsfloat

    The decimal odds to calculate the probability for.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    Probability

    -
    -
    -
    -
    -

    Examples

    -
    >>> odds_to_p(0.1)
    -0.09090909090909091
    -
    -
    -
    - -
    -
    -squigglepy.utils.one_in(p, digits=0, verbose=True)[source]#
    -

    Convert a probability into “1 in X” notation.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability to convert.

    -
    -
    digitsint

    The number of digits to round the result to. Defaults to 0. If digits -is 0, the result will be converted to int instead of float.

    -
    -
    verboselogical

    If True, will return a string with “1 in X”. If False, will just return X.

    -
    -
    -
    -
    Returns:
    -
    -
    str if verbose is True. Otherwise, int if digits is 0 or float if digits > 0.
    -
    -
    -
    -

    Examples

    -
    >>> one_in(0.1)
    -"1 in 10"
    -
    -
    -
    - -
    -
    -squigglepy.utils.p_to_odds(p)[source]#
    -

    Calculate the decimal odds from a given probability.

    -
    -
    Parameters:
    -
    -
    pfloat

    The probability to calculate decimal odds for. Must be between 0 and 1.

    -
    -
    -
    -
    Returns:
    -
    -
    float

    Decimal odds

    -
    -
    -
    -
    -

    Examples

    -
    >>> p_to_odds(0.1)
    -0.1111111111111111
    -
    -
    -
    - -
    -
    -squigglepy.utils.quarter_kelly(my_price, market_price, bankroll=1, resolve_date=None, current=0)[source]#
    -

    Alias for kelly where deference is 0.75.

    -
    -
    Parameters:
    -
    -
    my_pricefloat

    The price (or probability) you give for the given event.

    -
    -
    market_pricefloat

    The price the market is giving for that event.

    -
    -
    bankrollfloat

    How much money do you have to bet? Defaults to 1.

    -
    -
    resolve_datestr or None

    When will the event happen, the market resolve, and you get your money back? Used for -calculating expected ARR. Give in YYYY-MM-DD format. Defaults to None, which means -ARR is not calculated.

    -
    -
    currentfloat

    How much do you already have invested in this event? Used for calculating the -additional amount you should invest. Defaults to 0.

    -
    -
    -
    -
    Returns:
    -
    -
    dict
    -
    A dict of values specifying:
      -
    • my_price

    • -
    • market_price

    • -
    • deference

    • -
    • adj_price : an adjustment to my_price once deference is taken -into account.

    • -
    • delta_price : the absolute difference between my_price and market_price.

    • -
    • adj_delta_price : the absolute difference between adj_price and -market_price.

    • -
    • kelly : the kelly criterion indicating the percentage of bankroll -you should bet.

    • -
    • target : the target amount of money you should have invested

    • -
    • current

    • -
    • delta : the amount of money you should invest given what you already -have invested

    • -
    • max_gain : the amount of money you would gain if you win

    • -
    • modeled_gain : the expected value you would win given adj_price

    • -
    • expected_roi : the expected return on investment

    • -
    • expected_arr : the expected ARR given resolve_date

    • -
    • resolve_date

    • -
    -
    -
    -
    -
    -
    -
    -

    Examples

    -
    >>> quarter_kelly(my_price=0.7, market_price=0.4, bankroll=100)
    -{'my_price': 0.7, 'market_price': 0.4, 'deference': 0.75, 'adj_price': 0.48,
    - 'delta_price': 0.3, 'adj_delta_price': 0.08, 'kelly': 0.125, 'target': 12.5,
    - 'current': 0, 'delta': 12.5, 'max_gain': 31.25, 'modeled_gain': 8.28,
    - 'expected_roi': 0.188, 'expected_arr': None, 'resolve_date': None}
    -
    -
    -
    - -
    -
    -squigglepy.utils.roll_die(sides, n=1)[source]#
    -

    Roll a die.

    -
    -
    Parameters:
    -
    -
    sidesint

    The number of sides of the die that is rolled.

    -
    -
    nint

    The number of dice to be rolled.

    -
    -
    -
    -
    Returns:
    -
    -
    int or list

    Returns the value of each die roll.

    -
    -
    -
    -
    -

    Examples

    -
    >>> set_seed(42)
    ->>> roll_die(6)
    -5
    -
    -
    -
    - -
    - - -
    - - - - - - - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/reference/squigglepy.version.html b/doc/build/html/reference/squigglepy.version.html deleted file mode 100644 index a43dc24..0000000 --- a/doc/build/html/reference/squigglepy.version.html +++ /dev/null @@ -1,450 +0,0 @@ - - - - - - - - - - - squigglepy.version module — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    squigglepy.version module#

    -
    - - -
    - - - - - - - -
    - - - -
    - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/search.html b/doc/build/html/search.html deleted file mode 100644 index ccbf991..0000000 --- a/doc/build/html/search.html +++ /dev/null @@ -1,397 +0,0 @@ - - - - - - - - - Search - Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    - - -
    -

    Search

    - - - -
    -
    - - - - - - -
    - -
    -
    -
    - -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js deleted file mode 100644 index 49ba701..0000000 --- a/doc/build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"docnames": ["index", "installation", "reference/modules", "reference/squigglepy", "reference/squigglepy.bayes", "reference/squigglepy.correlation", "reference/squigglepy.distributions", "reference/squigglepy.numbers", "reference/squigglepy.rng", "reference/squigglepy.samplers", "reference/squigglepy.utils", "reference/squigglepy.version", "usage"], "filenames": ["index.rst", "installation.rst", "reference/modules.rst", "reference/squigglepy.rst", "reference/squigglepy.bayes.rst", "reference/squigglepy.correlation.rst", "reference/squigglepy.distributions.rst", "reference/squigglepy.numbers.rst", "reference/squigglepy.rng.rst", "reference/squigglepy.samplers.rst", "reference/squigglepy.utils.rst", "reference/squigglepy.version.rst", "usage.rst"], "titles": ["Squigglepy: Implementation of Squiggle in Python", "Installation", "squigglepy", "squigglepy package", "squigglepy.bayes module", "squigglepy.correlation module", "squigglepy.distributions module", "squigglepy.numbers module", "squigglepy.rng module", "squigglepy.samplers module", "squigglepy.utils module", "squigglepy.version module", "Examples"], "terms": {"index": [], "modul": [2, 3], "search": [], "page": [], "i": [0, 4, 5, 6, 8, 9, 10, 12], "simpl": 0, "program": 0, "languag": 0, "intuit": 0, "probabilist": 0, "estim": 0, "It": [0, 9], "serv": 0, "its": 0, "own": [0, 12], "standalon": 0, "syntax": 0, "javascript": 0, "like": [0, 10], "intend": [0, 5], "us": [0, 1, 4, 5, 6, 8, 9, 10, 12], "frequent": 0, "also": [0, 1, 5, 6, 9, 10, 12], "sometim": 0, "want": [0, 4, 5, 12], "similar": 0, "function": [0, 4, 6, 10, 12], "especi": 0, "alongsid": [0, 9], "other": [0, 4, 9, 10, 12], "statist": 0, "packag": [0, 2, 5, 12], "numpi": [0, 9, 10, 12], "panda": 0, "matplotlib": [0, 12], "The": [0, 4, 5, 6, 8, 9, 10, 12], "here": [0, 12], "mani": [0, 4, 9], "pip": 1, "For": [1, 12], "plot": [1, 3, 6, 12], "support": [0, 1, 4], "you": [0, 1, 4, 5, 6, 9, 10, 12], "can": [0, 1, 5, 6, 9, 10, 12], "extra": 1, "": [0, 5, 6, 9, 10, 12], "from": [4, 5, 6, 9, 10, 12], "doc": 12, "import": 12, "sq": [4, 5, 6, 12], "np": [4, 5, 8, 10, 12], "pyplot": 12, "plt": 12, "number": [2, 3, 4, 5, 6, 8, 9, 10, 12], "k": [10, 12], "m": [4, 5, 12], "pprint": 12, "pop_of_ny_2022": 12, "8": [4, 6, 10, 12], "1": [4, 5, 6, 9, 10, 12], "4": [6, 9, 10, 12], "thi": [0, 4, 5, 6, 9, 10, 12], "mean": [4, 6, 9, 10, 12], "re": 12, "90": [6, 9, 10, 12], "confid": 12, "valu": [6, 9, 10, 12], "between": [0, 5, 6, 9, 10, 12], "million": 12, "pct_of_pop_w_piano": 12, "0": [4, 5, 6, 9, 10, 12], "2": [4, 5, 6, 9, 10, 12], "01": [4, 10, 12], "we": [4, 5, 10, 12], "assum": 12, "ar": [4, 5, 6, 9, 10, 12], "almost": 12, "peopl": 12, "multipl": 12, "pianos_per_piano_tun": 12, "50": [4, 10, 12], "piano_tuners_per_piano": 12, "total_tuners_in_2022": 12, "sampl": [0, 2, 3, 4, 5, 6, 9, 10, 12], "1000": [5, 6, 12], "note": [5, 10, 12], "shorthand": [0, 12], "get": [10, 12], "sd": [4, 6, 9, 12], "print": [4, 5, 9, 10, 12], "format": [10, 12], "round": [6, 10, 12], "std": 12, "percentil": [10, 12], "get_percentil": [2, 3, 10, 12], "digit": [6, 10, 12], "histogram": [6, 12], "hist": 12, "bin": [6, 12], "200": [6, 12], "show": 12, "shorter": 12, "And": 12, "version": [0, 2, 3, 10, 12], "incorpor": 12, "time": [10, 12], "def": [4, 6, 12], "pop_at_tim": 12, "t": [6, 9, 12], "year": [10, 12], "after": 12, "2022": 12, "avg_yearly_pct_chang": 12, "05": [5, 6, 10, 12], "expect": [10, 12], "nyc": 12, "continu": 12, "grow": 12, "an": [0, 4, 5, 6, 9, 10, 12], "roughli": 12, "per": [10, 12], "return": [4, 5, 6, 8, 9, 10, 12], "total_tuners_at_tim": 12, "total": [4, 9, 12], "2030": 12, "warn": 12, "Be": 12, "care": 12, "about": [10, 12], "divid": [10, 12], "etc": 12, "500": 12, "instead": [6, 10, 12], "outcom": 12, "count": 12, "norm": [2, 3, 4, 6, 9, 10, 12], "3": [4, 6, 9, 10, 12], "onli": [4, 5, 9, 10, 12], "two": [4, 5, 6, 12], "multipli": 12, "normal": [2, 3, 4, 6, 9, 10, 12], "interv": [6, 9, 10, 12], "too": 12, "one": [4, 10, 12], "than": [4, 6, 9, 10, 12], "100": [5, 10, 12], "longhand": 12, "n": [4, 5, 6, 9, 10, 12], "nice": 12, "progress": [4, 9, 12], "report": [0, 12], "verbos": [4, 9, 10, 12], "true": [4, 6, 9, 10, 12], "exist": [4, 9, 12], "lognorm": [2, 3, 6, 9, 12], "10": [6, 9, 10, 12], "tdist": [2, 3, 6, 12], "5": [4, 5, 6, 9, 10, 12], "triangular": [2, 3, 6, 9, 12], "pert": [2, 3, 6, 9, 12], "lam": [6, 9, 12], "binomi": [2, 3, 6, 9, 12], "p": [4, 6, 9, 10, 12], "beta": [2, 3, 4, 5, 6, 9, 12], "b": [6, 9, 12], "bernoulli": [2, 3, 4, 6, 12], "poisson": [2, 3, 6, 9, 12], "chisquar": [2, 3, 6, 12], "gamma": [2, 3, 5, 6, 9, 12], "pareto": [2, 3, 6, 9, 12], "exponenti": [2, 3, 6, 9, 12], "scale": [6, 9, 12], "geometr": [2, 3, 6, 9, 10, 12], "discret": [2, 3, 5, 6, 9, 12], "9": [4, 6, 9, 10, 12], "integ": [10, 12], "15": [6, 10, 12], "altern": 12, "object": [5, 10, 12], "No": 12, "weight": [4, 6, 9, 10, 12], "equal": [6, 9, 12], "mix": [6, 9, 12], "togeth": 12, "mixtur": [2, 3, 4, 6, 9, 12], "These": [10, 12], "each": [4, 5, 6, 9, 10, 12], "equival": [4, 12], "abov": [10, 12], "just": [4, 6, 10, 12], "differ": [6, 9, 10, 12], "wai": [5, 12], "do": [4, 6, 9, 10, 12], "notat": [6, 9, 10, 12], "make": [4, 9, 10, 12], "zero": [6, 12], "inflat": [6, 12], "60": [10, 12], "chanc": [6, 9, 12], "40": [10, 12], "zero_infl": [2, 3, 6, 12], "6": [4, 5, 6, 9, 10, 12], "add": [6, 12], "subtract": 12, "math": [0, 12], "chang": [0, 9, 12], "ci": [6, 9, 10, 12], "default": [4, 5, 6, 9, 10, 12], "80": [4, 5, 10, 12], "credibl": [6, 9, 10, 12], "clip": [2, 3, 6, 12], "lclip": [2, 3, 6, 9, 12], "rclip": [2, 3, 6, 9, 12], "anyth": [6, 12], "lower": [6, 12], "higher": 12, "pipe": [6, 12], "correl": [2, 3, 9, 12], "uniform": [2, 3, 6, 9, 12], "even": 12, "pass": [4, 5, 6, 10, 12], "your": [10, 12], "matrix": [5, 12], "how": [4, 10, 12], "build": 12, "tool": 12, "roll_di": [2, 3, 10, 12], "side": [10, 12], "list": [4, 5, 6, 9, 10, 12], "rang": [6, 9, 10, 12], "els": [4, 12], "none": [4, 5, 6, 9, 10, 12], "alreadi": [10, 12], "includ": [4, 5, 10, 12], "standard": [6, 9, 12], "util": [2, 3, 12], "women": 12, "ag": 12, "forti": 12, "who": 12, "particip": 12, "routin": 12, "screen": 12, "have": [4, 6, 9, 10, 12], "breast": 12, "cancer": [4, 12], "posit": [4, 5, 6, 10, 12], "mammographi": [4, 12], "without": [4, 12], "woman": 12, "group": [5, 9, 12], "had": 12, "what": [4, 6, 10, 12], "probabl": [4, 6, 9, 10, 12], "she": 12, "actual": 12, "ha": [5, 6, 10, 12], "approxim": [5, 6, 9, 12], "answer": [4, 12], "network": [4, 12], "reject": [4, 12], "bay": [2, 3, 12], "has_canc": [4, 12], "event": [2, 3, 4, 6, 10, 12], "096": [4, 12], "define_ev": [4, 12], "bayesnet": [2, 3, 4, 12], "find": [4, 12], "lambda": [4, 6, 9, 12], "e": [4, 10, 12], "conditional_on": [4, 12], "07723995880535531": [4, 12], "Or": [5, 12], "inform": [10, 12], "immedi": 12, "hand": 12, "directli": [5, 12], "calcul": [4, 6, 9, 10, 12], "though": 12, "doesn": 12, "work": [5, 9, 10, 12], "veri": [5, 12], "stuff": 12, "simple_bay": [2, 3, 4, 12], "prior": [4, 10, 12], "likelihood_h": [4, 12], "likelihood_not_h": [4, 12], "07763975155279504": [4, 12], "updat": [2, 3, 4, 12], "them": [4, 5, 6, 12], "prior_sampl": 12, "evid": [4, 12], "evidence_sampl": 12, "posterior": [4, 12], "posterior_sampl": 12, "averag": [2, 3, 4, 12], "average_sampl": 12, "artifici": 12, "intellig": 12, "section": 12, "hous": 12, "system": 12, "against": 12, "burglari": 12, "live": 12, "seismic": 12, "activ": 12, "area": 12, "occasion": 12, "set": [5, 6, 8, 10, 12], "off": 12, "earthquak": 12, "neighbor": 12, "mari": 12, "john": 12, "know": [4, 12], "If": [4, 5, 6, 9, 10, 12], "thei": [0, 12], "hear": 12, "call": [4, 12], "guarante": 12, "particular": 12, "dai": [10, 12], "go": 12, "95": [10, 12], "both": [4, 9, 12], "94": [10, 12], "29": [4, 12], "noth": 12, "fals": [4, 9, 10, 12], "when": [4, 6, 9, 10, 12], "goe": 12, "But": [6, 12], "sai": 12, "hi": 12, "70": [10, 12], "p_alarm_goes_off": 12, "elif": 12, "001": 12, "p_john_cal": 12, "alarm_goes_off": 12, "p_mary_cal": 12, "7": [5, 6, 10, 12], "burglary_happen": 12, "earthquake_happen": 12, "002": 12, "john_cal": 12, "mary_cal": 12, "happen": [6, 9, 10, 12], "result": [4, 5, 6, 9, 10, 12], "19": 12, "vari": 12, "becaus": [9, 12], "base": [4, 5, 6, 9, 10, 12], "random": [6, 8, 9, 12], "mai": [0, 5, 12], "take": [4, 6, 9, 12], "minut": 12, "been": [5, 12], "27": [6, 12], "quickli": 12, "built": [6, 12], "cach": [4, 9, 12], "reload_cach": [4, 9, 12], "recalcul": [4, 9, 12], "amount": [10, 12], "analysi": 12, "pretti": 12, "limit": 12, "consid": [10, 12], "sorobn": 12, "pomegran": 12, "bnlearn": 12, "pymc": 12, "monte_hal": 12, "door_pick": 12, "switch": 12, "door": 12, "c": 12, "car_is_behind_door": 12, "reveal_door": 12, "d": 12, "old_door_pick": 12, "won_car": 12, "won": [6, 12], "r": 12, "win": [10, 12], "int": [4, 5, 6, 9, 10, 12], "66": 12, "34": 12, "imagin": 12, "flip": [10, 12], "head": [10, 12], "out": [4, 9, 12], "my": 12, "blue": 12, "bag": 12, "tail": [10, 12], "red": 12, "contain": [10, 12], "20": [6, 9, 10, 12], "took": 12, "flip_coin": [2, 3, 10, 12], "me": [0, 12], "12306": 12, "which": [0, 4, 6, 9, 10, 12], "close": [5, 12], "correct": 12, "12292": 12, "gener": [4, 8, 12], "combin": [6, 12], "bankrol": [10, 12], "determin": [6, 12], "size": 12, "criterion": [10, 12], "ve": [10, 12], "price": [10, 12], "question": 12, "market": [10, 12], "resolv": [10, 12], "favor": 12, "see": 12, "65": [5, 12], "willing": 12, "should": [4, 6, 9, 10, 12], "follow": 12, "kelly_data": 12, "my_pric": [10, 12], "market_pric": [10, 12], "fraction": [10, 12], "143": 12, "target": [10, 12], "much": [4, 10, 12], "monei": [10, 12], "invest": [10, 12], "142": 12, "86": 12, "expected_roi": [10, 12], "roi": 12, "077": 12, "action": 12, "black": 12, "ruff": 12, "check": [5, 12], "pytest": 12, "pip3": 12, "python3": 12, "integr": 12, "py": 12, "unoffici": 0, "myself": [], "rethink": 0, "prioriti": 0, "affili": 0, "associ": [0, 6, 9], "quantifi": 0, "uncertainti": 0, "research": 0, "institut": 0, "maintain": 0, "new": 0, "yet": [0, 4], "stabl": 0, "product": 0, "so": [0, 10], "encount": 0, "bug": 0, "error": 0, "pleas": 0, "those": 0, "fix": [0, 10], "possibl": 0, "futur": [0, 4, 9], "introduc": 0, "break": 0, "avail": 0, "under": [0, 8], "mit": 0, "licens": 0, "primari": 0, "author": 0, "peter": 0, "wildeford": 0, "agust\u00edn": 0, "covarrubia": 0, "bernardo": 0, "baron": 0, "contribut": 0, "sever": 0, "kei": 0, "develop": 0, "thank": 0, "ozzi": 0, "gooen": 0, "creat": 0, "origin": [0, 5], "dawn": 0, "drescher": 0, "help": 0, "come": 0, "up": 0, "idea": 0, "well": [0, 9], "featur": 0, "start": 4, "readm": [], "subpackag": [], "submodul": 2, "distribut": [0, 2, 3, 4, 5, 9, 10], "rng": [2, 3], "sampler": [2, 3], "content": [], "test": [10, 12], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "correlationgroup": [2, 3, 5], "correlated_dist": [3, 5], "correlation_matrix": [3, 5], "correlation_toler": [3, 5], "has_sufficient_sample_divers": [3, 5], "induce_correl": [3, 5], "min_unique_sampl": [3, 5], "basedistribut": [2, 3, 6, 9, 10], "bernoullidistribut": [2, 3, 6], "betadistribut": [2, 3, 6], "binomialdistribut": [2, 3, 6], "categoricaldistribut": [2, 3, 6], "chisquaredistribut": [2, 3, 6], "complexdistribut": [2, 3, 6, 10], "compositedistribut": [2, 3, 6], "constantdistribut": [2, 3, 6], "continuousdistribut": [2, 3, 6], "discretedistribut": [2, 3, 6], "exponentialdistribut": [2, 3, 6], "gammadistribut": [2, 3, 6], "geometricdistribut": [2, 3, 6], "logtdistribut": [2, 3, 6], "lognormaldistribut": [2, 3, 6], "mixturedistribut": [2, 3, 6], "normaldistribut": [2, 3, 6], "operabledistribut": [2, 3, 5, 6], "pertdistribut": [2, 3, 6], "paretodistribut": [2, 3, 6], "poissondistribut": [2, 3, 6], "tdistribut": [2, 3, 6], "triangulardistribut": [2, 3, 6], "uniformdistribut": [2, 3, 6], "const": [2, 3, 6], "dist_ceil": [2, 3, 6], "dist_exp": [2, 3, 6], "dist_floor": [2, 3, 6], "dist_fn": [2, 3, 6], "dist_log": [2, 3, 6], "dist_max": [2, 3, 6], "dist_min": [2, 3, 6], "dist_round": [2, 3, 6], "inf0": [2, 3, 6], "log_tdist": [2, 3, 6], "set_se": [2, 3, 8, 9, 10], "bernoulli_sampl": [2, 3, 9], "beta_sampl": [2, 3, 9], "binomial_sampl": [2, 3, 9], "chi_square_sampl": [2, 3, 9], "discrete_sampl": [2, 3, 9], "exponential_sampl": [2, 3, 9], "gamma_sampl": [2, 3, 9], "geometric_sampl": [2, 3, 9], "log_t_sampl": [2, 3, 9], "lognormal_sampl": [2, 3, 9], "mixture_sampl": [2, 3, 9], "normal_sampl": [2, 3, 9], "pareto_sampl": [2, 3, 9], "pert_sampl": [2, 3, 9], "poisson_sampl": [2, 3, 9], "sample_correlated_group": [2, 3, 9], "t_sampl": [2, 3, 9], "triangular_sampl": [2, 3, 9], "uniform_sampl": [2, 3, 9], "doubling_time_to_growth_r": [2, 3, 10], "event_happen": [2, 3, 10], "event_occur": [2, 3, 10], "extrem": [2, 3, 5, 10], "full_kelli": [2, 3, 10], "geomean": [2, 3, 10], "geomean_odd": [2, 3, 10], "get_log_percentil": [2, 3, 10], "get_mean_and_ci": [2, 3, 10], "get_median_and_ci": [2, 3, 10], "growth_rate_to_doubling_tim": [2, 3, 10], "half_kelli": [2, 3, 10], "is_continuous_dist": [2, 3, 10], "is_dist": [2, 3, 10], "is_sampl": [2, 3, 10], "kelli": [0, 2, 3, 10], "laplac": [2, 3, 10], "odds_to_p": [2, 3, 10], "one_in": [2, 3, 10], "p_to_odd": [2, 3, 10], "quarter_kelli": [2, 3, 10], "relative_weight": [4, 6, 9, 10], "sourc": [4, 5, 6, 8, 9, 10], "arrai": [4, 5, 9, 10], "float": [4, 5, 6, 8, 9, 10], "put": 4, "versu": 4, "infer": [0, 4], "sum": [4, 6, 9, 10], "rel": [4, 6, 9, 10], "given": [4, 6, 9, 10], "A": [4, 6, 9, 10], "accord": [4, 5, 9], "event_fn": 4, "reduce_fn": 4, "raw": 4, "memcach": [4, 9], "memcache_load": 4, "memcache_sav": 4, "dump_cache_fil": [4, 9], "load_cache_fil": [4, 9], "cache_file_primari": [4, 9], "core": [4, 9], "bayesian": [0, 4], "allow": 4, "condit": 4, "custom": [4, 6], "defin": [4, 5, 6, 9, 10], "all": [4, 5, 6, 9, 10], "simul": 4, "aggreg": 4, "final": 4, "bool": [4, 5, 9, 10], "memori": [4, 9], "match": [4, 5, 9], "load": [4, 9], "save": [4, 9], "ani": [4, 5, 6, 9, 10], "ignor": [4, 6, 9], "str": [4, 6, 9, 10], "present": [4, 9], "write": [4, 9], "binari": [4, 6, 9], "file": [4, 9], "path": [4, 9], "sqlcach": [4, 9], "append": [4, 9], "name": [4, 6, 9], "first": [4, 9], "attempt": [4, 9], "otherwis": [4, 6, 9, 10], "statement": [4, 9], "comput": [4, 9], "run": [4, 9, 12], "singl": [4, 9], "process": [4, 9], "greater": [4, 6, 9], "multiprocess": [4, 9], "pool": [4, 9], "variou": [4, 9], "likelihood": [4, 6, 9, 10], "rate": [4, 10], "rule": [4, 10], "h": 4, "hypothesi": 4, "aka": [4, 6, 9], "evidence_weight": 4, "perform": 4, "produc": [4, 5], "current": [4, 10], "must": [4, 5, 6, 9, 10], "either": [4, 6, 9, 10], "type": 4, "matter": [4, 6], "where": [4, 5, 9, 10], "53": 4, "implement": [5, 12], "iman": 5, "conov": 5, "method": [5, 6], "induc": 5, "some": 5, "code": 5, "adapt": 5, "abraham": 5, "lee": 5, "mcerp": 5, "tisimst": 5, "class": [5, 6], "tupl": 5, "ndarrai": [5, 9], "float64": [5, 9], "hold": 5, "metadata": 5, "user": [5, 9], "rather": 5, "dure": 5, "dtype": [5, 9], "relative_threshold": 5, "absolute_threshold": 5, "suffici": 5, "uniqu": 5, "data": [5, 10], "column": 5, "wise": 5, "dataset": 5, "2d": 5, "independ": 5, "variabl": [5, 9, 10], "correspond": 5, "corrmat": 5, "desir": [5, 6, 10], "coeffici": 5, "symmetr": 5, "definit": 5, "order": 5, "new_data": 5, "toler": 5, "_min_unique_sampl": 5, "rank": 5, "emploi": 5, "while": 5, "preserv": 5, "margin": 5, "best": 5, "effort": 5, "basi": 5, "fail": 5, "depend": 5, "provid": 5, "except": 5, "rais": 5, "case": [5, 6], "abl": 5, "enough": 5, "shuffl": 5, "notabl": 5, "hard": 5, "common": [5, 6, 9], "few": 5, "spearman": 5, "semi": 5, "confus": 5, "covari": 5, "exclus": 5, "same": [5, 6, 9, 10], "option": 5, "overrid": 5, "absolut": [5, 10], "disabl": 5, "correlated_vari": 5, "input": 5, "suppos": 5, "solar_radi": 5, "temperatur": 5, "300": 5, "22": 5, "28": [5, 10], "corrcoef": 5, "6975960649767123": 5, "could": [5, 6], "funding_gap": 5, "cost_per_deliveri": 5, "effect_s": 5, "20_000": 5, "80_000": 5, "30": [5, 10], "580520": 5, "480149": 5, "580962": 5, "187831": 5, "abc": 6, "item": [6, 9], "df": [6, 9], "left": [6, 9], "right": [6, 9], "fn": 6, "fn_str": 6, "infix": 6, "x": [6, 10], "shape": [6, 9], "y": 6, "norm_mean": 6, "norm_sd": 6, "lognorm_mean": 6, "lognorm_sd": 6, "dist": [6, 9], "num_sampl": 6, "draw": 6, "mode": [6, 9, 10], "initi": 6, "alpha": [6, 9], "typic": [6, 9], "trial": [6, 9, 10], "success": [6, 9, 10], "failur": [6, 9, 10], "chi": [6, 9], "squar": [6, 9], "degre": [6, 9], "freedom": [6, 9], "chiaquar": 6, "dist1": 6, "bound": 6, "output": 6, "appli": 6, "until": 6, "funciton": 6, "partial": 6, "suitabl": 6, "upper": 6, "lazi": 6, "evalu": 6, "constant": 6, "alwai": 6, "categor": [6, 9], "dict": [6, 9, 10], "being": [6, 9], "thing": [6, 9], "ceil": 6, "exp": 6, "floor": 6, "dist2": 6, "second": 6, "argument": 6, "By": 6, "__name__": 6, "doubl": [6, 10], "718281828459045": 6, "log": [6, 9, 10], "maximum": 6, "max": 6, "minimum": 6, "min": 6, "below": [6, 9], "coerc": [6, 9], "individu": [6, 9], "p_zero": 6, "arbitrari": 6, "alia": [6, 10], "val": 6, "space": [6, 9], "via": [6, 9], "loos": [6, 9], "unlik": [6, 9], "precis": [6, 9], "classic": 6, "low": [6, 9], "high": [6, 9], "underli": 6, "deviat": [6, 9], "04": 6, "21": [6, 9], "09": 6, "147": 6, "smallest": [6, 9], "most": [6, 9, 10], "largest": [6, 9], "unless": [6, 9], "less": 6, "becom": 6, "08": [6, 10], "seed": 8, "default_rng": 8, "hood": 8, "intern": [8, 9], "42": [8, 9, 10], "pcg64": 8, "0x127ede9e0": 8, "22145847498048798": 9, "808417207931989": 9, "_multicore_tqdm_n": 9, "_multicore_tqdm_cor": 9, "tqdm": 9, "interfac": 9, "meant": 9, "bar": 9, "multicor": 9, "safe": 9, "24": [9, 10], "042086039659946": 9, "290716894247602": 9, "addition": 9, "052949773846356": 9, "3562412406168636": 9, "ranom": 9, "183867278765718": 9, "7859113725925972": 9, "1041655362137777": 9, "30471707975443135": 9, "069666324736094": 9, "327625176788963": 9, "13": [9, 10], "_correlate_if_need": 9, "npy": 9, "1m": 9, "592627415218455": 9, "7281209657534462": 9, "10817361": 9, "45828454": 9, "requested_dist": 9, "store": 9, "themselv": 9, "_correlated_sampl": 9, "necessari": 9, "need": 9, "onc": [9, 10], "regardless": 9, "tree": 9, "oper": [6, 9], "7887113716855985": 9, "7739560485559633": 9, "doubling_tim": 10, "convert": 10, "growth": 10, "express": 10, "unit": 10, "g": 10, "remain": 10, "got": 10, "annual": 10, "sens": 10, "talk": 10, "percentag": 10, "12": 10, "05946309435929531": 10, "predict": 10, "within": 10, "factor": 10, "73": 10, "http": 10, "arxiv": 10, "org": 10, "ab": 10, "2111": 10, "03153": 10, "875428191155692": 10, "coin": 10, "resolve_d": 10, "defer": 10, "give": 10, "bet": [0, 10], "back": 10, "arr": 10, "yyyi": 10, "mm": 10, "dd": 10, "addit": [0, 10], "specifi": 10, "adj_pric": 10, "adjust": 10, "taken": 10, "account": 10, "delta_pric": 10, "adj_delta_pric": 10, "indic": 10, "delta": 10, "max_gain": 10, "would": 10, "gain": 10, "modeled_gain": 10, "expected_arr": 10, "125": 10, "72": 10, "75": 10, "drop_na": 10, "boolean": 10, "na": 10, "drop": 10, "1072325059538595": 10, "odd": 10, "befor": 10, "42985748800076845": 10, "99": 10, "revers": 10, "displai": 10, "95th": 10, "5th": 10, "swap": 10, "easi": 10, "read": 10, "dictionari": 10, "power": 10, "25": 10, "49": 10, "74": 10, "ci_low": 10, "ci_high": 10, "median": 10, "growth_rat": 10, "69": 10, "66071689357483": 10, "55": 10, "62": 10, "23": 10, "375": 10, "obj": 10, "string": 10, "callabl": 10, "half": 10, "quarter": 10, "full": 10, "time_pass": 10, "time_remain": 10, "time_fix": 10, "next": 10, "law": 10, "invari": 10, "www": 10, "lesswrong": 10, "com": 10, "post": 10, "we7sk8w8aixqknar": 10, "among": 10, "past": 10, "leav": 10, "occur": 10, "observ": 10, "least": 10, "over": 10, "period": 10, "wa": 10, "chosen": 10, "specif": 10, "recent": 10, "sun": 10, "risen": 10, "000": 10, "rise": 10, "again": 10, "tomorrow": 10, "999990000199996": 10, "last": 10, "nuke": 10, "war": 10, "77": 10, "ago": 10, "naiv": 10, "012820512820512664": 10, "lst": 10, "decim": 10, "09090909090909091": 10, "logic": 10, "1111111111111111": 10, "48": 10, "31": 10, "188": 10, "roll": 10, "die": 10, "dice": 10, "collect": 6, "squigglepi": [1, 12], "squiggl": 12, "python": 12, "api": 0, "refer": 0, "exampl": [0, 4, 5, 6, 8, 9, 10], "piano": 0, "tuner": 0, "more": 0, "instal": [0, 12], "usag": 0, "disclaim": [], "acknowledg": [], "alarm": [], "net": [], "demonstr": [], "monti": [], "hall": [], "problem": [], "complex": [], "interact": [], "paramet": [4, 5, 6, 8, 9, 10]}, "objects": {"": [[3, 0, 0, "-", "squigglepy"]], "squigglepy": [[4, 0, 0, "-", "bayes"], [5, 0, 0, "-", "correlation"], [6, 0, 0, "-", "distributions"], [7, 0, 0, "-", "numbers"], [8, 0, 0, "-", "rng"], [9, 0, 0, "-", "samplers"], [10, 0, 0, "-", "utils"], [11, 0, 0, "-", "version"]], "squigglepy.bayes": [[4, 1, 1, "", "average"], [4, 1, 1, "", "bayesnet"], [4, 1, 1, "", "simple_bayes"], [4, 1, 1, "", "update"]], "squigglepy.correlation": [[5, 2, 1, "", "CorrelationGroup"], [5, 1, 1, "", "correlate"]], "squigglepy.correlation.CorrelationGroup": [[5, 3, 1, "", "correlated_dists"], [5, 3, 1, "", "correlation_matrix"], [5, 3, 1, "", "correlation_tolerance"], [5, 4, 1, "", "has_sufficient_sample_diversity"], [5, 4, 1, "", "induce_correlation"], [5, 3, 1, "", "min_unique_samples"]], "squigglepy.distributions": [[6, 2, 1, "", "BaseDistribution"], [6, 2, 1, "", "BernoulliDistribution"], [6, 2, 1, "", "BetaDistribution"], [6, 2, 1, "", "BinomialDistribution"], [6, 2, 1, "", "CategoricalDistribution"], [6, 2, 1, "", "ChiSquareDistribution"], [6, 2, 1, "", "ComplexDistribution"], [6, 2, 1, "", "CompositeDistribution"], [6, 2, 1, "", "ConstantDistribution"], [6, 2, 1, "", "ContinuousDistribution"], [6, 2, 1, "", "DiscreteDistribution"], [6, 2, 1, "", "ExponentialDistribution"], [6, 2, 1, "", "GammaDistribution"], [6, 2, 1, "", "GeometricDistribution"], [6, 2, 1, "", "LogTDistribution"], [6, 2, 1, "", "LognormalDistribution"], [6, 2, 1, "", "MixtureDistribution"], [6, 2, 1, "", "NormalDistribution"], [6, 2, 1, "", "OperableDistribution"], [6, 2, 1, "", "PERTDistribution"], [6, 2, 1, "", "ParetoDistribution"], [6, 2, 1, "", "PoissonDistribution"], [6, 2, 1, "", "TDistribution"], [6, 2, 1, "", "TriangularDistribution"], [6, 2, 1, "", "UniformDistribution"], [6, 1, 1, "", "bernoulli"], [6, 1, 1, "", "beta"], [6, 1, 1, "", "binomial"], [6, 1, 1, "", "chisquare"], [6, 1, 1, "", "clip"], [6, 1, 1, "", "const"], [6, 1, 1, "", "discrete"], [6, 1, 1, "", "dist_ceil"], [6, 1, 1, "", "dist_exp"], [6, 1, 1, "", "dist_floor"], [6, 1, 1, "", "dist_fn"], [6, 1, 1, "", "dist_log"], [6, 1, 1, "", "dist_max"], [6, 1, 1, "", "dist_min"], [6, 1, 1, "", "dist_round"], [6, 1, 1, "", "exponential"], [6, 1, 1, "", "gamma"], [6, 1, 1, "", "geometric"], [6, 1, 1, "", "inf0"], [6, 1, 1, "", "lclip"], [6, 1, 1, "", "log_tdist"], [6, 1, 1, "", "lognorm"], [6, 1, 1, "", "mixture"], [6, 1, 1, "", "norm"], [6, 1, 1, "", "pareto"], [6, 1, 1, "", "pert"], [6, 1, 1, "", "poisson"], [6, 1, 1, "", "rclip"], [6, 1, 1, "", "tdist"], [6, 1, 1, "", "to"], [6, 1, 1, "", "triangular"], [6, 1, 1, "", "uniform"], [6, 1, 1, "", "zero_inflated"]], "squigglepy.distributions.OperableDistribution": [[6, 4, 1, "", "plot"]], "squigglepy.rng": [[8, 1, 1, "", "set_seed"]], "squigglepy.samplers": [[9, 1, 1, "", "bernoulli_sample"], [9, 1, 1, "", "beta_sample"], [9, 1, 1, "", "binomial_sample"], [9, 1, 1, "", "chi_square_sample"], [9, 1, 1, "", "discrete_sample"], [9, 1, 1, "", "exponential_sample"], [9, 1, 1, "", "gamma_sample"], [9, 1, 1, "", "geometric_sample"], [9, 1, 1, "", "log_t_sample"], [9, 1, 1, "", "lognormal_sample"], [9, 1, 1, "", "mixture_sample"], [9, 1, 1, "", "normal_sample"], [9, 1, 1, "", "pareto_sample"], [9, 1, 1, "", "pert_sample"], [9, 1, 1, "", "poisson_sample"], [9, 1, 1, "", "sample"], [9, 1, 1, "", "sample_correlated_group"], [9, 1, 1, "", "t_sample"], [9, 1, 1, "", "triangular_sample"], [9, 1, 1, "", "uniform_sample"]], "squigglepy.utils": [[10, 1, 1, "", "doubling_time_to_growth_rate"], [10, 1, 1, "", "event"], [10, 1, 1, "", "event_happens"], [10, 1, 1, "", "event_occurs"], [10, 1, 1, "", "extremize"], [10, 1, 1, "", "flip_coin"], [10, 1, 1, "", "full_kelly"], [10, 1, 1, "", "geomean"], [10, 1, 1, "", "geomean_odds"], [10, 1, 1, "", "get_log_percentiles"], [10, 1, 1, "", "get_mean_and_ci"], [10, 1, 1, "", "get_median_and_ci"], [10, 1, 1, "", "get_percentiles"], [10, 1, 1, "", "growth_rate_to_doubling_time"], [10, 1, 1, "", "half_kelly"], [10, 1, 1, "", "is_continuous_dist"], [10, 1, 1, "", "is_dist"], [10, 1, 1, "", "is_sampleable"], [10, 1, 1, "", "kelly"], [10, 1, 1, "", "laplace"], [10, 1, 1, "", "normalize"], [10, 1, 1, "", "odds_to_p"], [10, 1, 1, "", "one_in"], [10, 1, 1, "", "p_to_odds"], [10, 1, 1, "", "quarter_kelly"], [10, 1, 1, "", "roll_die"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "method", "Python method"]}, "titleterms": {"welcom": [], "squigglepi": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "": [], "document": [], "indic": [], "tabl": [], "implement": 0, "squiggl": 0, "python": 0, "instal": 1, "usag": [], "piano": 12, "tuner": 12, "exampl": 12, "distribut": [6, 12], "addit": 12, "featur": 12, "roll": 12, "die": 12, "bayesian": 12, "infer": 12, "alarm": 12, "net": 12, "A": 12, "demonstr": 12, "monti": 12, "hall": 12, "problem": 12, "more": 12, "complex": 12, "coin": 12, "dice": 12, "interact": 12, "kelli": 12, "bet": 12, "run": [], "test": [], "disclaim": 0, "acknowledg": 0, "packag": 3, "subpackag": [], "modul": [4, 5, 6, 7, 8, 9, 10, 11], "content": 0, "submodul": 3, "bay": 4, "correl": 5, "number": 7, "rng": 8, "sampler": 9, "util": 10, "version": 11, "integr": [], "strategi": [], "test_bay": [], "test_correl": [], "test_distribut": [], "test_numb": [], "test_rng": [], "test_sampl": [], "test_util": [], "paramet": [], "return": [], "api": [], "refer": []}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Squigglepy: Implementation of Squiggle in Python": [[0, "squigglepy-implementation-of-squiggle-in-python"]], "Contents": [[0, null]], "Disclaimers": [[0, "disclaimers"]], "Acknowledgements": [[0, "acknowledgements"]], "Installation": [[1, "installation"]], "squigglepy": [[2, "squigglepy"]], "squigglepy package": [[3, "module-squigglepy"]], "Submodules": [[3, "submodules"]], "squigglepy.bayes module": [[4, "module-squigglepy.bayes"]], "squigglepy.correlation module": [[5, "module-squigglepy.correlation"]], "squigglepy.distributions module": [[6, "module-squigglepy.distributions"]], "squigglepy.numbers module": [[7, "module-squigglepy.numbers"]], "squigglepy.rng module": [[8, "module-squigglepy.rng"]], "squigglepy.samplers module": [[9, "module-squigglepy.samplers"]], "squigglepy.utils module": [[10, "module-squigglepy.utils"]], "squigglepy.version module": [[11, "module-squigglepy.version"]], "Examples": [[12, "examples"]], "Piano tuners example": [[12, "piano-tuners-example"]], "Distributions": [[12, "distributions"]], "Additional features": [[12, "additional-features"]], "Example: Rolling a die": [[12, "example-rolling-a-die"]], "Bayesian inference": [[12, "bayesian-inference"]], "Example: Alarm net": [[12, "example-alarm-net"]], "Example: A demonstration of the Monty Hall Problem": [[12, "example-a-demonstration-of-the-monty-hall-problem"]], "Example: More complex coin/dice interactions": [[12, "example-more-complex-coin-dice-interactions"]], "Kelly betting": [[12, "kelly-betting"]], "More examples": [[12, "more-examples"]]}, "indexentries": {"module": [[3, "module-squigglepy"], [4, "module-squigglepy.bayes"], [5, "module-squigglepy.correlation"], [6, "module-squigglepy.distributions"], [7, "module-squigglepy.numbers"], [8, "module-squigglepy.rng"], [9, "module-squigglepy.samplers"], [10, "module-squigglepy.utils"], [11, "module-squigglepy.version"]], "squigglepy": [[3, "module-squigglepy"]], "average() (in module squigglepy.bayes)": [[4, "squigglepy.bayes.average"]], "bayesnet() (in module squigglepy.bayes)": [[4, "squigglepy.bayes.bayesnet"]], "simple_bayes() (in module squigglepy.bayes)": [[4, "squigglepy.bayes.simple_bayes"]], "squigglepy.bayes": [[4, "module-squigglepy.bayes"]], "update() (in module squigglepy.bayes)": [[4, "squigglepy.bayes.update"]], "correlationgroup (class in squigglepy.correlation)": [[5, "squigglepy.correlation.CorrelationGroup"]], "correlate() (in module squigglepy.correlation)": [[5, "squigglepy.correlation.correlate"]], "correlated_dists (squigglepy.correlation.correlationgroup attribute)": [[5, "squigglepy.correlation.CorrelationGroup.correlated_dists"]], "correlation_matrix (squigglepy.correlation.correlationgroup attribute)": [[5, "squigglepy.correlation.CorrelationGroup.correlation_matrix"]], "correlation_tolerance (squigglepy.correlation.correlationgroup attribute)": [[5, "squigglepy.correlation.CorrelationGroup.correlation_tolerance"]], "has_sufficient_sample_diversity() (squigglepy.correlation.correlationgroup method)": [[5, "squigglepy.correlation.CorrelationGroup.has_sufficient_sample_diversity"]], "induce_correlation() (squigglepy.correlation.correlationgroup method)": [[5, "squigglepy.correlation.CorrelationGroup.induce_correlation"]], "min_unique_samples (squigglepy.correlation.correlationgroup attribute)": [[5, "squigglepy.correlation.CorrelationGroup.min_unique_samples"]], "squigglepy.correlation": [[5, "module-squigglepy.correlation"]], "basedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BaseDistribution"]], "bernoullidistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BernoulliDistribution"]], "betadistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BetaDistribution"]], "binomialdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.BinomialDistribution"]], "categoricaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.CategoricalDistribution"]], "chisquaredistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ChiSquareDistribution"]], "complexdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ComplexDistribution"]], "compositedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.CompositeDistribution"]], "constantdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ConstantDistribution"]], "continuousdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ContinuousDistribution"]], "discretedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.DiscreteDistribution"]], "exponentialdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ExponentialDistribution"]], "gammadistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.GammaDistribution"]], "geometricdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.GeometricDistribution"]], "logtdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.LogTDistribution"]], "lognormaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.LognormalDistribution"]], "mixturedistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.MixtureDistribution"]], "normaldistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.NormalDistribution"]], "operabledistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.OperableDistribution"]], "pertdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.PERTDistribution"]], "paretodistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.ParetoDistribution"]], "poissondistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.PoissonDistribution"]], "tdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.TDistribution"]], "triangulardistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.TriangularDistribution"]], "uniformdistribution (class in squigglepy.distributions)": [[6, "squigglepy.distributions.UniformDistribution"]], "bernoulli() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.bernoulli"]], "beta() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.beta"]], "binomial() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.binomial"]], "chisquare() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.chisquare"]], "clip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.clip"]], "const() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.const"]], "discrete() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.discrete"]], "dist_ceil() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_ceil"]], "dist_exp() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_exp"]], "dist_floor() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_floor"]], "dist_fn() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_fn"]], "dist_log() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_log"]], "dist_max() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_max"]], "dist_min() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_min"]], "dist_round() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.dist_round"]], "exponential() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.exponential"]], "gamma() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.gamma"]], "geometric() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.geometric"]], "inf0() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.inf0"]], "lclip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.lclip"]], "log_tdist() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.log_tdist"]], "lognorm() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.lognorm"]], "mixture() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.mixture"]], "norm() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.norm"]], "pareto() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.pareto"]], "pert() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.pert"]], "plot() (squigglepy.distributions.operabledistribution method)": [[6, "squigglepy.distributions.OperableDistribution.plot"]], "poisson() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.poisson"]], "rclip() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.rclip"]], "squigglepy.distributions": [[6, "module-squigglepy.distributions"]], "tdist() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.tdist"]], "to() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.to"]], "triangular() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.triangular"]], "uniform() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.uniform"]], "zero_inflated() (in module squigglepy.distributions)": [[6, "squigglepy.distributions.zero_inflated"]], "squigglepy.numbers": [[7, "module-squigglepy.numbers"]], "set_seed() (in module squigglepy.rng)": [[8, "squigglepy.rng.set_seed"]], "squigglepy.rng": [[8, "module-squigglepy.rng"]], "bernoulli_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.bernoulli_sample"]], "beta_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.beta_sample"]], "binomial_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.binomial_sample"]], "chi_square_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.chi_square_sample"]], "discrete_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.discrete_sample"]], "exponential_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.exponential_sample"]], "gamma_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.gamma_sample"]], "geometric_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.geometric_sample"]], "log_t_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.log_t_sample"]], "lognormal_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.lognormal_sample"]], "mixture_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.mixture_sample"]], "normal_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.normal_sample"]], "pareto_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.pareto_sample"]], "pert_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.pert_sample"]], "poisson_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.poisson_sample"]], "sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.sample"]], "sample_correlated_group() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.sample_correlated_group"]], "squigglepy.samplers": [[9, "module-squigglepy.samplers"]], "t_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.t_sample"]], "triangular_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.triangular_sample"]], "uniform_sample() (in module squigglepy.samplers)": [[9, "squigglepy.samplers.uniform_sample"]], "doubling_time_to_growth_rate() (in module squigglepy.utils)": [[10, "squigglepy.utils.doubling_time_to_growth_rate"]], "event() (in module squigglepy.utils)": [[10, "squigglepy.utils.event"]], "event_happens() (in module squigglepy.utils)": [[10, "squigglepy.utils.event_happens"]], "event_occurs() (in module squigglepy.utils)": [[10, "squigglepy.utils.event_occurs"]], "extremize() (in module squigglepy.utils)": [[10, "squigglepy.utils.extremize"]], "flip_coin() (in module squigglepy.utils)": [[10, "squigglepy.utils.flip_coin"]], "full_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.full_kelly"]], "geomean() (in module squigglepy.utils)": [[10, "squigglepy.utils.geomean"]], "geomean_odds() (in module squigglepy.utils)": [[10, "squigglepy.utils.geomean_odds"]], "get_log_percentiles() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_log_percentiles"]], "get_mean_and_ci() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_mean_and_ci"]], "get_median_and_ci() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_median_and_ci"]], "get_percentiles() (in module squigglepy.utils)": [[10, "squigglepy.utils.get_percentiles"]], "growth_rate_to_doubling_time() (in module squigglepy.utils)": [[10, "squigglepy.utils.growth_rate_to_doubling_time"]], "half_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.half_kelly"]], "is_continuous_dist() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_continuous_dist"]], "is_dist() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_dist"]], "is_sampleable() (in module squigglepy.utils)": [[10, "squigglepy.utils.is_sampleable"]], "kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.kelly"]], "laplace() (in module squigglepy.utils)": [[10, "squigglepy.utils.laplace"]], "normalize() (in module squigglepy.utils)": [[10, "squigglepy.utils.normalize"]], "odds_to_p() (in module squigglepy.utils)": [[10, "squigglepy.utils.odds_to_p"]], "one_in() (in module squigglepy.utils)": [[10, "squigglepy.utils.one_in"]], "p_to_odds() (in module squigglepy.utils)": [[10, "squigglepy.utils.p_to_odds"]], "quarter_kelly() (in module squigglepy.utils)": [[10, "squigglepy.utils.quarter_kelly"]], "roll_die() (in module squigglepy.utils)": [[10, "squigglepy.utils.roll_die"]], "squigglepy.utils": [[10, "module-squigglepy.utils"]], "squigglepy.version": [[11, "module-squigglepy.version"]]}}) \ No newline at end of file diff --git a/doc/build/html/usage.html b/doc/build/html/usage.html deleted file mode 100644 index 726ffd4..0000000 --- a/doc/build/html/usage.html +++ /dev/null @@ -1,894 +0,0 @@ - - - - - - - - - - - Examples — Squigglepy documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - - - - - - - - - - -
    - -
    - - -
    -
    - -
    -
    - -
    - -
    - - - - -
    - -
    - - -
    -
    - - - - - -
    - -
    -

    Examples#

    -
    -

    Piano tuners example#

    -

    Here’s the Squigglepy implementation of the example from Squiggle -Docs:

    -
    import squigglepy as sq
    -import numpy as np
    -import matplotlib.pyplot as plt
    -from squigglepy.numbers import K, M
    -from pprint import pprint
    -
    -pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)  # This means that you're 90% confident the value is between 8.1 and 8.4 Million.
    -pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01  # We assume there are almost no people with multiple pianos
    -pianos_per_piano_tuner = sq.to(2*K, 50*K)
    -piano_tuners_per_piano = 1 / pianos_per_piano_tuner
    -total_tuners_in_2022 = pop_of_ny_2022 * pct_of_pop_w_pianos * piano_tuners_per_piano
    -samples = total_tuners_in_2022 @ 1000  # Note: `@ 1000` is shorthand to get 1000 samples
    -
    -# Get mean and SD
    -print('Mean: {}, SD: {}'.format(round(np.mean(samples), 2),
    -                                round(np.std(samples), 2)))
    -
    -# Get percentiles
    -pprint(sq.get_percentiles(samples, digits=0))
    -
    -# Histogram
    -plt.hist(samples, bins=200)
    -plt.show()
    -
    -# Shorter histogram
    -total_tuners_in_2022.plot()
    -
    -
    -

    And the version from the Squiggle doc that incorporates time:

    -
    import squigglepy as sq
    -from squigglepy.numbers import K, M
    -
    -pop_of_ny_2022 = sq.to(8.1*M, 8.4*M)
    -pct_of_pop_w_pianos = sq.to(0.2, 1) * 0.01
    -pianos_per_piano_tuner = sq.to(2*K, 50*K)
    -piano_tuners_per_piano = 1 / pianos_per_piano_tuner
    -
    -def pop_at_time(t):  # t = Time in years after 2022
    -    avg_yearly_pct_change = sq.to(-0.01, 0.05)  # We're expecting NYC to continuously grow with an mean of roughly between -1% and +4% per year
    -    return pop_of_ny_2022 * ((avg_yearly_pct_change + 1) ** t)
    -
    -def total_tuners_at_time(t):
    -    return pop_at_time(t) * pct_of_pop_w_pianos * piano_tuners_per_piano
    -
    -# Get total piano tuners at 2030
    -sq.get_percentiles(total_tuners_at_time(2030-2022) @ 1000)
    -
    -
    -

    WARNING: Be careful about dividing by K, M, etc. 1/2*K = -500 in Python. Use 1/(2*K) instead to get the expected outcome.

    -

    WARNING: Be careful about using K to get sample counts. Use -sq.norm(2, 3) @ (2*K)sq.norm(2, 3) @ 2*K will return only -two samples, multiplied by 1000.

    -
    -
    -

    Distributions#

    -
    import squigglepy as sq
    -
    -# Normal distribution
    -sq.norm(1, 3)  # 90% interval from 1 to 3
    -
    -# Distribution can be sampled with mean and sd too
    -sq.norm(mean=0, sd=1)
    -
    -# Shorthand to get one sample
    -~sq.norm(1, 3)
    -
    -# Shorthand to get more than one sample
    -sq.norm(1, 3) @ 100
    -
    -# Longhand version to get more than one sample
    -sq.sample(sq.norm(1, 3), n=100)
    -
    -# Nice progress reporter
    -sq.sample(sq.norm(1, 3), n=1000, verbose=True)
    -
    -# Other distributions exist
    -sq.lognorm(1, 10)
    -sq.tdist(1, 10, t=5)
    -sq.triangular(1, 2, 3)
    -sq.pert(1, 2, 3, lam=2)
    -sq.binomial(p=0.5, n=5)
    -sq.beta(a=1, b=2)
    -sq.bernoulli(p=0.5)
    -sq.poisson(10)
    -sq.chisquare(2)
    -sq.gamma(3, 2)
    -sq.pareto(1)
    -sq.exponential(scale=1)
    -sq.geometric(p=0.5)
    -
    -# Discrete sampling
    -sq.discrete({'A': 0.1, 'B': 0.9})
    -
    -# Can return integers
    -sq.discrete({0: 0.1, 1: 0.3, 2: 0.3, 3: 0.15, 4: 0.15})
    -
    -# Alternate format (also can be used to return more complex objects)
    -sq.discrete([[0.1,  0],
    -             [0.3,  1],
    -             [0.3,  2],
    -             [0.15, 3],
    -             [0.15, 4]])
    -
    -sq.discrete([0, 1, 2]) # No weights assumes equal weights
    -
    -# You can mix distributions together
    -sq.mixture([sq.norm(1, 3),
    -            sq.norm(4, 10),
    -            sq.lognorm(1, 10)],  # Distributions to mix
    -           [0.3, 0.3, 0.4])     # These are the weights on each distribution
    -
    -# This is equivalent to the above, just a different way of doing the notation
    -sq.mixture([[0.3, sq.norm(1,3)],
    -            [0.3, sq.norm(4,10)],
    -            [0.4, sq.lognorm(1,10)]])
    -
    -# Make a zero-inflated distribution
    -# 60% chance of returning 0, 40% chance of sampling from `norm(1, 2)`.
    -sq.zero_inflated(0.6, sq.norm(1, 2))
    -
    -
    -
    -
    -

    Additional features#

    -
    import squigglepy as sq
    -
    -# You can add and subtract distributions
    -(sq.norm(1,3) + sq.norm(4,5)) @ 100
    -(sq.norm(1,3) - sq.norm(4,5)) @ 100
    -(sq.norm(1,3) * sq.norm(4,5)) @ 100
    -(sq.norm(1,3) / sq.norm(4,5)) @ 100
    -
    -# You can also do math with numbers
    -~((sq.norm(sd=5) + 2) * 2)
    -~(-sq.lognorm(0.1, 1) * sq.pareto(1) / 10)
    -
    -# You can change the CI from 90% (default) to 80%
    -sq.norm(1, 3, credibility=80)
    -
    -# You can clip
    -sq.norm(0, 3, lclip=0, rclip=5) # Sample norm with a 90% CI from 0-3, but anything lower than 0 gets clipped to 0 and anything higher than 5 gets clipped to 5.
    -
    -# You can also clip with a function, and use pipes
    -sq.norm(0, 3) >> sq.clip(0, 5)
    -
    -# You can correlate continuous distributions
    -a, b = sq.uniform(-1, 1), sq.to(0, 3)
    -a, b = sq.correlate((a, b), 0.5)  # Correlate a and b with a correlation of 0.5
    -# You can even pass your own correlation matrix!
    -a, b = sq.correlate((a, b), [[1, 0.5], [0.5, 1]])
    -
    -
    -
    -

    Example: Rolling a die#

    -

    An example of how to use distributions to build tools:

    -
    import squigglepy as sq
    -
    -def roll_die(sides, n=1):
    -    return sq.discrete(list(range(1, sides + 1))) @ n if sides > 0 else None
    -
    -roll_die(sides=6, n=10)
    -# [2, 6, 5, 2, 6, 2, 3, 1, 5, 2]
    -
    -
    -

    This is already included standard in the utils of this package. Use -sq.roll_die.

    -
    -
    -
    -

    Bayesian inference#

    -

    1% of women at age forty who participate in routine screening have -breast cancer. 80% of women with breast cancer will get positive -mammographies. 9.6% of women without breast cancer will also get -positive mammographies.

    -

    A woman in this age group had a positive mammography in a routine -screening. What is the probability that she actually has breast cancer?

    -

    We can approximate the answer with a Bayesian network (uses rejection -sampling):

    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import M
    -
    -def mammography(has_cancer):
    -    return sq.event(0.8 if has_cancer else 0.096)
    -
    -def define_event():
    -    cancer = ~sq.bernoulli(0.01)
    -    return({'mammography': mammography(cancer),
    -            'cancer': cancer})
    -
    -bayes.bayesnet(define_event,
    -               find=lambda e: e['cancer'],
    -               conditional_on=lambda e: e['mammography'],
    -               n=1*M)
    -# 0.07723995880535531
    -
    -
    -

    Or if we have the information immediately on hand, we can directly -calculate it. Though this doesn’t work for very complex stuff.

    -
    from squigglepy import bayes
    -bayes.simple_bayes(prior=0.01, likelihood_h=0.8, likelihood_not_h=0.096)
    -# 0.07763975155279504
    -
    -
    -

    You can also make distributions and update them:

    -
    import matplotlib.pyplot as plt
    -import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import K
    -import numpy as np
    -
    -print('Prior')
    -prior = sq.norm(1,5)
    -prior_samples = prior @ (10*K)
    -plt.hist(prior_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(prior_samples))
    -print('Prior Mean: {} SD: {}'.format(np.mean(prior_samples), np.std(prior_samples)))
    -print('-')
    -
    -print('Evidence')
    -evidence = sq.norm(2,3)
    -evidence_samples = evidence @ (10*K)
    -plt.hist(evidence_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(evidence_samples))
    -print('Evidence Mean: {} SD: {}'.format(np.mean(evidence_samples), np.std(evidence_samples)))
    -print('-')
    -
    -print('Posterior')
    -posterior = bayes.update(prior, evidence)
    -posterior_samples = posterior @ (10*K)
    -plt.hist(posterior_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(posterior_samples))
    -print('Posterior Mean: {} SD: {}'.format(np.mean(posterior_samples), np.std(posterior_samples)))
    -
    -print('Average')
    -average = bayes.average(prior, evidence)
    -average_samples = average @ (10*K)
    -plt.hist(average_samples, bins = 200)
    -plt.show()
    -print(sq.get_percentiles(average_samples))
    -print('Average Mean: {} SD: {}'.format(np.mean(average_samples), np.std(average_samples)))
    -
    -
    -
    -

    Example: Alarm net#

    -

    This is the alarm network from Bayesian Artificial Intelligence - -Section -2.5.1:

    -
    -

    Assume your house has an alarm system against burglary.

    -

    You live in the seismically active area and the alarm system can get -occasionally set off by an earthquake.

    -

    You have two neighbors, Mary and John, who do not know each other. If -they hear the alarm they call you, but this is not guaranteed.

    -

    The chance of a burglary on a particular day is 0.1%. The chance of -an earthquake on a particular day is 0.2%.

    -

    The alarm will go off 95% of the time with both a burglary and an -earthquake, 94% of the time with just a burglary, 29% of the time -with just an earthquake, and 0.1% of the time with nothing (total -false alarm).

    -

    John will call you 90% of the time when the alarm goes off. But on 5% -of the days, John will just call to say “hi”. Mary will call you 70% -of the time when the alarm goes off. But on 1% of the days, Mary will -just call to say “hi”.

    -
    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import M
    -
    -def p_alarm_goes_off(burglary, earthquake):
    -    if burglary and earthquake:
    -        return 0.95
    -    elif burglary and not earthquake:
    -        return 0.94
    -    elif not burglary and earthquake:
    -        return 0.29
    -    elif not burglary and not earthquake:
    -        return 0.001
    -
    -def p_john_calls(alarm_goes_off):
    -    return 0.9 if alarm_goes_off else 0.05
    -
    -def p_mary_calls(alarm_goes_off):
    -    return 0.7 if alarm_goes_off else 0.01
    -
    -def define_event():
    -    burglary_happens = sq.event(p=0.001)
    -    earthquake_happens = sq.event(p=0.002)
    -    alarm_goes_off = sq.event(p_alarm_goes_off(burglary_happens, earthquake_happens))
    -    john_calls = sq.event(p_john_calls(alarm_goes_off))
    -    mary_calls = sq.event(p_mary_calls(alarm_goes_off))
    -    return {'burglary': burglary_happens,
    -            'earthquake': earthquake_happens,
    -            'alarm_goes_off': alarm_goes_off,
    -            'john_calls': john_calls,
    -            'mary_calls': mary_calls}
    -
    -# What are the chances that both John and Mary call if an earthquake happens?
    -bayes.bayesnet(define_event,
    -               n=1*M,
    -               find=lambda e: (e['mary_calls'] and e['john_calls']),
    -               conditional_on=lambda e: e['earthquake'])
    -# Result will be ~0.19, though it varies because it is based on a random sample.
    -# This also may take a minute to run.
    -
    -# If both John and Mary call, what is the chance there's been a burglary?
    -bayes.bayesnet(define_event,
    -               n=1*M,
    -               find=lambda e: e['burglary'],
    -               conditional_on=lambda e: (e['mary_calls'] and e['john_calls']))
    -# Result will be ~0.27, though it varies because it is based on a random sample.
    -# This will run quickly because there is a built-in cache.
    -# Use `cache=False` to not build a cache and `reload_cache=True` to recalculate the cache.
    -
    -
    -

    Note that the amount of Bayesian analysis that squigglepy can do is -pretty limited. For more complex bayesian analysis, consider -sorobn, -pomegranate, -bnlearn, or -pyMC.

    -
    -
    -

    Example: A demonstration of the Monty Hall Problem#

    -
    import squigglepy as sq
    -from squigglepy import bayes
    -from squigglepy.numbers import K, M, B, T
    -
    -
    -def monte_hall(door_picked, switch=False):
    -    doors = ['A', 'B', 'C']
    -    car_is_behind_door = ~sq.discrete(doors)
    -    reveal_door = ~sq.discrete([d for d in doors if d != door_picked and d != car_is_behind_door])
    -
    -    if switch:
    -        old_door_picked = door_picked
    -        door_picked = [d for d in doors if d != old_door_picked and d != reveal_door][0]
    -
    -    won_car = (car_is_behind_door == door_picked)
    -    return won_car
    -
    -
    -def define_event():
    -    door = ~sq.discrete(['A', 'B', 'C'])
    -    switch = sq.event(0.5)
    -    return {'won': monte_hall(door_picked=door, switch=switch),
    -            'switched': switch}
    -
    -RUNS = 10*K
    -r = bayes.bayesnet(define_event,
    -                   find=lambda e: e['won'],
    -                   conditional_on=lambda e: e['switched'],
    -                   verbose=True,
    -                   n=RUNS)
    -print('Win {}% of the time when switching'.format(int(r * 100)))
    -
    -r = bayes.bayesnet(define_event,
    -                   find=lambda e: e['won'],
    -                   conditional_on=lambda e: not e['switched'],
    -                   verbose=True,
    -                   n=RUNS)
    -print('Win {}% of the time when not switching'.format(int(r * 100)))
    -
    -# Win 66% of the time when switching
    -# Win 34% of the time when not switching
    -
    -
    -
    -
    -

    Example: More complex coin/dice interactions#

    -
    -

    Imagine that I flip a coin. If heads, I take a random die out of my -blue bag. If tails, I take a random die out of my red bag. The blue -bag contains only 6-sided dice. The red bag contains a 4-sided die, a -6-sided die, a 10-sided die, and a 20-sided die. I then roll the -random die I took. What is the chance that I roll a 6?

    -
    -
    import squigglepy as sq
    -from squigglepy.numbers import K, M, B, T
    -from squigglepy import bayes
    -
    -def define_event():
    -    if sq.flip_coin() == 'heads': # Blue bag
    -        return sq.roll_die(6)
    -    else: # Red bag
    -        return sq.discrete([4, 6, 10, 20]) >> sq.roll_die
    -
    -
    -bayes.bayesnet(define_event,
    -               find=lambda e: e == 6,
    -               verbose=True,
    -               n=100*K)
    -# This run for me returned 0.12306 which is pretty close to the correct answer of 0.12292
    -
    -
    -
    -
    -
    -

    Kelly betting#

    -

    You can use probability generated, combine with a bankroll to determine -bet sizing using Kelly -criterion.

    -

    For example, if you want to Kelly bet and you’ve…

    -
      -
    • determined that your price (your probability of the event in question -happening / the market in question resolving in your favor) is $0.70 -(70%)

    • -
    • see that the market is pricing at $0.65

    • -
    • you have a bankroll of $1000 that you are willing to bet

    • -
    -

    You should bet as follows:

    -
    import squigglepy as sq
    -kelly_data = sq.kelly(my_price=0.70, market_price=0.65, bankroll=1000)
    -kelly_data['kelly']  # What fraction of my bankroll should I bet on this?
    -# 0.143
    -kelly_data['target']  # How much money should be invested in this?
    -# 142.86
    -kelly_data['expected_roi']  # What is the expected ROI of this bet?
    -# 0.077
    -
    -
    -
    -
    -

    More examples#

    -

    You can see more examples of squigglepy in action -here.

    -

    Use black . for formatting.

    -

    Run -ruff check . && pytest && pip3 install . && python3 tests/integration.py

    -
    -
    - - -
    - - - - - - - -
    - - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - - - - \ No newline at end of file