diff --git a/.travis.yml b/.travis.yml index 0901f493..6bde92ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,18 @@ language: python python: - - "3.7-dev" + - "2.7" env: - COVERAGE="no" matrix: include: - python: 3.6 + env: COVERAGE="no" + - python: 3.7 env: COVERAGE="yes" - + - python: 3.8 + env: COVERAGE="no" before_install: - pip install --upgrade pip setuptools diff --git a/PyDSTool/PyCont/TestFunc.py b/PyDSTool/PyCont/TestFunc.py index 15d72b1c..8851a2e7 100644 --- a/PyDSTool/PyCont/TestFunc.py +++ b/PyDSTool/PyCont/TestFunc.py @@ -377,7 +377,7 @@ def __init__(self, dims, F, C, save=False, numpoints=None): if self.data is None: self.data = args() n = len(self.F.coords) - self.data.P = zeros((n*(n-1)//2, n*(n-1)//2), float) + self.data.P = zeros((n*int((n-1)/2), n*int((n-1)/2)), float) def bialtprod(self, A, B): n = A.shape[0] @@ -385,28 +385,30 @@ def bialtprod(self, A, B): for q in range(p): for r in range(1,n): for s in range(r): - self.data.P[p*(p-1)//2 + q][r*(r-1)//2 + s] = 0.5*(A[p][r]*B[q][s] - A[p][s]*B[q][r] + \ - B[p][r]*A[q][s] - B[p][s]*A[q][r]) + self.data.P[int(p*(p-1)/2 + q)][int(r*(r-1)/2 + s)] = \ + 0.5*(A[p][r]*B[q][s] - A[p][s]*B[q][r] + \ + B[p][r]*A[q][s] - B[p][s]*A[q][r]) return self.data.P def bialtprodeye(self, A): n = A.shape[0] - for p in range(1,n): + for p in range(1, n): for q in range(p): - for r in range(1,n): + for r in range(1, n): for s in range(r): if r == q: - self.data.P[p*(p-1)//2 + q][r*(r-1)//2 + s] = -1*A[p][s] + newval = -1*A[p][s] elif r != p and s == q: - self.data.P[p*(p-1)//2 + q][r*(r-1)//2 + s] = A[p][r] + newval = A[p][r] elif r == p and s == q: - self.data.P[p*(p-1)//2 + q][r*(r-1)//2 + s] = A[p][p] + A[q][q] + newval = A[p][p] + A[q][q] elif r == p and s != q: - self.data.P[p*(p-1)//2 + q][r*(r-1)//2 + s] = A[q][s] + newval = A[q][s] elif s == p: - self.data.P[p*(p-1)//2 + q][r*(r-1)//2 + s] = -1*A[q][r] + newval = -1*A[q][r] else: - self.data.P[p*(p-1)//2 + q][r*(r-1)//2 + s] = 0 + newval = 0 + self.data.P[int(p*(p-1)/2 + q)][int(r*(r-1)/2 + s)] = newval return self.data.P class AddTestFunction(Function): diff --git a/PyDSTool/Toolbox/phaseplane.py b/PyDSTool/Toolbox/phaseplane.py index fde3af0e..0849efa6 100755 --- a/PyDSTool/Toolbox/phaseplane.py +++ b/PyDSTool/Toolbox/phaseplane.py @@ -1334,9 +1334,8 @@ def find_fixedpoints(gen, subdomain=None, n=5, maxsearch=1000, eps=1e-8, x0_coords[ix,:] = linspace(xdom[0], xdom[1], n) ix += 1 # NOTE: def Rhs(self, t, xdict, pdict) and Jacobian signature - # has same form, so need to use a wrapper function to convert order + # have same form, so need to use a wrapper function to convert order # of arguments to suit solver. - # Rhs_wrap = make_RHS_wrap(gen, xdict, x0_names) if gen.haveJacobian(): fprime = make_Jac_wrap(gen, xdict, x0_names) @@ -1350,6 +1349,7 @@ def Jac_wrap(x, t, pdict): except (OverflowError, ValueError): # penalty return array([[1e4]*D]*D) + fprime = Jac_wrap else: fprime = None @@ -1360,7 +1360,8 @@ def Jac_wrap(x, t, pdict): d_posns = base_n_counter(n,D) xtol = eps/10. def array_to_point(a): - return Point(dict(zip(x0_names,a))) + return Point(dict(zip(x0_names, a))) + for dummy_ix in range(n**D): x0 = array([x0_coords[i][d_posns[i]] for i in range(D)]) # TEST @@ -4050,7 +4051,8 @@ def plot_PP_fps(fps, coords=None, do_evecs=False, markersize=10): style = 'ko' plt.plot(fp.point[x], fp.point[y], style, markersize=markersize, mew=2) -def plot_PP_vf(gen, xname, yname, N=20, subdomain=None, scale_exp=0): +def plot_PP_vf(gen, xname, yname, N=20, subdomain=None, scale_exp=0, + **quiverplot_dict): """Draw 2D vector field in (xname, yname) coordinates of given Generator, sampling on a uniform grid of n by n points. @@ -4065,6 +4067,8 @@ def plot_PP_vf(gen, xname, yname, N=20, subdomain=None, scale_exp=0): values of scale magnify the arrow sizes. For stiff vector fields, values from -3 to 3 may be necessary to resolve arrows in certain regions. + Optional quiverplot_dict to send plotting options to the quiver function. + Requires matplotlib 0.99 or later """ assert N > 1 @@ -4095,13 +4099,9 @@ def plot_PP_vf(gen, xname, yname, N=20, subdomain=None, scale_exp=0): X, Y = np.meshgrid(xs, ys) dxs, dys = np.meshgrid(xs, ys) -## dx_big = 0 -## dy_big = 0 dz_big = 0 - vec_dict = {} +## vec_dict = {} -# dxs = array((n,), float) -# dys = array((n,), float) for xi, x in enumerate(xs): for yi, y in enumerate(ys): xdict.update({xname: x, yname: y}) @@ -4110,19 +4110,17 @@ def plot_PP_vf(gen, xname, yname, N=20, subdomain=None, scale_exp=0): dxs[yi,xi] = dx dys[yi,xi] = dy dz = np.linalg.norm((dx,dy)) -## vec_dict[ (x,y) ] = (dx, dy, dz) -## if dx > dx_big: -## dx_big = dx -## if dy > dy_big: -## dy_big = dy if dz > dz_big: dz_big = dz plt.quiver(X, Y, dxs, dys, angles='xy', pivot='middle', units='inches', - scale=dz_big*max(h,w)/(10*exp(2*scale_exp)), lw=0.01/exp(scale_exp-1), + scale=dz_big*max(h,w)/(10*exp(2*scale_exp)), + lw=0.01/exp(scale_exp-1), headwidth=max(2,1.5/(exp(scale_exp-1))), #headlength=2*max(2,1.5/(exp(scale_exp-1))), - width=0.001*max(h,w), minshaft=2, minlength=0.001) + width=0.001*max(h,w), minshaft=2, minlength=0.001, + **quiverplot_dict + ) ## # Use 95% of interval size ## longest_x = w*0.95/(n-1) @@ -4167,10 +4165,8 @@ def get_PP(gen, pt, vars, doms=None, doplot=True, doms = gen.xdomain else: doms = gen._FScompatibleNames(doms) - sub_dom[xFS] = doms[xFS] - sub_dom[yFS] = doms[yFS] - x_dom = doms[xFS] - y_dom = doms[yFS] + sub_dom[xFS] = x_dom = doms[xFS] + sub_dom[yFS] = y_dom = doms[yFS] x_interval = Interval(xFS, float, x_dom, abseps=0) y_interval = Interval(yFS, float, y_dom, abseps=0) fps = find_fixedpoints(gen, n=6, subdomain=sub_dom, @@ -4178,12 +4174,11 @@ def get_PP(gen, pt, vars, doms=None, doplot=True, f = figure(1) nulls_x, nulls_y, handles = find_nullclines(gen, xFS, yFS, - x_dom=x_dom, y_dom=y_dom, - fixed_vars=ptFS, n=3, t=t, + subdomain=sub_dom, fps=fps, + n=3, t=t, max_step={xFS: 0.1, yFS: 1}, - max_num_points=10000, fps=fps, - doplot=doplot, plot_style=null_style, - newfig=False) + max_num_points=10000 + ) if doplot: tol = 0.01 xwidth = abs(x_dom[1]-x_dom[0]) diff --git a/examples/neuro_coupled_example.py b/examples/neuro_coupled_example.py index 1456c94f..ec4ad014 100644 --- a/examples/neuro_coupled_example.py +++ b/examples/neuro_coupled_example.py @@ -87,7 +87,7 @@ 'NMDA.p': 0.1, 'KCa.c': 0.1} -print "Computing trajectory using verbosity level %d..." % verboselevel +print("Computing trajectory using verbosity level %d..." % verboselevel) cell.compute(trajname='test', tdata=[0, 100], ics=ic_args, diff --git a/setup.py b/setup.py index 3a895c6a..c307e6a8 100644 --- a/setup.py +++ b/setup.py @@ -127,6 +127,7 @@ def get_datafiles(): "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX :: BSD :: FreeBSD",