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
7 changes: 5 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
24 changes: 13 additions & 11 deletions PyDSTool/PyCont/TestFunc.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,36 +377,38 @@ 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]
for p in range(1,n):
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):
Expand Down
45 changes: 20 additions & 25 deletions PyDSTool/Toolbox/phaseplane.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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.

Expand All @@ -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
Expand Down Expand Up @@ -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})
Expand All @@ -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)
Expand Down Expand Up @@ -4167,23 +4165,20 @@ 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,
t=t, eps=1e-8)

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])
Expand Down
2 changes: 1 addition & 1 deletion examples/neuro_coupled_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down