Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions pymodelfit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,9 @@
('' if _bugfix is None else ('.'+str(_bugfix))) + \
('' if _release else 'dev')

from core import *
from builtins import * #do this to register all the builtins
try:
from core import *
from builtins import * #do this to register all the builtins
except:
from .core import *
from .builtins import * #do this to register all the builtins
16 changes: 12 additions & 4 deletions pymodelfit/builtins.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@

import numpy as np
#from core import * #includes pi
from core import ParametricModel,FunctionModel,FunctionModel1DAuto, \
DatacentricModel1DAuto,FunctionModel2DScalarAuto,register_model
try:
from core import ParametricModel,FunctionModel,FunctionModel1DAuto, \
DatacentricModel1DAuto,FunctionModel2DScalarAuto,register_model
except:
from .core import ParametricModel,FunctionModel,FunctionModel1DAuto, \
DatacentricModel1DAuto,FunctionModel2DScalarAuto,register_model
from math import e,pi
from abc import abstractmethod

Expand Down Expand Up @@ -1630,15 +1634,19 @@ def plot3d(self,data=np.array([(-1,1),(-1,1),(-1,1)]),n=10,

M.mesh(x,y,self([x,y]),**kwargs)
if showdata:
from operator import isMappingType
try:
from operator import isMappingType
except:
def isMappingType(x):
return isinstance(x, collections.Mapping)
if isMappingType(showdata):
M.points3d(*data,**showdata)
else:
M.points3d(*data)

#register everything in this module
from inspect import isclass
for o in locals().values():
for o in list(locals().values()):
if isclass(o) and not o.__name__.startswith('_') and issubclass(o,ParametricModel):
if 'FunctionModel' not in o.__name__ and 'CompositeModel' not in o.__name__:
register_model(o)
Expand Down
100 changes: 82 additions & 18 deletions pymodelfit/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,12 @@
"""

from __future__ import division,with_statement
from collections import Sequence
from math import pi
import numpy as np
import sys
import collections

try:
#requires Python 2.6
from abc import ABCMeta
Expand All @@ -36,6 +40,26 @@
abstractproperty = property
ABCMeta = type

try:
dict.iteritems
except AttributeError:
# Python 3
basestring = str

def itervalues(d):
return iter(d.values())

def iteritems(d):
return iter(d.items())
else:
# Python 2
def itervalues(d):
return d.itervalues()

def iteritems(d):
return d.iteritems()


class ModelTypeError(Exception):
"""
This exception indicates a problem with the value of the input
Expand Down Expand Up @@ -111,7 +135,8 @@ def _setData(self,val):
else:
ws = np.array(val[2],copy=False)
self._data = (ind,outd,ws)
except TypeError,e:
except TypeError:
e = sys.exc_info()[1]
e.args = ('invalid type for model data',)
raise
data = property(_getData,_setData,doc="""
Expand Down Expand Up @@ -331,7 +356,8 @@ def __call__(cls,*args,**kwargs):
objkwargs=dict([(k,kwargs.pop(k)) for k in kwargs.keys() if k not in cls._pars])
try:
obj = super(AutoParamsMeta,AutoParamsMeta).__call__(cls,**objkwargs) #object __init__ is called here
except TypeError,e:
except TypeError:
e = sys.exc_info()[1]
if len(e.args)>0 and 'object.__new__() takes no parameters' == e.args[0]:
raise TypeError('invalid parameter in model constructor:'+str(objkwargs.keys()))
else:
Expand Down Expand Up @@ -591,7 +617,12 @@ def fitData(self,x=None,y=None,fixedpars='auto',weights=None,savedata=True,
.. seealso:: :meth:`getMCMC`
"""
from scipy import optimize as opt
from operator import isMappingType
try:
from operator import isMappingType
except:
def isMappingType(x):
return isinstance(x, collections.Mapping)

from functools import partial

self._fitchi2 = None #clear saved chi-squared if it exists
Expand Down Expand Up @@ -656,7 +687,11 @@ def fitData(self,x=None,y=None,fixedpars='auto',weights=None,savedata=True,
res = fitter(x,y,fixedpars=fixedpars,weights=weights,**kwargs)

#ensure that res is at least a tuple with parameters in elem 0
from operator import isSequenceType
try:
from operator import isSequenceType
except:
def isSequenceType(obj):
return isinstance(obj, Sequence)
if len(res)==0 or not isSequenceType(res[0]):
res = (res,)

Expand Down Expand Up @@ -1136,7 +1171,11 @@ def getMCMC(self,x,y,priors={},datamodel=None):

"""
import pymc
from operator import isSequenceType
try:
from operator import isSequenceType
except:
def isSequenceType(obj):
return isinstance(obj, Sequence)
from inspect import getargspec
from types import MethodType

Expand Down Expand Up @@ -1572,9 +1611,9 @@ def inv(self,yval,*args,**kwargs):
f = method

if kwargs.pop('abs',False):
g = lambda(x):np.abs(self(x)-yval)
g = lambda x:np.abs(self(x)-yval)
else:
g = lambda(x):self(x)-yval
g = lambda x:self(x)-yval

return f(g,*args,**kwargs)

Expand Down Expand Up @@ -1783,7 +1822,12 @@ def plot(self,lower=None,upper=None,n=100,clf=True,logplot='',data='auto',
`zorder` to 0.

"""
from operator import isMappingType
try:
from operator import isMappingType
except:
def isMappingType(x):
return isinstance(x, collections.Mapping)

from .utils import mpl_context

with mpl_context(clf=clf) as plt:
Expand Down Expand Up @@ -2516,7 +2560,11 @@ def __init__(self,models,extraparams=None,outputcontraction=None,
linear interpolation, this takes the closest value.

"""
from operator import isMappingType
try:
from operator import isMappingType
except:
def isMappingType(x):
return isinstance(x, collections.Mapping)

if len(models)==2 and isMappingType(models[1]):
modtype = get_model_class(models[0])
Expand Down Expand Up @@ -3208,7 +3256,11 @@ def plot(self,datarange=None,nx=100,ny=100,clf=True,cb=True,data='auto',
:except ValueError: if data is not present and `datarange` is None

"""
from operator import isMappingType
try:
from operator import isMappingType
except:
def isMappingType(x):
return isinstance(x, collections.Mapping)
from .utils import mpl_context

with mpl_context(clf=clf) as plt:
Expand Down Expand Up @@ -3284,7 +3336,11 @@ def plot3d(self,datarange=None,nx=100,ny=100,clf=True,cb=True,data='auto',**kwar
See :meth:`plot` for meaning of the arguments
"""
from enthought.mayavi import mlab as M
from operator import isMappingType
try:
from operator import isMappingType
except:
def isMappingType(x):
return isinstance(x, collections.Mapping)

if data == 'auto':
if self.data:
Expand Down Expand Up @@ -3778,7 +3834,9 @@ def get_model_instance(model,baseclass=None,nvarparams=1,**kwargs):
return cls(*args,**kwargs)


def list_models(include=None,exclude=None,baseclass=None,showabstract=False):
def list_models(
include=None, exclude=None, baseclass=None, showabstract=False
):
"""
Lists the registered model objects in the package, possibly subject to
constraints.
Expand Down Expand Up @@ -3808,17 +3866,23 @@ def list_models(include=None,exclude=None,baseclass=None,showabstract=False):
See the :func:`register_model` docstring for examples.

"""
from operator import isSequenceType
from inspect import isclass,isabstract
try:
from operator import isSequenceType
except:
def isSequenceType(obj):
return isinstance(obj, Sequence)
from inspect import isclass, isabstract

res = [k for k,c in __model_registry.iteritems()
if (baseclass is None or issubclass(c,baseclass))
if (showabstract or not isabstract(c))]
res = [
k for k, c in iteritems(__model_registry)
if (baseclass is None or issubclass(c, baseclass))
if (showabstract or not isabstract(c))
]

if include is not None:
if exclude is not None:
raise TypeError("can't specify both included models and excluded models")
if isinstance(include,basestring):
if isinstance(include, basestring):
include = include.split(',')
elif not isSequenceType(include):
include = [include]
Expand Down
23 changes: 18 additions & 5 deletions pymodelfit/fitgui.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
#TODO: change single select to click-to-do-action

from __future__ import division,with_statement
from collections import Sequence
import numpy as np
import sys
import collections

try: #this is the old-style import - below is for traits 4.x
from enthought.traits.api import HasTraits,Instance,Int,Float,Bool,Button, \
Event,Property,on_trait_change,Array,List, \
Expand Down Expand Up @@ -175,8 +179,17 @@ def _updatetraitparams_fired(self):
setattr(self,p,getattr(m,p))
self.paramchange = True

def _fitdata_fired(self,new):
from operator import isSequenceType,isMappingType
def _fitdata_fired(self, new):
try:
from operator import isSequenceType
except:
def isSequenceType(obj):
return isinstance(obj, Sequence)
try:
from operator import isMappingType
except:
def isMappingType(x):
return isinstance(x, collections.Mapping)

if self.model is not None:
if isSequenceType(new) and len(new) == 2:
Expand Down Expand Up @@ -208,8 +221,8 @@ def _fitdata_fired(self,new):
self.model.fitData(**kw)
self.updatetraitparams = True
self.lastfitfailure = None
except Exception,e:
self.lastfitfailure = e
except Exception:
self.lastfitfailure = sys.exc_info()[1]

def _get_modelname(self):
if self.model is None:
Expand Down Expand Up @@ -1060,4 +1073,4 @@ def fit_data(*args,**kwargs):
if res:
return fg.getModelObject()
else:
return None
return None
23 changes: 19 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,23 @@
from __future__ import division,with_statement

from glob import glob
from distribute_setup import use_setuptools
use_setuptools()
from setuptools import setup,find_packages
#from distribute_setup import use_setuptools
#use_setuptools()
#from setuptools import setup,find_packages
try:
import pkg_resources
try:
pkg_resources.require("setuptools>=0.6c5")
except pkg_resources.VersionConflict:
from ez_setup import use_setuptools
use_setuptools(version="0.6c5")
from setuptools import setup, Command,find_packages
_have_setuptools = True
except ImportError:
# no setuptools installed
from distutils.core import setup, Command,find_packages
_have_setuptools = False

from distutils.command.build_py import build_py as du_build_py

from pymodelfit import version as versionstr
Expand Down Expand Up @@ -53,5 +67,6 @@ def finalize_options(self):
license = 'Apache License 2.0',
url='http:http://packages.python.org/PyModelFit/',
long_description=descrip,
cmdclass = cmdclassd
cmdclass = cmdclassd,
use_2to3=True
)
Loading