Skip to content

Instantly share code, notes, and snippets.

@tkf
Created June 15, 2010 06:46
Show Gist options
  • Save tkf/438777 to your computer and use it in GitHub Desktop.
Save tkf/438777 to your computer and use it in GitHub Desktop.
typedef struct kaplanyorkemap_{
int step;
double *xt;
double *yt;
double mu;
double lambda;
} KaplanYorkeMap;
int kym_gene_seq(KaplanYorkeMap *self)
{
int st;
for (st = 1; st < self->step; ++st){
self->xt[st] = 1 - self->mu * self->xt[st-1] * self->xt[st-1];
self->yt[st] = self->lambda * self->yt[st-1] + self->xt[st-1];
}
return 0;
}
objs=kaplan_yorke.o
slib=kaplan_yorke.so
all: $(slib)
kaplan_yorke.so: kaplan_yorke.o
gcc -shared -o $@ $<
kaplan_yorke.o: kaplan_yorke.c
gcc -c $< -fPIC -O3 -ftree-vectorizer-verbose=1
clean:
rm $(objs) $(slib)
.PHONY: all clean
import ctypes
import numpy
import pylab
double1d = ctypes.POINTER(ctypes.c_double)
class KaplanYorkeMapStruct(ctypes.Structure):
_fields_ = [
("step", ctypes.c_int),
("xt", double1d),
("yt", double1d),
("mu", ctypes.c_double),
("ld", ctypes.c_double),
]
_kaplan_yorke = numpy.ctypeslib.load_library('kaplan_yorke.so', '.')
_kaplan_yorke.kym_gene_seq.restype = ctypes.c_int
_kaplan_yorke.kym_gene_seq.argtypes = [ctypes.POINTER(KaplanYorkeMapStruct)]
def kym_gene_seq(kyms):
return _kaplan_yorke.kym_gene_seq(ctypes.pointer(kyms))
if __name__ == '__main__':
step = 10**5
xt = numpy.zeros(step, dtype=float)
yt = numpy.zeros(step, dtype=float)
mu = 2
ld = 0.4
xt[0] = 0.1
yt[0] = 0.1
kyms = KaplanYorkeMapStruct(
step = xt.shape[0],
xt = xt.ctypes.data_as(double1d),
yt = yt.ctypes.data_as(double1d),
mu = mu,
ld = ld)
kym_gene_seq(kyms)
pylab.figure(1, figsize=(4,3))
pylab.plot(xt, yt, 'k.', markersize=0.1)
pylab.savefig('kym.png')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment