123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421(**************************************************************************)(* *)(* OCaml *)(* *)(* Manuel Serrano et Xavier Leroy, INRIA Rocquencourt *)(* *)(* Copyright 2000 Institut National de Recherche en Informatique et *)(* en Automatique. *)(* *)(* All rights reserved. This file is distributed under the terms of *)(* the GNU Lesser General Public License version 2.1, with the *)(* special exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)(* Module [Bigarray]: large, multi-dimensional, numerical arrays *)(* These types in must be kept in sync with the tables in
../typing/typeopt.ml *)typefloat16_elt=Float16_elttypefloat32_elt=Float32_elttypefloat64_elt=Float64_elttypeint8_signed_elt=Int8_signed_elttypeint8_unsigned_elt=Int8_unsigned_elttypeint16_signed_elt=Int16_signed_elttypeint16_unsigned_elt=Int16_unsigned_elttypeint32_elt=Int32_elttypeint64_elt=Int64_elttypeint_elt=Int_elttypenativeint_elt=Nativeint_elttypecomplex32_elt=Complex32_elttypecomplex64_elt=Complex64_elt(* Keep the order of these constructors in sync with the caml_ba_kind
enumeration in bigarray.h *)type('a,'b)kind=|Float32:(float,float32_elt)kind|Float64:(float,float64_elt)kind|Int8_signed:(int,int8_signed_elt)kind|Int8_unsigned:(int,int8_unsigned_elt)kind|Int16_signed:(int,int16_signed_elt)kind|Int16_unsigned:(int,int16_unsigned_elt)kind|Int32:(int32,int32_elt)kind|Int64:(int64,int64_elt)kind|Int:(int,int_elt)kind|Nativeint:(nativeint,nativeint_elt)kind|Complex32:(Complex.t,complex32_elt)kind|Complex64:(Complex.t,complex64_elt)kind|Char:(char,int8_unsigned_elt)kind|Float16:(float,float16_elt)kindtypec_layout=C_layout_typtypefortran_layout=Fortran_layout_typ(**)type'alayout=C_layout:c_layoutlayout|Fortran_layout:fortran_layoutlayoutletfloat16=Float16letfloat32=Float32letfloat64=Float64letint8_signed=Int8_signedletint8_unsigned=Int8_unsignedletint16_signed=Int16_signedletint16_unsigned=Int16_unsignedletint32=Int32letint64=Int64letint=Intletnativeint=Nativeintletcomplex32=Complex32letcomplex64=Complex64letchar=Charletkind_size_in_bytes:typeab.(a,b)kind->int=function|Float16->2|Float32->4|Float64->8|Int8_signed->1|Int8_unsigned->1|Int16_signed->2|Int16_unsigned->2|Int32->4|Int64->8|Int->Sys.word_size/8|Nativeint->Sys.word_size/8|Complex32->8|Complex64->16|Char->1(* Keep those constants in sync with the caml_ba_layout enumeration
in bigarray.h *)letc_layout=C_layoutletfortran_layout=Fortran_layoutmoduleGenarray=structtype(!'a,!'b,!'c)texternalcreate:('a,'b)kind->'clayout->intarray->('a,'b,'c)t="caml_ba_create"externalget:('a,'b,'c)t->intarray->'a="caml_ba_get_generic"externalset:('a,'b,'c)t->intarray->'a->unit="caml_ba_set_generic"letrecclooparridxfcolmax=ifcol=Array.lengthidxthensetarridx(fidx)elseforj=0topredmax.(col)doidx.(col)<-j;clooparridxf(succcol)maxdoneletrecflooparridxfcolmax=ifcol<0thensetarridx(fidx)elseforj=1tomax.(col)doidx.(col)<-j;flooparridxf(predcol)maxdoneletinit(typet)kind(layout:tlayout)dimsf=letarr=createkindlayoutdimsinletdlen=Array.lengthdimsinmatchlayoutwith|C_layout->clooparr(Array.makedlen0)f0dims;arr|Fortran_layout->flooparr(Array.makedlen1)f(preddlen)dims;arrexternalnum_dims:('a,'b,'c)t->int="caml_ba_num_dims"externalnth_dim:('a,'b,'c)t->int->int="caml_ba_dim"letdimsa=letn=num_dimsainletd=Array.maken0infori=0ton-1dod.(i)<-nth_dimaidone;dexternalkind:('a,'b,'c)t->('a,'b)kind="caml_ba_kind"externallayout:('a,'b,'c)t->'clayout="caml_ba_layout"externalchange_layout:('a,'b,'c)t->'dlayout->('a,'b,'d)t="caml_ba_change_layout"letsize_in_bytesarr=(kind_size_in_bytes(kindarr))*(Array.fold_left(*)1(dimsarr))externalsub_left:('a,'b,c_layout)t->int->int->('a,'b,c_layout)t="caml_ba_sub"externalsub_right:('a,'b,fortran_layout)t->int->int->('a,'b,fortran_layout)t="caml_ba_sub"externalslice_left:('a,'b,c_layout)t->intarray->('a,'b,c_layout)t="caml_ba_slice"externalslice_right:('a,'b,fortran_layout)t->intarray->('a,'b,fortran_layout)t="caml_ba_slice"externalblit:('a,'b,'c)t->('a,'b,'c)t->unit="caml_ba_blit"externalfill:('a,'b,'c)t->'a->unit="caml_ba_fill"endmoduleArray0=structtype(!'a,!'b,!'c)t=('a,'b,'c)Genarray.tletcreatekindlayout=Genarray.createkindlayout[||]letgetarr=Genarray.getarr[||]letsetarr=Genarray.setarr[||]externalkind:('a,'b,'c)t->('a,'b)kind="caml_ba_kind"externallayout:('a,'b,'c)t->'clayout="caml_ba_layout"externalchange_layout:('a,'b,'c)t->'dlayout->('a,'b,'d)t="caml_ba_change_layout"letsize_in_bytesarr=kind_size_in_bytes(kindarr)externalblit:('a,'b,'c)t->('a,'b,'c)t->unit="caml_ba_blit"externalfill:('a,'b,'c)t->'a->unit="caml_ba_fill"letof_valuekindlayoutv=leta=createkindlayoutinsetav;aletinit=of_valueendmoduleArray1=structtype(!'a,!'b,!'c)t=('a,'b,'c)Genarray.tletcreatekindlayoutdim=Genarray.createkindlayout[|dim|]externalget:('a,'b,'c)t->int->'a="%caml_ba_ref_1"externalset:('a,'b,'c)t->int->'a->unit="%caml_ba_set_1"externalunsafe_get:('a,'b,'c)t->int->'a="%caml_ba_unsafe_ref_1"externalunsafe_set:('a,'b,'c)t->int->'a->unit="%caml_ba_unsafe_set_1"externaldim:('a,'b,'c)t->int="%caml_ba_dim_1"externalkind:('a,'b,'c)t->('a,'b)kind="caml_ba_kind"externallayout:('a,'b,'c)t->'clayout="caml_ba_layout"externalchange_layout:('a,'b,'c)t->'dlayout->('a,'b,'d)t="caml_ba_change_layout"letsize_in_bytesarr=(kind_size_in_bytes(kindarr))*(dimarr)externalsub:('a,'b,'c)t->int->int->('a,'b,'c)t="caml_ba_sub"letslice(typet)(a:(_,_,t)Genarray.t)n=matchlayoutawith|C_layout->(Genarray.slice_lefta[|n|]:(_,_,t)Genarray.t)|Fortran_layout->(Genarray.slice_righta[|n|]:(_,_,t)Genarray.t)externalblit:('a,'b,'c)t->('a,'b,'c)t->unit="caml_ba_blit"externalfill:('a,'b,'c)t->'a->unit="caml_ba_fill"letc_initarrdimf=fori=0topreddimdounsafe_setarri(fi)doneletfortran_initarrdimf=fori=1todimdounsafe_setarri(fi)doneletinit(typet)kind(layout:tlayout)dimf=letarr=createkindlayoutdiminmatchlayoutwith|C_layout->c_initarrdimf;arr|Fortran_layout->fortran_initarrdimf;arrletof_array(typet)kind(layout:tlayout)data=letba=createkindlayout(Array.lengthdata)inletofs=matchlayoutwithC_layout->0|Fortran_layout->1infori=0toArray.lengthdata-1dounsafe_setba(i+ofs)data.(i)done;baendmoduleArray2=structtype(!'a,!'b,!'c)t=('a,'b,'c)Genarray.tletcreatekindlayoutdim1dim2=Genarray.createkindlayout[|dim1;dim2|]externalget:('a,'b,'c)t->int->int->'a="%caml_ba_ref_2"externalset:('a,'b,'c)t->int->int->'a->unit="%caml_ba_set_2"externalunsafe_get:('a,'b,'c)t->int->int->'a="%caml_ba_unsafe_ref_2"externalunsafe_set:('a,'b,'c)t->int->int->'a->unit="%caml_ba_unsafe_set_2"externaldim1:('a,'b,'c)t->int="%caml_ba_dim_1"externaldim2:('a,'b,'c)t->int="%caml_ba_dim_2"externalkind:('a,'b,'c)t->('a,'b)kind="caml_ba_kind"externallayout:('a,'b,'c)t->'clayout="caml_ba_layout"externalchange_layout:('a,'b,'c)t->'dlayout->('a,'b,'d)t="caml_ba_change_layout"letsize_in_bytesarr=(kind_size_in_bytes(kindarr))*(dim1arr)*(dim2arr)externalsub_left:('a,'b,c_layout)t->int->int->('a,'b,c_layout)t="caml_ba_sub"externalsub_right:('a,'b,fortran_layout)t->int->int->('a,'b,fortran_layout)t="caml_ba_sub"letslice_leftan=Genarray.slice_lefta[|n|]letslice_rightan=Genarray.slice_righta[|n|]externalblit:('a,'b,'c)t->('a,'b,'c)t->unit="caml_ba_blit"externalfill:('a,'b,'c)t->'a->unit="caml_ba_fill"letc_initarrdim1dim2f=fori=0topreddim1doforj=0topreddim2dounsafe_setarrij(fij)donedoneletfortran_initarrdim1dim2f=forj=1todim2dofori=1todim1dounsafe_setarrij(fij)donedoneletinit(typet)kind(layout:tlayout)dim1dim2f=letarr=createkindlayoutdim1dim2inmatchlayoutwith|C_layout->c_initarrdim1dim2f;arr|Fortran_layout->fortran_initarrdim1dim2f;arrletof_array(typet)kind(layout:tlayout)data=letdim1=Array.lengthdatainletdim2=ifdim1=0then0elseArray.lengthdata.(0)inletba=createkindlayoutdim1dim2inletofs=matchlayoutwithC_layout->0|Fortran_layout->1infori=0todim1-1doletrow=data.(i)inifArray.lengthrow<>dim2theninvalid_arg("Bigarray.Array2.of_array: non-rectangular data");forj=0todim2-1dounsafe_setba(i+ofs)(j+ofs)row.(j)donedone;baendmoduleArray3=structtype(!'a,!'b,!'c)t=('a,'b,'c)Genarray.tletcreatekindlayoutdim1dim2dim3=Genarray.createkindlayout[|dim1;dim2;dim3|]externalget:('a,'b,'c)t->int->int->int->'a="%caml_ba_ref_3"externalset:('a,'b,'c)t->int->int->int->'a->unit="%caml_ba_set_3"externalunsafe_get:('a,'b,'c)t->int->int->int->'a="%caml_ba_unsafe_ref_3"externalunsafe_set:('a,'b,'c)t->int->int->int->'a->unit="%caml_ba_unsafe_set_3"externaldim1:('a,'b,'c)t->int="%caml_ba_dim_1"externaldim2:('a,'b,'c)t->int="%caml_ba_dim_2"externaldim3:('a,'b,'c)t->int="%caml_ba_dim_3"externalkind:('a,'b,'c)t->('a,'b)kind="caml_ba_kind"externallayout:('a,'b,'c)t->'clayout="caml_ba_layout"externalchange_layout:('a,'b,'c)t->'dlayout->('a,'b,'d)t="caml_ba_change_layout"letsize_in_bytesarr=(kind_size_in_bytes(kindarr))*(dim1arr)*(dim2arr)*(dim3arr)externalsub_left:('a,'b,c_layout)t->int->int->('a,'b,c_layout)t="caml_ba_sub"externalsub_right:('a,'b,fortran_layout)t->int->int->('a,'b,fortran_layout)t="caml_ba_sub"letslice_left_1anm=Genarray.slice_lefta[|n;m|]letslice_right_1anm=Genarray.slice_righta[|n;m|]letslice_left_2an=Genarray.slice_lefta[|n|]letslice_right_2an=Genarray.slice_righta[|n|]externalblit:('a,'b,'c)t->('a,'b,'c)t->unit="caml_ba_blit"externalfill:('a,'b,'c)t->'a->unit="caml_ba_fill"letc_initarrdim1dim2dim3f=fori=0topreddim1doforj=0topreddim2dofork=0topreddim3dounsafe_setarrijk(fijk)donedonedoneletfortran_initarrdim1dim2dim3f=fork=1todim3doforj=1todim2dofori=1todim1dounsafe_setarrijk(fijk)donedonedoneletinit(typet)kind(layout:tlayout)dim1dim2dim3f=letarr=createkindlayoutdim1dim2dim3inmatchlayoutwith|C_layout->c_initarrdim1dim2dim3f;arr|Fortran_layout->fortran_initarrdim1dim2dim3f;arrletof_array(typet)kind(layout:tlayout)data=letdim1=Array.lengthdatainletdim2=ifdim1=0then0elseArray.lengthdata.(0)inletdim3=ifdim2=0then0elseArray.lengthdata.(0).(0)inletba=createkindlayoutdim1dim2dim3inletofs=matchlayoutwithC_layout->0|Fortran_layout->1infori=0todim1-1doletrow=data.(i)inifArray.lengthrow<>dim2theninvalid_arg("Bigarray.Array3.of_array: non-cubic data");forj=0todim2-1doletcol=row.(j)inifArray.lengthcol<>dim3theninvalid_arg("Bigarray.Array3.of_array: non-cubic data");fork=0todim3-1dounsafe_setba(i+ofs)(j+ofs)(k+ofs)col.(k)donedonedone;baendexternalgenarray_of_array0:('a,'b,'c)Array0.t->('a,'b,'c)Genarray.t="%identity"externalgenarray_of_array1:('a,'b,'c)Array1.t->('a,'b,'c)Genarray.t="%identity"externalgenarray_of_array2:('a,'b,'c)Array2.t->('a,'b,'c)Genarray.t="%identity"externalgenarray_of_array3:('a,'b,'c)Array3.t->('a,'b,'c)Genarray.t="%identity"letarray0_of_genarraya=ifGenarray.num_dimsa=0thenaelseinvalid_arg"Bigarray.array0_of_genarray"letarray1_of_genarraya=ifGenarray.num_dimsa=1thenaelseinvalid_arg"Bigarray.array1_of_genarray"letarray2_of_genarraya=ifGenarray.num_dimsa=2thenaelseinvalid_arg"Bigarray.array2_of_genarray"letarray3_of_genarraya=ifGenarray.num_dimsa=3thenaelseinvalid_arg"Bigarray.array3_of_genarray"externalreshape:('a,'b,'c)Genarray.t->intarray->('a,'b,'c)Genarray.t="caml_ba_reshape"letreshape_0a=reshapea[||]letreshape_1adim1=reshapea[|dim1|]letreshape_2adim1dim2=reshapea[|dim1;dim2|]letreshape_3adim1dim2dim3=reshapea[|dim1;dim2;dim3|](* Force caml_ba_get_{1,2,3,N} to be linked in, since we don't refer
to those primitives directly in this file *)let_=let_=Genarray.getinlet_=Array1.getinlet_=Array2.getinlet_=Array3.getin()[@@@ocaml.warning"-32"]externalget1:unit->unit="caml_ba_get_1"externalget2:unit->unit="caml_ba_get_2"externalget3:unit->unit="caml_ba_get_3"externalset1:unit->unit="caml_ba_set_1"externalset2:unit->unit="caml_ba_set_2"externalset3:unit->unit="caml_ba_set_3"