Changeset 8a20be5 in sasmodels
- Timestamp:
- Jul 10, 2014 3:05:08 PM (10 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 8faffcd
- Parents:
- 5378e40
- Files:
-
- 6 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
Kernel-CoreShellCylinder.cpp
r5378e40 r8a20be5 37 37 if (besarg1 == 0.0){be1 = 0.5;} 38 38 else{ 39 if((ax=fabs(besarg1)) < 8.0) 40 { 41 y=besarg1*besarg1; 42 ans1=besarg1*(72362614232.0+y*(-7895059235.0+y*(242396853.1+y*(-2972611.439+y*(15704.48260+y*(-30.16036606)))))); 43 ans2=144725228442.0+y*(2300535178.0+y*(18583304.74+y*(99447.43394+y*(376.9991397+y*1.0)))); 44 ans=ans1/ans2; 45 } 46 else 47 { 48 z=8.0/ax; 49 y=z*z; 50 xx=ax-2.356194491; 51 ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4+y*(0.2457520174e-5+y*(-0.240337019e-6)))); 52 ans2=0.04687499995+y*(-0.2002690873e-3+y*(0.8449199096e-5+y*(-0.88228987e-6+y*0.105787412e-6))); 53 ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); 54 if (besarg1 < 0.0) {ans *= -1;} 55 } 56 be1 = ans/besarg1; 39 bel = NR_BessJ1(besarg1)/besarg1 57 40 } 58 41 if (besarg2 == 0.0){be2 = 0.5;} … … 109 92 110 93 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 -
Kernel-Cylinder.cpp
r5378e40 r8a20be5 1 __kernel void CylinderKernel(__global const float *qx, global const float *qy, __global float *_ptvalue, const floatsub,2 const float rr, const float h, const float scale, const float radius_weight, const floatlength_weight,3 const float theta_weight, const float phi_weight, const floatcyl_theta,4 const floatcyl_phi, const int count, const int size)1 __kernel void CylinderKernel(__global const real *qx, global const real *qy, __global real *_ptvalue, const real sub, 2 const real rr, const real h, const real scale, const real radius_weight, const real length_weight, 3 const real theta_weight, const real phi_weight, const real cyl_theta, 4 const real cyl_phi, const int count, const int size) 5 5 { 6 6 // qq is the q-value for the calculation (1/A) … … 11 11 if(i < count) 12 12 { 13 floatqq = sqrt(qx[i]*qx[i]+qy[i]*qy[i]);13 real qq = sqrt(qx[i]*qx[i]+qy[i]*qy[i]); 14 14 15 floatpi = 4.0*atan(1.0);16 floattheta = cyl_theta*pi/180.0;17 floatphi = cyl_phi*pi/180.0;15 real pi = 4.0*atan(1.0); 16 real theta = cyl_theta*pi/180.0; 17 real phi = cyl_phi*pi/180.0; 18 18 19 floatcyl_x = cos(theta)*cos(phi);20 floatcyl_y = sin(theta);21 floatcos_val = cyl_x*(qx[i]/qq) + cyl_y*(qy[i]/qq);19 real cyl_x = cos(theta)*cos(phi); 20 real cyl_y = sin(theta); 21 real cos_val = cyl_x*(qx[i]/qq) + cyl_y*(qy[i]/qq); 22 22 23 floatalpha = acos(cos_val);23 real alpha = acos(cos_val); 24 24 if(alpha == 0.0){ 25 25 alpha = 1.0e-26; 26 26 } 27 float besarg = qq*rr*sin(alpha); 28 float siarg = qq*h/2*cos(alpha); 27 real besarg = qq*rr*sin(alpha); 28 real siarg = qq*h/2*cos(alpha); 29 real be=0.0; real si=0.0; 29 30 30 float xx=0.0; float y=0.0; float bj=0.0; float ans1=0.0; float ans2=0.0; float z=0.0; float answer=0.0; 31 float contrast=0.0; float form=0.0; float be=0.0; float si=0.0; 31 real bj = NR_BessJ1(besarg); 32 32 33 float ax = fabs(besarg);33 real d1 = qq*rr*sin(alpha); 34 34 35 if(ax < 8.0) { 36 y=besarg*besarg; 37 ans1=besarg*(72362614232.0+y*(-7895059235.0+y*(242396853.1+y*(-2972611.439+y*(15704.48260+y*(-30.16036606)))))); 38 ans2=144725228442.0+y*(2300535178.0+y*(18583304.74+y*(99447.43394+y*(376.9991397+y*1.0)))); 39 bj=ans1/ans2; 35 if (besarg == 0.0){ 36 be = sin(alpha); 40 37 } 41 38 else{ 42 z=8.0/ax; 43 y=z*z; 44 xx=ax - 2.356194491; 45 ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4+y*(0.2457520174e-5+y*(-0.240337019e-6)))); 46 ans2=0.04687499995+y*(-0.2002690873e-3+y*(0.8449199096e-5+y*(-0.88228987e-6+y*0.105787412e-6))); 47 bj=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); 48 49 if(besarg < 0.0){bj*=-1;} 39 be = bj*bj*4.0*sin(alpha)/(d1*d1); 40 } 41 if(siarg == 0.0){ 42 si = 1.0; 43 } 44 else{ 45 si = sin(siarg)*sin(siarg)/(siarg*siarg); 50 46 } 51 47 52 float d1 = qq*rr*sin(alpha); 53 54 if (besarg == 0.0) {be = sin(alpha);} 55 else {be = bj*bj*4.0*sin(alpha)/(d1*d1);} 56 if(siarg == 0.0) {si = 1.0;} 57 else{si = sin(siarg)*sin(siarg)/(siarg*siarg);} 58 59 form = be*si/sin(alpha); 60 answer = sub*sub*form*acos(-1.0)*rr*rr*h*1.0e8*scale; 48 real form = be*si/sin(alpha); 49 real answer = sub*sub*form*acos(-1.0)*rr*rr*h*1.0e8*scale; 61 50 62 51 _ptvalue[i] = radius_weight*length_weight*theta_weight*phi_weight*answer*pow(rr,2)*h; … … 64 53 _ptvalue[i] *= fabs(cos(cyl_theta*pi/180.0)); 65 54 } 66 }55 } 67 56 } 68 57 -
Kernel-Lamellar.cpp
r5378e40 r8a20be5 1 __kernel void LamellarKernel(__global const float *qx, global const float *qy, __global float *ret, const float bi_thick, 2 const float scale, const float sub, const float background, const int length) 1 #ifndef real 2 # define real float 3 #endif 4 5 __kernel void LamellarKernel(__global const real *qx, global const real *qy, __global real *ret, const real bi_thick, 6 const real scale, const real sub, const real background, const int length) 3 7 { 4 8 int i = get_global_id(0); 5 9 if(i < length) 6 10 { 7 floatq = sqrt(qx[i]*qx[i]+qy[i]*qy[i]);8 floatpi = 4.0*atan(1.0);9 floatPq = 2.0*sub*(sub/q)/q*(1.0-cos(q*bi_thick));11 real q = sqrt(qx[i]*qx[i]+qy[i]*qy[i]); 12 real pi = 4.0*atan(1.0); 13 real Pq = 2.0*sub*(sub/q)/q*(1.0-cos(q*bi_thick)); 10 14 ret[i] = 2.0*pi*scale*Pq/(q*q)/bi_thick*1.0e8; 11 15 ret[i] += background; -
coreshellcylcode.py
r5378e40 r8a20be5 6 6 import pyopencl as cl 7 7 from weights import GaussianDispersion 8 from sasmodel import card 9 10 def set_precision(src, qx, qy, dtype): 11 qx = np.ascontiguousarray(qx, dtype=dtype) 12 qy = np.ascontiguousarray(qy, dtype=dtype) 13 if np.dtype(dtype) == np.dtype('float32'): 14 header = """\ 15 #define real float 16 """ 17 else: 18 header = """\ 19 #pragma OPENCL EXTENSION cl_khr_fp64: enable 20 #define real double 21 """ 22 return header+src, qx, qy 8 23 9 24 class GpuCoreShellCylinder(object): 10 PARS = {'scale':1, 'radius':1, 'thickness':1, 'length':1, 'core_sld':1e-6, 'shell_sld': 1e-6, 'solvent_sld':0,25 PARS = {'scale':1, 'radius':1, 'thickness':1, 'length':1, 'core_sld':1e-6, 'shell_sld':-1e-6, 'solvent_sld':0, 11 26 'background':0, 'axis_theta':0, 'axis_phi':0} 12 27 PD_PARS = ['radius', 'length', 'thickness', 'axis_phi', 'axis_theta'] 13 28 14 def __init__(self, qx, qy): 15 self.qx = np.asarray(qx, np.float32) 16 self.qy = np.asarray(qy, np.float32) 29 def __init__(self, qx, qy, dtype='float32'): 17 30 #create context, queue, and build program 18 self.ctx = cl.create_some_context() 19 self.queue = cl.CommandQueue(self.ctx) 20 self.prg = cl.Program(self.ctx, open('Kernel-CoreShellCylinder.cpp').read()).build() 31 ctx,_queue = card() 32 src, qx, qy = set_precision(open('NR_BessJ1.cpp').read()+"\n"+open('Kernel-CoreShellCylinder.cpp').read(), qx, qy, dtype=dtype) 33 self.prg = cl.Program(ctx, src).build() 34 self.qx, self.qy = qx, qy 35 21 36 22 37 #buffers 23 38 mf = cl.mem_flags 24 self.qx_b = cl.Buffer( self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qx)25 self.qy_b = cl.Buffer( self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qy)26 self.res_b = cl.Buffer( self.ctx, mf.WRITE_ONLY, qx.nbytes)27 self.res = np.empty_like( self.qx)39 self.qx_b = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qx) 40 self.qy_b = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qy) 41 self.res_b = cl.Buffer(ctx, mf.WRITE_ONLY, qx.nbytes) 42 self.res = np.empty_like(qx) 28 43 29 44 def eval(self, pars): 30 45 46 _ctx,queue = card() 31 47 radius, length, thickness, axis_phi, axis_theta = [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 32 48 for base in GpuCoreShellCylinder.PD_PARS] … … 47 63 for f in xrange(len(thickness.weight)): 48 64 49 self.prg.CoreShellCylinderKernel( self.queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b,65 self.prg.CoreShellCylinderKernel(queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, 50 66 np.float32(axis_theta.value[k]), np.float32(axis_phi.value[l]), np.float32(thickness.value[f]), 51 67 np.float32(length.value[j]), np.float32(radius.value[i]), np.float32(pars['scale']), … … 54 70 np.float32(pars['shell_sld']), np.float32(pars['solvent_sld']),np.uint32(size), 55 71 np.uint32(self.qx.size)) 56 cl.enqueue_copy( self.queue, self.res, self.res_b)72 cl.enqueue_copy(queue, self.res, self.res_b) 57 73 58 74 sum += self.res -
cylcode.py
r5378e40 r8a20be5 6 6 import pyopencl as cl 7 7 from weights import GaussianDispersion 8 from sasmodel import card 8 9 10 def set_precision(src, qx, qy, dtype): 11 qx = np.ascontiguousarray(qx, dtype=dtype) 12 qy = np.ascontiguousarray(qy, dtype=dtype) 13 if np.dtype(dtype) == np.dtype('float32'): 14 header = """\ 15 #define real float 16 """ 17 else: 18 header = """\ 19 #pragma OPENCL EXTENSION cl_khr_fp64: enable 20 #define real double 21 """ 22 return header+src, qx, qy 9 23 10 24 class GpuCylinder(object): … … 15 29 PD_PARS = ['radius', 'length', 'cyl_theta', 'cyl_phi'] 16 30 17 def __init__(self, qx, qy ):31 def __init__(self, qx, qy, dtype='float32'): 18 32 19 self.qx = np.asarray(qx, np.float32)20 self.qy = np.asarray(qy, np.float32)21 33 #create context, queue, and build program 22 self.ctx = cl.create_some_context() 23 self.queue = cl.CommandQueue(self.ctx) 24 self.prg = cl.Program(self.ctx, open('Kernel-Cylinder.cpp').read()).build() 34 ctx,_queue = card() 35 src, qx, qy = set_precision(open('NR_BessJ1.cpp').read()+"\n"+open('Kernel-Cylinder.cpp').read(), qx, qy, dtype=dtype) 36 self.prg = cl.Program(ctx, src).build() 37 self.qx, self.qy = qx, qy 25 38 26 39 #buffers 27 40 mf = cl.mem_flags 28 self.qx_b = cl.Buffer( self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qx)29 self.qy_b = cl.Buffer( self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qy)30 self.res_b = cl.Buffer( self.ctx, mf.WRITE_ONLY, qx.nbytes)41 self.qx_b = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qx) 42 self.qy_b = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qy) 43 self.res_b = cl.Buffer(ctx, mf.WRITE_ONLY, qx.nbytes) 31 44 self.res = np.empty_like(self.qx) 32 45 33 46 def eval(self, pars): 34 47 35 radius,length,cyl_theta,cyl_phi = \ 48 _ctx,queue = card() 49 radius, length, cyl_theta, cyl_phi = \ 36 50 [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 37 51 for base in GpuCylinder.PD_PARS] … … 48 62 sub = pars['sldCyl'] - pars['sldSolv'] 49 63 64 real = np.float32 if self.qx.dtype == np.dtype('float32') else np.float64 50 65 #Loop over radius, length, theta, phi weight points 51 66 for i in xrange(len(radius.weight)): … … 54 69 for l in xrange(len(cyl_phi.weight)): 55 70 56 self.prg.CylinderKernel(self.queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, np.float32(sub), 57 np.float32(radius.value[i]), np.float32(length.value[j]), np.float32(pars['scale']), 58 np.float32(radius.weight[i]), np.float32(length.weight[j]), np.float32(cyl_theta.weight[k]), 59 np.float32(cyl_phi.weight[l]), np.float32(cyl_theta.value[k]), np.float32(cyl_phi.value[l]), 71 72 self.prg.CylinderKernel(queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, real(sub), 73 real(radius.value[i]), real(length.value[j]), real(pars['scale']), 74 real(radius.weight[i]), real(length.weight[j]), real(cyl_theta.weight[k]), 75 real(cyl_phi.weight[l]), real(cyl_theta.value[k]), real(cyl_phi.value[l]), 60 76 np.uint32(self.qx.size), np.uint32(size)) 61 cl.enqueue_copy( self.queue, self.res, self.res_b)77 cl.enqueue_copy(queue, self.res, self.res_b) 62 78 sum += self.res 63 79 vol += radius.weight[i]*length.weight[j]*pow(radius.value[i], 2)*length.value[j] -
fit.py
r5378e40 r8a20be5 13 13 set_beam_stop(data, 0.004) 14 14 15 """ 15 16 17 16 18 model = SasModel(data, GpuCylinder, scale=1, radius=64.1, length=266.96, sldCyl=.291e-6, sldSolv=5.77e-6, background=0, 17 19 cyl_theta=0, cyl_phi=0, radius_pd=0.1, radius_pd_n=10, radius_pd_nsigma=3,length_pd=0.1, 18 20 length_pd_n=5, length_pd_nsigma=3, cyl_theta_pd=0.1, cyl_theta_pd_n=5, cyl_theta_pd_nsigma=3, 19 cyl_phi_pd=0.1, cyl_phi_pd_n=10, cyl_phi_pd_nsigma=3,) 20 21 cyl_phi_pd=0.1, cyl_phi_pd_n=10, cyl_phi_pd_nsigma=3, dtype='float32') 22 model.radius.range(0,100) 23 model.length.range(0, 1000) 24 model.cyl_theta.range(0,90) 25 model.cyl_phi.range(0,90) 26 """ 21 27 model = SasModel(data, GpuEllipse, scale=.027, radius_a=60, radius_b=180, sldEll=.297e-6, sldSolv=5.773e-6, background=4.9, 22 28 axis_theta=0, axis_phi=90, radius_a_pd=0.1, radius_a_pd_n=10, radius_a_pd_nsigma=3, radius_b_pd=0.1, radius_b_pd_n=10, 23 29 radius_b_pd_nsigma=3, axis_theta_pd=0.1, axis_theta_pd_n=6, axis_theta_pd_nsigma=3, axis_phi_pd=0.1, 24 axis_phi_pd_n=6, axis_phi_pd_nsigma=3 )30 axis_phi_pd_n=6, axis_phi_pd_nsigma=3, dtype='float') 25 31 26 32 model = SasModel(data, GpuLamellar, scale=1, bi_thick=100, sld_bi=.291e-6, sld_sol=5.77e-6, background=0, 27 bi_thick_pd=0.1, bi_thick_pd_n=35, bi_thick_pd_nsigma=3 )33 bi_thick_pd=0.1, bi_thick_pd_n=35, bi_thick_pd_nsigma=3, dtype='float') 28 34 29 """ 30 model = SasModel(data, GpuCoreShellCylinder, scale=1, radius=64.1, thickness=1, length=266.96, core_sld= .251e-6, shell_sld=6.2e-6,31 solvent_sld= 5.77e-6, background=0, axis_theta=0, axis_phi=0, radius_pd=0.1, radius_pd_n=10, radius_pd_nsigma=3,35 36 model = SasModel(data, GpuCoreShellCylinder, scale=1, radius=64.1, thickness=1, length=266.96, core_sld=1e-6, shell_sld=1e-6, 37 solvent_sld=4e-6, background=0, axis_theta=0, axis_phi=0, radius_pd=0.1, radius_pd_n=10, radius_pd_nsigma=3, 32 38 length_pd=0.1, length_pd_n=10, length_pd_nsigma=3, thickness_pd=0.1, thickness_pd_n=2, thickness_pd_nsigma=3, 33 39 axis_theta_pd=0.1, axis_theta_pd_n=2, axis_theta_pd_nsigma=3, axis_phi_pd=0.1, axis_phi_pd_n=2, 34 axis_phi_pd_nsigma=3) 40 axis_phi_pd_nsigma=3, dtype='float') 41 """ 35 42 36 43 model.scale.range(0,10) -
lamellarcode.py
r5378e40 r8a20be5 3 3 4 4 import numpy as np 5 import math6 5 import pyopencl as cl 7 6 from weights import GaussianDispersion 7 8 def set_precision(src, qx, qy, dtype): 9 qx = np.ascontiguousarray(qx, dtype=dtype) 10 qy = np.ascontiguousarray(qy, dtype=dtype) 11 if dtype == 'double': 12 header = """\ 13 #pragma OPENCL EXTENSION cl_khr_fp64: enable 14 #define real double 15 """ 16 return header+src,qx,qy 17 else: 18 return src,qx,qy 8 19 9 20 … … 12 23 'scale':1, 'bi_thick':1, 'sld_bi':1e-6, 'sld_sol':0, 'background':0, 13 24 } 14 PD_PARS = ['bi_thick']15 25 16 def __init__(self, qx, qy ):26 def __init__(self, qx, qy, dtype='float'): 17 27 18 self.qx = np.asarray(qx, np.float32)19 self.qy = np.asarray(qy, np.float32)20 28 #create context, queue, and build program 21 29 self.ctx = cl.create_some_context() 22 30 self.queue = cl.CommandQueue(self.ctx) 23 self.prg = cl.Program(self.ctx, open('Kernel-Lamellar.cpp').read()).build() 31 src,qx,qy = set_precision(open('Kernel-Lamellar.cpp').read(), qx, qy, dtype=dtype) 32 self.prg = cl.Program(self.ctx, src).build() 33 self.qx, self.qy = qx, qy 24 34 25 35 #buffers … … 38 48 sub = pars['sld_bi'] - pars['sld_sol'] 39 49 50 real = np.float32 if self.qx.dtype == np.dtype('float32') else np.float64 40 51 for i in xrange(len(bi_thick.weight)): 41 self.prg.LamellarKernel(self.queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, np.float32(bi_thick.value[i]),42 np.float32(pars['scale']), np.float32(sub), np.float32(pars['background']), np.uint32(self.qx.size))52 self.prg.LamellarKernel(self.queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, real(bi_thick.value[i]), 53 real(pars['scale']), real(sub), real(pars['background']), np.uint32(self.qx.size)) 43 54 cl.enqueue_copy(self.queue, self.res, self.res_b) 44 55 … … 47 58 48 59 return sum/norm + pars['background'] 49 50 def lamellar_fit(self, pars, b_n=10, b_w=.1, sigma=3):51 52 bi_thick = GaussianDispersion(b_n, b_w, sigma)53 bi_thick.value, bi_thick.weight = bi_thick.get_weights(pars.bi_thick, 0, 1000, True)54 55 sum, norm = 0.0, 0.056 57 for i in xrange(len(bi_thick.weight)):58 self.prg.LamellarKernel(self.queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, np.float32(bi_thick.value[i]),59 np.float32(pars.scale), np.float32(pars.sld_bi), np.float32(pars.sld_sol),60 np.float32(pars.background), np.uint32(self.qx.size))61 cl.enqueue_copy(self.queue, self.res, self.res_b)62 63 sum += bi_thick.weight[i]*self.res64 norm += bi_thick.weight[i]65 66 return sum/norm + pars.background67 68 60 69 61 def demo(): -
sasmodel.py
r5378e40 r8a20be5 3 3 4 4 import numpy as np 5 import pyopencl as cl 5 6 from bumps.names import Parameter 6 7 from sans.dataloader.loader import Loader … … 11 12 loader = Loader() 12 13 data = loader.load(filename) 14 if data is None: 15 raise IOError("Data %r could not be loaded"%filename) 13 16 return data 14 17 … … 47 50 48 51 52 GPU_CONTEXT = None 53 GPU_QUEUE = None 54 def card(): 55 global GPU_CONTEXT, GPU_QUEUE 56 if GPU_CONTEXT is None: 57 GPU_CONTEXT = cl.create_some_context() 58 GPU_QUEUE = cl.CommandQueue(GPU_CONTEXT) 59 return GPU_CONTEXT, GPU_QUEUE 60 61 49 62 class SasModel(object): 50 def __init__(self, data, model, **kw):63 def __init__(self, data, model, dtype='float32', **kw): 51 64 self.index = data.mask==0 52 65 self.iq = data.data[self.index] … … 55 68 self.qx = data.qx_data 56 69 self.qy = data.qy_data 57 self.gpu = model(self.qx, self.qy )70 self.gpu = model(self.qx, self.qy, dtype=dtype) 58 71 pd_pars = set(base+attr for base in model.PD_PARS for attr in ('_pd','_pd_n','_pd_nsigma')) 59 72 total_pars = set(model.PARS.keys()) | pd_pars … … 79 92 def theory(self): 80 93 pars = dict((k,v.value) for k,v in self._parameters.items()) 94 print pars 81 95 result = self.gpu.eval(pars) 82 96 return result
Note: See TracChangeset
for help on using the changeset viewer.