Commit d609fa59 authored by ultimanet's avatar ultimanet
Browse files

Implemented paradict

parent 77bfafd4
# This Makefile implements common tasks needed by developers
# A list of implemented rules can be obtained by the command "make help"
.DEFAULT_GOAL=build
.PHONY .SILENT : help
help :
echo
echo " Implemented targets:"
echo
echo " build build pypmc for python2 and python3"
echo " buildX build pypmc for pythonX only where X is one of {2,3}"
echo " build-sdist build pypmc from the dist directory (python 2 and 3)"
echo " build-sdistX build pypmc from the dist directory (pythonX, X in {2,3})"
echo " check use nosetests to test pypmc with python 2.7 and 3"
echo " checkX use nosetests to test pypmc with python 2.7 or 3,"
echo " where X is one of {2,3}"
echo " check-fast use nosetests to run only quick tests of pypmc"
echo " using nosetests-2.7 and nosetests3"
echo " check-sdist use nosetests-2.7 and nosetests3 to test the distribution"
echo " generated by 'make sdist'"
echo " check-sdistX use nosetests-2.7 or nosetests3 to test the distribution"
echo " generated by 'make sdist', where X is one of {2,3}"
echo " clean delete compiled and temporary files"
echo " coverage produce and show a code coverage report"
echo " Note: Cython modules cannot be analyzed"
echo " distcheck runs 'check', check-sdist', 'run-examples' and"
echo " opens a browser with the built documentation"
echo " doc build the html documentation using sphinx"
echo " doc-pdf build the pdf documentation using sphinx"
echo " help show this message"
echo " run-examples run all examples using python 2 and 3"
echo " sdist make a source distribution"
echo " show-todos show todo marks in the source code"
echo
.PHONY : clean
clean:
#remove build doc
rm -rf ./doc/_build
#remove .pyc files created by python 2.7
rm -f ./*.pyc
find -P . -name '*.pyc' -delete
#remove .pyc files crated by python 3
rm -rf ./__pycache__
find -P . -name __pycache__ -delete
#remove build folder in root directory
rm -rf ./build
#remove cythonized C source and object files
find -P . -name '*.c' -delete
#remove variational binaries only if command line argument specified
find -P . -name '*.so' -delete
#remove backup files
find -P . -name '*~' -delete
#remove files created by coverage
rm -f .coverage
rm -rf coverage
# remove egg info
rm -rf pypmc.egg-info
# remove downloaded seutptools
rm -f setuptools-3.3.zip
# remove dist/
rm -rf dist
.PHONY : build
build : build2
.PHONY : build2
build2 :
python2 setup.py build_ext --inplace
.PHONY :
check : check2
.PHONY : check2
check2 : build2
@ # run tests
nosetests-2.7 --processes=-1 --process-timeout=60
# run tests in parallel
mpirun -n 2 nosetests-2.7
.PHONY : check-fast
check-fast : build
nosetests-2.7 -a '!slow' --processes=-1 --process-timeout=60
nosetests3 -a '!slow' --processes=-1 --process-timeout=60
.PHONY : .build-system-default
.build-system-default :
python setup.py build_ext --inplace
.PHONY : doc
doc : .build-system-default
cd doc && make html
.PHONY : doc-pdf
doc-pdf : .build-system-default
cd doc; make latexpdf
.PHONY : run-examples
run-examples : build
cd examples ; \
for file in $$(ls) ; do \
echo running $${file} with python2 && \
python2 $${file} && \
echo running $${file} with python3 && \
python3 $${file} && \
\
# execute with mpirun if mpi4py appears in the file \
if grep -Fq 'mpi4py' $${file} ; then \
echo "$${file}" is mpi parallelized && \
echo running $${file} in parallel with python2 && \
mpirun -n 2 python2 $${file} && \
echo running $${file} in parallel with python3 && \
mpirun -n 2 python3 $${file} ; \
fi \
; \
done
.PHONY : sdist
sdist :
python setup.py sdist
.PHONY : build-sdist
build-sdist : build-sdist2 build-sdist3
./dist/pypmc*/NUL : sdist
cd dist && tar xaf *.tar.gz && cd *
.PHONY : build-sdist2
build-sdist2 : ./dist/pypmc*/NUL
cd dist/pypmc* && python2 setup.py build
.PHONY : build-sdist3
build-sdist3 : ./dist/pypmc*/NUL
cd dist/pypmc* && python3 setup.py build
.PHONY : check-sdist
check-sdist : check-sdist2 check-sdist3
.PHONY : check-sdist2
check-sdist2 : build-sdist2
cd dist/*/build/lib*2.7 && \
nosetests-2.7 --processes=-1 --process-timeout=60 && \
mpirun -n 2 nosetests-2.7
.PHONY : check-sdist3
check-sdist3 : build-sdist3
cd dist/*/build/lib*3.* && \
nosetests3 --processes=-1 --process-timeout=60 && \
mpirun -n 2 nosetests3
.PHONY : distcheck
distcheck : check check-sdist doc
@ # execute "run-examples" after all other recipes makes are done
make run-examples
xdg-open link_to_documentation
.PHONY : show-todos
grep_cmd = ack-grep -i --no-html --no-cc [^"au""sphinx.ext."]todo
show-todos :
@ # suppress errors here
@ # note that no todo found is considered as error
$(grep_cmd) doc ; \
$(grep_cmd) pypmc ; \
$(grep_cmd) examples ; echo \
.PHONY : coverage
coverage : .build-system-default
rm -rf coverage
nosetests --with-coverage --cover-package=nifty --cover-html --cover-html-dir=coverage
xdg-open coverage/index.html
# -*- coding: utf-8 -*-
import numpy as np
def MIN():
return np.min
def MAX():
return np.max
def SUM():
return np.sum
class _COMM_WORLD():
def __init__(self):
self.rank = 0
self.size = 1
def Get_rank(self):
return self.rank
def Get_size(self):
return self.size
def _scattergather_helper(self, sendbuf, recvbuf=None):
if recvbuf != None:
recvbuf[:] = sendbuf
return recvbuf
else:
recvbuf = np.copy(sendbuf)
return recvbuf
def bcast(self, sendbuf, *args, **kwargs):
return sendbuf
def Bcast(self, sendbuf, *args, **kwargs):
return sendbuf
def scatter(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def Scatter(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def Scatterv(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def gather(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def Gather(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def Gatherv(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def allgather(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def Allgather(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def Allgatherv(self, *args, **kwargs):
return self._scattergather_helper(*args, **kwargs)
def Allreduce(self, sendbuf, recvbuf, op, **kwargs):
recvbuf[None] = op(sendbuf)
return recvbuf
def allreduce(self, sendbuf, recvbuf, op, **kwargs):
recvbuf[None] = op(sendbuf)
return recvbuf
def _unwrapper(self, x):
if isinstance(x, list):
return x[0]
else:
return x
class _datatype():
def __init__(self, name):
self.name = str(name)
SHORT = _datatype('MPI_SHORT')
UNSIGNED_SHORT = _datatype("MPI_UNSIGNED_SHORT")
UNSIGNED_INT = _datatype("MPI_UNSIGNED_INT")
INT = _datatype("MPI_INT")
LONG = _datatype("MPI_LONG")
UNSIGNED_LONG = _datatype("MPI_UNSIGNED_LONG")
LONG_LONG = _datatype("MPI_LONG_LONG")
UNSIGNED_LONG_LONG = _datatype("MPI_UNSIGNED_LONG_LONG")
FLOAT = _datatype("MPI_FLOAT")
DOUBLE = _datatype("MPI_DOUBLE")
LONG_DOUBLE = _datatype("MPI_LONG_DOUBLE")
COMPLEX = _datatype("MPI_COMPLEX")
DOUBLE_COMPLEX = _datatype("MPI_DOUBLE_COMPLEX")
COMM_WORLD = _COMM_WORLD()
\ No newline at end of file
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 2 21:29:30 2015
@author: steininger
"""
import numpy as np
from nifty import *
#from nifty import about
def paradict_getter(space_instance):
paradict_dictionary = {
str(space().__class__) : _space_paradict,
str(point_space((2)).__class__) : _point_space_paradict,
str(rg_space((2)).__class__) : _rg_space_paradict,
str(nested_space([point_space(2), point_space(2)]).__class__) : _nested_space_paradict,
str(lm_space(1).__class__) : _lm_space_paradict,
str(gl_space(2).__class__) : _gl_space_paradict,
str(hp_space(1).__class__) : _hp_space_paradict,
}
return paradict_dictionary[str(space_instance.__class__)]()
class _space_paradict(object):
def __init__(self, **kwargs):
self.parameters = {}
for key in kwargs:
self[key] = kwargs[key]
def __setitem__(self, key, arg):
self.parameters.__setitem__(key, arg)
def __getitem__(self, key):
return self.parameters.__getitem__(key)
class _point_space_paradict(_space_paradict):
def __setitem__(self, key, arg):
if key is not 'num':
raise ValueError(about._errors.cstring("ERROR: Unsupported point_space parameter"))
temp = np.array(arg, dtype=int).flatten()[0]
self.parameters.__setitem__(key, temp)
class _rg_space_paradict(_space_paradict):
def __init__(self, num, hermitian=False, zerocenter=False):
self.ndim = len(np.array(num).flatten())
_space_paradict.__init__(self, num=num, hermitian=hermitian, zerocenter=zerocenter)
def __setitem__(self, key, arg):
if key not in ['num', 'hermitian', 'zerocenter']:
raise ValueError(about._errors.cstring("ERROR: Unsupported rg_space parameter"))
if key == 'num':
temp = list(np.array(arg, dtype=int).flatten())
if len(temp) != self.ndim:
raise ValueError(about._errors.cstring("ERROR: Number of dimensions does not match the init value."))
elif key == 'hermitian':
temp = int(arg)
elif key == 'zerocenter':
temp = np.empty(self.ndim, dtype=bool)
temp[:] = arg
temp = list(temp)
#if len(temp) != self.ndim:
# raise ValueError(about._errors.cstring("ERROR: Number of dimensions does not match the init value."))
self.parameters.__setitem__(key, temp)
class _nested_space_paradict(_space_paradict):
def __init__(self, ndim):
self.ndim = np.int(ndim)
_space_paradict.__init__(self)
def __setitem__(self, key, arg):
if not isinstance(key, int):
raise ValueError(about._errors.cstring("ERROR: Unsupported point_space parameter"))
if key >= self.ndim or key < 0:
raise ValueError(about._errors.cstring("ERROR: Nestindex out of bounds"))
temp = list(np.array(arg, dtype=int).flatten())
self.parameters.__setitem__(key, temp)
class _lm_space_paradict(_space_paradict):
def __init__(self, lmax, mmax=None):
_space_paradict.__init__(self, lmax=lmax)
if mmax == None:
mmax = -1
self['mmax'] = mmax
def __setitem__(self, key, arg):
if key not in ['lmax', 'mmax']:
raise ValueError(about._errors.cstring("ERROR: Unsupported rg_space parameter"))
if key == 'lmax':
temp = int(arg)
if(temp<1):
raise ValueError(about._errors.cstring("ERROR: lmax: nonpositive number."))
if (temp%2 == 0) and (temp > 2): ## exception lmax == 2 (nside == 1)
about.warnings.cprint("WARNING: unrecommended parameter (lmax <> 2*n+1).")
try:
if temp < self['mmax']:
about.warnings.cprint("WARNING: mmax parameter set to lmax.")
self['mmax'] = temp
if (temp != self['mmax']):
about.warnings.cprint("WARNING: unrecommended parameter set (mmax <> lmax).")
except:
pass
elif key == 'mmax':
temp = int(arg)
if (temp < 1) or(temp > self['lmax']):
about.warnings.cprint("WARNING: mmax parameter set to default.")
temp = self['lmax']
if(temp != self['lmax']):
about.warnings.cprint("WARNING: unrecommended parameter set (mmax <> lmax).")
self.parameters.__setitem__(key, temp)
class _gl_space_paradict(_space_paradict):
def __init__(self, nlat, nlon=None):
_space_paradict.__init__(self, nlat=nlat)
if nlon == None:
nlon = -1
self['nlon'] = nlon
def __setitem__(self, key, arg):
if key not in ['nlat', 'nlon']:
raise ValueError(about._errors.cstring("ERROR: Unsupported rg_space parameter"))
if key == 'nlat':
temp = int(arg)
if(temp<1):
raise ValueError(about._errors.cstring("ERROR: nlat: nonpositive number."))
if (temp%2 != 0):
raise ValueError(about._errors.cstring("ERROR: invalid parameter (nlat <> 2n)."))
try:
if temp < self['mmax']:
about.warnings.cprint("WARNING: mmax parameter set to lmax.")
self['mmax'] = temp
if (temp != self['mmax']):
about.warnings.cprint("WARNING: unrecommended parameter set (mmax <> lmax).")
except:
pass
elif key == 'nlon':
temp = int(arg)
if (temp < 1):
about.warnings.cprint("WARNING: nlon parameter set to default.")
temp = 2*self['nlat']-1
if(temp != 2*self['nlat']-1):
about.warnings.cprint("WARNING: unrecommended parameter set (nlon <> 2*nlat-1).")
self.parameters.__setitem__(key, temp)
class _hp_space_paradict(_space_paradict):
def __init__(self, nside):
_space_paradict.__init__(self, nside=nside)
def __setitem__(self, key, arg):
if key not in ['nside']:
raise ValueError(about._errors.cstring("ERROR: Unsupported hp_space parameter"))
temp = int(arg)
#if(not hp.isnsideok(nside)):
if ((temp & (temp-1)) != 0) or (temp < 2):
raise ValueError(about._errors.cstring("ERROR: invalid parameter ( nside <> 2**n )."))
self.parameters.__setitem__(key, temp)
##################
class _space(object):
def __init__(self):
self.paradict = _space_paradict(default=123)
#self.para = [1,2,3]
@property
def para(self):
return self.paradict['default']
#return self.distributed_val
@para.setter
def para(self, x):
self.paradict['default'] = x
##################
##################
class _point_space(object):
def __init__(self):
self.paradict = _point_space_paradict()
self.para = [10]
@property
def para(self):
temp = np.array([self.paradict['num']], dtype=int)
return temp
#return self.distributed_val
@para.setter
def para(self, x):
self.paradict['num'] = x
##################
##################
class _rg_space(object):
def __init__(self):
self.paradict = _rg_space_paradict(num=[10,100,200])
@property
def para(self):
temp = np.array(self.paradict['num'] + \
[self.paradict['hermitian']] + \
self.paradict['zerocenter'], dtype=int)
return temp
@para.setter
def para(self, x):
self.paradict['num'] = x[:(np.size(x)-1)//2]
self.paradict['zerocenter'] = x[(np.size(x)+1)//2:]
self.paradict['hermitian'] = x[(np.size(x)-1)//2]
##################
##################
class _nested_space(object):
def __init__(self):
self.paradict = _nested_space_paradict(ndim=10)
for i in range(10):
self.paradict[i] = [1+i, 2+i, 3+i]
@property
def para(self):
temp = []
for i in range(self.paradict.ndim):
temp = np.append(temp, self.paradict[i])
return temp
@para.setter
def para(self, x):
dict_iter = 0
x_iter = 0
while dict_iter < self.paradict.ndim:
temp = x[x_iter:x_iter+len(self.paradict[dict_iter])]
self.paradict[dict_iter] = temp
x_iter = x_iter+len(self.paradict[dict_iter])
dict_iter += 1
##################
##################
class _lm_space(object):
def __init__(self):
self.paradict = _lm_space_paradict(lmax = 10)
@property
def para(self):
temp = np.array([self.paradict['lmax'],
self.paradict['mmax']], dtype=int)
return temp
@para.setter
def para(self, x):
self.paradict['lmax'] = x[0]
self.paradict['mmax'] = x[1]
##################
##################
class _gl_space(object):
def __init__(self):
self.paradict = _gl_space_paradict(nlat = 10)
@property
def para(self):
temp = np.array([self.paradict['nlat'],
self.paradict['nlon']], dtype=int)
return temp
@para.setter
def para(self, x):
self.paradict['nlat'] = x[0]
self.paradict['nlon'] = x[1]
##################
##################
class _hp_space(object):
def __init__(self):
self.paradict = _hp_space_paradict(nside=16)
@property
def para(self):
temp = np.array([self.paradict['nside']], dtype=int)
return temp
@para.setter
def para(self, x):
self.paradict['nside'] = x[0]
##################
##################
if __name__ == '__main__':
myspace = _space()
print myspace.para
print myspace.paradict.parameters.items()
myspace.para = [4,5,6]
print myspace.para
print myspace.paradict.parameters.items()
myspace.paradict.parameters['default'] = [1,4,7]
print myspace.para
print myspace.paradict.parameters.items()
\ No newline at end of file