Skip to content

Commit

Permalink
add showcases
Browse files Browse the repository at this point in the history
  • Loading branch information
cliffckerr committed Jun 25, 2019
1 parent 436c7ec commit e6b8453
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 13 deletions.
30 changes: 19 additions & 11 deletions sciris/sc_odict.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class odict(OD):
bar.rename('cough','chill') # Show rename
print(bar) # Print results
Version: 2018mar29
Version: 2018jun25
'''

def __init__(self, *args, **kwargs):
Expand Down Expand Up @@ -536,34 +536,41 @@ def rename(self, oldkey, newkey):
return None


def sort(self, sortby=None, reverse=False, copy=False):
def sort(self, sortby=None, reverse=False, copy=False, verbose=True):
'''
Create a sorted version of the odict. Sorts by order of sortby, if provided, otherwise alphabetical.
If copy is True, then returns a copy (like sorted()).
Note that you can also use this to do filtering.
Note: very slow, do not use for serious computations!!
Note: slow, do not use for time-limited computations!!
'''
origkeys = self.keys()
if sortby is None: allkeys = sorted(origkeys)
if sortby is None or sortby is 'keys':
allkeys = sorted(origkeys)
else:
if not ut.isiterable(sortby): raise Exception('Please provide a list to determine the sort order.')
if sortby is 'values':
origvals = self.values()
sortby = sorted(range(len(origvals)), key=origvals.__getitem__) # Reset sortby based on https://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python
if not ut.isiterable(sortby):
raise Exception('Please provide a list to determine the sort order.')
if all([isinstance(x, ut._stringtypes) for x in sortby]): # Going to sort by keys
allkeys = sortby # Assume the user knows what s/he is doing
elif all([isinstance(x,bool) for x in sortby]): # Using Boolean values
elif all([isinstance(x,bool) for x in sortby]): # Using Boolean values to filter
allkeys = []
for i,x in enumerate(sortby):
if x: allkeys.append(origkeys[i])
elif all([isinstance(x, ut._numtype) for x in sortby]): # Going to sort by numbers
if not set(sortby)==set(range(len(self))):
errormsg = 'List to sort by "%s" is not compatible with length of odict "%i"' % (sortby, len(self))
raise Exception(errormsg)
else: allkeys = [y for (x,y) in sorted(zip(sortby,origkeys))]
warningmsg = 'Warning: list to sort by "%s" has different length than odict "%i"' % (sortby, len(self))
if verbose: print(warningmsg)
allkeys = [origkeys[ind] for ind in sortby]
print(allkeys)
else:
raise Exception('Cannot figure out how to sort by "%s"' % sortby)
tmpdict = odict()
if reverse: allkeys.reverse() # If requested, reverse order
if reverse:
allkeys.reverse() # If requested, reverse order
if copy:
for key in allkeys: tmpdict[key] = self[key]
return tmpdict
Expand All @@ -572,8 +579,9 @@ def sort(self, sortby=None, reverse=False, copy=False):
for key in allkeys: self.__setitem__(key, tmpdict.pop(key))
return None


def sorted(self, sortby=None, reverse=False):
''' Shortcut for making a copy of the sorted odict '''
''' Shortcut for making a copy of the sorted odict -- see sort() for options '''
return self.sort(sortby=sortby, copy=True, reverse=reverse)


Expand Down
4 changes: 2 additions & 2 deletions sciris/sc_version.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
__all__ = ['__version__', '__versiondate__', '__license__']

__version__ = '0.13.9'
__versiondate__ = '2019-06-03'
__version__ = '0.13.10'
__versiondate__ = '2019-06-25'
__license__ = 'Sciris %s (%s) -- (c) Sciris.org' % (__version__, __versiondate__)
43 changes: 43 additions & 0 deletions tests/showcase.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Imports
import numpy as np
import sciris as sc

# Set parameters and define random wave generator
xmin = 0
xmax = 10
npts = 200
std = 0.1
repeats = 10
noisevals = np.linspace(0,1,21)
x = np.linspace(xmin, xmax, npts)

def randgen(std):
a = np.cos(x)
b = np.random.randn(npts)*std
return a+b

# Start timing
sc.tic()

# Create object in parallel
output = sc.parallelize(randgen, noisevals)

# Save to files
filenames = []
for n,noiseval in enumerate(noisevals):
filename = 'noise%0.1f.obj' % noiseval
sc.saveobj(filename, output[n])
filenames.append(filename)

# Create odict from files
data = sc.odict()
for filename in filenames:
data[filename] = sc.loadobj(filename)

# Create 3D plot
sc.surf3d(data[:])

# Print elapsed time
sc.toc()


63 changes: 63 additions & 0 deletions tests/showcase_vanilla.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Imports
import numpy as np
import time
import multiprocessing as mp
import pickle
import gzip
import matplotlib.pyplot as pl
from mpl_toolkits.mplot3d import Axes3D # analysis:ignore

# Set parameters and define random wave generator
xmin = 0
xmax = 10
npts = 200
std = 0.1
repeats = 10
noisevals = np.linspace(0,1,21)
x = np.linspace(xmin, xmax, npts)

def randgen(std):
a = np.cos(x)
b = np.random.randn(npts)*std
return a+b

# Start timing
start = time.time()

# Create object in parallel
multipool = mp.Pool(processes=mp.cpu_count())
output = multipool.map(randgen, noisevals)
multipool.close()
multipool.join()

# Save to files
filenames = []
for n,noiseval in enumerate(noisevals):
filename = 'noise%0.1f.obj' % noiseval
with gzip.GzipFile(filename, 'wb') as fileobj:
fileobj.write(pickle.dumps(output[n]))
filenames.append(filename)

# Create odict from files
data = {}
for filename in filenames:
with gzip.GzipFile(filename) as fileobj:
filestring = fileobj.read()
data[filename] = pickle.loads(filestring)

# Create 3D plot
data_array = np.array([data[filename] for filename in filenames])
fig = pl.figure()
ax = fig.gca(projection='3d')
ax.view_init(elev=45, azim=30)
ny,nx = np.array(data_array).shape
x = np.arange(nx)
y = np.arange(ny)
X, Y = np.meshgrid(x, y)
settings = {'rstride':1, 'cstride':1, 'linewidth':0, 'antialiased':False, 'cmap':'viridis'}
surf = ax.plot_surface(X, Y, data_array, **settings)
fig.colorbar(surf)

# Print elapsed time
elapsed = time.time() - start
print('Elapsed time: %0.1f s' % elapsed)

0 comments on commit e6b8453

Please sign in to comment.