From 034da510769db1e3f197a0e4b07d1c8bcd7331f3 Mon Sep 17 00:00:00 2001 From: Berk Onat <b.onat@warwick.ac.uk> Date: Wed, 4 Oct 2017 17:53:33 +0100 Subject: [PATCH] Changed C API Numpy library to directly access molfile structure data --- pymolfile/molfile/1 | 174 + pymolfile/molfile/_libpymolfile.so | Bin 757984 -> 771368 bytes .../Contents/Resources/DWARF/_libpymolfile.so | Bin 77982 -> 184310 bytes pymolfile/molfile/_numpy_swig.so | Bin 0 -> 44744 bytes pymolfile/molfile/compile-numind.sh | 2 + pymolfile/molfile/compile-signedintbuf.sh | 2 + pymolfile/molfile/compile.sh | 2 +- pymolfile/molfile/libpymolfile-backup2.i | 576 ++ pymolfile/molfile/libpymolfile-new.i | 578 ++ pymolfile/molfile/libpymolfile.i | 9 + pymolfile/molfile/libpymolfile.py | 98 +- pymolfile/molfile/libpymolfile_wrap.cxx | 1374 +---- .../molfile/numind-cython/compile-numind.sh | 2 + pymolfile/molfile/numind-cython/numind.cpp | 5454 +++++++++++++++++ pymolfile/molfile/numind-cython/numind.h | 12 + pymolfile/molfile/numind-cython/numind.html | 1243 ++++ pymolfile/molfile/numind-cython/numind.pyx | 192 + pymolfile/molfile/numind-cython/numind.so | Bin 0 -> 78632 bytes .../molfile/numind-cython/test_numpy_swig.py | 42 + pymolfile/molfile/numpy_swig.h | 12 + pymolfile/molfile/numpy_swig.i | 178 + pymolfile/molfile/numpy_swig.py | 150 + pymolfile/molfile/numpy_swig_wrap.cxx | 4477 ++++++++++++++ pymolfile/molfile/pymolfile-backup.c | 329 + pymolfile/molfile/pymolfile-backup2.c | 565 ++ pymolfile/molfile/pymolfile-backup2.h | 354 ++ pymolfile/molfile/pymolfile-new.c | 1522 +++++ pymolfile/molfile/pymolfile-new.h | 356 ++ pymolfile/molfile/pymolfile.c | 1402 ++++- pymolfile/molfile/pymolfile.h | 15 +- .../signedintbuf-cython/compile-numind.sh | 2 + .../molfile/signedintbuf-cython/numind.cpp | 1 + .../molfile/signedintbuf-cython/numind.h | 12 + .../molfile/signedintbuf-cython/numind.html | 1243 ++++ .../molfile/signedintbuf-cython/numind.pyx | 268 + .../molfile/signedintbuf-cython/numind.so | Bin 0 -> 78632 bytes .../signedintbuf-cython/test_numpy_swig.py | 42 + pymolfile/molfile/test-backup.py | 153 + pymolfile/molfile/test.py | 50 +- pymolfile/molfile/test_numpy_swig.py | 46 + 40 files changed, 19631 insertions(+), 1306 deletions(-) create mode 100644 pymolfile/molfile/1 create mode 100755 pymolfile/molfile/_numpy_swig.so create mode 100644 pymolfile/molfile/compile-numind.sh create mode 100644 pymolfile/molfile/compile-signedintbuf.sh create mode 100644 pymolfile/molfile/libpymolfile-backup2.i create mode 100644 pymolfile/molfile/libpymolfile-new.i create mode 100644 pymolfile/molfile/numind-cython/compile-numind.sh create mode 100644 pymolfile/molfile/numind-cython/numind.cpp create mode 100644 pymolfile/molfile/numind-cython/numind.h create mode 100644 pymolfile/molfile/numind-cython/numind.html create mode 100644 pymolfile/molfile/numind-cython/numind.pyx create mode 100755 pymolfile/molfile/numind-cython/numind.so create mode 100644 pymolfile/molfile/numind-cython/test_numpy_swig.py create mode 100644 pymolfile/molfile/numpy_swig.h create mode 100644 pymolfile/molfile/numpy_swig.i create mode 100644 pymolfile/molfile/numpy_swig.py create mode 100644 pymolfile/molfile/numpy_swig_wrap.cxx create mode 100644 pymolfile/molfile/pymolfile-backup.c create mode 100644 pymolfile/molfile/pymolfile-backup2.c create mode 100644 pymolfile/molfile/pymolfile-backup2.h create mode 100644 pymolfile/molfile/pymolfile-new.c create mode 100644 pymolfile/molfile/pymolfile-new.h create mode 100644 pymolfile/molfile/signedintbuf-cython/compile-numind.sh create mode 100644 pymolfile/molfile/signedintbuf-cython/numind.cpp create mode 100644 pymolfile/molfile/signedintbuf-cython/numind.h create mode 100644 pymolfile/molfile/signedintbuf-cython/numind.html create mode 100644 pymolfile/molfile/signedintbuf-cython/numind.pyx create mode 100755 pymolfile/molfile/signedintbuf-cython/numind.so create mode 100644 pymolfile/molfile/signedintbuf-cython/test_numpy_swig.py create mode 100644 pymolfile/molfile/test-backup.py create mode 100644 pymolfile/molfile/test_numpy_swig.py diff --git a/pymolfile/molfile/1 b/pymolfile/molfile/1 new file mode 100644 index 0000000..a20e02a --- /dev/null +++ b/pymolfile/molfile/1 @@ -0,0 +1,174 @@ +import numpy +import ctypes +import _libpymolfile + +class molatom_t(ctypes.Structure): + _fields_ = [ + ('name', ctypes.c_char * 16), + ('type', ctypes.c_char * 16), + ('resname', ctypes.c_char * 8), + ('resid', ctypes.c_uint8), + ('segid', ctypes.c_char * 8), + ('chain', ctypes.c_char * 2), + ('altloc', ctypes.c_char * 2), + ('insertion', ctypes.c_char *2), + ('occupancy', ctypes.c_float), + ('bfactor', ctypes.c_float), + ('mass', ctypes.c_float), + ('charge', ctypes.c_float), + ('radius', ctypes.c_float), + ('atomicnumber', ctypes.c_uint8), + ('ctnumber', ctypes.c_uint8), + ] + +class molplugin_t(ctypes.Structure): + _fields_ = [ + ('abiversion', ctypes.c_uint8), + ('type', ctypes.c_char_p), + ('name', ctypes.c_char_p), + ('prettyname', ctypes.c_char_p), + ('author', ctypes.c_char_p), + ('majorv', ctypes.c_uint8), + ('minorv', ctypes.c_uint8), + ('is_reentrant', ctypes.c_uint8), + ('filename_extension', ctypes.c_char_p), + ('open_file_read', ctypes.CFUNCTYPE(ctypes.c_char_p, + ctypes.c_char_p, ctypes.POINTER(ctypes.c_uint8))), + ('read_structure', ctypes.CFUNCTYPE(ctypes.c_void_p, + ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(molatom_t))), + ('read_bonds', ctypes.CFUNCTYPE(ctypes.c_void_p, + ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint), + ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint), + ctypes.c_char_p)), + ('read_next_timestep', ctypes.c_int8), + ('close_file_read', ctypes.c_void_p), + ('open_file_write', ctypes.c_void_p), + ('write_structure', ctypes.c_int8), + ('write_timestep', ctypes.c_int8), + ('close_file_write', ctypes.c_void_p), + ('read_volumetric_metadata', ctypes.c_int8), + ('read_volumetric_data', ctypes.c_int8), + ('read_volumetric_data_ex', ctypes.c_int8), + ('read_rawgraphics', ctypes.c_int8), + ('read_molecule_metadata', ctypes.c_int8), + ('write_bonds', ctypes.c_int8), + ('write_volumetric_data', ctypes.c_int8), + ('write_volumetric_data_ex', ctypes.c_int8), + ('read_angles', ctypes.c_int8), + ('write_angles', ctypes.c_int8), + ('read_qm_metadata', ctypes.c_int8), + ('read_qm_rundata', ctypes.c_int8), + ('read_timestep', ctypes.c_int8), + ('read_timestep_metadata', ctypes.c_int8), + ('read_qm_timestep_metadata', ctypes.c_int8), + ('read_timestep2', ctypes.c_int8), + ('read_times', ctypes.c_ssize_t), + ('cons_fputs', ctypes.c_uint8) + ] + +class moltimestep_t(ctypes.Structure): + _fields_ = [ + ('coords', ctypes.POINTER(ctypes.c_float)), + ('velocities', ctypes.POINTER(ctypes.c_float)), + ('A', ctypes.c_float), + ('B', ctypes.c_float), + ('C', ctypes.c_float), + ('alpha', ctypes.c_float), + ('beta', ctypes.c_float), + ('gamma', ctypes.c_float), + ('physical_time', ctypes.c_double), + ('total_energy', ctypes.c_double), + ('potential_energy', ctypes.c_double), + ('kinetic_energy', ctypes.c_double), + ('extended_energy', ctypes.c_double), + ('force_energy', ctypes.c_double), + ('total_pressure', ctypes.c_double) + ] + +class molhandle_t(ctypes.Structure): + _fields_ = [ + ('plugin', ctypes.POINTER(molplugin_t)), + ('file_handle', ctypes.c_void_p), + ('natoms', ctypes.c_int) + ] + +class molnatoms(ctypes.Structure): + _fields_ = [ + ('natoms', ctypes.c_int) + ] + +#callback_t = ctypes.CFUNCTYPE(None, ctypes.POINTER(molatom_t)) + +def get_open_file_read(output): + ctypes.open_file_read.restype = ctypes.POINTER(molhandle_t) + ctypes.open_file_read.argtypes = [ctypes.POINTER(molplugin_t), ctypes.c_void_p, ctypes.c_uint8] + return ctypes.pythonapi.PyCapsule_GetPointer(output, "plugin") + +def get_capsule(capsule): + ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.c_void_p + ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object, ctypes.c_char_p] + return ctypes.pythonapi.PyCapsule_GetPointer(capsule, b"plugin") + +def get_plugincapsule(capsule): + data = ctypes.POINTER(molhandle_t) + ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.POINTER(molhandle_t) + ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object, ctypes.c_char_p] + data = ctypes.pythonapi.PyCapsule_GetPointer(capsule, b"plugin") + return data + +def get_plugindata(capsule): + data = ctypes.POINTER(molhandle_t) + ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.POINTER(molhandle_t) + ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object, ctypes.c_char_p] + data = ctypes.pythonapi.PyCapsule_GetPointer(capsule, b"plugin") + return data + +mylib = _libpymolfile +mylist = mylib.molfile_plugin_list(200) +numlist = mylib.molfile_init() +print(numlist) +for i in range(numlist): + testplugin = mylib.molfile_plugin_info(mylist, i) + print(i, testplugin) + +plugin = mylib.get_plugin(mylist, 81) +print(plugin) +natoms=0 +numatoms=molnatoms(natoms) +fname="../../test/md.gro" +ftype="gro" + +pluginhandle = mylib.open_file_read(plugin, fname, ftype, natoms) +print("This passed") +print(pluginhandle) +print("This passed too") +print(pluginhandle.natoms) +print("Here") + +x = numpy.array([ + ('C1','C','ACE',0,'','','','',1.0,1.0,12.011,6,1.0,6), + ('C2','C','ACE',0,'','','','',1.0,1.0,12.011,6,1.0,6) + ], + dtype=[ + ('name', 'S16'), ('type', 'S16'), ('resname', 'S8'), + ('resid', 'i4'), ('segid', 'S8'), ('chain', 'S2'), + ('altloc', 'S2'), ('insertion', 'S2'), ('occupancy', 'f8'), + ('bfactor', 'f8'), ('mass', 'f8'), ('charge', 'f8'), + ('radius', 'f8'), ('atomicnumber', 'i4') + ] + ) +print(x) +print(x.__array_interface__) +print(x.__array_interface__["descr"]) +print(x.__array_struct__) +#y = mylib.read_fill_structure(pluginhandle, x) +y = mylib.print_array_struct(x) +print('Test') +print(y) +#outarray = mylib.get_structure(pluginhandle) +#print(outarray) +#print(type(outarray)) +#for i in outarray: +# print(i) + + diff --git a/pymolfile/molfile/_libpymolfile.so b/pymolfile/molfile/_libpymolfile.so index afa3e0a62a50fd7b2efa0c76eae1d2fedf08d253..26d6964a955d12f5da6de48551627239aeb0e3f0 100755 GIT binary patch delta 271264 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%0D+9TK`v`g(!FpRZw^y z!snO)34tw8z7>=|<sn2q2+F_y2*OW<^1nZY@JpclSD=%785kIPpnTC65cxSXp!L5A zRA3EMf%Hp=f&)<gg;x;%MJS*9HH7~F%IEw5;s1m3FMWjYO=dzo@C?cig7OPKLFBXR zp#pQE0-aF)Jt%)4l&|y~qTvRVFZTz+{|@E*GC|hi=*@yym<Z+jLiv}W{B$V)8Z$(F zeG62;k_95L4a%3{g7D8l`6k>D{sSogGL-)v%5UO@$n(yIIN&}Xgs%YQf8vMmZK3== z5iq}=p$ICl2qM7H59P0v04rcv4&{G>@{d6IF;WouTTs4&0)+n&%GZMOx#vI}bVUgw zuL$Mu)dKPB85qo=0&lfJ0t^hkQ2tB<2tNbL-(?2jH$nLytswlFP`<b|gufojcejD? zk3#v}P7wYbC|?xB2i1SypaT0{APRWqLR@^<8^TwD^0j>-d<!VQ)E~kRhVoYiL-@H+ z{?%v*zXi&_59QB>@?&CHA@%=usKB-uh=xm0{)t2g{}q(~4$5bk2XSCb5=34C%HIIx zt3vrVk|FZ8Q2xeL2tNwSf1d*yUt?fkD1!=U6hajAL-~GC{!%D^50t+N%KuOVQGXK3 zKT`?eKZWwk>L7fE`49)sZG!M6p!~y4^$-C)sDNQJgl`Syr?x=&eo#Jd7lfY%<uC4q z@N1!bkx3B#L@3`1%3luUSAdS@W?*1A4CS}f&wyz74i%UO<qI!>xOnX>h`cY9Z#x&l zPl56~q5N7X{{@skAIeXe4^h7d%C}zx;lGCR>o+Wg2uLo3Som%ggzp9A+pdN1lc4;) zP<}m>Z?g^}zaGl(g7P0i`4cxm<bOf=JewhWlSN?r>KUY=0x=K)2L3G&1+`Fq{8k8m zCX}DB55hkV<@X$h@V`U(hfhNIe2c*rF#Lq_ouGW)QxN$$Fu$IGA@~eLpbRX)zz}~H z!k+=<FFOz6?}qYUUWD);K>2g8K=|*We9Nm4KJyZY16JIC@Wr5f{#y{f8i)_7|IMKS zW*`AZ28QKOzBiQr49bs(@~7N}7*MbTG@swVVD}Kh-w)+~fby?H)jNPrPG?|Xuw4pq z&^{<XaVY~sJ!qZI38=u{r4R!%-a!nMTn6EL{f6)-L-_}w{Ikm-1|Iwekyls_;kSvh zfoGSEq5MB$5WWYLFC+)yUt7*l4_+uVK^`JtumWO$oic>qz5?Qa-N6w4L#TXs2!!vk z5~6;37=*t8%8#jl@Wod_^xvw4@ZF$%{#pos$EtdWf={3m;29VgSXM&}G-!e-P=xXq zwm|qXQ2rq(zZc5C4COC{@}ENahoJl`tq}e1q5OMLK1cl;hy%>pAPTggd<Q7s2g=Wb z@{6GS3MhXbl-~s9pN8`Lp!}~;{tGByX)VOQUr>I%&svC&P1+$2D1a&mfbwTR`8iPj z0VsbBl+V8oV&Eev-xbOi=zy5l4CP;d@^?V_Nu6N%dWN@9fe8=+2BY;517~%C6)@yM z`8&EH{QXe=y&ec(Xahw3yj}?33(Eh{58<~%`Bsx4{3B3)6PORGe>Xx5*fj;Bzz52& znhN31fbv&B`EQ{7T~NNmCW!t|Q2sI~|JpQ&{&!Hm+;j-vY%@fC4Tul2e->2W!wiT5 zhAj{UVlyH904P5K%3lEGZ-VmQL-|ItA?mHRLiDeK@=tDsM6tyji2N%k|I{2dNd13c z8$^NCT!?~a+aLzKg7V9@L*y&wLFDH_`9AX@{F6}ry@e3|`|S|@5sM&vxg8Mw^PqgU z9T0hm#cUw|Gcc4x1(KFPG+cx7PeAz`J0TiamO|t$p?tq(5dI7(e+!g<2+EgP4w3&1 z<;Otzs=FW#nz+0kqQGGn#DZ;51^H0^GbsN#lpnPMqJHjfi24T5We^Mu4AOfb{1;Gu z43w|33ZniAlwSbli|&P}Z>V1lQSbvQpt1(Sm)Q?da0|*`3*|elg~-o30FiHj^6d{o z_;c1l<QWe^_%EP*Whh@~Jw(0~%C9eh3LJw92yKKYusRGeKxY$#zXi&7+6>{lAA!gp zf%4ZLfdnbX7Kr@1qY!y7DE~f`KV>UK-tHJ!zMkP1RA4bgfI(n8M1kUQumXlMC_fC! zuiOEVzjz#C;jEnyzU&EzdcIu{e)b87{KP#F{&Xn6@fw7G0nD#wU|4zwBEWGHqT%*E z2tNqQe+%VLg7Q~9g2?ZL@*hL_PoeyYk0J8%ry%CtcnRSLLir0`LHNBOKB)e;;DT%x z+X@l@jsHXWm!bR^9*F!eD8C2FS3V7~AVdHn?*QdH2txRAry(JtBLv}3f$|SQ`R7kV z>wg~+hys=~5Dh6%z7v!$APSLhg7Pz<{KHWG8z}z|lpi7nQEzk>V%{q#KLg5_5QoSw zI}5G<cR&T6Ko#UkKoqE-gZS_WlrM1}!uOGc$eTj>RZxBzl>bN>BEJ&Kf1wHCUq26V zkd-ck9}L=m3tE`A4k}P_0ixi70Yt%JC|}GF!sojPkuQMq<DvXLQ2queU(N`kp7|0) zeIAq_2IXIZ^0(JR1#C<p8kjCae0U4W2Q5SdHPMtzA@WZzLkye%<zKl1;a`ICYp+81 zugoCoPeS=~%prWvYY_QIP=5V8s6d+qM1jZ+hyoi+2>-?nh=W!``EfTP@;uHE`CU+c z0hBL$3nIS*%5S^{(f<d^p9keLxq$W8Gwg;6@IV9@L~lbh2toN%p?nD_{}Yry!4+%( zgYX@Q`e{(U36#G8%AW+~x4A>qi`|7d@S7iqU(dj><SxVj1AmYJ1B3fL2)_o(Uw03p z;Y0vLp8Y<A?-T^#``m}9?}G9Rp!^9?{uC&G7L@-L%4Y~+hm8N%Jb)N5AqryPA}D_a zlz#%se*)!eKZK}niH4}(0_BIqLipFA{3s~@7nGj@<wre&=$DIQht&TMpaM%0AO<i$ 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 F767BLygL8@ delta 263609 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%0A;f3{6kR6a_*8Zm;cY=-I@)YE| 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%0A-`E2r9BR<>7nSvi;8V`bQI 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 diff --git a/pymolfile/molfile/_libpymolfile.so.dSYM/Contents/Resources/DWARF/_libpymolfile.so b/pymolfile/molfile/_libpymolfile.so.dSYM/Contents/Resources/DWARF/_libpymolfile.so index d66b822ee7cd1186e842d1ef8fbd9025fe68b6cb..2cf277f2af4c15b5ae011b054defceabfd4abbcc 100644 GIT binary patch literal 184310 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 literal 77982 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 J1~wAR1OUb76r2D6 diff --git a/pymolfile/molfile/_numpy_swig.so b/pymolfile/molfile/_numpy_swig.so new file mode 100755 index 0000000000000000000000000000000000000000..e5907947a6fe702d7cf89b0bce5fbfeaa9ae1da5 GIT binary patch literal 44744 zcmX^A>+L^w1_nlE1_lN;1_lOx1_p)`Yzz#o3<3-wAj!bMP{G8&5Fa1n8W92#LBj>u z`Roh~46F<c3?Le$B0jz(wW0*Xf?#y>0z@F<C%qvwh|dCHLP!>d1_%Q}#>W?zlqMBJ zI1HHXlS+U{H84VG5Fg3}3vfWq1Nj*w05LB<BQ>WWwFrxOa}q(S7#JonL1+*k%7h3& z&4X}2?nzHhj!&&fPAw>jFG);7_peS0M5P0SVgT_`%!7)<sQCEg;*z4wymY7lx_LQJ z^S*OI6u|fp9s>iq+41qo`FX{N2thZmARnSr5JEA4_$cuK6^Bvr@uhj?nRzMknR#g- zt?1^pfCL#B7+}c-#7B1%%q$QMN_QIIbm!t2;s_FfVweF6XnaU=1*bPyS_Y|zkI&1A zFRsi@%Fl@}C@ErykH>BvR6E##ApIb{APh<$us8zo<Kxrw5upZ(XH@e9pzfOhQp~`> z0OF&Y=LD4lQStFPiTK>N0BRmA0zrIa^Fa9vIa^}JE2{ezfD$(Y1A_w85D*{A1UUx- z$H%86mO#@!ND@8#4wQmK85ndy0mZ<;0OI3MCrQPKT#FfgAF3hdod9_Z!el@;4>=Em zq(SM#1Ds!dJpH^~T|8ld0gC_wkSYcSSm|*>55fl-k8Bn%0|SEw0|SEu0|NuHczj-I zZb4;yad~FCUU5DHgAxNn1K7w01_n?OlhDAxZ~;k!K@$VR1yI4)!N72U0g~@PW=3=} zFq~pwVDOm1z|bJZz`)JGzz_g&3PT|S0~mv}l`$|dz`OvJMxlO8Wnh?sA_Cz^L*3qe zD`!vh35zxDD?D~SbQbki0i{8Z5*{uF1|BX3Ef^mp#=yY9!vOII$c^Cq$i~dTz{bp= zUs_zGpOc@Qn4_OxP@-Q@S(1^TXRPm5l$e`Zo?nz*tRDat(o2Jh=!c~i6=&w>73&-8 znL%YC=7YiuZa%9qBPfI+=4U49=VT@&YisKn>ZMfXWF~>#V*&LG$URIp*I3Zi2UixC zq~_{5LA8K=q6YQXfer=+P}FNe`2n2_3>;t;qr_+kjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kgRHA5iOqw}dp^BV)h1D(e_I%|J;bl3iP0UFfv=yd%6=4|t3VDRX4ec{pV z`og2r^?^q>2y=KeAN=pp$>GublYzel)DwOw1nMq>B^@|Cx*ZHWx@#Z&zwi>|S}@_! z4KmTez@yXkhDUSl4F>)eHwFd<nA{DIPS*<_-5`wH@CzQ@aKkSk8xAw&gGaZ6gh%J` z7v&&lgKX?P{vsR1Za!iVdw2rWzXCA7dUV^rVDMpJ0DJX2M4dqF;WU2v7Ldakpz004 z>N`t6cyyQk@aQak;n7|C!K1Sj5*i>6b-Uj1=*I2v8%Pen0d+VeM328{fLLn~dpHf| zJ_V0n(^@}Jz(b?N%nQT;1)%E>cx>RY?*)>5FA(;900oTz#6ATi`y4zvYd;)!y#wmP zdmMKKjf60GB-h^YIQX3T#WRTA7d(<(?|2-1zzj0uk{1KRPEg0c^Sno=>xmbKAZlKC zG}pdh;BVz)U|@K$$rJ46A1~WMDWg|(!r%Y@L4H0C9vtiTy#wNOda!_~V-6gdAo{oi z4`}!Z!V~}v4|;UFp77`{ec{pRrT|GEV77!ux9b6@xCSI?8F(}wWAx}W0BMHA&+!*B zAgf`iw$t^8N4M(_kLDu|;3#%sz>MF{&=;Vz05bW-dv34?9(Xj@K49Q)i3ge0UHbrJ z_KWQv3=GXb82DQ}L0;YJ0ZKxy55Q@goTPBv^#Lfofio94rSi*z$IqeZPr;+t)-aBN z!K2soRWgVY6;1(BynEsq7+yfa*LFcH1H-<r%nS@K+Ca{MWZ(}k>OB}348L`L2Pd0O z*9R|VFoU$3E(96WUHjri2O9&!3uX?8e|kZqYA={U2K1UrfpZ4y`f!l%EMEL{XJGI+ z?)n4d(wCr78gRHHLRBI5Fxb6~Z!Um>s<ZZnM`!5;kIv8&9-Y1iJdV5W0O|AqhmY?L zkAn|cJs3}TG+Qw6w|rm%SpmvJ2nldbcHQ97T)TmRzZG1@>;Nh2W&IiqQti9Jqth2w zCcW_J_5}t1506e?aKQzRr9_ZFI$>tClz_A!cU=H=#s-h(16&@Rt}~9iu7L_&@JRMu z<B@&Rz=QDw*kN5DpMXjwgt$j{1&2p>=?rjcL>6}7@aWtd@&EsSkIv&Bom&I`|NsBu zEGW#nA)?)2A&<^OFZQ}aLc0|-&W3JIr|W{3!myID+jULz0me?(H80~p1~=C(VBl|A z&It0q>w;zr7XDVyOpHgj>jIB%2L+GLR*(Px|Gxwcj~gE7Jm}Hc3+6+72bS~bbe-VQ zTswh*za<)Kj7PVFhDW#W2@lN^9tVFgdvv;XKysIFhetQd36D<K29Ivn4IbUTH$1vS zcX%9p#OlF#(WBc_0;Hp}wF2a_Zjd627kAwl7(AK}2zWFfVDji}EdWbFR4_w$;4nY_ zVgg8EXKMyXLGxY^#lYWk1RUBB!OqqMkX-j(2!)n53M4$br-CegQ4TVw*Ysf^1B2rZ z&~%DR=OK^oUXYvzb1ztPCxn6;)!FI*iWz&5zHW$2^Fb~TR7KsT6Fj<o8$7xNJ-U0r zzUXYV0BJjA0SfzGkb^zCLvMI=m+tU5_>9$q@smfVmxM=Ws{tqiKmiV}lMsYQx9bj% z<^zl#ovu4xe*g3TzenQ{P(F!0oR+4CR^J4G>zig<n>f%MU#l4?SbACI!6g9i4KO8o zFd9@ki7J73oxI9mij^mhf#JC89nc8(OVF74ao0N_r+|vI7Y&vm4X&^<8Z=ep(QA7u zmVx2LQA-Afmti1VV6}WN>&93H1`kWu2hgk+#su;=sP1<VfVTszU0?9GUI0Z?FKZ)6 zeYfumk8V!^k51ku7`M|=pt<%AEC=(0j5+T50pcpx4<6R60kI4W{LPO+iLsZ}8l>&G zD=1(XJS<slKyodh(P58XQ+beFx2*=4V$}pwpv=y4!lPT@#X<wH_bzxe*Ir=YZ?OXV zhLssvRda;`1Ahx>?A@cA^<@mmLoodg3Lf3Q7d$#06~KAVqnq_4vOKtL!nzMt=m0pE zfQt!6i0f-X3XZ#;0Q=68wJwH%fxkr&<dR;~M37v!Z5EgU)m;oASHIQ=yZVGjbL|NR z{+1+=T2OJ*&FcwP82Z7(n&l!tte`mI(d~P{qm$7CYRO9-h=vm$-4-6*r59dUOM}hZ z;n7^XgMq&lTuQ^#f?Neoj}XgRts#0Zcr;f?Fz~m4rs%*v0tEypb9Xv|YFSX5O9Eo8 zqX1kUB6q-}`GA5)r|W^2AOC?X_X{4~ycM8?*&X`9qm$(#xQ2iv`VTL8z-m|{!1BHy zJdU$K0;>5)09t(vYL9^0Ssy%(yS@N9+XGQSe(=cleE=_??Lh$#YUhE9|6U$XkAn|c zx<xoTuQk78=?uNnS$cuL1vKdd_IJ1ImF5?$ovvs2TWmlDYy|@YgW-YB<Ax_aK<>>h z1)2NFqq|4}#P`W|ePH0jc*vtWNW-IB=*0w8aL~SZ399nJ9)mi>qq_psG=V$Jqq_hU zP)K}G`6}?DADRInbtlYc;1*L0XwD9lOHs`&;PB`Ueeoi|fq|hD)C>YQ!EZonP|_Nk zVE=;&NE-uO4n26e1{5Wj?V$vZUfXP628I_B4q!hc;-R_r0|S4n5-8>Ln*MSIWg*sn ze-LHy;-)>Q@cHu}Q~=Hg<?~)s8()xA?S~iQ5Q9M7h!61M15X3?0a61N){THRE}@pc zfizB-pq9rVS*`@Kyqonts09rwkt`iK_*+0lsYkErDTub;U^$Bys`elUk{_<eT_OHm z&j?OR$2`C-Dmzf9vHnkln@v{F#-rJGHz-}e!`l$zc6+GXGwl%Jtq;xztUZYg4F3go zaxyS5S{~$Y0ZoN_bhGk7G<bBg=75~kS$pEYfJd+CUvCD6T_B|%-L)q=4{l(1@zWM= zA~;vy1jTbVs~O1D2{YIj7<PgtLM;#Sx4A%Mwt(Z;!lRp22x9V%|6p~XhAPN(kaCai z+8toiXQP<D;U#G9*rS{EMgjxF{|OV=KxzC(bL|fX{#H;U)T7t*6R4-s&FT-aWCO#C zNE8!RytHIsU}&!W!N}hN)$tOdLl&+>9Yx0iXr=fERHk&h{_$u&l7OxLRe&^}Y9VD% zH>eW^D$mZn*kuEXS$G`^YLvd%0TKh%o6Sc+eX6uH%=#SC-vsv`Yd^d=3DVGfL;%qr zb@1qA{ox2|mWN&db;ZD4Ojwb3-1P>?xgM}u5n7ysQkqBSu?-9_7;T`fNsx11f~JhY zO-gXLwD!geiBF&wDY*CmwdG)a)*rB92;81W>KI{he}P9YYaYaXD?ECA7ZB^l<F23< z9jMa)Zu%d0-2(N=3MdV2ir2n?_{7{A*(Z{qG~HWz!tkWw0mse*9^JJoJi0|C!x<P} zJmCSQmLtuzM;Q2fT|s3z$iU{>BmenZKxwYq^+>1doR^?w0y}>H|NkGv0jcPAozr>z zMVlZfs7<$m%cSEk+yxmJUV?f69=)YIc7obYQ2Rg~7f=(gc7aE?=*BPxh8H<td$%;# zZb7wo3*6o<ovt&G?VSNGbh}+=bRK`f2eB8FEkT{=^8ySEFHOK1$#n;K_yaO50`dSj z20;z(PR1ANLf}M)H{uFn5A(}A!1}WZ9=)uJP9RT)9v~D~$6e2WLI&RLhj-Ipk+R4V zIZ`%(+}m4v0TC$&Ji0|&LKzrd_;Z6I<xF$!8Pvcz0}q@tovvGu17`~~aJF<FfANtY z<X+PzP%`U0{$dk91H(&D%)%>ZP)`!n0lDGPE#%P|x&z!7={A)N1%*!O3Xjff9^IiU zUc8hA@j(q$S8#_ATQUb_dVYCC{~wgTyFeEAh7wBO;3f;H={nv5ISBKxrfbI#28I`) zWgnfc1k&{s<RF{^4Z<m%$6u`D0|((PXu8hlV_<j*X_=PpfX5d~qP`Q%!0=)^Cn(+s zB<cysmQH|LI-&FU3rmQlYoV6@;$>iX*#k->p#Bc1-3)1ugR7$Bt~0=Ct+{pv6Mr+f z%mz1heP?uwfcl&_Ji2{nbcS?rcyznYfOeK<ygUnPP$<JP`Tp;qZrEX7uvaUfwzhz5 z6$1^$`~o=#X~YLx^n)`C^7slUzhr@o>ZL+{DKbNj?9HH{z{oElK@1Ep<T*g$PHuiV z$O8_6GoS`c=kXU!JPZskK?AB-@=Nm}4x|k8A`p~85E*8N6o^kS!=UGv*&vH)lwb5s zk%JI>ei000V0du{+-e{<ztn*S_<Bv>f}3l{U)XaK%r9#K7#LopgDoXDzi>h<Jp{G% z6c-ip3#hw+Kfg@o0;iUKsI4I&TfzC|6v#Q`<d<fUQPjvUPR7WQjXl4p_%krPc+Wyf zewoM#4uR*kpwxc+MGz;x{33vqUv_|6&z*?;(jg8qfu#HbDqnVhECz*FukQ}@IvLuu zgSG5nBk-`Q__*r^aIx79tCIPRkb{g3QlDJ$=&n8R!b=JiNEg6`E^^E00=yEw02)n1 zY8kD87UpX@kH5&_00)u+$gQ2nU+8i$FuYt2DZ$QkyI$#Zy#s2^zj!JMvg8DK%mUex z6L3pTbh@rUt}#|XEm_fd`~^G2l24#!aOd$CptYkfL5pm=UC(s7-srBq(_MPwg^(0v z*m@^uxvK|g3>Q2EDJlhO+IJp%!6ZghEPz_$nC<ZZk6zYQAnQT#(OC<c%6S1FVnAze zqqmRXk<ev;90}7Qp>zSc{a6cX8fE%0FuX8f0tFa>qJ9r@fbD?>*q+YgFRrnHV}%do z;?CnQrn50Hyi^C-2dX?_&3whD|Np=E!%jF<AcHL^^IM?s_-YNZgc|jqK61Fs0l5>i z{__Uae~d%~3eNW8K~|7^O+!J>2GxJ83=A*zL6#v0ijE{WJa&LntvnGG9Vl=x(~E&e zFKYzIqTbL4@VpC82#tDB4}&rle1ZfrGH06wni&I4i-M;^j=$hi01XO&rbdpvI494* z@WK-mxrj*=&@>?0cyQwzQ1*x0+Zp<x)Ax=~r|X4o-#g6@nLtypQxB*x@^3rQ>AS}R zGC~7dC=45$@MQs6$?5<quq|Cb@VA1T)?B*>Hjo1ufr9orUU(b_l{E~<UBR8?mjW!H zA%QcXK^>3o+7B;Ifr7o$^#F936*S-u>Z?FBfzzx<bL{~J{uVn>sRW*+0}mL3=5au? zXzU1K36D<K6&~HLD?F@0!_44uSroT`rW{^)bTYpD1c}!bkWtPDFG3+<w!i~CAJPgQ z%7$2_0UoyiwK5^2MJ*j5t-Yahj=O?VB50y_fk$`gh8ISloYEco!lRR^xpoc{e`^#- zA-LF_dcfrW3P$L-w>(I=*Ot#1oZ3{385nl?fol?89b*QD7xQ&tQ`lgwEualKpz!GC zXg<jVVsvtV0|i2W`sNT89?yb%@!P=zbKrn<0l5HTI%rx5WN0_2fqa1512pV-p_8NA z^-l8xM(}hbG!_pWcK{9NGC&Kjmo7{U4B!}Vc?k-C$b=?z<_I*@2AVknO_d<e9D(_u zwBXSVnTkQo9L)zA((O8-xk813zjY#%=g|#XDbV53T-(9G-%<t{5j*73?K|PPqY9{7 z?a^J^0h*WF!0_U$HaKH~CYB}~cK|JWXL!*L5(E1Jl#yN}fVjt9!R>U9=Gq1Z{uWuV zO|=a#TtIV}(3z*^y`Z@s2L6_{pn&S#3Yx8f_jbT@M4+Vz@Ts}$9^F$xlXNc@{Q3XC z(-l%C_vC=|LJ}Wj9t1L31sXl<Wc26;&tO5rv^(@nXDCz~C_=hj&+vk#v^!fvKphoM z1_lODO$O$5gUL?UGcQ3KE<nPrXCMgx6tG~H2WaLDIuX_lnfk&uE()0`gv!GfL4fDY zpws(c!_WvwR~%HgdUUfoSb-;WKJd31B0LLCFR)zyf>{eRe+Qb_1|`E6cQnDdAMRMN z5B`8g&Ki$^3MJ6s8J6)P<ngW_pcsF#R}*9|Xv_;#BcsfBb=LmzfX)bY*Zyff&eQp$ z`8{Y}_C;sy6aMz6AjkHyLW%(27aqwX9UhE_{y*~QW>o_XsDl&ThnJv143BQs-{9#v zP&)kZawkY<H>&`Ws$~$Nr%0+MLxh-+RDqJ5M>p$#BvrW(ReO+xzy(G(D`*)6B;|j2 z=?+n~4@nhde1~;5k`Q=8sGHRTNeHxH!lRot6(Izg2#7r_{r~^}oB#j+KlcCs|IPpZ z|6lO`|Nq|q|NmG0|NlSz|NsA>6zBN=|9`#z|Nq0sf4W&iLFT~f6mV){1TEI-cKrc~ zFqH5It^Wa6E}-JQ8dOk#q92q6L2mHqbp7%29LQg=35#w}d#U!uiw)pWc1TTTqyf&( z(78pFg*~tt`Um*d$AHQpj8#LRaC%Xs4oWy67l9L`H;4;cgJ2GF79`VxN)XV9=!;#9 z(8?IH9;x=l3klHtB*+)w$uQ7BEi7cfD=je6qet@_1#ozP*7-n8{|vGSq!Y3x0k$IK zIz;#ZDEh(kZy#P<REJu>3NGjS!o%88g1;3SqL4wUm2hbX0r1iV$b=iHBlp0gxk7+} zzXhpy2F<@cfK049g68Bv%X=VVo!~jS2Oh^AKm`N?c<l>hIuEo406f<ND#IYAgS0;I z0P!KycMzw@Av>kh^}$QI|NsAk3ldmc20AzlTi*c*AIR7^XuS-0%pO+r{qSh6;9!9J z7ChPW64cWK8v<UwRSQ~1_2T~p_&gAJ;2e2;0Tlk=wP+sQ^&FtMcmdjkwviFk0`ags z-r@TmI;{#?&I2~HLc*ihbe=Y76jBWm15*xm_`dIQeGh6F9q<5K0b5^XI|o!G^0$H- zNiQlvwRtCN7ihS&o3+`AfdM=jiPAn+Xs|sA8o=Uj1y3vY+U{{+V0f`!6=GA1Drn#- z5EP7^t}h@V*K0cyG@b-XGo7q$Al2=l>BDZ;Dv&VPH6FdTrJ#wui=Zsl>HFnHBv?i5 zj~6bg3=C-~;n8gS5VWh3zcm(QOE0Sn$dt~59=)PnW(*AbCV*Pf-$4Q80a}m+8VCgi z{EHU`stgRrSr<8i_GEz?fweDQ>{Wrdx)+=tVOa^3TA(gxeGVGgLF5t8qz2mh1W5S~ zo)@VXc)_Xy%A%mM9kPC{@eODJ8F&c;NC~Ka1u8ST>oq(&YeCDaJ~Y=WF!HxHf(sDP zqBhW)Jy%$+LQ3~UHcMdZ386Yci|s%wF+jCEa)SoU2UTSr-K`)tbjTgFTA&})u;{Hl z0Ga{t=ndU~F&Yl-g1@+^1PaE`8_iXqr39c_!SE8enCz|)@aQgm@M0D-1B2luNXxeN zf=74hiVX}e*p<P>;|XwMw-dBh2ZV9Y;DQ$Oz>32Ku=+h26!oCaO*g2>04+9hg{(p9 zb`a?H5NLj=0O|>}fMOCdebozEf%FpAB89AsYz2vVbVDdmgAO#%+Fd&Vw6GDJBcUr1 zT0zYikM7zFFF3(I26bgiK|}5vUc6BR1%WGQE(zAw1C2XEQct&Q2Xwtq1HSUU0cm=- z0p>wa)PPNS30VeF`{2bHP!d6J=Ybks&?Xsd!4p`hm-Qp4c7U#d0-5H~4O#QlYdZlf z1DY*UR$^f2Y;}Q^abOF<#U^yMQuAI=1CoIsG^GJsoeF6TQnir=E)F}7zxV{|4>leF z<ru_#AY{EMDD!mJOT0J^N}QnOeBiDfXs8=h&Vw@e1#t2PO&+R&6BuN<EvSd!(QEq# zB-ZWw!vnOm_tXZ47gs@6L6-7@N@)!S{uX;kn)(4=0@iu_MGd5`d;qFS!O3|lM9&S7 zz>5VSPIv8t7t_HESJ0YW(2V{I4{%M&FAtl40=XYNsL~nwq`CG96MqY+er~RP!pz?y z1-6oP7ii%NqG<xEpMAkHklNuz6R7)eau=xE(ENkJk$=ho$A$-tj{MsWfDDB3UHP}2 zaIrkW?{dl``R5B3d2lE|7DylpFayxs7)p5#av!+<>I{AJLgE)_=}Lvdi*Bg)7i?e= zNXsS#A_yy-K>LxwQ3qOY0;zmIfa~v0M~UvxH=qi)GXT^r169eO2@X(HJwOc~P=N@J zN=TCcRs`39z3=(~Qh~OBP6&XMEa0pT3TM#jW)4`b*#KHMX#~;pfPWuH^UoScjRtZ9 zbnXON8G(i$Ad7GwygUesVQ{tN`r{?E_5T6XfPsb=xPge;KJ0|egO~pB=q?igPfml@ zKSS7{^{_8ItV<v8H-l=F9iWkdPS-mxLG2O41K{B>&>|L4YVxrB#P5Ev)Adfb>m5*> zz~?Iw^$93!x@$iicL#T0U+8@O|K9^VRgO|0Vp9)FDKGwf!KxlKzh0}%z+iZ?^Ay-c zKE0sHK~O`s6fy7zAJEw*1F0fW;|EeGxq|W?B!wkcD7=^`15R?FRcD~l4e&}mP!6$_ zg&5HSZH9h$0cxg$)=Gm1`9KYs7ym(he9+=4NKxeqY7il<P=>eXA?+=2eggHSAnVR+ zU%WW~?f-vJcexcbH|Ei63a*E{SuJ!x<+H^LFObt<i3_X*6z!07s{t<Y;MwoRk<Z{Y z0x;VlRX$>V6x1FAt*ZS1t-xP+G}nWQ4}__p6;7b~4BF2CHBdoAF+W~{>X8?z7{(*7 zZ|=1%P-b9w0jjvbsSk7f4IbYw#6g|{CkW*BQ30gs16mml9vp*={XmwXzx)L8+Dipc zT>=^TfDRaedL5wUYmf<hNTulunXm^<KpH}dA5b%)yYx=;GsfnB4E(OAI(?5o2fw~R zavx{`9Vj$FJyq~f3=1e$T0rLnfHQEX>ki1`PjIt76td{-7<j#5x2J|jcc%fUfbR~y z;L%;B@gLM2+yGS%G8O999grg0b;rvGkQ@ve9NXd1=?IF-4d6wkP?Z-vx+^qZ{DKU2 zLKgzIK-c<#mPvy&LHZfppqU6zxpf3&AEeyc;c?snR&Ie7CH#2#0@S)){1F<8x4^?2 zcbXr7JvsGY!^i&(AOC+lh&Eov1Zp+(ntqXIVAz!go_pd2H6&i-OTos=K)J2E^g(y% zkr!#8@)oqf4LqR$I%|Xh8p5DL5FDgTpdf7pg&n9-;?Z4t;sxkD2S_^$+!k2?Sp*GA zgxGhcU~5!C8)Tq{8K^x2OaBGnE&w9^W3ER8?E~p9;{fMHNSXq*fea6T)*gel2>AZ+ z=q?m^!2ub6hV_eOK|xso$qe8s)uX!<w4~v~3sLZl%9WQ@;3UO51=ODg)!m@QwB4N+ zkOcC>qdQ2zqw_krMn42jDKL|5!TLb+L$xPfh=FVXt!V77J>k)L?8OcVP>BHA*$~9x z(Y*<@_{O90+5i9F|9f<Td7Z9D5bYrFazNz#+5E=91G&5eHRd~yy>I|^I$ZBGgBJJp zfY(Ge)`E61H1PL;hcg;$K`FJKzYo;SI_~=C=l}ozA=4I+PBlmvR9AH#1QkZe<D}iL zcRF3cqfFp-1!j3*0P+z7NTX;Is9^_Q5b~q5_6cZ9PUra-#vl)a=8{Sube4YTE`8Ej z`o$yJ^@+#92TYyEI!j+1cYOoeX9BLpTyJz1aCDb`0WGWSEZ_m{HR%S433Qi&>hl|& z1tQ(0Px#lDKJZ9B1~LJ(cIP5!5)iUJ2c*xVoA)QUxy9+x9s0w=5|oKA@VCN7$07Cq zi!N~n2GDQ=+W0<t`3_1~-P@qC1Ulfv161&|_(P)j!;60C)YpqJ5Cfbsz-uBQ!3wR@ zq5XVD*f>6@I)1?`1{%(T!~|q{_#e>fDA0HwxJwG@zk%G-%i0JT@wNtK<j&e3$6eom ztEtZ88yH?Z6=Psvc74<7`sTPRs1Ri6cKzbf?fb*pk%PY%G|mni&jWStK*Buyy+I)7 z_nLkN^&Wazl|iN_`@R9~00F0S&hF3;-L+qQx?O)b@~^MpVf^Kje8{O=q|pOxV=>&u zZr2as9T6X1&I1*My{1bcCSEjRVDNyN2-f0&q~!}(%a@m+@iLEI)}<h|U>}2{18aOh z#vedq8=%UCA6Ak7c=1aVT;;z2SLD!21K!Yj0jk+OI*+{o*ZVLlP}@_W`~+&}K*pCo zFz`dFipJU(|NsB5=Whd*BriY*|A3o%kkSRTk;xFcR2j4lE%d<)hM(Xf`39tlWqJeQ zfm0)>H4Qpq#iLiW6WmmXHmc8xfSnGlmCwHhYk?Jdu>En(wymb%Z3m#)3Xfja6}q6Q z577XSL7<H-$6kPq?qp3j1r08Qn!*MbSi?-ggD05z6;ysg+Ap1<puPoo0LY^|^udeQ zpi}{x!h|e+1GOOGKG+751Fh`_ts;WWjf1y?`Cjk<CADTy{~O%f>1F_LU;*t`0S`a5 zK*~ec3!s)QXln~d2C{GG0k}T}$~7&ZJb|tq6m%fXu=4N(v?+b!Wg{rL!TR4ICxO`D z9T4%Lk`0_Ypv^6C4*^_`VozV7{T)c*0a{xMT4xB_7zr9YYk3RuIdo9~I5<FKT+J^) zdq+T3)dde`*ApHG!F<prgc}fF9suvw0gs2ns(tX*Fvy;@9WP9ULG!JUbt|w91t?lU zeg~aa1X<n)j%CPP9<*g~zys=rm!Pp&@SOci&_otkJ-C<$?+<`<H6VRaa4<rYgZk)T zE;z`oT~F}0!S~8QJqg-b0%===!}S%Yfs7iY*ym><?L)}=TF86@sAURmzk#CK<y7Yh zXg>lJBk1`Nls>`z!Q-xPK>Y}CGaFpZm0ozk1zLXDU3$TT@ff(e2aP#)y52B6&~dQ2 z_6<Xa?|FV$pZo@>Q#SQrhwu3=*YofxM9?8oU=KpNSYSmh+Mp=zcD(`Xxq(9zG)@W& zq8reJcjM&=aKZyELWVRJK>f`Zpq^i+>l@IftOiR4{uXF$iqIAF|NsAP*Ef*ejws`I zu(Ah~7dw5y9s%ul@URYj(cycYzXe=-gZhltt~dBWzPaAzdL8Z?&{#Owji3Mk>EqwW z)cixC!}l6w-zT`q3yMCF&TCz+*Wfy#sptdLV;^4bg5?{iQ4e57U4<L<zys!pt6i>F z(T#clHR=J_D3Hzk`#@8p5BT>9SYG4@56pr)q~J~;#IZ)8a)*DPmE}Kv|AU>be_nzH zcEKJ3>4zHl0n{*ovLC#>1xkmI&eI3bmN!tn-yQnEL-V4C<_S=H0@PLkb!cJZADHQp z8PxgcF8y)bO#__3z+D*Fcr<jr0n3=cHbw@99iRibI*-4I;|I0kObg|}WjJ&^0Mz1R z2eqHTMSz7z^KnLxP76>a^kM@av<nJNYA-yFJAkG@KqC^MF^d--@bL>!qZ!n5d)Wy} zmA$6bpw0u>!xk@MK?^EDjiOFBP|&`B4o`rFqj!M3(s|qiG^5b%$pP9d*L;Z4qf_vO z4<Bgt4p;(W$qNtg0BPul7v_ARQs}`;Xo5v{38>d702wv}xyGZ{^cSf840XsA(2`Gx zLnK~AgE*j^-2zHgFHAsOkUGqH5OB*BBn6tgf%kYJLFORg(d{769U#yd`lLJbN%JF) z=3fjB{8NuPG<^H-(D01Wfq&aIkkZZo1=wK83+Oa3NEkYE4Pqj7n?N&Ouu2uwlg6wM zLH%iPc>@}D_2@2>K#Zw?##+i1ARX8iA5e6F+zzhP!0R@^c7e-y$a-+_o;Jup1*Dw+ z@M1bFTS3%<mtVYixe`>0KpP|&<=+laa|N`<9<6Nf==S~K(dm1^2b2rjz_l~9JO=OH z*a1pUorgSnLEHX7TYbMn5@79xV{Gx@j#}rr7a1T=fa}ZJ2QT)5R;_|62uL0R4Um8E z(EJ3-N|q=1QEdS2+X5TXUHaff9Y`anz1|7hfe+rz0Ncrp9=@>gD$v{%s22n(=Rnz& z8MN91T+c#El@{=bdM~RuIJNse=o0J*z0SX_^m^kn(Eh}O|5!Yd&vl7#fLgX5o#&xm z`_Ul?Qq%m5A0`Xhl7G;n`5>c5r|*vrNY@(VMbKPYKPc3}^RCF_6_E0w*;WU%5{JJP zw2j51*EU8RlxbcBfV#__tb#fW3@=JRY;ZCMjgGwV1#yqFegfra*m`J>Zq{d@l@j0* z1-$<n)V}OxH3Rifz(H~Rg*QlFujy}4f1y`&J0wCtW!w)?U*;)z1`M{Tr3JjQ3|tnq zfLfg%y{7*_`asnoXfv8J7byQ;c?pVESg{F8@vsq6Q0o;Y4w_(u)aT%ghrM48ny!IO zcHF?63jnvP!2LkP__BjXuc;o$Q6T?;j;s)acmd=k=wRjx_<BB2O$JKF;1**f$nT&W z1sVqfH3~s(&u-Tn%@v@r7SKc<xTXg0rFI34>Vam5Kx0^-g!rNs7U&2M!XkPqEYrQ1 z@fh5!1~t@9KngSL{yu>;2XX@HZ;#`we?g7_xe`zN5z<}(HAFxSL&Veoa@d2$DM6LQ z3w&+>mAJ65hn*7v_8Wo#w`D<7PM}4?kj@CQHB^gYh;Kk^!eGIUYz=5^l&la%@(3b8 z(aS$Xc?>EuKz%;gJO#Mb^#L@1{Q@*14eF6W`dgFkfnyn32!nQhA&u9<=NCLWLtnfA zFQDzNP<WvQT65Ovdf~-XQ2ch+UI29znIVF(?2`?V`tTwjA`Y9|1W!D7*Mc^j{{S^) zUW9_=Av@3?cyxvdfZPZkWbX`<04ad76<$JTMIV5&dJAab9CTwDIAkF09MIV)$mNql zgY804F#w<Mo}$jc@M1q3v_Sz%p`cv^pk+4Do^P*hA$TCh^@T?#YaB>5XqBo*H){|` z7+mdm^xFEWGca_5#zuaC=DRaNjsfM~5H`&D?wz1PNceoW49FDle7BY)zWHtkHc*$e zN(0s<t$p$0EGxv-xaYg~gGO#T;fI5Os%(_@a`PKVc@1)^H#5Yv7Ey3Kfr@_67zYSf z2)x(|S{w;V$eqVuNP^hlLK(e&YJB4WT9MhydIGc`tebZ~s8`<2393CjI`_W#4N6#B zAN>CRzjNvx5T_f=0Y#rbD`;}L^WrYhA-j&97d(3Ret@U|>*_8O@agUaF+IBj6*^mQ z{Qm#{#ZOSn6I_LWx(pt@wh3Tc!Dhbr2X+X|5U`!CS3tU+g4Wu%UH}{33NjHqeGFRU z0?~LBtkG5iVOD4B8IZ;`Ac=0%*TSI2su_4ov*o|e))T+~|L1Q7jZGOI@Mt^&3V_(d zFDh9e17fK8vGI)o3wSr}!5t8P9`NX$3h}4uWT?5|R={46gFT?Z1DcKMhKkfHcy#Us z`5rV_+C3G-dhro7h6)Y`@G9Y6+c*KxxW-n9!L1OZKn+5H4Gb?<LDm<7JpK~YmGtPf zbp<K!Mp9?6f#F3HLY+r9G@N+fgFB3fkw9=T^0$I&aF1><$D{EG$cwRuUz9V0LVyJS zgUvScAjAKl1dHtdR#1PU7l;2riKY|mp_h;eTO^NLyhwcpN~2(Dgtvcy(*kkcZeU_y zKq@aG<u7Eu8?xT#^Y8!v39k34=3`)Z5f5FlhG)Ic8`SZZPTw1#)zi?nEoi|5=rAf! z3)rK(_Qne-u-{#GAdm0ufEAXYDG|_+%L9*t4;aCRoG`l{@UV8hfYx?}P8Oc<=!CTl zPaI<aHHjgI8G(kr0zh+{kXaAVdTG#VH_%3G5Ac)#Xn{3okN%+-(?RLB({%%Q>oVvx zq+_6*1)he4but2C4^Q~7+91Hd@L#nFOoCQ{{8w!Qvpc|K7ntk;lYL-v0+^fxCZ~YO zX<%{&n4ASB=YYw1U~&PNTm&YUfXQWGas`-N1t!;k$#r0I1DM<dCbxjeZD4W-nA`;> z_khWLVDbQ%JOn0>fXQQE@&uSX1t!mc$#Y=x0+_r6Ca-|WYhdyQn7joh?|{jBVDbT& zd;}(+fXQcI5;XDnU-cE3{RT|F1Ct-X<R>us1x$VelRv=ZFEIHBO#TC9Z3drS*;GCT z2FKw4s-b)g3==>NWQLc|{{R1<0qV)TyaQqxgIbW6KrGPB3E-if43NT?`#@r?AlWS- z);thv6^I4eGW`;??la>eNNgHN>>Y^J17a~TGBCVs0<pwEEYM2m3~dlA4<zOUVx@ps zkswwSh?NUsfmQ)!G=o@fAhFpXmJNsn8Yp>b1Y%tQiD`gXpFk|oqQDH$=`AlsKw_#) z3=A*1Kr9Ckivh#}9TD^L+rR(+GYUasZ$PXr5bF_$wHU;@0b=b0vCe^5_du*8Al4TU zYZr*c%gn&=as!B^17a-$v7A7xIUrUXh&2hsDg&`PK&(Cxs}96k4q}ynSi3>2ED-B5 zh?M|hy#TSoKrBWU28NeDAeJ16<pg3`gIE?IRs@Kp2V!M`SSlbEs9Jj|1!5foi3xyM zk3cLo5UT;i`t$ey|BUG%)+Z1PRJFc*0b+@Rwx-+zu~b2<D<GB;h;<6Yas;ssfLH+_ z);16;9>iJ$V&#Kai$JV85NigA)eB<vfmm}utQHV!4Tx0*V(kI33jY58|9|!z24*QO z2FT4GF`#}FsOAHuI}n?JkbH4TQE76CLU3k!UTTVGUWrp_8Uxb#`V8Qs_VtqUi&FJ+ zOLIyx6N`!xD;3fbGjmc?6iV_HGII;^i%J-R!#&;O11df9ic1pnl2d(COEU6P;{8&~ z8PZcr;^V=(;vsg$$1@<?2ENN6zBsi6i)cE!XmLhjK`N$Vh%lz=lA_F%)M6~^p%Ne+ zd8y^`$nIeX$w*a5&d<$F%_~tz$%ozWk&>E|T9S&Y5?Nb3=(3U`biaYFC@4xz&nzxU zEn@Ju!WI_({#GdFfUb4`yErpXAr~Bs3hG!DsOu;s7NwVh-D#+hpQcb!S&)jVRzXXh zffQqm5XNNYm4I|Z;}vw#K)iE)URi2UNkB=FV_u4Xc^)KffUjYQFE2_g&`YkUV8}1e zV+bzKOb@8^Ps&P7E@1!#0raW@g_P8i)Z~)X6oo{E+|=CsqDqCF)WmFrrK-j1ItqFD z3Mr|Oq>^8xkd|MXm!ikTP@0#W2Qu3RWViyvY!r<Oi6siE1$GQ6nZ+P=MX5QdiN&eK z3i;)EsYS&ZnFV0g8L0{d`I&j3=txX1EX^!RWq{InR2HR{losU`>lde%;8B%WP>`CJ z!T_O)6%zCEOEOZ66x2&HGK<v}@*$y-2fA<vYMw$#Mydix08LGNd{JrvC@I0zLG&ts zL{p1X^GXs+GV}8o97{@4a|=p9nGj;9LZU)mex3p-fZ(AIvYY{13Iip5yh$THwS>qN zhMY$HQp*D%;p?B2#h|E>mXnxXte~a<R^t@v=@a7V7atN3@9F0mqRD`s_96KgR2JZJ z8e9dDZX?MYwB#Rc6bs5eWr;bNDGGU|IXMbNscET2sd>q%3YmEdWr;<ZiAg!B3hH1- zse{uOI17UE4p=i<z=PGr;|qDX3L?FS5rEKw4Q~)4)DUS4&OpR&64}8BF^-skgs8+H zln6CMdeh(E3ZpVW@;bU44pTGpN<gUwUUuWth8j}p4E|Qwsu?6VV3Ee*4CE>URFI=3 zMObZxWHz!6SZzk6;f|n2ffW~nY6>R<7ejGrQBi(+Vo7RhadKioDnoohd~!x2sQv@h z1@P)HJ{}Y_@eJ{h8U$SC=U2wZgKLcVf|4RD1&~%`XQ4C^6toyX#wuumRAuIsFo3e1 z7DRVZX<kWYZYsEKVWJ1B7~`SEetdFbL2+qLDi(DNSk*y_(}2X}?9>znNbLjRC@>_J zC@|Qeih(MjV%1_aQILRYv1&1-#zb#TF~mCt1vy5>I|g_nF%|OiOCYr$vS4O0SUjN8 z8R89Cy@D`8A+uP)FVx2eUeD#`r<CS^n=}QPphjC_dSYf?afyPXlcz!%<a!_lg9_CO zg{0CF1yFqf7tK#o05|_YMuJo@<l-_afMlcG977y^tQ0UzELMQl^a`nYDVd3R47e5M zWR{fVq(ar{fSnI-V5DTGfs5)AsB~UxaWSZc08JR+rZJo_Ff=kYF*P%{uuM!!PDxDz zNq{CjK@%gO!;)1%%d;3DcTs`(P;TIa0tN=qop_)-qd@b^p!@7VdO`dGYX<QBaS2fj z3_d9g44?xJco<k2K;z3GH45qsj0@Bm7zErH7(u6`g2aXjUXuuM={6{R07{>N(pRAL zJt+MGN`HdVf1orQX#50pClr*Hg3>BbS`SKFKxro^?E|I5pmYM1&Vte<P`VCEcR=Y$ zP<jrOUIwK%K<Qmj`UsRh2c>U7=|@od4V3-{r5Qj|j0_A6Tu@pBO3OiM4Jd5{rEQ?J z8<Y-!(os-41xn{Z>1j}U0hF$Q(oImh2THGk(p#YPJ}7+xN?(G~ccAn$DE$FS|ANvi zpar=M3=DiwS^`QdL1|FlfTRFa@&GvJFff3YG9b$=utDbGW<LOJQ~}+C2RgD7w=xoB zK+8WF7(SF^*RlYVX|YRzMI9=^)SxGD#YZn_<s7u!LiR*KG=z5mN<(;<<OA?<0;V`F zkq5E3WMJZu_&5MM6A~sg3~5~Pf$r4?Xnul;gErNGumNZ-8BCA}dNb6V4WLO32F$zl z&O+rcK;_Zh_Yf*y0IKMql^e3P-=Xpfpv8h%<atvessli?iCE-SVDg|Np0UVVL**Ml z!&q44Ltyftg%nuibD{DZbRq75`L7NtJ_SlUfJVl!=wAVq4}cb2F#QnI7#Q|K<qJSZ zDqztMQ-_NV0Il~2U3UqkH$Z8adQcM++K^L7PAn?QOf6PORB+aJ*49=4HPt{PYVhV9 zOw$0;4Mdjb1LZ_p=!Lu&KpVgr7(mmDV5hi1#nYfPgELqdE)ToNcMq%{gUZ9w!vv_l zZBY6HR35ZG3S`n=sQ7ItT>v`N1<C#gQ1Smz8dl#yN<{_+4$vF{$RGk(p$4J=)TV^6 z@RMB7dO!+F<5$hVa2|9{3IhX!CXwn5pz6$_G$HdDpyj^<lx~31FnzH60^^fPH=yM& zQuU+fPg3;{wfsz~|3=l1hQMeD&@Kc76&EljI5-yw6et9F76=qb6zpIu5D0QE&?rzS zXkaQ3D9{LULW7RMAQ87<gB^?oGZ=#$gW<41p+F<Z1q6c~3oHsO0vQAy;^6~G@gbE3 zsSJUI0uw-jt`*7gjwK~UnMtK3sjfvu`9%zHaZi7A0r1oxx?o;PY6Y5@FL<s8P0+tA zwJ0qozZ^|C2r_bqCK_CsSCWWsEab{*G?gIlpb3Q~=9Hp)CMvZk-zBpw6LdK?l5)tr zQoMU=UTRThvU_R?C@>frcCaq!U<L;S$aqMQHEaMKQ4DIXGfr@bj}NGf_sh>q4F*rA zf&vX9QsS9gkdq3Uqf1SJ$q6~c$H%8vRKypg78U2`CFW$7RK}MXFia2zNfehPCTGVd zXJp5xmnIgaFidbrsmw`<FD@xficiYSOGzzaXn61sWbgm~{~1BoYBLlrU<600V^Mm1 zKw?pGYDj58PAbC$hQbvHiO{@)#N=$a%m#>zQ+|F<yjxLzu1|hmI!MP3h&Xh3G2T73 z#5q5&1T<?kfuZmKh9q>d2c+`^s-!14b$}!;ph|!yg(ol+-ar)%MzQDtMA9WQxg<U~ zwZyX|H8;4VC==qu7Z6F;qM~@`oYcf3kR2ZoVs5D=$r&KAA4p>PMY)M3Ai)MEa8Q9X z`{hFtCP=sgA?%-=Tv}9=ngSA@fDjHS0*x_GU?`k{5DQ8zF3B$fhx7u3XmDx?!m%q5 z;^9S^C8?o#MTwckpm`&Z`5Pdzkg$q(OiA$tkFbKIcA!W>R3KyzKxHxK+b1v-o`6V# zqBP#I7({^#ynrMMit(`g%#?r<aOmBDNcpDb#s?*qyA`E^z4QPo3U(66agf{rGV2A3 zlygyPVo9nINa6#EgnMcUC<;LmKOhniBjTMCb8<kU4b0%!KoWH;%}WMNZ~7-?ITocC zgA{e3D1y0e0*WXstAgSOn*<_47NAIb=4FDD#R^o>V%S0kko_Cb<U)!{!Qrz5Mcg+r zCnrA{r2YVkcrdgO0mTbM0-OiIYa=Ew6kb3UgC=#5Avd7nl?AEsL8*x;l_0?f5W&#A z%;fx(RM3QcG9*>MK$UPw1<8koxLJU7eL$52#l0ImKm5RyM1)lX3pje>T~d>SQqw?Y zb$~?TVbjYnPfTC|6<wiu<(YXY@j<D@rMch$ngJG$Pb@A@Eh>pGD#-(xuz&?z{v}r= zLJGL}#3axH5>R1<Ap@PEpTJPK0bLF{zYj8T2gDjg!3kQO0+KiYl1M8kEdeK^6JQ=R zZC?O!a^X>S1I$g$O)h|hGl*LN%J5)MzW{NI5&REeeo0YsZUM-eA22RNa|5fe18AvB zPAb^H9Z+r_RP_WnAEJB)lwS<aijYPHV>|;Z15<nyg92ztO=d|v@`{{Yj0{YM3{FM{ zX+^22(3Lgd6%A>L$*BQl!SM{M85x)?84`@Z3ZU~{0p{_LWdsZx7#Wzb%p(RE8lg<J zEn~#8S_NUsRz_xq16mBs3?D$m18oLoh6_3%u08|91&t4k1_cETObZw{FdkrQU~6D* zU<*)Kz_@{V15*PF1W#a|z_fs=fpG(;!38D*5IZ5kpn-7$qrw5U1B?q88yGh*CKwnT zU~FJaP*8Zl(!ex<@dD!n#s;Q@1&jd`m@Y6md|-UQWblC*B))(#;Q?a<(*>pgkcJ72 z0SlNKm_9IqPLE(<_+ZY!pu@nzpvK0)Ajb%qvjGLP2O9$eABZmw;xRDPLir0oTZS1J z7|uia4?x>r85kJe!uX)W^cWZzwAms06QGki4lq7+oGk~+hmFh4fbwDEa7Ung*tpv# zC|?0O&ZfWtF&{Rr<`3gT$I<GbeAu|zdKe!%PWAxGhmDJIazf05jf0s&`LJ=XBq$#? z&eaFye}ImAU4-%%fDXW6U|{$S<zImECAc8wD}e3{Wnf^?f${^O{9q_Q0kjp0fq|h0 z%5MN|dthK-SPJDofbx$+`3|6SO&Ay$u0#2txiwIXeSq>mK;?P4A@;+@r%a%H*!)8T zln)zssfY4m^8g#6d<W3BM+OFlJ5c@sD4&A|VtxU1T*(y5hmA8uK>4t7r5Y&T06I=I zAIgV~8y$u6VdF&4p!^Haaibql{s$;uiWg$P0O-aP1_p+3D8B%7A}Ip{!*m$m0~9(8 z4BMf622Tk80+fFN%Kr%ECwM{RrTHM{CqP#ZnnL*pp!{$sKLNC3k%57s1j^q4<*$J9 z4}i}2Vqjo+4CM=e4z*xlVE6~+2SEAa{1E#bKoh163=Gy#{sPb`iwq15*--ukD8C=d zKM)LY?;a>WAOym{4dp9<PLN?>VE6*%AAs_O1R(Y)fDZp<U|?{B@)^P*`m<pC2nZjv zMjBi`fcBFyFfg2k$}fQOK`Vtp@}N0hkPd!9i1`mdhsJ`^Ka>xfZwY|%Ve>9cP(Ey) zWhIOcokuwj<zE2ZYR168@Da*409{hcz`!6R#K6GE0-0w9*{=%agXWt-d<zhtje(&c zAH-u|2nX@G85kCTj-6m&V5oxf4N4&Lb3uF_28IKr5dIM;A2uIx4a&a&olkoQ<-_LJ zWQ7?R_;?r?6rl5WAy7VS9xWHjSAdSs)kFEP@xD1wK5YDMBa{ytk2?zGKY;4L3+2Pc z6MsSZuyI9x5r}(W<BQ5r{sHKCV-SeX%fRpf%Fl%IVdJY+P`(3nymc0o?*ZlSf${^O z{C80P1JDja1_lOkQ3eJ+UIqs6jzR_o1~n-E15`c?#&3j#cNLWX1InKV<uf!v<j+9) z98mrnC|>}|=M#h2CjsSy&PD;*zoHqUKNBjy0m=uhW#DIIVE6#7|3C*5fcOtU+nzuN zSb+`*VPs%%fbv1f9wZ+CQpmsn4t5Z~04hHdGB*MnE@xPc#@~m=Kaa)-9j(O(+0+Gg z@NYDEUWg>zd>J&p5gH$~FdiZVHjW_z!h!2gMdKHt@f*<ipaWPTLJ;#7Ksa#o)}rzE zpz+V5@t>gaf1&X?nZSVoH(v&guZPBWMB{^&>O+i#xHk(;z7~x?0gb;9jlUU<4?4FK z+587+^54<;phf@4>SdTw{bzv2w@2d#qw!PG_@Hf8$mX}9$uB|UZ${&vLF3;;<9|cr zv$CMNUkZ({jmEb@<NKlUqtW;|X#6TPemfd}CK`V|8XvTs4>^2pqsc!*<9|itv$CT4 zS02KLPebXW@ogb|P%#5efS|1pj0~Vt^ub()R5bZ2H2wq#A8!64G(Kn}CL?5N71%(~ zrU+#IAvE=%TP={~FQLibLgPP1<G)7Ze@5f~M&q-vfx`>#eqJ=bC>kF$?GLJ2LDeT{ z=?SQs1656+>IGC~)Pv@b85kHq)dQ%A2NmO>6Hh@KirN?$7(nL$fo{S8Z9JX^Y7a6n zFn}(}0F}$L7#J94GcYiK&h47Zz`y|7dNiMbfdO<k<01wIhQ$mF3`;<5a0Uhj(E0hG z?aZLV$v{V#gHAaImF1wT7uGQ_Fsx@_U;y0<u#tg*0d!N~Rt5$J&@oP+BL_fNK!T3s z-_5|lu$O^>0aWJiXJB9e9esO{fq~%=0|Uch1_lPum61mo7#NN*Fff3w6#?D2cM=?n z3=W_(QbA{wfUaflW?*0dT{PFrz`)SQz`)SYz`y_+^qk1Rz%Yq{fdO=|Kj<_g(9MpU z85kHq8>x0NFfi<4U|<;O;i<p?-jahheh?oYWr$;F03>Be#Ml5>9p2%A`1mM10~GNA zm1twtP!Z%o>iB?4)X{0ANeiT5X;e|zcr=nIWatzW6tF>U&<He=0;Hj5BvH^vKS&d3 z026HtIzFHhG=2;je1>u$qs}l6WOxnAgO4*q`S1Z|C?7Ji4CTOvl%ZV2STa-qeGnNW zj5%oo6@^XNz_{QcdB}7JOb9Vu0~LXciK8e&ovMMVLz$?7iXl(az=euSQgcy^1BEP# z0MY~vR2Sy-3@9aooevs_hK_?H#2|5uB#b#O9v@H%8VQew4v53JpwUp+NO*ieCGrqB zh>Je<jSzzkdLu+&quq$%QSdM~Di?ix8zBoG*hX;C=Ae)zAhS{!BG7SLggAI`8;Oe; z)kYQs4`(9;pySvG0oVX`d_W~)<QmR_4OxQ(5M$La9w@3onFwvfIzFHhCW16njU)<+ z73df>nkd4Puu*By+#7TP0i3ZR6L0XTIFNL_Up|(JxcGR~5$pJP<e}>L_;~a&YE&WU z;53RLY*ZTi1Rr=;1#ET?JV=cqk`A8li-!zY$AboM8RDTs)bY8HvFUi|Aap!zG#WI} z3>sJl(*>0bAR09A45Gm!&JYGv1~kTuF`Ec2%=5szA0Yegz?LJ%dgJ4xe2gsp3SgTK zz!QehOyiiB;*wgN3>tS1a4UoBab*B&G6L`W3aA9{A9TyCfb0t`4lpzXWi`+qQJ2)T z07FyI#*p~r{Ji3l_{_Yt{D1&M6R;52O(2nAQ_x0{C?6w3u!*3Qotc=ES(OUO^8sZL z`z*k+Q2W4hI5|1aAY&8rN{Zo*!?X~r+t4^3vYQn$s17yK2)n-n%CLCX6ly)#W|VEP zaJz#IpdK-e2kn^zZDB&+9*e2g9HJI^d>*{D1+-6;1l8%OC77x$u$T?mhE`0Pa%`p> z8(=fN1imd7!#Q|0V6(x<2x0?hFA;M1V3=$K4RCDD8`#_kJaWt+h9VmX&Z<T6@mLH- zQ3gu4usu$gYEcp>`i5G#@_>Lcj2w^|kO@wuM#j)Y2F_E#sU_g5)VDYtq1!tdq7sr< zpt%983{)ONj4^~|&3I5ohNg8Cquo<WKnvMIGBOc42W+mP3D^Z7vz#+hld}W7lQCQi zQ3x>)tT3^-1g0oC5thx%pnfv60NDheRfL!dixjX?mJlm5GK(QjH8e-j0V*dT5=Mq7 z5+J+%^O92`l4!be^7GO`(_YBimBGc90g4$Zso;4+c=&=Hgk}_IZ!T7&Oi+v}%1q8k z&d)7KEJ{UF9c&N}jTkc&9iR=hSP}!o4bV`jEJzI~N-Zg=^h?Z54e&-UJHcv=Q2m6{ z5n#oJmMCt3Y^g@|Kbm>aP1LAr3{kz3U!Dh-hvhUhn;;vRF;$_)c3x@)q9B7f*dQJ) zffzv&DKzmHmlT03E$58Hq5xR-fR)zZj06g2_{L?p1F+>ou!TmDpobdoms%d2k(iQS z4lDQrU|x65$xO{FaY-ymgqsQ056wf4#bJp#@tJuD@4#||8G3=12~8dlS3@*{6EG~F z1mu8CHZnjdj-VSoL8%Sph==$nA44;6n1R|_;BYBH1PvtPBFQ-Br37bIr3QE>=R$0O zlr06I9hmVcsl~}fnFS^JMUZS}WB@i8l=lKlQ;RC0b+n-wsBDafZ21G%^T7u3@Ypa1 z>+wy@OV3G7AxSGVEJ1o)3rjQ00=$#q$qQ1-fux*s3y>us)`28InZ`LECL3%J57TUf z(Cn95jueyV84T9?fMzj-O3?ZUw0MW48<4#SWw3$~REmMa1!^EPf<W6%L4|ZcNl`#@ z0LXigI53375=a`Hz>)*XAQI3<5;SqTr<On?02(`xsDsJ|!(}m}2NKhe1P4{_0y>!? z9~Psqqz6%m>3x^f94t8jq8cTCf^r{thpm57RzO)UMu32|!15Hx!>QoIMQ|&H78p>a zpn!#Y9$eZ(B|!0js2*Tt8dMT{xeu+XplZPFaZu($GBv<FKEBw^)5jH>V^Q6LQd2-o z!REW-k|H!?A*xWV$5K-oLQ*!!WKgOArEXBF$pvR!cW3AL)QaTPf|B?W&>A#jV+M2~ za}$t7Q9jsGm#c9`Y6V0ZS3T=$T#{RWss!Ye)D-ZlNpM&rlo(oIu5WQQgrrYMF#$5k z#}HhnL;DU85p!@+0*cr8%)HE!%tUbE2ksw$V*=VCgvYNdB+o*Yz{IEIgIh>=lp7hL z)PRY_pcObtsYMXmEkL$I&4QfKQVfwW1W7<kIIxJ35qNidNql?(>e(@%c7~w|LK0Mv zf^`@gBLqP!4#5f`-i0=t;NJCtnx2f$bg(44>0m*q>4;Fkh$u*)f!2+troaNt2U<=* zdTZcR1aY?k*zcey0S88u4_XrmBva;U0-`_~+`|Z|KsXFDHo*Z>Pzj9#n3;HVSc24m z(+bFPA4`a1GcuuWC92j$BwScO6r=ugH320@kQHFJfKEliswOQTMGdrcMJlRY4UNDq zh8|l0Q4I@GXheY&;0RIdD!^_6=MShnQvQI3C^WJ`Mnmj`WpoT3Xdw#f(u2=|0H0$3 H9?1s)M&uSF literal 0 HcmV?d00001 diff --git a/pymolfile/molfile/compile-numind.sh b/pymolfile/molfile/compile-numind.sh new file mode 100644 index 0000000..680fa4e --- /dev/null +++ b/pymolfile/molfile/compile-numind.sh @@ -0,0 +1,2 @@ +Cython -a numind.pyx --cplus +g++ -fPIC -Wall -Wextra -Wunused-function -shared -I/labEnv3/lib/python3.6/site-packages/numpy/core/include/ numind.cpp -o numind.so -I/labEnv3/include/python3.6m/ -L/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib -lpython3.6 diff --git a/pymolfile/molfile/compile-signedintbuf.sh b/pymolfile/molfile/compile-signedintbuf.sh new file mode 100644 index 0000000..8f50f77 --- /dev/null +++ b/pymolfile/molfile/compile-signedintbuf.sh @@ -0,0 +1,2 @@ +swig -py3 -Wall -c++ -python numpy_swig.i +g++ -fPIC -Wall -Wextra -Wunused-function -shared -I/labEnv3/lib/python3.6/site-packages/numpy/core/include/ -I. numpy_swig_wrap.cxx -o _numpy_swig.so -I/labEnv3/include/python3.6m/ -L/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib -lpython3.6 diff --git a/pymolfile/molfile/compile.sh b/pymolfile/molfile/compile.sh index f25b34a..dd69ffe 100644 --- a/pymolfile/molfile/compile.sh +++ b/pymolfile/molfile/compile.sh @@ -1,2 +1,2 @@ swig -py3 -Wall -c++ -python libpymolfile.i -g++ -fPIC -Wall -Wextra -Wunused-function -shared -I/labEnv3/lib/python3.6/site-packages/numpy/core/include/ -I. libpymolfile_wrap.cxx pymolfile.c -o _libpymolfile.so -Ivmd_molfile_plugins/include/ -Ilib/ -L. lib/libmolfile_plugin.a -I/labEnv3/include/python3.6m/ -L/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib -lpython3.6 +g++ -fPIC -Wall -Wextra -Wunused-function -shared -g -I/labEnv3/lib/python3.6/site-packages/numpy/core/include/ -I. libpymolfile_wrap.cxx pymolfile.c -o _libpymolfile.so -Ivmd_molfile_plugins/include/ -Ilib/ -L. lib/libmolfile_plugin.a -I/labEnv3/include/python3.6m/ -L/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib -lpython3.6 diff --git a/pymolfile/molfile/libpymolfile-backup2.i b/pymolfile/molfile/libpymolfile-backup2.i new file mode 100644 index 0000000..52b95f6 --- /dev/null +++ b/pymolfile/molfile/libpymolfile-backup2.i @@ -0,0 +1,576 @@ +/* -*- C -*- (not really, but good for syntax highlighting) */ +/* SWIG interface for libpymolfile of VMD molfile_plugins + Copyright (c) 2017 Berk Onat <b.onat@warwick.ac.uk> + Published under UIUC LICENSE + + swig -c++ -python -outdir . molfile/libpymolfile.i +*/ +%define DOCSTRING +" +:Author: Berk Onat <b.onat@warwick.ac.uk> +:Year: 2017 +:Licence: UIUC LICENSE + + +" +%enddef + +%module(docstring=DOCSTRING) libpymolfile + + +%{ +/* Python SWIG interface to libpymolfile + Copyright (c) 2017 Berk Onat <b.onat@warwick.ac.uk> + Published under BSD LICENSE + */ +#define SWIG_FILE_WITH_INIT +#define __STDC_FORMAT_MACROS +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#include <inttypes.h> +#include "molfile_plugin.h" +#include "libmolfile_plugin.h" +#include "vmdplugin.h" +#include "pymolfile.h" +%} + +%include "numpy.i" + +%init %{ +Py_Initialize(); +import_array(); +%} + + +/* + Wrapping only high-level plugin functions to register VMD + plugins and to retrive the data through molfile_plugin interface. + + Only modifing call signatures. This will help one to access functions + without dealing with pointers from python. +*/ + + +/* plugin status codes for error handling */ +enum { pluginOK, pluginNOINIT, pluginCLOSE, pluginNOMEM, + pluginENDOFFILE, pluginFILENOTFOUND, pluginFORMATERROR }; + + +/* Definition of molfile_atoms_t from molfile_plugin.h */ +%inline %{ + +/* +struct MolAtoms { + char name[16]; + char type[16]; + char resname[8]; + int resid; + char segid[8]; + char chain[2]; + char altloc[2]; + char insertion[2]; + float occupancy; + float bfactor; + float mass; + float charge; + float radius; + float atomicnumber; + float ctnumber; +}; + +void del_plugin_structure(PyObject* pymolfile_atoms){ + delete (MolAtoms*)PyCapsule_GetPointer(pymolfile_atoms, "plugin_structure"); +} + +static PyObject* alloc_plugin_structure(PyObject *self, PyObject *args) { + return PyCapsule_New((void*)new MolAtoms(), "plugin_structure", del_plugin_structure); +} +*/ +void del_plugin(PyObject* pymolfile_plugin){ + delete (MolObject*)PyCapsule_GetPointer(pymolfile_plugin, "plugin"); +} + +void del_atoms(PyObject* pymolfile_atoms){ + delete (PyObject*)PyCapsule_GetPointer(pymolfile_atoms, "atoms"); +} + +void del_atomname(PyObject* pymolfile_atoms){ + delete (PyObject*)PyCapsule_GetPointer(pymolfile_atoms, "atomname"); +} + + +static PyObject* alloc_plugin(PyObject *self, PyObject *args) { + return PyCapsule_New((void*)new MolObject(), "plugin_handle", del_plugin); +} + +%} + + +/* pymolfile.c + initialize and finalize molfile plugins +*/ +%feature("autodoc", "0") molfile_plugin_list; +extern molfile_plugin_t** molfile_plugin_list(int maxsize); + +%feature("autodoc", "0") molfile_init; +extern int molfile_init(void); + +%feature("autodoc", "0") molfile_finish; +extern int molfile_finish(void); + +%feature("autodoc", "0") get_plugin; +extern molfile_plugin_t* get_plugin(molfile_plugin_t** plugin_list, int plugin_no); + +%feature("autodoc", "0") molfile_plugin_info; +%exception molfile_plugin_info { + $action + if (PyErr_Occurred()) SWIG_fail; +} +%inline %{ +PyObject * molfile_plugin_info(molfile_plugin_t** plugin_list, int plugin_no) { + molfile_plugin_t *plugin; + int *plugno = &plugin_no; + int has_readstructure = 0; + int has_readbonds = 0; + int has_readangles = 0; + int has_writestructure = 0; + int has_writebonds = 0; + int has_writeangles = 0; + int has_readnexttimestep = 0; + int has_writetimestep = 0; + int plugin_list_size = sizeof(plugin_list) / sizeof(molfile_plugin_t**); + if (plugno==NULL || plugin_no<0){ + PyErr_Format(PyExc_IOError, "[%d] Error: molfile plugin handle no should be given, be positive value and should not exceed the list length'%d'. You set '%d'", pluginNOINIT, plugin_list_size, plugin_no); + return 0; + } + plugin = plugin_list[plugin_no]; + if(plugin==NULL || !plugin->open_file_read){ + PyErr_Format(PyExc_IOError, "[%d] Error: molfile plugin '%d' is not initialized.", pluginNOINIT, plugin_no); + return 0; + } + if (plugin->read_structure) has_readstructure = 1; + if (plugin->read_bonds) has_readbonds = 1; + if (plugin->read_angles) has_readangles = 1; + if (plugin->read_next_timestep) has_readnexttimestep = 1; + if (plugin->write_structure) has_writestructure = 1; + if (plugin->write_bonds) has_writebonds = 1; + if (plugin->write_angles) has_writeangles = 1; + if (plugin->write_timestep) has_writetimestep = 1; + PyObject *tuple = PyTuple_New(17); + PyTuple_SET_ITEM(tuple, 0, PyString_FromString(plugin->filename_extension)); + PyTuple_SET_ITEM(tuple, 1, PyString_FromString(plugin->name)); + PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong((long)has_readstructure)); + PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong((long)has_readbonds)); + PyTuple_SET_ITEM(tuple, 4, PyInt_FromLong((long)has_readangles)); + PyTuple_SET_ITEM(tuple, 5, PyInt_FromLong((long)has_readnexttimestep)); + PyTuple_SET_ITEM(tuple, 6, PyInt_FromLong((long)has_writestructure)); + PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong((long)has_writebonds)); + PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong((long)has_writeangles)); + PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong((long)has_writetimestep)); + PyTuple_SET_ITEM(tuple, 10, PyString_FromString(plugin->prettyname)); + PyTuple_SET_ITEM(tuple, 11, PyString_FromString(plugin->type)); + PyTuple_SET_ITEM(tuple, 12, PyString_FromString(plugin->author)); + PyTuple_SET_ITEM(tuple, 13, PyInt_FromLong((long)plugin->majorv)); + PyTuple_SET_ITEM(tuple, 14, PyInt_FromLong((long)plugin->minorv)); + PyTuple_SET_ITEM(tuple, 15, PyInt_FromLong((long)plugin->abiversion)); + PyTuple_SET_ITEM(tuple, 16, PyInt_FromLong((long)plugin->is_reentrant)); + return tuple; + } +%} + + +%feature("autodoc", "0") my_open_file_read; +%rename (open_file_read) my_open_file_read; +%exception my_open_file_read { + $action + if (PyErr_Occurred()) SWIG_fail; +} +%inline %{ +PyObject * my_open_file_read(molfile_plugin_t* plugin, char* fname, char* ftype, int natoms) { + if (PyType_Ready(&MolObjectType) < 0) + return NULL; + PyTypeObject *type = &MolObjectType; + /*plugin_handle = PyCapsule_New((void*)new MolObject(), "plugin", del_plugin); */ + /*MolObject* plugin_c = new MolObject;*/ + MolObject *plugin_c; + plugin_c = (MolObject *)type->tp_alloc(type, 0); + /*PyObject * plugin_c = MolObject_new(&MolObjectType, args, kwds);*/ + plugin_c->plugin = plugin; + plugin_c->file_handle = plugin->open_file_read(fname, ftype, &natoms); + plugin_c->natoms = natoms; + /* PyCapsule_SetPointer(plugin_handle, &plugin_c); */ + /* PyObject* plugin_handle = PyCapsule_New((void*)plugin_c, "plugin", del_plugin); */ + PyObject* plugin_handle = (PyObject *)plugin_c; + /*if(!plugin_handle) printf("Not assigned\n");*/ + /*PyObject *tuple = PyTuple_New(2); + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong((long)natoms)); + PyTuple_SET_ITEM(tuple, 1, plugin_handle);*/ + return plugin_handle; + } +%} + +/* +%typemap( argout ) ( char **MolfileAtomT_CharArray ) +{ + // The result variable is the return value from + // c_ephcom_read_constants, the number of actual values that are + // defined for cnames/values. + npy_intp dims[] = { result }; + PyArray_Dims newshape_location; + PyArray_Dims * newshape = &newshape_location; + PyObject * status_check; + newshape->len = 1; + newshape->ptr = dims; + + // resize array$argnum to actual size needed. + // Follow directions at http://www.mail-archive.com/numpy-discussion@scipy.org/msg13013.html + status_check = PyArray_Resize( (PyArrayObject *) array$argnum, newshape, 0, NPY_CORDER ); + if ( !status_check ) + SWIG_fail; + Py_DECREF( status_check ); + $result = SWIG_Python_AppendOutput( $result, array$argnum ); +} +%typemap( freearg ) ( char **MolfileAtomT_CharArray ) +{ + free( $1 ); +} +*/ + +/* +#define DIM 3 +typedef int imatrix[DIM][DIM]; +typedef int ivec[DIM]; +typedef float fmatrix[DIM][DIM]; +typedef float fvec[DIM]; +*/ + +/* Reading from xdr files */ +/* +%apply (float INPLACE_ARRAY2[ANY][ANY]) {(matrix box)} +%apply (int DIM1, int DIM2, float* INPLACE_ARRAY2) {(int natoms, int _DIM, float *x), + (int vnatoms, int v_DIM, float *v), + (int fnatoms, int f_DIM, float *f)} +*/ +/* +%apply (int INPLACE_IARRAY2[ANY][ANY]) {(imatrix intdata)} +%apply (float INPLACE_FARRAY2[ANY][ANY]) {(fmatrix floatdata)} +%apply (int DIM1, int* INPLACE_IARRAY2) {(int rnatoms, int* MolAtom_resid)} +%apply (int DIM1, float* INPLACE_FARRAY2) {(int mnatoms, float* MolAtom_mass), + (int anatoms, float* MolAtom_atomicnumber)} +*/ +/* +%inline %{ +int structure_read(molfile_plugin_t* plugin, void* fhandle, int *options, + int* natoms, char** MolAtom_name, + int* natoms, char** MolAtom_type, + int* natoms, char** MolAtom_resname, + int* natoms, int** MolAtom_resid, + int* natoms, char** MolAtom_segid, + int* natoms, char** MolAtom_chain, + int* natoms, char** MolAtom_altloc, + int* natoms, char** MolAtom_insertion, + int* natoms, float** MolAtom_occupancy, + int* natoms, float** MolAtom_bfactor, + int* natoms, float** MolAtom_mass, + int* natoms, float** MolAtom_charge, + int* natoms, float** MolAtom_radius, + int* natoms, float** MolAtom_atomicnumber, + int* natoms, float** MolAtom_ctnumber) { + molfile_atom_t* atoms; + atoms = (molfile_atom_t *)calloc(natoms,sizeof(molfile_atom_t)); + plugin->read_structure(fhandle, options, atoms); + MolAtom_name = (char **)malloc(natoms,sizeof(char*)); + MolAtom_type = (char **)malloc(natoms,sizeof(char*)); + MolAtom_resname = (char **)malloc(natoms,sizeof(char*)); + MolAtom_resid = (int **)malloc(natoms,sizeof(int*)); +%} +*/ +/* +%inline %{ +int structure_read(molfile_plugin_t* plugin, void* fhandle, int *options, + int natoms, char** MolAtom_name, + int tnatoms, char** MolAtom_type, + int rnatoms, int* MolAtom_resid, + int mnatoms, float* MolAtom_mass, + int anatoms, float* MolAtom_atomicnumber) { + int i; + molfile_atom_t* atoms; + molfile_atom_t atm; + atoms = (molfile_atom_t *)calloc(natoms,sizeof(molfile_atom_t)); + plugin->read_structure(fhandle, options, atoms); + if(atoms == NULL) { free(atoms); return 1; } + if(atoms->type == NULL || atoms->name == NULL){ free(atoms); return 1; } + MolAtom_name = (char **)malloc(natoms,sizeof(char*)); + MolAtom_type = (char **)malloc(natoms,sizeof(char*)); + MolAtom_resid = (int *)malloc(natoms,sizeof(int)); + MolAtom_mass = (float *)malloc(natoms,sizeof(float)); + MolAtom_atomicnumber = (float *)malloc(natoms,sizeof(float)); + for (i=0;i<natoms;i++){ + atm = atoms[i]; + MolAtom_name[i] = atm.name; + MolAtom_type[i] = atm.type; + MolAtom_resid[i] = atm.resid; + MolAtom_mass[i] = atm.mass; + MolAtom_atomicnumber[i] = atm.atomicnumber; + } + return 0; + } +%} +*/ + +%feature("autodoc", "0") my_read_structure; +%rename (read_structure) my_read_structure; +extern PyObject * my_read_structure(PyObject* molpack); + +%feature("autodoc", "0") get_structure; +extern PyObject * get_structure(PyObject* molpack); + +/* +%feature("autodoc", "0") my_read_structure; +%rename (read_structure) my_read_structure; +%exception my_read_structure { + $action + if (PyErr_Occurred()) SWIG_fail; +} +%inline %{ +PyObject * my_read_structure(PyObject* molpack) { + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* atoms; + int numatoms, status; + char** atom_names; + char** atom_types; + PyObject *npatoms = NULL; */ + /*MolObject* plugin_handle = (MolObject*)PyCapsule_GetPointer(molpack, "plugin");*/ +/* MolObject* plugin_handle = (MolObject*)molpack; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + atoms = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + printf("Test1\n"); + status = plugin->read_structure(file_handle, &options, atoms); + printf("Test2 %d\n",status); + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error copying molfile_atom_t into Python."); + return NULL; + } + printf("Test3\n"); + npy_intp natoms[1] = { numatoms }; + + PyArrayObject* oresid; + int64_t* cresid; + + int typenum; + int nd = 1; + npy_intp dims[1] = { numatoms }; */ + /*dims[0] = numatoms;*/ +/* oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT64); + npy_intp* n = PyArray_DIMS(oresid); + printf("dimensions %ld\n", n[0]); + cresid = (int64_t*) PyArray_DATA(oresid); + + PyObject* npatomresid = NULL; + char** MolAtom_name = (char **)malloc(numatoms*sizeof(char*)); + char** MolAtom_type = (char **)malloc(numatoms*sizeof(char*)); + int64_t* MolAtom_resid = NULL; */ + /*int64_t* MolAtom_resid = (int64_t *)malloc(numatoms*sizeof(int64_t));*/ +/* float* MolAtom_mass = (float *)malloc(numatoms*sizeof(float)); + float* MolAtom_atomicnumber = (float *)malloc(numatoms*sizeof(float)); + for (i=0;i<numatoms;i++){ + MolAtom_name[i] = atoms[i].name; + MolAtom_type[i] = atoms[i].type; + cresid[i] = (int64_t) atoms[i].resid; + MolAtom_mass[i] = atoms[i].mass; + MolAtom_atomicnumber[i] = atoms[i].atomicnumber; + } */ + /*Py_DECREF( obj );*/ + /*npy_intp dims[3];*/ /* PyArray_AsCArray is for ndim <= 3 */ +/* PyArray_Descr *descr; + npatoms = PyArray_SimpleNewFromData(1, natoms, NPY_USERDEF, atoms); + printf("Test4 numatoms=%d\n", numatoms); + PyObject* npatomname = NULL; + npatomname = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, MolAtom_name[0]); + PyObject* npatomtype = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, MolAtom_type); */ + /*PyObject* npatomresname = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->resname);*/ + /*PyObject* npatomsegid = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->segid);*/ + /*PyObject* npatomchain = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->chain);*/ + /*PyObject* npatomaltloc = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->altloc);*/ + /*PyObject* npatominsert = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->insertion);*/ + /*PyObject* npatomoccup = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, &atoms->occupancy);*/ + /*PyObject* npatombfact = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, &atoms->bfactor);*/ +/* PyObject* npatommass = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, MolAtom_mass); */ + /*PyObject* npatomcharge = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, &atoms->charge);*/ + /*PyObject* npatomradius = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, &atoms->radius);*/ +/* PyObject* npatomicnumber = PyArray_SimpleNewFromData(1, natoms, NPY_INT64, MolAtom_atomicnumber); */ + /*if (npatomname==NULL || npatomtype==NULL || npatomresname==NULL || + npatomresid==NULL || npatomsegid==NULL || npatomchain==NULL ) + { + free(atoms); + Py_XDECREF(npatomname); Py_XDECREF(npatomtype); + Py_XDECREF(npatomresname); Py_XDECREF(npatomresid); Py_XDECREF(npatomsegid); + Py_XDECREF(npatomchain); Py_XDECREF(npatomaltloc); Py_XDECREF(npatominsert); + Py_XDECREF(npatomoccup); Py_XDECREF(npatombfact); Py_XDECREF(npatommass); + Py_XDECREF(npatomcharge); Py_XDECREF(npatomradius); Py_XDECREF(npatomicnumber); + PyErr_Format(PyExc_IOError, "Error copying molfile_atom_t into Python."); + return 0; + } + PyArray_BASE(npatomname) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomtype) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomresname) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomresid) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomsegid) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomchain) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomaltloc) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatominsert) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomoccup) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatombfact) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatommass) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomcharge) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomradius) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomicnumber) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatoms) = PyCObject_FromVoidPtr(atoms, free); + PyArray_BASE((PyArrayObject *)npatoms) = PyCapsule_New(atoms, "atoms", del_atoms);*/ + /*PyArray_BASE((PyArrayObject *)npatoms); */ +/* printf("Test4-2\n"); */ + /*PyObject* Py_MolAtom_name = PyCapsule_New((void*)MolAtom_name, "atomname", del_atomname);*/ + /*PyObject* Py_MolAtom_name; + Py_INCREF(Py_MolAtom_name);*/ +/* printf("Test4-3\n"); */ + /*PyArray_SetBaseObject((PyArrayObject *)npatomname, Py_MolAtom_name);*/ + /*PyArray_SetBaseObject((PyArrayObject *)npatomtype, MolAtom_type); + PyArray_SetBaseObject((PyArrayObject *)npatomresid, MolAtom_resid); + PyArray_SetBaseObject((PyArrayObject *)npatommass, MolAtom_mass); + PyArray_SetBaseObject((PyArrayObject *)npatomicnumber, MolAtom_atomicnumber); */ +/* printf("Test5\n"); + PyObject *tuple = PyTuple_New(2); + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong((long)natoms)); + printf("Test6\n"); + PyTuple_SET_ITEM(tuple, 1, npatomname); */ + /*PyTuple_SET_ITEM(tuple, 2, npatomtype); + PyTuple_SET_ITEM(tuple, 3, npatomresid); + PyTuple_SET_ITEM(tuple, 4, npatommass); + PyTuple_SET_ITEM(tuple, 5, npatomicnumber); + PyObject* vars = PyDict_New(); + printf("Test7\n"); + PyDict_SetItemString( vars, "name", npatomname ); */ +/* printf("Test8\n"); */ + /*PyDict_SetItemString( vars, "resid", npatomresid ); */ + /*return Py_BuildValue("O", oresid); */ + /*return PyArray_FromArray(oresid, PyArray_DESCR(oresid), 0);*/ +/* return 0; + } +%} +*/ + + +/* + python wrappers for functions + and structure data in molfile_plugin.h +*/ + +/* molfile_atom_t + + char name[16]; required atom name string + char type[16]; required atom type string + char resname[8]; required residue name string + int resid; required integer residue ID + char segid[8]; required segment name string, or "" + char chain[2]; required chain name, or "" + char altloc[2]; optional PDB alternate location code + char insertion[2]; optional PDB insertion code + float occupancy; optional occupancy value + float bfactor; optional B-factor value + float mass; optional mass value + float charge; optional charge value + float radius; optional radius value + int atomicnumber; optional element atomic number + int ctnumber; mae ct block, 0-based, including meta +*/ + + +/* molfile_plugin_t */ + +/* +%feature("autodoc", "0") molfile_open_file_read; +%rename (open_file_read) molfile_open_file_read; +%exception molfile_open_file_read { + $action + if (PyErr_Occurred()) SWIG_fail; +} +%inline %{ +PyObject * molfile_open_file_read(molfile_plugin_t* plugin, char *fname, int natoms) { + int *plugno = &plugin_no; + return plugin; + } +%} +*/ +/* + void *(* open_file_read)(const char *filepath, const char *filetype, + int *natoms); + void (* close_file_read)(void *); + int (*read_structure)(void *, int *optflags, molfile_atom_t *atoms); + int (*read_bonds)(void *, int *nbonds, int **from, int **to, float **bondorder, + int **bondtype, int *nbondtypes, char ***bondtypename); + int (* read_next_timestep)(void *, int natoms, molfile_timestep_t *); + void *(* open_file_write)(const char *filepath, const char *filetype, + int natoms); + int (* write_structure)(void *, int optflags, const molfile_atom_t *atoms); + int (* write_timestep)(void *, const molfile_timestep_t *); + void (* close_file_write)(void *); + int (* read_molecule_metadata)(void *, molfile_metadata_t **metadata); + int (* write_bonds)(void *, int nbonds, int *from, int *to, float *bondorder, + int *bondtype, int nbondtypes, char **bondtypename); + int (* read_angles)(void *handle, int *numangles, int **angles, int **angletypes, + int *numangletypes, char ***angletypenames, int *numdihedrals, + int **dihedrals, int **dihedraltypes, int *numdihedraltypes, + char ***dihedraltypenames, int *numimpropers, int **impropers, + int **impropertypes, int *numimpropertypes, char ***impropertypenames, + int *numcterms, int **cterms, int *ctermcols, int *ctermrows); + int (* write_angles)(void *handle, int numangles, const int *angles, const int *angletypes, + int numangletypes, const char **angletypenames, int numdihedrals, + const int *dihedrals, const int *dihedraltypes, int numdihedraltypes, + const char **dihedraltypenames, int numimpropers, + const int *impropers, const int *impropertypes, int numimpropertypes, + const char **impropertypenames, int numcterms, const int *cterms, + int ctermcols, int ctermrows); + int (* read_timestep)(void *, int natoms, molfile_timestep_t *, + molfile_qm_metadata_t *, molfile_qm_timestep_t *); + int (* read_timestep_metadata)(void *, molfile_timestep_metadata_t *); + int (* read_timestep2)(void *, molfile_ssize_t index, molfile_timestep_t *); + molfile_ssize_t (* read_times)( void *, + molfile_ssize_t start, + molfile_ssize_t count, + double * times ); + int (* cons_fputs)(const int, const char*); +*/ + + +/* molfile_timestep_t + + float *coords; coordinates of all atoms, arranged xyzxyzxyz + float *velocities; space for velocities of all atoms; same layout + float A, B, C, alpha, beta, gamma; + double physical_time; physical time point associated with this frame + + double total_energy; + double potential_energy; + double kinetic_energy; + double extended_energy; + double force_energy; + double total_pressure; +*/ + + +/* molfile_timestep_metadata_t + + unsigned int count; total # timesteps; -1 if unknown + unsigned int avg_bytes_per_timestep; bytes per timestep + int has_velocities; if timesteps have velocities +*/ + + + diff --git a/pymolfile/molfile/libpymolfile-new.i b/pymolfile/molfile/libpymolfile-new.i new file mode 100644 index 0000000..65670f3 --- /dev/null +++ b/pymolfile/molfile/libpymolfile-new.i @@ -0,0 +1,578 @@ +/* -*- C -*- (not really, but good for syntax highlighting) */ +/* SWIG interface for libpymolfile of VMD molfile_plugins + Copyright (c) 2017 Berk Onat <b.onat@warwick.ac.uk> + Published under UIUC LICENSE + + swig -c++ -python -outdir . molfile/libpymolfile.i +*/ +%define DOCSTRING +" +:Author: Berk Onat <b.onat@warwick.ac.uk> +:Year: 2017 +:Licence: UIUC LICENSE + + +" +%enddef + +%module(docstring=DOCSTRING) libpymolfile + + +%{ +/* Python SWIG interface to libpymolfile + Copyright (c) 2017 Berk Onat <b.onat@warwick.ac.uk> + Published under BSD LICENSE + */ +#define SWIG_FILE_WITH_INIT +#define __STDC_FORMAT_MACROS +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#include <inttypes.h> +#include "molfile_plugin.h" +#include "libmolfile_plugin.h" +#include "vmdplugin.h" +#include "pymolfile.h" +%} + +%include "numpy.i" + +%init %{ +Py_Initialize(); +import_array(); +%} + + +/* + Wrapping only high-level plugin functions to register VMD + plugins and to retrive the data through molfile_plugin interface. + + Only modifing call signatures. This will help one to access functions + without dealing with pointers from python. +*/ + + +/* plugin status codes for error handling */ +enum { pluginOK, pluginNOINIT, pluginCLOSE, pluginNOMEM, + pluginENDOFFILE, pluginFILENOTFOUND, pluginFORMATERROR }; + + +/* Definition of molfile_atoms_t from molfile_plugin.h */ +%inline %{ + +/* +struct MolAtoms { + char name[16]; + char type[16]; + char resname[8]; + int resid; + char segid[8]; + char chain[2]; + char altloc[2]; + char insertion[2]; + float occupancy; + float bfactor; + float mass; + float charge; + float radius; + float atomicnumber; + float ctnumber; +}; + +void del_plugin_structure(PyObject* pymolfile_atoms){ + delete (MolAtoms*)PyCapsule_GetPointer(pymolfile_atoms, "plugin_structure"); +} + +static PyObject* alloc_plugin_structure(PyObject *self, PyObject *args) { + return PyCapsule_New((void*)new MolAtoms(), "plugin_structure", del_plugin_structure); +} +*/ +void del_plugin(PyObject* pymolfile_plugin){ + delete (MolObject*)PyCapsule_GetPointer(pymolfile_plugin, "plugin"); +} + +void del_atoms(PyObject* pymolfile_atoms){ + delete (PyObject*)PyCapsule_GetPointer(pymolfile_atoms, "atoms"); +} + +void del_atomname(PyObject* pymolfile_atoms){ + delete (PyObject*)PyCapsule_GetPointer(pymolfile_atoms, "atomname"); +} + + +static PyObject* alloc_plugin(PyObject *self, PyObject *args) { + return PyCapsule_New((void*)new MolObject(), "plugin_handle", del_plugin); +} + +%} + + +/* pymolfile.c + initialize and finalize molfile plugins +*/ +%feature("autodoc", "0") molfile_plugin_list; +extern molfile_plugin_t** molfile_plugin_list(int maxsize); + +%feature("autodoc", "0") molfile_init; +extern int molfile_init(void); + +%feature("autodoc", "0") molfile_finish; +extern int molfile_finish(void); + +%feature("autodoc", "0") get_plugin; +extern molfile_plugin_t* get_plugin(molfile_plugin_t** plugin_list, int plugin_no); + +%feature("autodoc", "0") molfile_plugin_info; +%exception molfile_plugin_info { + $action + if (PyErr_Occurred()) SWIG_fail; +} +%inline %{ +PyObject * molfile_plugin_info(molfile_plugin_t** plugin_list, int plugin_no) { + molfile_plugin_t *plugin; + int *plugno = &plugin_no; + int has_readstructure = 0; + int has_readbonds = 0; + int has_readangles = 0; + int has_writestructure = 0; + int has_writebonds = 0; + int has_writeangles = 0; + int has_readnexttimestep = 0; + int has_writetimestep = 0; + int plugin_list_size = sizeof(plugin_list) / sizeof(molfile_plugin_t**); + if (plugno==NULL || plugin_no<0){ + PyErr_Format(PyExc_IOError, "[%d] Error: molfile plugin handle no should be given, be positive value and should not exceed the list length'%d'. You set '%d'", pluginNOINIT, plugin_list_size, plugin_no); + return 0; + } + plugin = plugin_list[plugin_no]; + if(plugin==NULL || !plugin->open_file_read){ + PyErr_Format(PyExc_IOError, "[%d] Error: molfile plugin '%d' is not initialized.", pluginNOINIT, plugin_no); + return 0; + } + if (plugin->read_structure) has_readstructure = 1; + if (plugin->read_bonds) has_readbonds = 1; + if (plugin->read_angles) has_readangles = 1; + if (plugin->read_next_timestep) has_readnexttimestep = 1; + if (plugin->write_structure) has_writestructure = 1; + if (plugin->write_bonds) has_writebonds = 1; + if (plugin->write_angles) has_writeangles = 1; + if (plugin->write_timestep) has_writetimestep = 1; + PyObject *tuple = PyTuple_New(17); + PyTuple_SET_ITEM(tuple, 0, PyString_FromString(plugin->filename_extension)); + PyTuple_SET_ITEM(tuple, 1, PyString_FromString(plugin->name)); + PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong((long)has_readstructure)); + PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong((long)has_readbonds)); + PyTuple_SET_ITEM(tuple, 4, PyInt_FromLong((long)has_readangles)); + PyTuple_SET_ITEM(tuple, 5, PyInt_FromLong((long)has_readnexttimestep)); + PyTuple_SET_ITEM(tuple, 6, PyInt_FromLong((long)has_writestructure)); + PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong((long)has_writebonds)); + PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong((long)has_writeangles)); + PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong((long)has_writetimestep)); + PyTuple_SET_ITEM(tuple, 10, PyString_FromString(plugin->prettyname)); + PyTuple_SET_ITEM(tuple, 11, PyString_FromString(plugin->type)); + PyTuple_SET_ITEM(tuple, 12, PyString_FromString(plugin->author)); + PyTuple_SET_ITEM(tuple, 13, PyInt_FromLong((long)plugin->majorv)); + PyTuple_SET_ITEM(tuple, 14, PyInt_FromLong((long)plugin->minorv)); + PyTuple_SET_ITEM(tuple, 15, PyInt_FromLong((long)plugin->abiversion)); + PyTuple_SET_ITEM(tuple, 16, PyInt_FromLong((long)plugin->is_reentrant)); + return tuple; + } +%} + + +%feature("autodoc", "0") my_open_file_read; +%rename (open_file_read) my_open_file_read; +%exception my_open_file_read { + $action + if (PyErr_Occurred()) SWIG_fail; +} +%inline %{ +PyObject * my_open_file_read(molfile_plugin_t* plugin, char* fname, char* ftype, int natoms) { + if (PyType_Ready(&MolObjectType) < 0) + return NULL; + PyTypeObject *type = &MolObjectType; + /*plugin_handle = PyCapsule_New((void*)new MolObject(), "plugin", del_plugin); */ + /*MolObject* plugin_c = new MolObject;*/ + MolObject *plugin_c; + plugin_c = (MolObject *)type->tp_alloc(type, 0); + /*PyObject * plugin_c = MolObject_new(&MolObjectType, args, kwds);*/ + plugin_c->plugin = plugin; + plugin_c->file_handle = plugin->open_file_read(fname, ftype, &natoms); + plugin_c->natoms = natoms; + /* PyCapsule_SetPointer(plugin_handle, &plugin_c); */ + /* PyObject* plugin_handle = PyCapsule_New((void*)plugin_c, "plugin", del_plugin); */ + PyObject* plugin_handle = (PyObject *)plugin_c; + /*if(!plugin_handle) printf("Not assigned\n");*/ + /*PyObject *tuple = PyTuple_New(2); + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong((long)natoms)); + PyTuple_SET_ITEM(tuple, 1, plugin_handle);*/ + return plugin_handle; + } +%} + +/* +%typemap( argout ) ( char **MolfileAtomT_CharArray ) +{ + // The result variable is the return value from + // c_ephcom_read_constants, the number of actual values that are + // defined for cnames/values. + npy_intp dims[] = { result }; + PyArray_Dims newshape_location; + PyArray_Dims * newshape = &newshape_location; + PyObject * status_check; + newshape->len = 1; + newshape->ptr = dims; + + // resize array$argnum to actual size needed. + // Follow directions at http://www.mail-archive.com/numpy-discussion@scipy.org/msg13013.html + status_check = PyArray_Resize( (PyArrayObject *) array$argnum, newshape, 0, NPY_CORDER ); + if ( !status_check ) + SWIG_fail; + Py_DECREF( status_check ); + $result = SWIG_Python_AppendOutput( $result, array$argnum ); +} +%typemap( freearg ) ( char **MolfileAtomT_CharArray ) +{ + free( $1 ); +} +*/ + +/* +#define DIM 3 +typedef int imatrix[DIM][DIM]; +typedef int ivec[DIM]; +typedef float fmatrix[DIM][DIM]; +typedef float fvec[DIM]; +*/ + +/* Reading from xdr files */ +/* +%apply (float INPLACE_ARRAY2[ANY][ANY]) {(matrix box)} +%apply (int DIM1, int DIM2, float* INPLACE_ARRAY2) {(int natoms, int _DIM, float *x), + (int vnatoms, int v_DIM, float *v), + (int fnatoms, int f_DIM, float *f)} +*/ +/* +%apply (int INPLACE_IARRAY2[ANY][ANY]) {(imatrix intdata)} +%apply (float INPLACE_FARRAY2[ANY][ANY]) {(fmatrix floatdata)} +%apply (int DIM1, int* INPLACE_IARRAY2) {(int rnatoms, int* MolAtom_resid)} +%apply (int DIM1, float* INPLACE_FARRAY2) {(int mnatoms, float* MolAtom_mass), + (int anatoms, float* MolAtom_atomicnumber)} +*/ +/* +%inline %{ +int structure_read(molfile_plugin_t* plugin, void* fhandle, int *options, + int* natoms, char** MolAtom_name, + int* natoms, char** MolAtom_type, + int* natoms, char** MolAtom_resname, + int* natoms, int** MolAtom_resid, + int* natoms, char** MolAtom_segid, + int* natoms, char** MolAtom_chain, + int* natoms, char** MolAtom_altloc, + int* natoms, char** MolAtom_insertion, + int* natoms, float** MolAtom_occupancy, + int* natoms, float** MolAtom_bfactor, + int* natoms, float** MolAtom_mass, + int* natoms, float** MolAtom_charge, + int* natoms, float** MolAtom_radius, + int* natoms, float** MolAtom_atomicnumber, + int* natoms, float** MolAtom_ctnumber) { + molfile_atom_t* atoms; + atoms = (molfile_atom_t *)calloc(natoms,sizeof(molfile_atom_t)); + plugin->read_structure(fhandle, options, atoms); + MolAtom_name = (char **)malloc(natoms,sizeof(char*)); + MolAtom_type = (char **)malloc(natoms,sizeof(char*)); + MolAtom_resname = (char **)malloc(natoms,sizeof(char*)); + MolAtom_resid = (int **)malloc(natoms,sizeof(int*)); +%} +*/ +/* +%inline %{ +int structure_read(molfile_plugin_t* plugin, void* fhandle, int *options, + int natoms, char** MolAtom_name, + int tnatoms, char** MolAtom_type, + int rnatoms, int* MolAtom_resid, + int mnatoms, float* MolAtom_mass, + int anatoms, float* MolAtom_atomicnumber) { + int i; + molfile_atom_t* atoms; + molfile_atom_t atm; + atoms = (molfile_atom_t *)calloc(natoms,sizeof(molfile_atom_t)); + plugin->read_structure(fhandle, options, atoms); + if(atoms == NULL) { free(atoms); return 1; } + if(atoms->type == NULL || atoms->name == NULL){ free(atoms); return 1; } + MolAtom_name = (char **)malloc(natoms,sizeof(char*)); + MolAtom_type = (char **)malloc(natoms,sizeof(char*)); + MolAtom_resid = (int *)malloc(natoms,sizeof(int)); + MolAtom_mass = (float *)malloc(natoms,sizeof(float)); + MolAtom_atomicnumber = (float *)malloc(natoms,sizeof(float)); + for (i=0;i<natoms;i++){ + atm = atoms[i]; + MolAtom_name[i] = atm.name; + MolAtom_type[i] = atm.type; + MolAtom_resid[i] = atm.resid; + MolAtom_mass[i] = atm.mass; + MolAtom_atomicnumber[i] = atm.atomicnumber; + } + return 0; + } +%} +*/ + +%feature("autodoc", "0") my_read_structure; +%rename (read_structure) my_read_structure; +extern PyObject * my_read_structure(PyObject* molpack); + +%feature("autodoc", "0") get_structure; +extern PyObject * get_structure(PyObject* molpack); + +%feature("autodoc", "0") read_fill_structure; +extern PyObject * read_fill_structure(PyObject* molpack, PyObject* prototype); +/* +%feature("autodoc", "0") my_read_structure; +%rename (read_structure) my_read_structure; +%exception my_read_structure { + $action + if (PyErr_Occurred()) SWIG_fail; +} +%inline %{ +PyObject * my_read_structure(PyObject* molpack) { + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* atoms; + int numatoms, status; + char** atom_names; + char** atom_types; + PyObject *npatoms = NULL; */ + /*MolObject* plugin_handle = (MolObject*)PyCapsule_GetPointer(molpack, "plugin");*/ +/* MolObject* plugin_handle = (MolObject*)molpack; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + atoms = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + printf("Test1\n"); + status = plugin->read_structure(file_handle, &options, atoms); + printf("Test2 %d\n",status); + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error copying molfile_atom_t into Python."); + return NULL; + } + printf("Test3\n"); + npy_intp natoms[1] = { numatoms }; + + PyArrayObject* oresid; + int64_t* cresid; + + int typenum; + int nd = 1; + npy_intp dims[1] = { numatoms }; */ + /*dims[0] = numatoms;*/ +/* oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT64); + npy_intp* n = PyArray_DIMS(oresid); + printf("dimensions %ld\n", n[0]); + cresid = (int64_t*) PyArray_DATA(oresid); + + PyObject* npatomresid = NULL; + char** MolAtom_name = (char **)malloc(numatoms*sizeof(char*)); + char** MolAtom_type = (char **)malloc(numatoms*sizeof(char*)); + int64_t* MolAtom_resid = NULL; */ + /*int64_t* MolAtom_resid = (int64_t *)malloc(numatoms*sizeof(int64_t));*/ +/* float* MolAtom_mass = (float *)malloc(numatoms*sizeof(float)); + float* MolAtom_atomicnumber = (float *)malloc(numatoms*sizeof(float)); + for (i=0;i<numatoms;i++){ + MolAtom_name[i] = atoms[i].name; + MolAtom_type[i] = atoms[i].type; + cresid[i] = (int64_t) atoms[i].resid; + MolAtom_mass[i] = atoms[i].mass; + MolAtom_atomicnumber[i] = atoms[i].atomicnumber; + } */ + /*Py_DECREF( obj );*/ + /*npy_intp dims[3];*/ /* PyArray_AsCArray is for ndim <= 3 */ +/* PyArray_Descr *descr; + npatoms = PyArray_SimpleNewFromData(1, natoms, NPY_USERDEF, atoms); + printf("Test4 numatoms=%d\n", numatoms); + PyObject* npatomname = NULL; + npatomname = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, MolAtom_name[0]); + PyObject* npatomtype = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, MolAtom_type); */ + /*PyObject* npatomresname = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->resname);*/ + /*PyObject* npatomsegid = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->segid);*/ + /*PyObject* npatomchain = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->chain);*/ + /*PyObject* npatomaltloc = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->altloc);*/ + /*PyObject* npatominsert = PyArray_SimpleNewFromData(1, natoms, NPY_STRING, atoms->insertion);*/ + /*PyObject* npatomoccup = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, &atoms->occupancy);*/ + /*PyObject* npatombfact = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, &atoms->bfactor);*/ +/* PyObject* npatommass = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, MolAtom_mass); */ + /*PyObject* npatomcharge = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, &atoms->charge);*/ + /*PyObject* npatomradius = PyArray_SimpleNewFromData(1, natoms, NPY_FLOAT64, &atoms->radius);*/ +/* PyObject* npatomicnumber = PyArray_SimpleNewFromData(1, natoms, NPY_INT64, MolAtom_atomicnumber); */ + /*if (npatomname==NULL || npatomtype==NULL || npatomresname==NULL || + npatomresid==NULL || npatomsegid==NULL || npatomchain==NULL ) + { + free(atoms); + Py_XDECREF(npatomname); Py_XDECREF(npatomtype); + Py_XDECREF(npatomresname); Py_XDECREF(npatomresid); Py_XDECREF(npatomsegid); + Py_XDECREF(npatomchain); Py_XDECREF(npatomaltloc); Py_XDECREF(npatominsert); + Py_XDECREF(npatomoccup); Py_XDECREF(npatombfact); Py_XDECREF(npatommass); + Py_XDECREF(npatomcharge); Py_XDECREF(npatomradius); Py_XDECREF(npatomicnumber); + PyErr_Format(PyExc_IOError, "Error copying molfile_atom_t into Python."); + return 0; + } + PyArray_BASE(npatomname) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomtype) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomresname) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomresid) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomsegid) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomchain) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomaltloc) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatominsert) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomoccup) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatombfact) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatommass) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomcharge) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomradius) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatomicnumber) = PyCObject_FromVoidPtr(*atoms, free); + PyArray_BASE(npatoms) = PyCObject_FromVoidPtr(atoms, free); + PyArray_BASE((PyArrayObject *)npatoms) = PyCapsule_New(atoms, "atoms", del_atoms);*/ + /*PyArray_BASE((PyArrayObject *)npatoms); */ +/* printf("Test4-2\n"); */ + /*PyObject* Py_MolAtom_name = PyCapsule_New((void*)MolAtom_name, "atomname", del_atomname);*/ + /*PyObject* Py_MolAtom_name; + Py_INCREF(Py_MolAtom_name);*/ +/* printf("Test4-3\n"); */ + /*PyArray_SetBaseObject((PyArrayObject *)npatomname, Py_MolAtom_name);*/ + /*PyArray_SetBaseObject((PyArrayObject *)npatomtype, MolAtom_type); + PyArray_SetBaseObject((PyArrayObject *)npatomresid, MolAtom_resid); + PyArray_SetBaseObject((PyArrayObject *)npatommass, MolAtom_mass); + PyArray_SetBaseObject((PyArrayObject *)npatomicnumber, MolAtom_atomicnumber); */ +/* printf("Test5\n"); + PyObject *tuple = PyTuple_New(2); + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong((long)natoms)); + printf("Test6\n"); + PyTuple_SET_ITEM(tuple, 1, npatomname); */ + /*PyTuple_SET_ITEM(tuple, 2, npatomtype); + PyTuple_SET_ITEM(tuple, 3, npatomresid); + PyTuple_SET_ITEM(tuple, 4, npatommass); + PyTuple_SET_ITEM(tuple, 5, npatomicnumber); + PyObject* vars = PyDict_New(); + printf("Test7\n"); + PyDict_SetItemString( vars, "name", npatomname ); */ +/* printf("Test8\n"); */ + /*PyDict_SetItemString( vars, "resid", npatomresid ); */ + /*return Py_BuildValue("O", oresid); */ + /*return PyArray_FromArray(oresid, PyArray_DESCR(oresid), 0);*/ +/* return 0; + } +%} +*/ + + +/* + python wrappers for functions + and structure data in molfile_plugin.h +*/ + +/* molfile_atom_t + + char name[16]; required atom name string + char type[16]; required atom type string + char resname[8]; required residue name string + int resid; required integer residue ID + char segid[8]; required segment name string, or "" + char chain[2]; required chain name, or "" + char altloc[2]; optional PDB alternate location code + char insertion[2]; optional PDB insertion code + float occupancy; optional occupancy value + float bfactor; optional B-factor value + float mass; optional mass value + float charge; optional charge value + float radius; optional radius value + int atomicnumber; optional element atomic number + int ctnumber; mae ct block, 0-based, including meta +*/ + + +/* molfile_plugin_t */ + +/* +%feature("autodoc", "0") molfile_open_file_read; +%rename (open_file_read) molfile_open_file_read; +%exception molfile_open_file_read { + $action + if (PyErr_Occurred()) SWIG_fail; +} +%inline %{ +PyObject * molfile_open_file_read(molfile_plugin_t* plugin, char *fname, int natoms) { + int *plugno = &plugin_no; + return plugin; + } +%} +*/ +/* + void *(* open_file_read)(const char *filepath, const char *filetype, + int *natoms); + void (* close_file_read)(void *); + int (*read_structure)(void *, int *optflags, molfile_atom_t *atoms); + int (*read_bonds)(void *, int *nbonds, int **from, int **to, float **bondorder, + int **bondtype, int *nbondtypes, char ***bondtypename); + int (* read_next_timestep)(void *, int natoms, molfile_timestep_t *); + void *(* open_file_write)(const char *filepath, const char *filetype, + int natoms); + int (* write_structure)(void *, int optflags, const molfile_atom_t *atoms); + int (* write_timestep)(void *, const molfile_timestep_t *); + void (* close_file_write)(void *); + int (* read_molecule_metadata)(void *, molfile_metadata_t **metadata); + int (* write_bonds)(void *, int nbonds, int *from, int *to, float *bondorder, + int *bondtype, int nbondtypes, char **bondtypename); + int (* read_angles)(void *handle, int *numangles, int **angles, int **angletypes, + int *numangletypes, char ***angletypenames, int *numdihedrals, + int **dihedrals, int **dihedraltypes, int *numdihedraltypes, + char ***dihedraltypenames, int *numimpropers, int **impropers, + int **impropertypes, int *numimpropertypes, char ***impropertypenames, + int *numcterms, int **cterms, int *ctermcols, int *ctermrows); + int (* write_angles)(void *handle, int numangles, const int *angles, const int *angletypes, + int numangletypes, const char **angletypenames, int numdihedrals, + const int *dihedrals, const int *dihedraltypes, int numdihedraltypes, + const char **dihedraltypenames, int numimpropers, + const int *impropers, const int *impropertypes, int numimpropertypes, + const char **impropertypenames, int numcterms, const int *cterms, + int ctermcols, int ctermrows); + int (* read_timestep)(void *, int natoms, molfile_timestep_t *, + molfile_qm_metadata_t *, molfile_qm_timestep_t *); + int (* read_timestep_metadata)(void *, molfile_timestep_metadata_t *); + int (* read_timestep2)(void *, molfile_ssize_t index, molfile_timestep_t *); + molfile_ssize_t (* read_times)( void *, + molfile_ssize_t start, + molfile_ssize_t count, + double * times ); + int (* cons_fputs)(const int, const char*); +*/ + + +/* molfile_timestep_t + + float *coords; coordinates of all atoms, arranged xyzxyzxyz + float *velocities; space for velocities of all atoms; same layout + float A, B, C, alpha, beta, gamma; + double physical_time; physical time point associated with this frame + + double total_energy; + double potential_energy; + double kinetic_energy; + double extended_energy; + double force_energy; + double total_pressure; +*/ + + +/* molfile_timestep_metadata_t + + unsigned int count; total # timesteps; -1 if unknown + unsigned int avg_bytes_per_timestep; bytes per timestep + int has_velocities; if timesteps have velocities +*/ + + + diff --git a/pymolfile/molfile/libpymolfile.i b/pymolfile/molfile/libpymolfile.i index b502767..417756e 100644 --- a/pymolfile/molfile/libpymolfile.i +++ b/pymolfile/molfile/libpymolfile.i @@ -324,6 +324,15 @@ int structure_read(molfile_plugin_t* plugin, void* fhandle, int *options, %rename (read_structure) my_read_structure; extern PyObject * my_read_structure(PyObject* molpack); +%feature("autodoc", "0") get_structure; +extern PyObject * get_structure(PyObject* molpack); + +%feature("autodoc", "0") read_fill_structure; +extern PyObject * read_fill_structure(PyObject* molpack, PyObject* prototype); + +%feature("autodoc", "0") print_array_struct; +extern PyObject* print_array_struct(PyObject* prototype); + /* %feature("autodoc", "0") my_read_structure; %rename (read_structure) my_read_structure; diff --git a/pymolfile/molfile/libpymolfile.py b/pymolfile/molfile/libpymolfile.py index 504cde2..2d4dae8 100644 --- a/pymolfile/molfile/libpymolfile.py +++ b/pymolfile/molfile/libpymolfile.py @@ -113,92 +113,6 @@ pluginNOMEM = _libpymolfile.pluginNOMEM pluginENDOFFILE = _libpymolfile.pluginENDOFFILE pluginFILENOTFOUND = _libpymolfile.pluginFILENOTFOUND pluginFORMATERROR = _libpymolfile.pluginFORMATERROR -class MolAtoms(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, MolAtoms, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, MolAtoms, name) - __repr__ = _swig_repr - __swig_setmethods__["name"] = _libpymolfile.MolAtoms_name_set - __swig_getmethods__["name"] = _libpymolfile.MolAtoms_name_get - if _newclass: - name = _swig_property(_libpymolfile.MolAtoms_name_get, _libpymolfile.MolAtoms_name_set) - __swig_setmethods__["type"] = _libpymolfile.MolAtoms_type_set - __swig_getmethods__["type"] = _libpymolfile.MolAtoms_type_get - if _newclass: - type = _swig_property(_libpymolfile.MolAtoms_type_get, _libpymolfile.MolAtoms_type_set) - __swig_setmethods__["resname"] = _libpymolfile.MolAtoms_resname_set - __swig_getmethods__["resname"] = _libpymolfile.MolAtoms_resname_get - if _newclass: - resname = _swig_property(_libpymolfile.MolAtoms_resname_get, _libpymolfile.MolAtoms_resname_set) - __swig_setmethods__["resid"] = _libpymolfile.MolAtoms_resid_set - __swig_getmethods__["resid"] = _libpymolfile.MolAtoms_resid_get - if _newclass: - resid = _swig_property(_libpymolfile.MolAtoms_resid_get, _libpymolfile.MolAtoms_resid_set) - __swig_setmethods__["segid"] = _libpymolfile.MolAtoms_segid_set - __swig_getmethods__["segid"] = _libpymolfile.MolAtoms_segid_get - if _newclass: - segid = _swig_property(_libpymolfile.MolAtoms_segid_get, _libpymolfile.MolAtoms_segid_set) - __swig_setmethods__["chain"] = _libpymolfile.MolAtoms_chain_set - __swig_getmethods__["chain"] = _libpymolfile.MolAtoms_chain_get - if _newclass: - chain = _swig_property(_libpymolfile.MolAtoms_chain_get, _libpymolfile.MolAtoms_chain_set) - __swig_setmethods__["altloc"] = _libpymolfile.MolAtoms_altloc_set - __swig_getmethods__["altloc"] = _libpymolfile.MolAtoms_altloc_get - if _newclass: - altloc = _swig_property(_libpymolfile.MolAtoms_altloc_get, _libpymolfile.MolAtoms_altloc_set) - __swig_setmethods__["insertion"] = _libpymolfile.MolAtoms_insertion_set - __swig_getmethods__["insertion"] = _libpymolfile.MolAtoms_insertion_get - if _newclass: - insertion = _swig_property(_libpymolfile.MolAtoms_insertion_get, _libpymolfile.MolAtoms_insertion_set) - __swig_setmethods__["occupancy"] = _libpymolfile.MolAtoms_occupancy_set - __swig_getmethods__["occupancy"] = _libpymolfile.MolAtoms_occupancy_get - if _newclass: - occupancy = _swig_property(_libpymolfile.MolAtoms_occupancy_get, _libpymolfile.MolAtoms_occupancy_set) - __swig_setmethods__["bfactor"] = _libpymolfile.MolAtoms_bfactor_set - __swig_getmethods__["bfactor"] = _libpymolfile.MolAtoms_bfactor_get - if _newclass: - bfactor = _swig_property(_libpymolfile.MolAtoms_bfactor_get, _libpymolfile.MolAtoms_bfactor_set) - __swig_setmethods__["mass"] = _libpymolfile.MolAtoms_mass_set - __swig_getmethods__["mass"] = _libpymolfile.MolAtoms_mass_get - if _newclass: - mass = _swig_property(_libpymolfile.MolAtoms_mass_get, _libpymolfile.MolAtoms_mass_set) - __swig_setmethods__["charge"] = _libpymolfile.MolAtoms_charge_set - __swig_getmethods__["charge"] = _libpymolfile.MolAtoms_charge_get - if _newclass: - charge = _swig_property(_libpymolfile.MolAtoms_charge_get, _libpymolfile.MolAtoms_charge_set) - __swig_setmethods__["radius"] = _libpymolfile.MolAtoms_radius_set - __swig_getmethods__["radius"] = _libpymolfile.MolAtoms_radius_get - if _newclass: - radius = _swig_property(_libpymolfile.MolAtoms_radius_get, _libpymolfile.MolAtoms_radius_set) - __swig_setmethods__["atomicnumber"] = _libpymolfile.MolAtoms_atomicnumber_set - __swig_getmethods__["atomicnumber"] = _libpymolfile.MolAtoms_atomicnumber_get - if _newclass: - atomicnumber = _swig_property(_libpymolfile.MolAtoms_atomicnumber_get, _libpymolfile.MolAtoms_atomicnumber_set) - __swig_setmethods__["ctnumber"] = _libpymolfile.MolAtoms_ctnumber_set - __swig_getmethods__["ctnumber"] = _libpymolfile.MolAtoms_ctnumber_get - if _newclass: - ctnumber = _swig_property(_libpymolfile.MolAtoms_ctnumber_get, _libpymolfile.MolAtoms_ctnumber_set) - - def __init__(self): - this = _libpymolfile.new_MolAtoms() - try: - self.this.append(this) - except __builtin__.Exception: - self.this = this - __swig_destroy__ = _libpymolfile.delete_MolAtoms - __del__ = lambda self: None -MolAtoms_swigregister = _libpymolfile.MolAtoms_swigregister -MolAtoms_swigregister(MolAtoms) - - -def del_plugin_structure(pymolfile_atoms: 'PyObject *') -> "void": - return _libpymolfile.del_plugin_structure(pymolfile_atoms) -del_plugin_structure = _libpymolfile.del_plugin_structure - -def alloc_plugin_structure(arg1: 'PyObject *', args: 'PyObject *') -> "PyObject *": - return _libpymolfile.alloc_plugin_structure(arg1, args) -alloc_plugin_structure = _libpymolfile.alloc_plugin_structure def del_plugin(pymolfile_plugin: 'PyObject *') -> "void": return _libpymolfile.del_plugin(pymolfile_plugin) @@ -243,6 +157,18 @@ def open_file_read(plugin: 'molfile_plugin_t *', fname: 'char *', ftype: 'char * def read_structure(molpack: 'PyObject *') -> "PyObject *": """read_structure(molpack) -> PyObject *""" return _libpymolfile.read_structure(molpack) + +def get_structure(molpack: 'PyObject *') -> "PyObject *": + """get_structure(molpack) -> PyObject *""" + return _libpymolfile.get_structure(molpack) + +def read_fill_structure(molpack: 'PyObject *', prototype: 'PyObject *') -> "PyObject *": + """read_fill_structure(molpack, prototype) -> PyObject *""" + return _libpymolfile.read_fill_structure(molpack, prototype) + +def print_array_struct(prototype: 'PyObject *') -> "PyObject *": + """print_array_struct(prototype) -> PyObject *""" + return _libpymolfile.print_array_struct(prototype) # This file is compatible with both classic and new-style classes. diff --git a/pymolfile/molfile/libpymolfile_wrap.cxx b/pymolfile/molfile/libpymolfile_wrap.cxx index 95bdb95..561451b 100644 --- a/pymolfile/molfile/libpymolfile_wrap.cxx +++ b/pymolfile/molfile/libpymolfile_wrap.cxx @@ -3003,12 +3003,11 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { /* -------- TYPES TABLE (BEGIN) -------- */ -#define SWIGTYPE_p_MolAtoms swig_types[0] -#define SWIGTYPE_p_char swig_types[1] -#define SWIGTYPE_p_molfile_plugin_t swig_types[2] -#define SWIGTYPE_p_p_molfile_plugin_t swig_types[3] -static swig_type_info *swig_types[5]; -static swig_module_info swig_module = {swig_types, 4, 0, 0, 0, 0}; +#define SWIGTYPE_p_char swig_types[0] +#define SWIGTYPE_p_molfile_plugin_t swig_types[1] +#define SWIGTYPE_p_p_molfile_plugin_t swig_types[2] +static swig_type_info *swig_types[4]; +static swig_module_info swig_module = {swig_types, 3, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -3149,7 +3148,7 @@ SWIGINTERNINLINE PyObject* - +/* struct MolAtoms { char name[16]; char type[16]; @@ -3175,7 +3174,7 @@ void del_plugin_structure(PyObject* pymolfile_atoms){ static PyObject* alloc_plugin_structure(PyObject *self, PyObject *args) { return PyCapsule_New((void*)new MolAtoms(), "plugin_structure", del_plugin_structure); } - +*/ void del_plugin(PyObject* pymolfile_plugin){ delete (MolObject*)PyCapsule_GetPointer(pymolfile_plugin, "plugin"); } @@ -3195,196 +3194,6 @@ static PyObject* alloc_plugin(PyObject *self, PyObject *args) { -SWIGINTERN swig_type_info* -SWIG_pchar_descriptor(void) -{ - static int init = 0; - static swig_type_info* info = 0; - if (!init) { - info = SWIG_TypeQuery("_p_char"); - init = 1; - } - return info; -} - - -SWIGINTERN int -SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) -{ -#if PY_VERSION_HEX>=0x03000000 -#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) - if (PyBytes_Check(obj)) -#else - if (PyUnicode_Check(obj)) -#endif -#else - if (PyString_Check(obj)) -#endif - { - char *cstr; Py_ssize_t len; -#if PY_VERSION_HEX>=0x03000000 -#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) - if (!alloc && cptr) { - /* We can't allow converting without allocation, since the internal - representation of string in Python 3 is UCS-2/UCS-4 but we require - a UTF-8 representation. - TODO(bhy) More detailed explanation */ - return SWIG_RuntimeError; - } - obj = PyUnicode_AsUTF8String(obj); - if(alloc) *alloc = SWIG_NEWOBJ; -#endif - PyBytes_AsStringAndSize(obj, &cstr, &len); -#else - PyString_AsStringAndSize(obj, &cstr, &len); -#endif - if (cptr) { - if (alloc) { - /* - In python the user should not be able to modify the inner - string representation. To warranty that, if you define - SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string - buffer is always returned. - - The default behavior is just to return the pointer value, - so, be careful. - */ -#if defined(SWIG_PYTHON_SAFE_CSTRINGS) - if (*alloc != SWIG_OLDOBJ) -#else - if (*alloc == SWIG_NEWOBJ) -#endif - { - *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1))); - *alloc = SWIG_NEWOBJ; - } else { - *cptr = cstr; - *alloc = SWIG_OLDOBJ; - } - } else { -#if PY_VERSION_HEX>=0x03000000 -#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) - *cptr = PyBytes_AsString(obj); -#else - assert(0); /* Should never reach here with Unicode strings in Python 3 */ -#endif -#else - *cptr = SWIG_Python_str_AsChar(obj); -#endif - } - } - if (psize) *psize = len + 1; -#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) - Py_XDECREF(obj); -#endif - return SWIG_OK; - } else { -#if defined(SWIG_PYTHON_2_UNICODE) -#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) -#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once" -#endif -#if PY_VERSION_HEX<0x03000000 - if (PyUnicode_Check(obj)) { - char *cstr; Py_ssize_t len; - if (!alloc && cptr) { - return SWIG_RuntimeError; - } - obj = PyUnicode_AsUTF8String(obj); - if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) { - if (cptr) { - if (alloc) *alloc = SWIG_NEWOBJ; - *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1))); - } - if (psize) *psize = len + 1; - - Py_XDECREF(obj); - return SWIG_OK; - } else { - Py_XDECREF(obj); - } - } -#endif -#endif - - swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); - if (pchar_descriptor) { - void* vptr = 0; - if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { - if (cptr) *cptr = (char *) vptr; - if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; - if (alloc) *alloc = SWIG_OLDOBJ; - return SWIG_OK; - } - } - } - return SWIG_TypeError; -} - - -SWIGINTERN int -SWIG_AsCharArray(PyObject * obj, char *val, size_t size) -{ - char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; - int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); - if (SWIG_IsOK(res)) { - /* special case of single char conversion when we don't need space for NUL */ - if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize; - if (csize <= size) { - if (val) { - if (csize) memcpy(val, cptr, csize*sizeof(char)); - if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char)); - } - if (alloc == SWIG_NEWOBJ) { - delete[] cptr; - res = SWIG_DelNewMask(res); - } - return res; - } - if (alloc == SWIG_NEWOBJ) delete[] cptr; - } - return SWIG_TypeError; -} - - -SWIGINTERNINLINE PyObject * -SWIG_FromCharPtrAndSize(const char* carray, size_t size) -{ - if (carray) { - if (size > INT_MAX) { - swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); - return pchar_descriptor ? - SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); - } else { -#if PY_VERSION_HEX >= 0x03000000 -#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) - return PyBytes_FromStringAndSize(carray, static_cast< Py_ssize_t >(size)); -#else -#if PY_VERSION_HEX >= 0x03010000 - return PyUnicode_DecodeUTF8(carray, static_cast< Py_ssize_t >(size), "surrogateescape"); -#else - return PyUnicode_FromStringAndSize(carray, static_cast< Py_ssize_t >(size)); -#endif -#endif -#else - return PyString_FromStringAndSize(carray, static_cast< Py_ssize_t >(size)); -#endif - } - } else { - return SWIG_Py_Void(); - } -} - - -SWIGINTERN size_t -SWIG_strnlen(const char* s, size_t maxlen) -{ - const char *p; - for (p = s; maxlen-- && *p; p++) - ; - return p - s; -} - - #include <limits.h> #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) @@ -3536,70 +3345,6 @@ SWIG_AsVal_int (PyObject * obj, int *val) } -/* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */ -#ifndef SWIG_isfinite -/* isfinite() is a macro for C99 */ -# if defined(isfinite) -# define SWIG_isfinite(X) (isfinite(X)) -# elif defined __cplusplus && __cplusplus >= 201103L -/* Use a template so that this works whether isfinite() is std::isfinite() or - * in the global namespace. The reality seems to vary between compiler - * versions. - * - * Make sure namespace std exists to avoid compiler warnings. - * - * extern "C++" is required as this fragment can end up inside an extern "C" { } block - */ -namespace std { } -extern "C++" template<typename T> -inline int SWIG_isfinite_func(T x) { - using namespace std; - return isfinite(x); -} -# define SWIG_isfinite(X) (SWIG_isfinite_func(X)) -# elif defined(_MSC_VER) -# define SWIG_isfinite(X) (_finite(X)) -# elif defined(__sun) && defined(__SVR4) -# include <ieeefp.h> -# define SWIG_isfinite(X) (finite(X)) -# endif -#endif - - -/* Accept infinite as a valid float value unless we are unable to check if a value is finite */ -#ifdef SWIG_isfinite -# define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX) && SWIG_isfinite(X)) -#else -# define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX)) -#endif - - -SWIGINTERN int -SWIG_AsVal_float (PyObject * obj, float *val) -{ - double v; - int res = SWIG_AsVal_double (obj, &v); - if (SWIG_IsOK(res)) { - if (SWIG_Float_Overflow_Check(v)) { - return SWIG_OverflowError; - } else { - if (val) *val = static_cast< float >(v); - } - } - return res; -} - - - #define SWIG_From_double PyFloat_FromDouble - - -SWIGINTERNINLINE PyObject * -SWIG_From_float (float value) -{ - return SWIG_From_double (value); -} - - PyObject * molfile_plugin_info(molfile_plugin_t** plugin_list, int plugin_no) { molfile_plugin_t *plugin; int *plugno = &plugin_no; @@ -3674,915 +3419,137 @@ PyObject * my_open_file_read(molfile_plugin_t* plugin, char* fname, char* ftype, } - - -#ifdef __cplusplus -extern "C" { -#endif -SWIGINTERN PyObject *_wrap_MolAtoms_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - char *arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - char temp2[16] ; - int res2 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_name_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_name_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - res2 = SWIG_AsCharArray(obj1, temp2, 16); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MolAtoms_name_set" "', argument " "2"" of type '" "char [16]""'"); +SWIGINTERN swig_type_info* +SWIG_pchar_descriptor(void) +{ + static int init = 0; + static swig_type_info* info = 0; + if (!init) { + info = SWIG_TypeQuery("_p_char"); + init = 1; } - arg2 = reinterpret_cast< char * >(temp2); - if (arg2) memcpy(arg1->name,arg2,16*sizeof(char)); - else memset(arg1->name,0,16*sizeof(char)); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; + return info; } -SWIGINTERN PyObject *_wrap_MolAtoms_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - char *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_name_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_name_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (char *)(char *) ((arg1)->name); +SWIGINTERN int +SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) +{ +#if PY_VERSION_HEX>=0x03000000 +#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) + if (PyBytes_Check(obj)) +#else + if (PyUnicode_Check(obj)) +#endif +#else + if (PyString_Check(obj)) +#endif { - size_t size = SWIG_strnlen(result, 16); - - - - resultobj = SWIG_FromCharPtrAndSize(result, size); - } - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - char *arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - char temp2[16] ; - int res2 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_type_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_type_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - res2 = SWIG_AsCharArray(obj1, temp2, 16); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MolAtoms_type_set" "', argument " "2"" of type '" "char [16]""'"); - } - arg2 = reinterpret_cast< char * >(temp2); - if (arg2) memcpy(arg1->type,arg2,16*sizeof(char)); - else memset(arg1->type,0,16*sizeof(char)); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - char *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_type_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_type_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (char *)(char *) ((arg1)->type); - { - size_t size = SWIG_strnlen(result, 16); - - - - resultobj = SWIG_FromCharPtrAndSize(result, size); - } - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_resname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - char *arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - char temp2[8] ; - int res2 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_resname_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_resname_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - res2 = SWIG_AsCharArray(obj1, temp2, 8); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MolAtoms_resname_set" "', argument " "2"" of type '" "char [8]""'"); - } - arg2 = reinterpret_cast< char * >(temp2); - if (arg2) memcpy(arg1->resname,arg2,8*sizeof(char)); - else memset(arg1->resname,0,8*sizeof(char)); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_resname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - char *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_resname_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_resname_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (char *)(char *) ((arg1)->resname); - { - size_t size = SWIG_strnlen(result, 8); - - - - resultobj = SWIG_FromCharPtrAndSize(result, size); - } - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_resid_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - int arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - int val2 ; - int ecode2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_resid_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_resid_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - ecode2 = SWIG_AsVal_int(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MolAtoms_resid_set" "', argument " "2"" of type '" "int""'"); - } - arg2 = static_cast< int >(val2); - if (arg1) (arg1)->resid = arg2; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_resid_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - int result; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_resid_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_resid_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (int) ((arg1)->resid); - resultobj = SWIG_From_int(static_cast< int >(result)); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_segid_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - char *arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - char temp2[8] ; - int res2 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_segid_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_segid_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - res2 = SWIG_AsCharArray(obj1, temp2, 8); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MolAtoms_segid_set" "', argument " "2"" of type '" "char [8]""'"); - } - arg2 = reinterpret_cast< char * >(temp2); - if (arg2) memcpy(arg1->segid,arg2,8*sizeof(char)); - else memset(arg1->segid,0,8*sizeof(char)); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_segid_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - char *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_segid_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_segid_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (char *)(char *) ((arg1)->segid); - { - size_t size = SWIG_strnlen(result, 8); - - - - resultobj = SWIG_FromCharPtrAndSize(result, size); - } - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_chain_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - char *arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - char temp2[2] ; - int res2 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_chain_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_chain_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - res2 = SWIG_AsCharArray(obj1, temp2, 2); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MolAtoms_chain_set" "', argument " "2"" of type '" "char [2]""'"); - } - arg2 = reinterpret_cast< char * >(temp2); - if (arg2) memcpy(arg1->chain,arg2,2*sizeof(char)); - else memset(arg1->chain,0,2*sizeof(char)); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_chain_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - char *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_chain_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_chain_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (char *)(char *) ((arg1)->chain); - { - size_t size = SWIG_strnlen(result, 2); - - - - resultobj = SWIG_FromCharPtrAndSize(result, size); - } - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_altloc_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - char *arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - char temp2[2] ; - int res2 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_altloc_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_altloc_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - res2 = SWIG_AsCharArray(obj1, temp2, 2); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MolAtoms_altloc_set" "', argument " "2"" of type '" "char [2]""'"); - } - arg2 = reinterpret_cast< char * >(temp2); - if (arg2) memcpy(arg1->altloc,arg2,2*sizeof(char)); - else memset(arg1->altloc,0,2*sizeof(char)); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_altloc_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - char *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_altloc_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_altloc_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (char *)(char *) ((arg1)->altloc); - { - size_t size = SWIG_strnlen(result, 2); - - - - resultobj = SWIG_FromCharPtrAndSize(result, size); - } - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_insertion_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - char *arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - char temp2[2] ; - int res2 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_insertion_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_insertion_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - res2 = SWIG_AsCharArray(obj1, temp2, 2); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MolAtoms_insertion_set" "', argument " "2"" of type '" "char [2]""'"); - } - arg2 = reinterpret_cast< char * >(temp2); - if (arg2) memcpy(arg1->insertion,arg2,2*sizeof(char)); - else memset(arg1->insertion,0,2*sizeof(char)); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_insertion_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - char *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_insertion_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_insertion_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (char *)(char *) ((arg1)->insertion); - { - size_t size = SWIG_strnlen(result, 2); - - - - resultobj = SWIG_FromCharPtrAndSize(result, size); - } - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_occupancy_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - float arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - float val2 ; - int ecode2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_occupancy_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_occupancy_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - ecode2 = SWIG_AsVal_float(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MolAtoms_occupancy_set" "', argument " "2"" of type '" "float""'"); - } - arg2 = static_cast< float >(val2); - if (arg1) (arg1)->occupancy = arg2; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_occupancy_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - float result; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_occupancy_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_occupancy_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (float) ((arg1)->occupancy); - resultobj = SWIG_From_float(static_cast< float >(result)); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_bfactor_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - float arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - float val2 ; - int ecode2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_bfactor_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_bfactor_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - ecode2 = SWIG_AsVal_float(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MolAtoms_bfactor_set" "', argument " "2"" of type '" "float""'"); - } - arg2 = static_cast< float >(val2); - if (arg1) (arg1)->bfactor = arg2; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_bfactor_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - float result; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_bfactor_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_bfactor_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (float) ((arg1)->bfactor); - resultobj = SWIG_From_float(static_cast< float >(result)); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_mass_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - float arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - float val2 ; - int ecode2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_mass_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_mass_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - ecode2 = SWIG_AsVal_float(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MolAtoms_mass_set" "', argument " "2"" of type '" "float""'"); - } - arg2 = static_cast< float >(val2); - if (arg1) (arg1)->mass = arg2; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_mass_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - float result; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_mass_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_mass_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (float) ((arg1)->mass); - resultobj = SWIG_From_float(static_cast< float >(result)); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_charge_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - float arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - float val2 ; - int ecode2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_charge_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_charge_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - ecode2 = SWIG_AsVal_float(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MolAtoms_charge_set" "', argument " "2"" of type '" "float""'"); - } - arg2 = static_cast< float >(val2); - if (arg1) (arg1)->charge = arg2; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_charge_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - float result; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_charge_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_charge_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (float) ((arg1)->charge); - resultobj = SWIG_From_float(static_cast< float >(result)); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_radius_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - float arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - float val2 ; - int ecode2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_radius_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_radius_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - ecode2 = SWIG_AsVal_float(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MolAtoms_radius_set" "', argument " "2"" of type '" "float""'"); - } - arg2 = static_cast< float >(val2); - if (arg1) (arg1)->radius = arg2; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_radius_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - float result; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_radius_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_radius_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (float) ((arg1)->radius); - resultobj = SWIG_From_float(static_cast< float >(result)); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_atomicnumber_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - float arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - float val2 ; - int ecode2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_atomicnumber_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_atomicnumber_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - ecode2 = SWIG_AsVal_float(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MolAtoms_atomicnumber_set" "', argument " "2"" of type '" "float""'"); - } - arg2 = static_cast< float >(val2); - if (arg1) (arg1)->atomicnumber = arg2; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_atomicnumber_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - float result; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_atomicnumber_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_atomicnumber_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (float) ((arg1)->atomicnumber); - resultobj = SWIG_From_float(static_cast< float >(result)); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_ctnumber_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - float arg2 ; - void *argp1 = 0 ; - int res1 = 0 ; - float val2 ; - int ecode2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MolAtoms_ctnumber_set",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_ctnumber_set" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - ecode2 = SWIG_AsVal_float(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MolAtoms_ctnumber_set" "', argument " "2"" of type '" "float""'"); - } - arg2 = static_cast< float >(val2); - if (arg1) (arg1)->ctnumber = arg2; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MolAtoms_ctnumber_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - float result; - - if (!PyArg_ParseTuple(args,(char *)"O:MolAtoms_ctnumber_get",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MolAtoms_ctnumber_get" "', argument " "1"" of type '" "MolAtoms *""'"); - } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - result = (float) ((arg1)->ctnumber); - resultobj = SWIG_From_float(static_cast< float >(result)); - return resultobj; -fail: - return NULL; -} - + char *cstr; Py_ssize_t len; +#if PY_VERSION_HEX>=0x03000000 +#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) + if (!alloc && cptr) { + /* We can't allow converting without allocation, since the internal + representation of string in Python 3 is UCS-2/UCS-4 but we require + a UTF-8 representation. + TODO(bhy) More detailed explanation */ + return SWIG_RuntimeError; + } + obj = PyUnicode_AsUTF8String(obj); + if(alloc) *alloc = SWIG_NEWOBJ; +#endif + PyBytes_AsStringAndSize(obj, &cstr, &len); +#else + PyString_AsStringAndSize(obj, &cstr, &len); +#endif + if (cptr) { + if (alloc) { + /* + In python the user should not be able to modify the inner + string representation. To warranty that, if you define + SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string + buffer is always returned. -SWIGINTERN PyObject *_wrap_new_MolAtoms(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)":new_MolAtoms")) SWIG_fail; - result = (MolAtoms *)new MolAtoms(); - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MolAtoms, SWIG_POINTER_NEW | 0 ); - return resultobj; -fail: - return NULL; -} + The default behavior is just to return the pointer value, + so, be careful. + */ +#if defined(SWIG_PYTHON_SAFE_CSTRINGS) + if (*alloc != SWIG_OLDOBJ) +#else + if (*alloc == SWIG_NEWOBJ) +#endif + { + *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1))); + *alloc = SWIG_NEWOBJ; + } else { + *cptr = cstr; + *alloc = SWIG_OLDOBJ; + } + } else { +#if PY_VERSION_HEX>=0x03000000 +#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) + *cptr = PyBytes_AsString(obj); +#else + assert(0); /* Should never reach here with Unicode strings in Python 3 */ +#endif +#else + *cptr = SWIG_Python_str_AsChar(obj); +#endif + } + } + if (psize) *psize = len + 1; +#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) + Py_XDECREF(obj); +#endif + return SWIG_OK; + } else { +#if defined(SWIG_PYTHON_2_UNICODE) +#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) +#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once" +#endif +#if PY_VERSION_HEX<0x03000000 + if (PyUnicode_Check(obj)) { + char *cstr; Py_ssize_t len; + if (!alloc && cptr) { + return SWIG_RuntimeError; + } + obj = PyUnicode_AsUTF8String(obj); + if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) { + if (cptr) { + if (alloc) *alloc = SWIG_NEWOBJ; + *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1))); + } + if (psize) *psize = len + 1; + Py_XDECREF(obj); + return SWIG_OK; + } else { + Py_XDECREF(obj); + } + } +#endif +#endif -SWIGINTERN PyObject *_wrap_delete_MolAtoms(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MolAtoms *arg1 = (MolAtoms *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:delete_MolAtoms",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MolAtoms, SWIG_POINTER_DISOWN | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MolAtoms" "', argument " "1"" of type '" "MolAtoms *""'"); + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + if (pchar_descriptor) { + void* vptr = 0; + if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { + if (cptr) *cptr = (char *) vptr; + if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; + if (alloc) *alloc = SWIG_OLDOBJ; + return SWIG_OK; + } + } } - arg1 = reinterpret_cast< MolAtoms * >(argp1); - delete arg1; - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *MolAtoms_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *obj; - if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL; - SWIG_TypeNewClientData(SWIGTYPE_p_MolAtoms, SWIG_NewClientData(obj)); - return SWIG_Py_Void(); -} - -SWIGINTERN PyObject *_wrap_del_plugin_structure(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - PyObject *arg1 = (PyObject *) 0 ; - PyObject * obj0 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:del_plugin_structure",&obj0)) SWIG_fail; - arg1 = obj0; - del_plugin_structure(arg1); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; + return SWIG_TypeError; } -SWIGINTERN PyObject *_wrap_alloc_plugin_structure(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - PyObject *arg1 = (PyObject *) 0 ; - PyObject *arg2 = (PyObject *) 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - PyObject *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:alloc_plugin_structure",&obj0,&obj1)) SWIG_fail; - arg1 = obj0; - arg2 = obj1; - result = (PyObject *)alloc_plugin_structure(arg1,arg2); - resultobj = result; - return resultobj; -fail: - return NULL; -} +#ifdef __cplusplus +extern "C" { +#endif SWIGINTERN PyObject *_wrap_del_plugin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; @@ -4834,43 +3801,59 @@ fail: } +SWIGINTERN PyObject *_wrap_get_structure(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + PyObject *arg1 = (PyObject *) 0 ; + PyObject * obj0 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:get_structure",&obj0)) SWIG_fail; + arg1 = obj0; + result = (PyObject *)get_structure(arg1); + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_read_fill_structure(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + PyObject *arg1 = (PyObject *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:read_fill_structure",&obj0,&obj1)) SWIG_fail; + arg1 = obj0; + arg2 = obj1; + result = (PyObject *)read_fill_structure(arg1,arg2); + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_print_array_struct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + PyObject *arg1 = (PyObject *) 0 ; + PyObject * obj0 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:print_array_struct",&obj0)) SWIG_fail; + arg1 = obj0; + result = (PyObject *)print_array_struct(arg1); + resultobj = result; + return resultobj; +fail: + return NULL; +} + + static PyMethodDef SwigMethods[] = { { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, - { (char *)"MolAtoms_name_set", _wrap_MolAtoms_name_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_name_get", _wrap_MolAtoms_name_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_type_set", _wrap_MolAtoms_type_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_type_get", _wrap_MolAtoms_type_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_resname_set", _wrap_MolAtoms_resname_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_resname_get", _wrap_MolAtoms_resname_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_resid_set", _wrap_MolAtoms_resid_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_resid_get", _wrap_MolAtoms_resid_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_segid_set", _wrap_MolAtoms_segid_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_segid_get", _wrap_MolAtoms_segid_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_chain_set", _wrap_MolAtoms_chain_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_chain_get", _wrap_MolAtoms_chain_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_altloc_set", _wrap_MolAtoms_altloc_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_altloc_get", _wrap_MolAtoms_altloc_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_insertion_set", _wrap_MolAtoms_insertion_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_insertion_get", _wrap_MolAtoms_insertion_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_occupancy_set", _wrap_MolAtoms_occupancy_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_occupancy_get", _wrap_MolAtoms_occupancy_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_bfactor_set", _wrap_MolAtoms_bfactor_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_bfactor_get", _wrap_MolAtoms_bfactor_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_mass_set", _wrap_MolAtoms_mass_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_mass_get", _wrap_MolAtoms_mass_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_charge_set", _wrap_MolAtoms_charge_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_charge_get", _wrap_MolAtoms_charge_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_radius_set", _wrap_MolAtoms_radius_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_radius_get", _wrap_MolAtoms_radius_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_atomicnumber_set", _wrap_MolAtoms_atomicnumber_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_atomicnumber_get", _wrap_MolAtoms_atomicnumber_get, METH_VARARGS, NULL}, - { (char *)"MolAtoms_ctnumber_set", _wrap_MolAtoms_ctnumber_set, METH_VARARGS, NULL}, - { (char *)"MolAtoms_ctnumber_get", _wrap_MolAtoms_ctnumber_get, METH_VARARGS, NULL}, - { (char *)"new_MolAtoms", _wrap_new_MolAtoms, METH_VARARGS, NULL}, - { (char *)"delete_MolAtoms", _wrap_delete_MolAtoms, METH_VARARGS, NULL}, - { (char *)"MolAtoms_swigregister", MolAtoms_swigregister, METH_VARARGS, NULL}, - { (char *)"del_plugin_structure", _wrap_del_plugin_structure, METH_VARARGS, NULL}, - { (char *)"alloc_plugin_structure", _wrap_alloc_plugin_structure, METH_VARARGS, NULL}, { (char *)"del_plugin", _wrap_del_plugin, METH_VARARGS, NULL}, { (char *)"del_atoms", _wrap_del_atoms, METH_VARARGS, NULL}, { (char *)"del_atomname", _wrap_del_atomname, METH_VARARGS, NULL}, @@ -4882,31 +3865,30 @@ static PyMethodDef SwigMethods[] = { { (char *)"molfile_plugin_info", _wrap_molfile_plugin_info, METH_VARARGS, (char *)"molfile_plugin_info(plugin_list, plugin_no) -> PyObject *"}, { (char *)"open_file_read", _wrap_open_file_read, METH_VARARGS, (char *)"open_file_read(plugin, fname, ftype, natoms) -> PyObject *"}, { (char *)"read_structure", _wrap_read_structure, METH_VARARGS, (char *)"read_structure(molpack) -> PyObject *"}, + { (char *)"get_structure", _wrap_get_structure, METH_VARARGS, (char *)"get_structure(molpack) -> PyObject *"}, + { (char *)"read_fill_structure", _wrap_read_fill_structure, METH_VARARGS, (char *)"read_fill_structure(molpack, prototype) -> PyObject *"}, + { (char *)"print_array_struct", _wrap_print_array_struct, METH_VARARGS, (char *)"print_array_struct(prototype) -> PyObject *"}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ -static swig_type_info _swigt__p_MolAtoms = {"_p_MolAtoms", "MolAtoms *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_molfile_plugin_t = {"_p_molfile_plugin_t", "molfile_plugin_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_molfile_plugin_t = {"_p_p_molfile_plugin_t", "molfile_plugin_t **", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { - &_swigt__p_MolAtoms, &_swigt__p_char, &_swigt__p_molfile_plugin_t, &_swigt__p_p_molfile_plugin_t, }; -static swig_cast_info _swigc__p_MolAtoms[] = { {&_swigt__p_MolAtoms, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_molfile_plugin_t[] = { {&_swigt__p_molfile_plugin_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_molfile_plugin_t[] = { {&_swigt__p_p_molfile_plugin_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { - _swigc__p_MolAtoms, _swigc__p_char, _swigc__p_molfile_plugin_t, _swigc__p_p_molfile_plugin_t, diff --git a/pymolfile/molfile/numind-cython/compile-numind.sh b/pymolfile/molfile/numind-cython/compile-numind.sh new file mode 100644 index 0000000..680fa4e --- /dev/null +++ b/pymolfile/molfile/numind-cython/compile-numind.sh @@ -0,0 +1,2 @@ +Cython -a numind.pyx --cplus +g++ -fPIC -Wall -Wextra -Wunused-function -shared -I/labEnv3/lib/python3.6/site-packages/numpy/core/include/ numind.cpp -o numind.so -I/labEnv3/include/python3.6m/ -L/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib -lpython3.6 diff --git a/pymolfile/molfile/numind-cython/numind.cpp b/pymolfile/molfile/numind-cython/numind.cpp new file mode 100644 index 0000000..3313212 --- /dev/null +++ b/pymolfile/molfile/numind-cython/numind.cpp @@ -0,0 +1,5454 @@ +/* Generated by Cython 0.26.1 */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) + #error Cython requires Python 2.6+ or Python 3.2+. +#else +#define CYTHON_ABI "0_26_1" +#include <stddef.h> +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x03030000 || (PY_MAJOR_VERSION == 2 && PY_VERSION_HEX >= 0x02070000) + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#if PY_VERSION_HEX < 0x030700A0 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject **args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject **args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template<class T> void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include <stdint.h> +#endif +#ifndef CYTHON_FALLTHROUGH + #ifdef __cplusplus + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) || (defined(__GNUC__) && defined(__attribute__)) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef __cplusplus + #error "Cython files generated with the C++ option must be compiled with a C++ compiler." +#endif +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #else + #define CYTHON_INLINE inline + #endif +#endif +template<typename T> +void __Pyx_call_destructor(T& x) { + x.~T(); +} +template<typename T> +class __Pyx_FakeReference { + public: + __Pyx_FakeReference() : ptr(NULL) { } + __Pyx_FakeReference(const T& ref) : ptr(const_cast<T*>(&ref)) { } + T *operator->() { return ptr; } + T *operator&() { return ptr; } + operator T&() { return *ptr; } + template<typename U> bool operator ==(U other) { return *ptr == other; } + template<typename U> bool operator !=(U other) { return *ptr != other; } + private: + T *ptr; +}; + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include <math.h> +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + + +#define __PYX_ERR(f_index, lineno, Ln_error) \ +{ \ + __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +} + +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__numind +#define __PYX_HAVE_API__numind +#include "stdlib.h" +#include "numind.h" +#ifdef _OPENMP +#include <omp.h> +#endif /* _OPENMP */ + +#ifdef PYREX_WITHOUT_ASSERTIONS +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +#if defined (__cplusplus) && __cplusplus >= 201103L + #include <cstdlib> + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) && defined (_M_X64) + #define __Pyx_sst_abs(value) _abs64(value) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if PY_MAJOR_VERSION < 3 +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen +#endif +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + + +static const char *__pyx_f[] = { + "numind.pyx", + "stringsource", +}; + +/*--- Type declarations ---*/ +struct __pyx_obj_6numind_NumInd; +struct __pyx_t_6numind_PyArrayInterface; +typedef struct __pyx_t_6numind_PyArrayInterface __pyx_t_6numind_PyArrayInterface; + +/* "numind.pyx":42 + * byteorder = {'<':'little', '>':'big'} + * + * ctypedef struct PyArrayInterface: # <<<<<<<<<<<<<< + * int version # contains the integer 2 as a sanity check + * int nd # number of dimensions + */ +struct __pyx_t_6numind_PyArrayInterface { + int version; + int nd; + char typekind; + int itemsize; + int flags; + Py_intptr_t *shape; + Py_intptr_t *strides; + void *data; +}; + +/* "numind.pyx":56 + * + * + * cdef class NumInd: # <<<<<<<<<<<<<< + * cdef void *data + * cdef int _nd + */ +struct __pyx_obj_6numind_NumInd { + PyObject_HEAD + struct __pyx_vtabstruct_6numind_NumInd *__pyx_vtab; + void *data; + int _nd; + Py_intptr_t *_shape; + Py_intptr_t *_strides; + __pyx_t_6numind_PyArrayInterface *inter; + PyObject *_t_shape; + PyObject *_t_strides; + PyObject *_undarray; +}; + + + +struct __pyx_vtabstruct_6numind_NumInd { + __pyx_t_6numind_PyArrayInterface *(*_get_array_interface)(struct __pyx_obj_6numind_NumInd *); +}; +static struct __pyx_vtabstruct_6numind_NumInd *__pyx_vtabptr_6numind_NumInd; + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* SetItemInt.proto */ +#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\ + __Pyx_SetItemInt_Generic(o, to_py_func(i), v))) +static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v); +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, + int is_list, int wraparound, int boundscheck); + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* HasAttr.proto */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); + +/* UnicodeAsUCS4.proto */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); + +/* object_ord.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyObject_Ord(c)\ + (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c)) +#else +#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c) +#endif +static long __Pyx__PyObject_Ord(PyObject* c); + +/* IncludeStringH.proto */ +#include <string.h> + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* GetModuleGlobalName.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = PyThreadState_GET(); +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* WriteUnraisableException.proto */ +static void __Pyx_WriteUnraisable(const char *name, int clineno, + int lineno, const char *filename, + int full_traceback, int nogil); + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyObject *dict, void *vtable); + +/* SetupReduce.proto */ +static int __Pyx_setup_reduce(PyObject* type_obj); + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* CLineInTraceback.proto */ +static int __Pyx_CLineForTraceback(int c_line); + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_char(char value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE Py_intptr_t __Pyx_PyInt_As_Py_intptr_t(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +static __pyx_t_6numind_PyArrayInterface *__pyx_f_6numind_6NumInd__get_array_interface(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto*/ + +/* Module declarations from 'cpython.pycapsule' */ + +/* Module declarations from 'numind' */ +static PyTypeObject *__pyx_ptype_6numind_NumInd = 0; +static void *__pyx_f_6numind_free_array_interface(PyObject *); /*proto*/ +#define __Pyx_MODULE_NAME "numind" +int __pyx_module_is_main_numind = 0; + +/* Implementation of 'numind' */ +static PyObject *__pyx_builtin_chr; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_TypeError; +static const char __pyx_k_f[] = "f"; +static const char __pyx_k_i[] = "i"; +static const char __pyx_k__3[] = "|"; +static const char __pyx_k__6[] = "<"; +static const char __pyx_k__7[] = ">"; +static const char __pyx_k_big[] = "big"; +static const char __pyx_k_chr[] = "chr"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_data[] = "data"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_little[] = "little"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_ALIGNED[] = "ALIGNED"; +static const char __pyx_k_FORTRAN[] = "FORTRAN"; +static const char __pyx_k_strides[] = "strides"; +static const char __pyx_k_typestr[] = "typestr"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_readonly[] = "readonly"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_undarray[] = "undarray"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_WRITEABLE[] = "WRITEABLE"; +static const char __pyx_k_byteorder[] = "byteorder"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_CONTIGUOUS[] = "CONTIGUOUS"; +static const char __pyx_k_NOTSWAPPED[] = "NOTSWAPPED"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_array_struct[] = "__array_struct__"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_array_interface[] = "__array_interface__"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_self__shape_self__strides_self_d[] = "self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling"; +static PyObject *__pyx_n_s_ALIGNED; +static PyObject *__pyx_n_s_CONTIGUOUS; +static PyObject *__pyx_n_s_FORTRAN; +static PyObject *__pyx_n_s_MemoryError; +static PyObject *__pyx_n_s_NOTSWAPPED; +static PyObject *__pyx_n_s_TypeError; +static PyObject *__pyx_n_s_WRITEABLE; +static PyObject *__pyx_kp_s__3; +static PyObject *__pyx_kp_s__6; +static PyObject *__pyx_kp_s__7; +static PyObject *__pyx_n_s_array_interface; +static PyObject *__pyx_n_s_array_struct; +static PyObject *__pyx_n_s_big; +static PyObject *__pyx_n_s_byteorder; +static PyObject *__pyx_n_s_chr; +static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_n_s_data; +static PyObject *__pyx_n_s_f; +static PyObject *__pyx_n_s_getstate; +static PyObject *__pyx_n_s_i; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_little; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_n_s_pyx_vtable; +static PyObject *__pyx_n_s_readonly; +static PyObject *__pyx_n_s_reduce; +static PyObject *__pyx_n_s_reduce_cython; +static PyObject *__pyx_n_s_reduce_ex; +static PyObject *__pyx_kp_s_self__shape_self__strides_self_d; +static PyObject *__pyx_n_s_setstate; +static PyObject *__pyx_n_s_setstate_cython; +static PyObject *__pyx_n_s_shape; +static PyObject *__pyx_n_s_strides; +static PyObject *__pyx_n_s_sys; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_typestr; +static PyObject *__pyx_n_s_undarray; +static int __pyx_pf_6numind_6NumInd___init__(struct __pyx_obj_6numind_NumInd *__pyx_v_self, PyObject *__pyx_v_undarray); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_8undarray___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_5shape___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_7strides___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_7typestr___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_8typekind___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_8readonly___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_16__array_struct_____get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_2modify(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static void __pyx_pf_6numind_6NumInd_4__dealloc__(struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_6numind_NumInd *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_6numind_6NumInd_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_6numind_NumInd *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_tp_new_6numind_NumInd(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_int_2; +static PyObject *__pyx_int_256; +static PyObject *__pyx_int_512; +static PyObject *__pyx_int_1024; +static PyObject *__pyx_slice_; +static PyObject *__pyx_slice__2; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_tuple__5; + +/* "numind.pyx":52 + * void *data # A pointer to the first element of the array + * + * cdef void* free_array_interface(object arr): # <<<<<<<<<<<<<< + * Py_DECREF(arr) + * + */ + +static void *__pyx_f_6numind_free_array_interface(PyObject *__pyx_v_arr) { + void *__pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("free_array_interface", 0); + + /* "numind.pyx":53 + * + * cdef void* free_array_interface(object arr): + * Py_DECREF(arr) # <<<<<<<<<<<<<< + * + * + */ + Py_DECREF(__pyx_v_arr); + + /* "numind.pyx":52 + * void *data # A pointer to the first element of the array + * + * cdef void* free_array_interface(object arr): # <<<<<<<<<<<<<< + * Py_DECREF(arr) + * + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":64 + * cdef object _t_shape, _t_strides, _undarray + * + * def __init__(self, object undarray): # <<<<<<<<<<<<<< + * cdef int i, stride + * cdef object array_shape, array_strides + */ + +/* Python wrapper */ +static int __pyx_pw_6numind_6NumInd_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_6numind_6NumInd_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_undarray = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_undarray,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_undarray)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 64, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + } + __pyx_v_undarray = values[0]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 64, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("numind.NumInd.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6numind_6NumInd___init__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self), __pyx_v_undarray); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_6numind_6NumInd___init__(struct __pyx_obj_6numind_NumInd *__pyx_v_self, PyObject *__pyx_v_undarray) { + int __pyx_v_i; + int __pyx_v_stride; + PyObject *__pyx_v_array_shape = 0; + PyObject *__pyx_v_array_strides = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + Py_intptr_t __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "numind.pyx":69 + * + * # Keep a reference to the underlying object + * self._undarray = undarray # <<<<<<<<<<<<<< + * # Get the shape and strides C arrays + * array_shape = undarray.__array_interface__["shape"] + */ + __Pyx_INCREF(__pyx_v_undarray); + __Pyx_GIVEREF(__pyx_v_undarray); + __Pyx_GOTREF(__pyx_v_self->_undarray); + __Pyx_DECREF(__pyx_v_self->_undarray); + __pyx_v_self->_undarray = __pyx_v_undarray; + + /* "numind.pyx":71 + * self._undarray = undarray + * # Get the shape and strides C arrays + * array_shape = undarray.__array_interface__["shape"] # <<<<<<<<<<<<<< + * self._t_shape = array_shape + * # The number of dimensions + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_undarray, __pyx_n_s_array_interface); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_shape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_array_shape = __pyx_t_2; + __pyx_t_2 = 0; + + /* "numind.pyx":72 + * # Get the shape and strides C arrays + * array_shape = undarray.__array_interface__["shape"] + * self._t_shape = array_shape # <<<<<<<<<<<<<< + * # The number of dimensions + * self._nd = len(array_shape) + */ + __Pyx_INCREF(__pyx_v_array_shape); + __Pyx_GIVEREF(__pyx_v_array_shape); + __Pyx_GOTREF(__pyx_v_self->_t_shape); + __Pyx_DECREF(__pyx_v_self->_t_shape); + __pyx_v_self->_t_shape = __pyx_v_array_shape; + + /* "numind.pyx":74 + * self._t_shape = array_shape + * # The number of dimensions + * self._nd = len(array_shape) # <<<<<<<<<<<<<< + * # The shape + * self._shape = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + */ + __pyx_t_3 = PyObject_Length(__pyx_v_array_shape); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 74, __pyx_L1_error) + __pyx_v_self->_nd = __pyx_t_3; + + /* "numind.pyx":76 + * self._nd = len(array_shape) + * # The shape + * self._shape = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) # <<<<<<<<<<<<<< + * for i from 0 <= i < self._nd: + * self._shape[i] = self._t_shape[i] + */ + __pyx_v_self->_shape = ((Py_intptr_t *)malloc((__pyx_v_self->_nd * (sizeof(Py_intptr_t))))); + + /* "numind.pyx":77 + * # The shape + * self._shape = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + * for i from 0 <= i < self._nd: # <<<<<<<<<<<<<< + * self._shape[i] = self._t_shape[i] + * # The strides (compute them if needed) + */ + __pyx_t_4 = __pyx_v_self->_nd; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { + + /* "numind.pyx":78 + * self._shape = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + * for i from 0 <= i < self._nd: + * self._shape[i] = self._t_shape[i] # <<<<<<<<<<<<<< + * # The strides (compute them if needed) + * array_strides = undarray.__array_interface__["strides"] + */ + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_self->_t_shape, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_2); if (unlikely((__pyx_t_5 == ((Py_intptr_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + (__pyx_v_self->_shape[__pyx_v_i]) = __pyx_t_5; + } + + /* "numind.pyx":80 + * self._shape[i] = self._t_shape[i] + * # The strides (compute them if needed) + * array_strides = undarray.__array_interface__["strides"] # <<<<<<<<<<<<<< + * self._t_strides = array_strides + * self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_undarray, __pyx_n_s_array_interface); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 80, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyObject_GetItem(__pyx_t_2, __pyx_n_s_strides); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_array_strides = __pyx_t_1; + __pyx_t_1 = 0; + + /* "numind.pyx":81 + * # The strides (compute them if needed) + * array_strides = undarray.__array_interface__["strides"] + * self._t_strides = array_strides # <<<<<<<<<<<<<< + * self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + * if array_strides: + */ + __Pyx_INCREF(__pyx_v_array_strides); + __Pyx_GIVEREF(__pyx_v_array_strides); + __Pyx_GOTREF(__pyx_v_self->_t_strides); + __Pyx_DECREF(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_v_array_strides; + + /* "numind.pyx":82 + * array_strides = undarray.__array_interface__["strides"] + * self._t_strides = array_strides + * self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) # <<<<<<<<<<<<<< + * if array_strides: + * for i from 0 <= i < self._nd: + */ + __pyx_v_self->_strides = ((Py_intptr_t *)malloc((__pyx_v_self->_nd * (sizeof(Py_intptr_t))))); + + /* "numind.pyx":83 + * self._t_strides = array_strides + * self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + * if array_strides: # <<<<<<<<<<<<<< + * for i from 0 <= i < self._nd: + * self._strides[i] = array_strides[i] + */ + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_array_strides); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 83, __pyx_L1_error) + if (__pyx_t_6) { + + /* "numind.pyx":84 + * self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + * if array_strides: + * for i from 0 <= i < self._nd: # <<<<<<<<<<<<<< + * self._strides[i] = array_strides[i] + * else: + */ + __pyx_t_4 = __pyx_v_self->_nd; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { + + /* "numind.pyx":85 + * if array_strides: + * for i from 0 <= i < self._nd: + * self._strides[i] = array_strides[i] # <<<<<<<<<<<<<< + * else: + * # strides is None. Compute them explicitely. + */ + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_array_strides, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyInt_As_Py_intptr_t(__pyx_t_1); if (unlikely((__pyx_t_5 == ((Py_intptr_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + (__pyx_v_self->_strides[__pyx_v_i]) = __pyx_t_5; + } + + /* "numind.pyx":83 + * self._t_strides = array_strides + * self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + * if array_strides: # <<<<<<<<<<<<<< + * for i from 0 <= i < self._nd: + * self._strides[i] = array_strides[i] + */ + goto __pyx_L5; + } + + /* "numind.pyx":88 + * else: + * # strides is None. Compute them explicitely. + * self._t_strides = [0] * self._nd # <<<<<<<<<<<<<< + * stride = int(self.typestr[2:]) + * for i from self._nd > i >= 0: + */ + /*else*/ { + __pyx_t_1 = PyList_New(1 * ((__pyx_v_self->_nd<0) ? 0:__pyx_v_self->_nd)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_self->_nd; __pyx_temp++) { + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + PyList_SET_ITEM(__pyx_t_1, __pyx_temp, __pyx_int_0); + } + } + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_t_strides); + __Pyx_DECREF(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_t_1; + __pyx_t_1 = 0; + + /* "numind.pyx":89 + * # strides is None. Compute them explicitely. + * self._t_strides = [0] * self._nd + * stride = int(self.typestr[2:]) # <<<<<<<<<<<<<< + * for i from self._nd > i >= 0: + * self._strides[i] = stride + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_typestr); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetSlice(__pyx_t_1, 2, 0, NULL, NULL, &__pyx_slice_, 1, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_stride = __pyx_t_4; + + /* "numind.pyx":90 + * self._t_strides = [0] * self._nd + * stride = int(self.typestr[2:]) + * for i from self._nd > i >= 0: # <<<<<<<<<<<<<< + * self._strides[i] = stride + * self._t_strides[i] = stride + */ + for (__pyx_v_i = __pyx_v_self->_nd-1; __pyx_v_i >= 0; __pyx_v_i--) { + + /* "numind.pyx":91 + * stride = int(self.typestr[2:]) + * for i from self._nd > i >= 0: + * self._strides[i] = stride # <<<<<<<<<<<<<< + * self._t_strides[i] = stride + * stride = stride * array_shape[i] + */ + (__pyx_v_self->_strides[__pyx_v_i]) = __pyx_v_stride; + + /* "numind.pyx":92 + * for i from self._nd > i >= 0: + * self._strides[i] = stride + * self._t_strides[i] = stride # <<<<<<<<<<<<<< + * stride = stride * array_shape[i] + * self._t_strides = tuple(self._t_strides) + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_stride); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely(__Pyx_SetItemInt(__pyx_v_self->_t_strides, __pyx_v_i, __pyx_t_1, int, 1, __Pyx_PyInt_From_int, 0, 1, 1) < 0)) __PYX_ERR(0, 92, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "numind.pyx":93 + * self._strides[i] = stride + * self._t_strides[i] = stride + * stride = stride * array_shape[i] # <<<<<<<<<<<<<< + * self._t_strides = tuple(self._t_strides) + * # Populate the C array interface + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_stride); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_array_shape, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_7); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_stride = __pyx_t_4; + } + + /* "numind.pyx":94 + * self._t_strides[i] = stride + * stride = stride * array_shape[i] + * self._t_strides = tuple(self._t_strides) # <<<<<<<<<<<<<< + * # Populate the C array interface + * self.inter = self._get_array_interface() + */ + __pyx_t_7 = PySequence_Tuple(__pyx_v_self->_t_strides); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 94, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_v_self->_t_strides); + __Pyx_DECREF(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_t_7; + __pyx_t_7 = 0; + } + __pyx_L5:; + + /* "numind.pyx":96 + * self._t_strides = tuple(self._t_strides) + * # Populate the C array interface + * self.inter = self._get_array_interface() # <<<<<<<<<<<<<< + * + * # Properties. This are visible from Python space. + */ + __pyx_v_self->inter = ((struct __pyx_vtabstruct_6numind_NumInd *)__pyx_v_self->__pyx_vtab)->_get_array_interface(__pyx_v_self); + + /* "numind.pyx":64 + * cdef object _t_shape, _t_strides, _undarray + * + * def __init__(self, object undarray): # <<<<<<<<<<<<<< + * cdef int i, stride + * cdef object array_shape, array_strides + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("numind.NumInd.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_array_shape); + __Pyx_XDECREF(__pyx_v_array_strides); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":102 + * + * property undarray: # Returns the underlying array + * def __get__(self): # <<<<<<<<<<<<<< + * return self._undarray + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8undarray_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8undarray_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8undarray___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8undarray___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "numind.pyx":103 + * property undarray: # Returns the underlying array + * def __get__(self): + * return self._undarray # <<<<<<<<<<<<<< + * + * property shape: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_undarray); + __pyx_r = __pyx_v_self->_undarray; + goto __pyx_L0; + + /* "numind.pyx":102 + * + * property undarray: # Returns the underlying array + * def __get__(self): # <<<<<<<<<<<<<< + * return self._undarray + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":106 + * + * property shape: + * def __get__(self): # <<<<<<<<<<<<<< + * return self._t_shape + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_5shape_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_5shape___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_5shape___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "numind.pyx":107 + * property shape: + * def __get__(self): + * return self._t_shape # <<<<<<<<<<<<<< + * + * property strides: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_t_shape); + __pyx_r = __pyx_v_self->_t_shape; + goto __pyx_L0; + + /* "numind.pyx":106 + * + * property shape: + * def __get__(self): # <<<<<<<<<<<<<< + * return self._t_shape + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":110 + * + * property strides: + * def __get__(self): # <<<<<<<<<<<<<< + * return self._t_strides + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_7strides_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_7strides___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_7strides___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "numind.pyx":111 + * property strides: + * def __get__(self): + * return self._t_strides # <<<<<<<<<<<<<< + * + * property typestr: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_t_strides); + __pyx_r = __pyx_v_self->_t_strides; + goto __pyx_L0; + + /* "numind.pyx":110 + * + * property strides: + * def __get__(self): # <<<<<<<<<<<<<< + * return self._t_strides + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":114 + * + * property typestr: + * def __get__(self): # <<<<<<<<<<<<<< + * return self._undarray.__array_interface__["typestr"] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_7typestr_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_7typestr_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_7typestr___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_7typestr___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "numind.pyx":115 + * property typestr: + * def __get__(self): + * return self._undarray.__array_interface__["typestr"] # <<<<<<<<<<<<<< + * + * property typekind: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_undarray, __pyx_n_s_array_interface); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 115, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_typestr); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 115, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "numind.pyx":114 + * + * property typestr: + * def __get__(self): # <<<<<<<<<<<<<< + * return self._undarray.__array_interface__["typestr"] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("numind.NumInd.typestr.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":118 + * + * property typekind: + * def __get__(self): # <<<<<<<<<<<<<< + * return chr(self.inter.typekind) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8typekind_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8typekind_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8typekind___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8typekind___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "numind.pyx":119 + * property typekind: + * def __get__(self): + * return chr(self.inter.typekind) # <<<<<<<<<<<<<< + * + * property readonly: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_char(__pyx_v_self->inter->typekind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 119, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_chr, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "numind.pyx":118 + * + * property typekind: + * def __get__(self): # <<<<<<<<<<<<<< + * return chr(self.inter.typekind) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("numind.NumInd.typekind.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":122 + * + * property readonly: + * def __get__(self): # <<<<<<<<<<<<<< + * return self._undarray.__array_interface__["data"][1] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8readonly_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8readonly_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8readonly___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8readonly___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "numind.pyx":123 + * property readonly: + * def __get__(self): + * return self._undarray.__array_interface__["data"][1] # <<<<<<<<<<<<<< + * + * property __array_struct__: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_undarray, __pyx_n_s_array_interface); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_data); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "numind.pyx":122 + * + * property readonly: + * def __get__(self): # <<<<<<<<<<<<<< + * return self._undarray.__array_interface__["data"][1] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("numind.NumInd.readonly.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":127 + * property __array_struct__: + * "Allows other numerical packages to obtain a new object." + * def __get__(self): # <<<<<<<<<<<<<< + * if hasattr(self._undarray, "__array_struct__"): + * return self._undarray.__array_struct__ + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_16__array_struct___1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_16__array_struct___1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_16__array_struct_____get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_16__array_struct_____get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "numind.pyx":128 + * "Allows other numerical packages to obtain a new object." + * def __get__(self): + * if hasattr(self._undarray, "__array_struct__"): # <<<<<<<<<<<<<< + * return self._undarray.__array_struct__ + * else: + */ + __pyx_t_1 = __pyx_v_self->_undarray; + __Pyx_INCREF(__pyx_t_1); + __pyx_t_2 = __Pyx_HasAttr(__pyx_t_1, __pyx_n_s_array_struct); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "numind.pyx":129 + * def __get__(self): + * if hasattr(self._undarray, "__array_struct__"): + * return self._undarray.__array_struct__ # <<<<<<<<<<<<<< + * else: + * # No an underlying array with __array_struct__ + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_undarray, __pyx_n_s_array_struct); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "numind.pyx":128 + * "Allows other numerical packages to obtain a new object." + * def __get__(self): + * if hasattr(self._undarray, "__array_struct__"): # <<<<<<<<<<<<<< + * return self._undarray.__array_struct__ + * else: + */ + } + + /* "numind.pyx":133 + * # No an underlying array with __array_struct__ + * # Deliver an equivalent PyCObject. + * Py_INCREF(self) # <<<<<<<<<<<<<< + * return PyCapsule_New(<void*>self.inter, + * "struct array", + */ + /*else*/ { + Py_INCREF(((PyObject *)__pyx_v_self)); + + /* "numind.pyx":134 + * # Deliver an equivalent PyCObject. + * Py_INCREF(self) + * return PyCapsule_New(<void*>self.inter, # <<<<<<<<<<<<<< + * "struct array", + * <PyCapsule_Destructor>free_array_interface) + */ + __Pyx_XDECREF(__pyx_r); + + /* "numind.pyx":136 + * return PyCapsule_New(<void*>self.inter, + * "struct array", + * <PyCapsule_Destructor>free_array_interface) # <<<<<<<<<<<<<< + * + * cdef PyArrayInterface *_get_array_interface(self): + */ + __pyx_t_1 = PyCapsule_New(((void *)__pyx_v_self->inter), ((char *)"struct array"), ((PyCapsule_Destructor)__pyx_f_6numind_free_array_interface)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 134, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + } + + /* "numind.pyx":127 + * property __array_struct__: + * "Allows other numerical packages to obtain a new object." + * def __get__(self): # <<<<<<<<<<<<<< + * if hasattr(self._undarray, "__array_struct__"): + * return self._undarray.__array_struct__ + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numind.NumInd.__array_struct__.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":138 + * <PyCapsule_Destructor>free_array_interface) + * + * cdef PyArrayInterface *_get_array_interface(self): # <<<<<<<<<<<<<< + * "Populates the array interface" + * cdef PyArrayInterface *inter + */ + +static __pyx_t_6numind_PyArrayInterface *__pyx_f_6numind_6NumInd__get_array_interface(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + __pyx_t_6numind_PyArrayInterface *__pyx_v_inter; + PyObject *__pyx_v_undarray = 0; + PyObject *__pyx_v_data_address = 0; + PyObject *__pyx_v_typestr = 0; + PyObject *__pyx_v_obj = 0; + __pyx_t_6numind_PyArrayInterface *__pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + long __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + Py_intptr_t *__pyx_t_8; + __Pyx_RefNannySetupContext("_get_array_interface", 0); + + /* "numind.pyx":144 + * cdef object obj + * + * undarray = self._undarray # <<<<<<<<<<<<<< + * typestr = self.typestr + * inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface)) + */ + __pyx_t_1 = __pyx_v_self->_undarray; + __Pyx_INCREF(__pyx_t_1); + __pyx_v_undarray = __pyx_t_1; + __pyx_t_1 = 0; + + /* "numind.pyx":145 + * + * undarray = self._undarray + * typestr = self.typestr # <<<<<<<<<<<<<< + * inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface)) + * if inter is NULL: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_typestr); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_typestr = __pyx_t_1; + __pyx_t_1 = 0; + + /* "numind.pyx":146 + * undarray = self._undarray + * typestr = self.typestr + * inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface)) # <<<<<<<<<<<<<< + * if inter is NULL: + * raise MemoryError() + */ + __pyx_v_inter = ((__pyx_t_6numind_PyArrayInterface *)malloc((sizeof(__pyx_t_6numind_PyArrayInterface)))); + + /* "numind.pyx":147 + * typestr = self.typestr + * inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface)) + * if inter is NULL: # <<<<<<<<<<<<<< + * raise MemoryError() + * + */ + __pyx_t_2 = ((__pyx_v_inter == NULL) != 0); + if (__pyx_t_2) { + + /* "numind.pyx":148 + * inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface)) + * if inter is NULL: + * raise MemoryError() # <<<<<<<<<<<<<< + * + * inter.version = 2 + */ + PyErr_NoMemory(); __PYX_ERR(0, 148, __pyx_L1_error) + + /* "numind.pyx":147 + * typestr = self.typestr + * inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface)) + * if inter is NULL: # <<<<<<<<<<<<<< + * raise MemoryError() + * + */ + } + + /* "numind.pyx":150 + * raise MemoryError() + * + * inter.version = 2 # <<<<<<<<<<<<<< + * inter.nd = self._nd + * inter.typekind = ord(typestr[1]) + */ + __pyx_v_inter->version = 2; + + /* "numind.pyx":151 + * + * inter.version = 2 + * inter.nd = self._nd # <<<<<<<<<<<<<< + * inter.typekind = ord(typestr[1]) + * inter.itemsize = int(typestr[2:]) + */ + __pyx_t_3 = __pyx_v_self->_nd; + __pyx_v_inter->nd = __pyx_t_3; + + /* "numind.pyx":152 + * inter.version = 2 + * inter.nd = self._nd + * inter.typekind = ord(typestr[1]) # <<<<<<<<<<<<<< + * inter.itemsize = int(typestr[2:]) + * inter.flags = 0 # initialize flags + */ + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_typestr, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_4 == (long)(Py_UCS4)-1)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_inter->typekind = __pyx_t_4; + + /* "numind.pyx":153 + * inter.nd = self._nd + * inter.typekind = ord(typestr[1]) + * inter.itemsize = int(typestr[2:]) # <<<<<<<<<<<<<< + * inter.flags = 0 # initialize flags + * if typestr[0] == '|': + */ + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_v_typestr, 2, 0, NULL, NULL, &__pyx_slice__2, 1, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_inter->itemsize = __pyx_t_3; + + /* "numind.pyx":154 + * inter.typekind = ord(typestr[1]) + * inter.itemsize = int(typestr[2:]) + * inter.flags = 0 # initialize flags # <<<<<<<<<<<<<< + * if typestr[0] == '|': + * inter.flags = inter.flags | NOTSWAPPED + */ + __pyx_v_inter->flags = 0; + + /* "numind.pyx":155 + * inter.itemsize = int(typestr[2:]) + * inter.flags = 0 # initialize flags + * if typestr[0] == '|': # <<<<<<<<<<<<<< + * inter.flags = inter.flags | NOTSWAPPED + * elif byteorder[typestr[0]] == sys.byteorder: + */ + __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_typestr, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 155, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_5, __pyx_kp_s__3, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 155, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_2) { + + /* "numind.pyx":156 + * inter.flags = 0 # initialize flags + * if typestr[0] == '|': + * inter.flags = inter.flags | NOTSWAPPED # <<<<<<<<<<<<<< + * elif byteorder[typestr[0]] == sys.byteorder: + * inter.flags = inter.flags | NOTSWAPPED + */ + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_inter->flags); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_NOTSWAPPED); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyNumber_Or(__pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_inter->flags = __pyx_t_3; + + /* "numind.pyx":155 + * inter.itemsize = int(typestr[2:]) + * inter.flags = 0 # initialize flags + * if typestr[0] == '|': # <<<<<<<<<<<<<< + * inter.flags = inter.flags | NOTSWAPPED + * elif byteorder[typestr[0]] == sys.byteorder: + */ + goto __pyx_L4; + } + + /* "numind.pyx":157 + * if typestr[0] == '|': + * inter.flags = inter.flags | NOTSWAPPED + * elif byteorder[typestr[0]] == sys.byteorder: # <<<<<<<<<<<<<< + * inter.flags = inter.flags | NOTSWAPPED + * if not self.readonly: + */ + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_byteorder); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_typestr, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = PyObject_GetItem(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_sys); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_byteorder); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "numind.pyx":158 + * inter.flags = inter.flags | NOTSWAPPED + * elif byteorder[typestr[0]] == sys.byteorder: + * inter.flags = inter.flags | NOTSWAPPED # <<<<<<<<<<<<<< + * if not self.readonly: + * inter.flags = inter.flags | WRITEABLE + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_inter->flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_NOTSWAPPED); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = PyNumber_Or(__pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_inter->flags = __pyx_t_3; + + /* "numind.pyx":157 + * if typestr[0] == '|': + * inter.flags = inter.flags | NOTSWAPPED + * elif byteorder[typestr[0]] == sys.byteorder: # <<<<<<<<<<<<<< + * inter.flags = inter.flags | NOTSWAPPED + * if not self.readonly: + */ + } + __pyx_L4:; + + /* "numind.pyx":159 + * elif byteorder[typestr[0]] == sys.byteorder: + * inter.flags = inter.flags | NOTSWAPPED + * if not self.readonly: # <<<<<<<<<<<<<< + * inter.flags = inter.flags | WRITEABLE + * # XXX how to determine the ALIGNED flag? + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_readonly); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_7 = ((!__pyx_t_2) != 0); + if (__pyx_t_7) { + + /* "numind.pyx":160 + * inter.flags = inter.flags | NOTSWAPPED + * if not self.readonly: + * inter.flags = inter.flags | WRITEABLE # <<<<<<<<<<<<<< + * # XXX how to determine the ALIGNED flag? + * inter.strides = self._strides + */ + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_inter->flags); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_WRITEABLE); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = PyNumber_Or(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_inter->flags = __pyx_t_3; + + /* "numind.pyx":159 + * elif byteorder[typestr[0]] == sys.byteorder: + * inter.flags = inter.flags | NOTSWAPPED + * if not self.readonly: # <<<<<<<<<<<<<< + * inter.flags = inter.flags | WRITEABLE + * # XXX how to determine the ALIGNED flag? + */ + } + + /* "numind.pyx":162 + * inter.flags = inter.flags | WRITEABLE + * # XXX how to determine the ALIGNED flag? + * inter.strides = self._strides # <<<<<<<<<<<<<< + * inter.shape = self._shape + * # Get the data address + */ + __pyx_t_8 = __pyx_v_self->_strides; + __pyx_v_inter->strides = __pyx_t_8; + + /* "numind.pyx":163 + * # XXX how to determine the ALIGNED flag? + * inter.strides = self._strides + * inter.shape = self._shape # <<<<<<<<<<<<<< + * # Get the data address + * obj = undarray.__array_interface__["data"] + */ + __pyx_t_8 = __pyx_v_self->_shape; + __pyx_v_inter->shape = __pyx_t_8; + + /* "numind.pyx":165 + * inter.shape = self._shape + * # Get the data address + * obj = undarray.__array_interface__["data"] # <<<<<<<<<<<<<< + * data_address = obj[0] + * inter.data = <void*>PyInt_AsLong(data_address) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_undarray, __pyx_n_s_array_interface); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_data); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_obj = __pyx_t_6; + __pyx_t_6 = 0; + + /* "numind.pyx":166 + * # Get the data address + * obj = undarray.__array_interface__["data"] + * data_address = obj[0] # <<<<<<<<<<<<<< + * inter.data = <void*>PyInt_AsLong(data_address) + * return inter + */ + __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_obj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 166, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_data_address = __pyx_t_6; + __pyx_t_6 = 0; + + /* "numind.pyx":167 + * obj = undarray.__array_interface__["data"] + * data_address = obj[0] + * inter.data = <void*>PyInt_AsLong(data_address) # <<<<<<<<<<<<<< + * return inter + * + */ + __pyx_v_inter->data = ((void *)PyInt_AsLong(__pyx_v_data_address)); + + /* "numind.pyx":168 + * data_address = obj[0] + * inter.data = <void*>PyInt_AsLong(data_address) + * return inter # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_inter; + goto __pyx_L0; + + /* "numind.pyx":138 + * <PyCapsule_Destructor>free_array_interface) + * + * cdef PyArrayInterface *_get_array_interface(self): # <<<<<<<<<<<<<< + * "Populates the array interface" + * cdef PyArrayInterface *inter + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_WriteUnraisable("numind.NumInd._get_array_interface", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_undarray); + __Pyx_XDECREF(__pyx_v_data_address); + __Pyx_XDECREF(__pyx_v_typestr); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":173 + * # This is just an example on how to modify the data in C space + * # (and at C speed! :-) + * def modify(self): # <<<<<<<<<<<<<< + * "Modify the values of the underlying array" + * cdef long *ldata + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_3modify(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_6numind_6NumInd_2modify[] = "Modify the values of the underlying array"; +static PyObject *__pyx_pw_6numind_6NumInd_3modify(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("modify (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_2modify(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_2modify(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + long *__pyx_v_ldata; + double *__pyx_v_fdata; + int __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + Py_intptr_t __pyx_t_4; + __Pyx_RefNannySetupContext("modify", 0); + + /* "numind.pyx":180 + * + * # Modify just the first row + * if chr(self.inter.typekind) == 'i': # <<<<<<<<<<<<<< + * ldata = <long *>self.inter.data + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + */ + __pyx_t_1 = __Pyx_PyInt_From_char(__pyx_v_self->inter->typekind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 180, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 180, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_chr, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 180, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_n_s_i, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 180, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_3) { + + /* "numind.pyx":181 + * # Modify just the first row + * if chr(self.inter.typekind) == 'i': + * ldata = <long *>self.inter.data # <<<<<<<<<<<<<< + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + * ldata[i] = ldata[i] + 1 + */ + __pyx_v_ldata = ((long *)__pyx_v_self->inter->data); + + /* "numind.pyx":182 + * if chr(self.inter.typekind) == 'i': + * ldata = <long *>self.inter.data + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: # <<<<<<<<<<<<<< + * ldata[i] = ldata[i] + 1 + * elif chr(self.inter.typekind) == 'f': + */ + __pyx_t_4 = (__pyx_v_self->inter->shape[(__pyx_v_self->inter->nd - 1)]); + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { + + /* "numind.pyx":183 + * ldata = <long *>self.inter.data + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + * ldata[i] = ldata[i] + 1 # <<<<<<<<<<<<<< + * elif chr(self.inter.typekind) == 'f': + * fdata = <double *>self.inter.data + */ + (__pyx_v_ldata[__pyx_v_i]) = ((__pyx_v_ldata[__pyx_v_i]) + 1); + } + + /* "numind.pyx":180 + * + * # Modify just the first row + * if chr(self.inter.typekind) == 'i': # <<<<<<<<<<<<<< + * ldata = <long *>self.inter.data + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + */ + goto __pyx_L3; + } + + /* "numind.pyx":184 + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + * ldata[i] = ldata[i] + 1 + * elif chr(self.inter.typekind) == 'f': # <<<<<<<<<<<<<< + * fdata = <double *>self.inter.data + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + */ + __pyx_t_1 = __Pyx_PyInt_From_char(__pyx_v_self->inter->typekind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_chr, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_n_s_f, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_3) { + + /* "numind.pyx":185 + * ldata[i] = ldata[i] + 1 + * elif chr(self.inter.typekind) == 'f': + * fdata = <double *>self.inter.data # <<<<<<<<<<<<<< + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + * fdata[i] = fdata[i] + 1 + */ + __pyx_v_fdata = ((double *)__pyx_v_self->inter->data); + + /* "numind.pyx":186 + * elif chr(self.inter.typekind) == 'f': + * fdata = <double *>self.inter.data + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: # <<<<<<<<<<<<<< + * fdata[i] = fdata[i] + 1 + * + */ + __pyx_t_4 = (__pyx_v_self->inter->shape[(__pyx_v_self->inter->nd - 1)]); + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { + + /* "numind.pyx":187 + * fdata = <double *>self.inter.data + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + * fdata[i] = fdata[i] + 1 # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + (__pyx_v_fdata[__pyx_v_i]) = ((__pyx_v_fdata[__pyx_v_i]) + 1.0); + } + + /* "numind.pyx":184 + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + * ldata[i] = ldata[i] + 1 + * elif chr(self.inter.typekind) == 'f': # <<<<<<<<<<<<<< + * fdata = <double *>self.inter.data + * for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + */ + } + __pyx_L3:; + + /* "numind.pyx":173 + * # This is just an example on how to modify the data in C space + * # (and at C speed! :-) + * def modify(self): # <<<<<<<<<<<<<< + * "Modify the values of the underlying array" + * cdef long *ldata + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("numind.NumInd.modify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "numind.pyx":189 + * fdata[i] = fdata[i] + 1 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * free(self._shape) + * free(self._strides) + */ + +/* Python wrapper */ +static void __pyx_pw_6numind_6NumInd_5__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_6numind_6NumInd_5__dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_pf_6numind_6NumInd_4__dealloc__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_6numind_6NumInd_4__dealloc__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "numind.pyx":190 + * + * def __dealloc__(self): + * free(self._shape) # <<<<<<<<<<<<<< + * free(self._strides) + * free(self.inter) + */ + free(__pyx_v_self->_shape); + + /* "numind.pyx":191 + * def __dealloc__(self): + * free(self._shape) + * free(self._strides) # <<<<<<<<<<<<<< + * free(self.inter) + */ + free(__pyx_v_self->_strides); + + /* "numind.pyx":192 + * free(self._shape) + * free(self._strides) + * free(self.inter) # <<<<<<<<<<<<<< + */ + free(__pyx_v_self->inter); + + /* "numind.pyx":189 + * fdata[i] = fdata[i] + 1 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * free(self._shape) + * free(self._strides) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_6__reduce_cython__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numind.NumInd.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8__setstate_cython__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_6numind_NumInd *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numind.NumInd.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_6numind_NumInd __pyx_vtable_6numind_NumInd; + +static PyObject *__pyx_tp_new_6numind_NumInd(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_6numind_NumInd *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_6numind_NumInd *)o); + p->__pyx_vtab = __pyx_vtabptr_6numind_NumInd; + p->_t_shape = Py_None; Py_INCREF(Py_None); + p->_t_strides = Py_None; Py_INCREF(Py_None); + p->_undarray = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_6numind_NumInd(PyObject *o) { + struct __pyx_obj_6numind_NumInd *p = (struct __pyx_obj_6numind_NumInd *)o; + #if PY_VERSION_HEX >= 0x030400a1 + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_pw_6numind_6NumInd_5__dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->_t_shape); + Py_CLEAR(p->_t_strides); + Py_CLEAR(p->_undarray); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_6numind_NumInd(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_6numind_NumInd *p = (struct __pyx_obj_6numind_NumInd *)o; + if (p->_t_shape) { + e = (*v)(p->_t_shape, a); if (e) return e; + } + if (p->_t_strides) { + e = (*v)(p->_t_strides, a); if (e) return e; + } + if (p->_undarray) { + e = (*v)(p->_undarray, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_6numind_NumInd(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_6numind_NumInd *p = (struct __pyx_obj_6numind_NumInd *)o; + tmp = ((PyObject*)p->_t_shape); + p->_t_shape = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_t_strides); + p->_t_strides = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_undarray); + p->_undarray = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_6numind_6NumInd_undarray(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_6numind_6NumInd_8undarray_1__get__(o); +} + +static PyObject *__pyx_getprop_6numind_6NumInd_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_6numind_6NumInd_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop_6numind_6NumInd_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_6numind_6NumInd_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop_6numind_6NumInd_typestr(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_6numind_6NumInd_7typestr_1__get__(o); +} + +static PyObject *__pyx_getprop_6numind_6NumInd_typekind(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_6numind_6NumInd_8typekind_1__get__(o); +} + +static PyObject *__pyx_getprop_6numind_6NumInd_readonly(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_6numind_6NumInd_8readonly_1__get__(o); +} + +static PyObject *__pyx_getprop_6numind_6NumInd___array_struct__(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_6numind_6NumInd_16__array_struct___1__get__(o); +} + +static PyMethodDef __pyx_methods_6numind_NumInd[] = { + {"modify", (PyCFunction)__pyx_pw_6numind_6NumInd_3modify, METH_NOARGS, __pyx_doc_6numind_6NumInd_2modify}, + {"__reduce_cython__", (PyCFunction)__pyx_pw_6numind_6NumInd_7__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_6numind_6NumInd_9__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_6numind_NumInd[] = { + {(char *)"undarray", __pyx_getprop_6numind_6NumInd_undarray, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop_6numind_6NumInd_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop_6numind_6NumInd_strides, 0, (char *)0, 0}, + {(char *)"typestr", __pyx_getprop_6numind_6NumInd_typestr, 0, (char *)0, 0}, + {(char *)"typekind", __pyx_getprop_6numind_6NumInd_typekind, 0, (char *)0, 0}, + {(char *)"readonly", __pyx_getprop_6numind_6NumInd_readonly, 0, (char *)0, 0}, + {(char *)"__array_struct__", __pyx_getprop_6numind_6NumInd___array_struct__, 0, (char *)"Allows other numerical packages to obtain a new object.", 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_6numind_NumInd = { + PyVarObject_HEAD_INIT(0, 0) + "numind.NumInd", /*tp_name*/ + sizeof(struct __pyx_obj_6numind_NumInd), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_6numind_NumInd, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_6numind_NumInd, /*tp_traverse*/ + __pyx_tp_clear_6numind_NumInd, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_6numind_NumInd, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_6numind_NumInd, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_6numind_6NumInd_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_6numind_NumInd, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef __pyx_moduledef = { + #if PY_VERSION_HEX < 0x03020000 + { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, + #else + PyModuleDef_HEAD_INIT, + #endif + "numind", + 0, /* m_doc */ + -1, /* m_size */ + __pyx_methods /* m_methods */, + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_ALIGNED, __pyx_k_ALIGNED, sizeof(__pyx_k_ALIGNED), 0, 0, 1, 1}, + {&__pyx_n_s_CONTIGUOUS, __pyx_k_CONTIGUOUS, sizeof(__pyx_k_CONTIGUOUS), 0, 0, 1, 1}, + {&__pyx_n_s_FORTRAN, __pyx_k_FORTRAN, sizeof(__pyx_k_FORTRAN), 0, 0, 1, 1}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_n_s_NOTSWAPPED, __pyx_k_NOTSWAPPED, sizeof(__pyx_k_NOTSWAPPED), 0, 0, 1, 1}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_n_s_WRITEABLE, __pyx_k_WRITEABLE, sizeof(__pyx_k_WRITEABLE), 0, 0, 1, 1}, + {&__pyx_kp_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 0}, + {&__pyx_kp_s__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 0, 1, 0}, + {&__pyx_kp_s__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 0, 1, 0}, + {&__pyx_n_s_array_interface, __pyx_k_array_interface, sizeof(__pyx_k_array_interface), 0, 0, 1, 1}, + {&__pyx_n_s_array_struct, __pyx_k_array_struct, sizeof(__pyx_k_array_struct), 0, 0, 1, 1}, + {&__pyx_n_s_big, __pyx_k_big, sizeof(__pyx_k_big), 0, 0, 1, 1}, + {&__pyx_n_s_byteorder, __pyx_k_byteorder, sizeof(__pyx_k_byteorder), 0, 0, 1, 1}, + {&__pyx_n_s_chr, __pyx_k_chr, sizeof(__pyx_k_chr), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, + {&__pyx_n_s_f, __pyx_k_f, sizeof(__pyx_k_f), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_little, __pyx_k_little, sizeof(__pyx_k_little), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_readonly, __pyx_k_readonly, sizeof(__pyx_k_readonly), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_kp_s_self__shape_self__strides_self_d, __pyx_k_self__shape_self__strides_self_d, sizeof(__pyx_k_self__shape_self__strides_self_d), 0, 0, 1, 0}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_strides, __pyx_k_strides, sizeof(__pyx_k_strides), 0, 0, 1, 1}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_typestr, __pyx_k_typestr, sizeof(__pyx_k_typestr), 0, 0, 1, 1}, + {&__pyx_n_s_undarray, __pyx_k_undarray, sizeof(__pyx_k_undarray), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_chr = __Pyx_GetBuiltinName(__pyx_n_s_chr); if (!__pyx_builtin_chr) __PYX_ERR(0, 119, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(0, 148, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "numind.pyx":89 + * # strides is None. Compute them explicitely. + * self._t_strides = [0] * self._nd + * stride = int(self.typestr[2:]) # <<<<<<<<<<<<<< + * for i from self._nd > i >= 0: + * self._strides[i] = stride + */ + __pyx_slice_ = PySlice_New(__pyx_int_2, Py_None, Py_None); if (unlikely(!__pyx_slice_)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice_); + __Pyx_GIVEREF(__pyx_slice_); + + /* "numind.pyx":153 + * inter.nd = self._nd + * inter.typekind = ord(typestr[1]) + * inter.itemsize = int(typestr[2:]) # <<<<<<<<<<<<<< + * inter.flags = 0 # initialize flags + * if typestr[0] == '|': + */ + __pyx_slice__2 = PySlice_New(__pyx_int_2, Py_None, Py_None); if (unlikely(!__pyx_slice__2)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__2); + __Pyx_GIVEREF(__pyx_slice__2); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + */ + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_self__shape_self__strides_self_d); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "(tree fragment)":4 + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("self._shape,self._strides,self.data,self.inter cannot be converted to a Python object for pickling") # <<<<<<<<<<<<<< + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_self__shape_self__strides_self_d); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_256 = PyInt_FromLong(256); if (unlikely(!__pyx_int_256)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_512 = PyInt_FromLong(512); if (unlikely(!__pyx_int_512)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1024 = PyInt_FromLong(1024); if (unlikely(!__pyx_int_1024)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC initnumind(void); /*proto*/ +PyMODINIT_FUNC initnumind(void) +#else +PyMODINIT_FUNC PyInit_numind(void); /*proto*/ +PyMODINIT_FUNC PyInit_numind(void) +#endif +{ + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannyDeclarations + #if CYTHON_REFNANNY + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); + if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); + } + #endif + __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_numind(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("numind", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_numind) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "numind")) { + if (unlikely(PyDict_SetItemString(modules, "numind", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global init code ---*/ + /*--- Variable export code ---*/ + /*--- Function export code ---*/ + /*--- Type init code ---*/ + __pyx_vtabptr_6numind_NumInd = &__pyx_vtable_6numind_NumInd; + __pyx_vtable_6numind_NumInd._get_array_interface = (__pyx_t_6numind_PyArrayInterface *(*)(struct __pyx_obj_6numind_NumInd *))__pyx_f_6numind_6NumInd__get_array_interface; + if (PyType_Ready(&__pyx_type_6numind_NumInd) < 0) __PYX_ERR(0, 56, __pyx_L1_error) + __pyx_type_6numind_NumInd.tp_print = 0; + if (__Pyx_SetVtable(__pyx_type_6numind_NumInd.tp_dict, __pyx_vtabptr_6numind_NumInd) < 0) __PYX_ERR(0, 56, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "NumInd", (PyObject *)&__pyx_type_6numind_NumInd) < 0) __PYX_ERR(0, 56, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_6numind_NumInd) < 0) __PYX_ERR(0, 56, __pyx_L1_error) + __pyx_ptype_6numind_NumInd = &__pyx_type_6numind_NumInd; + /*--- Type import code ---*/ + /*--- Variable import code ---*/ + /*--- Function import code ---*/ + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "numind.pyx":13 + * # Author: Francesc Altet + * + * import sys # <<<<<<<<<<<<<< + * from cpython.pycapsule cimport * + * + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_sys, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_1) < 0) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "numind.pyx":33 + * + * # for PyArrayInterface: + * CONTIGUOUS=0x01 # <<<<<<<<<<<<<< + * FORTRAN=0x02 + * ALIGNED=0x100 + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_CONTIGUOUS, __pyx_int_1) < 0) __PYX_ERR(0, 33, __pyx_L1_error) + + /* "numind.pyx":34 + * # for PyArrayInterface: + * CONTIGUOUS=0x01 + * FORTRAN=0x02 # <<<<<<<<<<<<<< + * ALIGNED=0x100 + * NOTSWAPPED=0x200 + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FORTRAN, __pyx_int_2) < 0) __PYX_ERR(0, 34, __pyx_L1_error) + + /* "numind.pyx":35 + * CONTIGUOUS=0x01 + * FORTRAN=0x02 + * ALIGNED=0x100 # <<<<<<<<<<<<<< + * NOTSWAPPED=0x200 + * WRITEABLE=0x400 + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ALIGNED, __pyx_int_256) < 0) __PYX_ERR(0, 35, __pyx_L1_error) + + /* "numind.pyx":36 + * FORTRAN=0x02 + * ALIGNED=0x100 + * NOTSWAPPED=0x200 # <<<<<<<<<<<<<< + * WRITEABLE=0x400 + * + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_NOTSWAPPED, __pyx_int_512) < 0) __PYX_ERR(0, 36, __pyx_L1_error) + + /* "numind.pyx":37 + * ALIGNED=0x100 + * NOTSWAPPED=0x200 + * WRITEABLE=0x400 # <<<<<<<<<<<<<< + * + * # byteorder dictionary + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_WRITEABLE, __pyx_int_1024) < 0) __PYX_ERR(0, 37, __pyx_L1_error) + + /* "numind.pyx":40 + * + * # byteorder dictionary + * byteorder = {'<':'little', '>':'big'} # <<<<<<<<<<<<<< + * + * ctypedef struct PyArrayInterface: + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s__6, __pyx_n_s_little) < 0) __PYX_ERR(0, 40, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s__7, __pyx_n_s_big) < 0) __PYX_ERR(0, 40, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_byteorder, __pyx_t_1) < 0) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "numind.pyx":1 + * # This Pyrex extension class can take a numpy/numarray/Numeric object # <<<<<<<<<<<<<< + * # as a parameter and wrap it so that its information can be accessed + * # in a standard way, both in Python space and C space. + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init numind", 0, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init numind"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* GetItemInt */ +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* SliceObject */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + PyErr_Format(PyExc_TypeError, + "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name); +bad: + return NULL; +} + +/* SetItemInt */ +static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) { + int r; + if (!j) return -1; + r = PyObject_SetItem(o, j, v); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list, + CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o)); + if ((!boundscheck) || likely((n >= 0) & (n < PyList_GET_SIZE(o)))) { + PyObject* old = PyList_GET_ITEM(o, n); + Py_INCREF(v); + PyList_SET_ITEM(o, n, v); + Py_DECREF(old); + return 1; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_ass_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return -1; + PyErr_Clear(); + } + } + return m->sq_ass_item(o, i, v); + } + } +#else +#if CYTHON_COMPILING_IN_PYPY + if (is_list || (PySequence_Check(o) && !PyDict_Check(o))) { +#else + if (is_list || PySequence_Check(o)) { +#endif + return PySequence_SetItem(o, i, v); + } +#endif + return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); +} + +/* PyObjectCall */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* GetAttr */ + static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_COMPILING_IN_CPYTHON +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* HasAttr */ + static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (unlikely(!r)) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} + +/* UnicodeAsUCS4 */ + static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) { + Py_ssize_t length; + #if CYTHON_PEP393_ENABLED + length = PyUnicode_GET_LENGTH(x); + if (likely(length == 1)) { + return PyUnicode_READ_CHAR(x, 0); + } + #else + length = PyUnicode_GET_SIZE(x); + if (likely(length == 1)) { + return PyUnicode_AS_UNICODE(x)[0]; + } + #if Py_UNICODE_SIZE == 2 + else if (PyUnicode_GET_SIZE(x) == 2) { + Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; + if (high_val >= 0xD800 && high_val <= 0xDBFF) { + Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; + if (low_val >= 0xDC00 && low_val <= 0xDFFF) { + return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); + } + } + } + #endif + #endif + PyErr_Format(PyExc_ValueError, + "only single character unicode strings can be converted to Py_UCS4, " + "got length %" CYTHON_FORMAT_SSIZE_T "d", length); + return (Py_UCS4)-1; +} + +/* object_ord */ + static long __Pyx__PyObject_Ord(PyObject* c) { + Py_ssize_t size; + if (PyBytes_Check(c)) { + size = PyBytes_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyBytes_AS_STRING(c)[0]; + } +#if PY_MAJOR_VERSION < 3 + } else if (PyUnicode_Check(c)) { + return (long)__Pyx_PyUnicode_AsPy_UCS4(c); +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + } else if (PyByteArray_Check(c)) { + size = PyByteArray_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyByteArray_AS_STRING(c)[0]; + } +#endif + } else { + PyErr_Format(PyExc_TypeError, + "ord() expected string of length 1, but %.200s found", c->ob_type->tp_name); + return (long)(Py_UCS4)-1; + } + PyErr_Format(PyExc_TypeError, + "ord() expected a character, but string of length %zd found", size); + return (long)(Py_UCS4)-1; +} + +/* BytesEquals */ + static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ + static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* GetModuleGlobalName */ + static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS + result = PyDict_GetItem(__pyx_d, name); + if (likely(result)) { + Py_INCREF(result); + } else { +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +/* PyErrFetchRestore */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* WriteUnraisableException */ + static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, + CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, + int full_traceback, CYTHON_UNUSED int nogil) { + PyObject *old_exc, *old_val, *old_tb; + PyObject *ctx; + __Pyx_PyThreadState_declare +#ifdef WITH_THREAD + PyGILState_STATE state; + if (nogil) + state = PyGILState_Ensure(); +#ifdef _MSC_VER + else state = (PyGILState_STATE)-1; +#endif +#endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); + if (full_traceback) { + Py_XINCREF(old_exc); + Py_XINCREF(old_val); + Py_XINCREF(old_tb); + __Pyx_ErrRestore(old_exc, old_val, old_tb); + PyErr_PrintEx(1); + } + #if PY_MAJOR_VERSION < 3 + ctx = PyString_FromString(name); + #else + ctx = PyUnicode_FromString(name); + #endif + __Pyx_ErrRestore(old_exc, old_val, old_tb); + if (!ctx) { + PyErr_WriteUnraisable(Py_None); + } else { + PyErr_WriteUnraisable(ctx); + Py_DECREF(ctx); + } +#ifdef WITH_THREAD + if (nogil) + PyGILState_Release(state); +#endif +} + +/* RaiseException */ + #if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } +#if PY_VERSION_HEX >= 0x03030000 + if (cause) { +#else + if (cause && cause != Py_None) { +#endif + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = PyThreadState_GET(); + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* SetVTable */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable) { +#if PY_VERSION_HEX >= 0x02070000 + PyObject *ob = PyCapsule_New(vtable, 0, 0); +#else + PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); +#endif + if (!ob) + goto bad; + if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* SetupReduce */ + static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; +#else + if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; +#endif +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; + setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto GOOD; +BAD: + if (!PyErr_Occurred()) + PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); + ret = -1; +GOOD: +#if !CYTHON_COMPILING_IN_CPYTHON + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(1); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + #endif + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_VERSION_HEX < 0x03030000 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* CLineInTraceback */ + static int __Pyx_CLineForTraceback(int c_line) { +#ifdef CYTHON_CLINE_IN_TRACEBACK + return ((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0; +#else + PyObject *use_cline; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + use_cline = PyDict_GetItem(*cython_runtime_dict, __pyx_n_s_cline_in_traceback); + } else +#endif + { + PyObject *ptype, *pvalue, *ptraceback; + PyObject *use_cline_obj; + PyErr_Fetch(&ptype, &pvalue, &ptraceback); + use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + use_cline = NULL; + } + PyErr_Restore(ptype, pvalue, ptraceback); + } + if (!use_cline) { + c_line = 0; + PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (PyObject_Not(use_cline) != 0) { + c_line = 0; + } + return c_line; +#endif +} + +/* CodeObjectCache */ + static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + if (c_line) { + c_line = __Pyx_CLineForTraceback(c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + PyThreadState_GET(), /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_char(char value) { + const char neg_one = (char) -1, const_zero = (char) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(char) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(char) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(char) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(char), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntFromPy */ + static CYTHON_INLINE Py_intptr_t __Pyx_PyInt_As_Py_intptr_t(PyObject *x) { + const Py_intptr_t neg_one = (Py_intptr_t) -1, const_zero = (Py_intptr_t) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(Py_intptr_t) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (Py_intptr_t) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (Py_intptr_t) 0; + case 1: __PYX_VERIFY_RETURN_INT(Py_intptr_t, digit, digits[0]) + case 2: + if (8 * sizeof(Py_intptr_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) >= 2 * PyLong_SHIFT) { + return (Py_intptr_t) (((((Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(Py_intptr_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) >= 3 * PyLong_SHIFT) { + return (Py_intptr_t) (((((((Py_intptr_t)digits[2]) << PyLong_SHIFT) | (Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(Py_intptr_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) >= 4 * PyLong_SHIFT) { + return (Py_intptr_t) (((((((((Py_intptr_t)digits[3]) << PyLong_SHIFT) | (Py_intptr_t)digits[2]) << PyLong_SHIFT) | (Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (Py_intptr_t) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(Py_intptr_t) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(Py_intptr_t, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(Py_intptr_t) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(Py_intptr_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (Py_intptr_t) 0; + case -1: __PYX_VERIFY_RETURN_INT(Py_intptr_t, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(Py_intptr_t, digit, +digits[0]) + case -2: + if (8 * sizeof(Py_intptr_t) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) - 1 > 2 * PyLong_SHIFT) { + return (Py_intptr_t) (((Py_intptr_t)-1)*(((((Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(Py_intptr_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) - 1 > 2 * PyLong_SHIFT) { + return (Py_intptr_t) ((((((Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(Py_intptr_t) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) - 1 > 3 * PyLong_SHIFT) { + return (Py_intptr_t) (((Py_intptr_t)-1)*(((((((Py_intptr_t)digits[2]) << PyLong_SHIFT) | (Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(Py_intptr_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) - 1 > 3 * PyLong_SHIFT) { + return (Py_intptr_t) ((((((((Py_intptr_t)digits[2]) << PyLong_SHIFT) | (Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(Py_intptr_t) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) - 1 > 4 * PyLong_SHIFT) { + return (Py_intptr_t) (((Py_intptr_t)-1)*(((((((((Py_intptr_t)digits[3]) << PyLong_SHIFT) | (Py_intptr_t)digits[2]) << PyLong_SHIFT) | (Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(Py_intptr_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(Py_intptr_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(Py_intptr_t) - 1 > 4 * PyLong_SHIFT) { + return (Py_intptr_t) ((((((((((Py_intptr_t)digits[3]) << PyLong_SHIFT) | (Py_intptr_t)digits[2]) << PyLong_SHIFT) | (Py_intptr_t)digits[1]) << PyLong_SHIFT) | (Py_intptr_t)digits[0]))); + } + } + break; + } +#endif + if (sizeof(Py_intptr_t) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(Py_intptr_t, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(Py_intptr_t) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(Py_intptr_t, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + Py_intptr_t val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (Py_intptr_t) -1; + } + } else { + Py_intptr_t val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (Py_intptr_t) -1; + val = __Pyx_PyInt_As_Py_intptr_t(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to Py_intptr_t"); + return (Py_intptr_t) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to Py_intptr_t"); + return (Py_intptr_t) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CheckBinaryVersion */ + static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* InitStrings */ + static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + PyErr_Clear(); + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { +#if PY_VERSION_HEX < 0x03030000 + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +#else + if (__Pyx_PyUnicode_READY(o) == -1) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (PyUnicode_IS_ASCII(o)) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +#endif + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (PyInt_Check(x) || PyLong_Check(x)) +#else + if (PyLong_Check(x)) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = PyNumber_Long(x); + } + #else + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Long(x); + } + #endif +#else + res = PyNumber_Int(x); +#endif + if (res) { +#if PY_MAJOR_VERSION < 3 + if (!PyInt_Check(res) && !PyLong_Check(res)) { +#else + if (!PyLong_Check(res)) { +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + name, name, Py_TYPE(res)->tp_name); + Py_DECREF(res); + return NULL; + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(x); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/pymolfile/molfile/numind-cython/numind.h b/pymolfile/molfile/numind-cython/numind.h new file mode 100644 index 0000000..988c2c8 --- /dev/null +++ b/pymolfile/molfile/numind-cython/numind.h @@ -0,0 +1,12 @@ +#ifndef NUMIND_H +#define NUMIND_H + +typedef struct SignedIntBuf +{ + int* data; + int shape[2]; + int strides[2]; +} SignedIntBuf; + +#endif + diff --git a/pymolfile/molfile/numind-cython/numind.html b/pymolfile/molfile/numind-cython/numind.html new file mode 100644 index 0000000..96768d1 --- /dev/null +++ b/pymolfile/molfile/numind-cython/numind.html @@ -0,0 +1,1243 @@ +<!DOCTYPE html> +<!-- Generated by Cython 0.26.1 --> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Cython: numind.pyx</title> + <style type="text/css"> + +body.cython { font-family: courier; font-size: 12; } + +.cython.tag { } +.cython.line { margin: 0em } +.cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; } + +.cython.line .run { background-color: #B0FFB0; } +.cython.line .mis { background-color: #FFB0B0; } +.cython.code.run { border-left: 8px solid #B0FFB0; } +.cython.code.mis { border-left: 8px solid #FFB0B0; } + +.cython.code .py_c_api { color: red; } +.cython.code .py_macro_api { color: #FF7000; } +.cython.code .pyx_c_api { color: #FF3000; } +.cython.code .pyx_macro_api { color: #FF7000; } +.cython.code .refnanny { color: #FFA000; } +.cython.code .trace { color: #FFA000; } +.cython.code .error_goto { color: #FFA000; } + +.cython.code .coerce { color: #008000; border: 1px dotted #008000 } +.cython.code .py_attr { color: #FF0000; font-weight: bold; } +.cython.code .c_attr { color: #0000FF; } +.cython.code .py_call { color: #FF0000; font-weight: bold; } +.cython.code .c_call { color: #0000FF; } + +.cython.score-0 {background-color: #FFFFff;} +.cython.score-1 {background-color: #FFFFe7;} +.cython.score-2 {background-color: #FFFFd4;} +.cython.score-3 {background-color: #FFFFc4;} +.cython.score-4 {background-color: #FFFFb6;} +.cython.score-5 {background-color: #FFFFaa;} +.cython.score-6 {background-color: #FFFF9f;} +.cython.score-7 {background-color: #FFFF96;} +.cython.score-8 {background-color: #FFFF8d;} +.cython.score-9 {background-color: #FFFF86;} +.cython.score-10 {background-color: #FFFF7f;} +.cython.score-11 {background-color: #FFFF79;} +.cython.score-12 {background-color: #FFFF73;} +.cython.score-13 {background-color: #FFFF6e;} +.cython.score-14 {background-color: #FFFF6a;} +.cython.score-15 {background-color: #FFFF66;} +.cython.score-16 {background-color: #FFFF62;} +.cython.score-17 {background-color: #FFFF5e;} +.cython.score-18 {background-color: #FFFF5b;} +.cython.score-19 {background-color: #FFFF57;} +.cython.score-20 {background-color: #FFFF55;} +.cython.score-21 {background-color: #FFFF52;} +.cython.score-22 {background-color: #FFFF4f;} +.cython.score-23 {background-color: #FFFF4d;} +.cython.score-24 {background-color: #FFFF4b;} +.cython.score-25 {background-color: #FFFF48;} +.cython.score-26 {background-color: #FFFF46;} +.cython.score-27 {background-color: #FFFF44;} +.cython.score-28 {background-color: #FFFF43;} +.cython.score-29 {background-color: #FFFF41;} +.cython.score-30 {background-color: #FFFF3f;} +.cython.score-31 {background-color: #FFFF3e;} +.cython.score-32 {background-color: #FFFF3c;} +.cython.score-33 {background-color: #FFFF3b;} +.cython.score-34 {background-color: #FFFF39;} +.cython.score-35 {background-color: #FFFF38;} +.cython.score-36 {background-color: #FFFF37;} +.cython.score-37 {background-color: #FFFF36;} +.cython.score-38 {background-color: #FFFF35;} +.cython.score-39 {background-color: #FFFF34;} +.cython.score-40 {background-color: #FFFF33;} +.cython.score-41 {background-color: #FFFF32;} +.cython.score-42 {background-color: #FFFF31;} +.cython.score-43 {background-color: #FFFF30;} +.cython.score-44 {background-color: #FFFF2f;} +.cython.score-45 {background-color: #FFFF2e;} +.cython.score-46 {background-color: #FFFF2d;} +.cython.score-47 {background-color: #FFFF2c;} +.cython.score-48 {background-color: #FFFF2b;} +.cython.score-49 {background-color: #FFFF2b;} +.cython.score-50 {background-color: #FFFF2a;} +.cython.score-51 {background-color: #FFFF29;} +.cython.score-52 {background-color: #FFFF29;} +.cython.score-53 {background-color: #FFFF28;} +.cython.score-54 {background-color: #FFFF27;} +.cython.score-55 {background-color: #FFFF27;} +.cython.score-56 {background-color: #FFFF26;} +.cython.score-57 {background-color: #FFFF26;} +.cython.score-58 {background-color: #FFFF25;} +.cython.score-59 {background-color: #FFFF24;} +.cython.score-60 {background-color: #FFFF24;} +.cython.score-61 {background-color: #FFFF23;} +.cython.score-62 {background-color: #FFFF23;} +.cython.score-63 {background-color: #FFFF22;} +.cython.score-64 {background-color: #FFFF22;} +.cython.score-65 {background-color: #FFFF22;} +.cython.score-66 {background-color: #FFFF21;} +.cython.score-67 {background-color: #FFFF21;} +.cython.score-68 {background-color: #FFFF20;} +.cython.score-69 {background-color: #FFFF20;} +.cython.score-70 {background-color: #FFFF1f;} +.cython.score-71 {background-color: #FFFF1f;} +.cython.score-72 {background-color: #FFFF1f;} +.cython.score-73 {background-color: #FFFF1e;} +.cython.score-74 {background-color: #FFFF1e;} +.cython.score-75 {background-color: #FFFF1e;} +.cython.score-76 {background-color: #FFFF1d;} +.cython.score-77 {background-color: #FFFF1d;} +.cython.score-78 {background-color: #FFFF1c;} +.cython.score-79 {background-color: #FFFF1c;} +.cython.score-80 {background-color: #FFFF1c;} +.cython.score-81 {background-color: #FFFF1c;} +.cython.score-82 {background-color: #FFFF1b;} +.cython.score-83 {background-color: #FFFF1b;} +.cython.score-84 {background-color: #FFFF1b;} +.cython.score-85 {background-color: #FFFF1a;} +.cython.score-86 {background-color: #FFFF1a;} +.cython.score-87 {background-color: #FFFF1a;} +.cython.score-88 {background-color: #FFFF1a;} +.cython.score-89 {background-color: #FFFF19;} +.cython.score-90 {background-color: #FFFF19;} +.cython.score-91 {background-color: #FFFF19;} +.cython.score-92 {background-color: #FFFF19;} +.cython.score-93 {background-color: #FFFF18;} +.cython.score-94 {background-color: #FFFF18;} +.cython.score-95 {background-color: #FFFF18;} +.cython.score-96 {background-color: #FFFF18;} +.cython.score-97 {background-color: #FFFF17;} +.cython.score-98 {background-color: #FFFF17;} +.cython.score-99 {background-color: #FFFF17;} +.cython.score-100 {background-color: #FFFF17;} +.cython.score-101 {background-color: #FFFF16;} +.cython.score-102 {background-color: #FFFF16;} +.cython.score-103 {background-color: #FFFF16;} +.cython.score-104 {background-color: #FFFF16;} +.cython.score-105 {background-color: #FFFF16;} +.cython.score-106 {background-color: #FFFF15;} +.cython.score-107 {background-color: #FFFF15;} +.cython.score-108 {background-color: #FFFF15;} +.cython.score-109 {background-color: #FFFF15;} +.cython.score-110 {background-color: #FFFF15;} +.cython.score-111 {background-color: #FFFF15;} +.cython.score-112 {background-color: #FFFF14;} +.cython.score-113 {background-color: #FFFF14;} +.cython.score-114 {background-color: #FFFF14;} +.cython.score-115 {background-color: #FFFF14;} +.cython.score-116 {background-color: #FFFF14;} +.cython.score-117 {background-color: #FFFF14;} +.cython.score-118 {background-color: #FFFF13;} +.cython.score-119 {background-color: #FFFF13;} +.cython.score-120 {background-color: #FFFF13;} +.cython.score-121 {background-color: #FFFF13;} +.cython.score-122 {background-color: #FFFF13;} +.cython.score-123 {background-color: #FFFF13;} +.cython.score-124 {background-color: #FFFF13;} +.cython.score-125 {background-color: #FFFF12;} +.cython.score-126 {background-color: #FFFF12;} +.cython.score-127 {background-color: #FFFF12;} +.cython.score-128 {background-color: #FFFF12;} +.cython.score-129 {background-color: #FFFF12;} +.cython.score-130 {background-color: #FFFF12;} +.cython.score-131 {background-color: #FFFF12;} +.cython.score-132 {background-color: #FFFF11;} +.cython.score-133 {background-color: #FFFF11;} +.cython.score-134 {background-color: #FFFF11;} +.cython.score-135 {background-color: #FFFF11;} +.cython.score-136 {background-color: #FFFF11;} +.cython.score-137 {background-color: #FFFF11;} +.cython.score-138 {background-color: #FFFF11;} +.cython.score-139 {background-color: #FFFF11;} +.cython.score-140 {background-color: #FFFF11;} +.cython.score-141 {background-color: #FFFF10;} +.cython.score-142 {background-color: #FFFF10;} +.cython.score-143 {background-color: #FFFF10;} +.cython.score-144 {background-color: #FFFF10;} +.cython.score-145 {background-color: #FFFF10;} +.cython.score-146 {background-color: #FFFF10;} +.cython.score-147 {background-color: #FFFF10;} +.cython.score-148 {background-color: #FFFF10;} +.cython.score-149 {background-color: #FFFF10;} +.cython.score-150 {background-color: #FFFF0f;} +.cython.score-151 {background-color: #FFFF0f;} +.cython.score-152 {background-color: #FFFF0f;} +.cython.score-153 {background-color: #FFFF0f;} +.cython.score-154 {background-color: #FFFF0f;} +.cython.score-155 {background-color: #FFFF0f;} +.cython.score-156 {background-color: #FFFF0f;} +.cython.score-157 {background-color: #FFFF0f;} +.cython.score-158 {background-color: #FFFF0f;} +.cython.score-159 {background-color: #FFFF0f;} +.cython.score-160 {background-color: #FFFF0f;} +.cython.score-161 {background-color: #FFFF0e;} +.cython.score-162 {background-color: #FFFF0e;} +.cython.score-163 {background-color: #FFFF0e;} +.cython.score-164 {background-color: #FFFF0e;} +.cython.score-165 {background-color: #FFFF0e;} +.cython.score-166 {background-color: #FFFF0e;} +.cython.score-167 {background-color: #FFFF0e;} +.cython.score-168 {background-color: #FFFF0e;} +.cython.score-169 {background-color: #FFFF0e;} +.cython.score-170 {background-color: #FFFF0e;} +.cython.score-171 {background-color: #FFFF0e;} +.cython.score-172 {background-color: #FFFF0e;} +.cython.score-173 {background-color: #FFFF0d;} +.cython.score-174 {background-color: #FFFF0d;} +.cython.score-175 {background-color: #FFFF0d;} +.cython.score-176 {background-color: #FFFF0d;} +.cython.score-177 {background-color: #FFFF0d;} +.cython.score-178 {background-color: #FFFF0d;} +.cython.score-179 {background-color: #FFFF0d;} +.cython.score-180 {background-color: #FFFF0d;} +.cython.score-181 {background-color: #FFFF0d;} +.cython.score-182 {background-color: #FFFF0d;} +.cython.score-183 {background-color: #FFFF0d;} +.cython.score-184 {background-color: #FFFF0d;} +.cython.score-185 {background-color: #FFFF0d;} +.cython.score-186 {background-color: #FFFF0d;} +.cython.score-187 {background-color: #FFFF0c;} +.cython.score-188 {background-color: #FFFF0c;} +.cython.score-189 {background-color: #FFFF0c;} +.cython.score-190 {background-color: #FFFF0c;} +.cython.score-191 {background-color: #FFFF0c;} +.cython.score-192 {background-color: #FFFF0c;} +.cython.score-193 {background-color: #FFFF0c;} +.cython.score-194 {background-color: #FFFF0c;} +.cython.score-195 {background-color: #FFFF0c;} +.cython.score-196 {background-color: #FFFF0c;} +.cython.score-197 {background-color: #FFFF0c;} +.cython.score-198 {background-color: #FFFF0c;} +.cython.score-199 {background-color: #FFFF0c;} +.cython.score-200 {background-color: #FFFF0c;} +.cython.score-201 {background-color: #FFFF0c;} +.cython.score-202 {background-color: #FFFF0c;} +.cython.score-203 {background-color: #FFFF0b;} +.cython.score-204 {background-color: #FFFF0b;} +.cython.score-205 {background-color: #FFFF0b;} +.cython.score-206 {background-color: #FFFF0b;} +.cython.score-207 {background-color: #FFFF0b;} +.cython.score-208 {background-color: #FFFF0b;} +.cython.score-209 {background-color: #FFFF0b;} +.cython.score-210 {background-color: #FFFF0b;} +.cython.score-211 {background-color: #FFFF0b;} +.cython.score-212 {background-color: #FFFF0b;} +.cython.score-213 {background-color: #FFFF0b;} +.cython.score-214 {background-color: #FFFF0b;} +.cython.score-215 {background-color: #FFFF0b;} +.cython.score-216 {background-color: #FFFF0b;} +.cython.score-217 {background-color: #FFFF0b;} +.cython.score-218 {background-color: #FFFF0b;} +.cython.score-219 {background-color: #FFFF0b;} +.cython.score-220 {background-color: #FFFF0b;} +.cython.score-221 {background-color: #FFFF0b;} +.cython.score-222 {background-color: #FFFF0a;} +.cython.score-223 {background-color: #FFFF0a;} +.cython.score-224 {background-color: #FFFF0a;} +.cython.score-225 {background-color: #FFFF0a;} +.cython.score-226 {background-color: #FFFF0a;} +.cython.score-227 {background-color: #FFFF0a;} +.cython.score-228 {background-color: #FFFF0a;} +.cython.score-229 {background-color: #FFFF0a;} +.cython.score-230 {background-color: #FFFF0a;} +.cython.score-231 {background-color: #FFFF0a;} +.cython.score-232 {background-color: #FFFF0a;} +.cython.score-233 {background-color: #FFFF0a;} +.cython.score-234 {background-color: #FFFF0a;} +.cython.score-235 {background-color: #FFFF0a;} +.cython.score-236 {background-color: #FFFF0a;} +.cython.score-237 {background-color: #FFFF0a;} +.cython.score-238 {background-color: #FFFF0a;} +.cython.score-239 {background-color: #FFFF0a;} +.cython.score-240 {background-color: #FFFF0a;} +.cython.score-241 {background-color: #FFFF0a;} +.cython.score-242 {background-color: #FFFF0a;} +.cython.score-243 {background-color: #FFFF0a;} +.cython.score-244 {background-color: #FFFF0a;} +.cython.score-245 {background-color: #FFFF0a;} +.cython.score-246 {background-color: #FFFF09;} +.cython.score-247 {background-color: #FFFF09;} +.cython.score-248 {background-color: #FFFF09;} +.cython.score-249 {background-color: #FFFF09;} +.cython.score-250 {background-color: #FFFF09;} +.cython.score-251 {background-color: #FFFF09;} +.cython.score-252 {background-color: #FFFF09;} +.cython.score-253 {background-color: #FFFF09;} +.cython.score-254 {background-color: #FFFF09;} + </style> + <script> + function toggleDiv(id) { + theDiv = id.nextElementSibling + if (theDiv.style.display != 'block') theDiv.style.display = 'block'; + else theDiv.style.display = 'none'; + } + </script> +</head> +<body class="cython"> +<p><span style="border-bottom: solid 1px grey;">Generated by Cython 0.26.1</span></p> +<p> + <span style="background-color: #FFFF00">Yellow lines</span> hint at Python interaction.<br /> + Click on a line that starts with a "<code>+</code>" to see the C code that Cython generated for it. +</p> +<p>Raw output: <a href="numind.cpp">numind.cpp</a></p> +<div class="cython"><pre class="cython line score-0"> <span class="">001</span>: # This Pyrex extension class can take a numpy/numarray/Numeric object</pre> +<pre class="cython line score-0"> <span class="">002</span>: # as a parameter and wrap it so that its information can be accessed</pre> +<pre class="cython line score-0"> <span class="">003</span>: # in a standard way, both in Python space and C space.</pre> +<pre class="cython line score-0"> <span class="">004</span>: #</pre> +<pre class="cython line score-0"> <span class="">005</span>: # Heavily based on an idea of Andrew Straw. See</pre> +<pre class="cython line score-0"> <span class="">006</span>: # http://www.scipy.org/Cookbook/ArrayStruct_and_Pyrex</pre> +<pre class="cython line score-0"> <span class="">007</span>: # Very inspiring! :-)</pre> +<pre class="cython line score-0"> <span class="">008</span>: #</pre> +<pre class="cython line score-0"> <span class="">009</span>: # First version: 2006-03-25</pre> +<pre class="cython line score-0"> <span class="">010</span>: # Last update: 2006-03-25</pre> +<pre class="cython line score-0"> <span class="">011</span>: # Author: Francesc Altet</pre> +<pre class="cython line score-0"> <span class="">012</span>: </pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">013</span>: import sys</pre> +<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_sys, 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_sys, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; +</pre><pre class="cython line score-0"> <span class="">014</span>: from cpython.pycapsule cimport *</pre> +<pre class="cython line score-0"> <span class="">015</span>: </pre> +<pre class="cython line score-0"> <span class="">016</span>: cdef extern from "Python.h":</pre> +<pre class="cython line score-0"> <span class="">017</span>: ctypedef int Py_intptr_t</pre> +<pre class="cython line score-0"> <span class="">018</span>: ctypedef object PyObject</pre> +<pre class="cython line score-0"> <span class="">019</span>: long PyInt_AsLong(object)</pre> +<pre class="cython line score-0"> <span class="">020</span>: void Py_INCREF(object)</pre> +<pre class="cython line score-0"> <span class="">021</span>: void Py_DECREF(object)</pre> +<pre class="cython line score-0"> <span class="">022</span>: </pre> +<pre class="cython line score-0"> <span class="">023</span>: cdef extern from "stdlib.h":</pre> +<pre class="cython line score-0"> <span class="">024</span>: ctypedef long size_t</pre> +<pre class="cython line score-0"> <span class="">025</span>: ctypedef long intptr_t</pre> +<pre class="cython line score-0"> <span class="">026</span>: void *malloc(size_t size)</pre> +<pre class="cython line score-0"> <span class="">027</span>: void free(void* ptr)</pre> +<pre class="cython line score-0"> <span class="">028</span>: </pre> +<pre class="cython line score-0"> <span class="">029</span>: cdef extern from "numind.h":</pre> +<pre class="cython line score-0"> <span class="">030</span>: ctypedef struct SignedIntBuf</pre> +<pre class="cython line score-0"> <span class="">031</span>: </pre> +<pre class="cython line score-0"> <span class="">032</span>: # for PyArrayInterface:</pre> +<pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">033</span>: CONTIGUOUS=0x01</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_CONTIGUOUS, __pyx_int_1) < 0) <span class='error_goto'>__PYX_ERR(0, 33, __pyx_L1_error)</span> +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">034</span>: FORTRAN=0x02</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_FORTRAN, __pyx_int_2) < 0) <span class='error_goto'>__PYX_ERR(0, 34, __pyx_L1_error)</span> +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">035</span>: ALIGNED=0x100</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_ALIGNED, __pyx_int_256) < 0) <span class='error_goto'>__PYX_ERR(0, 35, __pyx_L1_error)</span> +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">036</span>: NOTSWAPPED=0x200</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_NOTSWAPPED, __pyx_int_512) < 0) <span class='error_goto'>__PYX_ERR(0, 36, __pyx_L1_error)</span> +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">037</span>: WRITEABLE=0x400</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_WRITEABLE, __pyx_int_1024) < 0) <span class='error_goto'>__PYX_ERR(0, 37, __pyx_L1_error)</span> +</pre><pre class="cython line score-0"> <span class="">038</span>: </pre> +<pre class="cython line score-0"> <span class="">039</span>: # byteorder dictionary</pre> +<pre class="cython line score-21" onclick='toggleDiv(this)'>+<span class="">040</span>: byteorder = {'<':'little', '>':'big'}</pre> +<pre class='cython code score-21 '> __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_kp_s__6, __pyx_n_s_little) < 0) <span class='error_goto'>__PYX_ERR(0, 40, __pyx_L1_error)</span> + if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_kp_s__7, __pyx_n_s_big) < 0) <span class='error_goto'>__PYX_ERR(0, 40, __pyx_L1_error)</span> + if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_byteorder, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 40, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; +</pre><pre class="cython line score-0"> <span class="">041</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">042</span>: ctypedef struct PyArrayInterface:</pre> +<pre class='cython code score-0 '>struct __pyx_t_6numind_PyArrayInterface { + int version; + int nd; + char typekind; + int itemsize; + int flags; + Py_intptr_t *shape; + Py_intptr_t *strides; + void *data; +}; +</pre><pre class="cython line score-0"> <span class="">043</span>: int version # contains the integer 2 as a sanity check</pre> +<pre class="cython line score-0"> <span class="">044</span>: int nd # number of dimensions</pre> +<pre class="cython line score-0"> <span class="">045</span>: char typekind # kind in array --- character code of typestr</pre> +<pre class="cython line score-0"> <span class="">046</span>: int itemsize # size of each element</pre> +<pre class="cython line score-0"> <span class="">047</span>: int flags # flags indicating how the data should be interpreted</pre> +<pre class="cython line score-0"> <span class="">048</span>: Py_intptr_t *shape # A length-nd array of shape information</pre> +<pre class="cython line score-0"> <span class="">049</span>: Py_intptr_t *strides # A length-nd array of stride information</pre> +<pre class="cython line score-0"> <span class="">050</span>: void *data # A pointer to the first element of the array</pre> +<pre class="cython line score-0"> <span class="">051</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">052</span>: cdef void* free_array_interface(object arr):</pre> +<pre class='cython code score-0 '>static void *__pyx_f_6numind_free_array_interface(PyObject *__pyx_v_arr) { + void *__pyx_r; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("free_array_interface", 0); +/* … */ + /* function exit code */ + __pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">053</span>: Py_DECREF(arr)</pre> +<pre class='cython code score-0 '> Py_DECREF(__pyx_v_arr); +</pre><pre class="cython line score-0"> <span class="">054</span>: </pre> +<pre class="cython line score-0"> <span class="">055</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">056</span>: cdef class NumInd:</pre> +<pre class='cython code score-0 '>struct __pyx_obj_6numind_NumInd { + PyObject_HEAD + struct __pyx_vtabstruct_6numind_NumInd *__pyx_vtab; + void *data; + int _nd; + Py_intptr_t *_shape; + Py_intptr_t *_strides; + __pyx_t_6numind_PyArrayInterface *inter; + PyObject *_t_shape; + PyObject *_t_strides; + PyObject *_undarray; +}; + + + +struct __pyx_vtabstruct_6numind_NumInd { + __pyx_t_6numind_PyArrayInterface *(*_get_array_interface)(struct __pyx_obj_6numind_NumInd *); +}; +static struct __pyx_vtabstruct_6numind_NumInd *__pyx_vtabptr_6numind_NumInd; +</pre><pre class="cython line score-0"> <span class="">057</span>: cdef void *data</pre> +<pre class="cython line score-0"> <span class="">058</span>: cdef int _nd</pre> +<pre class="cython line score-0"> <span class="">059</span>: cdef Py_intptr_t *_shape</pre> +<pre class="cython line score-0"> <span class="">060</span>: cdef Py_intptr_t *_strides</pre> +<pre class="cython line score-0"> <span class="">061</span>: cdef PyArrayInterface *inter</pre> +<pre class="cython line score-0"> <span class="">062</span>: cdef object _t_shape, _t_strides, _undarray</pre> +<pre class="cython line score-0"> <span class="">063</span>: </pre> +<pre class="cython line score-28" onclick='toggleDiv(this)'>+<span class="">064</span>: def __init__(self, object undarray):</pre> +<pre class='cython code score-28 '>/* Python wrapper */ +static int __pyx_pw_6numind_6NumInd_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_6numind_6NumInd_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_undarray = 0; + int __pyx_r; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_undarray,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args); + switch (pos_args) { + case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_undarray)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) <span class='error_goto'>__PYX_ERR(0, 64, __pyx_L3_error)</span> + } + } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0); + } + __pyx_v_undarray = values[0]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>("__init__", 1, 1, 1, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 64, __pyx_L3_error)</span> + __pyx_L3_error:; + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6numind_6NumInd___init__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self), __pyx_v_undarray); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static int __pyx_pf_6numind_6NumInd___init__(struct __pyx_obj_6numind_NumInd *__pyx_v_self, PyObject *__pyx_v_undarray) { + int __pyx_v_i; + int __pyx_v_stride; + PyObject *__pyx_v_array_shape = 0; + PyObject *__pyx_v_array_strides = 0; + int __pyx_r; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__init__", 0); +/* … */ + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_7); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_array_shape); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_array_strides); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-0"> <span class="">065</span>: cdef int i, stride</pre> +<pre class="cython line score-0"> <span class="">066</span>: cdef object array_shape, array_strides</pre> +<pre class="cython line score-0"> <span class="">067</span>: </pre> +<pre class="cython line score-0"> <span class="">068</span>: # Keep a reference to the underlying object</pre> +<pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">069</span>: self._undarray = undarray</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_undarray); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_v_undarray); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_undarray); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_undarray); + __pyx_v_self->_undarray = __pyx_v_undarray; +</pre><pre class="cython line score-0"> <span class="">070</span>: # Get the shape and strides C arrays</pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">071</span>: array_shape = undarray.__array_interface__["shape"]</pre> +<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, __pyx_n_s_shape);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_array_shape = __pyx_t_2; + __pyx_t_2 = 0; +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">072</span>: self._t_shape = array_shape</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_array_shape); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_v_array_shape); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_t_shape); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_t_shape); + __pyx_v_self->_t_shape = __pyx_v_array_shape; +</pre><pre class="cython line score-0"> <span class="">073</span>: # The number of dimensions</pre> +<pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">074</span>: self._nd = len(array_shape)</pre> +<pre class='cython code score-5 '> __pyx_t_3 = <span class='py_c_api'>PyObject_Length</span>(__pyx_v_array_shape);<span class='error_goto'> if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 74, __pyx_L1_error)</span> + __pyx_v_self->_nd = __pyx_t_3; +</pre><pre class="cython line score-0"> <span class="">075</span>: # The shape</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">076</span>: self._shape = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t))</pre> +<pre class='cython code score-0 '> __pyx_v_self->_shape = ((Py_intptr_t *)malloc((__pyx_v_self->_nd * (sizeof(Py_intptr_t))))); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">077</span>: for i from 0 <= i < self._nd:</pre> +<pre class='cython code score-0 '> __pyx_t_4 = __pyx_v_self->_nd; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { +</pre><pre class="cython line score-10" onclick='toggleDiv(this)'>+<span class="">078</span>: self._shape[i] = self._t_shape[i]</pre> +<pre class='cython code score-10 '> __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_self->_t_shape, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 78, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_As_Py_intptr_t</span>(__pyx_t_2); if (unlikely((__pyx_t_5 == ((Py_intptr_t)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 78, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + (__pyx_v_self->_shape[__pyx_v_i]) = __pyx_t_5; + } +</pre><pre class="cython line score-0"> <span class="">079</span>: # The strides (compute them if needed)</pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">080</span>: array_strides = undarray.__array_interface__["strides"]</pre> +<pre class='cython code score-8 '> __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 80, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_2, __pyx_n_s_strides);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_array_strides = __pyx_t_1; + __pyx_t_1 = 0; +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">081</span>: self._t_strides = array_strides</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_array_strides); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_v_array_strides); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_t_strides); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_v_array_strides; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">082</span>: self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t))</pre> +<pre class='cython code score-0 '> __pyx_v_self->_strides = ((Py_intptr_t *)malloc((__pyx_v_self->_nd * (sizeof(Py_intptr_t))))); +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">083</span>: if array_strides:</pre> +<pre class='cython code score-2 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_v_array_strides); if (unlikely(__pyx_t_6 < 0)) <span class='error_goto'>__PYX_ERR(0, 83, __pyx_L1_error)</span> + if (__pyx_t_6) { +/* … */ + goto __pyx_L5; + } +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">084</span>: for i from 0 <= i < self._nd:</pre> +<pre class='cython code score-0 '> __pyx_t_4 = __pyx_v_self->_nd; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { +</pre><pre class="cython line score-10" onclick='toggleDiv(this)'>+<span class="">085</span>: self._strides[i] = array_strides[i]</pre> +<pre class='cython code score-10 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_array_strides, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_As_Py_intptr_t</span>(__pyx_t_1); if (unlikely((__pyx_t_5 == ((Py_intptr_t)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 85, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + (__pyx_v_self->_strides[__pyx_v_i]) = __pyx_t_5; + } +</pre><pre class="cython line score-0"> <span class="">086</span>: else:</pre> +<pre class="cython line score-0"> <span class="">087</span>: # strides is None. Compute them explicitely.</pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">088</span>: self._t_strides = [0] * self._nd</pre> +<pre class='cython code score-8 '> /*else*/ { + __pyx_t_1 = <span class='py_c_api'>PyList_New</span>(1 * ((__pyx_v_self->_nd<0) ? 0:__pyx_v_self->_nd));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_self->_nd; __pyx_temp++) { + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_0); + <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_1, __pyx_temp, __pyx_int_0); + } + } + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_t_strides); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_t_1; + __pyx_t_1 = 0; +</pre><pre class="cython line score-21" onclick='toggleDiv(this)'>+<span class="">089</span>: stride = int(self.typestr[2:])</pre> +<pre class='cython code score-21 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_self), __pyx_n_s_typestr);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetSlice</span>(__pyx_t_1, 2, 0, NULL, NULL, &__pyx_slice_, 1, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyNumber_Int</span>(__pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_stride = __pyx_t_4; +/* … */ + __pyx_slice_ = <span class='py_c_api'>PySlice_New</span>(__pyx_int_2, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_slice_)) __PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_slice_); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_slice_); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">090</span>: for i from self._nd > i >= 0:</pre> +<pre class='cython code score-0 '> for (__pyx_v_i = __pyx_v_self->_nd-1; __pyx_v_i >= 0; __pyx_v_i--) { +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">091</span>: self._strides[i] = stride</pre> +<pre class='cython code score-0 '> (__pyx_v_self->_strides[__pyx_v_i]) = __pyx_v_stride; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">092</span>: self._t_strides[i] = stride</pre> +<pre class='cython code score-5 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_stride);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 92, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + if (unlikely(<span class='pyx_c_api'>__Pyx_SetItemInt</span>(__pyx_v_self->_t_strides, __pyx_v_i, __pyx_t_1, int, 1, __Pyx_PyInt_From_int, 0, 1, 1) < 0)) <span class='error_goto'>__PYX_ERR(0, 92, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; +</pre><pre class="cython line score-19" onclick='toggleDiv(this)'>+<span class="">093</span>: stride = stride * array_shape[i]</pre> +<pre class='cython code score-19 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_stride);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_array_shape, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 93, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + __pyx_t_7 = <span class='py_c_api'>PyNumber_Multiply</span>(__pyx_t_1, __pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 93, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_7); if (unlikely((__pyx_t_4 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 93, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_stride = __pyx_t_4; + } +</pre><pre class="cython line score-6" onclick='toggleDiv(this)'>+<span class="">094</span>: self._t_strides = tuple(self._t_strides)</pre> +<pre class='cython code score-6 '> __pyx_t_7 = <span class='py_c_api'>PySequence_Tuple</span>(__pyx_v_self->_t_strides);<span class='error_goto'> if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 94, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_7); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_t_strides); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_t_7; + __pyx_t_7 = 0; + } + __pyx_L5:; +</pre><pre class="cython line score-0"> <span class="">095</span>: # Populate the C array interface</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">096</span>: self.inter = self._get_array_interface()</pre> +<pre class='cython code score-0 '> __pyx_v_self->inter = ((struct __pyx_vtabstruct_6numind_NumInd *)__pyx_v_self->__pyx_vtab)->_get_array_interface(__pyx_v_self); +</pre><pre class="cython line score-0"> <span class="">097</span>: </pre> +<pre class="cython line score-0"> <span class="">098</span>: # Properties. This are visible from Python space.</pre> +<pre class="cython line score-0"> <span class="">099</span>: # Add as many as you want.</pre> +<pre class="cython line score-0"> <span class="">100</span>: </pre> +<pre class="cython line score-0"> <span class="">101</span>: property undarray: # Returns the underlying array</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">102</span>: def __get__(self):</pre> +<pre class='cython code score-0 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8undarray_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8undarray_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8undarray___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8undarray___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">103</span>: return self._undarray</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_self->_undarray); + __pyx_r = __pyx_v_self->_undarray; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">104</span>: </pre> +<pre class="cython line score-0"> <span class="">105</span>: property shape:</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">106</span>: def __get__(self):</pre> +<pre class='cython code score-0 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_5shape_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_5shape___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_5shape___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">107</span>: return self._t_shape</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_self->_t_shape); + __pyx_r = __pyx_v_self->_t_shape; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">108</span>: </pre> +<pre class="cython line score-0"> <span class="">109</span>: property strides:</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">110</span>: def __get__(self):</pre> +<pre class='cython code score-0 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_7strides_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_7strides___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_7strides___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">111</span>: return self._t_strides</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_self->_t_strides); + __pyx_r = __pyx_v_self->_t_strides; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">112</span>: </pre> +<pre class="cython line score-0"> <span class="">113</span>: property typestr:</pre> +<pre class="cython line score-4" onclick='toggleDiv(this)'>+<span class="">114</span>: def __get__(self):</pre> +<pre class='cython code score-4 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_7typestr_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_7typestr_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_7typestr___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_7typestr___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.typestr.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-9" onclick='toggleDiv(this)'>+<span class="">115</span>: return self._undarray.__array_interface__["typestr"]</pre> +<pre class='cython code score-9 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_self->_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 115, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, __pyx_n_s_typestr);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 115, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">116</span>: </pre> +<pre class="cython line score-0"> <span class="">117</span>: property typekind:</pre> +<pre class="cython line score-4" onclick='toggleDiv(this)'>+<span class="">118</span>: def __get__(self):</pre> +<pre class='cython code score-4 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8typekind_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8typekind_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8typekind___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8typekind___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.typekind.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-12" onclick='toggleDiv(this)'>+<span class="">119</span>: return chr(self.inter.typekind)</pre> +<pre class='cython code score-12 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_char</span>(__pyx_v_self->inter->typekind);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 119, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); + <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_chr, __pyx_t_2, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">120</span>: </pre> +<pre class="cython line score-0"> <span class="">121</span>: property readonly:</pre> +<pre class="cython line score-4" onclick='toggleDiv(this)'>+<span class="">122</span>: def __get__(self):</pre> +<pre class='cython code score-4 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8readonly_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8readonly_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8readonly___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8readonly___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.readonly.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-12" onclick='toggleDiv(this)'>+<span class="">123</span>: return self._undarray.__array_interface__["data"][1]</pre> +<pre class='cython code score-12 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_self->_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, __pyx_n_s_data);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">124</span>: </pre> +<pre class="cython line score-0"> <span class="">125</span>: property __array_struct__:</pre> +<pre class="cython line score-0"> <span class="">126</span>: "Allows other numerical packages to obtain a new object."</pre> +<pre class="cython line score-3" onclick='toggleDiv(this)'>+<span class="">127</span>: def __get__(self):</pre> +<pre class='cython code score-3 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_16__array_struct___1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_16__array_struct___1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_16__array_struct_____get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_16__array_struct_____get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.__array_struct__.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-4" onclick='toggleDiv(this)'>+<span class="">128</span>: if hasattr(self._undarray, "__array_struct__"):</pre> +<pre class='cython code score-4 '> __pyx_t_1 = __pyx_v_self->_undarray; + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_HasAttr</span>(__pyx_t_1, __pyx_n_s_array_struct);<span class='error_goto'> if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 128, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { +/* … */ + } +</pre><pre class="cython line score-3" onclick='toggleDiv(this)'>+<span class="">129</span>: return self._undarray.__array_struct__</pre> +<pre class='cython code score-3 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_self->_undarray, __pyx_n_s_array_struct);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">130</span>: else:</pre> +<pre class="cython line score-0"> <span class="">131</span>: # No an underlying array with __array_struct__</pre> +<pre class="cython line score-0"> <span class="">132</span>: # Deliver an equivalent PyCObject.</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">133</span>: Py_INCREF(self)</pre> +<pre class='cython code score-0 '> /*else*/ { + Py_INCREF(((PyObject *)__pyx_v_self)); +</pre><pre class="cython line score-6" onclick='toggleDiv(this)'>+<span class="">134</span>: return PyCapsule_New(<void*>self.inter,</pre> +<pre class='cython code score-6 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); +/* … */ + __pyx_t_1 = <span class='py_c_api'>PyCapsule_New</span>(((void *)__pyx_v_self->inter), ((char *)"struct array"), ((PyCapsule_Destructor)__pyx_f_6numind_free_array_interface));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 134, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + } +</pre><pre class="cython line score-0"> <span class="">135</span>: "struct array",</pre> +<pre class="cython line score-0"> <span class="">136</span>: <PyCapsule_Destructor>free_array_interface)</pre> +<pre class="cython line score-0"> <span class="">137</span>: </pre> +<pre class="cython line score-9" onclick='toggleDiv(this)'>+<span class="">138</span>: cdef PyArrayInterface *_get_array_interface(self):</pre> +<pre class='cython code score-9 '>static __pyx_t_6numind_PyArrayInterface *__pyx_f_6numind_6NumInd__get_array_interface(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + __pyx_t_6numind_PyArrayInterface *__pyx_v_inter; + PyObject *__pyx_v_undarray = 0; + PyObject *__pyx_v_data_address = 0; + PyObject *__pyx_v_typestr = 0; + PyObject *__pyx_v_obj = 0; + __pyx_t_6numind_PyArrayInterface *__pyx_r; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("_get_array_interface", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6); + <span class='pyx_c_api'>__Pyx_WriteUnraisable</span>("numind.NumInd._get_array_interface", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __pyx_r = 0; + __pyx_L0:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_undarray); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_data_address); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_typestr); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_obj); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-0"> <span class="">139</span>: "Populates the array interface"</pre> +<pre class="cython line score-0"> <span class="">140</span>: cdef PyArrayInterface *inter</pre> +<pre class="cython line score-0"> <span class="">141</span>: cdef object undarray, data_address, typestr</pre> +<pre class="cython line score-0"> <span class="">142</span>: cdef object obj</pre> +<pre class="cython line score-0"> <span class="">143</span>: </pre> +<pre class="cython line score-1" onclick='toggleDiv(this)'>+<span class="">144</span>: undarray = self._undarray</pre> +<pre class='cython code score-1 '> __pyx_t_1 = __pyx_v_self->_undarray; + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_1); + __pyx_v_undarray = __pyx_t_1; + __pyx_t_1 = 0; +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">145</span>: typestr = self.typestr</pre> +<pre class='cython code score-2 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_self), __pyx_n_s_typestr);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_v_typestr = __pyx_t_1; + __pyx_t_1 = 0; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">146</span>: inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface))</pre> +<pre class='cython code score-0 '> __pyx_v_inter = ((__pyx_t_6numind_PyArrayInterface *)malloc((sizeof(__pyx_t_6numind_PyArrayInterface)))); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">147</span>: if inter is NULL:</pre> +<pre class='cython code score-0 '> __pyx_t_2 = ((__pyx_v_inter == NULL) != 0); + if (__pyx_t_2) { +/* … */ + } +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">148</span>: raise MemoryError()</pre> +<pre class='cython code score-5 '> <span class='py_c_api'>PyErr_NoMemory</span>(); <span class='error_goto'>__PYX_ERR(0, 148, __pyx_L1_error)</span> +</pre><pre class="cython line score-0"> <span class="">149</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">150</span>: inter.version = 2</pre> +<pre class='cython code score-0 '> __pyx_v_inter->version = 2; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">151</span>: inter.nd = self._nd</pre> +<pre class='cython code score-0 '> __pyx_t_3 = __pyx_v_self->_nd; + __pyx_v_inter->nd = __pyx_t_3; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">152</span>: inter.typekind = ord(typestr[1])</pre> +<pre class='cython code score-5 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_typestr, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_Ord</span>(__pyx_t_1);<span class='error_goto'> if (unlikely(__pyx_t_4 == (long)(Py_UCS4)-1)) __PYX_ERR(0, 152, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_inter->typekind = __pyx_t_4; +</pre><pre class="cython line score-18" onclick='toggleDiv(this)'>+<span class="">153</span>: inter.itemsize = int(typestr[2:])</pre> +<pre class='cython code score-18 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetSlice</span>(__pyx_v_typestr, 2, 0, NULL, NULL, &__pyx_slice__2, 1, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyNumber_Int</span>(__pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 153, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 153, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_inter->itemsize = __pyx_t_3; +/* … */ + __pyx_slice__2 = <span class='py_c_api'>PySlice_New</span>(__pyx_int_2, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_slice__2)) __PYX_ERR(0, 153, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_slice__2); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_slice__2); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">154</span>: inter.flags = 0 # initialize flags</pre> +<pre class='cython code score-0 '> __pyx_v_inter->flags = 0; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">155</span>: if typestr[0] == '|':</pre> +<pre class='cython code score-5 '> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_typestr, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 155, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + __pyx_t_2 = (<span class='pyx_c_api'>__Pyx_PyString_Equals</span>(__pyx_t_5, __pyx_kp_s__3, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) <span class='error_goto'>__PYX_ERR(0, 155, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_2) { +/* … */ + goto __pyx_L4; + } +</pre><pre class="cython line score-19" onclick='toggleDiv(this)'>+<span class="">156</span>: inter.flags = inter.flags | NOTSWAPPED</pre> +<pre class='cython code score-19 '> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_inter->flags);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 156, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_NOTSWAPPED);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_6 = <span class='py_c_api'>PyNumber_Or</span>(__pyx_t_5, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 156, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_6); if (unlikely((__pyx_t_3 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 156, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_inter->flags = __pyx_t_3; +</pre><pre class="cython line score-26" onclick='toggleDiv(this)'>+<span class="">157</span>: elif byteorder[typestr[0]] == sys.byteorder:</pre> +<pre class='cython code score-26 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_byteorder);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_typestr, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_5 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_6, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_sys);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_byteorder);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_5, __pyx_t_6, Py_EQ); <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) <span class='error_goto'>__PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { +/* … */ + } + __pyx_L4:; +</pre><pre class="cython line score-19" onclick='toggleDiv(this)'>+<span class="">158</span>: inter.flags = inter.flags | NOTSWAPPED</pre> +<pre class='cython code score-19 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_inter->flags);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 158, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_NOTSWAPPED);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 158, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + __pyx_t_5 = <span class='py_c_api'>PyNumber_Or</span>(__pyx_t_1, __pyx_t_6);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 158, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 158, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_inter->flags = __pyx_t_3; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">159</span>: if not self.readonly:</pre> +<pre class='cython code score-5 '> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_self), __pyx_n_s_readonly);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 159, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) <span class='error_goto'>__PYX_ERR(0, 159, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_7 = ((!__pyx_t_2) != 0); + if (__pyx_t_7) { +/* … */ + } +</pre><pre class="cython line score-19" onclick='toggleDiv(this)'>+<span class="">160</span>: inter.flags = inter.flags | WRITEABLE</pre> +<pre class='cython code score-19 '> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_inter->flags);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 160, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_WRITEABLE);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 160, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + __pyx_t_1 = <span class='py_c_api'>PyNumber_Or</span>(__pyx_t_5, __pyx_t_6);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 160, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_inter->flags = __pyx_t_3; +</pre><pre class="cython line score-0"> <span class="">161</span>: # XXX how to determine the ALIGNED flag?</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">162</span>: inter.strides = self._strides</pre> +<pre class='cython code score-0 '> __pyx_t_8 = __pyx_v_self->_strides; + __pyx_v_inter->strides = __pyx_t_8; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">163</span>: inter.shape = self._shape</pre> +<pre class='cython code score-0 '> __pyx_t_8 = __pyx_v_self->_shape; + __pyx_v_inter->shape = __pyx_t_8; +</pre><pre class="cython line score-0"> <span class="">164</span>: # Get the data address</pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">165</span>: obj = undarray.__array_interface__["data"]</pre> +<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_6 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, __pyx_n_s_data);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 165, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_obj = __pyx_t_6; + __pyx_t_6 = 0; +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">166</span>: data_address = obj[0]</pre> +<pre class='cython code score-2 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_obj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 166, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + __pyx_v_data_address = __pyx_t_6; + __pyx_t_6 = 0; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">167</span>: inter.data = <void*>PyInt_AsLong(data_address)</pre> +<pre class='cython code score-5 '> __pyx_v_inter->data = ((void *)<span class='py_c_api'>PyInt_AsLong</span>(__pyx_v_data_address)); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">168</span>: return inter</pre> +<pre class='cython code score-0 '> __pyx_r = __pyx_v_inter; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">169</span>: </pre> +<pre class="cython line score-0"> <span class="">170</span>: </pre> +<pre class="cython line score-0"> <span class="">171</span>: # This is just an example on how to modify the data in C space</pre> +<pre class="cython line score-0"> <span class="">172</span>: # (and at C speed! :-)</pre> +<pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">173</span>: def modify(self):</pre> +<pre class='cython code score-5 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_3modify(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_6numind_6NumInd_2modify[] = "Modify the values of the underlying array"; +static PyObject *__pyx_pw_6numind_6NumInd_3modify(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("modify (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_2modify(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_2modify(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + long *__pyx_v_ldata; + double *__pyx_v_fdata; + int __pyx_v_i; + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("modify", 0); +/* … */ + /* function exit code */ + __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.modify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-0"> <span class="">174</span>: "Modify the values of the underlying array"</pre> +<pre class="cython line score-0"> <span class="">175</span>: cdef long *ldata</pre> +<pre class="cython line score-0"> <span class="">176</span>: cdef double *fdata</pre> +<pre class="cython line score-0"> <span class="">177</span>: cdef int i</pre> +<pre class="cython line score-0"> <span class="">178</span>: </pre> +<pre class="cython line score-0"> <span class="">179</span>: # Modify just the first row</pre> +<pre class="cython line score-14" onclick='toggleDiv(this)'>+<span class="">180</span>: if chr(self.inter.typekind) == 'i':</pre> +<pre class='cython code score-14 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_char</span>(__pyx_v_self->inter->typekind);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 180, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 180, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); + <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_chr, __pyx_t_2, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 180, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_3 = (<span class='pyx_c_api'>__Pyx_PyString_Equals</span>(__pyx_t_1, __pyx_n_s_i, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) <span class='error_goto'>__PYX_ERR(0, 180, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_3) { +/* … */ + goto __pyx_L3; + } +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">181</span>: ldata = <long *>self.inter.data</pre> +<pre class='cython code score-0 '> __pyx_v_ldata = ((long *)__pyx_v_self->inter->data); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">182</span>: for i from 0 <= i < self.inter.shape[self.inter.nd-1]:</pre> +<pre class='cython code score-0 '> __pyx_t_4 = (__pyx_v_self->inter->shape[(__pyx_v_self->inter->nd - 1)]); + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">183</span>: ldata[i] = ldata[i] + 1</pre> +<pre class='cython code score-0 '> (__pyx_v_ldata[__pyx_v_i]) = ((__pyx_v_ldata[__pyx_v_i]) + 1); + } +</pre><pre class="cython line score-14" onclick='toggleDiv(this)'>+<span class="">184</span>: elif chr(self.inter.typekind) == 'f':</pre> +<pre class='cython code score-14 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_char</span>(__pyx_v_self->inter->typekind);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 184, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); + <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_chr, __pyx_t_2, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_3 = (<span class='pyx_c_api'>__Pyx_PyString_Equals</span>(__pyx_t_1, __pyx_n_s_f, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) <span class='error_goto'>__PYX_ERR(0, 184, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_3) { +/* … */ + } + __pyx_L3:; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">185</span>: fdata = <double *>self.inter.data</pre> +<pre class='cython code score-0 '> __pyx_v_fdata = ((double *)__pyx_v_self->inter->data); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">186</span>: for i from 0 <= i < self.inter.shape[self.inter.nd-1]:</pre> +<pre class='cython code score-0 '> __pyx_t_4 = (__pyx_v_self->inter->shape[(__pyx_v_self->inter->nd - 1)]); + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">187</span>: fdata[i] = fdata[i] + 1</pre> +<pre class='cython code score-0 '> (__pyx_v_fdata[__pyx_v_i]) = ((__pyx_v_fdata[__pyx_v_i]) + 1.0); + } +</pre><pre class="cython line score-0"> <span class="">188</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">189</span>: def __dealloc__(self):</pre> +<pre class='cython code score-0 '>/* Python wrapper */ +static void __pyx_pw_6numind_6NumInd_5__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_6numind_6NumInd_5__dealloc__(PyObject *__pyx_v_self) { + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__dealloc__ (wrapper)", 0); + __pyx_pf_6numind_6NumInd_4__dealloc__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); +} + +static void __pyx_pf_6numind_6NumInd_4__dealloc__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__dealloc__", 0); +/* … */ + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); +} +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">190</span>: free(self._shape)</pre> +<pre class='cython code score-0 '> free(__pyx_v_self->_shape); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">191</span>: free(self._strides)</pre> +<pre class='cython code score-0 '> free(__pyx_v_self->_strides); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">192</span>: free(self.inter)</pre> +<pre class='cython code score-0 '> free(__pyx_v_self->inter); +</pre></div></body></html> diff --git a/pymolfile/molfile/numind-cython/numind.pyx b/pymolfile/molfile/numind-cython/numind.pyx new file mode 100644 index 0000000..d959b2b --- /dev/null +++ b/pymolfile/molfile/numind-cython/numind.pyx @@ -0,0 +1,192 @@ +# This Pyrex extension class can take a numpy/numarray/Numeric object +# as a parameter and wrap it so that its information can be accessed +# in a standard way, both in Python space and C space. +# +# Heavily based on an idea of Andrew Straw. See +# http://www.scipy.org/Cookbook/ArrayStruct_and_Pyrex +# Very inspiring! :-) +# +# First version: 2006-03-25 +# Last update: 2006-03-25 +# Author: Francesc Altet + +import sys +from cpython.pycapsule cimport * + +cdef extern from "Python.h": + ctypedef int Py_intptr_t + ctypedef object PyObject + long PyInt_AsLong(object) + void Py_INCREF(object) + void Py_DECREF(object) + +cdef extern from "stdlib.h": + ctypedef long size_t + ctypedef long intptr_t + void *malloc(size_t size) + void free(void* ptr) + +cdef extern from "numind.h": + ctypedef struct SignedIntBuf + +# for PyArrayInterface: +CONTIGUOUS=0x01 +FORTRAN=0x02 +ALIGNED=0x100 +NOTSWAPPED=0x200 +WRITEABLE=0x400 + +# byteorder dictionary +byteorder = {'<':'little', '>':'big'} + +ctypedef struct PyArrayInterface: + int version # contains the integer 2 as a sanity check + int nd # number of dimensions + char typekind # kind in array --- character code of typestr + int itemsize # size of each element + int flags # flags indicating how the data should be interpreted + Py_intptr_t *shape # A length-nd array of shape information + Py_intptr_t *strides # A length-nd array of stride information + void *data # A pointer to the first element of the array + +cdef void* free_array_interface(object arr): + Py_DECREF(arr) + + +cdef class NumInd: + cdef void *data + cdef int _nd + cdef Py_intptr_t *_shape + cdef Py_intptr_t *_strides + cdef PyArrayInterface *inter + cdef object _t_shape, _t_strides, _undarray + + def __init__(self, object undarray): + cdef int i, stride + cdef object array_shape, array_strides + + # Keep a reference to the underlying object + self._undarray = undarray + # Get the shape and strides C arrays + array_shape = undarray.__array_interface__["shape"] + self._t_shape = array_shape + # The number of dimensions + self._nd = len(array_shape) + # The shape + self._shape = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + for i from 0 <= i < self._nd: + self._shape[i] = self._t_shape[i] + # The strides (compute them if needed) + array_strides = undarray.__array_interface__["strides"] + self._t_strides = array_strides + self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + if array_strides: + for i from 0 <= i < self._nd: + self._strides[i] = array_strides[i] + else: + # strides is None. Compute them explicitely. + self._t_strides = [0] * self._nd + stride = int(self.typestr[2:]) + for i from self._nd > i >= 0: + self._strides[i] = stride + self._t_strides[i] = stride + stride = stride * array_shape[i] + self._t_strides = tuple(self._t_strides) + # Populate the C array interface + self.inter = self._get_array_interface() + + # Properties. This are visible from Python space. + # Add as many as you want. + + property undarray: # Returns the underlying array + def __get__(self): + return self._undarray + + property shape: + def __get__(self): + return self._t_shape + + property strides: + def __get__(self): + return self._t_strides + + property typestr: + def __get__(self): + return self._undarray.__array_interface__["typestr"] + + property typekind: + def __get__(self): + return chr(self.inter.typekind) + + property readonly: + def __get__(self): + return self._undarray.__array_interface__["data"][1] + + property __array_struct__: + "Allows other numerical packages to obtain a new object." + def __get__(self): + if hasattr(self._undarray, "__array_struct__"): + return self._undarray.__array_struct__ + else: + # No an underlying array with __array_struct__ + # Deliver an equivalent PyCObject. + Py_INCREF(self) + return PyCapsule_New(<void*>self.inter, + "struct array", + <PyCapsule_Destructor>free_array_interface) + + cdef PyArrayInterface *_get_array_interface(self): + "Populates the array interface" + cdef PyArrayInterface *inter + cdef object undarray, data_address, typestr + cdef object obj + + undarray = self._undarray + typestr = self.typestr + inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface)) + if inter is NULL: + raise MemoryError() + + inter.version = 2 + inter.nd = self._nd + inter.typekind = ord(typestr[1]) + inter.itemsize = int(typestr[2:]) + inter.flags = 0 # initialize flags + if typestr[0] == '|': + inter.flags = inter.flags | NOTSWAPPED + elif byteorder[typestr[0]] == sys.byteorder: + inter.flags = inter.flags | NOTSWAPPED + if not self.readonly: + inter.flags = inter.flags | WRITEABLE + # XXX how to determine the ALIGNED flag? + inter.strides = self._strides + inter.shape = self._shape + # Get the data address + obj = undarray.__array_interface__["data"] + data_address = obj[0] + inter.data = <void*>PyInt_AsLong(data_address) + return inter + + + # This is just an example on how to modify the data in C space + # (and at C speed! :-) + def modify(self): + "Modify the values of the underlying array" + cdef long *ldata + cdef double *fdata + cdef int i + + # Modify just the first row + if chr(self.inter.typekind) == 'i': + ldata = <long *>self.inter.data + for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + ldata[i] = ldata[i] + 1 + elif chr(self.inter.typekind) == 'f': + fdata = <double *>self.inter.data + for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + fdata[i] = fdata[i] + 1 + + def __dealloc__(self): + free(self._shape) + free(self._strides) + free(self.inter) diff --git a/pymolfile/molfile/numind-cython/numind.so b/pymolfile/molfile/numind-cython/numind.so new file mode 100755 index 0000000000000000000000000000000000000000..f8b762476eb1d362018f305fce67cf22ec134e2f GIT binary patch literal 78632 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 literal 0 HcmV?d00001 diff --git a/pymolfile/molfile/numind-cython/test_numpy_swig.py b/pymolfile/molfile/numind-cython/test_numpy_swig.py new file mode 100644 index 0000000..d53a1b1 --- /dev/null +++ b/pymolfile/molfile/numind-cython/test_numpy_swig.py @@ -0,0 +1,42 @@ +import numpy +import ctypes +import numind + +# Create an arbitrary object for each package +np=numpy.arange(12, dtype=numpy.float) +#np=numpy.arange(12) +np.shape = (4,3) + +#ns = _numpy_swig(2,2) +#print(ns) + + +# Wrap the different objects with the NumInd class +# and execute some actions on it +##for obj in [np]: +# ni = _numpy_swig +# print("original object type-->", type(ni.inter)) +# # Print some values +# #print("typestr --> {0}", ni.typestr) +# #print("shape --> {0}", ni.shape) +# #print("strides --> {0}", ni.strides) +# npa = numpy.asarray(ni) +# print("object after a numpy re-wrapping --> " , npa) +# #ni.modify() +# #print("object after modification in C space --> {0}", npa) + +# Wrap the different objects with the NumInd class +# and execute some actions on it +for obj in [np]: + ni = numind.NumInd(obj) + print("original object type-->", type(ni.undarray)) + # Print some values + print("typestr -->", ni.typestr) + print("typekind -->", ni.typekind) + print("shape -->", ni.shape) + print("strides -->", ni.strides) + npa = numpy.asarray(ni) + print("object after a numpy re-wrapping -->", npa) + ni.modify() + print("object after modification in C space -->", npa) + diff --git a/pymolfile/molfile/numpy_swig.h b/pymolfile/molfile/numpy_swig.h new file mode 100644 index 0000000..f884368 --- /dev/null +++ b/pymolfile/molfile/numpy_swig.h @@ -0,0 +1,12 @@ +#ifndef NUMPY_SWIG +#define NUMPY_SWIG + +typedef struct SignedIntBuf +{ + int* data; + int shape[2]; + int strides[2]; +} SignedIntBuf; + +#endif + diff --git a/pymolfile/molfile/numpy_swig.i b/pymolfile/molfile/numpy_swig.i new file mode 100644 index 0000000..7adc4f2 --- /dev/null +++ b/pymolfile/molfile/numpy_swig.i @@ -0,0 +1,178 @@ +%{ +#define SWIG_FILE_WITH_INIT +%} +%include "numpy.i" +%init %{ +import_array(); +%} + +%module (docstring="This is a Python SWIG-wrapped module") numpy_swig + +%{ +#include "numpy_swig.h" +#include <numpy/arrayobject.h> + +#if PY_VERSION_HEX >= 0x03000000 +NPY_NO_EXPORT void +gentype_struct_free(PyObject *ptr) +{ + PyArrayInterface *arrif; + PyObject *context; + + arrif = (PyArrayInterface*)PyCapsule_GetPointer(ptr, NULL); + context = (PyObject *)PyCapsule_GetContext(ptr); + Py_DECREF(context); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)) +{ + PyObject *ret = PyCapsule_New(ptr, NULL, dtor); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, void (*dtor)(PyObject *)) +{ + PyObject *ret = NpyCapsule_FromVoidPtr(ptr, dtor); + if (ret != NULL && PyCapsule_SetContext(ret, context) != 0) { + PyErr_Clear(); + Py_DECREF(ret); + ret = NULL; + } + return ret; +} +#else +NPY_NO_EXPORT void +gentype_struct_free(void *ptr, void *arg) +{ + PyArrayInterface *arrif = (PyArrayInterface *)ptr; + Py_DECREF((PyObject *)arg); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, + void (*dtor)(void *, void *)) +{ + return PyCObject_FromVoidPtrAndDesc(ptr, context, dtor); +} +#endif + +#ifndef Py_CAPSULE_H +typedef void(*PyCapsule_Destructor)(void *, void *); +#endif + +void delete_SignedIntBuf(SignedIntBuf* buffer) +{ + free(buffer->data); + free(buffer); +} + +void free_array_interface( void* ptr, void *arr ) +{ + PyArrayInterface* inter; + PyObject* arrpy; + + inter = (PyArrayInterface*)ptr; + arrpy = (PyObject*)arr; + Py_DECREF(arrpy); + free(inter); +} +void free_capsule(PyObject* arr) +{ + PyArrayInterface* inter; + inter = (PyArrayInterface*) PyCapsule_GetPointer(arr, "struct SignedIntBuf"); + Py_DECREF(arr); + free(inter); +} +%} + +%inline %{PyObject* get__array_struct__(PyObject* self) +{ + PyArrayInterface *inter; + PyObject *obj; + int nd; + nd = 2; + Py_intptr_t *shape, *strides; + void *data = NULL; + + shape = (Py_intptr_t *)malloc(nd*sizeof(Py_intptr_t)); + strides = (Py_intptr_t *)malloc(nd*sizeof(Py_intptr_t)); + + inter = (PyArrayInterface*)malloc(sizeof(PyArrayInterface)); + if (inter==NULL) + return PyErr_NoMemory(); + + inter->two = 2; + inter->nd = nd; + inter->typekind = 'i'; + inter->itemsize = sizeof(int); + inter->flags = NPY_ARRAY_NOTSWAPPED | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE; + inter->strides = strides; + inter->shape = shape; + inter->data = (void*) data; + Py_INCREF(self); + obj = NpyCapsule_FromVoidPtrAndDesc(inter, self, gentype_struct_free); +/* +#ifdef Py_CAPSULE_H + obj = PyCapsule_New((void*)inter, "struct SignedIntBuf", free_capsule); +#else + obj = PyCObject_FromVoidPtrAndDesc((void*)inter, (void*)self, free_array_interface); +#endif +*/ + return obj; +} +%} + +%include numpy_swig.h + +%extend SignedIntBuf{ + %feature("autodoc", "The comment docstring")SignedIntBuf; + SignedIntBuf(int width, int height) + { + SignedIntBuf* buffer = (SignedIntBuf*) malloc(sizeof(SignedIntBuf)); + int shape[2] = { height, width }; + int strides[2] = { width * sizeof(int), sizeof(int) }; + buffer->shape[0] = shape[0]; + buffer->shape[1] = shape[1]; + buffer->strides[0] = strides[0]; + buffer->strides[1] = strides[1]; + buffer->data = (int*) malloc(width*height*sizeof(int)); + return buffer; + } + + ~SignedIntBuf(); + + char *__str__() + { + static char tmp[1024]; + int i, j; + int used = 0; + used += sprintf(tmp, "Array:\n"); + for(i=0; i < $self->shape[0]; i++) + { + for(j=0; j < $self->shape[1]; j++) + used += sprintf(tmp + used, "%d\t", $self->data[j + i*$self->shape[1]]); + used += sprintf(tmp + used, "\n"); + } + return tmp; + } + + %pythoncode + { + def __array_struct__get(self): + return get__array_struct__(self) + + property __array_struct__: + "Allows other numerical packages to obtain a new object." + def __get__(self): + return __array_struct__get(self) + } +}; + + diff --git a/pymolfile/molfile/numpy_swig.py b/pymolfile/molfile/numpy_swig.py new file mode 100644 index 0000000..32b6df7 --- /dev/null +++ b/pymolfile/molfile/numpy_swig.py @@ -0,0 +1,150 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 3.0.12 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + +"""This is a Python SWIG-wrapped module""" + + +from sys import version_info as _swig_python_version_info +if _swig_python_version_info >= (2, 7, 0): + def swig_import_helper(): + import importlib + pkg = __name__.rpartition('.')[0] + mname = '.'.join((pkg, '_numpy_swig')).lstrip('.') + try: + return importlib.import_module(mname) + except ImportError: + return importlib.import_module('_numpy_swig') + _numpy_swig = swig_import_helper() + del swig_import_helper +elif _swig_python_version_info >= (2, 6, 0): + def swig_import_helper(): + from os.path import dirname + import imp + fp = None + try: + fp, pathname, description = imp.find_module('_numpy_swig', [dirname(__file__)]) + except ImportError: + import _numpy_swig + return _numpy_swig + try: + _mod = imp.load_module('_numpy_swig', fp, pathname, description) + finally: + if fp is not None: + fp.close() + return _mod + _numpy_swig = swig_import_helper() + del swig_import_helper +else: + import _numpy_swig +del _swig_python_version_info + +try: + _swig_property = property +except NameError: + pass # Python < 2.2 doesn't have 'property'. + +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ + +def _swig_setattr_nondynamic(self, class_type, name, value, static=1): + if (name == "thisown"): + return self.this.own(value) + if (name == "this"): + if type(value).__name__ == 'SwigPyObject': + self.__dict__[name] = value + return + method = class_type.__swig_setmethods__.get(name, None) + if method: + return method(self, value) + if (not static): + if _newclass: + object.__setattr__(self, name, value) + else: + self.__dict__[name] = value + else: + raise AttributeError("You cannot add attributes to %s" % self) + + +def _swig_setattr(self, class_type, name, value): + return _swig_setattr_nondynamic(self, class_type, name, value, 0) + + +def _swig_getattr(self, class_type, name): + if (name == "thisown"): + return self.this.own() + method = class_type.__swig_getmethods__.get(name, None) + if method: + return method(self) + raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name)) + + +def _swig_repr(self): + try: + strthis = "proxy of " + self.this.__repr__() + except __builtin__.Exception: + strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + +try: + _object = object + _newclass = 1 +except __builtin__.Exception: + class _object: + pass + _newclass = 0 + + +def get__array_struct__(arg1: 'PyObject *') -> "PyObject *": + return _numpy_swig.get__array_struct__(arg1) +get__array_struct__ = _numpy_swig.get__array_struct__ +class SignedIntBuf(_object): + __swig_setmethods__ = {} + __setattr__ = lambda self, name, value: _swig_setattr(self, SignedIntBuf, name, value) + __swig_getmethods__ = {} + __getattr__ = lambda self, name: _swig_getattr(self, SignedIntBuf, name) + __repr__ = _swig_repr + __swig_setmethods__["data"] = _numpy_swig.SignedIntBuf_data_set + __swig_getmethods__["data"] = _numpy_swig.SignedIntBuf_data_get + if _newclass: + data = _swig_property(_numpy_swig.SignedIntBuf_data_get, _numpy_swig.SignedIntBuf_data_set) + __swig_setmethods__["shape"] = _numpy_swig.SignedIntBuf_shape_set + __swig_getmethods__["shape"] = _numpy_swig.SignedIntBuf_shape_get + if _newclass: + shape = _swig_property(_numpy_swig.SignedIntBuf_shape_get, _numpy_swig.SignedIntBuf_shape_set) + __swig_setmethods__["strides"] = _numpy_swig.SignedIntBuf_strides_set + __swig_getmethods__["strides"] = _numpy_swig.SignedIntBuf_strides_get + if _newclass: + strides = _swig_property(_numpy_swig.SignedIntBuf_strides_get, _numpy_swig.SignedIntBuf_strides_set) + + def __init__(self, width: 'int', height: 'int'): + """The comment docstring""" + this = _numpy_swig.new_SignedIntBuf(width, height) + try: + self.this.append(this) + except __builtin__.Exception: + self.this = this + __swig_destroy__ = _numpy_swig.delete_SignedIntBuf + __del__ = lambda self: None + + def __str__(self) -> "char *": + return _numpy_swig.SignedIntBuf___str__(self) + + def __array_struct__get(self): + return get__array_struct__(self) + + property __array_struct__: + "Allows other numerical packages to obtain a new object." + def __get__(self): + return __array_struct__get(self) + +SignedIntBuf_swigregister = _numpy_swig.SignedIntBuf_swigregister +SignedIntBuf_swigregister(SignedIntBuf) + +# This file is compatible with both classic and new-style classes. + + diff --git a/pymolfile/molfile/numpy_swig_wrap.cxx b/pymolfile/molfile/numpy_swig_wrap.cxx new file mode 100644 index 0000000..c2224d3 --- /dev/null +++ b/pymolfile/molfile/numpy_swig_wrap.cxx @@ -0,0 +1,4477 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 3.0.12 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + + +#ifndef SWIGPYTHON +#define SWIGPYTHON +#endif + +#define SWIG_PYTHON_DIRECTOR_NO_VTABLE + + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template<typename T> class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs); + SwigValueWrapper(const SwigValueWrapper<T>& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template <typename T> T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if defined(__GNUC__) +# if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + +/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ +#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) +# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 +#endif + +/* Intel's compiler complains if a variable which was never initialised is + * cast to void, which is a common idiom which we use to indicate that we + * are aware a variable isn't used. So we just silence that warning. + * See: https://github.com/swig/swig/issues/192 for more discussion. + */ +#ifdef __INTEL_COMPILER +# pragma warning disable 592 +#endif + + +#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) +/* Use debug wrappers with the Python release dll */ +# undef _DEBUG +# include <Python.h> +# define _DEBUG +#else +# include <Python.h> +#endif + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if (<obj is ok>) { + if (<need new object>) { + *ptr = <ptr to new allocated object>; + return SWIG_NEWOBJ; + } else { + *ptr = <ptr to old object>; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast(r) (r) +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include <string.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class<int>" == "Class<int >", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like <name1>|<name2>|... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCmp(const char *nb, const char *tb) { + int equiv = 1; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (equiv != 0 && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = SWIG_TypeNameComp(nb, ne, tb, te); + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like <name1>|<name2>|... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; +} + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + size_t l = 0; + size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + const unsigned char *u = (unsigned char *) ptr; + const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + unsigned char *u = (unsigned char *) ptr; + const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + char d = *(c++); + unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = (unsigned char)((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = (unsigned char)((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (unsigned char)(d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (unsigned char)(d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +/* Compatibility macros for Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + +#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) +#define PyInt_Check(x) PyLong_Check(x) +#define PyInt_AsLong(x) PyLong_AsLong(x) +#define PyInt_FromLong(x) PyLong_FromLong(x) +#define PyInt_FromSize_t(x) PyLong_FromSize_t(x) +#define PyString_Check(name) PyBytes_Check(name) +#define PyString_FromString(x) PyUnicode_FromString(x) +#define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) +#define PyString_AsString(str) PyBytes_AsString(str) +#define PyString_Size(str) PyBytes_Size(str) +#define PyString_InternFromString(key) PyUnicode_InternFromString(key) +#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE +#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) +#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) + +#endif + +#ifndef Py_TYPE +# define Py_TYPE(op) ((op)->ob_type) +#endif + +/* SWIG APIs for compatibility of both Python 2 & 3 */ + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_FromFormat PyUnicode_FromFormat +#else +# define SWIG_Python_str_FromFormat PyString_FromFormat +#endif + + +/* Warning: This function will allocate a new string in Python 3, + * so please call SWIG_Python_str_DelForPy3(x) to free the space. + */ +SWIGINTERN char* +SWIG_Python_str_AsChar(PyObject *str) +{ +#if PY_VERSION_HEX >= 0x03000000 + char *cstr; + char *newstr; + Py_ssize_t len; + str = PyUnicode_AsUTF8String(str); + PyBytes_AsStringAndSize(str, &cstr, &len); + newstr = (char *) malloc(len+1); + memcpy(newstr, cstr, len+1); + Py_XDECREF(str); + return newstr; +#else + return PyString_AsString(str); +#endif +} + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) +#else +# define SWIG_Python_str_DelForPy3(x) +#endif + + +SWIGINTERN PyObject* +SWIG_Python_str_FromChar(const char *c) +{ +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_FromString(c); +#else + return PyString_FromString(c); +#endif +} + +/* Add PyOS_snprintf for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) +# define PyOS_snprintf _snprintf +# else +# define PyOS_snprintf snprintf +# endif +#endif + +/* A crude PyString_FromFormat implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 + +#ifndef SWIG_PYBUFFER_SIZE +# define SWIG_PYBUFFER_SIZE 1024 +#endif + +static PyObject * +PyString_FromFormat(const char *fmt, ...) { + va_list ap; + char buf[SWIG_PYBUFFER_SIZE * 2]; + int res; + va_start(ap, fmt); + res = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); +} +#endif + +#ifndef PyObject_DEL +# define PyObject_DEL PyObject_Del +#endif + +/* A crude PyExc_StopIteration exception for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# ifndef PyExc_StopIteration +# define PyExc_StopIteration PyExc_RuntimeError +# endif +# ifndef PyObject_GenericGetAttr +# define PyObject_GenericGetAttr 0 +# endif +#endif + +/* Py_NotImplemented is defined in 2.1 and up. */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef Py_NotImplemented +# define Py_NotImplemented PyExc_RuntimeError +# endif +#endif + +/* A crude PyString_AsStringAndSize implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef PyString_AsStringAndSize +# define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} +# endif +#endif + +/* PySequence_Size for old Pythons */ +#if PY_VERSION_HEX < 0x02000000 +# ifndef PySequence_Size +# define PySequence_Size PySequence_Length +# endif +#endif + +/* PyBool_FromLong for old Pythons */ +#if PY_VERSION_HEX < 0x02030000 +static +PyObject *PyBool_FromLong(long ok) +{ + PyObject *result = ok ? Py_True : Py_False; + Py_INCREF(result); + return result; +} +#endif + +/* Py_ssize_t for old Pythons */ +/* This code is as recommended by: */ +/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +# define PY_SSIZE_T_MAX INT_MAX +# define PY_SSIZE_T_MIN INT_MIN +typedef inquiry lenfunc; +typedef intargfunc ssizeargfunc; +typedef intintargfunc ssizessizeargfunc; +typedef intobjargproc ssizeobjargproc; +typedef intintobjargproc ssizessizeobjargproc; +typedef getreadbufferproc readbufferproc; +typedef getwritebufferproc writebufferproc; +typedef getsegcountproc segcountproc; +typedef getcharbufferproc charbufferproc; +static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) +{ + long result = 0; + PyObject *i = PyNumber_Int(x); + if (i) { + result = PyInt_AsLong(i); + Py_DECREF(i); + } + return result; +} +#endif + +#if PY_VERSION_HEX < 0x02050000 +#define PyInt_FromSize_t(x) PyInt_FromLong((long)x) +#endif + +#if PY_VERSION_HEX < 0x02040000 +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef struct { + PyTypeObject type; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; + PyBufferProcs as_buffer; + PyObject *name, *slots; +} PyHeapTypeObject; +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef destructor freefunc; +#endif + +#if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ + (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ + (PY_MAJOR_VERSION > 3)) +# define SWIGPY_USE_CAPSULE +# define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) +#endif + +#if PY_VERSION_HEX < 0x03020000 +#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) +#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) +#define Py_hash_t long +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIME PyObject* +SWIG_Python_ErrorType(int code) { + PyObject* type = 0; + switch(code) { + case SWIG_MemoryError: + type = PyExc_MemoryError; + break; + case SWIG_IOError: + type = PyExc_IOError; + break; + case SWIG_RuntimeError: + type = PyExc_RuntimeError; + break; + case SWIG_IndexError: + type = PyExc_IndexError; + break; + case SWIG_TypeError: + type = PyExc_TypeError; + break; + case SWIG_DivisionByZero: + type = PyExc_ZeroDivisionError; + break; + case SWIG_OverflowError: + type = PyExc_OverflowError; + break; + case SWIG_SyntaxError: + type = PyExc_SyntaxError; + break; + case SWIG_ValueError: + type = PyExc_ValueError; + break; + case SWIG_SystemError: + type = PyExc_SystemError; + break; + case SWIG_AttributeError: + type = PyExc_AttributeError; + break; + default: + type = PyExc_RuntimeError; + } + return type; +} + + +SWIGRUNTIME void +SWIG_Python_AddErrorMsg(const char* mesg) +{ + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + + if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + PyErr_Clear(); + Py_XINCREF(type); + + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + Py_DECREF(value); + } else { + PyErr_SetString(PyExc_RuntimeError, mesg); + } +} + +#if defined(SWIG_PYTHON_NO_THREADS) +# if defined(SWIG_PYTHON_THREADS) +# undef SWIG_PYTHON_THREADS +# endif +#endif +#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ +# if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) +# if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ +# define SWIG_PYTHON_USE_GIL +# endif +# endif +# if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ +# ifndef SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# endif +# ifdef __cplusplus /* C++ code */ + class SWIG_Python_Thread_Block { + bool status; + PyGILState_STATE state; + public: + void end() { if (status) { PyGILState_Release(state); status = false;} } + SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} + ~SWIG_Python_Thread_Block() { end(); } + }; + class SWIG_Python_Thread_Allow { + bool status; + PyThreadState *save; + public: + void end() { if (status) { PyEval_RestoreThread(save); status = false; }} + SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} + ~SWIG_Python_Thread_Allow() { end(); } + }; +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block +# define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow +# define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() +# else /* C code */ +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() +# define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() +# define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) +# endif +# else /* Old thread way, not implemented, user must provide it */ +# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) +# define SWIG_PYTHON_INITIALIZE_THREADS +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_END_BLOCK) +# define SWIG_PYTHON_THREAD_END_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# endif +# if !defined(SWIG_PYTHON_THREAD_END_ALLOW) +# define SWIG_PYTHON_THREAD_END_ALLOW +# endif +# endif +#else /* No thread support */ +# define SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# define SWIG_PYTHON_THREAD_END_BLOCK +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# define SWIG_PYTHON_THREAD_END_ALLOW +#endif + +/* ----------------------------------------------------------------------------- + * Python API portion that goes into the runtime + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------------------------------------------------------- + * Constant declarations + * ----------------------------------------------------------------------------- */ + +/* Constant Types */ +#define SWIG_PY_POINTER 4 +#define SWIG_PY_BINARY 5 + +/* Constant information structure */ +typedef struct swig_const_info { + int type; + char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_const_info; + + +/* ----------------------------------------------------------------------------- + * Wrapper of PyInstanceMethod_New() used in Python 3 + * It is exported to the generated module, used for -fastproxy + * ----------------------------------------------------------------------------- */ +#if PY_VERSION_HEX >= 0x03000000 +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) +{ + return PyInstanceMethod_New(func); +} +#else +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) +{ + return NULL; +} +#endif + +#ifdef __cplusplus +} +#endif + + +/* ----------------------------------------------------------------------------- + * pyrun.swg + * + * This file contains the runtime support for Python modules + * and includes code for managing global variables and pointer + * type checking. + * + * ----------------------------------------------------------------------------- */ + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) +#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) +#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) + +#ifdef SWIGPYTHON_BUILTIN +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) +#else +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) +#endif + +#define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) + +#define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) +#define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) +#define swig_owntype int + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) +#define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) +#define SWIG_NewClientData(obj) SwigPyClientData_New(obj) + +#define SWIG_SetErrorObj SWIG_Python_SetErrorObj +#define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg +#define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) +#define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + + +/* Runtime API implementation */ + +/* Error manipulation */ + +SWIGINTERN void +SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetObject(errtype, obj); + Py_DECREF(obj); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +SWIGINTERN void +SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetString(errtype, msg); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +#define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) + +/* Set a constant value */ + +#if defined(SWIGPYTHON_BUILTIN) + +SWIGINTERN void +SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { + PyObject *s = PyString_InternFromString(key); + PyList_Append(seq, s); + Py_DECREF(s); +} + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { +#if PY_VERSION_HEX < 0x02030000 + PyDict_SetItemString(d, (char *)name, obj); +#else + PyDict_SetItemString(d, name, obj); +#endif + Py_DECREF(obj); + if (public_interface) + SwigPyBuiltin_AddPublicSymbol(public_interface, name); +} + +#else + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { +#if PY_VERSION_HEX < 0x02030000 + PyDict_SetItemString(d, (char *)name, obj); +#else + PyDict_SetItemString(d, name, obj); +#endif + Py_DECREF(obj); +} + +#endif + +/* Append a value to the result obj */ + +SWIGINTERN PyObject* +SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { +#if !defined(SWIG_PYTHON_OUTPUT_TUPLE) + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyList_Check(result)) { + PyObject *o2 = result; + result = PyList_New(1); + PyList_SetItem(result, 0, o2); + } + PyList_Append(result,obj); + Py_DECREF(obj); + } + return result; +#else + PyObject* o2; + PyObject* o3; + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyTuple_Check(result)) { + o2 = result; + result = PyTuple_New(1); + PyTuple_SET_ITEM(result, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SET_ITEM(o3, 0, obj); + o2 = result; + result = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return result; +#endif +} + +/* Unpack the argument tuple */ + +SWIGINTERN Py_ssize_t +SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) +{ + if (!args) { + if (!min && !max) { + return 1; + } else { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", + name, (min == max ? "" : "at least "), (int)min); + return 0; + } + } + if (!PyTuple_Check(args)) { + if (min <= 1 && max >= 1) { + Py_ssize_t i; + objs[0] = args; + for (i = 1; i < max; ++i) { + objs[i] = 0; + } + return 2; + } + PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); + return 0; + } else { + Py_ssize_t l = PyTuple_GET_SIZE(args); + if (l < min) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at least "), (int)min, (int)l); + return 0; + } else if (l > max) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at most "), (int)max, (int)l); + return 0; + } else { + Py_ssize_t i; + for (i = 0; i < l; ++i) { + objs[i] = PyTuple_GET_ITEM(args, i); + } + for (; l < max; ++l) { + objs[l] = 0; + } + return i + 1; + } + } +} + +/* A functor is a function object with one single object argument */ +#if PY_VERSION_HEX >= 0x02020000 +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); +#else +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); +#endif + +/* + Helper for static pointer initialization for both C and C++ code, for example + static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); +*/ +#ifdef __cplusplus +#define SWIG_STATIC_POINTER(var) var +#else +#define SWIG_STATIC_POINTER(var) var = 0; if (!var) var +#endif + +/* ----------------------------------------------------------------------------- + * Pointer declarations + * ----------------------------------------------------------------------------- */ + +/* Flags for new pointer objects */ +#define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) +#define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) + +#define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) + +#define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) +#define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) + +#ifdef __cplusplus +extern "C" { +#endif + +/* How to access Py_None */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# ifndef SWIG_PYTHON_NO_BUILD_NONE +# ifndef SWIG_PYTHON_BUILD_NONE +# define SWIG_PYTHON_BUILD_NONE +# endif +# endif +#endif + +#ifdef SWIG_PYTHON_BUILD_NONE +# ifdef Py_None +# undef Py_None +# define Py_None SWIG_Py_None() +# endif +SWIGRUNTIMEINLINE PyObject * +_SWIG_Py_None(void) +{ + PyObject *none = Py_BuildValue((char*)""); + Py_DECREF(none); + return none; +} +SWIGRUNTIME PyObject * +SWIG_Py_None(void) +{ + static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); + return none; +} +#endif + +/* The python void return value */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Py_Void(void) +{ + PyObject *none = Py_None; + Py_INCREF(none); + return none; +} + +/* SwigPyClientData */ + +typedef struct { + PyObject *klass; + PyObject *newraw; + PyObject *newargs; + PyObject *destroy; + int delargs; + int implicitconv; + PyTypeObject *pytype; +} SwigPyClientData; + +SWIGRUNTIMEINLINE int +SWIG_Python_CheckImplicit(swig_type_info *ty) +{ + SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; + return data ? data->implicitconv : 0; +} + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_ExceptionType(swig_type_info *desc) { + SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; + PyObject *klass = data ? data->klass : 0; + return (klass ? klass : PyExc_RuntimeError); +} + + +SWIGRUNTIME SwigPyClientData * +SwigPyClientData_New(PyObject* obj) +{ + if (!obj) { + return 0; + } else { + SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); + /* the klass element */ + data->klass = obj; + Py_INCREF(data->klass); + /* the newraw method and newargs arguments used to create a new raw instance */ + if (PyClass_Check(obj)) { + data->newraw = 0; + data->newargs = obj; + Py_INCREF(obj); + } else { +#if (PY_VERSION_HEX < 0x02020000) + data->newraw = 0; +#else + data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); +#endif + if (data->newraw) { + Py_INCREF(data->newraw); + data->newargs = PyTuple_New(1); + PyTuple_SetItem(data->newargs, 0, obj); + } else { + data->newargs = obj; + } + Py_INCREF(data->newargs); + } + /* the destroy method, aka as the C++ delete method */ + data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); + if (PyErr_Occurred()) { + PyErr_Clear(); + data->destroy = 0; + } + if (data->destroy) { + int flags; + Py_INCREF(data->destroy); + flags = PyCFunction_GET_FLAGS(data->destroy); +#ifdef METH_O + data->delargs = !(flags & (METH_O)); +#else + data->delargs = 0; +#endif + } else { + data->delargs = 0; + } + data->implicitconv = 0; + data->pytype = 0; + return data; + } +} + +SWIGRUNTIME void +SwigPyClientData_Del(SwigPyClientData *data) { + Py_XDECREF(data->newraw); + Py_XDECREF(data->newargs); + Py_XDECREF(data->destroy); +} + +/* =============== SwigPyObject =====================*/ + +typedef struct { + PyObject_HEAD + void *ptr; + swig_type_info *ty; + int own; + PyObject *next; +#ifdef SWIGPYTHON_BUILTIN + PyObject *dict; +#endif +} SwigPyObject; + + +#ifdef SWIGPYTHON_BUILTIN + +SWIGRUNTIME PyObject * +SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) +{ + SwigPyObject *sobj = (SwigPyObject *)v; + + if (!sobj->dict) + sobj->dict = PyDict_New(); + + Py_INCREF(sobj->dict); + return sobj->dict; +} + +#endif + +SWIGRUNTIME PyObject * +SwigPyObject_long(SwigPyObject *v) +{ + return PyLong_FromVoidPtr(v->ptr); +} + +SWIGRUNTIME PyObject * +SwigPyObject_format(const char* fmt, SwigPyObject *v) +{ + PyObject *res = NULL; + PyObject *args = PyTuple_New(1); + if (args) { + if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { + PyObject *ofmt = SWIG_Python_str_FromChar(fmt); + if (ofmt) { +#if PY_VERSION_HEX >= 0x03000000 + res = PyUnicode_Format(ofmt,args); +#else + res = PyString_Format(ofmt,args); +#endif + Py_DECREF(ofmt); + } + Py_DECREF(args); + } + } + return res; +} + +SWIGRUNTIME PyObject * +SwigPyObject_oct(SwigPyObject *v) +{ + return SwigPyObject_format("%o",v); +} + +SWIGRUNTIME PyObject * +SwigPyObject_hex(SwigPyObject *v) +{ + return SwigPyObject_format("%x",v); +} + +SWIGRUNTIME PyObject * +#ifdef METH_NOARGS +SwigPyObject_repr(SwigPyObject *v) +#else +SwigPyObject_repr(SwigPyObject *v, PyObject *args) +#endif +{ + const char *name = SWIG_TypePrettyName(v->ty); + PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", (name ? name : "unknown"), (void *)v); + if (v->next) { +# ifdef METH_NOARGS + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); +# else + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); +# endif +# if PY_VERSION_HEX >= 0x03000000 + PyObject *joined = PyUnicode_Concat(repr, nrep); + Py_DecRef(repr); + Py_DecRef(nrep); + repr = joined; +# else + PyString_ConcatAndDel(&repr,nrep); +# endif + } + return repr; +} + +SWIGRUNTIME int +SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) +{ + void *i = v->ptr; + void *j = w->ptr; + return (i < j) ? -1 : ((i > j) ? 1 : 0); +} + +/* Added for Python 3.x, would it also be useful for Python 2.x? */ +SWIGRUNTIME PyObject* +SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) +{ + PyObject* res; + if( op != Py_EQ && op != Py_NE ) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); + return res; +} + + +SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); + +#ifdef SWIGPYTHON_BUILTIN +static swig_type_info *SwigPyObject_stype = 0; +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + SwigPyClientData *cd; + assert(SwigPyObject_stype); + cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; + assert(cd); + assert(cd->pytype); + return cd->pytype; +} +#else +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); + return type; +} +#endif + +SWIGRUNTIMEINLINE int +SwigPyObject_Check(PyObject *op) { +#ifdef SWIGPYTHON_BUILTIN + PyTypeObject *target_tp = SwigPyObject_type(); + if (PyType_IsSubtype(op->ob_type, target_tp)) + return 1; + return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); +#else + return (Py_TYPE(op) == SwigPyObject_type()) + || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); +#endif +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own); + +SWIGRUNTIME void +SwigPyObject_dealloc(PyObject *v) +{ + SwigPyObject *sobj = (SwigPyObject *) v; + PyObject *next = sobj->next; + if (sobj->own == SWIG_POINTER_OWN) { + swig_type_info *ty = sobj->ty; + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + PyObject *destroy = data ? data->destroy : 0; + if (destroy) { + /* destroy is always a VARARGS method */ + PyObject *res; + + /* PyObject_CallFunction() has the potential to silently drop + the active active exception. In cases of unnamed temporary + variable or where we just finished iterating over a generator + StopIteration will be active right now, and this needs to + remain true upon return from SwigPyObject_dealloc. So save + and restore. */ + + PyObject *val = NULL, *type = NULL, *tb = NULL; + PyErr_Fetch(&val, &type, &tb); + + if (data->delargs) { + /* we need to create a temporary object to carry the destroy operation */ + PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); + res = SWIG_Python_CallFunctor(destroy, tmp); + Py_DECREF(tmp); + } else { + PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); + PyObject *mself = PyCFunction_GET_SELF(destroy); + res = ((*meth)(mself, v)); + } + if (!res) + PyErr_WriteUnraisable(destroy); + + PyErr_Restore(val, type, tb); + + Py_XDECREF(res); + } +#if !defined(SWIG_PYTHON_SILENT_MEMLEAK) + else { + const char *name = SWIG_TypePrettyName(ty); + printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); + } +#endif + } + Py_XDECREF(next); + PyObject_DEL(v); +} + +SWIGRUNTIME PyObject* +SwigPyObject_append(PyObject* v, PyObject* next) +{ + SwigPyObject *sobj = (SwigPyObject *) v; +#ifndef METH_O + PyObject *tmp = 0; + if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; + next = tmp; +#endif + if (!SwigPyObject_Check(next)) { + PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); + return NULL; + } + sobj->next = next; + Py_INCREF(next); + return SWIG_Py_Void(); +} + +SWIGRUNTIME PyObject* +#ifdef METH_NOARGS +SwigPyObject_next(PyObject* v) +#else +SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *) v; + if (sobj->next) { + Py_INCREF(sobj->next); + return sobj->next; + } else { + return SWIG_Py_Void(); + } +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_disown(PyObject *v) +#else +SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = 0; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_acquire(PyObject *v) +#else +SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = SWIG_POINTER_OWN; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +SwigPyObject_own(PyObject *v, PyObject *args) +{ + PyObject *val = 0; +#if (PY_VERSION_HEX < 0x02020000) + if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) +#elif (PY_VERSION_HEX < 0x02050000) + if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) +#else + if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) +#endif + { + return NULL; + } + else + { + SwigPyObject *sobj = (SwigPyObject *)v; + PyObject *obj = PyBool_FromLong(sobj->own); + if (val) { +#ifdef METH_NOARGS + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v); + } else { + SwigPyObject_disown(v); + } +#else + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v,args); + } else { + SwigPyObject_disown(v,args); + } +#endif + } + return obj; + } +} + +#ifdef METH_O +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#else +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"acquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#endif + +#if PY_VERSION_HEX < 0x02020000 +SWIGINTERN PyObject * +SwigPyObject_getattr(SwigPyObject *sobj,char *name) +{ + return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); +} +#endif + +SWIGRUNTIME PyTypeObject* +SwigPyObject_TypeOnce(void) { + static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; + + static PyNumberMethods SwigPyObject_as_number = { + (binaryfunc)0, /*nb_add*/ + (binaryfunc)0, /*nb_subtract*/ + (binaryfunc)0, /*nb_multiply*/ + /* nb_divide removed in Python 3 */ +#if PY_VERSION_HEX < 0x03000000 + (binaryfunc)0, /*nb_divide*/ +#endif + (binaryfunc)0, /*nb_remainder*/ + (binaryfunc)0, /*nb_divmod*/ + (ternaryfunc)0,/*nb_power*/ + (unaryfunc)0, /*nb_negative*/ + (unaryfunc)0, /*nb_positive*/ + (unaryfunc)0, /*nb_absolute*/ + (inquiry)0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ +#if PY_VERSION_HEX < 0x03000000 + 0, /*nb_coerce*/ +#endif + (unaryfunc)SwigPyObject_long, /*nb_int*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_long, /*nb_long*/ +#else + 0, /*nb_reserved*/ +#endif + (unaryfunc)0, /*nb_float*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_oct, /*nb_oct*/ + (unaryfunc)SwigPyObject_hex, /*nb_hex*/ +#endif +#if PY_VERSION_HEX >= 0x03050000 /* 3.5 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */ +#elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ +#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ +#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ +#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ + 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ +#endif + }; + + static PyTypeObject swigpyobject_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyObject", /* tp_name */ + sizeof(SwigPyObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyObject_dealloc, /* tp_dealloc */ + 0, /* tp_print */ +#if PY_VERSION_HEX < 0x02020000 + (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ +#else + (getattrfunc)0, /* tp_getattr */ +#endif + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX >= 0x03000000 + 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ +#else + (cmpfunc)SwigPyObject_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyObject_repr, /* tp_repr */ + &SwigPyObject_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + 0, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigobject_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + swigobject_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version_tag */ +#endif +#if PY_VERSION_HEX >= 0x03040000 + 0, /* tp_finalize */ +#endif +#ifdef COUNT_ALLOCS + 0, /* tp_allocs */ + 0, /* tp_frees */ + 0, /* tp_maxalloc */ +#if PY_VERSION_HEX >= 0x02050000 + 0, /* tp_prev */ +#endif + 0 /* tp_next */ +#endif + }; + swigpyobject_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + swigpyobject_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&swigpyobject_type) < 0) + return NULL; +#endif + } + return &swigpyobject_type; +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own) +{ + SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); + if (sobj) { + sobj->ptr = ptr; + sobj->ty = ty; + sobj->own = own; + sobj->next = 0; + } + return (PyObject *)sobj; +} + +/* ----------------------------------------------------------------------------- + * Implements a simple Swig Packed type, and use it instead of string + * ----------------------------------------------------------------------------- */ + +typedef struct { + PyObject_HEAD + void *pack; + swig_type_info *ty; + size_t size; +} SwigPyPacked; + +SWIGRUNTIME int +SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +{ + char result[SWIG_BUFFER_SIZE]; + fputs("<Swig Packed ", fp); + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { + fputs("at ", fp); + fputs(result, fp); + } + fputs(v->ty->name,fp); + fputs(">", fp); + return 0; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_repr(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { + return SWIG_Python_str_FromFormat("<Swig Packed at %s%s>", result, v->ty->name); + } else { + return SWIG_Python_str_FromFormat("<Swig Packed %s>", v->ty->name); + } +} + +SWIGRUNTIME PyObject * +SwigPyPacked_str(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ + return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); + } else { + return SWIG_Python_str_FromChar(v->ty->name); + } +} + +SWIGRUNTIME int +SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) +{ + size_t i = v->size; + size_t j = w->size; + int s = (i < j) ? -1 : ((i > j) ? 1 : 0); + return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); +} + +SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); + return type; +} + +SWIGRUNTIMEINLINE int +SwigPyPacked_Check(PyObject *op) { + return ((op)->ob_type == SwigPyPacked_TypeOnce()) + || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); +} + +SWIGRUNTIME void +SwigPyPacked_dealloc(PyObject *v) +{ + if (SwigPyPacked_Check(v)) { + SwigPyPacked *sobj = (SwigPyPacked *) v; + free(sobj->pack); + } + PyObject_DEL(v); +} + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_TypeOnce(void) { + static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; + static PyTypeObject swigpypacked_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { +#if PY_VERSION_HEX>=0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyPacked", /* tp_name */ + sizeof(SwigPyPacked), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ + (printfunc)SwigPyPacked_print, /* tp_print */ + (getattrfunc)0, /* tp_getattr */ + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX>=0x03000000 + 0, /* tp_reserved in 3.0.1 */ +#else + (cmpfunc)SwigPyPacked_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyPacked_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)SwigPyPacked_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigpacked_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version_tag */ +#endif +#if PY_VERSION_HEX >= 0x03040000 + 0, /* tp_finalize */ +#endif +#ifdef COUNT_ALLOCS + 0, /* tp_allocs */ + 0, /* tp_frees */ + 0, /* tp_maxalloc */ +#if PY_VERSION_HEX >= 0x02050000 + 0, /* tp_prev */ +#endif + 0 /* tp_next */ +#endif + }; + swigpypacked_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + swigpypacked_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&swigpypacked_type) < 0) + return NULL; +#endif + } + return &swigpypacked_type; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) +{ + SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); + if (sobj) { + void *pack = malloc(size); + if (pack) { + memcpy(pack, ptr, size); + sobj->pack = pack; + sobj->ty = ty; + sobj->size = size; + } else { + PyObject_DEL((PyObject *) sobj); + sobj = 0; + } + } + return (PyObject *) sobj; +} + +SWIGRUNTIME swig_type_info * +SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) +{ + if (SwigPyPacked_Check(obj)) { + SwigPyPacked *sobj = (SwigPyPacked *)obj; + if (sobj->size != size) return 0; + memcpy(ptr, sobj->pack, size); + return sobj->ty; + } else { + return 0; + } +} + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIMEINLINE PyObject * +_SWIG_This(void) +{ + return SWIG_Python_str_FromChar("this"); +} + +static PyObject *swig_this = NULL; + +SWIGRUNTIME PyObject * +SWIG_This(void) +{ + if (swig_this == NULL) + swig_this = _SWIG_This(); + return swig_this; +} + +/* #define SWIG_PYTHON_SLOW_GETSET_THIS */ + +/* TODO: I don't know how to implement the fast getset in Python 3 right now */ +#if PY_VERSION_HEX>=0x03000000 +#define SWIG_PYTHON_SLOW_GETSET_THIS +#endif + +SWIGRUNTIME SwigPyObject * +SWIG_Python_GetSwigThis(PyObject *pyobj) +{ + PyObject *obj; + + if (SwigPyObject_Check(pyobj)) + return (SwigPyObject *) pyobj; + +#ifdef SWIGPYTHON_BUILTIN + (void)obj; +# ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + pyobj = PyWeakref_GET_OBJECT(pyobj); + if (pyobj && SwigPyObject_Check(pyobj)) + return (SwigPyObject*) pyobj; + } +# endif + return NULL; +#else + + obj = 0; + +#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) + if (PyInstance_Check(pyobj)) { + obj = _PyInstance_Lookup(pyobj, SWIG_This()); + } else { + PyObject **dictptr = _PyObject_GetDictPtr(pyobj); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; + } else { +#ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); + return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; + } +#endif + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } + } + } +#else + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } +#endif + if (obj && !SwigPyObject_Check(obj)) { + /* a PyObject is called 'this', try to get the 'real this' + SwigPyObject from it */ + return SWIG_Python_GetSwigThis(obj); + } + return (SwigPyObject *)obj; +#endif +} + +/* Acquire a pointer value */ + +SWIGRUNTIME int +SWIG_Python_AcquirePtr(PyObject *obj, int own) { + if (own == SWIG_POINTER_OWN) { + SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); + if (sobj) { + int oldown = sobj->own; + sobj->own = own; + return oldown; + } + } + return 0; +} + +/* Convert a pointer value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { + int res; + SwigPyObject *sobj; + int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; + + if (!obj) + return SWIG_ERROR; + if (obj == Py_None && !implicit_conv) { + if (ptr) + *ptr = 0; + return SWIG_OK; + } + + res = SWIG_ERROR; + + sobj = SWIG_Python_GetSwigThis(obj); + if (own) + *own = 0; + while (sobj) { + void *vptr = sobj->ptr; + if (ty) { + swig_type_info *to = sobj->ty; + if (to == ty) { + /* no type cast needed */ + if (ptr) *ptr = vptr; + break; + } else { + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) { + sobj = (SwigPyObject *)sobj->next; + } else { + if (ptr) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + if (newmemory == SWIG_CAST_NEW_MEMORY) { + assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ + if (own) + *own = *own | SWIG_CAST_NEW_MEMORY; + } + } + break; + } + } + } else { + if (ptr) *ptr = vptr; + break; + } + } + if (sobj) { + if (own) + *own = *own | sobj->own; + if (flags & SWIG_POINTER_DISOWN) { + sobj->own = 0; + } + res = SWIG_OK; + } else { + if (implicit_conv) { + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + if (data && !data->implicitconv) { + PyObject *klass = data->klass; + if (klass) { + PyObject *impconv; + data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ + impconv = SWIG_Python_CallFunctor(klass, obj); + data->implicitconv = 0; + if (PyErr_Occurred()) { + PyErr_Clear(); + impconv = 0; + } + if (impconv) { + SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); + if (iobj) { + void *vptr; + res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); + if (SWIG_IsOK(res)) { + if (ptr) { + *ptr = vptr; + /* transfer the ownership to 'ptr' */ + iobj->own = 0; + res = SWIG_AddCast(res); + res = SWIG_AddNewMask(res); + } else { + res = SWIG_AddCast(res); + } + } + } + Py_DECREF(impconv); + } + } + } + } + if (!SWIG_IsOK(res) && obj == Py_None) { + if (ptr) + *ptr = 0; + if (PyErr_Occurred()) + PyErr_Clear(); + res = SWIG_OK; + } + } + return res; +} + +/* Convert a function ptr value */ + +SWIGRUNTIME int +SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { + if (!PyCFunction_Check(obj)) { + return SWIG_ConvertPtr(obj, ptr, ty, 0); + } else { + void *vptr = 0; + + /* here we get the method pointer for callbacks */ + const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); + const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; + if (desc) + desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; + if (!desc) + return SWIG_ERROR; + if (ty) { + swig_cast_info *tc = SWIG_TypeCheck(desc,ty); + if (tc) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } else { + return SWIG_ERROR; + } + } else { + *ptr = vptr; + } + return SWIG_OK; + } +} + +/* Convert a packed value value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { + swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); + if (!to) return SWIG_ERROR; + if (ty) { + if (to != ty) { + /* check type cast? */ + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) return SWIG_ERROR; + } + } + return SWIG_OK; +} + +/* ----------------------------------------------------------------------------- + * Create a new pointer object + * ----------------------------------------------------------------------------- */ + +/* + Create a new instance object, without calling __init__, and set the + 'this' attribute. +*/ + +SWIGRUNTIME PyObject* +SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) +{ +#if (PY_VERSION_HEX >= 0x02020000) + PyObject *inst = 0; + PyObject *newraw = data->newraw; + if (newraw) { + inst = PyObject_Call(newraw, data->newargs, NULL); + if (inst) { +#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + PyDict_SetItem(dict, SWIG_This(), swig_this); + } + } +#else + PyObject *key = SWIG_This(); + PyObject_SetAttr(inst, key, swig_this); +#endif + } + } else { +#if PY_VERSION_HEX >= 0x03000000 + inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); + if (inst) { + PyObject_SetAttr(inst, SWIG_This(), swig_this); + Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; + } +#else + PyObject *dict = PyDict_New(); + if (dict) { + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); + } +#endif + } + return inst; +#else +#if (PY_VERSION_HEX >= 0x02010000) + PyObject *inst = 0; + PyObject *dict = PyDict_New(); + if (dict) { + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); + } + return (PyObject *) inst; +#else + PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); + if (inst == NULL) { + return NULL; + } + inst->in_class = (PyClassObject *)data->newargs; + Py_INCREF(inst->in_class); + inst->in_dict = PyDict_New(); + if (inst->in_dict == NULL) { + Py_DECREF(inst); + return NULL; + } +#ifdef Py_TPFLAGS_HAVE_WEAKREFS + inst->in_weakreflist = NULL; +#endif +#ifdef Py_TPFLAGS_GC + PyObject_GC_Init(inst); +#endif + PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); + return (PyObject *) inst; +#endif +#endif +} + +SWIGRUNTIME void +SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) +{ + PyObject *dict; +#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + PyDict_SetItem(dict, SWIG_This(), swig_this); + return; + } +#endif + dict = PyObject_GetAttrString(inst, (char*)"__dict__"); + PyDict_SetItem(dict, SWIG_This(), swig_this); + Py_DECREF(dict); +} + + +SWIGINTERN PyObject * +SWIG_Python_InitShadowInstance(PyObject *args) { + PyObject *obj[2]; + if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { + return NULL; + } else { + SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); + if (sthis) { + SwigPyObject_append((PyObject*) sthis, obj[1]); + } else { + SWIG_Python_SetSwigThis(obj[0], obj[1]); + } + return SWIG_Py_Void(); + } +} + +/* Create a new pointer object */ + +SWIGRUNTIME PyObject * +SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { + SwigPyClientData *clientdata; + PyObject * robj; + int own; + + if (!ptr) + return SWIG_Py_Void(); + + clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; + own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; + if (clientdata && clientdata->pytype) { + SwigPyObject *newobj; + if (flags & SWIG_BUILTIN_TP_INIT) { + newobj = (SwigPyObject*) self; + if (newobj->ptr) { + PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); + while (newobj->next) + newobj = (SwigPyObject *) newobj->next; + newobj->next = next_self; + newobj = (SwigPyObject *)next_self; +#ifdef SWIGPYTHON_BUILTIN + newobj->dict = 0; +#endif + } + } else { + newobj = PyObject_New(SwigPyObject, clientdata->pytype); +#ifdef SWIGPYTHON_BUILTIN + newobj->dict = 0; +#endif + } + if (newobj) { + newobj->ptr = ptr; + newobj->ty = type; + newobj->own = own; + newobj->next = 0; + return (PyObject*) newobj; + } + return SWIG_Py_Void(); + } + + assert(!(flags & SWIG_BUILTIN_TP_INIT)); + + robj = SwigPyObject_New(ptr, type, own); + if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { + PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); + Py_DECREF(robj); + robj = inst; + } + return robj; +} + +/* Create a new packed object */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { + return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); +} + +/* -----------------------------------------------------------------------------* + * Get type list + * -----------------------------------------------------------------------------*/ + +#ifdef SWIG_LINK_RUNTIME +void *SWIG_ReturnGlobalTypeList(void *); +#endif + +SWIGRUNTIME swig_module_info * +SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { + static void *type_pointer = (void *)0; + /* first check if module already created */ + if (!type_pointer) { +#ifdef SWIG_LINK_RUNTIME + type_pointer = SWIG_ReturnGlobalTypeList((void *)0); +#else +# ifdef SWIGPY_USE_CAPSULE + type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); +# else + type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, + (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); +# endif + if (PyErr_Occurred()) { + PyErr_Clear(); + type_pointer = (void *)0; + } +#endif + } + return (swig_module_info *) type_pointer; +} + +#if PY_MAJOR_VERSION < 2 +/* PyModule_AddObject function was introduced in Python 2.0. The following function + is copied out of Python/modsupport.c in python version 2.3.4 */ +SWIGINTERN int +PyModule_AddObject(PyObject *m, char *name, PyObject *o) +{ + PyObject *dict; + if (!PyModule_Check(m)) { + PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); + return SWIG_ERROR; + } + if (!o) { + PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); + return SWIG_ERROR; + } + + dict = PyModule_GetDict(m); + if (dict == NULL) { + /* Internal error -- modules must have a dict! */ + PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", + PyModule_GetName(m)); + return SWIG_ERROR; + } + if (PyDict_SetItemString(dict, name, o)) + return SWIG_ERROR; + Py_DECREF(o); + return SWIG_OK; +} +#endif + +SWIGRUNTIME void +#ifdef SWIGPY_USE_CAPSULE +SWIG_Python_DestroyModule(PyObject *obj) +#else +SWIG_Python_DestroyModule(void *vptr) +#endif +{ +#ifdef SWIGPY_USE_CAPSULE + swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); +#else + swig_module_info *swig_module = (swig_module_info *) vptr; +#endif + swig_type_info **types = swig_module->types; + size_t i; + for (i =0; i < swig_module->size; ++i) { + swig_type_info *ty = types[i]; + if (ty->owndata) { + SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; + if (data) SwigPyClientData_Del(data); + } + } + Py_DECREF(SWIG_This()); + swig_this = NULL; +} + +SWIGRUNTIME void +SWIG_Python_SetModule(swig_module_info *swig_module) { +#if PY_VERSION_HEX >= 0x03000000 + /* Add a dummy module object into sys.modules */ + PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); +#else + static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ + PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); +#endif +#ifdef SWIGPY_USE_CAPSULE + PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +#else + PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +#endif +} + +/* The python cached type query */ +SWIGRUNTIME PyObject * +SWIG_Python_TypeCache(void) { + static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); + return cache; +} + +SWIGRUNTIME swig_type_info * +SWIG_Python_TypeQuery(const char *type) +{ + PyObject *cache = SWIG_Python_TypeCache(); + PyObject *key = SWIG_Python_str_FromChar(type); + PyObject *obj = PyDict_GetItem(cache, key); + swig_type_info *descriptor; + if (obj) { +#ifdef SWIGPY_USE_CAPSULE + descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); +#else + descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); +#endif + } else { + swig_module_info *swig_module = SWIG_GetModule(0); + descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); + if (descriptor) { +#ifdef SWIGPY_USE_CAPSULE + obj = PyCapsule_New((void*) descriptor, NULL, NULL); +#else + obj = PyCObject_FromVoidPtr(descriptor, NULL); +#endif + PyDict_SetItem(cache, key, obj); + Py_DECREF(obj); + } + } + Py_DECREF(key); + return descriptor; +} + +/* + For backward compatibility only +*/ +#define SWIG_POINTER_EXCEPTION 0 +#define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) +#define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) + +SWIGRUNTIME int +SWIG_Python_AddErrMesg(const char* mesg, int infront) +{ + if (PyErr_Occurred()) { + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + Py_XINCREF(type); + PyErr_Clear(); + if (infront) { + PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); + } else { + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + } + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + } + return 1; + } else { + return 0; + } +} + +SWIGRUNTIME int +SWIG_Python_ArgFail(int argnum) +{ + if (PyErr_Occurred()) { + /* add information about failing argument */ + char mesg[256]; + PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); + return SWIG_Python_AddErrMesg(mesg, 1); + } else { + return 0; + } +} + +SWIGRUNTIMEINLINE const char * +SwigPyObject_GetDesc(PyObject *self) +{ + SwigPyObject *v = (SwigPyObject *)self; + swig_type_info *ty = v ? v->ty : 0; + return ty ? ty->str : ""; +} + +SWIGRUNTIME void +SWIG_Python_TypeError(const char *type, PyObject *obj) +{ + if (type) { +#if defined(SWIG_COBJECT_TYPES) + if (obj && SwigPyObject_Check(obj)) { + const char *otype = (const char *) SwigPyObject_GetDesc(obj); + if (otype) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", + type, otype); + return; + } + } else +#endif + { + const char *otype = (obj ? obj->ob_type->tp_name : 0); + if (otype) { + PyObject *str = PyObject_Str(obj); + const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; + if (cstr) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", + type, otype, cstr); + SWIG_Python_str_DelForPy3(cstr); + } else { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", + type, otype); + } + Py_XDECREF(str); + return; + } + } + PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); + } else { + PyErr_Format(PyExc_TypeError, "unexpected type is received"); + } +} + + +/* Convert a pointer value, signal an exception on a type mismatch */ +SWIGRUNTIME void * +SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { + void *result; + if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { + PyErr_Clear(); +#if SWIG_POINTER_EXCEPTION + if (flags) { + SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); + SWIG_Python_ArgFail(argnum); + } +#endif + } + return result; +} + +#ifdef SWIGPYTHON_BUILTIN +SWIGRUNTIME int +SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { + PyTypeObject *tp = obj->ob_type; + PyObject *descr; + PyObject *encoded_name; + descrsetfunc f; + int res = -1; + +# ifdef Py_USING_UNICODE + if (PyString_Check(name)) { + name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); + if (!name) + return -1; + } else if (!PyUnicode_Check(name)) +# else + if (!PyString_Check(name)) +# endif + { + PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); + return -1; + } else { + Py_INCREF(name); + } + + if (!tp->tp_dict) { + if (PyType_Ready(tp) < 0) + goto done; + } + + descr = _PyType_Lookup(tp, name); + f = NULL; + if (descr != NULL) + f = descr->ob_type->tp_descr_set; + if (!f) { + if (PyString_Check(name)) { + encoded_name = name; + Py_INCREF(name); + } else { + encoded_name = PyUnicode_AsUTF8String(name); + } + PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); + Py_DECREF(encoded_name); + } else { + res = f(descr, obj, value); + } + + done: + Py_DECREF(name); + return res; +} +#endif + + +#ifdef __cplusplus +} +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_SignedIntBuf swig_types[0] +#define SWIGTYPE_p_char swig_types[1] +#define SWIGTYPE_p_int swig_types[2] +static swig_type_info *swig_types[4]; +static swig_module_info swig_module = {swig_types, 3, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#if (PY_VERSION_HEX <= 0x02000000) +# if !defined(SWIG_PYTHON_CLASSIC) +# error "This python version requires swig to be run with the '-classic' option" +# endif +#endif + +/*----------------------------------------------- + @(target):= _numpy_swig.so + ------------------------------------------------*/ +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_init PyInit__numpy_swig + +#else +# define SWIG_init init_numpy_swig + +#endif +#define SWIG_name "_numpy_swig" + +#define SWIGVERSION 0x030012 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) + + +#include <stdexcept> + + +namespace swig { + class SwigPtr_PyObject { + protected: + PyObject *_obj; + + public: + SwigPtr_PyObject() :_obj(0) + { + } + + SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) + { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + Py_XINCREF(_obj); + SWIG_PYTHON_THREAD_END_BLOCK; + } + + SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) + { + if (initial_ref) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + Py_XINCREF(_obj); + SWIG_PYTHON_THREAD_END_BLOCK; + } + } + + SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) + { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + Py_XINCREF(item._obj); + Py_XDECREF(_obj); + _obj = item._obj; + SWIG_PYTHON_THREAD_END_BLOCK; + return *this; + } + + ~SwigPtr_PyObject() + { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + Py_XDECREF(_obj); + SWIG_PYTHON_THREAD_END_BLOCK; + } + + operator PyObject *() const + { + return _obj; + } + + PyObject *operator->() const + { + return _obj; + } + }; +} + + +namespace swig { + struct SwigVar_PyObject : SwigPtr_PyObject { + SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } + + SwigVar_PyObject & operator = (PyObject* obj) + { + Py_XDECREF(_obj); + _obj = obj; + return *this; + } + }; +} + + +#define SWIG_FILE_WITH_INIT + + +#ifndef SWIG_FILE_WITH_INIT +#define NO_IMPORT_ARRAY +#endif +#include "stdio.h" +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include <numpy/arrayobject.h> + + +#include <complex> + + +#include "numpy_swig.h" +#include <numpy/arrayobject.h> + +#if PY_VERSION_HEX >= 0x03000000 +NPY_NO_EXPORT void +gentype_struct_free(PyObject *ptr) +{ + PyArrayInterface *arrif; + PyObject *context; + + arrif = (PyArrayInterface*)PyCapsule_GetPointer(ptr, NULL); + context = (PyObject *)PyCapsule_GetContext(ptr); + Py_DECREF(context); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)) +{ + PyObject *ret = PyCapsule_New(ptr, NULL, dtor); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, void (*dtor)(PyObject *)) +{ + PyObject *ret = NpyCapsule_FromVoidPtr(ptr, dtor); + if (ret != NULL && PyCapsule_SetContext(ret, context) != 0) { + PyErr_Clear(); + Py_DECREF(ret); + ret = NULL; + } + return ret; +} +#else +NPY_NO_EXPORT void +gentype_struct_free(void *ptr, void *arg) +{ + PyArrayInterface *arrif = (PyArrayInterface *)ptr; + Py_DECREF((PyObject *)arg); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, + void (*dtor)(void *, void *)) +{ + return PyCObject_FromVoidPtrAndDesc(ptr, context, dtor); +} +#endif + +#ifndef Py_CAPSULE_H +typedef void(*PyCapsule_Destructor)(void *, void *); +#endif + +void delete_SignedIntBuf(SignedIntBuf* buffer) +{ + free(buffer->data); + free(buffer); +} + +void free_array_interface( void* ptr, void *arr ) +{ + PyArrayInterface* inter; + PyObject* arrpy; + + inter = (PyArrayInterface*)ptr; + arrpy = (PyObject*)arr; + Py_DECREF(arrpy); + free(inter); +} +void free_capsule(PyObject* arr) +{ + PyArrayInterface* inter; + inter = (PyArrayInterface*) PyCapsule_GetPointer(arr, "struct SignedIntBuf"); + Py_DECREF(arr); + free(inter); +} + +PyObject* get__array_struct__(PyObject* self) +{ + PyArrayInterface *inter; + PyObject *obj; + int nd; + nd = 2; + Py_intptr_t *shape, *strides; + void *data = NULL; + + shape = (Py_intptr_t *)malloc(nd*sizeof(Py_intptr_t)); + strides = (Py_intptr_t *)malloc(nd*sizeof(Py_intptr_t)); + + inter = (PyArrayInterface*)malloc(sizeof(PyArrayInterface)); + if (inter==NULL) + return PyErr_NoMemory(); + + inter->two = 2; + inter->nd = nd; + inter->typekind = 'i'; + inter->itemsize = sizeof(int); + inter->flags = NPY_ARRAY_NOTSWAPPED | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE; + inter->strides = strides; + inter->shape = shape; + inter->data = (void*) data; + Py_INCREF(self); + obj = NpyCapsule_FromVoidPtrAndDesc(inter, self, gentype_struct_free); +/* +#ifdef Py_CAPSULE_H + obj = PyCapsule_New((void*)inter, "struct SignedIntBuf", free_capsule); +#else + obj = PyCObject_FromVoidPtrAndDesc((void*)inter, (void*)self, free_array_interface); +#endif +*/ + return obj; +} + + +#include <limits.h> +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + +SWIGINTERN int +SWIG_AsVal_double (PyObject *obj, double *val) +{ + int res = SWIG_TypeError; + if (PyFloat_Check(obj)) { + if (val) *val = PyFloat_AsDouble(obj); + return SWIG_OK; +#if PY_VERSION_HEX < 0x03000000 + } else if (PyInt_Check(obj)) { + if (val) *val = (double) PyInt_AsLong(obj); + return SWIG_OK; +#endif + } else if (PyLong_Check(obj)) { + double v = PyLong_AsDouble(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + double d = PyFloat_AsDouble(obj); + if (!PyErr_Occurred()) { + if (val) *val = d; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); + } else { + PyErr_Clear(); + } + } + } +#endif + return res; +} + + +#include <float.h> + + +#include <math.h> + + +SWIGINTERNINLINE int +SWIG_CanCastAsInteger(double *d, double min, double max) { + double x = *d; + if ((min <= x && x <= max)) { + double fx = floor(x); + double cx = ceil(x); + double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ + if ((errno == EDOM) || (errno == ERANGE)) { + errno = 0; + } else { + double summ, reps, diff; + if (rd < x) { + diff = x - rd; + } else if (rd > x) { + diff = rd - x; + } else { + return 1; + } + summ = rd + x; + reps = diff/summ; + if (reps < 8*DBL_EPSILON) { + *d = rd; + return 1; + } + } + } + return 0; +} + + +SWIGINTERN int +SWIG_AsVal_long (PyObject *obj, long* val) +{ +#if PY_VERSION_HEX < 0x03000000 + if (PyInt_Check(obj)) { + if (val) *val = PyInt_AsLong(obj); + return SWIG_OK; + } else +#endif + if (PyLong_Check(obj)) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + return SWIG_OverflowError; + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + long v = PyInt_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + if (val) *val = (long)(d); + return res; + } + } + } +#endif + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int (PyObject * obj, int *val) +{ + long v; + int res = SWIG_AsVal_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< int >(v); + } + } + return res; +} + +SWIGINTERN SignedIntBuf *new_SignedIntBuf(int width,int height){ + SignedIntBuf* buffer = (SignedIntBuf*) malloc(sizeof(SignedIntBuf)); + int shape[2] = { height, width }; + int strides[2] = { width * sizeof(int), sizeof(int) }; + buffer->shape[0] = shape[0]; + buffer->shape[1] = shape[1]; + buffer->strides[0] = strides[0]; + buffer->strides[1] = strides[1]; + buffer->data = (int*) malloc(width*height*sizeof(int)); + return buffer; + } +SWIGINTERN char *SignedIntBuf___str__(SignedIntBuf *self){ + static char tmp[1024]; + int i, j; + int used = 0; + used += sprintf(tmp, "Array:\n"); + for(i=0; i < self->shape[0]; i++) + { + for(j=0; j < self->shape[1]; j++) + used += sprintf(tmp + used, "%d\t", self->data[j + i*self->shape[1]]); + used += sprintf(tmp + used, "\n"); + } + return tmp; + } + +SWIGINTERN swig_type_info* +SWIG_pchar_descriptor(void) +{ + static int init = 0; + static swig_type_info* info = 0; + if (!init) { + info = SWIG_TypeQuery("_p_char"); + init = 1; + } + return info; +} + + +SWIGINTERNINLINE PyObject * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + if (carray) { + if (size > INT_MAX) { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + return pchar_descriptor ? + SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); + } else { +#if PY_VERSION_HEX >= 0x03000000 +#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) + return PyBytes_FromStringAndSize(carray, static_cast< Py_ssize_t >(size)); +#else +#if PY_VERSION_HEX >= 0x03010000 + return PyUnicode_DecodeUTF8(carray, static_cast< Py_ssize_t >(size), "surrogateescape"); +#else + return PyUnicode_FromStringAndSize(carray, static_cast< Py_ssize_t >(size)); +#endif +#endif +#else + return PyString_FromStringAndSize(carray, static_cast< Py_ssize_t >(size)); +#endif + } + } else { + return SWIG_Py_Void(); + } +} + + +SWIGINTERNINLINE PyObject * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + +#ifdef __cplusplus +extern "C" { +#endif +SWIGINTERN PyObject *_wrap_get__array_struct__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + PyObject *arg1 = (PyObject *) 0 ; + PyObject * obj0 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:get__array_struct__",&obj0)) SWIG_fail; + arg1 = obj0; + result = (PyObject *)get__array_struct__(arg1); + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SignedIntBuf_data_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SignedIntBuf *arg1 = (SignedIntBuf *) 0 ; + int *arg2 = (int *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:SignedIntBuf_data_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SignedIntBuf, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SignedIntBuf_data_set" "', argument " "1"" of type '" "SignedIntBuf *""'"); + } + arg1 = reinterpret_cast< SignedIntBuf * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SignedIntBuf_data_set" "', argument " "2"" of type '" "int *""'"); + } + arg2 = reinterpret_cast< int * >(argp2); + if (arg1) (arg1)->data = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SignedIntBuf_data_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SignedIntBuf *arg1 = (SignedIntBuf *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SignedIntBuf_data_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SignedIntBuf, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SignedIntBuf_data_get" "', argument " "1"" of type '" "SignedIntBuf *""'"); + } + arg1 = reinterpret_cast< SignedIntBuf * >(argp1); + result = (int *) ((arg1)->data); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SignedIntBuf_shape_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SignedIntBuf *arg1 = (SignedIntBuf *) 0 ; + int *arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:SignedIntBuf_shape_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SignedIntBuf, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SignedIntBuf_shape_set" "', argument " "1"" of type '" "SignedIntBuf *""'"); + } + arg1 = reinterpret_cast< SignedIntBuf * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SignedIntBuf_shape_set" "', argument " "2"" of type '" "int [2]""'"); + } + arg2 = reinterpret_cast< int * >(argp2); + { + if (arg2) { + size_t ii = 0; + for (; ii < (size_t)2; ++ii) *(int *)&arg1->shape[ii] = *((int *)arg2 + ii); + } else { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""shape""' of type '""int [2]""'"); + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SignedIntBuf_shape_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SignedIntBuf *arg1 = (SignedIntBuf *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SignedIntBuf_shape_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SignedIntBuf, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SignedIntBuf_shape_get" "', argument " "1"" of type '" "SignedIntBuf *""'"); + } + arg1 = reinterpret_cast< SignedIntBuf * >(argp1); + result = (int *)(int *) ((arg1)->shape); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SignedIntBuf_strides_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SignedIntBuf *arg1 = (SignedIntBuf *) 0 ; + int *arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:SignedIntBuf_strides_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SignedIntBuf, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SignedIntBuf_strides_set" "', argument " "1"" of type '" "SignedIntBuf *""'"); + } + arg1 = reinterpret_cast< SignedIntBuf * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SignedIntBuf_strides_set" "', argument " "2"" of type '" "int [2]""'"); + } + arg2 = reinterpret_cast< int * >(argp2); + { + if (arg2) { + size_t ii = 0; + for (; ii < (size_t)2; ++ii) *(int *)&arg1->strides[ii] = *((int *)arg2 + ii); + } else { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""strides""' of type '""int [2]""'"); + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SignedIntBuf_strides_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SignedIntBuf *arg1 = (SignedIntBuf *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SignedIntBuf_strides_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SignedIntBuf, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SignedIntBuf_strides_get" "', argument " "1"" of type '" "SignedIntBuf *""'"); + } + arg1 = reinterpret_cast< SignedIntBuf * >(argp1); + result = (int *)(int *) ((arg1)->strides); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_new_SignedIntBuf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + SignedIntBuf *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:new_SignedIntBuf",&obj0,&obj1)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SignedIntBuf" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SignedIntBuf" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (SignedIntBuf *)new_SignedIntBuf(arg1,arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SignedIntBuf, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_SignedIntBuf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SignedIntBuf *arg1 = (SignedIntBuf *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_SignedIntBuf",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SignedIntBuf, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SignedIntBuf" "', argument " "1"" of type '" "SignedIntBuf *""'"); + } + arg1 = reinterpret_cast< SignedIntBuf * >(argp1); + delete_SignedIntBuf(arg1); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SignedIntBuf___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SignedIntBuf *arg1 = (SignedIntBuf *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SignedIntBuf___str__",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SignedIntBuf, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SignedIntBuf___str__" "', argument " "1"" of type '" "SignedIntBuf *""'"); + } + arg1 = reinterpret_cast< SignedIntBuf * >(argp1); + result = (char *)SignedIntBuf___str__(arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *SignedIntBuf_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_SignedIntBuf, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +static PyMethodDef SwigMethods[] = { + { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, + { (char *)"get__array_struct__", _wrap_get__array_struct__, METH_VARARGS, NULL}, + { (char *)"SignedIntBuf_data_set", _wrap_SignedIntBuf_data_set, METH_VARARGS, NULL}, + { (char *)"SignedIntBuf_data_get", _wrap_SignedIntBuf_data_get, METH_VARARGS, NULL}, + { (char *)"SignedIntBuf_shape_set", _wrap_SignedIntBuf_shape_set, METH_VARARGS, NULL}, + { (char *)"SignedIntBuf_shape_get", _wrap_SignedIntBuf_shape_get, METH_VARARGS, NULL}, + { (char *)"SignedIntBuf_strides_set", _wrap_SignedIntBuf_strides_set, METH_VARARGS, NULL}, + { (char *)"SignedIntBuf_strides_get", _wrap_SignedIntBuf_strides_get, METH_VARARGS, NULL}, + { (char *)"new_SignedIntBuf", _wrap_new_SignedIntBuf, METH_VARARGS, (char *)"The comment docstring"}, + { (char *)"delete_SignedIntBuf", _wrap_delete_SignedIntBuf, METH_VARARGS, NULL}, + { (char *)"SignedIntBuf___str__", _wrap_SignedIntBuf___str__, METH_VARARGS, NULL}, + { (char *)"SignedIntBuf_swigregister", SignedIntBuf_swigregister, METH_VARARGS, NULL}, + { NULL, NULL, 0, NULL } +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static swig_type_info _swigt__p_SignedIntBuf = {"_p_SignedIntBuf", "SignedIntBuf *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_int = {"_p_int", "int *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_SignedIntBuf, + &_swigt__p_char, + &_swigt__p_int, +}; + +static swig_cast_info _swigc__p_SignedIntBuf[] = { {&_swigt__p_SignedIntBuf, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_SignedIntBuf, + _swigc__p_char, + _swigc__p_int, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +static swig_const_info swig_const_table[] = { +{0, 0, 0, 0.0, 0, 0}}; + +#ifdef __cplusplus +} +#endif +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned statically to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int init; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + iter=module_head; + do { + if (iter==&swig_module) { + /* Our module is already in the list, so there's nothing more to do. */ + return; + } + iter=iter->next; + } while (iter!= module_head); + + /* otherwise we must add our module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpreters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ + /* c-mode */ +#endif +} +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + /* Python-specific SWIG API */ +#define SWIG_newvarlink() SWIG_Python_newvarlink() +#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) +#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) + + /* ----------------------------------------------------------------------------- + * global variable support code. + * ----------------------------------------------------------------------------- */ + + typedef struct swig_globalvar { + char *name; /* Name of global variable */ + PyObject *(*get_attr)(void); /* Return the current value */ + int (*set_attr)(PyObject *); /* Set the value */ + struct swig_globalvar *next; + } swig_globalvar; + + typedef struct swig_varlinkobject { + PyObject_HEAD + swig_globalvar *vars; + } swig_varlinkobject; + + SWIGINTERN PyObject * + swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_InternFromString("<Swig global variables>"); +#else + return PyString_FromString("<Swig global variables>"); +#endif + } + + SWIGINTERN PyObject * + swig_varlink_str(swig_varlinkobject *v) { +#if PY_VERSION_HEX >= 0x03000000 + PyObject *str = PyUnicode_InternFromString("("); + PyObject *tail; + PyObject *joined; + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + tail = PyUnicode_FromString(var->name); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + if (var->next) { + tail = PyUnicode_InternFromString(", "); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + } + } + tail = PyUnicode_InternFromString(")"); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; +#else + PyObject *str = PyString_FromString("("); + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + PyString_ConcatAndDel(&str,PyString_FromString(var->name)); + if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); + } + PyString_ConcatAndDel(&str,PyString_FromString(")")); +#endif + return str; + } + + SWIGINTERN int + swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { + char *tmp; + PyObject *str = swig_varlink_str(v); + fprintf(fp,"Swig global variables "); + fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(str); + return 0; + } + + SWIGINTERN void + swig_varlink_dealloc(swig_varlinkobject *v) { + swig_globalvar *var = v->vars; + while (var) { + swig_globalvar *n = var->next; + free(var->name); + free(var); + var = n; + } + } + + SWIGINTERN PyObject * + swig_varlink_getattr(swig_varlinkobject *v, char *n) { + PyObject *res = NULL; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->get_attr)(); + break; + } + var = var->next; + } + if (res == NULL && !PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); + } + return res; + } + + SWIGINTERN int + swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { + int res = 1; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->set_attr)(p); + break; + } + var = var->next; + } + if (res == 1 && !PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); + } + return res; + } + + SWIGINTERN PyTypeObject* + swig_varlink_type(void) { + static char varlink__doc__[] = "Swig var link object"; + static PyTypeObject varlink_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"swigvarlink", /* tp_name */ + sizeof(swig_varlinkobject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) swig_varlink_dealloc, /* tp_dealloc */ + (printfunc) swig_varlink_print, /* tp_print */ + (getattrfunc) swig_varlink_getattr, /* tp_getattr */ + (setattrfunc) swig_varlink_setattr, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc) swig_varlink_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + (reprfunc) swig_varlink_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + 0, /* tp_flags */ + varlink__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version_tag */ +#endif +#if PY_VERSION_HEX >= 0x03040000 + 0, /* tp_finalize */ +#endif +#ifdef COUNT_ALLOCS + 0, /* tp_allocs */ + 0, /* tp_frees */ + 0, /* tp_maxalloc */ +#if PY_VERSION_HEX >= 0x02050000 + 0, /* tp_prev */ +#endif + 0 /* tp_next */ +#endif + }; + varlink_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + varlink_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&varlink_type) < 0) + return NULL; +#endif + } + return &varlink_type; + } + + /* Create a variable linking object for use later */ + SWIGINTERN PyObject * + SWIG_Python_newvarlink(void) { + swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); + if (result) { + result->vars = 0; + } + return ((PyObject*) result); + } + + SWIGINTERN void + SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { + swig_varlinkobject *v = (swig_varlinkobject *) p; + swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); + if (gv) { + size_t size = strlen(name)+1; + gv->name = (char *)malloc(size); + if (gv->name) { + strncpy(gv->name,name,size); + gv->get_attr = get_attr; + gv->set_attr = set_attr; + gv->next = v->vars; + } + } + v->vars = gv; + } + + SWIGINTERN PyObject * + SWIG_globals(void) { + static PyObject *_SWIG_globals = 0; + if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); + return _SWIG_globals; + } + + /* ----------------------------------------------------------------------------- + * constants/methods manipulation + * ----------------------------------------------------------------------------- */ + + /* Install Constants */ + SWIGINTERN void + SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { + PyObject *obj = 0; + size_t i; + for (i = 0; constants[i].type; ++i) { + switch(constants[i].type) { + case SWIG_PY_POINTER: + obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); + break; + case SWIG_PY_BINARY: + obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); + break; + default: + obj = 0; + break; + } + if (obj) { + PyDict_SetItemString(d, constants[i].name, obj); + Py_DECREF(obj); + } + } + } + + /* -----------------------------------------------------------------------------*/ + /* Fix SwigMethods to carry the callback ptrs when needed */ + /* -----------------------------------------------------------------------------*/ + + SWIGINTERN void + SWIG_Python_FixMethods(PyMethodDef *methods, + swig_const_info *const_table, + swig_type_info **types, + swig_type_info **types_initial) { + size_t i; + for (i = 0; methods[i].ml_name; ++i) { + const char *c = methods[i].ml_doc; + if (!c) continue; + c = strstr(c, "swig_ptr: "); + if (c) { + int j; + swig_const_info *ci = 0; + const char *name = c + 10; + for (j = 0; const_table[j].type; ++j) { + if (strncmp(const_table[j].name, name, + strlen(const_table[j].name)) == 0) { + ci = &(const_table[j]); + break; + } + } + if (ci) { + void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; + if (ptr) { + size_t shift = (ci->ptype) - types; + swig_type_info *ty = types_initial[shift]; + size_t ldoc = (c - methods[i].ml_doc); + size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; + char *ndoc = (char*)malloc(ldoc + lptr + 10); + if (ndoc) { + char *buff = ndoc; + strncpy(buff, methods[i].ml_doc, ldoc); + buff += ldoc; + strncpy(buff, "swig_ptr: ", 10); + buff += 10; + SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); + methods[i].ml_doc = ndoc; + } + } + } + } + } + } + +#ifdef __cplusplus +} +#endif + +/* -----------------------------------------------------------------------------* + * Partial Init method + * -----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" +#endif + +SWIGEXPORT +#if PY_VERSION_HEX >= 0x03000000 +PyObject* +#else +void +#endif +SWIG_init(void) { + PyObject *m, *d, *md; +#if PY_VERSION_HEX >= 0x03000000 + static struct PyModuleDef SWIG_module = { +# if PY_VERSION_HEX >= 0x03020000 + PyModuleDef_HEAD_INIT, +# else + { + PyObject_HEAD_INIT(NULL) + NULL, /* m_init */ + 0, /* m_index */ + NULL, /* m_copy */ + }, +# endif + (char *) SWIG_name, + NULL, + -1, + SwigMethods, + NULL, + NULL, + NULL, + NULL + }; +#endif + +#if defined(SWIGPYTHON_BUILTIN) + static SwigPyClientData SwigPyObject_clientdata = { + 0, 0, 0, 0, 0, 0, 0 + }; + static PyGetSetDef this_getset_def = { + (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL + }; + static SwigPyGetSet thisown_getset_closure = { + (PyCFunction) SwigPyObject_own, + (PyCFunction) SwigPyObject_own + }; + static PyGetSetDef thisown_getset_def = { + (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure + }; + PyTypeObject *builtin_pytype; + int builtin_base_count; + swig_type_info *builtin_basetype; + PyObject *tuple; + PyGetSetDescrObject *static_getset; + PyTypeObject *metatype; + PyTypeObject *swigpyobject; + SwigPyClientData *cd; + PyObject *public_interface, *public_symbol; + PyObject *this_descr; + PyObject *thisown_descr; + PyObject *self = 0; + int i; + + (void)builtin_pytype; + (void)builtin_base_count; + (void)builtin_basetype; + (void)tuple; + (void)static_getset; + (void)self; + + /* Metaclass is used to implement static member variables */ + metatype = SwigPyObjectType(); + assert(metatype); +#endif + + /* Fix SwigMethods to carry the callback ptrs when needed */ + SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); + +#if PY_VERSION_HEX >= 0x03000000 + m = PyModule_Create(&SWIG_module); +#else + m = Py_InitModule((char *) SWIG_name, SwigMethods); +#endif + + md = d = PyModule_GetDict(m); + (void)md; + + SWIG_InitializeModule(0); + +#ifdef SWIGPYTHON_BUILTIN + swigpyobject = SwigPyObject_TypeOnce(); + + SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); + assert(SwigPyObject_stype); + cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; + if (!cd) { + SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; + SwigPyObject_clientdata.pytype = swigpyobject; + } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) { + PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); +# if PY_VERSION_HEX >= 0x03000000 + return NULL; +# else + return; +# endif + } + + /* All objects have a 'this' attribute */ + this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); + (void)this_descr; + + /* All objects have a 'thisown' attribute */ + thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); + (void)thisown_descr; + + public_interface = PyList_New(0); + public_symbol = 0; + (void)public_symbol; + + PyDict_SetItemString(md, "__all__", public_interface); + Py_DECREF(public_interface); + for (i = 0; SwigMethods[i].ml_name != NULL; ++i) + SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); + for (i = 0; swig_const_table[i].name != 0; ++i) + SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); +#endif + + SWIG_InstallConstants(d,swig_const_table); + + + import_array(); + +#if PY_VERSION_HEX >= 0x03000000 + return m; +#else + return; +#endif +} + diff --git a/pymolfile/molfile/pymolfile-backup.c b/pymolfile/molfile/pymolfile-backup.c new file mode 100644 index 0000000..9e58ed6 --- /dev/null +++ b/pymolfile/molfile/pymolfile-backup.c @@ -0,0 +1,329 @@ +/* Hey emacs this is -*- C -*- and this is my editor vim. + * + * molfile.c : C and Fortran interfaces for molfile_plugins + * Copyright (c) Berk Onat <b.onat@warwick.ac.uk> 2017 + * + * This program is under BSD LICENSE + */ + +/* + * The code is written following the plugin test + * context of f77_molfile.c by Axel Kohlmeyer and + * in molfile_plugin/src/f77 and catdcd.c by + * Justin Gullingsrud of VMD plugins. + */ + +/* Get HAVE_CONFIG_H */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include <ctype.h> + +/* get fixed-width types if we are using ANSI C99 */ +#ifdef HAVE_STDINT_H +# include <stdint.h> +#elif (defined HAVE_INTTYPES_H) +# include <inttypes.h> +#endif + +#include "pymolfile.h" + +//for PyArrayInterface: +#define CONTIGUOUS=0x01 +#define FORTRAN=0x02 +#define ALIGNED=0x100 +#define NOTSWAPPED=0x200 +#define WRITEABLE=0x400 + +//byteorder dictionary +char* byteorder = {"<", "little", ">", "big"} + +int numplugins=0; +molfile_plugin_t** plugin_list; + + +typedef struct PyArrayInterface{ + int version; //contains the integer 2 as a sanity check + int nd; //number of dimensions + char typekind; //kind in array --- character code of typestr + int itemsize; //size of each element + int flags; //flags indicating how the data should be interpreted + Py_intptr_t *shape; //A length-nd array of shape information + Py_intptr_t *strides; //A length-nd array of stride information + void *data; //A pointer to the first element of the array +}; + + +/* * * * * * * * * * * * * * * * * * * * * * * + * Helper functions to set and store plugins * + * * * * * * * * * * * * * * * * * * * * * * */ + +void* free_array_interface(PyObject *arr){ + Py_DECREF(arr); +} + +#if 0 +void init_readwriteaccess(struct DICTHOLDER *dict); + +struct DICTHOLDER * plugin_find(struct DICTHOLDER *dict, const char *pluginname){ + struct DICTHOLDER *dictitem; + dictitem = dict; + // search in dictionary linked list + while(dictitem != NULL){ + if(strcmp(dictitem->key, pluginname) == 0){ + return dictitem; + } + dictitem = dictitem->next; + } + return NULL; +} +#endif + +molfile_plugin_t* get_plugin(molfile_plugin_t** plug_list, int plug_no) +{ + molfile_plugin_t* plugin; + if(plug_no < 0){ + plugin = NULL; + } else { + plugin = plug_list[plug_no]; + } + return plugin; +} + +#if 0 +void init_readwriteaccess(struct DICTHOLDER *dict){ + struct DICTHOLDER *dictitem; + dictitem = dict; + // search in dictionary linked list + while(dictitem != NULL){ + if(!dictitem->id){ + if(plugin_list[dictitem->id]->read_next_timestep){ + dictitem->read = 1; + } + if(plugin_list[dictitem->id]->write_timestep){ + dictitem->write = 1; + } + } + dictitem = dictitem->next; + } +} + +static int has_readsupport(const char *pluginname){ + struct DICTHOLDER *item; + item = plugin_find(&plugindict, pluginname); + if (!item){ + return item->read; + } else { + return 0; + } +} + +static int has_writesupport(const char *pluginname){ + struct DICTHOLDER *item; + item = plugin_find(&plugindict, pluginname); + if (!item){ + return item->write; + } else { + return 0; + } +} + +static int plugin_add(struct DICTHOLDER *dict, const char *key, int id){ + struct DICTHOLDER *dictitem; + // Check list is empty or it already has the key + if (plugin_find(dict, key) == NULL){ + dictitem = dict; + while(1){ + // Find the empty next in the list and add item + if(dictitem == NULL){ + struct DICTHOLDER *item = (struct DICTHOLDER*) malloc(sizeof(struct DICTHOLDER)); + item->key = key; + item->id = id; + item->read = NULL; + item->write = NULL; + dictitem = &item; + return 0; + } else { + dictitem = dictitem->next; + } + } + } else { + return 1; + } +} + +static int plugin_remove(struct DICTHOLDER *dict, const char *key){ + struct DICTHOLDER *dictitem; + // Check list is empty or it already has the key + if (plugin_find(dict, key) == NULL){ + // No key in the list. Nothing to remove. + return 1; + } else { + // Remove key in the list + dictitem = dict; + while(dictitem != NULL){ + if(strcmp(dictitem->next->key, key) == 0){ + struct DICTHOLDER *item = dictitem->next->next; + dictitem->next = item; + return 0; + } + dictitem = dictitem->next; + } + return 1; + } +} +#endif +/* * * * * * * * * * * * * * * * * * * * * * * * * * * + * Interface functions to initialize molfile plugins * + * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* check validity of plugins and register them. */ +static int molfile_register(void*, vmdplugin_t *plugin) { + if (!plugin->type || !plugin->name || !plugin->author) { + // skipping plugin with incomplete header + return VMDPLUGIN_ERROR; + } + else if (plugin->abiversion != vmdplugin_ABIVERSION) { + // skipping plugin with incompatible ABI + return VMDPLUGIN_ERROR; + } + else if (0 != strncmp(plugin->type, "mol file", 8)) { + // skipping plugin of incompatible type + return VMDPLUGIN_ERROR; + } + else if (numplugins >= MAXPLUGINS) { + // too many plugins: increase MAXPLUGINS + return VMDPLUGIN_ERROR; + } + + //if (plugin_find(&plugindict, plugin->name) != NULL) { + // multiple plugins for file type + // return VMDPLUGIN_ERROR; + //} else { + plugin_list[numplugins] = (molfile_plugin_t *) plugin; + //plugin_add(&plugindict, plugin->name, numplugins); + ++numplugins; + return VMDPLUGIN_SUCCESS; + //} +} + +molfile_plugin_t** molfile_plugin_list(int maxsize) +{ + if(maxsize < MAXPLUGINS){ + maxsize = MAXPLUGINS; + } + plugin_list = (molfile_plugin_t**) malloc(sizeof(molfile_plugin_t*)*maxsize); + return plugin_list; +} + +/* register all available plugins and clear handles. */ +int molfile_init(void) +{ +#if 0 + int molfile_internal_register(void *ptr, vmdplugin_t *plugin) + { + if (!plugin->type || !plugin->name || !plugin->author) { + // skipping plugin with incomplete header + return VMDPLUGIN_ERROR; + } + else if (plugin->abiversion != vmdplugin_ABIVERSION) { + // skipping plugin with incompatible ABI + return VMDPLUGIN_ERROR; + } + else if (0 != strncmp(plugin->type, "mol file", 8)) { + // skipping plugin of incompatible type + return VMDPLUGIN_ERROR; + } + else if (num_plugins >= MAX_PLUGINS) { + // too many plugins: increase MAXPLUGINS + return VMDPLUGIN_ERROR; + } + + if (plugin_find(&plugindict, plugin->name) != NULL) { + // multiple plugins for file type + return VMDPLUGIN_ERROR; + } else { + plugin_list[numplugins] = (molfile_plugin_t *) plugin; + ++numplugins; + return VMDPLUGIN_SUCCESS; + } + } +#endif + MOLFILE_INIT_ALL; + MOLFILE_REGISTER_ALL(NULL,molfile_register); + return numplugins; +} + +/* unregister all available plugins */ +int molfile_finish(void) +{ + MOLFILE_FINI_ALL; + return 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * + * Wrappers to directly access molfile plugin* + * functions and settings * + * * * * * * * * * * * * * * * * * * * * * * */ + +/* molfile_plugin_t access */ + +/* Functions in molfile_plugin_t */ + +PyObject * my_read_structure(PyObject* molpack) { + Py_Initialize(); + import_array(); + + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* atoms; + int numatoms, status; + PyArray_Descr *descr; + PyObject p*; + if (PyType_Ready(&MolAtomType) < 0) + return NULL; + PyTypeObject *atype = &MolAtomType; + MolAtom *atom_t; + atom_t = (MolAtom *)atype->tp_alloc(atype, 0); + p = (PyObject*) atom_t; + descr = PyArray_DescrFromObject(p, NULL) + MolObject* plugin_handle = (MolObject*) molpack; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + atoms = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + status = plugin->read_structure(file_handle, &options, atoms); + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error accessing molfile_atom_t in read_structure function of plugin."); + return NULL; + } + PyArrayObject* oresid; + PyObject* array; + int64_t* cresid; + int nd = 1; + npy_intp dims[1] = { numatoms }; + oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT64); + Py_DECREF(p); + array = (PyArrayObject*) PyArray_SimpleNewFromDescr(1, dims, descr); + PyObject_Print(array, stdout, 0); + if (!oresid){ + PyErr_Format(PyExc_IOError, "Error copying molfile_atom_t into numpy array."); + return NULL; + } + npy_intp* n = PyArray_DIMS(oresid); + cresid = (int64_t*) PyArray_DATA(oresid); + +// for (i=0;i<numatoms;i++){ +// cresid[i] = (int64_t) atoms[i].resid; +// } + return (PyObject*) PyArray_FromArray(oresid, PyArray_DESCR(oresid), 0); +} + + diff --git a/pymolfile/molfile/pymolfile-backup2.c b/pymolfile/molfile/pymolfile-backup2.c new file mode 100644 index 0000000..3411b39 --- /dev/null +++ b/pymolfile/molfile/pymolfile-backup2.c @@ -0,0 +1,565 @@ +/* Hey emacs this is -*- C -*- and this is my editor vim. + * + * molfile.c : C and Fortran interfaces for molfile_plugins + * Copyright (c) Berk Onat <b.onat@warwick.ac.uk> 2017 + * + * This program is under BSD LICENSE + */ + +/* + * The code is written following the plugin test + * context of f77_molfile.c by Axel Kohlmeyer and + * in molfile_plugin/src/f77 and catdcd.c by + * Justin Gullingsrud of VMD plugins. + */ + +/* Get HAVE_CONFIG_H */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include <ctype.h> + +/* get fixed-width types if we are using ANSI C99 */ +#ifdef HAVE_STDINT_H +# include <stdint.h> +#elif (defined HAVE_INTTYPES_H) +# include <inttypes.h> +#endif + +#include "pymolfile.h" + +//for PyArrayInterface: +/* +#define CONTIGUOUS 0x01 +#define FORTRAN 0x02 +#define ALIGNED 0x100 +#define NOTSWAPPED 0x200 +#define WRITEABLE 0x400 +#define ARR_HAS_DESCR 0x800 +*/ +//byteorder dictionary +//char** byteorder = {"<", "little", ">", "big"}; + +int numplugins=0; +molfile_plugin_t** plugin_list; + +/* +typedef struct PyArrayInterface{ + int version; //contains the integer 2 as a sanity check + int nd; //number of dimensions + char typekind; //kind in array --- character code of typestr + int itemsize; //size of each element + int flags; //flags indicating how the data should be interpreted + Py_intptr_t *shape; //A length-nd array of shape information + Py_intptr_t *strides; //A length-nd array of stride information + void *data; //A pointer to the first element of the array +}; +*/ +/* * * * * * * * * * * * * * * * * * * * * * * + * Helper functions to set and store plugins * + * * * * * * * * * * * * * * * * * * * * * * */ + +#if PY_VERSION_HEX >= 0x03000000 +#define PyString_FromString PyBytes_FromString +NPY_NO_EXPORT void +gentype_struct_free(PyObject *ptr) +{ + PyArrayInterface *arrif; + PyObject *context; + + arrif = (PyArrayInterface*)PyCapsule_GetPointer(ptr, NULL); + context = (PyObject *)PyCapsule_GetContext(ptr); + Py_DECREF(context); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)) +{ + PyObject *ret = PyCapsule_New(ptr, NULL, dtor); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, void (*dtor)(PyObject *)) +{ + PyObject *ret = NpyCapsule_FromVoidPtr(ptr, dtor); + if (ret != NULL && PyCapsule_SetContext(ret, context) != 0) { + PyErr_Clear(); + Py_DECREF(ret); + ret = NULL; + } + return ret; +} +#else +#define PyBytes_FromString PyString_FromString +NPY_NO_EXPORT void +gentype_struct_free(void *ptr, void *arg) +{ + PyArrayInterface *arrif = (PyArrayInterface *)ptr; + Py_DECREF((PyObject *)arg); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, + void (*dtor)(void *, void *)) +{ + return PyCObject_FromVoidPtrAndDesc(ptr, context, dtor); +} +#endif + + +#if 0 +void init_readwriteaccess(struct DICTHOLDER *dict); + +struct DICTHOLDER * plugin_find(struct DICTHOLDER *dict, const char *pluginname){ + struct DICTHOLDER *dictitem; + dictitem = dict; + // search in dictionary linked list + while(dictitem != NULL){ + if(strcmp(dictitem->key, pluginname) == 0){ + return dictitem; + } + dictitem = dictitem->next; + } + return NULL; +} +#endif + +molfile_plugin_t* get_plugin(molfile_plugin_t** plug_list, int plug_no) +{ + molfile_plugin_t* plugin; + if(plug_no < 0){ + plugin = NULL; + } else { + plugin = plug_list[plug_no]; + } + return plugin; +} + +#if 0 +void init_readwriteaccess(struct DICTHOLDER *dict){ + struct DICTHOLDER *dictitem; + dictitem = dict; + // search in dictionary linked list + while(dictitem != NULL){ + if(!dictitem->id){ + if(plugin_list[dictitem->id]->read_next_timestep){ + dictitem->read = 1; + } + if(plugin_list[dictitem->id]->write_timestep){ + dictitem->write = 1; + } + } + dictitem = dictitem->next; + } +} + +static int has_readsupport(const char *pluginname){ + struct DICTHOLDER *item; + item = plugin_find(&plugindict, pluginname); + if (!item){ + return item->read; + } else { + return 0; + } +} + +static int has_writesupport(const char *pluginname){ + struct DICTHOLDER *item; + item = plugin_find(&plugindict, pluginname); + if (!item){ + return item->write; + } else { + return 0; + } +} + +static int plugin_add(struct DICTHOLDER *dict, const char *key, int id){ + struct DICTHOLDER *dictitem; + // Check list is empty or it already has the key + if (plugin_find(dict, key) == NULL){ + dictitem = dict; + while(1){ + // Find the empty next in the list and add item + if(dictitem == NULL){ + struct DICTHOLDER *item = (struct DICTHOLDER*) malloc(sizeof(struct DICTHOLDER)); + item->key = key; + item->id = id; + item->read = NULL; + item->write = NULL; + dictitem = &item; + return 0; + } else { + dictitem = dictitem->next; + } + } + } else { + return 1; + } +} + +static int plugin_remove(struct DICTHOLDER *dict, const char *key){ + struct DICTHOLDER *dictitem; + // Check list is empty or it already has the key + if (plugin_find(dict, key) == NULL){ + // No key in the list. Nothing to remove. + return 1; + } else { + // Remove key in the list + dictitem = dict; + while(dictitem != NULL){ + if(strcmp(dictitem->next->key, key) == 0){ + struct DICTHOLDER *item = dictitem->next->next; + dictitem->next = item; + return 0; + } + dictitem = dictitem->next; + } + return 1; + } +} +#endif +/* * * * * * * * * * * * * * * * * * * * * * * * * * * + * Interface functions to initialize molfile plugins * + * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* check validity of plugins and register them. */ +static int molfile_register(void*, vmdplugin_t *plugin) { + if (!plugin->type || !plugin->name || !plugin->author) { + // skipping plugin with incomplete header + return VMDPLUGIN_ERROR; + } + else if (plugin->abiversion != vmdplugin_ABIVERSION) { + // skipping plugin with incompatible ABI + return VMDPLUGIN_ERROR; + } + else if (0 != strncmp(plugin->type, "mol file", 8)) { + // skipping plugin of incompatible type + return VMDPLUGIN_ERROR; + } + else if (numplugins >= MAXPLUGINS) { + // too many plugins: increase MAXPLUGINS + return VMDPLUGIN_ERROR; + } + + //if (plugin_find(&plugindict, plugin->name) != NULL) { + // multiple plugins for file type + // return VMDPLUGIN_ERROR; + //} else { + plugin_list[numplugins] = (molfile_plugin_t *) plugin; + //plugin_add(&plugindict, plugin->name, numplugins); + ++numplugins; + return VMDPLUGIN_SUCCESS; + //} +} + +molfile_plugin_t** molfile_plugin_list(int maxsize) +{ + if(maxsize < MAXPLUGINS){ + maxsize = MAXPLUGINS; + } + plugin_list = (molfile_plugin_t**) malloc(sizeof(molfile_plugin_t*)*maxsize); + return plugin_list; +} + +/* register all available plugins and clear handles. */ +int molfile_init(void) +{ +#if 0 + int molfile_internal_register(void *ptr, vmdplugin_t *plugin) + { + if (!plugin->type || !plugin->name || !plugin->author) { + // skipping plugin with incomplete header + return VMDPLUGIN_ERROR; + } + else if (plugin->abiversion != vmdplugin_ABIVERSION) { + // skipping plugin with incompatible ABI + return VMDPLUGIN_ERROR; + } + else if (0 != strncmp(plugin->type, "mol file", 8)) { + // skipping plugin of incompatible type + return VMDPLUGIN_ERROR; + } + else if (num_plugins >= MAX_PLUGINS) { + // too many plugins: increase MAXPLUGINS + return VMDPLUGIN_ERROR; + } + + if (plugin_find(&plugindict, plugin->name) != NULL) { + // multiple plugins for file type + return VMDPLUGIN_ERROR; + } else { + plugin_list[numplugins] = (molfile_plugin_t *) plugin; + ++numplugins; + return VMDPLUGIN_SUCCESS; + } + } +#endif + MOLFILE_INIT_ALL; + MOLFILE_REGISTER_ALL(NULL,molfile_register); + return numplugins; +} + +/* unregister all available plugins */ +int molfile_finish(void) +{ + MOLFILE_FINI_ALL; + return 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * + * Wrappers to directly access molfile plugin* + * functions and settings * + * * * * * * * * * * * * * * * * * * * * * * */ + +/* molfile_plugin_t access */ + +/* Functions in molfile_plugin_t */ + +PyObject * my_read_structure(PyObject* molpack) { + Py_Initialize(); + import_array(); + + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* atoms; + int numatoms, status; + PyArray_Descr *descr; + PyObject *p = NULL; + //if (PyType_Ready(&MolAtomType) < 0) + // return NULL; + //PyTypeObject *atype = &MolAtomType; + //MolAtom *atom_t; + //atom_t = (MolAtom *)atype->tp_alloc(atype, 0); + //p = (PyObject*) atom_t; + descr = PyArray_DescrFromObject(p, NULL); + MolObject* plugin_handle = (MolObject*) molpack; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + atoms = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + status = plugin->read_structure(file_handle, &options, atoms); + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error accessing molfile_atom_t in read_structure function of plugin."); + return NULL; + } + PyArrayObject* oresid; + PyObject* array; + int64_t* cresid; + int nd = 1; + npy_intp dims[1] = { numatoms }; + oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT64); + Py_DECREF(p); + //array = (PyArrayObject*) PyArray_SimpleNewFromDescr(1, dims, descr); + //PyObject_Print(array, stdout, 0); + if (!oresid){ + PyErr_Format(PyExc_IOError, "Error copying molfile_atom_t into numpy array."); + return NULL; + } + npy_intp* n = PyArray_DIMS(oresid); + cresid = (int64_t*) PyArray_DATA(oresid); + +// for (i=0;i<numatoms;i++){ +// cresid[i] = (int64_t) atoms[i].resid; +// } + return (PyObject*) PyArray_FromArray(oresid, PyArray_DESCR(oresid), 0); +} + + +PyObject* get_structure(PyObject* self) +{ + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* data; + int numatoms, status; + int nd; + PyArrayInterface *inter; + PyArrayObject *ret; + char endian = NPY_NATBYTE; + // Access plugin_handle values + MolObject* plugin_handle = (MolObject*) self; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + // Allocate memory for array of molfile_atom_t struct + data = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + // Get array values in molfile_atom_t + status = plugin->read_structure(file_handle, &options, data); + // Check if the plugin returns the results + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error accessing molfile_atom_t in read_structure function of plugin."); + return NULL; + } + // Now, we need to allocate a PyArray with PyArrayInterface + // and assign the allocated memory block to the data. + // To do this, we will build a numpy array from scratch. + // First, allocate a PyObject of PyArrayInterface and + // assign relevant information such as typestr, descr for C-side + // struct and second we will assign molfile_atom_t array as a block + // of data. Last, hope this works. + nd = 1; + npy_intp dims[1] = { 1 }; + // We would allocate a numpy array with + // but will not look clever to copy all the data into the new array. + // Instead, we allocate a numpy array with one element and change + // the definition of array. I know I said that it will be from scratch + // but let's accept nobody wants to define everything in numpy again. + //oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT); + // NPY_INT? Don't worry, we will change it. + //Py_intptr_t *shape, *strides; + //void *data = NULL; + + inter = (PyArrayInterface*)malloc(sizeof(PyArrayInterface)); + if (inter==NULL) + return PyErr_NoMemory(); + + // __array_interface__ descr for C side of __array_struct__ + // Could not find a better way to generate the list of tuples for + // Python side. May need to change this later. + PyObject *tuple = PyTuple_New(13); + // One tuple to bind them + PyObject *py_list_name = PyList_New(2); + PyList_SET_ITEM(py_list_name, 0, PyString_FromString("name")); + PyList_SET_ITEM(py_list_name, 0, PyString_FromString("|S16")); + PyTuple_SET_ITEM(tuple, 0, py_list_name); + PyObject *py_list_type = PyList_New(2); + PyList_SET_ITEM(py_list_type, 0, PyString_FromString("type")); + PyList_SET_ITEM(py_list_type, 0, PyString_FromString("|S16")); + PyTuple_SET_ITEM(tuple, 1, py_list_type); + PyObject *py_list_resname = PyList_New(2); + PyList_SET_ITEM(py_list_resname, 0, PyString_FromString("resname")); + PyList_SET_ITEM(py_list_resname, 0, PyString_FromString("|S8")); + PyTuple_SET_ITEM(tuple, 2, py_list_resname); + PyObject *py_list_resid = PyList_New(2); + PyList_SET_ITEM(py_list_resid, 0, PyString_FromString("resid")); + PyList_SET_ITEM(py_list_resid, 0, PyString_FromString("<i4")); + PyTuple_SET_ITEM(tuple, 3, py_list_resid); + PyObject *py_list_segid = PyList_New(2); + PyList_SET_ITEM(py_list_segid, 0, PyString_FromString("segid")); + PyList_SET_ITEM(py_list_segid, 0, PyString_FromString("|S8")); + PyTuple_SET_ITEM(tuple, 4, py_list_segid); + PyObject *py_list_chain = PyList_New(2); + PyList_SET_ITEM(py_list_chain, 0, PyString_FromString("chain")); + PyList_SET_ITEM(py_list_chain, 0, PyString_FromString("|S2")); + PyTuple_SET_ITEM(tuple, 5, py_list_chain); + PyObject *py_list_altloc = PyList_New(2); + PyList_SET_ITEM(py_list_altloc, 0, PyString_FromString("altloc")); + PyList_SET_ITEM(py_list_altloc, 0, PyString_FromString("|S2")); + PyTuple_SET_ITEM(tuple, 6, py_list_altloc); + PyObject *py_list_insertion = PyList_New(2); + PyList_SET_ITEM(py_list_insertion, 0, PyString_FromString("insertion")); + PyList_SET_ITEM(py_list_insertion, 0, PyString_FromString("|S2")); + PyTuple_SET_ITEM(tuple, 7, py_list_insertion); + PyObject *py_list_occupancy = PyList_New(2); + PyList_SET_ITEM(py_list_occupancy, 0, PyString_FromString("occupancy")); + PyList_SET_ITEM(py_list_occupancy, 0, PyString_FromString("|f4")); + PyTuple_SET_ITEM(tuple, 8, py_list_occupancy); + PyObject *py_list_bfactor = PyList_New(2); + PyList_SET_ITEM(py_list_bfactor, 0, PyString_FromString("bfactor")); + PyList_SET_ITEM(py_list_bfactor, 0, PyString_FromString("|f4")); + PyTuple_SET_ITEM(tuple, 9, py_list_bfactor); + PyObject *py_list_mass = PyList_New(2); + PyList_SET_ITEM(py_list_mass, 0, PyString_FromString("mass")); + PyList_SET_ITEM(py_list_mass, 0, PyString_FromString("|f4")); + PyTuple_SET_ITEM(tuple, 10, py_list_mass); + PyObject *py_list_charge = PyList_New(2); + PyList_SET_ITEM(py_list_charge, 0, PyString_FromString("charge")); + PyList_SET_ITEM(py_list_charge, 0, PyString_FromString("|f4")); + PyTuple_SET_ITEM(tuple, 11, py_list_charge); + PyObject *py_list_radius = PyList_New(2); + PyList_SET_ITEM(py_list_radius, 0, PyString_FromString("radius")); + PyList_SET_ITEM(py_list_radius, 0, PyString_FromString("|f4")); + PyTuple_SET_ITEM(tuple, 12, py_list_radius); + PyObject *py_list_atomicnumber = PyList_New(2); + PyList_SET_ITEM(py_list_atomicnumber, 0, PyString_FromString("atomicnumber")); + PyList_SET_ITEM(py_list_atomicnumber, 0, PyString_FromString("|i4")); + PyTuple_SET_ITEM(tuple, 13, py_list_atomicnumber); + //PyArray_Descr *descr = (PyObject*) tuple; + PyArray_Descr *descr = NULL; + // Here we define the size and stride parameters + npy_intp shape[1] = { numatoms }; + npy_intp strides[1] = { 54*sizeof(char) + 8*sizeof(int) + 20*sizeof(float) }; + + inter->two = 2; + inter->nd = nd; + inter->typekind = 'V'; + inter->itemsize = 82*sizeof(char); + inter->flags = NPY_ARRAY_NOTSWAPPED | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE | NPY_ARR_HAS_DESCR; + inter->strides = (Py_intptr_t *)strides; + inter->shape = (Py_intptr_t *)shape; + inter->data = (void*) data; + // inter->descr = (PyObject*) tuple; + if ((inter->flags & NPY_ARRAY_NOTSWAPPED) != NPY_ARRAY_NOTSWAPPED) { + endian = NPY_OPPBYTE; + inter->flags &= ~NPY_ARRAY_NOTSWAPPED; + } + // typestr is relatively easy to assign to __array_interface__ + printf("TEST1\n"); + if (inter->flags & NPY_ARR_HAS_DESCR) { + printf("TEST1-1\n"); + if (PyArray_DescrConverter(inter->descr, &descr) == NPY_FAIL) { + descr = NULL; + PyErr_Clear(); + } + } + printf("TEST1-2\n"); + char buf[40]; + PyOS_snprintf(buf, sizeof(buf), + "%c%c%d", endian, + inter->typekind, + inter->itemsize); + printf("TEST2\n"); + PyObject *stringobj = PyString_FromString(buf); + if (stringobj == NULL) { + return NULL; + } + printf("TEST2-2\n"); + if (PyArray_DescrConverter(stringobj, &descr) != NPY_SUCCEED) { + Py_DECREF(stringobj); + return NULL; + } + printf("TEST2-3\n"); + Py_DECREF(stringobj); + + printf("TEST3\n"); + ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, descr, + inter->nd, inter->shape, + inter->strides, inter->data, + inter->flags, NULL); + printf("TEST4\n"); + Py_INCREF(inter); + if (PyArray_SetBaseObject(ret, (PyObject *)inter) < 0) { + Py_DECREF(ret); + return NULL; + } + printf("TEST5\n"); +// Py_DECREF(attr); + PyArray_UpdateFlags(ret, NPY_ARRAY_UPDATE_ALL); + printf("TEST6\n"); + return (PyObject *)ret; +} +// obj = NpyCapsule_FromVoidPtrAndDesc(inter, self, gentype_struct_free); +/* +#ifdef Py_CAPSULE_H + obj = PyCapsule_New((void*)inter, "struct SignedIntBuf", free_capsule); +#else + obj = PyCObject_FromVoidPtrAndDesc((void*)inter, (void*)self, free_array_interface); +#endif +*/ + // Cross fingers here. +// return obj; + diff --git a/pymolfile/molfile/pymolfile-backup2.h b/pymolfile/molfile/pymolfile-backup2.h new file mode 100644 index 0000000..a97de9e --- /dev/null +++ b/pymolfile/molfile/pymolfile-backup2.h @@ -0,0 +1,354 @@ +/* Hey emacs this is -*- C -*- and this is my editor vim. + * + * molfile.c : C and Fortran interfaces for molfile_plugins + * Copyright (c) Berk Onat <b.onat@warwick.ac.uk> 2017 + * + * This program is under BSD LICENSE + */ + +/* + * The code is written following the plugin test + * context of f77_molfile.c by Axel Kohlmeyer and + * in molfile_plugin/src/f77 and catdcd.c by + * Justin Gullingsrud of VMD plugins. + */ + +#ifndef _MOLFILE_H_ +#define _MOLFILE_H_ + +#ifdef __cplusplus +extern "C" +{ + +#endif + +#include "molfile_plugin.h" +#include "libmolfile_plugin.h" +#include "vmdplugin.h" +#include "Python.h" +#include "structmember.h" +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include <numpy/arrayobject.h> + +enum { pluginOK, pluginNOINIT, pluginCLOSE, pluginNOMEM, + pluginENDOFFILE, pluginFILENOTFOUND, pluginFORMATERROR }; + +#ifndef MAXPLUGINS +#define MAXPLUGINS 200 +#endif + +struct MolObject { + PyObject_HEAD + molfile_plugin_t* plugin; + void* file_handle; + int natoms; + MolObject(void) {} +}; + +static void MolObject_dealloc(MolObject* self) +{ + Py_XDECREF(self->plugin); + Py_XDECREF(self->file_handle); + Py_TYPE(self)->tp_free((PyObject*)self); +} + +static PyObject * MolObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + MolObject *self; + + self = (MolObject *)type->tp_alloc(type, 0); + if (self != NULL) { + self->plugin = NULL; + self->file_handle = NULL; + self->natoms = 0; + } + + return (PyObject *)self; +} + +static int MolObject_init(MolObject *self, PyObject *args, PyObject *kwds) +{ + molfile_plugin_t *plugin = NULL; + void *file_handle = NULL; + molfile_plugin_t *tmp1 = NULL; + void *tmp2 = NULL; + + static char *kwlist[] = {"plugin", "file_handle", "natoms", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, + &plugin, &file_handle, + &self->natoms)) + return -1; + + if (plugin) { + tmp1 = self->plugin; + Py_INCREF(plugin); + self->plugin = plugin; + Py_XDECREF(tmp1); + } + + if (file_handle) { + tmp2 = self->file_handle; + Py_INCREF(file_handle); + self->file_handle = file_handle; + Py_XDECREF(tmp2); + } + + return 0; +} + +static molfile_plugin_t* MolObject_plugin(MolObject* self) +{ + return self->plugin; +} + +static void* MolObject_file_handle(MolObject* self) +{ + return self->file_handle; +} + +static PyObject* MolObject_natoms(MolObject* self) +{ + return PyLong_FromLong((long)self->natoms); +} + +static PyMemberDef MolObject_members[] = { + {"plugin", T_OBJECT_EX, offsetof(MolObject, plugin), 0, + "molfile_plugin_t type plugin"}, + {"file_handle", T_OBJECT_EX, offsetof(MolObject, file_handle), 0, + "file handle for plugin"}, + {"natoms", T_INT, offsetof(MolObject, natoms), 0, + "number of atoms"}, + {NULL} /* Sentinel */ +}; + +static PyMethodDef MolObject_methods[] = { + {"get_plugin", (PyCFunction)MolObject_plugin, METH_NOARGS, + "Return the plugin" + }, + {"get_file_handle", (PyCFunction)MolObject_file_handle, METH_NOARGS, + "Return the plugin" + }, + {"get_natoms", (PyCFunction)MolObject_natoms, METH_NOARGS, + "Return the number of atoms" + }, + {NULL} /* Sentinel */ +}; + + +#ifndef PyVarObject_HEAD_INIT + #define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, +#endif + +static PyTypeObject MolObjectType = { + PyVarObject_HEAD_INIT(NULL, 0) + "molobject", /*tp_name*/ + sizeof(MolObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)MolObject_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_reserved*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + "molobject objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + MolObject_methods, /* tp_methods */ + MolObject_members, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)MolObject_init, /* tp_init */ + 0, /* tp_alloc */ + MolObject_new, /* tp_new */ +}; + +#if 0 +struct MolAtom { + PyObject_HEAD + char* name; + char* type; + char* resname; + int* resid; + char* segid; + char* chain; + char* altloc; + char* insertion; + float* occupancy; + float* bfactor; + float* mass; + float* charge; + float* radius; + float* atomicnumber; + float* ctnumber; + MolAtom(void) {} +}; + +static void MolAtom_dealloc(MolAtom* self) +{ + Py_XDECREF(self->name); + Py_XDECREF(self->type); + Py_XDECREF(self->resname); + Py_XDECREF(self->resid); + Py_XDECREF(self->segid); + Py_XDECREF(self->chain); + Py_XDECREF(self->altloc); + Py_XDECREF(self->insertion); + Py_XDECREF(self->occupancy); + Py_XDECREF(self->bfactor); + Py_XDECREF(self->mass); + Py_XDECREF(self->charge); + Py_XDECREF(self->radius); + Py_XDECREF(self->atomicnumber); + Py_XDECREF(self->ctnumber); + Py_TYPE(self)->tp_free((PyObject*)self); +} + +static PyObject * MolAtom_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + MolAtom *self; + + self = (MolAtom *)type->tp_alloc(type, 0); + if (self != NULL) { + self->name = NULL; + self->type = NULL; + self->resname = NULL; + self->resid = NULL; + self->segid = NULL; + self->chain = NULL; + self->altloc = NULL; + self->insertion = NULL; + self->occupancy = NULL; + self->bfactor = NULL; + self->mass = NULL; + self->charge = NULL; + self->radius = NULL; + self->atomicnumber = NULL; + self->ctnumber = NULL; + } + + return (PyObject *)self; +} + +static PyMemberDef MolAtom_members[] = { + {"name", T_STRING, offsetof(MolAtom, name), 0,""}, + {"type", T_STRING, offsetof(MolAtom, type), 0,""}, + {"resname", T_STRING, offsetof(MolAtom, resname), 0,""}, + {"resid", T_INT, offsetof(MolAtom, resid), 0,""}, + {"segid", T_STRING, offsetof(MolAtom, segid), 0,""}, + {"chain", T_STRING, offsetof(MolAtom, chain), 0,""}, + {"altloc", T_STRING, offsetof(MolAtom, altloc), 0,""}, + {"insertion", T_STRING, offsetof(MolAtom, insertion), 0,""}, + {"occupancy", T_FLOAT, offsetof(MolAtom, occupancy), 0,""}, + {"bfactor", T_FLOAT, offsetof(MolAtom, bfactor), 0,""}, + {"mass", T_FLOAT, offsetof(MolAtom, mass), 0,""}, + {"charge", T_FLOAT, offsetof(MolAtom, charge), 0,""}, + {"radius", T_FLOAT, offsetof(MolAtom, radius), 0,""}, + {"atomicnumber", T_INT, offsetof(MolAtom, atomicnumber), 0,""}, + {"ctnumber", T_INT, offsetof(MolAtom, ctnumber), 0,""}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static PyTypeObject MolAtomType = { + PyVarObject_HEAD_INIT(NULL, 0) + "molobject", /*tp_name*/ + sizeof(MolAtom), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)MolAtom_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_reserved*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + "molatom objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + MolAtom_members, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + MolAtom_new, /* tp_new */ +}; +#endif +PyObject * my_read_structure(PyObject* molpack); +PyObject * get_structure(PyObject* molpack); + +#if 0 +typedef struct DICTHOLDER { + const char *key; // Dictionary key + int id; // Id of the item + int read; // 1 if molfile plugin read the format + int write; // 1 if molfile plugin write in this format + struct DICTHOLDER *next; // Next item in the dictionary +} DICTHOLDER; + +struct DICTHOLDER * plugin_find(struct DICTHOLDER *dict, const char *pluginname); + +static int plugin_add(struct DICTHOLDER *dict, const char *key, int id); + +static int plugin_remove(struct DICTHOLDER *dict, const char *key); + +static int has_readsupport(const char *pluginname); + +static int has_writesupport(const char *pluginname); + +static molfile_plugin_t *get_plugin(const char *pluginname); + +static int molfile_register(void *ptr, vmdplugin_t *plugin); + +#endif +molfile_plugin_t* get_plugin(molfile_plugin_t** plug_list, int plug_no); + +molfile_plugin_t** molfile_plugin_list(int maxsize); + +int molfile_init(void); + +int molfile_finish(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _MOLFILE_H_ */ + diff --git a/pymolfile/molfile/pymolfile-new.c b/pymolfile/molfile/pymolfile-new.c new file mode 100644 index 0000000..21b1c00 --- /dev/null +++ b/pymolfile/molfile/pymolfile-new.c @@ -0,0 +1,1522 @@ +/* Hey emacs this is -*- C -*- and this is my editor vim. + * + * molfile.c : C and Fortran interfaces for molfile_plugins + * Copyright (c) Berk Onat <b.onat@warwick.ac.uk> 2017 + * + * This program is under BSD LICENSE + */ + +/* + * The code is written following the plugin test + * context of f77_molfile.c by Axel Kohlmeyer and + * in molfile_plugin/src/f77 and catdcd.c by + * Justin Gullingsrud of VMD plugins. + */ + +/* Get HAVE_CONFIG_H */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include <ctype.h> + +/* get fixed-width types if we are using ANSI C99 */ +#ifdef HAVE_STDINT_H +# include <stdint.h> +#elif (defined HAVE_INTTYPES_H) +# include <inttypes.h> +#endif + +#include "pymolfile.h" + + +//for PyArrayInterface: +/* +#define CONTIGUOUS 0x01 +#define FORTRAN 0x02 +#define ALIGNED 0x100 +#define NOTSWAPPED 0x200 +#define WRITEABLE 0x400 +#define ARR_HAS_DESCR 0x800 +*/ +//byteorder dictionary +//char** byteorder = {"<", "little", ">", "big"}; + +int numplugins=0; +molfile_plugin_t** plugin_list; + +/* +typedef struct PyArrayInterface{ + int version; //contains the integer 2 as a sanity check + int nd; //number of dimensions + char typekind; //kind in array --- character code of typestr + int itemsize; //size of each element + int flags; //flags indicating how the data should be interpreted + Py_intptr_t *shape; //A length-nd array of shape information + Py_intptr_t *strides; //A length-nd array of stride information + void *data; //A pointer to the first element of the array +}; +*/ +/* * * * * * * * * * * * * * * * * * * * * * * + * Helper functions to set and store plugins * + * * * * * * * * * * * * * * * * * * * * * * */ + +#define PyInt_AsSsize_t PyLong_AsSsize_t +#define PyArray_Check(op) PyObject_TypeCheck(op, &PyArray_Type) + +#if PY_VERSION_HEX >= 0x03000000 +#define PyString_FromString PyBytes_FromString +NPY_NO_EXPORT void +gentype_struct_free(PyObject *ptr) +{ + PyArrayInterface *arrif; + PyObject *context; + + arrif = (PyArrayInterface*)PyCapsule_GetPointer(ptr, NULL); + context = (PyObject *)PyCapsule_GetContext(ptr); + Py_DECREF(context); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +static NPY_INLINE void * +NpyCapsule_AsVoidPtr(PyObject *obj) +{ + void *ret = PyCapsule_GetPointer(obj, NULL); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)) +{ + PyObject *ret = PyCapsule_New(ptr, NULL, dtor); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, void (*dtor)(PyObject *)) +{ + PyObject *ret = NpyCapsule_FromVoidPtr(ptr, dtor); + if (ret != NULL && PyCapsule_SetContext(ret, context) != 0) { + PyErr_Clear(); + Py_DECREF(ret); + ret = NULL; + } + return ret; +} +#else +#define PyBytes_FromString PyString_FromString +NPY_NO_EXPORT void +gentype_struct_free(void *ptr, void *arg) +{ + PyArrayInterface *arrif = (PyArrayInterface *)ptr; + Py_DECREF((PyObject *)arg); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, + void (*dtor)(void *, void *)) +{ + return PyCObject_FromVoidPtrAndDesc(ptr, context, dtor); +} +#endif +static PyObject *typeDict = NULL; /* Must be explicitly loaded */ + +#define PyUString_Check PyUnicode_Check +#define PyUString_GET_SIZE PyUnicode_GET_SIZE +#define PyUString_FromFormat PyUnicode_FromFormat +#define PyInt_FromLong PyLong_FromLong +#define PyString_Type PyBytes_Type +#define PyInt_Type PyLong_Type + +#define NPY_NEXT_ALIGNED_OFFSET(offset, alignment) \ + (((offset) + (alignment) - 1) & (-(alignment))) + +static PyArray_Descr * +_convert_from_array_descr(PyObject *obj, int align) +{ + int n, i, totalsize; + int ret; + PyObject *fields, *item, *newobj; + PyObject *name, *tup, *title; + PyObject *nameslist; + PyArray_Descr *newea; + PyArray_Descr *conv; + /* Types with fields need the Python C API for field access */ + char dtypeflags = NPY_NEEDS_PYAPI; + int maxalign = 0; + + printf("Test1\n"); + n = PyList_GET_SIZE(obj); + nameslist = PyTuple_New(n); + if (!nameslist) { + return NULL; + } + totalsize = 0; + fields = PyDict_New(); + for (i = 0; i < n; i++) { + item = PyList_GET_ITEM(obj, i); + if (!PyTuple_Check(item) || (PyTuple_GET_SIZE(item) < 2)) { + goto fail; + } + name = PyTuple_GET_ITEM(item, 0); + if (PyUString_Check(name)) { + title = NULL; + } + else if (PyTuple_Check(name)) { + if (PyTuple_GET_SIZE(name) != 2) { + goto fail; + } + title = PyTuple_GET_ITEM(name, 0); + name = PyTuple_GET_ITEM(name, 1); + if (!PyUString_Check(name)) { + goto fail; + } + } + else { + goto fail; + } + + /* Insert name into nameslist */ + Py_INCREF(name); + + if (PyUString_GET_SIZE(name) == 0) { + Py_DECREF(name); + if (title == NULL) { + name = PyUString_FromFormat("f%d", i); + } +#if PY_VERSION_HEX >= 0x03000000 + /* On Py3, allow only non-empty Unicode strings as field names */ + else if (PyUString_Check(title) && PyUString_GET_SIZE(title) > 0) { + name = title; + Py_INCREF(name); + } + else { + goto fail; + } +#else + else { + name = title; + Py_INCREF(name); + } +#endif + } + PyTuple_SET_ITEM(nameslist, i, name); + + /* Process rest */ + + printf("Test2\n"); + if (PyTuple_GET_SIZE(item) == 2) { + if (align) { + printf("Test3\n"); + ret = PyArray_DescrAlignConverter(PyTuple_GET_ITEM(item, 1), + &conv); + } + else { + printf("Test4\n"); + ret = PyArray_DescrConverter(PyTuple_GET_ITEM(item, 1), &conv); + } + if (ret == NPY_FAIL) { + PyObject_Print(PyTuple_GET_ITEM(item, 1), stderr, 0); + } + } + else if (PyTuple_GET_SIZE(item) == 3) { + newobj = PyTuple_GetSlice(item, 1, 3); + if (align) { + printf("Test5\n"); + ret = PyArray_DescrAlignConverter(newobj, &conv); + } + else { + printf("Test6\n"); + ret = PyArray_DescrConverter(newobj, &conv); + } + Py_DECREF(newobj); + } + else { + goto fail; + } + if (ret == NPY_FAIL) { + goto fail; + } + if ((PyDict_GetItem(fields, name) != NULL) + || (title +#if PY_VERSION_HEX >= 0x03000000 + && PyUString_Check(title) +#else + && (PyUString_Check(title) || PyUnicode_Check(title)) +#endif + && (PyDict_GetItem(fields, title) != NULL))) { +#if PY_VERSION_HEX >= 0x03000000 + name = PyUnicode_AsUTF8String(name); +#endif + PyErr_Format(PyExc_ValueError, + "field '%s' occurs more than once", PyBytes_AsString(name)); +#if PY_VERSION_HEX >= 0x03000000 + Py_DECREF(name); +#endif + goto fail; + } + dtypeflags |= (conv->flags & NPY_FROM_FIELDS); + if (align) { + int _align; + + _align = conv->alignment; + if (_align > 1) { + totalsize = NPY_NEXT_ALIGNED_OFFSET(totalsize, _align); + } + maxalign = PyArray_MAX(maxalign, _align); + } + tup = PyTuple_New((title == NULL ? 2 : 3)); + PyTuple_SET_ITEM(tup, 0, (PyObject *)conv); + PyTuple_SET_ITEM(tup, 1, PyInt_FromLong((long) totalsize)); + + /* + * Title can be "meta-data". Only insert it + * into the fields dictionary if it is a string + * and if it is not the same as the name. + */ + if (title != NULL) { + Py_INCREF(title); + PyTuple_SET_ITEM(tup, 2, title); + PyDict_SetItem(fields, name, tup); +#if PY_VERSION_HEX >= 0x03000000 + if (PyUString_Check(title)) { +#else + if (PyUString_Check(title) || PyUnicode_Check(title)) { +#endif + if (PyDict_GetItem(fields, title) != NULL) { + PyErr_SetString(PyExc_ValueError, + "title already used as a name or title."); + Py_DECREF(tup); + goto fail; + } + PyDict_SetItem(fields, title, tup); + } + } + else { + PyDict_SetItem(fields, name, tup); + } + + totalsize += conv->elsize; + Py_DECREF(tup); + } + + if (maxalign > 1) { + totalsize = NPY_NEXT_ALIGNED_OFFSET(totalsize, maxalign); + } + + newea = PyArray_DescrNewFromType(NPY_VOID); + if (newea == NULL) { + Py_XDECREF(fields); + Py_XDECREF(nameslist); + return NULL; + } + newea->fields = fields; + newea->names = nameslist; + newea->elsize = totalsize; + newea->flags = dtypeflags; + + /* Structured arrays get a sticky aligned bit */ + if (align) { + newea->flags |= NPY_ALIGNED_STRUCT; + newea->alignment = maxalign; + } + return newea; + + fail: + Py_DECREF(fields); + Py_DECREF(nameslist); + return NULL; + +} + +static NPY_INLINE npy_bool +_is_basic_python_type(PyTypeObject *tp) +{ + return ( + /* Basic number types */ + tp == &PyBool_Type || +#if PY_VERSION_HEX >= 0x03000000 + tp == &PyInt_Type || +#endif + tp == &PyLong_Type || + tp == &PyFloat_Type || + tp == &PyComplex_Type || + + /* Basic sequence types */ + tp == &PyList_Type || + tp == &PyTuple_Type || + tp == &PyDict_Type || + tp == &PySet_Type || + tp == &PyFrozenSet_Type || + tp == &PyUnicode_Type || + tp == &PyBytes_Type || +#if PY_VERSION_HEX >= 0x03000000 + tp == &PyString_Type || +#endif + + /* other builtins */ + tp == &PySlice_Type || + tp == Py_TYPE(Py_None) || + tp == Py_TYPE(Py_Ellipsis) || + tp == Py_TYPE(Py_NotImplemented) || + + /* TODO: ndarray, but we can't see PyArray_Type here */ + + /* sentinel to swallow trailing || */ + NPY_FALSE + ); +} + +static NPY_INLINE PyObject * +maybe_get_attr(PyObject *obj, char *name) +{ + PyTypeObject *tp = Py_TYPE(obj); + PyObject *res = (PyObject *)NULL; + + /* Attribute referenced by (char *)name */ + if (tp->tp_getattr != NULL) { + res = (*tp->tp_getattr)(obj, name); + if (res == NULL) { + PyErr_Clear(); + } + } + /* Attribute referenced by (PyObject *)name */ + else if (tp->tp_getattro != NULL) { +#if PY_VERSION_HEX >= 0x03000000 + PyObject *w = PyUnicode_InternFromString(name); +#else + PyObject *w = PyString_InternFromString(name); +#endif + if (w == NULL) { + return (PyObject *)NULL; + } + res = (*tp->tp_getattro)(obj, w); + Py_DECREF(w); + if (res == NULL) { + PyErr_Clear(); + } + } + return res; +} + +static int +maybe_set_attr(PyObject *obj, char *name, PyObject *attr) +{ + PyTypeObject *tp = Py_TYPE(obj); + int status; + + /* Attribute referenced by (char *)name */ + if (tp->tp_setattr != NULL) { + status = (*tp->tp_setattr)(obj, name, attr); + if (status < 0) { + PyErr_Clear(); + return -1; + } + } + /* Attribute referenced by (PyObject *)name */ + else if (tp->tp_setattro != NULL) { +#if PY_VERSION_HEX >= 0x03000000 + PyObject *w = PyUnicode_InternFromString(name); +#else + PyObject *w = PyString_InternFromString(name); +#endif + if (w == NULL) { + return -1; + } + status = (*tp->tp_setattro)(obj, w, attr); + Py_DECREF(w); + if (status < 0) { + PyErr_Clear(); + return -1; + } + } + return 0; +} + +static int get_array_struct(PyObject* obj, int *maxndim, npy_intp *d_shape, PyArrayInterface* inter) +{ + PyTypeObject *tp = Py_TYPE(obj); + PyObject* ret; + char* str; + int i; + str = "__array_struct__"; + /* We do not need to check for special attributes on trivial types */ + if (_is_basic_python_type(tp)) { + ret = NULL; + } + /* obj has the __array_struct__ interface */ + ret = maybe_get_attr(obj, str); + if (ret != NULL) { + int nd = -1; + if (PyCapsule_CheckExact(ret)) { + PyArrayInterface *inter; + inter = (PyArrayInterface *)NpyCapsule_AsVoidPtr(ret); + if (inter->two == 2) { + nd = inter->nd; + if (nd >= 0) { + if (nd < *maxndim) { + *maxndim = nd; + } + for (i=0; i<*maxndim; i++) { + d_shape[i] = inter->shape[i]; + } + } + } + } + if(nd >= 0){ + return 0; + } else { + return -1; + } + } else { + return -1; + } +} + +static int my_get_array_attr_interface(PyObject* obj, PyObject* newi){ + newi = obj; +// Py_INCREF(obj); +// Py_DECREF(obj); + return 0; +} + +static int get_array_attr_interface(PyObject* obj, char* str, int *maxndim, npy_intp *d_shape, PyObject* newi){ + PyTypeObject *tp = Py_TYPE(obj); + char* dictstr; + int i; + dictstr = "__array_interface__"; + PyObject* ret; + PyObject* objj; + newi = obj; + return 0; + if (_is_basic_python_type(tp)) { + ret = NULL; + } + /* obj has the __array_interface__ interface */ + printf("T1\n"); + ret = maybe_get_attr(obj, dictstr); + printf("T2\n"); + if (ret != NULL) { + int nd = -1; + if (PyDict_Check(ret)) { + objj = PyDict_GetItemString(ret, "shape"); + //newi = PyDict_GetItemString(ret, str); + printf("T3\n"); + if (objj && PyTuple_Check(objj)) { + nd = PyTuple_GET_SIZE(objj); + printf("T4\n"); + if (nd >= 0) { + *maxndim = nd; + for (i=0; i<nd; i++) { + d_shape[i] = PyInt_AsSsize_t(PyTuple_GET_ITEM(objj, i)); + if (d_shape[i] < 0) { + PyErr_SetString(PyExc_RuntimeError, + "Invalid shape in __array_interface__"); + return -1; + } + } + } + } + } + if (nd >= 0) { + printf("T5\n"); + //newi = (PyArrayObject*) objj; + PyObject* tuple = PyTuple_New(1); + PyTuple_SET_ITEM(tuple, 0, objj); + newi = (PyObject*) tuple; + return 0; + } else { + return -1; + } + } else { + return -1; + } +} + +static int set_array_attr_interface(PyObject* obj, PyObject* attr, int *nd, npy_intp *d_shape, void* data) +{ + int i, status; +/* obj has the __array_interface__ interface */ + if (obj != NULL || attr !=NULL) { + if (PyDict_Check(attr)) { + PyObject *new_shape = PyTuple_New(*nd); + for (i=0; i<*nd; i++) { + PyTuple_SET_ITEM(new_shape, i, PyInt_FromLong((int)d_shape[i])); + } + status = PyDict_SetItemString(attr, "shape", new_shape); + if (status<0){ + Py_DECREF(new_shape); + PyErr_Clear(); + return -1; + } + PyObject *new_data = PyTuple_New(*nd); + PyTuple_SET_ITEM(new_data, 0, PyLong_FromVoidPtr(data)); + PyTuple_SET_ITEM(new_data, 1, PyInt_FromLong((long)1)); + status = PyDict_SetItemString(attr, "data", new_data); + if (status<0){ + Py_DECREF(new_data); + PyErr_Clear(); + return -1; + } + status = maybe_set_attr(obj, "__array_interface__", attr); + if (status<0){ + Py_DECREF(new_data); + Py_DECREF(new_shape); + PyErr_Clear(); + return -1; + } + return 0; + } else { + return -1; + } + } else { + return -1; + } +} + + + + +#if 0 +NPY_NO_EXPORT int +MyArray_DescrConverter(PyObject *obj, PyArray_Descr **at) +{ + int check_num = NPY_NOTYPE + 10; + PyObject *item; + int elsize = 0; + char endian = '='; + + *at = NULL; + + printf("Test0\n"); + /* default */ + if (obj == Py_None) { + *at = PyArray_DescrFromType(NPY_DEFAULT_TYPE); + return NPY_SUCCEED; + } + + printf("Test1\n"); + if (PyArray_DescrCheck(obj)) { + *at = (PyArray_Descr *)obj; + Py_INCREF(*at); + return NPY_SUCCEED; + } + + printf("Test2\n"); + if (PyType_Check(obj)) { + if (PyType_IsSubtype((PyTypeObject *)obj, &PyGenericArrType_Type)) { + *at = PyArray_DescrFromTypeObject(obj); + return (*at) ? NPY_SUCCEED : NPY_FAIL; + } + check_num = NPY_OBJECT; +#if !defined(NPY_PY3K) + if (obj == (PyObject *)(&PyInt_Type)) { + check_num = NPY_LONG; + } + else if (obj == (PyObject *)(&PyLong_Type)) { + check_num = NPY_LONGLONG; + } +#else + if (obj == (PyObject *)(&PyLong_Type)) { + check_num = NPY_LONG; + } +#endif + else if (obj == (PyObject *)(&PyFloat_Type)) { + check_num = NPY_DOUBLE; + } + else if (obj == (PyObject *)(&PyComplex_Type)) { + check_num = NPY_CDOUBLE; + } + else if (obj == (PyObject *)(&PyBool_Type)) { + check_num = NPY_BOOL; + } + else if (obj == (PyObject *)(&PyBytes_Type)) { + check_num = NPY_STRING; + } + else if (obj == (PyObject *)(&PyUnicode_Type)) { + check_num = NPY_UNICODE; + } +#if defined(NPY_PY3K) + else if (obj == (PyObject *)(&PyMemoryView_Type)) { +#else + else if (obj == (PyObject *)(&PyBuffer_Type)) { +#endif + check_num = NPY_VOID; + } + else { + *at = _arraydescr_fromobj(obj); + if (*at) { + return NPY_SUCCEED; + } + } + goto finish; + } + printf("Test3\n"); + + /* or a typecode string */ + + if (PyUnicode_Check(obj)) { + /* Allow unicode format strings: convert to bytes */ + int retval; + PyObject *obj2; + obj2 = PyUnicode_AsASCIIString(obj); + if (obj2 == NULL) { + return NPY_FAIL; + } + retval = PyArray_DescrConverter(obj2, at); + Py_DECREF(obj2); + return retval; + } + + printf("Test4\n"); + if (PyBytes_Check(obj)) { + char *type = NULL; + Py_ssize_t len = 0; + + /* Check for a string typecode. */ + if (PyBytes_AsStringAndSize(obj, &type, &len) < 0) { + goto error; + } + + /* Empty string is invalid */ + if (len == 0) { + goto fail; + } + + /* check for commas present or first (or second) element a digit */ + if (_check_for_commastring(type, len)) { + *at = _convert_from_commastring(obj, 0); + return (*at) ? NPY_SUCCEED : NPY_FAIL; + } + + /* Process the endian character. '|' is replaced by '='*/ + switch (type[0]) { + case '>': + case '<': + case '=': + endian = type[0]; + ++type; + --len; + break; + + case '|': + endian = '='; + ++type; + --len; + break; + } + + /* Just an endian character is invalid */ + if (len == 0) { + goto fail; + } + + /* Check for datetime format */ + if (is_datetime_typestr(type, len)) { + *at = parse_dtype_from_datetime_typestr(type, len); + if (*at == NULL) { + return NPY_FAIL; + } + /* *at has byte order '=' at this point */ + if (!PyArray_ISNBO(endian)) { + (*at)->byteorder = endian; + } + return NPY_SUCCEED; + } + + /* A typecode like 'd' */ + if (len == 1) { + check_num = type[0]; + } + /* A kind + size like 'f8' */ + else { + char *typeend = NULL; + int kind; + + /* Parse the integer, make sure it's the rest of the string */ + elsize = (int)strtol(type + 1, &typeend, 10); + if (typeend - type == len) { + + kind = type[0]; + switch (kind) { + case NPY_STRINGLTR: + case NPY_STRINGLTR2: + check_num = NPY_STRING; + break; + + /* + * When specifying length of UNICODE + * the number of characters is given to match + * the STRING interface. Each character can be + * more than one byte and itemsize must be + * the number of bytes. + */ + case NPY_UNICODELTR: + check_num = NPY_UNICODE; + elsize <<= 2; + break; + + case NPY_VOIDLTR: + check_num = NPY_VOID; + break; + + default: + if (elsize == 0) { + check_num = NPY_NOTYPE+10; + } + /* Support for generic processing c8, i4, f8, etc...*/ + else { + check_num = PyArray_TypestrConvert(elsize, kind); + if (check_num == NPY_NOTYPE) { + check_num += 10; + } + elsize = 0; + } + } + } + } + } + else if (PyTuple_Check(obj)) { + /* or a tuple */ + *at = _convert_from_tuple(obj); + if (*at == NULL){ + if (PyErr_Occurred()) { + return NPY_FAIL; + } + goto fail; + } + return NPY_SUCCEED; + } + else if (PyList_Check(obj)) { + /* or a list */ + *at = _convert_from_array_descr(obj,0); + if (*at == NULL) { + if (PyErr_Occurred()) { + return NPY_FAIL; + } + goto fail; + } + return NPY_SUCCEED; + } + else if (PyDict_Check(obj) || PyDictProxy_Check(obj)) { + /* or a dictionary */ + *at = _convert_from_dict(obj,0); + if (*at == NULL) { + if (PyErr_Occurred()) { + return NPY_FAIL; + } + goto fail; + } + return NPY_SUCCEED; + } + else if (PyArray_Check(obj)) { + goto fail; + } + else { + *at = _arraydescr_fromobj(obj); + if (*at) { + return NPY_SUCCEED; + } + if (PyErr_Occurred()) { + return NPY_FAIL; + } + goto fail; + } + if (PyErr_Occurred()) { + goto fail; + } + +finish: + printf("Test5\n"); + if ((check_num == NPY_NOTYPE + 10) || + (*at = PyArray_DescrFromType(check_num)) == NULL) { + PyErr_Clear(); + /* Now check to see if the object is registered in typeDict */ + if (typeDict != NULL) { + item = PyDict_GetItem(typeDict, obj); +#if defined(NPY_PY3K) + if (!item && PyBytes_Check(obj)) { + PyObject *tmp; + tmp = PyUnicode_FromEncodedObject(obj, "ascii", "strict"); + if (tmp != NULL) { + item = PyDict_GetItem(typeDict, tmp); + Py_DECREF(tmp); + } + } +#endif + if (item) { + /* Check for a deprecated Numeric-style typecode */ + if (PyBytes_Check(obj)) { + char *type = NULL; + Py_ssize_t len = 0; + char *dep_tps[] = {"Bool", "Complex", "Float", "Int", + "Object0", "String0", "Timedelta64", + "Unicode0", "UInt", "Void0"}; + int ndep_tps = sizeof(dep_tps) / sizeof(dep_tps[0]); + int i; + + if (PyBytes_AsStringAndSize(obj, &type, &len) < 0) { + goto error; + } + for (i = 0; i < ndep_tps; ++i) { + char *dep_tp = dep_tps[i]; + + if (strncmp(type, dep_tp, strlen(dep_tp)) == 0) { + if (DEPRECATE("Numeric-style type codes are " + "deprecated and will result in " + "an error in the future.") < 0) { + goto fail; + } + } + } + } + return PyArray_DescrConverter(item, at); + } + } + goto fail; + } + + if (((*at)->elsize == 0) && (elsize != 0)) { + PyArray_DESCR_REPLACE(*at); + (*at)->elsize = elsize; + } + if (endian != '=' && PyArray_ISNBO(endian)) { + endian = '='; + } + if (endian != '=' && (*at)->byteorder != '|' + && (*at)->byteorder != endian) { + PyArray_DESCR_REPLACE(*at); + (*at)->byteorder = endian; + } + return NPY_SUCCEED; + +fail: + if (PyBytes_Check(obj)) { + PyErr_Format(PyExc_TypeError, + "data type \"%s\" not understood", PyBytes_AS_STRING(obj)); + } + else { + PyErr_SetString(PyExc_TypeError, + "data type not understood"); + } + +error: + *at = NULL; + return NPY_FAIL; +} +#endif + + +NPY_NO_EXPORT int +MyPyArray_DescrConverter(PyObject *obj, PyArray_Descr **at) +{ + int check_num = NPY_NOTYPE + 10; + PyObject *item; + int elsize = 0; + char endian = '='; + + printf("Test -1\n"); + *at = NULL; + + check_num = NPY_VOID; + printf("Test0\n"); + if (check_num != NPY_VOID) { + PyErr_Clear(); + /* Now check to see if the object is registered in typeDict */ + printf("Test1\n"); + if (typeDict != NULL) { + item = PyDict_GetItem(typeDict, obj); +#if defined(NPY_PY3K) + if (!item && PyBytes_Check(obj)) { + PyObject *tmp; + tmp = PyUnicode_FromEncodedObject(obj, "ascii", "strict"); + if (tmp != NULL) { + item = PyDict_GetItem(typeDict, tmp); + Py_DECREF(tmp); + } + } +#endif + if (item) { + /* Check for a deprecated Numeric-style typecode */ + if (PyBytes_Check(obj)) { + char *type = NULL; + Py_ssize_t len = 0; + char *dep_tps[] = {"Bool", "Complex", "Float", "Int", + "Object0", "String0", "Timedelta64", + "Unicode0", "UInt", "Void0"}; + int ndep_tps = sizeof(dep_tps) / sizeof(dep_tps[0]); + int i; + + if (PyBytes_AsStringAndSize(obj, &type, &len) < 0) { + goto error; + } + for (i = 0; i < ndep_tps; ++i) { + char *dep_tp = dep_tps[i]; + + if (strncmp(type, dep_tp, strlen(dep_tp)) == 0) { + if (DEPRECATE("Numeric-style type codes are " + "deprecated and will result in " + "an error in the future.") < 0) { + goto fail; + } + } + } + } + return PyArray_DescrConverter(item, at); + } + } + printf("Test2\n"); + goto fail; + } + + printf("Test3\n"); + if (((*at)->elsize == 0) && (elsize != 0)) { + PyArray_DESCR_REPLACE(*at); + (*at)->elsize = elsize; + printf("Test4\n"); + } + if (endian != '=' && PyArray_ISNBO(endian)) { + endian = '='; + printf("Test5\n"); + } + if (endian != '=' && (*at)->byteorder != '|' + && (*at)->byteorder != endian) { + PyArray_DESCR_REPLACE(*at); + (*at)->byteorder = endian; + printf("Test6\n"); + } + return NPY_SUCCEED; + +fail: + if (PyBytes_Check(obj)) { + PyErr_Format(PyExc_TypeError, + "data type \"%s\" not understood", PyBytes_AS_STRING(obj)); + } + else { + PyErr_SetString(PyExc_TypeError, + "data type not understood"); + } + +error: + *at = NULL; + return NPY_FAIL; +} + + + +#if 0 +void init_readwriteaccess(struct DICTHOLDER *dict); + +struct DICTHOLDER * plugin_find(struct DICTHOLDER *dict, const char *pluginname){ + struct DICTHOLDER *dictitem; + dictitem = dict; + // search in dictionary linked list + while(dictitem != NULL){ + if(strcmp(dictitem->key, pluginname) == 0){ + return dictitem; + } + dictitem = dictitem->next; + } + return NULL; +} +#endif + +molfile_plugin_t* get_plugin(molfile_plugin_t** plug_list, int plug_no) +{ + molfile_plugin_t* plugin; + if(plug_no < 0){ + plugin = NULL; + } else { + plugin = plug_list[plug_no]; + } + return plugin; +} + +#if 0 +void init_readwriteaccess(struct DICTHOLDER *dict){ + struct DICTHOLDER *dictitem; + dictitem = dict; + // search in dictionary linked list + while(dictitem != NULL){ + if(!dictitem->id){ + if(plugin_list[dictitem->id]->read_next_timestep){ + dictitem->read = 1; + } + if(plugin_list[dictitem->id]->write_timestep){ + dictitem->write = 1; + } + } + dictitem = dictitem->next; + } +} + +static int has_readsupport(const char *pluginname){ + struct DICTHOLDER *item; + item = plugin_find(&plugindict, pluginname); + if (!item){ + return item->read; + } else { + return 0; + } +} + +static int has_writesupport(const char *pluginname){ + struct DICTHOLDER *item; + item = plugin_find(&plugindict, pluginname); + if (!item){ + return item->write; + } else { + return 0; + } +} + +static int plugin_add(struct DICTHOLDER *dict, const char *key, int id){ + struct DICTHOLDER *dictitem; + // Check list is empty or it already has the key + if (plugin_find(dict, key) == NULL){ + dictitem = dict; + while(1){ + // Find the empty next in the list and add item + if(dictitem == NULL){ + struct DICTHOLDER *item = (struct DICTHOLDER*) malloc(sizeof(struct DICTHOLDER)); + item->key = key; + item->id = id; + item->read = NULL; + item->write = NULL; + dictitem = &item; + return 0; + } else { + dictitem = dictitem->next; + } + } + } else { + return 1; + } +} + +static int plugin_remove(struct DICTHOLDER *dict, const char *key){ + struct DICTHOLDER *dictitem; + // Check list is empty or it already has the key + if (plugin_find(dict, key) == NULL){ + // No key in the list. Nothing to remove. + return 1; + } else { + // Remove key in the list + dictitem = dict; + while(dictitem != NULL){ + if(strcmp(dictitem->next->key, key) == 0){ + struct DICTHOLDER *item = dictitem->next->next; + dictitem->next = item; + return 0; + } + dictitem = dictitem->next; + } + return 1; + } +} +#endif +/* * * * * * * * * * * * * * * * * * * * * * * * * * * + * Interface functions to initialize molfile plugins * + * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* check validity of plugins and register them. */ +static int molfile_register(void*, vmdplugin_t *plugin) { + if (!plugin->type || !plugin->name || !plugin->author) { + // skipping plugin with incomplete header + return VMDPLUGIN_ERROR; + } + else if (plugin->abiversion != vmdplugin_ABIVERSION) { + // skipping plugin with incompatible ABI + return VMDPLUGIN_ERROR; + } + else if (0 != strncmp(plugin->type, "mol file", 8)) { + // skipping plugin of incompatible type + return VMDPLUGIN_ERROR; + } + else if (numplugins >= MAXPLUGINS) { + // too many plugins: increase MAXPLUGINS + return VMDPLUGIN_ERROR; + } + + //if (plugin_find(&plugindict, plugin->name) != NULL) { + // multiple plugins for file type + // return VMDPLUGIN_ERROR; + //} else { + plugin_list[numplugins] = (molfile_plugin_t *) plugin; + //plugin_add(&plugindict, plugin->name, numplugins); + ++numplugins; + return VMDPLUGIN_SUCCESS; + //} +} + +molfile_plugin_t** molfile_plugin_list(int maxsize) +{ + if(maxsize < MAXPLUGINS){ + maxsize = MAXPLUGINS; + } + plugin_list = (molfile_plugin_t**) malloc(sizeof(molfile_plugin_t*)*maxsize); + return plugin_list; +} + +/* register all available plugins and clear handles. */ +int molfile_init(void) +{ +#if 0 + int molfile_internal_register(void *ptr, vmdplugin_t *plugin) + { + if (!plugin->type || !plugin->name || !plugin->author) { + // skipping plugin with incomplete header + return VMDPLUGIN_ERROR; + } + else if (plugin->abiversion != vmdplugin_ABIVERSION) { + // skipping plugin with incompatible ABI + return VMDPLUGIN_ERROR; + } + else if (0 != strncmp(plugin->type, "mol file", 8)) { + // skipping plugin of incompatible type + return VMDPLUGIN_ERROR; + } + else if (num_plugins >= MAX_PLUGINS) { + // too many plugins: increase MAXPLUGINS + return VMDPLUGIN_ERROR; + } + + if (plugin_find(&plugindict, plugin->name) != NULL) { + // multiple plugins for file type + return VMDPLUGIN_ERROR; + } else { + plugin_list[numplugins] = (molfile_plugin_t *) plugin; + ++numplugins; + return VMDPLUGIN_SUCCESS; + } + } +#endif + MOLFILE_INIT_ALL; + MOLFILE_REGISTER_ALL(NULL,molfile_register); + return numplugins; +} + +/* unregister all available plugins */ +int molfile_finish(void) +{ + MOLFILE_FINI_ALL; + return 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * + * Wrappers to directly access molfile plugin* + * functions and settings * + * * * * * * * * * * * * * * * * * * * * * * */ + +/* molfile_plugin_t access */ + +/* Functions in molfile_plugin_t */ + +PyObject * my_read_structure(PyObject* molpack) { + Py_Initialize(); + import_array(); + + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* atoms; + int numatoms, status; + PyArray_Descr *descr; + PyObject *p = NULL; + //if (PyType_Ready(&MolAtomType) < 0) + // return NULL; + //PyTypeObject *atype = &MolAtomType; + //MolAtom *atom_t; + //atom_t = (MolAtom *)atype->tp_alloc(atype, 0); + //p = (PyObject*) atom_t; + descr = PyArray_DescrFromObject(p, NULL); + MolObject* plugin_handle = (MolObject*) molpack; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + atoms = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + status = plugin->read_structure(file_handle, &options, atoms); + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error accessing molfile_atom_t in read_structure function of plugin."); + return NULL; + } + PyArrayObject* oresid; + PyObject* array; + int64_t* cresid; + int nd = 1; + npy_intp dims[1] = { numatoms }; + oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT64); + Py_DECREF(p); + //array = (PyArrayObject*) PyArray_SimpleNewFromDescr(1, dims, descr); + //PyObject_Print(array, stdout, 0); + if (!oresid){ + PyErr_Format(PyExc_IOError, "Error copying molfile_atom_t into numpy array."); + return NULL; + } + npy_intp* n = PyArray_DIMS(oresid); + cresid = (int64_t*) PyArray_DATA(oresid); + +// for (i=0;i<numatoms;i++){ +// cresid[i] = (int64_t) atoms[i].resid; +// } + return (PyObject*) PyArray_FromArray(oresid, PyArray_DESCR(oresid), 0); +} + +PyObject* read_fill_structure(PyObject* molpack, PyObject* prototype) +{ + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* data; + int numatoms, status; + int nd; + PyArrayInterface *inter; + //PyArrayObject *ret; + PyObject *ret; + char endian = NPY_NATBYTE; + nd = 1; + npy_intp dims[1] = { 1 }; + PyArrayObject *obj; + printf("Test1\n"); + obj = (PyArrayObject *)prototype; + if(obj == NULL){ + PyErr_Format(PyExc_IOError, "Error: Given PyObject does not include numpy array."); + return NULL; + } + // Access plugin_handle values + MolObject* plugin_handle = (MolObject*) molpack; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + printf("Test2-1\n"); + // Allocate memory for array of molfile_atom_t struct + data = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + // Get array values in molfile_atom_t + printf("Test2-2\n"); + status = plugin->read_structure(file_handle, &options, data); + printf("Test2-3\n"); + // Check if the plugin returns the results + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error accessing molfile_atom_t in read_structure function of plugin."); + return NULL; + } + printf("Test3\n"); + int *maxndim; + npy_intp *d_shape; + //status = my_get_array_attr_interface((PyObject*)obj, "descr", maxndim, d_shape, ret); + status = my_get_array_attr_interface(prototype, ret); + printf("Test4 Status:%d nd:%d\n",status,*maxndim); + if (status<0){ + Py_DECREF(obj); + PyErr_Clear(); + PyErr_Format(PyExc_IOError, "Error: can not get attribute of given numpy array."); + return NULL; + } + printf("Test5\n"); + //return (PyObject*) PyArray_FromArray((PyArrayObject*)ret, PyArray_DESCR((PyArrayObject*)ret), 0); + return (PyObject*) ret; +} + +PyObject* get_structure(PyObject* self) +{ + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* data; + int numatoms, status; + int nd; + PyArrayInterface *inter; + PyArrayObject *ret; + char endian = NPY_NATBYTE; + // Access plugin_handle values + MolObject* plugin_handle = (MolObject*) self; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + // Allocate memory for array of molfile_atom_t struct + data = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + // Get array values in molfile_atom_t + status = plugin->read_structure(file_handle, &options, data); + // Check if the plugin returns the results + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error accessing molfile_atom_t in read_structure function of plugin."); + return NULL; + } + // Now, we need to allocate a PyArray with PyArrayInterface + // and assign the allocated memory block to the data. + // To do this, we will build a numpy array from scratch. + // First, allocate a PyObject of PyArrayInterface and + // assign relevant information such as typestr, descr for C-side + // struct and second we will assign molfile_atom_t array as a block + // of data. Last, hope this works. + nd = 1; + npy_intp dims[1] = { 1 }; + // We would allocate a numpy array with + // but will not look clever to copy all the data into the new array. + // Instead, we allocate a numpy array with one element and change + // the definition of array. I know I said that it will be from scratch + // but let's accept nobody wants to define everything in numpy again. + //oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT); + // NPY_INT? Don't worry, we will change it. + //Py_intptr_t *shape, *strides; + //void *data = NULL; + + inter = (PyArrayInterface*)malloc(sizeof(PyArrayInterface)); + if (inter==NULL) + return PyErr_NoMemory(); + + // __array_interface__ descr for C side of __array_struct__ + // Could not find a better way to generate the list of tuples for + // Python side. May need to change this later. + PyObject *descrlist = PyList_New(13); + // One tuple to bind them + PyObject *py_tuple_name = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_name, 0, PyUnicode_FromString("name")); + PyTuple_SET_ITEM(py_tuple_name, 1, PyUnicode_FromString("|S16")); + PyList_SET_ITEM(descrlist, 0, py_tuple_name); + PyObject *py_tuple_type = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_type, 0, PyUnicode_FromString("type")); + PyTuple_SET_ITEM(py_tuple_type, 1, PyUnicode_FromString("|S16")); + PyList_SET_ITEM(descrlist, 1, py_tuple_type); + PyObject *py_tuple_resname = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_resname, 0, PyUnicode_FromString("resname")); + PyTuple_SET_ITEM(py_tuple_resname, 1, PyUnicode_FromString("|S8")); + PyList_SET_ITEM(descrlist, 2, py_tuple_resname); + PyObject *py_tuple_resid = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_resid, 0, PyUnicode_FromString("resid")); + PyTuple_SET_ITEM(py_tuple_resid, 1, PyUnicode_FromString("<i4")); + PyList_SET_ITEM(descrlist, 3, py_tuple_resid); + PyObject *py_tuple_segid = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_segid, 0, PyUnicode_FromString("segid")); + PyTuple_SET_ITEM(py_tuple_segid, 1, PyUnicode_FromString("|S8")); + PyList_SET_ITEM(descrlist, 4, py_tuple_segid); + PyObject *py_tuple_chain = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_chain, 0, PyUnicode_FromString("chain")); + PyTuple_SET_ITEM(py_tuple_chain, 1, PyUnicode_FromString("|S2")); + PyList_SET_ITEM(descrlist, 5, py_tuple_chain); + PyObject *py_tuple_altloc = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_altloc, 0, PyUnicode_FromString("altloc")); + PyTuple_SET_ITEM(py_tuple_altloc, 1, PyUnicode_FromString("|S2")); + PyList_SET_ITEM(descrlist, 6, py_tuple_altloc); + PyObject *py_tuple_insertion = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_insertion, 0, PyUnicode_FromString("insertion")); + PyTuple_SET_ITEM(py_tuple_insertion, 1, PyUnicode_FromString("|S2")); + PyList_SET_ITEM(descrlist, 7, py_tuple_insertion); + PyObject *py_tuple_occupancy = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_occupancy, 0, PyUnicode_FromString("occupancy")); + PyTuple_SET_ITEM(py_tuple_occupancy, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 8, py_tuple_occupancy); + PyObject *py_tuple_bfactor = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_bfactor, 0, PyUnicode_FromString("bfactor")); + PyTuple_SET_ITEM(py_tuple_bfactor, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 9, py_tuple_bfactor); + PyObject *py_tuple_mass = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_mass, 0, PyUnicode_FromString("mass")); + PyTuple_SET_ITEM(py_tuple_mass, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 10, py_tuple_mass); + PyObject *py_tuple_charge = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_charge, 0, PyUnicode_FromString("charge")); + PyTuple_SET_ITEM(py_tuple_charge, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 11, py_tuple_charge); + PyObject *py_tuple_radius = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_radius, 0, PyUnicode_FromString("radius")); + PyTuple_SET_ITEM(py_tuple_radius, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 12, py_tuple_radius); + PyObject *py_tuple_atomicnumber = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_atomicnumber, 0, PyUnicode_FromString("atomicnumber")); + PyTuple_SET_ITEM(py_tuple_atomicnumber, 1, PyUnicode_FromString("<i4")); + PyList_SET_ITEM(descrlist, 13, py_tuple_atomicnumber); + //PyArray_Descr *descr = (PyObject*) tuple; + PyArray_Descr *thetype = NULL; + // Here we define the size and stride parameters + npy_intp shape[1] = { numatoms }; + npy_intp strides[1] = { 54*sizeof(char) + 8*sizeof(int) + 20*sizeof(float) }; + + inter->two = 2; + inter->nd = nd; + inter->typekind = 'V'; + inter->itemsize = 82*sizeof(char); + //inter->flags = NPY_ARRAY_NOTSWAPPED | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE; + inter->flags = NPY_ARRAY_NOTSWAPPED | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE | NPY_ARR_HAS_DESCR; + inter->strides = (Py_intptr_t *)strides; + inter->shape = (Py_intptr_t *)shape; + inter->data = (void*) data; + // inter->descr = (PyObject*) tuple; + if ((inter->flags & NPY_ARRAY_NOTSWAPPED) != NPY_ARRAY_NOTSWAPPED) { + endian = NPY_OPPBYTE; + inter->flags &= ~NPY_ARRAY_NOTSWAPPED; + } + // typestr is relatively easy to assign to __array_interface__ + printf("TEST1\n"); + //thetype = (PyArray_Descr*) tuple; + if (inter->flags & NPY_ARR_HAS_DESCR) { + printf("TEST1-1\n"); + thetype = _convert_from_array_descr(descrlist,0); + //thetype = PyArray_DescrFromTypeObject(descrlist); + printf("TEST1-2\n"); + //if (PyArray_DescrConverter(inter->descr, &thetype) == NPY_FAIL) { + // thetype = NULL; + // PyErr_Clear(); + // } + } + printf("TEST1-3\n"); +#if 0 + char buf[40]; + PyOS_snprintf(buf, sizeof(buf), + "%c%c%d", endian, + inter->typekind, + inter->itemsize); + printf("TEST2 String:%s\n",buf); + PyObject *stringobj = PyUnicode_FromString(buf); + if (stringobj == NULL) { + return NULL; + } + printf("TEST2-2\n"); + if (MyPyArray_DescrConverter(stringobj, &thetype) != NPY_SUCCEED) { + Py_DECREF(stringobj); + return NULL; + } + printf("TEST2-3\n"); + Py_DECREF(stringobj); +#endif + printf("TEST3\n"); + ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, thetype, + inter->nd, inter->shape, + inter->strides, inter->data, + inter->flags, NULL); + printf("TEST4\n"); + Py_INCREF(inter); + if (PyArray_SetBaseObject(ret, (PyObject *)inter) < 0) { + Py_DECREF(ret); + return NULL; + } + printf("TEST5\n"); +// Py_DECREF(attr); + PyArray_UpdateFlags(ret, NPY_ARRAY_UPDATE_ALL); + printf("TEST6\n"); + return (PyObject *)ret; +} +// obj = NpyCapsule_FromVoidPtrAndDesc(inter, self, gentype_struct_free); +/* +#ifdef Py_CAPSULE_H + obj = PyCapsule_New((void*)inter, "struct SignedIntBuf", free_capsule); +#else + obj = PyCObject_FromVoidPtrAndDesc((void*)inter, (void*)self, free_array_interface); +#endif +*/ + // Cross fingers here. +// return obj; + diff --git a/pymolfile/molfile/pymolfile-new.h b/pymolfile/molfile/pymolfile-new.h new file mode 100644 index 0000000..5bf304e --- /dev/null +++ b/pymolfile/molfile/pymolfile-new.h @@ -0,0 +1,356 @@ +/* Hey emacs this is -*- C -*- and this is my editor vim. + * + * molfile.c : C and Fortran interfaces for molfile_plugins + * Copyright (c) Berk Onat <b.onat@warwick.ac.uk> 2017 + * + * This program is under BSD LICENSE + */ + +/* + * The code is written following the plugin test + * context of f77_molfile.c by Axel Kohlmeyer and + * in molfile_plugin/src/f77 and catdcd.c by + * Justin Gullingsrud of VMD plugins. + */ + +#ifndef _MOLFILE_H_ +#define _MOLFILE_H_ + +#ifdef __cplusplus +extern "C" +{ + +#endif + +#include "molfile_plugin.h" +#include "libmolfile_plugin.h" +#include "vmdplugin.h" +#include "Python.h" +#include "structmember.h" +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include <numpy/arrayobject.h> + + +enum { pluginOK, pluginNOINIT, pluginCLOSE, pluginNOMEM, + pluginENDOFFILE, pluginFILENOTFOUND, pluginFORMATERROR }; + +#ifndef MAXPLUGINS +#define MAXPLUGINS 200 +#endif + +struct MolObject { + PyObject_HEAD + molfile_plugin_t* plugin; + void* file_handle; + int natoms; + MolObject(void) {} +}; + +static void MolObject_dealloc(MolObject* self) +{ + Py_XDECREF(self->plugin); + Py_XDECREF(self->file_handle); + Py_TYPE(self)->tp_free((PyObject*)self); +} + +static PyObject * MolObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + MolObject *self; + + self = (MolObject *)type->tp_alloc(type, 0); + if (self != NULL) { + self->plugin = NULL; + self->file_handle = NULL; + self->natoms = 0; + } + + return (PyObject *)self; +} + +static int MolObject_init(MolObject *self, PyObject *args, PyObject *kwds) +{ + molfile_plugin_t *plugin = NULL; + void *file_handle = NULL; + molfile_plugin_t *tmp1 = NULL; + void *tmp2 = NULL; + + static char *kwlist[] = {"plugin", "file_handle", "natoms", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, + &plugin, &file_handle, + &self->natoms)) + return -1; + + if (plugin) { + tmp1 = self->plugin; + Py_INCREF(plugin); + self->plugin = plugin; + Py_XDECREF(tmp1); + } + + if (file_handle) { + tmp2 = self->file_handle; + Py_INCREF(file_handle); + self->file_handle = file_handle; + Py_XDECREF(tmp2); + } + + return 0; +} + +static molfile_plugin_t* MolObject_plugin(MolObject* self) +{ + return self->plugin; +} + +static void* MolObject_file_handle(MolObject* self) +{ + return self->file_handle; +} + +static PyObject* MolObject_natoms(MolObject* self) +{ + return PyLong_FromLong((long)self->natoms); +} + +static PyMemberDef MolObject_members[] = { + {"plugin", T_OBJECT_EX, offsetof(MolObject, plugin), 0, + "molfile_plugin_t type plugin"}, + {"file_handle", T_OBJECT_EX, offsetof(MolObject, file_handle), 0, + "file handle for plugin"}, + {"natoms", T_INT, offsetof(MolObject, natoms), 0, + "number of atoms"}, + {NULL} /* Sentinel */ +}; + +static PyMethodDef MolObject_methods[] = { + {"get_plugin", (PyCFunction)MolObject_plugin, METH_NOARGS, + "Return the plugin" + }, + {"get_file_handle", (PyCFunction)MolObject_file_handle, METH_NOARGS, + "Return the plugin" + }, + {"get_natoms", (PyCFunction)MolObject_natoms, METH_NOARGS, + "Return the number of atoms" + }, + {NULL} /* Sentinel */ +}; + + +#ifndef PyVarObject_HEAD_INIT + #define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, +#endif + +static PyTypeObject MolObjectType = { + PyVarObject_HEAD_INIT(NULL, 0) + "molobject", /*tp_name*/ + sizeof(MolObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)MolObject_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_reserved*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + "molobject objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + MolObject_methods, /* tp_methods */ + MolObject_members, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)MolObject_init, /* tp_init */ + 0, /* tp_alloc */ + MolObject_new, /* tp_new */ +}; + +#if 0 +struct MolAtom { + PyObject_HEAD + char* name; + char* type; + char* resname; + int* resid; + char* segid; + char* chain; + char* altloc; + char* insertion; + float* occupancy; + float* bfactor; + float* mass; + float* charge; + float* radius; + float* atomicnumber; + float* ctnumber; + MolAtom(void) {} +}; + +static void MolAtom_dealloc(MolAtom* self) +{ + Py_XDECREF(self->name); + Py_XDECREF(self->type); + Py_XDECREF(self->resname); + Py_XDECREF(self->resid); + Py_XDECREF(self->segid); + Py_XDECREF(self->chain); + Py_XDECREF(self->altloc); + Py_XDECREF(self->insertion); + Py_XDECREF(self->occupancy); + Py_XDECREF(self->bfactor); + Py_XDECREF(self->mass); + Py_XDECREF(self->charge); + Py_XDECREF(self->radius); + Py_XDECREF(self->atomicnumber); + Py_XDECREF(self->ctnumber); + Py_TYPE(self)->tp_free((PyObject*)self); +} + +static PyObject * MolAtom_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + MolAtom *self; + + self = (MolAtom *)type->tp_alloc(type, 0); + if (self != NULL) { + self->name = NULL; + self->type = NULL; + self->resname = NULL; + self->resid = NULL; + self->segid = NULL; + self->chain = NULL; + self->altloc = NULL; + self->insertion = NULL; + self->occupancy = NULL; + self->bfactor = NULL; + self->mass = NULL; + self->charge = NULL; + self->radius = NULL; + self->atomicnumber = NULL; + self->ctnumber = NULL; + } + + return (PyObject *)self; +} + +static PyMemberDef MolAtom_members[] = { + {"name", T_STRING, offsetof(MolAtom, name), 0,""}, + {"type", T_STRING, offsetof(MolAtom, type), 0,""}, + {"resname", T_STRING, offsetof(MolAtom, resname), 0,""}, + {"resid", T_INT, offsetof(MolAtom, resid), 0,""}, + {"segid", T_STRING, offsetof(MolAtom, segid), 0,""}, + {"chain", T_STRING, offsetof(MolAtom, chain), 0,""}, + {"altloc", T_STRING, offsetof(MolAtom, altloc), 0,""}, + {"insertion", T_STRING, offsetof(MolAtom, insertion), 0,""}, + {"occupancy", T_FLOAT, offsetof(MolAtom, occupancy), 0,""}, + {"bfactor", T_FLOAT, offsetof(MolAtom, bfactor), 0,""}, + {"mass", T_FLOAT, offsetof(MolAtom, mass), 0,""}, + {"charge", T_FLOAT, offsetof(MolAtom, charge), 0,""}, + {"radius", T_FLOAT, offsetof(MolAtom, radius), 0,""}, + {"atomicnumber", T_INT, offsetof(MolAtom, atomicnumber), 0,""}, + {"ctnumber", T_INT, offsetof(MolAtom, ctnumber), 0,""}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static PyTypeObject MolAtomType = { + PyVarObject_HEAD_INIT(NULL, 0) + "molobject", /*tp_name*/ + sizeof(MolAtom), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)MolAtom_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_reserved*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + "molatom objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + MolAtom_members, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + MolAtom_new, /* tp_new */ +}; +#endif +PyObject * my_read_structure(PyObject* molpack); +PyObject * read_fill_structure(PyObject* molpack, PyObject* prototype); +PyObject * get_structure(PyObject* molpack); + +#if 0 +typedef struct DICTHOLDER { + const char *key; // Dictionary key + int id; // Id of the item + int read; // 1 if molfile plugin read the format + int write; // 1 if molfile plugin write in this format + struct DICTHOLDER *next; // Next item in the dictionary +} DICTHOLDER; + +struct DICTHOLDER * plugin_find(struct DICTHOLDER *dict, const char *pluginname); + +static int plugin_add(struct DICTHOLDER *dict, const char *key, int id); + +static int plugin_remove(struct DICTHOLDER *dict, const char *key); + +static int has_readsupport(const char *pluginname); + +static int has_writesupport(const char *pluginname); + +static molfile_plugin_t *get_plugin(const char *pluginname); + +static int molfile_register(void *ptr, vmdplugin_t *plugin); + +#endif +molfile_plugin_t* get_plugin(molfile_plugin_t** plug_list, int plug_no); + +molfile_plugin_t** molfile_plugin_list(int maxsize); + +int molfile_init(void); + +int molfile_finish(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _MOLFILE_H_ */ + diff --git a/pymolfile/molfile/pymolfile.c b/pymolfile/molfile/pymolfile.c index b3033e9..1b81304 100644 --- a/pymolfile/molfile/pymolfile.c +++ b/pymolfile/molfile/pymolfile.c @@ -33,15 +33,1099 @@ #include "pymolfile.h" -int numplugins=0; -molfile_plugin_t** plugin_list; - +//for PyArrayInterface: +/* +#define CONTIGUOUS 0x01 +#define FORTRAN 0x02 +#define ALIGNED 0x100 +#define NOTSWAPPED 0x200 +#define WRITEABLE 0x400 +#define ARR_HAS_DESCR 0x800 +*/ +//byteorder dictionary +//char** byteorder = {"<", "little", ">", "big"}; +int numplugins=0; +molfile_plugin_t** plugin_list; +/* +typedef struct PyArrayInterface{ + int version; //contains the integer 2 as a sanity check + int nd; //number of dimensions + char typekind; //kind in array --- character code of typestr + int itemsize; //size of each element + int flags; //flags indicating how the data should be interpreted + Py_intptr_t *shape; //A length-nd array of shape information + Py_intptr_t *strides; //A length-nd array of stride information + void *data; //A pointer to the first element of the array +}; +*/ /* * * * * * * * * * * * * * * * * * * * * * * * Helper functions to set and store plugins * * * * * * * * * * * * * * * * * * * * * * * */ + + +#if PY_VERSION_HEX >= 0x03000000 +#define PyInt_AsSsize_t PyLong_AsSsize_t +#define PyInt_AsLong PyLong_AsLong +#define PyArray_Check(op) PyObject_TypeCheck(op, &PyArray_Type) +#define PyString_FromString PyBytes_FromString +#define PyUString_Check PyUnicode_Check +#define PyUString_GET_SIZE PyUnicode_GET_SIZE +#define PyUString_FromFormat PyUnicode_FromFormat +#define PyInt_FromLong PyLong_FromLong +#define PyString_Type PyBytes_Type +#define PyInt_Type PyLong_Type + +NPY_NO_EXPORT void +gentype_struct_free(PyObject *ptr) +{ + PyArrayInterface *arrif; + PyObject *context; + + arrif = (PyArrayInterface*)PyCapsule_GetPointer(ptr, NULL); + context = (PyObject *)PyCapsule_GetContext(ptr); + Py_DECREF(context); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +static NPY_INLINE void * +NpyCapsule_AsVoidPtr(PyObject *obj) +{ + void *ret = PyCapsule_GetPointer(obj, NULL); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)) +{ + PyObject *ret = PyCapsule_New(ptr, NULL, dtor); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} +static NPY_INLINE PyObject * +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, void (*dtor)(PyObject *)) +{ + PyObject *ret = NpyCapsule_FromVoidPtr(ptr, dtor); + if (ret != NULL && PyCapsule_SetContext(ret, context) != 0) { + PyErr_Clear(); + Py_DECREF(ret); + ret = NULL; + } + return ret; +} +#else +#define PyBytes_FromString PyString_FromString +NPY_NO_EXPORT void +gentype_struct_free(void *ptr, void *arg) +{ + PyArrayInterface *arrif = (PyArrayInterface *)ptr; + Py_DECREF((PyObject *)arg); + Py_XDECREF(arrif->descr); + PyArray_free(arrif->shape); + PyArray_free(arrif); +} +NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, + void (*dtor)(void *, void *)) +{ + return PyCObject_FromVoidPtrAndDesc(ptr, context, dtor); +} +#endif +static PyObject *typeDict = NULL; /* Must be explicitly loaded */ + + +#define NPY_NEXT_ALIGNED_OFFSET(offset, alignment) \ + (((offset) + (alignment) - 1) & (-(alignment))) + +static PyArray_Descr * +_convert_from_array_descr(PyObject *obj, int align) +{ + int n, i, totalsize; + int ret; + PyObject *fields, *item, *newobj; + PyObject *name, *tup, *title; + PyObject *nameslist; + PyArray_Descr *newea; + PyArray_Descr *conv; + /* Types with fields need the Python C API for field access */ + char dtypeflags = NPY_NEEDS_PYAPI; + int maxalign = 0; + + printf("Test1\n"); + n = PyList_GET_SIZE(obj); + nameslist = PyTuple_New(n); + if (!nameslist) { + return NULL; + } + totalsize = 0; + fields = PyDict_New(); + for (i = 0; i < n; i++) { + item = PyList_GET_ITEM(obj, i); + if (!PyTuple_Check(item) || (PyTuple_GET_SIZE(item) < 2)) { + goto fail; + } + name = PyTuple_GET_ITEM(item, 0); + if (PyUString_Check(name)) { + title = NULL; + } + else if (PyTuple_Check(name)) { + if (PyTuple_GET_SIZE(name) != 2) { + goto fail; + } + title = PyTuple_GET_ITEM(name, 0); + name = PyTuple_GET_ITEM(name, 1); + if (!PyUString_Check(name)) { + goto fail; + } + } + else { + goto fail; + } + + /* Insert name into nameslist */ + Py_INCREF(name); + + if (PyUString_GET_SIZE(name) == 0) { + Py_DECREF(name); + if (title == NULL) { + name = PyUString_FromFormat("f%d", i); + } +#if PY_VERSION_HEX >= 0x03000000 + /* On Py3, allow only non-empty Unicode strings as field names */ + else if (PyUString_Check(title) && PyUString_GET_SIZE(title) > 0) { + name = title; + Py_INCREF(name); + } + else { + goto fail; + } +#else + else { + name = title; + Py_INCREF(name); + } +#endif + } + PyTuple_SET_ITEM(nameslist, i, name); + + /* Process rest */ + + printf("Test2\n"); + if (PyTuple_GET_SIZE(item) == 2) { + if (align) { + printf("Test3\n"); + ret = PyArray_DescrAlignConverter(PyTuple_GET_ITEM(item, 1), + &conv); + } + else { + printf("Test4\n"); + ret = PyArray_DescrConverter(PyTuple_GET_ITEM(item, 1), &conv); + } + if (ret == NPY_FAIL) { + PyObject_Print(PyTuple_GET_ITEM(item, 1), stderr, 0); + } + } + else if (PyTuple_GET_SIZE(item) == 3) { + newobj = PyTuple_GetSlice(item, 1, 3); + if (align) { + printf("Test5\n"); + ret = PyArray_DescrAlignConverter(newobj, &conv); + } + else { + printf("Test6\n"); + ret = PyArray_DescrConverter(newobj, &conv); + } + Py_DECREF(newobj); + } + else { + goto fail; + } + if (ret == NPY_FAIL) { + goto fail; + } + if ((PyDict_GetItem(fields, name) != NULL) + || (title +#if PY_VERSION_HEX >= 0x03000000 + && PyUString_Check(title) +#else + && (PyUString_Check(title) || PyUnicode_Check(title)) +#endif + && (PyDict_GetItem(fields, title) != NULL))) { +#if PY_VERSION_HEX >= 0x03000000 + name = PyUnicode_AsUTF8String(name); +#endif + PyErr_Format(PyExc_ValueError, + "field '%s' occurs more than once", PyBytes_AsString(name)); +#if PY_VERSION_HEX >= 0x03000000 + Py_DECREF(name); +#endif + goto fail; + } + dtypeflags |= (conv->flags & NPY_FROM_FIELDS); + if (align) { + int _align; + + _align = conv->alignment; + if (_align > 1) { + totalsize = NPY_NEXT_ALIGNED_OFFSET(totalsize, _align); + } + maxalign = PyArray_MAX(maxalign, _align); + } + tup = PyTuple_New((title == NULL ? 2 : 3)); + PyTuple_SET_ITEM(tup, 0, (PyObject *)conv); + PyTuple_SET_ITEM(tup, 1, PyInt_FromLong((long) totalsize)); + + /* + * Title can be "meta-data". Only insert it + * into the fields dictionary if it is a string + * and if it is not the same as the name. + */ + if (title != NULL) { + Py_INCREF(title); + PyTuple_SET_ITEM(tup, 2, title); + PyDict_SetItem(fields, name, tup); +#if PY_VERSION_HEX >= 0x03000000 + if (PyUString_Check(title)) { +#else + if (PyUString_Check(title) || PyUnicode_Check(title)) { +#endif + if (PyDict_GetItem(fields, title) != NULL) { + PyErr_SetString(PyExc_ValueError, + "title already used as a name or title."); + Py_DECREF(tup); + goto fail; + } + PyDict_SetItem(fields, title, tup); + } + } + else { + PyDict_SetItem(fields, name, tup); + } + + totalsize += conv->elsize; + Py_DECREF(tup); + } + + if (maxalign > 1) { + totalsize = NPY_NEXT_ALIGNED_OFFSET(totalsize, maxalign); + } + + newea = PyArray_DescrNewFromType(NPY_VOID); + if (newea == NULL) { + Py_XDECREF(fields); + Py_XDECREF(nameslist); + return NULL; + } + newea->fields = fields; + newea->names = nameslist; + newea->elsize = totalsize; + newea->flags = dtypeflags; + + /* Structured arrays get a sticky aligned bit */ + if (align) { + newea->flags |= NPY_ALIGNED_STRUCT; + newea->alignment = maxalign; + } + return newea; + + fail: + Py_DECREF(fields); + Py_DECREF(nameslist); + return NULL; + +} + +static NPY_INLINE npy_bool +_is_basic_python_type(PyTypeObject *tp) +{ + return ( + /* Basic number types */ + tp == &PyBool_Type || +#if PY_VERSION_HEX >= 0x03000000 + tp == &PyInt_Type || +#endif + tp == &PyLong_Type || + tp == &PyFloat_Type || + tp == &PyComplex_Type || + + /* Basic sequence types */ + tp == &PyList_Type || + tp == &PyTuple_Type || + tp == &PyDict_Type || + tp == &PySet_Type || + tp == &PyFrozenSet_Type || + tp == &PyUnicode_Type || + tp == &PyBytes_Type || +#if PY_VERSION_HEX >= 0x03000000 + tp == &PyString_Type || +#endif + + /* other builtins */ + tp == &PySlice_Type || + tp == Py_TYPE(Py_None) || + tp == Py_TYPE(Py_Ellipsis) || + tp == Py_TYPE(Py_NotImplemented) || + + /* TODO: ndarray, but we can't see PyArray_Type here */ + + /* sentinel to swallow trailing || */ + NPY_FALSE + ); +} + +static NPY_INLINE PyObject * +maybe_get_attr(PyObject *obj, char *name) +{ + PyTypeObject *tp = Py_TYPE(obj); + PyObject *res = (PyObject *)NULL; + + /* Attribute referenced by (char *)name */ + if (tp->tp_getattr != NULL) { + res = (*tp->tp_getattr)(obj, name); + if (res == NULL) { + PyErr_Clear(); + } + } + /* Attribute referenced by (PyObject *)name */ + else if (tp->tp_getattro != NULL) { +#if PY_VERSION_HEX >= 0x03000000 + PyObject *w = PyUnicode_InternFromString(name); +#else + PyObject *w = PyString_InternFromString(name); +#endif + if (w == NULL) { + return (PyObject *)NULL; + } + res = (*tp->tp_getattro)(obj, w); + Py_DECREF(w); + if (res == NULL) { + PyErr_Clear(); + } + } + return res; +} + +static NPY_INLINE PyObject * +maybe_set_attr(PyObject *obj, char *name, PyObject *attr) +{ + PyTypeObject *tp = Py_TYPE(obj); + int status; + + /* Attribute referenced by (char *)name */ + if (tp->tp_setattr != NULL) { + printf("tp_setattr not null\n"); + status = (*tp->tp_setattr)(obj, name, attr); + if (status < 0) { + printf("No tp_setattr\n"); + PyErr_Clear(); + PyErr_Format(PyExc_IOError, "Error: no __array_interface__ attribute in object."); + return NULL; + } + } + /* Attribute referenced by (PyObject *)name */ + else if (tp->tp_setattro != NULL) { + printf("tp_setattr null but tp_setattro is not null\n"); +#if PY_VERSION_HEX >= 0x03000000 + PyObject *w = PyUnicode_InternFromString(name); + printf("PyUnicode_InternFromString name\n"); +#else + PyObject *w = PyString_InternFromString(name); + printf("PyString_InternFromString name\n"); +#endif + if (w == NULL) { + printf("Name is NULL\n"); + PyErr_Clear(); + PyErr_Format(PyExc_IOError, "Error: no __array_interface__ attribute in object."); + return NULL; + } + //status = (*tp->tp_setattro)(obj, w, attr); + //status = PyObject_GenericSetAttr(obj, w, attr); + status = PyObject_SetAttrString(obj, name, attr); + if (status < 0) { + printf("can not use tp_setattro status:%d\n", status); + PyErr_Clear(); + PyErr_Format(PyExc_IOError, "Error: can not set interface attribute."); + return NULL; + } + } + return obj; +} + +static int get_array_struct(PyObject* obj, int *maxndim, npy_intp *d_shape, PyArrayInterface* inter) +{ + PyTypeObject *tp = Py_TYPE(obj); + PyObject* ret; + char* str; + int i; + str = "__array_struct__"; + /* We do not need to check for special attributes on trivial types */ + if (_is_basic_python_type(tp)) { + ret = NULL; + } + /* obj has the __array_struct__ interface */ + ret = maybe_get_attr(obj, str); + if (ret != NULL) { + int nd = -1; + if (PyCapsule_CheckExact(ret)) { + PyArrayInterface *inter; + inter = (PyArrayInterface *)NpyCapsule_AsVoidPtr(ret); + if (inter->two == 2) { + nd = inter->nd; + if (nd >= 0) { + if (nd < *maxndim) { + *maxndim = nd; + } + for (i=0; i<*maxndim; i++) { + d_shape[i] = inter->shape[i]; + } + } + } + } + if(nd >= 0){ + return 0; + } else { + return -1; + } + } else { + return -1; + } +} + +PyObject* my_get_array_attr_interface(PyObject* obj){ + printf("Check-in my_get_array_attr_interface\n"); + printf("Check-out my_get_array_attr_interface\n"); + return obj; +} + +PyObject* get_array_attr_interface(PyObject* obj, char* str, int *maxndim, npy_intp *d_shape){ + PyTypeObject *tp = Py_TYPE(obj); + char* dictstr; + int i, failflag=0; + dictstr = "__array_interface__"; + PyObject* ret; + PyObject* retuni = NULL; + PyObject* newi = NULL; + PyObject* objj = NULL; + if (_is_basic_python_type(tp)) { + ret = NULL; + } + /* obj has the __array_interface__ interface */ + ret = maybe_get_attr(obj, dictstr); + if (ret != NULL) { + int nd = -1; + if (PyDict_Check(ret)) { + printf("I- %s\n",str); + objj = PyDict_GetItemString(ret, str); + printf("O- %s\n",str); + //newi = PyDict_GetItemString(ret, str); + if (str == "shape"){ + if (objj && PyTuple_Check(objj)) { + nd = PyTuple_GET_SIZE(objj); + if (nd >= 0) { + maxndim = &nd; + printf("nd:%d\n",*maxndim); + for (i=0; i<nd; i++) { + //Py_INCREF(objj); + retuni = PyTuple_GET_ITEM(objj, i); + printf("step:%d\n",i); + //d_shape[i] = (npy_intp) PyInt_AsSsize_t(retuni); + //d_shape[i] = PyInt_AsSsize_t(PyTuple_GET_ITEM(objj, i)); + //Py_DECREF(objj); + printf("T- %d\n",i); + //if (d_shape[i] < 0) { + // PyErr_SetString(PyExc_RuntimeError, + // "Invalid shape in __array_interface__"); + // failflag = 1; + //} + } + } + } + } else { + printf("T5\n"); + PyObject* tuple = PyTuple_New(1); + PyTuple_SET_ITEM(tuple, 0, objj); + printf("T6\n"); + return (PyObject*) tuple; + } + } + if (nd >= 0) { + printf("T5\n"); + //newi = (PyArrayObject*) objj; + PyObject* tuple = PyTuple_New(1); + PyTuple_SET_ITEM(tuple, 0, objj); + printf("T6\n"); + return (PyObject*) tuple; + } else { + failflag = 1; + } + } else { + failflag = 1; + } + if (failflag){ + PyErr_Clear(); + PyErr_Format(PyExc_IOError, "Error: can not get attribute of given numpy array."); + return NULL; + } +} + +PyObject* get_descr_array_interface(PyObject* obj){ + PyTypeObject *tp = Py_TYPE(obj); + char* dictstr; + char* descrstr; + int i, failflag=0; + dictstr = "__array_interface__"; + descrstr = "descr"; + PyObject* ret; + PyObject* retuni = NULL; + PyObject* newi = NULL; + PyObject* objj = NULL; + if (_is_basic_python_type(tp)) { + ret = NULL; + } + /* obj has the __array_interface__ interface */ + ret = maybe_get_attr(obj, dictstr); + if (ret != NULL) { + if (PyDict_Check(ret)) { + objj = PyDict_GetItemString(ret, descrstr); + return (PyObject*) objj; + } else { + failflag = 1; + } + } else { + failflag = 1; + } + if (failflag){ + PyErr_Clear(); + PyErr_Format(PyExc_IOError, "Error: can not get attribute of given numpy array."); + return NULL; + } +} + +PyObject* set_array_attr_interface(PyObject* obj, int nsize, void* data) +{ + PyTypeObject *tp = Py_TYPE(obj); + char* dictstr; + char* shapestr; + char* datastr; + int i, failflag=0; + dictstr = "__array_interface__"; + shapestr= "shape"; + datastr= "data"; + PyObject* ret; + //PyObject* retuni = NULL; + //PyObject* newi = NULL; + PyObject* shapeobj = NULL; + PyObject* dataobj = NULL; + PyObject* new_shape = NULL; + int status; + if (_is_basic_python_type(tp)) { + ret = NULL; + } + /* obj has the __array_interface__ interface */ + ret = maybe_get_attr(obj, dictstr); + printf("AA0\n"); + if (ret != NULL) { + int nd = -1; + if (PyDict_Check(ret)) { + shapeobj = PyDict_GetItemString(ret, shapestr); + printf("AA1\n"); + if (shapeobj && PyTuple_Check(shapeobj)) { + nd = PyTuple_GET_SIZE(shapeobj); + printf("AA1-1\n"); + if (nd >= 0) { + new_shape = PyTuple_New(nd); + for (i=0; i<nd; i++) { + PyTuple_SET_ITEM(new_shape, i, PyInt_FromLong((int)nsize)); + } + status = PyDict_SetItemString(ret, shapestr, new_shape); + if (status<0){ + printf("AA1-2\n"); + Py_DECREF(new_shape); + PyErr_Clear(); + failflag = 1; + } + } else { + printf("AA1-3\n"); + failflag = 1; + } + } + printf("AA2\n"); + if(!failflag){ + dataobj = PyDict_GetItemString(ret, datastr); + printf("AA2-1\n"); + if (dataobj && PyTuple_Check(dataobj)) { + PyTuple_SET_ITEM(dataobj, 0, PyLong_FromVoidPtr(data)); + status = PyDict_SetItemString(ret, datastr, dataobj); + if (status<0){ + printf("AA2-2\n"); + failflag = 1; + } + } + } + printf("AA3\n"); + if(!failflag){ + printf("AA3-1\n"); + obj = maybe_set_attr(obj, dictstr, ret); + if (!obj){ + printf("AA3-2\n"); + failflag = 1; + } + } + printf("AA4\n"); + } else { + printf("AA1-0\n"); + failflag = 1; + } + } else { + printf("AA0-1\n"); + failflag = 1; + } + if (failflag){ + Py_DECREF(new_shape); + PyErr_Clear(); + PyErr_Format(PyExc_IOError, "Error: can not get attribute of given numpy array."); + printf("AA Fail\n"); + return NULL; + } else { + printf("AA Return\n"); + return obj; + } +} + + +#if 0 +NPY_NO_EXPORT int +MyArray_DescrConverter(PyObject *obj, PyArray_Descr **at) +{ + int check_num = NPY_NOTYPE + 10; + PyObject *item; + int elsize = 0; + char endian = '='; + + *at = NULL; + + printf("Test0\n"); + /* default */ + if (obj == Py_None) { + *at = PyArray_DescrFromType(NPY_DEFAULT_TYPE); + return NPY_SUCCEED; + } + + printf("Test1\n"); + if (PyArray_DescrCheck(obj)) { + *at = (PyArray_Descr *)obj; + Py_INCREF(*at); + return NPY_SUCCEED; + } + + printf("Test2\n"); + if (PyType_Check(obj)) { + if (PyType_IsSubtype((PyTypeObject *)obj, &PyGenericArrType_Type)) { + *at = PyArray_DescrFromTypeObject(obj); + return (*at) ? NPY_SUCCEED : NPY_FAIL; + } + check_num = NPY_OBJECT; +#if !defined(NPY_PY3K) + if (obj == (PyObject *)(&PyInt_Type)) { + check_num = NPY_LONG; + } + else if (obj == (PyObject *)(&PyLong_Type)) { + check_num = NPY_LONGLONG; + } +#else + if (obj == (PyObject *)(&PyLong_Type)) { + check_num = NPY_LONG; + } +#endif + else if (obj == (PyObject *)(&PyFloat_Type)) { + check_num = NPY_DOUBLE; + } + else if (obj == (PyObject *)(&PyComplex_Type)) { + check_num = NPY_CDOUBLE; + } + else if (obj == (PyObject *)(&PyBool_Type)) { + check_num = NPY_BOOL; + } + else if (obj == (PyObject *)(&PyBytes_Type)) { + check_num = NPY_STRING; + } + else if (obj == (PyObject *)(&PyUnicode_Type)) { + check_num = NPY_UNICODE; + } +#if defined(NPY_PY3K) + else if (obj == (PyObject *)(&PyMemoryView_Type)) { +#else + else if (obj == (PyObject *)(&PyBuffer_Type)) { +#endif + check_num = NPY_VOID; + } + else { + *at = _arraydescr_fromobj(obj); + if (*at) { + return NPY_SUCCEED; + } + } + goto finish; + } + printf("Test3\n"); + + /* or a typecode string */ + + if (PyUnicode_Check(obj)) { + /* Allow unicode format strings: convert to bytes */ + int retval; + PyObject *obj2; + obj2 = PyUnicode_AsASCIIString(obj); + if (obj2 == NULL) { + return NPY_FAIL; + } + retval = PyArray_DescrConverter(obj2, at); + Py_DECREF(obj2); + return retval; + } + + printf("Test4\n"); + if (PyBytes_Check(obj)) { + char *type = NULL; + Py_ssize_t len = 0; + + /* Check for a string typecode. */ + if (PyBytes_AsStringAndSize(obj, &type, &len) < 0) { + goto error; + } + + /* Empty string is invalid */ + if (len == 0) { + goto fail; + } + + /* check for commas present or first (or second) element a digit */ + if (_check_for_commastring(type, len)) { + *at = _convert_from_commastring(obj, 0); + return (*at) ? NPY_SUCCEED : NPY_FAIL; + } + + /* Process the endian character. '|' is replaced by '='*/ + switch (type[0]) { + case '>': + case '<': + case '=': + endian = type[0]; + ++type; + --len; + break; + + case '|': + endian = '='; + ++type; + --len; + break; + } + + /* Just an endian character is invalid */ + if (len == 0) { + goto fail; + } + + /* Check for datetime format */ + if (is_datetime_typestr(type, len)) { + *at = parse_dtype_from_datetime_typestr(type, len); + if (*at == NULL) { + return NPY_FAIL; + } + /* *at has byte order '=' at this point */ + if (!PyArray_ISNBO(endian)) { + (*at)->byteorder = endian; + } + return NPY_SUCCEED; + } + + /* A typecode like 'd' */ + if (len == 1) { + check_num = type[0]; + } + /* A kind + size like 'f8' */ + else { + char *typeend = NULL; + int kind; + + /* Parse the integer, make sure it's the rest of the string */ + elsize = (int)strtol(type + 1, &typeend, 10); + if (typeend - type == len) { + + kind = type[0]; + switch (kind) { + case NPY_STRINGLTR: + case NPY_STRINGLTR2: + check_num = NPY_STRING; + break; + + /* + * When specifying length of UNICODE + * the number of characters is given to match + * the STRING interface. Each character can be + * more than one byte and itemsize must be + * the number of bytes. + */ + case NPY_UNICODELTR: + check_num = NPY_UNICODE; + elsize <<= 2; + break; + + case NPY_VOIDLTR: + check_num = NPY_VOID; + break; + + default: + if (elsize == 0) { + check_num = NPY_NOTYPE+10; + } + /* Support for generic processing c8, i4, f8, etc...*/ + else { + check_num = PyArray_TypestrConvert(elsize, kind); + if (check_num == NPY_NOTYPE) { + check_num += 10; + } + elsize = 0; + } + } + } + } + } + else if (PyTuple_Check(obj)) { + /* or a tuple */ + *at = _convert_from_tuple(obj); + if (*at == NULL){ + if (PyErr_Occurred()) { + return NPY_FAIL; + } + goto fail; + } + return NPY_SUCCEED; + } + else if (PyList_Check(obj)) { + /* or a list */ + *at = _convert_from_array_descr(obj,0); + if (*at == NULL) { + if (PyErr_Occurred()) { + return NPY_FAIL; + } + goto fail; + } + return NPY_SUCCEED; + } + else if (PyDict_Check(obj) || PyDictProxy_Check(obj)) { + /* or a dictionary */ + *at = _convert_from_dict(obj,0); + if (*at == NULL) { + if (PyErr_Occurred()) { + return NPY_FAIL; + } + goto fail; + } + return NPY_SUCCEED; + } + else if (PyArray_Check(obj)) { + goto fail; + } + else { + *at = _arraydescr_fromobj(obj); + if (*at) { + return NPY_SUCCEED; + } + if (PyErr_Occurred()) { + return NPY_FAIL; + } + goto fail; + } + if (PyErr_Occurred()) { + goto fail; + } + +finish: + printf("Test5\n"); + if ((check_num == NPY_NOTYPE + 10) || + (*at = PyArray_DescrFromType(check_num)) == NULL) { + PyErr_Clear(); + /* Now check to see if the object is registered in typeDict */ + if (typeDict != NULL) { + item = PyDict_GetItem(typeDict, obj); +#if defined(NPY_PY3K) + if (!item && PyBytes_Check(obj)) { + PyObject *tmp; + tmp = PyUnicode_FromEncodedObject(obj, "ascii", "strict"); + if (tmp != NULL) { + item = PyDict_GetItem(typeDict, tmp); + Py_DECREF(tmp); + } + } +#endif + if (item) { + /* Check for a deprecated Numeric-style typecode */ + if (PyBytes_Check(obj)) { + char *type = NULL; + Py_ssize_t len = 0; + char *dep_tps[] = {"Bool", "Complex", "Float", "Int", + "Object0", "String0", "Timedelta64", + "Unicode0", "UInt", "Void0"}; + int ndep_tps = sizeof(dep_tps) / sizeof(dep_tps[0]); + int i; + + if (PyBytes_AsStringAndSize(obj, &type, &len) < 0) { + goto error; + } + for (i = 0; i < ndep_tps; ++i) { + char *dep_tp = dep_tps[i]; + + if (strncmp(type, dep_tp, strlen(dep_tp)) == 0) { + if (DEPRECATE("Numeric-style type codes are " + "deprecated and will result in " + "an error in the future.") < 0) { + goto fail; + } + } + } + } + return PyArray_DescrConverter(item, at); + } + } + goto fail; + } + + if (((*at)->elsize == 0) && (elsize != 0)) { + PyArray_DESCR_REPLACE(*at); + (*at)->elsize = elsize; + } + if (endian != '=' && PyArray_ISNBO(endian)) { + endian = '='; + } + if (endian != '=' && (*at)->byteorder != '|' + && (*at)->byteorder != endian) { + PyArray_DESCR_REPLACE(*at); + (*at)->byteorder = endian; + } + return NPY_SUCCEED; + +fail: + if (PyBytes_Check(obj)) { + PyErr_Format(PyExc_TypeError, + "data type \"%s\" not understood", PyBytes_AS_STRING(obj)); + } + else { + PyErr_SetString(PyExc_TypeError, + "data type not understood"); + } + +error: + *at = NULL; + return NPY_FAIL; +} +#endif + + +NPY_NO_EXPORT int +MyPyArray_DescrConverter(PyObject *obj, PyArray_Descr **at) +{ + int check_num = NPY_NOTYPE + 10; + PyObject *item; + int elsize = 0; + char endian = '='; + + printf("Test -1\n"); + *at = NULL; + + check_num = NPY_VOID; + printf("Test0\n"); + if (check_num != NPY_VOID) { + PyErr_Clear(); + /* Now check to see if the object is registered in typeDict */ + printf("Test1\n"); + if (typeDict != NULL) { + item = PyDict_GetItem(typeDict, obj); +#if defined(NPY_PY3K) + if (!item && PyBytes_Check(obj)) { + PyObject *tmp; + tmp = PyUnicode_FromEncodedObject(obj, "ascii", "strict"); + if (tmp != NULL) { + item = PyDict_GetItem(typeDict, tmp); + Py_DECREF(tmp); + } + } +#endif + if (item) { + /* Check for a deprecated Numeric-style typecode */ + if (PyBytes_Check(obj)) { + char *type = NULL; + Py_ssize_t len = 0; + char *dep_tps[] = {"Bool", "Complex", "Float", "Int", + "Object0", "String0", "Timedelta64", + "Unicode0", "UInt", "Void0"}; + int ndep_tps = sizeof(dep_tps) / sizeof(dep_tps[0]); + int i; + + if (PyBytes_AsStringAndSize(obj, &type, &len) < 0) { + goto error; + } + for (i = 0; i < ndep_tps; ++i) { + char *dep_tp = dep_tps[i]; + + if (strncmp(type, dep_tp, strlen(dep_tp)) == 0) { + if (DEPRECATE("Numeric-style type codes are " + "deprecated and will result in " + "an error in the future.") < 0) { + goto fail; + } + } + } + } + return PyArray_DescrConverter(item, at); + } + } + printf("Test2\n"); + goto fail; + } + + printf("Test3\n"); + if (((*at)->elsize == 0) && (elsize != 0)) { + PyArray_DESCR_REPLACE(*at); + (*at)->elsize = elsize; + printf("Test4\n"); + } + if (endian != '=' && PyArray_ISNBO(endian)) { + endian = '='; + printf("Test5\n"); + } + if (endian != '=' && (*at)->byteorder != '|' + && (*at)->byteorder != endian) { + PyArray_DESCR_REPLACE(*at); + (*at)->byteorder = endian; + printf("Test6\n"); + } + return NPY_SUCCEED; + +fail: + if (PyBytes_Check(obj)) { + PyErr_Format(PyExc_TypeError, + "data type \"%s\" not understood", PyBytes_AS_STRING(obj)); + } + else { + PyErr_SetString(PyExc_TypeError, + "data type not understood"); + } + +error: + *at = NULL; + return NPY_FAIL; +} + + + #if 0 void init_readwriteaccess(struct DICTHOLDER *dict); @@ -261,14 +1345,14 @@ PyObject * my_read_structure(PyObject* molpack) { molfile_atom_t* atoms; int numatoms, status; PyArray_Descr *descr; - PyObject p*; - if (PyType_Ready(&MolAtomType) < 0) - return NULL; - PyTypeObject *atype = &MolAtomType; - MolAtom *atom_t; - atom_t = (MolAtom *)atype->tp_alloc(atype, 0); - p = (PyObject*) atom_t; - descr = PyArray_DescrFromObject(p, NULL) + PyObject *p = NULL; + //if (PyType_Ready(&MolAtomType) < 0) + // return NULL; + //PyTypeObject *atype = &MolAtomType; + //MolAtom *atom_t; + //atom_t = (MolAtom *)atype->tp_alloc(atype, 0); + //p = (PyObject*) atom_t; + descr = PyArray_DescrFromObject(p, NULL); MolObject* plugin_handle = (MolObject*) molpack; plugin = plugin_handle->plugin; file_handle = plugin_handle->file_handle; @@ -286,8 +1370,8 @@ PyObject * my_read_structure(PyObject* molpack) { npy_intp dims[1] = { numatoms }; oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT64); Py_DECREF(p); - array = (PyArrayObject*) PyArray_SimpleNewFromDescr(1, dims, descr); - PyObject_Print(array, stdout, 0); + //array = (PyArrayObject*) PyArray_SimpleNewFromDescr(1, dims, descr); + //PyObject_Print(array, stdout, 0); if (!oresid){ PyErr_Format(PyExc_IOError, "Error copying molfile_atom_t into numpy array."); return NULL; @@ -301,4 +1385,296 @@ PyObject * my_read_structure(PyObject* molpack) { return (PyObject*) PyArray_FromArray(oresid, PyArray_DESCR(oresid), 0); } +PyObject* print_array_struct(PyObject* prototype) +{ + Py_Initialize(); + import_array(); + int status = -10; + PyObject *ret = NULL; + int *maxndim = NULL; + npy_intp *d_shape = NULL; + printf("Check-in print_array_struct\n"); + Py_INCREF(prototype); + ret = get_array_attr_interface(prototype, "descr", maxndim, d_shape); + printf("Returned\n"); + //printf("Returned nd:%d\n", *maxndim); + Py_DECREF(prototype); + if (!ret){ + PyErr_Clear(); + PyErr_Format(PyExc_IOError, "Error: can not get attribute of given numpy array."); + Py_XDECREF(ret); + return NULL; + } + printf("Check-out print_array_struct\n"); + return ret; +} + +PyObject* read_fill_structure(PyObject* molpack, PyObject* prototype) +{ + Py_Initialize(); + import_array(); + int options = 0; +// int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* data; + int numatoms, status; + int nd; + PyArray_Descr *descr; +// PyArrayInterface *inter; + //PyArrayObject *ret = NULL; + PyObject *ret = NULL; + PyObject *descr_obj = NULL; +// char endian = NPY_NATBYTE; +// PyArrayObject *obj; +// printf("Test1\n"); +// obj = (PyArrayObject *)prototype; +// if(obj == NULL){ +// PyErr_Format(PyExc_IOError, "Error: Given PyObject does not include numpy array."); +// return NULL; +// } + // Access plugin_handle values + MolObject* plugin_handle = (MolObject*) molpack; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + printf("Test2-1\n"); + // Allocate memory for array of molfile_atom_t struct + data = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + // Get array values in molfile_atom_t + printf("Test2-2\n"); + status = plugin->read_structure(file_handle, &options, data); + printf("Test2-3\n"); + // Check if the plugin returns the results + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error accessing molfile_atom_t in read_structure function of plugin."); + return NULL; + } + nd = 1; + npy_intp dims[1] = { numatoms }; + npy_intp strides[1] = { sizeof(molfile_atom_t) }; + printf("Test3\n"); + Py_INCREF(prototype); + //ret = set_array_attr_interface(prototype, numatoms, data); + descr_obj = get_descr_array_interface(prototype); + descr = (PyArray_Descr*) descr_obj; + //ret = set_array_attr_struct(ret, numatoms, data); + printf("Returned 1\n"); + Py_DECREF(prototype); + printf("Set\n"); + Py_INCREF(prototype); + ret = PyArray_NewFromDescr(Py_TYPE(prototype), PyArray_DESCR((PyArrayObject*)prototype), + nd, dims, + strides, data, + PyArray_FLAGS((PyArrayObject*)prototype), prototype); + //PyArray_STRIDES((PyArrayObject*)prototype), data, + Py_DECREF(prototype); + printf("Returned 2\n"); + //status = my_get_array_attr_interface((PyObject*)obj, "descr", maxndim, d_shape, ret); + //status = my_get_array_attr_interface(prototype, ret); + //printf("Test4 Status:%d nd:%d\n",status,*maxndim); + //printf("Test4 Status:%d\n",status); +// if (status<0){ +// Py_DECREF(obj); +// PyErr_Clear(); +// PyErr_Format(PyExc_IOError, "Error: can not get attribute of given numpy array."); +// return NULL; +// } +// printf("Test5\n"); +// Py_INCREF(prototype); +// Py_DECREF(ret); + //return (PyObject*) PyArray_FromArray((PyArrayObject*)ret, PyArray_DESCR((PyArrayObject*)ret), 0); + return (PyObject*) ret; +} + +PyObject* get_structure(PyObject* self) +{ + int options = 0; + int i; + molfile_plugin_t* plugin; + void* file_handle; + molfile_atom_t* data; + int numatoms, status; + int nd; + PyArrayInterface *inter; + PyArrayObject *ret; + char endian = NPY_NATBYTE; + // Access plugin_handle values + MolObject* plugin_handle = (MolObject*) self; + plugin = plugin_handle->plugin; + file_handle = plugin_handle->file_handle; + numatoms = plugin_handle->natoms; + // Allocate memory for array of molfile_atom_t struct + data = (molfile_atom_t *)calloc(numatoms,sizeof(molfile_atom_t)); + // Get array values in molfile_atom_t + status = plugin->read_structure(file_handle, &options, data); + // Check if the plugin returns the results + if (status!=0){ + PyErr_Format(PyExc_IOError, "Error accessing molfile_atom_t in read_structure function of plugin."); + return NULL; + } + // Now, we need to allocate a PyArray with PyArrayInterface + // and assign the allocated memory block to the data. + // To do this, we will build a numpy array from scratch. + // First, allocate a PyObject of PyArrayInterface and + // assign relevant information such as typestr, descr for C-side + // struct and second we will assign molfile_atom_t array as a block + // of data. Last, hope this works. + nd = 1; + npy_intp dims[1] = { 1 }; + // We would allocate a numpy array with + // but will not look clever to copy all the data into the new array. + // Instead, we allocate a numpy array with one element and change + // the definition of array. I know I said that it will be from scratch + // but let's accept nobody wants to define everything in numpy again. + //oresid = (PyArrayObject*) PyArray_SimpleNew(nd, dims, NPY_INT); + // NPY_INT? Don't worry, we will change it. + //Py_intptr_t *shape, *strides; + //void *data = NULL; + + inter = (PyArrayInterface*)malloc(sizeof(PyArrayInterface)); + if (inter==NULL) + return PyErr_NoMemory(); + + // __array_interface__ descr for C side of __array_struct__ + // Could not find a better way to generate the list of tuples for + // Python side. May need to change this later. + PyObject *descrlist = PyList_New(13); + // One tuple to bind them + PyObject *py_tuple_name = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_name, 0, PyUnicode_FromString("name")); + PyTuple_SET_ITEM(py_tuple_name, 1, PyUnicode_FromString("|S16")); + PyList_SET_ITEM(descrlist, 0, py_tuple_name); + PyObject *py_tuple_type = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_type, 0, PyUnicode_FromString("type")); + PyTuple_SET_ITEM(py_tuple_type, 1, PyUnicode_FromString("|S16")); + PyList_SET_ITEM(descrlist, 1, py_tuple_type); + PyObject *py_tuple_resname = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_resname, 0, PyUnicode_FromString("resname")); + PyTuple_SET_ITEM(py_tuple_resname, 1, PyUnicode_FromString("|S8")); + PyList_SET_ITEM(descrlist, 2, py_tuple_resname); + PyObject *py_tuple_resid = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_resid, 0, PyUnicode_FromString("resid")); + PyTuple_SET_ITEM(py_tuple_resid, 1, PyUnicode_FromString("<i4")); + PyList_SET_ITEM(descrlist, 3, py_tuple_resid); + PyObject *py_tuple_segid = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_segid, 0, PyUnicode_FromString("segid")); + PyTuple_SET_ITEM(py_tuple_segid, 1, PyUnicode_FromString("|S8")); + PyList_SET_ITEM(descrlist, 4, py_tuple_segid); + PyObject *py_tuple_chain = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_chain, 0, PyUnicode_FromString("chain")); + PyTuple_SET_ITEM(py_tuple_chain, 1, PyUnicode_FromString("|S2")); + PyList_SET_ITEM(descrlist, 5, py_tuple_chain); + PyObject *py_tuple_altloc = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_altloc, 0, PyUnicode_FromString("altloc")); + PyTuple_SET_ITEM(py_tuple_altloc, 1, PyUnicode_FromString("|S2")); + PyList_SET_ITEM(descrlist, 6, py_tuple_altloc); + PyObject *py_tuple_insertion = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_insertion, 0, PyUnicode_FromString("insertion")); + PyTuple_SET_ITEM(py_tuple_insertion, 1, PyUnicode_FromString("|S2")); + PyList_SET_ITEM(descrlist, 7, py_tuple_insertion); + PyObject *py_tuple_occupancy = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_occupancy, 0, PyUnicode_FromString("occupancy")); + PyTuple_SET_ITEM(py_tuple_occupancy, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 8, py_tuple_occupancy); + PyObject *py_tuple_bfactor = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_bfactor, 0, PyUnicode_FromString("bfactor")); + PyTuple_SET_ITEM(py_tuple_bfactor, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 9, py_tuple_bfactor); + PyObject *py_tuple_mass = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_mass, 0, PyUnicode_FromString("mass")); + PyTuple_SET_ITEM(py_tuple_mass, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 10, py_tuple_mass); + PyObject *py_tuple_charge = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_charge, 0, PyUnicode_FromString("charge")); + PyTuple_SET_ITEM(py_tuple_charge, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 11, py_tuple_charge); + PyObject *py_tuple_radius = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_radius, 0, PyUnicode_FromString("radius")); + PyTuple_SET_ITEM(py_tuple_radius, 1, PyUnicode_FromString("<f4")); + PyList_SET_ITEM(descrlist, 12, py_tuple_radius); + PyObject *py_tuple_atomicnumber = PyTuple_New(2); + PyTuple_SET_ITEM(py_tuple_atomicnumber, 0, PyUnicode_FromString("atomicnumber")); + PyTuple_SET_ITEM(py_tuple_atomicnumber, 1, PyUnicode_FromString("<i4")); + PyList_SET_ITEM(descrlist, 13, py_tuple_atomicnumber); + //PyArray_Descr *descr = (PyObject*) tuple; + PyArray_Descr *thetype = NULL; + // Here we define the size and stride parameters + npy_intp shape[1] = { numatoms }; + npy_intp strides[1] = { 54*sizeof(char) + 8*sizeof(int) + 20*sizeof(float) }; + + inter->two = 2; + inter->nd = nd; + inter->typekind = 'V'; + inter->itemsize = 82*sizeof(char); + //inter->flags = NPY_ARRAY_NOTSWAPPED | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE; + inter->flags = NPY_ARRAY_NOTSWAPPED | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE | NPY_ARR_HAS_DESCR; + inter->strides = (Py_intptr_t *)strides; + inter->shape = (Py_intptr_t *)shape; + inter->data = (void*) data; + // inter->descr = (PyObject*) tuple; + if ((inter->flags & NPY_ARRAY_NOTSWAPPED) != NPY_ARRAY_NOTSWAPPED) { + endian = NPY_OPPBYTE; + inter->flags &= ~NPY_ARRAY_NOTSWAPPED; + } + // typestr is relatively easy to assign to __array_interface__ + printf("TEST1\n"); + //thetype = (PyArray_Descr*) tuple; + if (inter->flags & NPY_ARR_HAS_DESCR) { + printf("TEST1-1\n"); + thetype = _convert_from_array_descr(descrlist,0); + //thetype = PyArray_DescrFromTypeObject(descrlist); + printf("TEST1-2\n"); + //if (PyArray_DescrConverter(inter->descr, &thetype) == NPY_FAIL) { + // thetype = NULL; + // PyErr_Clear(); + // } + } + printf("TEST1-3\n"); +#if 0 + char buf[40]; + PyOS_snprintf(buf, sizeof(buf), + "%c%c%d", endian, + inter->typekind, + inter->itemsize); + printf("TEST2 String:%s\n",buf); + PyObject *stringobj = PyUnicode_FromString(buf); + if (stringobj == NULL) { + return NULL; + } + printf("TEST2-2\n"); + if (MyPyArray_DescrConverter(stringobj, &thetype) != NPY_SUCCEED) { + Py_DECREF(stringobj); + return NULL; + } + printf("TEST2-3\n"); + Py_DECREF(stringobj); +#endif + printf("TEST3\n"); + ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, thetype, + inter->nd, inter->shape, + inter->strides, inter->data, + inter->flags, NULL); + printf("TEST4\n"); + Py_INCREF(inter); + if (PyArray_SetBaseObject(ret, (PyObject *)inter) < 0) { + Py_DECREF(ret); + return NULL; + } + printf("TEST5\n"); +// Py_DECREF(attr); + PyArray_UpdateFlags(ret, NPY_ARRAY_UPDATE_ALL); + printf("TEST6\n"); + return (PyObject *)ret; +} +// obj = NpyCapsule_FromVoidPtrAndDesc(inter, self, gentype_struct_free); +/* +#ifdef Py_CAPSULE_H + obj = PyCapsule_New((void*)inter, "struct SignedIntBuf", free_capsule); +#else + obj = PyCObject_FromVoidPtrAndDesc((void*)inter, (void*)self, free_array_interface); +#endif +*/ + // Cross fingers here. +// return obj; diff --git a/pymolfile/molfile/pymolfile.h b/pymolfile/molfile/pymolfile.h index 5d37f5d..6a0c1b5 100644 --- a/pymolfile/molfile/pymolfile.h +++ b/pymolfile/molfile/pymolfile.h @@ -30,6 +30,7 @@ extern "C" #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include <numpy/arrayobject.h> + enum { pluginOK, pluginNOINIT, pluginCLOSE, pluginNOMEM, pluginENDOFFILE, pluginFILENOTFOUND, pluginFORMATERROR }; @@ -119,7 +120,7 @@ static PyMemberDef MolObject_members[] = { "file handle for plugin"}, {"natoms", T_INT, offsetof(MolObject, natoms), 0, "number of atoms"}, - {NULL, NULL, 0, NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; static PyMethodDef MolObject_methods[] = { @@ -132,7 +133,7 @@ static PyMethodDef MolObject_methods[] = { {"get_natoms", (PyCFunction)MolObject_natoms, METH_NOARGS, "Return the number of atoms" }, - {NULL, NULL, 0, NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; @@ -183,6 +184,7 @@ static PyTypeObject MolObjectType = { MolObject_new, /* tp_new */ }; +#if 0 struct MolAtom { PyObject_HEAD char* name; @@ -257,8 +259,8 @@ static PyMemberDef MolAtom_members[] = { {"segid", T_STRING, offsetof(MolAtom, segid), 0,""}, {"chain", T_STRING, offsetof(MolAtom, chain), 0,""}, {"altloc", T_STRING, offsetof(MolAtom, altloc), 0,""}, - {"insertion", T_STRING, offsetof(MolAtom, occupancy), 0,""}, - {"occupancy", T_FLOAT, offsetof(MolAtom, ), 0,""}, + {"insertion", T_STRING, offsetof(MolAtom, insertion), 0,""}, + {"occupancy", T_FLOAT, offsetof(MolAtom, occupancy), 0,""}, {"bfactor", T_FLOAT, offsetof(MolAtom, bfactor), 0,""}, {"mass", T_FLOAT, offsetof(MolAtom, mass), 0,""}, {"charge", T_FLOAT, offsetof(MolAtom, charge), 0,""}, @@ -309,8 +311,11 @@ static PyTypeObject MolAtomType = { 0, /* tp_alloc */ MolAtom_new, /* tp_new */ }; - +#endif PyObject * my_read_structure(PyObject* molpack); +PyObject * read_fill_structure(PyObject* molpack, PyObject* prototype); +PyObject * get_structure(PyObject* molpack); +PyObject * print_array_struct(PyObject* prototype); #if 0 typedef struct DICTHOLDER { diff --git a/pymolfile/molfile/signedintbuf-cython/compile-numind.sh b/pymolfile/molfile/signedintbuf-cython/compile-numind.sh new file mode 100644 index 0000000..680fa4e --- /dev/null +++ b/pymolfile/molfile/signedintbuf-cython/compile-numind.sh @@ -0,0 +1,2 @@ +Cython -a numind.pyx --cplus +g++ -fPIC -Wall -Wextra -Wunused-function -shared -I/labEnv3/lib/python3.6/site-packages/numpy/core/include/ numind.cpp -o numind.so -I/labEnv3/include/python3.6m/ -L/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib -lpython3.6 diff --git a/pymolfile/molfile/signedintbuf-cython/numind.cpp b/pymolfile/molfile/signedintbuf-cython/numind.cpp new file mode 100644 index 0000000..06f2230 --- /dev/null +++ b/pymolfile/molfile/signedintbuf-cython/numind.cpp @@ -0,0 +1 @@ +#error Do not use this file, it is the result of a failed Cython compilation. diff --git a/pymolfile/molfile/signedintbuf-cython/numind.h b/pymolfile/molfile/signedintbuf-cython/numind.h new file mode 100644 index 0000000..988c2c8 --- /dev/null +++ b/pymolfile/molfile/signedintbuf-cython/numind.h @@ -0,0 +1,12 @@ +#ifndef NUMIND_H +#define NUMIND_H + +typedef struct SignedIntBuf +{ + int* data; + int shape[2]; + int strides[2]; +} SignedIntBuf; + +#endif + diff --git a/pymolfile/molfile/signedintbuf-cython/numind.html b/pymolfile/molfile/signedintbuf-cython/numind.html new file mode 100644 index 0000000..96768d1 --- /dev/null +++ b/pymolfile/molfile/signedintbuf-cython/numind.html @@ -0,0 +1,1243 @@ +<!DOCTYPE html> +<!-- Generated by Cython 0.26.1 --> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Cython: numind.pyx</title> + <style type="text/css"> + +body.cython { font-family: courier; font-size: 12; } + +.cython.tag { } +.cython.line { margin: 0em } +.cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; } + +.cython.line .run { background-color: #B0FFB0; } +.cython.line .mis { background-color: #FFB0B0; } +.cython.code.run { border-left: 8px solid #B0FFB0; } +.cython.code.mis { border-left: 8px solid #FFB0B0; } + +.cython.code .py_c_api { color: red; } +.cython.code .py_macro_api { color: #FF7000; } +.cython.code .pyx_c_api { color: #FF3000; } +.cython.code .pyx_macro_api { color: #FF7000; } +.cython.code .refnanny { color: #FFA000; } +.cython.code .trace { color: #FFA000; } +.cython.code .error_goto { color: #FFA000; } + +.cython.code .coerce { color: #008000; border: 1px dotted #008000 } +.cython.code .py_attr { color: #FF0000; font-weight: bold; } +.cython.code .c_attr { color: #0000FF; } +.cython.code .py_call { color: #FF0000; font-weight: bold; } +.cython.code .c_call { color: #0000FF; } + +.cython.score-0 {background-color: #FFFFff;} +.cython.score-1 {background-color: #FFFFe7;} +.cython.score-2 {background-color: #FFFFd4;} +.cython.score-3 {background-color: #FFFFc4;} +.cython.score-4 {background-color: #FFFFb6;} +.cython.score-5 {background-color: #FFFFaa;} +.cython.score-6 {background-color: #FFFF9f;} +.cython.score-7 {background-color: #FFFF96;} +.cython.score-8 {background-color: #FFFF8d;} +.cython.score-9 {background-color: #FFFF86;} +.cython.score-10 {background-color: #FFFF7f;} +.cython.score-11 {background-color: #FFFF79;} +.cython.score-12 {background-color: #FFFF73;} +.cython.score-13 {background-color: #FFFF6e;} +.cython.score-14 {background-color: #FFFF6a;} +.cython.score-15 {background-color: #FFFF66;} +.cython.score-16 {background-color: #FFFF62;} +.cython.score-17 {background-color: #FFFF5e;} +.cython.score-18 {background-color: #FFFF5b;} +.cython.score-19 {background-color: #FFFF57;} +.cython.score-20 {background-color: #FFFF55;} +.cython.score-21 {background-color: #FFFF52;} +.cython.score-22 {background-color: #FFFF4f;} +.cython.score-23 {background-color: #FFFF4d;} +.cython.score-24 {background-color: #FFFF4b;} +.cython.score-25 {background-color: #FFFF48;} +.cython.score-26 {background-color: #FFFF46;} +.cython.score-27 {background-color: #FFFF44;} +.cython.score-28 {background-color: #FFFF43;} +.cython.score-29 {background-color: #FFFF41;} +.cython.score-30 {background-color: #FFFF3f;} +.cython.score-31 {background-color: #FFFF3e;} +.cython.score-32 {background-color: #FFFF3c;} +.cython.score-33 {background-color: #FFFF3b;} +.cython.score-34 {background-color: #FFFF39;} +.cython.score-35 {background-color: #FFFF38;} +.cython.score-36 {background-color: #FFFF37;} +.cython.score-37 {background-color: #FFFF36;} +.cython.score-38 {background-color: #FFFF35;} +.cython.score-39 {background-color: #FFFF34;} +.cython.score-40 {background-color: #FFFF33;} +.cython.score-41 {background-color: #FFFF32;} +.cython.score-42 {background-color: #FFFF31;} +.cython.score-43 {background-color: #FFFF30;} +.cython.score-44 {background-color: #FFFF2f;} +.cython.score-45 {background-color: #FFFF2e;} +.cython.score-46 {background-color: #FFFF2d;} +.cython.score-47 {background-color: #FFFF2c;} +.cython.score-48 {background-color: #FFFF2b;} +.cython.score-49 {background-color: #FFFF2b;} +.cython.score-50 {background-color: #FFFF2a;} +.cython.score-51 {background-color: #FFFF29;} +.cython.score-52 {background-color: #FFFF29;} +.cython.score-53 {background-color: #FFFF28;} +.cython.score-54 {background-color: #FFFF27;} +.cython.score-55 {background-color: #FFFF27;} +.cython.score-56 {background-color: #FFFF26;} +.cython.score-57 {background-color: #FFFF26;} +.cython.score-58 {background-color: #FFFF25;} +.cython.score-59 {background-color: #FFFF24;} +.cython.score-60 {background-color: #FFFF24;} +.cython.score-61 {background-color: #FFFF23;} +.cython.score-62 {background-color: #FFFF23;} +.cython.score-63 {background-color: #FFFF22;} +.cython.score-64 {background-color: #FFFF22;} +.cython.score-65 {background-color: #FFFF22;} +.cython.score-66 {background-color: #FFFF21;} +.cython.score-67 {background-color: #FFFF21;} +.cython.score-68 {background-color: #FFFF20;} +.cython.score-69 {background-color: #FFFF20;} +.cython.score-70 {background-color: #FFFF1f;} +.cython.score-71 {background-color: #FFFF1f;} +.cython.score-72 {background-color: #FFFF1f;} +.cython.score-73 {background-color: #FFFF1e;} +.cython.score-74 {background-color: #FFFF1e;} +.cython.score-75 {background-color: #FFFF1e;} +.cython.score-76 {background-color: #FFFF1d;} +.cython.score-77 {background-color: #FFFF1d;} +.cython.score-78 {background-color: #FFFF1c;} +.cython.score-79 {background-color: #FFFF1c;} +.cython.score-80 {background-color: #FFFF1c;} +.cython.score-81 {background-color: #FFFF1c;} +.cython.score-82 {background-color: #FFFF1b;} +.cython.score-83 {background-color: #FFFF1b;} +.cython.score-84 {background-color: #FFFF1b;} +.cython.score-85 {background-color: #FFFF1a;} +.cython.score-86 {background-color: #FFFF1a;} +.cython.score-87 {background-color: #FFFF1a;} +.cython.score-88 {background-color: #FFFF1a;} +.cython.score-89 {background-color: #FFFF19;} +.cython.score-90 {background-color: #FFFF19;} +.cython.score-91 {background-color: #FFFF19;} +.cython.score-92 {background-color: #FFFF19;} +.cython.score-93 {background-color: #FFFF18;} +.cython.score-94 {background-color: #FFFF18;} +.cython.score-95 {background-color: #FFFF18;} +.cython.score-96 {background-color: #FFFF18;} +.cython.score-97 {background-color: #FFFF17;} +.cython.score-98 {background-color: #FFFF17;} +.cython.score-99 {background-color: #FFFF17;} +.cython.score-100 {background-color: #FFFF17;} +.cython.score-101 {background-color: #FFFF16;} +.cython.score-102 {background-color: #FFFF16;} +.cython.score-103 {background-color: #FFFF16;} +.cython.score-104 {background-color: #FFFF16;} +.cython.score-105 {background-color: #FFFF16;} +.cython.score-106 {background-color: #FFFF15;} +.cython.score-107 {background-color: #FFFF15;} +.cython.score-108 {background-color: #FFFF15;} +.cython.score-109 {background-color: #FFFF15;} +.cython.score-110 {background-color: #FFFF15;} +.cython.score-111 {background-color: #FFFF15;} +.cython.score-112 {background-color: #FFFF14;} +.cython.score-113 {background-color: #FFFF14;} +.cython.score-114 {background-color: #FFFF14;} +.cython.score-115 {background-color: #FFFF14;} +.cython.score-116 {background-color: #FFFF14;} +.cython.score-117 {background-color: #FFFF14;} +.cython.score-118 {background-color: #FFFF13;} +.cython.score-119 {background-color: #FFFF13;} +.cython.score-120 {background-color: #FFFF13;} +.cython.score-121 {background-color: #FFFF13;} +.cython.score-122 {background-color: #FFFF13;} +.cython.score-123 {background-color: #FFFF13;} +.cython.score-124 {background-color: #FFFF13;} +.cython.score-125 {background-color: #FFFF12;} +.cython.score-126 {background-color: #FFFF12;} +.cython.score-127 {background-color: #FFFF12;} +.cython.score-128 {background-color: #FFFF12;} +.cython.score-129 {background-color: #FFFF12;} +.cython.score-130 {background-color: #FFFF12;} +.cython.score-131 {background-color: #FFFF12;} +.cython.score-132 {background-color: #FFFF11;} +.cython.score-133 {background-color: #FFFF11;} +.cython.score-134 {background-color: #FFFF11;} +.cython.score-135 {background-color: #FFFF11;} +.cython.score-136 {background-color: #FFFF11;} +.cython.score-137 {background-color: #FFFF11;} +.cython.score-138 {background-color: #FFFF11;} +.cython.score-139 {background-color: #FFFF11;} +.cython.score-140 {background-color: #FFFF11;} +.cython.score-141 {background-color: #FFFF10;} +.cython.score-142 {background-color: #FFFF10;} +.cython.score-143 {background-color: #FFFF10;} +.cython.score-144 {background-color: #FFFF10;} +.cython.score-145 {background-color: #FFFF10;} +.cython.score-146 {background-color: #FFFF10;} +.cython.score-147 {background-color: #FFFF10;} +.cython.score-148 {background-color: #FFFF10;} +.cython.score-149 {background-color: #FFFF10;} +.cython.score-150 {background-color: #FFFF0f;} +.cython.score-151 {background-color: #FFFF0f;} +.cython.score-152 {background-color: #FFFF0f;} +.cython.score-153 {background-color: #FFFF0f;} +.cython.score-154 {background-color: #FFFF0f;} +.cython.score-155 {background-color: #FFFF0f;} +.cython.score-156 {background-color: #FFFF0f;} +.cython.score-157 {background-color: #FFFF0f;} +.cython.score-158 {background-color: #FFFF0f;} +.cython.score-159 {background-color: #FFFF0f;} +.cython.score-160 {background-color: #FFFF0f;} +.cython.score-161 {background-color: #FFFF0e;} +.cython.score-162 {background-color: #FFFF0e;} +.cython.score-163 {background-color: #FFFF0e;} +.cython.score-164 {background-color: #FFFF0e;} +.cython.score-165 {background-color: #FFFF0e;} +.cython.score-166 {background-color: #FFFF0e;} +.cython.score-167 {background-color: #FFFF0e;} +.cython.score-168 {background-color: #FFFF0e;} +.cython.score-169 {background-color: #FFFF0e;} +.cython.score-170 {background-color: #FFFF0e;} +.cython.score-171 {background-color: #FFFF0e;} +.cython.score-172 {background-color: #FFFF0e;} +.cython.score-173 {background-color: #FFFF0d;} +.cython.score-174 {background-color: #FFFF0d;} +.cython.score-175 {background-color: #FFFF0d;} +.cython.score-176 {background-color: #FFFF0d;} +.cython.score-177 {background-color: #FFFF0d;} +.cython.score-178 {background-color: #FFFF0d;} +.cython.score-179 {background-color: #FFFF0d;} +.cython.score-180 {background-color: #FFFF0d;} +.cython.score-181 {background-color: #FFFF0d;} +.cython.score-182 {background-color: #FFFF0d;} +.cython.score-183 {background-color: #FFFF0d;} +.cython.score-184 {background-color: #FFFF0d;} +.cython.score-185 {background-color: #FFFF0d;} +.cython.score-186 {background-color: #FFFF0d;} +.cython.score-187 {background-color: #FFFF0c;} +.cython.score-188 {background-color: #FFFF0c;} +.cython.score-189 {background-color: #FFFF0c;} +.cython.score-190 {background-color: #FFFF0c;} +.cython.score-191 {background-color: #FFFF0c;} +.cython.score-192 {background-color: #FFFF0c;} +.cython.score-193 {background-color: #FFFF0c;} +.cython.score-194 {background-color: #FFFF0c;} +.cython.score-195 {background-color: #FFFF0c;} +.cython.score-196 {background-color: #FFFF0c;} +.cython.score-197 {background-color: #FFFF0c;} +.cython.score-198 {background-color: #FFFF0c;} +.cython.score-199 {background-color: #FFFF0c;} +.cython.score-200 {background-color: #FFFF0c;} +.cython.score-201 {background-color: #FFFF0c;} +.cython.score-202 {background-color: #FFFF0c;} +.cython.score-203 {background-color: #FFFF0b;} +.cython.score-204 {background-color: #FFFF0b;} +.cython.score-205 {background-color: #FFFF0b;} +.cython.score-206 {background-color: #FFFF0b;} +.cython.score-207 {background-color: #FFFF0b;} +.cython.score-208 {background-color: #FFFF0b;} +.cython.score-209 {background-color: #FFFF0b;} +.cython.score-210 {background-color: #FFFF0b;} +.cython.score-211 {background-color: #FFFF0b;} +.cython.score-212 {background-color: #FFFF0b;} +.cython.score-213 {background-color: #FFFF0b;} +.cython.score-214 {background-color: #FFFF0b;} +.cython.score-215 {background-color: #FFFF0b;} +.cython.score-216 {background-color: #FFFF0b;} +.cython.score-217 {background-color: #FFFF0b;} +.cython.score-218 {background-color: #FFFF0b;} +.cython.score-219 {background-color: #FFFF0b;} +.cython.score-220 {background-color: #FFFF0b;} +.cython.score-221 {background-color: #FFFF0b;} +.cython.score-222 {background-color: #FFFF0a;} +.cython.score-223 {background-color: #FFFF0a;} +.cython.score-224 {background-color: #FFFF0a;} +.cython.score-225 {background-color: #FFFF0a;} +.cython.score-226 {background-color: #FFFF0a;} +.cython.score-227 {background-color: #FFFF0a;} +.cython.score-228 {background-color: #FFFF0a;} +.cython.score-229 {background-color: #FFFF0a;} +.cython.score-230 {background-color: #FFFF0a;} +.cython.score-231 {background-color: #FFFF0a;} +.cython.score-232 {background-color: #FFFF0a;} +.cython.score-233 {background-color: #FFFF0a;} +.cython.score-234 {background-color: #FFFF0a;} +.cython.score-235 {background-color: #FFFF0a;} +.cython.score-236 {background-color: #FFFF0a;} +.cython.score-237 {background-color: #FFFF0a;} +.cython.score-238 {background-color: #FFFF0a;} +.cython.score-239 {background-color: #FFFF0a;} +.cython.score-240 {background-color: #FFFF0a;} +.cython.score-241 {background-color: #FFFF0a;} +.cython.score-242 {background-color: #FFFF0a;} +.cython.score-243 {background-color: #FFFF0a;} +.cython.score-244 {background-color: #FFFF0a;} +.cython.score-245 {background-color: #FFFF0a;} +.cython.score-246 {background-color: #FFFF09;} +.cython.score-247 {background-color: #FFFF09;} +.cython.score-248 {background-color: #FFFF09;} +.cython.score-249 {background-color: #FFFF09;} +.cython.score-250 {background-color: #FFFF09;} +.cython.score-251 {background-color: #FFFF09;} +.cython.score-252 {background-color: #FFFF09;} +.cython.score-253 {background-color: #FFFF09;} +.cython.score-254 {background-color: #FFFF09;} + </style> + <script> + function toggleDiv(id) { + theDiv = id.nextElementSibling + if (theDiv.style.display != 'block') theDiv.style.display = 'block'; + else theDiv.style.display = 'none'; + } + </script> +</head> +<body class="cython"> +<p><span style="border-bottom: solid 1px grey;">Generated by Cython 0.26.1</span></p> +<p> + <span style="background-color: #FFFF00">Yellow lines</span> hint at Python interaction.<br /> + Click on a line that starts with a "<code>+</code>" to see the C code that Cython generated for it. +</p> +<p>Raw output: <a href="numind.cpp">numind.cpp</a></p> +<div class="cython"><pre class="cython line score-0"> <span class="">001</span>: # This Pyrex extension class can take a numpy/numarray/Numeric object</pre> +<pre class="cython line score-0"> <span class="">002</span>: # as a parameter and wrap it so that its information can be accessed</pre> +<pre class="cython line score-0"> <span class="">003</span>: # in a standard way, both in Python space and C space.</pre> +<pre class="cython line score-0"> <span class="">004</span>: #</pre> +<pre class="cython line score-0"> <span class="">005</span>: # Heavily based on an idea of Andrew Straw. See</pre> +<pre class="cython line score-0"> <span class="">006</span>: # http://www.scipy.org/Cookbook/ArrayStruct_and_Pyrex</pre> +<pre class="cython line score-0"> <span class="">007</span>: # Very inspiring! :-)</pre> +<pre class="cython line score-0"> <span class="">008</span>: #</pre> +<pre class="cython line score-0"> <span class="">009</span>: # First version: 2006-03-25</pre> +<pre class="cython line score-0"> <span class="">010</span>: # Last update: 2006-03-25</pre> +<pre class="cython line score-0"> <span class="">011</span>: # Author: Francesc Altet</pre> +<pre class="cython line score-0"> <span class="">012</span>: </pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">013</span>: import sys</pre> +<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_sys, 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_sys, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; +</pre><pre class="cython line score-0"> <span class="">014</span>: from cpython.pycapsule cimport *</pre> +<pre class="cython line score-0"> <span class="">015</span>: </pre> +<pre class="cython line score-0"> <span class="">016</span>: cdef extern from "Python.h":</pre> +<pre class="cython line score-0"> <span class="">017</span>: ctypedef int Py_intptr_t</pre> +<pre class="cython line score-0"> <span class="">018</span>: ctypedef object PyObject</pre> +<pre class="cython line score-0"> <span class="">019</span>: long PyInt_AsLong(object)</pre> +<pre class="cython line score-0"> <span class="">020</span>: void Py_INCREF(object)</pre> +<pre class="cython line score-0"> <span class="">021</span>: void Py_DECREF(object)</pre> +<pre class="cython line score-0"> <span class="">022</span>: </pre> +<pre class="cython line score-0"> <span class="">023</span>: cdef extern from "stdlib.h":</pre> +<pre class="cython line score-0"> <span class="">024</span>: ctypedef long size_t</pre> +<pre class="cython line score-0"> <span class="">025</span>: ctypedef long intptr_t</pre> +<pre class="cython line score-0"> <span class="">026</span>: void *malloc(size_t size)</pre> +<pre class="cython line score-0"> <span class="">027</span>: void free(void* ptr)</pre> +<pre class="cython line score-0"> <span class="">028</span>: </pre> +<pre class="cython line score-0"> <span class="">029</span>: cdef extern from "numind.h":</pre> +<pre class="cython line score-0"> <span class="">030</span>: ctypedef struct SignedIntBuf</pre> +<pre class="cython line score-0"> <span class="">031</span>: </pre> +<pre class="cython line score-0"> <span class="">032</span>: # for PyArrayInterface:</pre> +<pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">033</span>: CONTIGUOUS=0x01</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_CONTIGUOUS, __pyx_int_1) < 0) <span class='error_goto'>__PYX_ERR(0, 33, __pyx_L1_error)</span> +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">034</span>: FORTRAN=0x02</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_FORTRAN, __pyx_int_2) < 0) <span class='error_goto'>__PYX_ERR(0, 34, __pyx_L1_error)</span> +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">035</span>: ALIGNED=0x100</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_ALIGNED, __pyx_int_256) < 0) <span class='error_goto'>__PYX_ERR(0, 35, __pyx_L1_error)</span> +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">036</span>: NOTSWAPPED=0x200</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_NOTSWAPPED, __pyx_int_512) < 0) <span class='error_goto'>__PYX_ERR(0, 36, __pyx_L1_error)</span> +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">037</span>: WRITEABLE=0x400</pre> +<pre class='cython code score-5 '> if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_WRITEABLE, __pyx_int_1024) < 0) <span class='error_goto'>__PYX_ERR(0, 37, __pyx_L1_error)</span> +</pre><pre class="cython line score-0"> <span class="">038</span>: </pre> +<pre class="cython line score-0"> <span class="">039</span>: # byteorder dictionary</pre> +<pre class="cython line score-21" onclick='toggleDiv(this)'>+<span class="">040</span>: byteorder = {'<':'little', '>':'big'}</pre> +<pre class='cython code score-21 '> __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_kp_s__6, __pyx_n_s_little) < 0) <span class='error_goto'>__PYX_ERR(0, 40, __pyx_L1_error)</span> + if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_kp_s__7, __pyx_n_s_big) < 0) <span class='error_goto'>__PYX_ERR(0, 40, __pyx_L1_error)</span> + if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_byteorder, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 40, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; +</pre><pre class="cython line score-0"> <span class="">041</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">042</span>: ctypedef struct PyArrayInterface:</pre> +<pre class='cython code score-0 '>struct __pyx_t_6numind_PyArrayInterface { + int version; + int nd; + char typekind; + int itemsize; + int flags; + Py_intptr_t *shape; + Py_intptr_t *strides; + void *data; +}; +</pre><pre class="cython line score-0"> <span class="">043</span>: int version # contains the integer 2 as a sanity check</pre> +<pre class="cython line score-0"> <span class="">044</span>: int nd # number of dimensions</pre> +<pre class="cython line score-0"> <span class="">045</span>: char typekind # kind in array --- character code of typestr</pre> +<pre class="cython line score-0"> <span class="">046</span>: int itemsize # size of each element</pre> +<pre class="cython line score-0"> <span class="">047</span>: int flags # flags indicating how the data should be interpreted</pre> +<pre class="cython line score-0"> <span class="">048</span>: Py_intptr_t *shape # A length-nd array of shape information</pre> +<pre class="cython line score-0"> <span class="">049</span>: Py_intptr_t *strides # A length-nd array of stride information</pre> +<pre class="cython line score-0"> <span class="">050</span>: void *data # A pointer to the first element of the array</pre> +<pre class="cython line score-0"> <span class="">051</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">052</span>: cdef void* free_array_interface(object arr):</pre> +<pre class='cython code score-0 '>static void *__pyx_f_6numind_free_array_interface(PyObject *__pyx_v_arr) { + void *__pyx_r; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("free_array_interface", 0); +/* … */ + /* function exit code */ + __pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">053</span>: Py_DECREF(arr)</pre> +<pre class='cython code score-0 '> Py_DECREF(__pyx_v_arr); +</pre><pre class="cython line score-0"> <span class="">054</span>: </pre> +<pre class="cython line score-0"> <span class="">055</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">056</span>: cdef class NumInd:</pre> +<pre class='cython code score-0 '>struct __pyx_obj_6numind_NumInd { + PyObject_HEAD + struct __pyx_vtabstruct_6numind_NumInd *__pyx_vtab; + void *data; + int _nd; + Py_intptr_t *_shape; + Py_intptr_t *_strides; + __pyx_t_6numind_PyArrayInterface *inter; + PyObject *_t_shape; + PyObject *_t_strides; + PyObject *_undarray; +}; + + + +struct __pyx_vtabstruct_6numind_NumInd { + __pyx_t_6numind_PyArrayInterface *(*_get_array_interface)(struct __pyx_obj_6numind_NumInd *); +}; +static struct __pyx_vtabstruct_6numind_NumInd *__pyx_vtabptr_6numind_NumInd; +</pre><pre class="cython line score-0"> <span class="">057</span>: cdef void *data</pre> +<pre class="cython line score-0"> <span class="">058</span>: cdef int _nd</pre> +<pre class="cython line score-0"> <span class="">059</span>: cdef Py_intptr_t *_shape</pre> +<pre class="cython line score-0"> <span class="">060</span>: cdef Py_intptr_t *_strides</pre> +<pre class="cython line score-0"> <span class="">061</span>: cdef PyArrayInterface *inter</pre> +<pre class="cython line score-0"> <span class="">062</span>: cdef object _t_shape, _t_strides, _undarray</pre> +<pre class="cython line score-0"> <span class="">063</span>: </pre> +<pre class="cython line score-28" onclick='toggleDiv(this)'>+<span class="">064</span>: def __init__(self, object undarray):</pre> +<pre class='cython code score-28 '>/* Python wrapper */ +static int __pyx_pw_6numind_6NumInd_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_6numind_6NumInd_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_undarray = 0; + int __pyx_r; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_undarray,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args); + switch (pos_args) { + case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_undarray)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) <span class='error_goto'>__PYX_ERR(0, 64, __pyx_L3_error)</span> + } + } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0); + } + __pyx_v_undarray = values[0]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>("__init__", 1, 1, 1, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 64, __pyx_L3_error)</span> + __pyx_L3_error:; + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6numind_6NumInd___init__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self), __pyx_v_undarray); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static int __pyx_pf_6numind_6NumInd___init__(struct __pyx_obj_6numind_NumInd *__pyx_v_self, PyObject *__pyx_v_undarray) { + int __pyx_v_i; + int __pyx_v_stride; + PyObject *__pyx_v_array_shape = 0; + PyObject *__pyx_v_array_strides = 0; + int __pyx_r; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__init__", 0); +/* … */ + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_7); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_array_shape); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_array_strides); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-0"> <span class="">065</span>: cdef int i, stride</pre> +<pre class="cython line score-0"> <span class="">066</span>: cdef object array_shape, array_strides</pre> +<pre class="cython line score-0"> <span class="">067</span>: </pre> +<pre class="cython line score-0"> <span class="">068</span>: # Keep a reference to the underlying object</pre> +<pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">069</span>: self._undarray = undarray</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_undarray); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_v_undarray); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_undarray); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_undarray); + __pyx_v_self->_undarray = __pyx_v_undarray; +</pre><pre class="cython line score-0"> <span class="">070</span>: # Get the shape and strides C arrays</pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">071</span>: array_shape = undarray.__array_interface__["shape"]</pre> +<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, __pyx_n_s_shape);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_array_shape = __pyx_t_2; + __pyx_t_2 = 0; +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">072</span>: self._t_shape = array_shape</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_array_shape); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_v_array_shape); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_t_shape); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_t_shape); + __pyx_v_self->_t_shape = __pyx_v_array_shape; +</pre><pre class="cython line score-0"> <span class="">073</span>: # The number of dimensions</pre> +<pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">074</span>: self._nd = len(array_shape)</pre> +<pre class='cython code score-5 '> __pyx_t_3 = <span class='py_c_api'>PyObject_Length</span>(__pyx_v_array_shape);<span class='error_goto'> if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 74, __pyx_L1_error)</span> + __pyx_v_self->_nd = __pyx_t_3; +</pre><pre class="cython line score-0"> <span class="">075</span>: # The shape</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">076</span>: self._shape = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t))</pre> +<pre class='cython code score-0 '> __pyx_v_self->_shape = ((Py_intptr_t *)malloc((__pyx_v_self->_nd * (sizeof(Py_intptr_t))))); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">077</span>: for i from 0 <= i < self._nd:</pre> +<pre class='cython code score-0 '> __pyx_t_4 = __pyx_v_self->_nd; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { +</pre><pre class="cython line score-10" onclick='toggleDiv(this)'>+<span class="">078</span>: self._shape[i] = self._t_shape[i]</pre> +<pre class='cython code score-10 '> __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_self->_t_shape, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 78, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_As_Py_intptr_t</span>(__pyx_t_2); if (unlikely((__pyx_t_5 == ((Py_intptr_t)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 78, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + (__pyx_v_self->_shape[__pyx_v_i]) = __pyx_t_5; + } +</pre><pre class="cython line score-0"> <span class="">079</span>: # The strides (compute them if needed)</pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">080</span>: array_strides = undarray.__array_interface__["strides"]</pre> +<pre class='cython code score-8 '> __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 80, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_2, __pyx_n_s_strides);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_array_strides = __pyx_t_1; + __pyx_t_1 = 0; +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">081</span>: self._t_strides = array_strides</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_array_strides); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_v_array_strides); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_t_strides); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_v_array_strides; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">082</span>: self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t))</pre> +<pre class='cython code score-0 '> __pyx_v_self->_strides = ((Py_intptr_t *)malloc((__pyx_v_self->_nd * (sizeof(Py_intptr_t))))); +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">083</span>: if array_strides:</pre> +<pre class='cython code score-2 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_v_array_strides); if (unlikely(__pyx_t_6 < 0)) <span class='error_goto'>__PYX_ERR(0, 83, __pyx_L1_error)</span> + if (__pyx_t_6) { +/* … */ + goto __pyx_L5; + } +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">084</span>: for i from 0 <= i < self._nd:</pre> +<pre class='cython code score-0 '> __pyx_t_4 = __pyx_v_self->_nd; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { +</pre><pre class="cython line score-10" onclick='toggleDiv(this)'>+<span class="">085</span>: self._strides[i] = array_strides[i]</pre> +<pre class='cython code score-10 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_array_strides, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_As_Py_intptr_t</span>(__pyx_t_1); if (unlikely((__pyx_t_5 == ((Py_intptr_t)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 85, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + (__pyx_v_self->_strides[__pyx_v_i]) = __pyx_t_5; + } +</pre><pre class="cython line score-0"> <span class="">086</span>: else:</pre> +<pre class="cython line score-0"> <span class="">087</span>: # strides is None. Compute them explicitely.</pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">088</span>: self._t_strides = [0] * self._nd</pre> +<pre class='cython code score-8 '> /*else*/ { + __pyx_t_1 = <span class='py_c_api'>PyList_New</span>(1 * ((__pyx_v_self->_nd<0) ? 0:__pyx_v_self->_nd));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_self->_nd; __pyx_temp++) { + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_0); + <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_1, __pyx_temp, __pyx_int_0); + } + } + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_t_strides); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_t_1; + __pyx_t_1 = 0; +</pre><pre class="cython line score-21" onclick='toggleDiv(this)'>+<span class="">089</span>: stride = int(self.typestr[2:])</pre> +<pre class='cython code score-21 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_self), __pyx_n_s_typestr);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetSlice</span>(__pyx_t_1, 2, 0, NULL, NULL, &__pyx_slice_, 1, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyNumber_Int</span>(__pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_stride = __pyx_t_4; +/* … */ + __pyx_slice_ = <span class='py_c_api'>PySlice_New</span>(__pyx_int_2, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_slice_)) __PYX_ERR(0, 89, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_slice_); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_slice_); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">090</span>: for i from self._nd > i >= 0:</pre> +<pre class='cython code score-0 '> for (__pyx_v_i = __pyx_v_self->_nd-1; __pyx_v_i >= 0; __pyx_v_i--) { +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">091</span>: self._strides[i] = stride</pre> +<pre class='cython code score-0 '> (__pyx_v_self->_strides[__pyx_v_i]) = __pyx_v_stride; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">092</span>: self._t_strides[i] = stride</pre> +<pre class='cython code score-5 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_stride);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 92, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + if (unlikely(<span class='pyx_c_api'>__Pyx_SetItemInt</span>(__pyx_v_self->_t_strides, __pyx_v_i, __pyx_t_1, int, 1, __Pyx_PyInt_From_int, 0, 1, 1) < 0)) <span class='error_goto'>__PYX_ERR(0, 92, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; +</pre><pre class="cython line score-19" onclick='toggleDiv(this)'>+<span class="">093</span>: stride = stride * array_shape[i]</pre> +<pre class='cython code score-19 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_stride);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_array_shape, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 93, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + __pyx_t_7 = <span class='py_c_api'>PyNumber_Multiply</span>(__pyx_t_1, __pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 93, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_7); if (unlikely((__pyx_t_4 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 93, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_stride = __pyx_t_4; + } +</pre><pre class="cython line score-6" onclick='toggleDiv(this)'>+<span class="">094</span>: self._t_strides = tuple(self._t_strides)</pre> +<pre class='cython code score-6 '> __pyx_t_7 = <span class='py_c_api'>PySequence_Tuple</span>(__pyx_v_self->_t_strides);<span class='error_goto'> if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 94, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_7); + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_v_self->_t_strides); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_v_self->_t_strides); + __pyx_v_self->_t_strides = __pyx_t_7; + __pyx_t_7 = 0; + } + __pyx_L5:; +</pre><pre class="cython line score-0"> <span class="">095</span>: # Populate the C array interface</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">096</span>: self.inter = self._get_array_interface()</pre> +<pre class='cython code score-0 '> __pyx_v_self->inter = ((struct __pyx_vtabstruct_6numind_NumInd *)__pyx_v_self->__pyx_vtab)->_get_array_interface(__pyx_v_self); +</pre><pre class="cython line score-0"> <span class="">097</span>: </pre> +<pre class="cython line score-0"> <span class="">098</span>: # Properties. This are visible from Python space.</pre> +<pre class="cython line score-0"> <span class="">099</span>: # Add as many as you want.</pre> +<pre class="cython line score-0"> <span class="">100</span>: </pre> +<pre class="cython line score-0"> <span class="">101</span>: property undarray: # Returns the underlying array</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">102</span>: def __get__(self):</pre> +<pre class='cython code score-0 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8undarray_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8undarray_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8undarray___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8undarray___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">103</span>: return self._undarray</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_self->_undarray); + __pyx_r = __pyx_v_self->_undarray; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">104</span>: </pre> +<pre class="cython line score-0"> <span class="">105</span>: property shape:</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">106</span>: def __get__(self):</pre> +<pre class='cython code score-0 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_5shape_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_5shape___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_5shape___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">107</span>: return self._t_shape</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_self->_t_shape); + __pyx_r = __pyx_v_self->_t_shape; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">108</span>: </pre> +<pre class="cython line score-0"> <span class="">109</span>: property strides:</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">110</span>: def __get__(self):</pre> +<pre class='cython code score-0 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_7strides_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_7strides___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_7strides___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">111</span>: return self._t_strides</pre> +<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_self->_t_strides); + __pyx_r = __pyx_v_self->_t_strides; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">112</span>: </pre> +<pre class="cython line score-0"> <span class="">113</span>: property typestr:</pre> +<pre class="cython line score-4" onclick='toggleDiv(this)'>+<span class="">114</span>: def __get__(self):</pre> +<pre class='cython code score-4 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_7typestr_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_7typestr_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_7typestr___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_7typestr___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.typestr.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-9" onclick='toggleDiv(this)'>+<span class="">115</span>: return self._undarray.__array_interface__["typestr"]</pre> +<pre class='cython code score-9 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_self->_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 115, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, __pyx_n_s_typestr);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 115, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">116</span>: </pre> +<pre class="cython line score-0"> <span class="">117</span>: property typekind:</pre> +<pre class="cython line score-4" onclick='toggleDiv(this)'>+<span class="">118</span>: def __get__(self):</pre> +<pre class='cython code score-4 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8typekind_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8typekind_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8typekind___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8typekind___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.typekind.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-12" onclick='toggleDiv(this)'>+<span class="">119</span>: return chr(self.inter.typekind)</pre> +<pre class='cython code score-12 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_char</span>(__pyx_v_self->inter->typekind);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 119, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); + <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_chr, __pyx_t_2, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">120</span>: </pre> +<pre class="cython line score-0"> <span class="">121</span>: property readonly:</pre> +<pre class="cython line score-4" onclick='toggleDiv(this)'>+<span class="">122</span>: def __get__(self):</pre> +<pre class='cython code score-4 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_8readonly_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_8readonly_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_8readonly___get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_8readonly___get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.readonly.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-12" onclick='toggleDiv(this)'>+<span class="">123</span>: return self._undarray.__array_interface__["data"][1]</pre> +<pre class='cython code score-12 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_self->_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, __pyx_n_s_data);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">124</span>: </pre> +<pre class="cython line score-0"> <span class="">125</span>: property __array_struct__:</pre> +<pre class="cython line score-0"> <span class="">126</span>: "Allows other numerical packages to obtain a new object."</pre> +<pre class="cython line score-3" onclick='toggleDiv(this)'>+<span class="">127</span>: def __get__(self):</pre> +<pre class='cython code score-3 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_16__array_struct___1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_6numind_6NumInd_16__array_struct___1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_16__array_struct_____get__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_16__array_struct_____get__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__get__", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.__array_struct__.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-4" onclick='toggleDiv(this)'>+<span class="">128</span>: if hasattr(self._undarray, "__array_struct__"):</pre> +<pre class='cython code score-4 '> __pyx_t_1 = __pyx_v_self->_undarray; + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_HasAttr</span>(__pyx_t_1, __pyx_n_s_array_struct);<span class='error_goto'> if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 128, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { +/* … */ + } +</pre><pre class="cython line score-3" onclick='toggleDiv(this)'>+<span class="">129</span>: return self._undarray.__array_struct__</pre> +<pre class='cython code score-3 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_self->_undarray, __pyx_n_s_array_struct);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">130</span>: else:</pre> +<pre class="cython line score-0"> <span class="">131</span>: # No an underlying array with __array_struct__</pre> +<pre class="cython line score-0"> <span class="">132</span>: # Deliver an equivalent PyCObject.</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">133</span>: Py_INCREF(self)</pre> +<pre class='cython code score-0 '> /*else*/ { + Py_INCREF(((PyObject *)__pyx_v_self)); +</pre><pre class="cython line score-6" onclick='toggleDiv(this)'>+<span class="">134</span>: return PyCapsule_New(<void*>self.inter,</pre> +<pre class='cython code score-6 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r); +/* … */ + __pyx_t_1 = <span class='py_c_api'>PyCapsule_New</span>(((void *)__pyx_v_self->inter), ((char *)"struct array"), ((PyCapsule_Destructor)__pyx_f_6numind_free_array_interface));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 134, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + } +</pre><pre class="cython line score-0"> <span class="">135</span>: "struct array",</pre> +<pre class="cython line score-0"> <span class="">136</span>: <PyCapsule_Destructor>free_array_interface)</pre> +<pre class="cython line score-0"> <span class="">137</span>: </pre> +<pre class="cython line score-9" onclick='toggleDiv(this)'>+<span class="">138</span>: cdef PyArrayInterface *_get_array_interface(self):</pre> +<pre class='cython code score-9 '>static __pyx_t_6numind_PyArrayInterface *__pyx_f_6numind_6NumInd__get_array_interface(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + __pyx_t_6numind_PyArrayInterface *__pyx_v_inter; + PyObject *__pyx_v_undarray = 0; + PyObject *__pyx_v_data_address = 0; + PyObject *__pyx_v_typestr = 0; + PyObject *__pyx_v_obj = 0; + __pyx_t_6numind_PyArrayInterface *__pyx_r; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("_get_array_interface", 0); +/* … */ + /* function exit code */ + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6); + <span class='pyx_c_api'>__Pyx_WriteUnraisable</span>("numind.NumInd._get_array_interface", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __pyx_r = 0; + __pyx_L0:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_undarray); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_data_address); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_typestr); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_obj); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-0"> <span class="">139</span>: "Populates the array interface"</pre> +<pre class="cython line score-0"> <span class="">140</span>: cdef PyArrayInterface *inter</pre> +<pre class="cython line score-0"> <span class="">141</span>: cdef object undarray, data_address, typestr</pre> +<pre class="cython line score-0"> <span class="">142</span>: cdef object obj</pre> +<pre class="cython line score-0"> <span class="">143</span>: </pre> +<pre class="cython line score-1" onclick='toggleDiv(this)'>+<span class="">144</span>: undarray = self._undarray</pre> +<pre class='cython code score-1 '> __pyx_t_1 = __pyx_v_self->_undarray; + <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_1); + __pyx_v_undarray = __pyx_t_1; + __pyx_t_1 = 0; +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">145</span>: typestr = self.typestr</pre> +<pre class='cython code score-2 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_self), __pyx_n_s_typestr);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_v_typestr = __pyx_t_1; + __pyx_t_1 = 0; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">146</span>: inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface))</pre> +<pre class='cython code score-0 '> __pyx_v_inter = ((__pyx_t_6numind_PyArrayInterface *)malloc((sizeof(__pyx_t_6numind_PyArrayInterface)))); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">147</span>: if inter is NULL:</pre> +<pre class='cython code score-0 '> __pyx_t_2 = ((__pyx_v_inter == NULL) != 0); + if (__pyx_t_2) { +/* … */ + } +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">148</span>: raise MemoryError()</pre> +<pre class='cython code score-5 '> <span class='py_c_api'>PyErr_NoMemory</span>(); <span class='error_goto'>__PYX_ERR(0, 148, __pyx_L1_error)</span> +</pre><pre class="cython line score-0"> <span class="">149</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">150</span>: inter.version = 2</pre> +<pre class='cython code score-0 '> __pyx_v_inter->version = 2; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">151</span>: inter.nd = self._nd</pre> +<pre class='cython code score-0 '> __pyx_t_3 = __pyx_v_self->_nd; + __pyx_v_inter->nd = __pyx_t_3; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">152</span>: inter.typekind = ord(typestr[1])</pre> +<pre class='cython code score-5 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_typestr, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_Ord</span>(__pyx_t_1);<span class='error_goto'> if (unlikely(__pyx_t_4 == (long)(Py_UCS4)-1)) __PYX_ERR(0, 152, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_inter->typekind = __pyx_t_4; +</pre><pre class="cython line score-18" onclick='toggleDiv(this)'>+<span class="">153</span>: inter.itemsize = int(typestr[2:])</pre> +<pre class='cython code score-18 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetSlice</span>(__pyx_v_typestr, 2, 0, NULL, NULL, &__pyx_slice__2, 1, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyNumber_Int</span>(__pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 153, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 153, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_inter->itemsize = __pyx_t_3; +/* … */ + __pyx_slice__2 = <span class='py_c_api'>PySlice_New</span>(__pyx_int_2, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_slice__2)) __PYX_ERR(0, 153, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_slice__2); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_slice__2); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">154</span>: inter.flags = 0 # initialize flags</pre> +<pre class='cython code score-0 '> __pyx_v_inter->flags = 0; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">155</span>: if typestr[0] == '|':</pre> +<pre class='cython code score-5 '> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_typestr, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 155, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + __pyx_t_2 = (<span class='pyx_c_api'>__Pyx_PyString_Equals</span>(__pyx_t_5, __pyx_kp_s__3, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) <span class='error_goto'>__PYX_ERR(0, 155, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_2) { +/* … */ + goto __pyx_L4; + } +</pre><pre class="cython line score-19" onclick='toggleDiv(this)'>+<span class="">156</span>: inter.flags = inter.flags | NOTSWAPPED</pre> +<pre class='cython code score-19 '> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_inter->flags);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 156, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_NOTSWAPPED);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_6 = <span class='py_c_api'>PyNumber_Or</span>(__pyx_t_5, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 156, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_6); if (unlikely((__pyx_t_3 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 156, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_inter->flags = __pyx_t_3; +</pre><pre class="cython line score-26" onclick='toggleDiv(this)'>+<span class="">157</span>: elif byteorder[typestr[0]] == sys.byteorder:</pre> +<pre class='cython code score-26 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_byteorder);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_typestr, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_5 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_6, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_sys);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_byteorder);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_5, __pyx_t_6, Py_EQ); <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) <span class='error_goto'>__PYX_ERR(0, 157, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { +/* … */ + } + __pyx_L4:; +</pre><pre class="cython line score-19" onclick='toggleDiv(this)'>+<span class="">158</span>: inter.flags = inter.flags | NOTSWAPPED</pre> +<pre class='cython code score-19 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_inter->flags);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 158, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_NOTSWAPPED);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 158, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + __pyx_t_5 = <span class='py_c_api'>PyNumber_Or</span>(__pyx_t_1, __pyx_t_6);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 158, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 158, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_inter->flags = __pyx_t_3; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">159</span>: if not self.readonly:</pre> +<pre class='cython code score-5 '> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_self), __pyx_n_s_readonly);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 159, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) <span class='error_goto'>__PYX_ERR(0, 159, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_7 = ((!__pyx_t_2) != 0); + if (__pyx_t_7) { +/* … */ + } +</pre><pre class="cython line score-19" onclick='toggleDiv(this)'>+<span class="">160</span>: inter.flags = inter.flags | WRITEABLE</pre> +<pre class='cython code score-19 '> __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_inter->flags);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 160, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5); + __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_WRITEABLE);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 160, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + __pyx_t_1 = <span class='py_c_api'>PyNumber_Or</span>(__pyx_t_5, __pyx_t_6);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0; + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 160, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_inter->flags = __pyx_t_3; +</pre><pre class="cython line score-0"> <span class="">161</span>: # XXX how to determine the ALIGNED flag?</pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">162</span>: inter.strides = self._strides</pre> +<pre class='cython code score-0 '> __pyx_t_8 = __pyx_v_self->_strides; + __pyx_v_inter->strides = __pyx_t_8; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">163</span>: inter.shape = self._shape</pre> +<pre class='cython code score-0 '> __pyx_t_8 = __pyx_v_self->_shape; + __pyx_v_inter->shape = __pyx_t_8; +</pre><pre class="cython line score-0"> <span class="">164</span>: # Get the data address</pre> +<pre class="cython line score-8" onclick='toggleDiv(this)'>+<span class="">165</span>: obj = undarray.__array_interface__["data"]</pre> +<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_undarray, __pyx_n_s_array_interface);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_6 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, __pyx_n_s_data);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 165, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_obj = __pyx_t_6; + __pyx_t_6 = 0; +</pre><pre class="cython line score-2" onclick='toggleDiv(this)'>+<span class="">166</span>: data_address = obj[0]</pre> +<pre class='cython code score-2 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_obj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 166, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6); + __pyx_v_data_address = __pyx_t_6; + __pyx_t_6 = 0; +</pre><pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">167</span>: inter.data = <void*>PyInt_AsLong(data_address)</pre> +<pre class='cython code score-5 '> __pyx_v_inter->data = ((void *)<span class='py_c_api'>PyInt_AsLong</span>(__pyx_v_data_address)); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">168</span>: return inter</pre> +<pre class='cython code score-0 '> __pyx_r = __pyx_v_inter; + goto __pyx_L0; +</pre><pre class="cython line score-0"> <span class="">169</span>: </pre> +<pre class="cython line score-0"> <span class="">170</span>: </pre> +<pre class="cython line score-0"> <span class="">171</span>: # This is just an example on how to modify the data in C space</pre> +<pre class="cython line score-0"> <span class="">172</span>: # (and at C speed! :-)</pre> +<pre class="cython line score-5" onclick='toggleDiv(this)'>+<span class="">173</span>: def modify(self):</pre> +<pre class='cython code score-5 '>/* Python wrapper */ +static PyObject *__pyx_pw_6numind_6NumInd_3modify(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_6numind_6NumInd_2modify[] = "Modify the values of the underlying array"; +static PyObject *__pyx_pw_6numind_6NumInd_3modify(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("modify (wrapper)", 0); + __pyx_r = __pyx_pf_6numind_6NumInd_2modify(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6numind_6NumInd_2modify(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + long *__pyx_v_ldata; + double *__pyx_v_fdata; + int __pyx_v_i; + PyObject *__pyx_r = NULL; + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("modify", 0); +/* … */ + /* function exit code */ + __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); + <span class='pyx_c_api'>__Pyx_AddTraceback</span>("numind.NumInd.modify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r); + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); + return __pyx_r; +} +</pre><pre class="cython line score-0"> <span class="">174</span>: "Modify the values of the underlying array"</pre> +<pre class="cython line score-0"> <span class="">175</span>: cdef long *ldata</pre> +<pre class="cython line score-0"> <span class="">176</span>: cdef double *fdata</pre> +<pre class="cython line score-0"> <span class="">177</span>: cdef int i</pre> +<pre class="cython line score-0"> <span class="">178</span>: </pre> +<pre class="cython line score-0"> <span class="">179</span>: # Modify just the first row</pre> +<pre class="cython line score-14" onclick='toggleDiv(this)'>+<span class="">180</span>: if chr(self.inter.typekind) == 'i':</pre> +<pre class='cython code score-14 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_char</span>(__pyx_v_self->inter->typekind);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 180, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 180, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); + <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_chr, __pyx_t_2, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 180, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_3 = (<span class='pyx_c_api'>__Pyx_PyString_Equals</span>(__pyx_t_1, __pyx_n_s_i, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) <span class='error_goto'>__PYX_ERR(0, 180, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_3) { +/* … */ + goto __pyx_L3; + } +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">181</span>: ldata = <long *>self.inter.data</pre> +<pre class='cython code score-0 '> __pyx_v_ldata = ((long *)__pyx_v_self->inter->data); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">182</span>: for i from 0 <= i < self.inter.shape[self.inter.nd-1]:</pre> +<pre class='cython code score-0 '> __pyx_t_4 = (__pyx_v_self->inter->shape[(__pyx_v_self->inter->nd - 1)]); + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">183</span>: ldata[i] = ldata[i] + 1</pre> +<pre class='cython code score-0 '> (__pyx_v_ldata[__pyx_v_i]) = ((__pyx_v_ldata[__pyx_v_i]) + 1); + } +</pre><pre class="cython line score-14" onclick='toggleDiv(this)'>+<span class="">184</span>: elif chr(self.inter.typekind) == 'f':</pre> +<pre class='cython code score-14 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_char</span>(__pyx_v_self->inter->typekind);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 184, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2); + <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); + <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_chr, __pyx_t_2, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error)</span> + <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1); + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_3 = (<span class='pyx_c_api'>__Pyx_PyString_Equals</span>(__pyx_t_1, __pyx_n_s_f, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) <span class='error_goto'>__PYX_ERR(0, 184, __pyx_L1_error)</span> + <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_3) { +/* … */ + } + __pyx_L3:; +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">185</span>: fdata = <double *>self.inter.data</pre> +<pre class='cython code score-0 '> __pyx_v_fdata = ((double *)__pyx_v_self->inter->data); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">186</span>: for i from 0 <= i < self.inter.shape[self.inter.nd-1]:</pre> +<pre class='cython code score-0 '> __pyx_t_4 = (__pyx_v_self->inter->shape[(__pyx_v_self->inter->nd - 1)]); + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) { +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">187</span>: fdata[i] = fdata[i] + 1</pre> +<pre class='cython code score-0 '> (__pyx_v_fdata[__pyx_v_i]) = ((__pyx_v_fdata[__pyx_v_i]) + 1.0); + } +</pre><pre class="cython line score-0"> <span class="">188</span>: </pre> +<pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">189</span>: def __dealloc__(self):</pre> +<pre class='cython code score-0 '>/* Python wrapper */ +static void __pyx_pw_6numind_6NumInd_5__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_6numind_6NumInd_5__dealloc__(PyObject *__pyx_v_self) { + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__dealloc__ (wrapper)", 0); + __pyx_pf_6numind_6NumInd_4__dealloc__(((struct __pyx_obj_6numind_NumInd *)__pyx_v_self)); + + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); +} + +static void __pyx_pf_6numind_6NumInd_4__dealloc__(struct __pyx_obj_6numind_NumInd *__pyx_v_self) { + <span class='refnanny'>__Pyx_RefNannyDeclarations</span> + <span class='refnanny'>__Pyx_RefNannySetupContext</span>("__dealloc__", 0); +/* … */ + /* function exit code */ + <span class='refnanny'>__Pyx_RefNannyFinishContext</span>(); +} +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">190</span>: free(self._shape)</pre> +<pre class='cython code score-0 '> free(__pyx_v_self->_shape); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">191</span>: free(self._strides)</pre> +<pre class='cython code score-0 '> free(__pyx_v_self->_strides); +</pre><pre class="cython line score-0" onclick='toggleDiv(this)'>+<span class="">192</span>: free(self.inter)</pre> +<pre class='cython code score-0 '> free(__pyx_v_self->inter); +</pre></div></body></html> diff --git a/pymolfile/molfile/signedintbuf-cython/numind.pyx b/pymolfile/molfile/signedintbuf-cython/numind.pyx new file mode 100644 index 0000000..4e9aa81 --- /dev/null +++ b/pymolfile/molfile/signedintbuf-cython/numind.pyx @@ -0,0 +1,268 @@ +# This Pyrex extension class can take a numpy/numarray/Numeric object +# as a parameter and wrap it so that its information can be accessed +# in a standard way, both in Python space and C space. +# +# Heavily based on an idea of Andrew Straw. See +# http://www.scipy.org/Cookbook/ArrayStruct_and_Pyrex +# Very inspiring! :-) +# +# First version: 2006-03-25 +# Last update: 2006-03-25 +# Author: Francesc Altet + +import sys +from cpython.pycapsule cimport * + +cdef extern from "Python.h": + ctypedef int Py_intptr_t + ctypedef object PyObject + long PyInt_AsLong(object) + void Py_INCREF(object) + void Py_DECREF(object) + +cdef extern from "stdlib.h": + ctypedef long size_t + ctypedef long intptr_t + void *malloc(size_t size) + void free(void* ptr) + +cdef extern from "string.h": + int strncmp(const char *str1, const char *str2, size_t n) + +cdef extern from "vmdplugin.h": + ctypedef struct vmdplugin_t + ctypedef int (*vmdplugin_register_cb)(void *, vmdplugin_t *); + +cdef extern from "molfile_plugin.h": + ctypedef struct molfile_atom_t + ctypedef struct molfile_timestep_t + ctypedef struct molfile_plugin_t + +cdef extern from "libmolfile_plugin.h": + MOLFILE_INIT_ALL() + MOLFILE_REGISTER_ALL(void* , vmdplugin_register_cb) + MOLFILE_FINI_ALL() + +# for PyArrayInterface: +CONTIGUOUS=0x01 +FORTRAN=0x02 +ALIGNED=0x100 +NOTSWAPPED=0x200 +WRITEABLE=0x400 + +# for VMDPLUGIN +VMDPLUGIN_SUCCESS=0 +VMDPLUGIN_ERROR=-1 +vmdplugin_ABIVERSION=17 +MAXPLUGINS=200 + +# byteorder dictionary +byteorder = {'<':'little', '>':'big'} + +cdef int numplugins = 0 +cdef (molfile_plugin_t*) plugin_list = NULL + +ctypedef struct PyArrayInterface: + int version # contains the integer 2 as a sanity check + int nd # number of dimensions + char typekind # kind in array --- character code of typestr + int itemsize # size of each element + int flags # flags indicating how the data should be interpreted + Py_intptr_t *shape # A length-nd array of shape information + Py_intptr_t *strides # A length-nd array of stride information + void *data # A pointer to the first element of the array + +ctypedef struct MolObject: + molfile_plugin_t* plugin + void* file_handle + int natoms + +cdef void* free_array_interface(object arr): + Py_DECREF(arr) + +cdef molfile_plugin_t* get_plugin(molfile_plugin_t** plug_list, int plug_no): + cdef molfile_plugin_t* plugin; + if(plug_no < 0): + plugin = NULL + else: + plugin = plug_list[plug_no] + return plugin + +cdef int molfile_register(void* ptr, vmdplugin_t *plugin): + global numplugins, plugin_list + if (plugin.type is NULL or + plugin.name is NULL or + plugin.author is NULL): + return VMDPLUGIN_ERROR + elif plugin.abiversion != vmdplugin_ABIVERSION: + return VMDPLUGIN_ERROR + elif 0 != strncmp(plugin.type, "mol file", 8): + return VMDPLUGIN_ERROR + elif numplugins >= MAXPLUGINS: + return VMDPLUGIN_ERROR + + plugin_list[numplugins] = <molfile_plugin_t *> plugin + numplugins = numplugins + 1 + return VMDPLUGIN_SUCCESS + +cdef molfile_plugin_t** molfile_plugin_list(int maxsize): + global numplugins, plugin_list + if maxsize < MAXPLUGINS: + maxsize = MAXPLUGINS + plugin_list = <molfile_plugin_t**>malloc(sizeof(molfile_plugin_t*)*maxsize) + return plugin_list + +cdef int molfile_init(void): + global numplugins, plugin_list + MOLFILE_INIT_ALL + MOLFILE_REGISTER_ALL(NULL,molfile_register) + return numplugins + +cdef int molfile_finish(void): + MOLFILE_FINI_ALL + return 0 + +cdef class NumCy: + cdef void *data + cdef int _nd + cdef Py_intptr_t *_shape + cdef Py_intptr_t *_strides + cdef PyArrayInterface *inter + cdef MolObject *plugin_handle + cdef object _t_shape, _t_strides, _undarray + + def __init__(self): + cdef int i, stride + cdef object array_shape, array_strides + cdef molfile_plugin_t *plugin; + cdef void *file_handle; + + # Initialize available VMD molfile plugins + + + # Keep a reference to the underlying object + self.plugin_handle = molpack; + self._undarray = undarray + # Get the shape and strides C arrays + array_shape = undarray.__array_interface__["shape"] + self._t_shape = array_shape + # The number of dimensions + self._nd = len(array_shape) + # The shape + self._shape = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + for i from 0 <= i < self._nd: + self._shape[i] = self._t_shape[i] + # The strides (compute them if needed) + array_strides = undarray.__array_interface__["strides"] + self._t_strides = array_strides + self._strides = <Py_intptr_t *>malloc(self._nd*sizeof(Py_intptr_t)) + if array_strides: + for i from 0 <= i < self._nd: + self._strides[i] = array_strides[i] + else: + # strides is None. Compute them explicitely. + self._t_strides = [0] * self._nd + stride = int(self.typestr[2:]) + for i from self._nd > i >= 0: + self._strides[i] = stride + self._t_strides[i] = stride + stride = stride * array_shape[i] + self._t_strides = tuple(self._t_strides) + # Populate the C array interface + self.inter = self._get_array_interface() + + # Properties. This are visible from Python space. + # Add as many as you want. + + property undarray: # Returns the underlying array + def __get__(self): + return self._undarray + + property shape: + def __get__(self): + return self._t_shape + + property strides: + def __get__(self): + return self._t_strides + + property typestr: + def __get__(self): + return self._undarray.__array_interface__["typestr"] + + property typekind: + def __get__(self): + return chr(self.inter.typekind) + + property readonly: + def __get__(self): + return self._undarray.__array_interface__["data"][1] + + property __array_struct__: + "Allows other numerical packages to obtain a new object." + def __get__(self): + if hasattr(self._undarray, "__array_struct__"): + return self._undarray.__array_struct__ + else: + # No an underlying array with __array_struct__ + # Deliver an equivalent PyCObject. + Py_INCREF(self) + return PyCapsule_New(<void*>self.inter, + "struct array", + <PyCapsule_Destructor>free_array_interface) + + cdef PyArrayInterface *_get_array_interface(self): + "Populates the array interface" + cdef PyArrayInterface *inter + cdef object undarray, data_address, typestr + cdef object obj + + undarray = self._undarray + typestr = self.typestr + inter = <PyArrayInterface *>malloc(sizeof(PyArrayInterface)) + if inter is NULL: + raise MemoryError() + + inter.version = 2 + inter.nd = self._nd + inter.typekind = ord(typestr[1]) + inter.itemsize = int(typestr[2:]) + inter.flags = 0 # initialize flags + if typestr[0] == '|': + inter.flags = inter.flags | NOTSWAPPED + elif byteorder[typestr[0]] == sys.byteorder: + inter.flags = inter.flags | NOTSWAPPED + if not self.readonly: + inter.flags = inter.flags | WRITEABLE + # XXX how to determine the ALIGNED flag? + inter.strides = self._strides + inter.shape = self._shape + # Get the data address + obj = undarray.__array_interface__["data"] + data_address = obj[0] + inter.data = <void*>PyInt_AsLong(data_address) + return inter + + + # This is just an example on how to modify the data in C space + # (and at C speed! :-) + def modify(self): + "Modify the values of the underlying array" + cdef long *ldata + cdef double *fdata + cdef int i + + # Modify just the first row + if chr(self.inter.typekind) == 'i': + ldata = <long *>self.inter.data + for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + ldata[i] = ldata[i] + 1 + elif chr(self.inter.typekind) == 'f': + fdata = <double *>self.inter.data + for i from 0 <= i < self.inter.shape[self.inter.nd-1]: + fdata[i] = fdata[i] + 1 + + def __dealloc__(self): + free(self._shape) + free(self._strides) + free(self.inter) diff --git a/pymolfile/molfile/signedintbuf-cython/numind.so b/pymolfile/molfile/signedintbuf-cython/numind.so new file mode 100755 index 0000000000000000000000000000000000000000..f8b762476eb1d362018f305fce67cf22ec134e2f GIT binary patch literal 78632 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 literal 0 HcmV?d00001 diff --git a/pymolfile/molfile/signedintbuf-cython/test_numpy_swig.py b/pymolfile/molfile/signedintbuf-cython/test_numpy_swig.py new file mode 100644 index 0000000..d53a1b1 --- /dev/null +++ b/pymolfile/molfile/signedintbuf-cython/test_numpy_swig.py @@ -0,0 +1,42 @@ +import numpy +import ctypes +import numind + +# Create an arbitrary object for each package +np=numpy.arange(12, dtype=numpy.float) +#np=numpy.arange(12) +np.shape = (4,3) + +#ns = _numpy_swig(2,2) +#print(ns) + + +# Wrap the different objects with the NumInd class +# and execute some actions on it +##for obj in [np]: +# ni = _numpy_swig +# print("original object type-->", type(ni.inter)) +# # Print some values +# #print("typestr --> {0}", ni.typestr) +# #print("shape --> {0}", ni.shape) +# #print("strides --> {0}", ni.strides) +# npa = numpy.asarray(ni) +# print("object after a numpy re-wrapping --> " , npa) +# #ni.modify() +# #print("object after modification in C space --> {0}", npa) + +# Wrap the different objects with the NumInd class +# and execute some actions on it +for obj in [np]: + ni = numind.NumInd(obj) + print("original object type-->", type(ni.undarray)) + # Print some values + print("typestr -->", ni.typestr) + print("typekind -->", ni.typekind) + print("shape -->", ni.shape) + print("strides -->", ni.strides) + npa = numpy.asarray(ni) + print("object after a numpy re-wrapping -->", npa) + ni.modify() + print("object after modification in C space -->", npa) + diff --git a/pymolfile/molfile/test-backup.py b/pymolfile/molfile/test-backup.py new file mode 100644 index 0000000..5490a05 --- /dev/null +++ b/pymolfile/molfile/test-backup.py @@ -0,0 +1,153 @@ +import numpy +import ctypes +import _libpymolfile + +class molatom_t(ctypes.Structure): + _fields_ = [ + ('name', ctypes.c_char * 16), + ('type', ctypes.c_char * 16), + ('resname', ctypes.c_char * 8), + ('resid', ctypes.c_uint8), + ('segid', ctypes.c_char * 8), + ('chain', ctypes.c_char * 2), + ('altloc', ctypes.c_char * 2), + ('insertion', ctypes.c_char *2), + ('occupancy', ctypes.c_float), + ('bfactor', ctypes.c_float), + ('mass', ctypes.c_float), + ('charge', ctypes.c_float), + ('radius', ctypes.c_float), + ('atomicnumber', ctypes.c_uint8), + ('ctnumber', ctypes.c_uint8), + ] + +class molplugin_t(ctypes.Structure): + _fields_ = [ + ('abiversion', ctypes.c_uint8), + ('type', ctypes.c_char_p), + ('name', ctypes.c_char_p), + ('prettyname', ctypes.c_char_p), + ('author', ctypes.c_char_p), + ('majorv', ctypes.c_uint8), + ('minorv', ctypes.c_uint8), + ('is_reentrant', ctypes.c_uint8), + ('filename_extension', ctypes.c_char_p), + ('open_file_read', ctypes.CFUNCTYPE(ctypes.c_char_p, + ctypes.c_char_p, ctypes.POINTER(ctypes.c_uint8))), + ('read_structure', ctypes.CFUNCTYPE(ctypes.c_void_p, + ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(molatom_t))), + ('read_bonds', ctypes.CFUNCTYPE(ctypes.c_void_p, + ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint), + ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint), + ctypes.c_char_p)), + ('read_next_timestep', ctypes.c_int8), + ('close_file_read', ctypes.c_void_p), + ('open_file_write', ctypes.c_void_p), + ('write_structure', ctypes.c_int8), + ('write_timestep', ctypes.c_int8), + ('close_file_write', ctypes.c_void_p), + ('read_volumetric_metadata', ctypes.c_int8), + ('read_volumetric_data', ctypes.c_int8), + ('read_volumetric_data_ex', ctypes.c_int8), + ('read_rawgraphics', ctypes.c_int8), + ('read_molecule_metadata', ctypes.c_int8), + ('write_bonds', ctypes.c_int8), + ('write_volumetric_data', ctypes.c_int8), + ('write_volumetric_data_ex', ctypes.c_int8), + ('read_angles', ctypes.c_int8), + ('write_angles', ctypes.c_int8), + ('read_qm_metadata', ctypes.c_int8), + ('read_qm_rundata', ctypes.c_int8), + ('read_timestep', ctypes.c_int8), + ('read_timestep_metadata', ctypes.c_int8), + ('read_qm_timestep_metadata', ctypes.c_int8), + ('read_timestep2', ctypes.c_int8), + ('read_times', ctypes.c_ssize_t), + ('cons_fputs', ctypes.c_uint8) + ] + +class moltimestep_t(ctypes.Structure): + _fields_ = [ + ('coords', ctypes.POINTER(ctypes.c_float)), + ('velocities', ctypes.POINTER(ctypes.c_float)), + ('A', ctypes.c_float), + ('B', ctypes.c_float), + ('C', ctypes.c_float), + ('alpha', ctypes.c_float), + ('beta', ctypes.c_float), + ('gamma', ctypes.c_float), + ('physical_time', ctypes.c_double), + ('total_energy', ctypes.c_double), + ('potential_energy', ctypes.c_double), + ('kinetic_energy', ctypes.c_double), + ('extended_energy', ctypes.c_double), + ('force_energy', ctypes.c_double), + ('total_pressure', ctypes.c_double) + ] + +class molhandle_t(ctypes.Structure): + _fields_ = [ + ('plugin', ctypes.POINTER(molplugin_t)), + ('file_handle', ctypes.c_void_p), + ('natoms', ctypes.c_int) + ] + +class molnatoms(ctypes.Structure): + _fields_ = [ + ('natoms', ctypes.c_int) + ] + +#callback_t = ctypes.CFUNCTYPE(None, ctypes.POINTER(molatom_t)) + +def get_open_file_read(output): + ctypes.open_file_read.restype = ctypes.POINTER(molhandle_t) + ctypes.open_file_read.argtypes = [ctypes.POINTER(molplugin_t), ctypes.c_void_p, ctypes.c_uint8] + return ctypes.pythonapi.PyCapsule_GetPointer(output, "plugin") + +def get_capsule(capsule): + ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.c_void_p + ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object, ctypes.c_char_p] + return ctypes.pythonapi.PyCapsule_GetPointer(capsule, b"plugin") + +def get_plugincapsule(capsule): + data = ctypes.POINTER(molhandle_t) + ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.POINTER(molhandle_t) + ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object, ctypes.c_char_p] + data = ctypes.pythonapi.PyCapsule_GetPointer(capsule, b"plugin") + return data + +def get_plugindata(capsule): + data = ctypes.POINTER(molhandle_t) + ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.POINTER(molhandle_t) + ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object, ctypes.c_char_p] + data = ctypes.pythonapi.PyCapsule_GetPointer(capsule, b"plugin") + return data + +mylib = _libpymolfile +mylist = mylib.molfile_plugin_list(200) +numlist = mylib.molfile_init() +print(numlist) +for i in range(numlist): + testplugin = mylib.molfile_plugin_info(mylist, i) + print(i, testplugin) + +plugin = mylib.get_plugin(mylist, 81) +print(plugin) +natoms=0 +numatoms=molnatoms(natoms) +fname="../../test/md.gro" +ftype="gro" + +pluginhandle = mylib.open_file_read(plugin, fname, ftype, natoms) +print("This passed") +print(pluginhandle) +print("This passed too") +print(pluginhandle.natoms) +print("Here") +outarray = mylib.get_structure(pluginhandle) +print(outarray) +#print(type(outarray)) +#for i in outarray: +# print(i) + + diff --git a/pymolfile/molfile/test.py b/pymolfile/molfile/test.py index afca74e..65c178d 100644 --- a/pymolfile/molfile/test.py +++ b/pymolfile/molfile/test.py @@ -131,12 +131,29 @@ for i in range(numlist): testplugin = mylib.molfile_plugin_info(mylist, i) print(i, testplugin) -plugin = mylib.get_plugin(mylist, 81) +#plugin = mylib.get_plugin(mylist, 99) #pdb +#plugin = mylib.get_plugin(mylist, 83) #trr +#plugin = mylib.get_plugin(mylist, 85) #xtc +plugin = mylib.get_plugin(mylist, 105) #psf +#plugin = mylib.get_plugin(mylist, 81) #gro +#plugin = mylib.get_plugin(mylist, 69) #dcd print(plugin) natoms=0 numatoms=molnatoms(natoms) -fname="../../test/md.gro" -ftype="gro" +#fname="../../test/DPDP.pdb" +#fname="../../test/md.gro" +#fname="../../test/ala3.dcd" +#fname="../../test/ala3.pdb" +fname="../../test/ala3.psf" +#fname="../../test/md.trr" +#fname="../../test/md.xtc" +#fname="../../test/md_1u19.xtc" +#ftype="pdb" +#ftype="trr" +#ftype="xtc" +ftype="psf" +#ftype="gro" +#ftype="dcd" pluginhandle = mylib.open_file_read(plugin, fname, ftype, natoms) print("This passed") @@ -144,8 +161,31 @@ print(pluginhandle) print("This passed too") print(pluginhandle.natoms) print("Here") -outarray = mylib.read_structure(pluginhandle) -print(outarray) + +x = numpy.array([ + ('C1','C','ACE',0,'','','','',1.0,1.0,12.011,6,1.0,6), + ('C2','C','ACE',0,'','','','',1.0,1.0,12.011,6,1.0,6) + ], + dtype=[ + ('name', 'S16'), ('type', 'S16'), ('resname', 'S8'), + ('resid', 'i4'), ('segid', 'S8'), ('chain', 'S2'), + ('altloc', 'S2'), ('insertion', 'S2'), ('occupancy', 'f8'), + ('bfactor', 'f8'), ('mass', 'f8'), ('charge', 'f8'), + ('radius', 'f8'), ('atomicnumber', 'i4') + ] + ) +print(x) +print(x.__array_interface__) +print(x.__array_interface__["descr"]) +print(x.__array_struct__) +y = mylib.read_fill_structure(pluginhandle, x) +#y = mylib.print_array_struct(x) +print(y) +print(len(y)) +print(y.__array_interface__) +print(y.__array_interface__["descr"]) +#outarray = mylib.get_structure(pluginhandle) +#print(outarray) #print(type(outarray)) #for i in outarray: # print(i) diff --git a/pymolfile/molfile/test_numpy_swig.py b/pymolfile/molfile/test_numpy_swig.py new file mode 100644 index 0000000..9ea2632 --- /dev/null +++ b/pymolfile/molfile/test_numpy_swig.py @@ -0,0 +1,46 @@ +import numpy +import ctypes +import _numpy_swig +#import numind + +ns = _numpy_swig + +# Create an arbitrary object for each package +np=numpy.arange(12) +np.shape = (4,3) + +newSIB = ns.new_SignedIntBuf(np.shape[0], np.shape[1]) +print(newSIB) +struct = ns.get__array_struct__(np) +print(struct) +ns.delete_SignedIntBuf(newSIB) + + +# Wrap the different objects with the NumInd class +# and execute some actions on it +#for obj in [np]: +# ni = _numpy_swig +# print("original object type-->", ni) +# # Print some values +# #print("typestr --> {0}", ni.typestr) +# #print("shape --> {0}", ni.shape) +# print("strides --> {0}", ni) +# npa = numpy.asarray(ni) +# print("object after a numpy re-wrapping --> " , npa) +# #ni.modify() +# #print("object after modification in C space --> {0}", npa) + +# Wrap the different objects with the NumInd class +# and execute some actions on it +#for obj in [np]: +# ni = numind.NumInd(obj) +# print("original object type-->", type(ni.undarray)) +# # Print some values +# print("typestr -->", ni.typestr) +# print("shape -->", ni.shape) +# print("strides -->", ni.strides) +# npa = numpy.asarray(ni) +# print("object after a numpy re-wrapping -->", npa) +# ni.modify() +# print("object after modification in C space -->", npa) + -- GitLab