Source code for bumps.dream.util
"""
Miscellaneous utilities.
"""
__all__ = ["draw", "console"]
import numpy as np
import numpy.random as rng
[docs]
def draw(k, n):
"""
Select k things from a pool of n without replacement.
"""
# At k == n/4, an extra 0.15*k draws are needed to get k unique draws
if k > n/4:
result = rng.permutation(n)[:k]
else:
s = set()
result = np.empty(k, 'i')
for i in range(k):
p = rng.randint(n)
while p in s:
p = rng.randint(n)
s.add(p)
result[i] = p
return result
def _check_uniform_draw():
"""
Draws from history should
"""
import pylab
k, n = 50, 400
counts = np.zeros(n*k)
idx = np.arange(k)
for _ in range(100000):
t = draw(k, n)
counts[k*t+idx] += 1
pylab.subplot(211)
pylab.pcolormesh(np.reshape(counts, (n, k)))
pylab.colorbar()
pylab.title('drawn number vs. draw position')
pylab.subplot(212)
pylab.hist(counts)
pylab.title('number of draws per (number,position) bin')
pylab.show()
[docs]
def console():
"""
Start the python console with the local variables available.
console() should be the last thing in the file, after sampling and
showing the default plots.
"""
import os
import sys
# Hack for eclipse console: can't actually run ipython in the eclipse
# console and get it to plot, so instead guess whether we are in a
# console by checking if we are attached to a proper tty through stdin.
# For eclipse, just show the plots.
try:
tty = os.isatty(sys.stdin.fileno())
except Exception:
tty = False
if tty:
# Display outstanding plots and turn interactive on
from matplotlib import interactive
from matplotlib._pylab_helpers import Gcf
for fig in Gcf.get_all_fig_managers():
try: # CRUFT
fig.show()
except AttributeError:
fig.frame.Show()
interactive(True)
# Start an ipython shell with the caller's local variables
import IPython
symbols = sys._getframe(1).f_locals
ip = IPython.Shell.IPShell(user_ns=symbols)
ip.mainloop()
else:
# Not a tty; try doing show() anyway
import pylab
pylab.show()