123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113externalpyarray_of_bigarray:Py.Object.t->Py.Object.t->('a,'b,'c)Bigarray.Genarray.t->Py.Object.t="pyarray_of_bigarray_wrapper"externalbigarray_of_pyarray:Py.Object.t->Py.Object.t->('a,'b)Bigarray.kind*'cBigarray.layout*('a,'b,'c)Bigarray.Genarray.t="bigarray_of_pyarray_wrapper"letpyarray_subtype_ref=refNonelet()=Py.on_finalize(fun()->pyarray_subtype_ref:=None)letpyarray_subtype()=match!pyarray_subtype_refwithSomepyarray_subtype->pyarray_subtype|None->letpyarray_type=Py.Array.pyarray_type()inletpyarray_subtype=Py.Type.create"ocamlbigarray"[pyarray_type][("ocamlbigarray",Py.none)]inpyarray_subtype_ref:=Somepyarray_subtype;pyarray_subtypeletof_bigarraybigarray=letresult=pyarray_of_bigarray(Py.Array.numpy_api())(pyarray_subtype())bigarrayinletresult=Py.check_not_nullresultinletcapsule=Py.Capsule.unsafe_wrap_valuebigarrayinPy.Object.set_attr_stringresult"ocamlbigarray"capsule;result(* written with equalities to support OCaml pre-GADT *)letstring_of_kindkind=ifkind=Obj.magicBigarray.float32then"float32/NPY_FLOAT"elseifkind=Obj.magicBigarray.float64then"float64/NPY_DOUBLE"elseifkind=Obj.magicBigarray.int8_signedthen"int8_signed/NPY_BYTE"elseifkind=Obj.magicBigarray.int8_unsignedthen"int8_unsigned/NPY_UBYTE"elseifkind=Obj.magicBigarray.int16_signedthen"int16_signed/NPY_SHORT"elseifkind=Obj.magicBigarray.int16_unsignedthen"int16_unsigned/NPY_USHORT"elseifkind=Obj.magicBigarray.int32then"int32/NPY_INT"elseifkind=Obj.magicBigarray.int64then"int64/NPY_LONGLONG"elseifkind=Obj.magicBigarray.intthen"int"elseifkind=Obj.magicBigarray.nativeintthen"nativeint/NPY_LONG"elseifkind=Obj.magicBigarray.complex32then"complex32/NPY_CFLOAT"elseifkind=Obj.magicBigarray.complex64then"complex64/NPY_CDOUBLE"elseifkind=Obj.magicBigarray.charthen"char/NPY_CHAR"else"unknown kind"letstring_of_layoutlayout=iflayout=Obj.magicBigarray.c_layoutthen"C"elseiflayout=Obj.magicBigarray.fortran_layoutthen"Fortran"else"unknown layout"letto_bigarraykindlayoutt=ifnot(Py.Object.is_instancet(Py.Array.pyarray_type()))theninvalid_arg"Numpy.to_bigarray";letkind',layout',array=bigarray_of_pyarray(Py.Array.numpy_api())tinifkind<>kind'theninvalid_arg(Printf.sprintf"Numpy.to_bigarray: Numpy array has elements of kind %s, but to_bigarray expected %s"(string_of_kindkind')(string_of_kindkind));iflayout<>layout'theninvalid_arg(Printf.sprintf"Numpy.to_bigarray: Numpy array has %s layout, but to_bigarray expected %s"(string_of_layoutlayout')(string_of_layoutlayout));arraytype('a,'b,'c)to_bigarray={kind:('a,'b)Bigarray.kind;layout:'cBigarray.layout;array:('a,'b,'c)Bigarray.Genarray.t}type'rto_bigarray_k={f:'a'b'c.('a,'b,'c)to_bigarray->'r}letto_bigarray_k(k:'rto_bigarray_k)t:'r=ifnot(Py.Object.is_instancet(Py.Array.pyarray_type()))theninvalid_arg"Numpy.to_bigarray";letkind,layout,array=bigarray_of_pyarray(Py.Array.numpy_api())tink.f{kind;layout;array}externalcompare_kind:('a,'b)Bigarray.kind->('c,'d)Bigarray.kind->int="%compare"externalcompare_layout:'aBigarray.layout->'bBigarray.layout->int="%compare"letcheck_kind_and_layout(kind:('a,'b)Bigarray.kind)(layout:'cBigarray.layout)t:('a,'b,'c)Bigarray.Genarray.toption=ifcompare_kindkind(Bigarray.Genarray.kindt)=0&&compare_layoutlayout(Bigarray.Genarray.layoutt)=0thenSome(Obj.magict)elseNone