123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633# 2 "bigarray.ml"(**************************************************************************)(* *)(* 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. *)(* *)(**************************************************************************)open!Stdlib[@@@ocaml.flambda_o3](* 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:any,'b:any)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('a:any)layout=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:type(a:any)(b:any).(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:any,!'b:any,!'c:any)t:mutable_dataexternalcreate:('a:any)('b:any)('c:any).('a,'b)kind->'clayout->(intarray[@local_opt])->('a,'b,'c)t@unique@@portable="caml_ba_create"externalget:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->(intarray[@local_opt])->'a@@portable="caml_ba_get_generic"externalset:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->(intarray[@local_opt])->('a[@local_opt])->unit@@portable="caml_ba_set_generic"letrecclooparridxfcol(max@local)=ifcol=Array.lengthidxthensetarridx(fidx)elseforj=0topredmax.(col)doidx.(col)<-j;clooparridxf(succcol)maxdoneletrecflooparridxfcol(max@local)=ifcol<0thensetarridx(fidx)elseforj=1to(max.(col):int)doidx.(col)<-j;flooparridxf(predcol)maxdoneletinit(type(a:value_or_null)(b:any)(c:any))(kind:(a,b)kind)(layout:clayout)(dims@local)f=letarr=createkindlayoutdimsinletdlen=Array.lengthdimsinmatchlayoutwith|C_layout->cloop(borrow_arr)(Array.makedlen0)f0dims;arr|Fortran_layout->floop(borrow_arr)(Array.makedlen1)f(preddlen)dims;arrexternalnum_dims:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->int@@stateless="caml_ba_num_dims"externalnth_dim:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->int->int@@stateless="caml_ba_dim"letdimsa=letn=num_dimsainletd=Array.maken0infori=0ton-1dod.(i)<-nth_dimaidone;dexternalkind:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->('a,'b)kind@@stateless="caml_ba_kind"externallayout:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->'clayout@@stateless="caml_ba_layout"externalchange_layout:('a:any)('b:any)('c:any).('a,'b,'c)t->'dlayout->('a,'b,'d)t@@portable="caml_ba_change_layout"letsize_in_bytesarr=(kind_size_in_bytes(kindarr))*(Array.fold_left(*)1(dimsarr))externalsub_left:('a:any)('b:any)('c:any).('a,'b,c_layout)t->int->int->('a,'b,c_layout)t@@portable="caml_ba_sub"externalsub_right:('a:any)('b:any)('c:any).('a,'b,fortran_layout)t->int->int->('a,'b,fortran_layout)t@@portable="caml_ba_sub"externalslice_left:('a:any)('b:any)('c:any).('a,'b,c_layout)t->(intarray[@local_opt])->('a,'b,c_layout)t@@portable="caml_ba_slice"externalslice_right:('a:any)('b:any)('c:any).('a,'b,fortran_layout)t->(intarray[@local_opt])->('a,'b,fortran_layout)t@@portable="caml_ba_slice"externalblit:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->(('a,'b,'c)t[@local_opt])->unit@@portable="caml_ba_blit"externalfill:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->('a[@local_opt])->unit@@portable="caml_ba_fill"endmoduleArray0=structtype(!'a:any,!'b:any,!'c:any)t=('a,'b,'c)Genarray.tletcreatekindlayout=Genarray.createkindlayout[||]letgetarr=Genarray.getarr[||]letsetarrvalue=Genarray.setarr[||]valueexternalkind:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->('a,'b)kind@@stateless="caml_ba_kind"externallayout:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->'clayout@@stateless="caml_ba_layout"externalchange_layout:('a:any)('b:any)('c:any).('a,'b,'c)t->'dlayout->('a,'b,'d)t@@portable="caml_ba_change_layout"letsize_in_bytesarr=kind_size_in_bytes(kindarr)externalblit:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->(('a,'b,'c)t[@local_opt])->unit@@portable="caml_ba_blit"externalfill:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->('a[@local_opt])->unit@@portable="caml_ba_fill"letof_valuekindlayoutv=leta=createkindlayoutinset(borrow_a)v;aletinit=of_valueendmoduleArray1=structtype(!'a:any,!'b:any,!'c:any)t=('a,'b,'c)Genarray.tletcreatekindlayoutdim=Genarray.createkindlayout[|dim|]externalget:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->int->('a[@local_opt])@@portable="%caml_ba_ref_1"externalset:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->int->('a[@local_opt])->unit@@portable="%caml_ba_set_1"externalunsafe_get:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->int->('a[@local_opt])@@portable="%caml_ba_unsafe_ref_1"externalunsafe_set:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->int->('a[@local_opt])->unit@@portable="%caml_ba_unsafe_set_1"externaldim:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->int@@stateless="%caml_ba_dim_1"externalkind:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->('a,'b)kind@@stateless="caml_ba_kind"externallayout:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->'clayout@@stateless="caml_ba_layout"externalchange_layout:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->'dlayout->(('a,'b,'d)t[@local_opt])@@portable="caml_ba_change_layout"letsize_in_bytesarr=(kind_size_in_bytes(kindarr))*(dimarr)externalsub:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->int->int->(('a,'b,'c)t[@local_opt])@@portable="caml_ba_sub"letslice(type(a:any)(b:any)(c:any))(a:(a,b,c)Genarray.t)n=matchlayoutawith|C_layout->(Genarray.slice_lefta[|n|]:(a,b,c)Genarray.t)|Fortran_layout->(Genarray.slice_righta[|n|]:(a,b,c)Genarray.t)externalblit:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->(('a,'b,'c)t[@local_opt])->unit@@portable="caml_ba_blit"externalfill:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->('a[@local_opt])->unit@@portable="caml_ba_fill"letc_initarrdimf=fori=0topreddimdounsafe_setarri(fi)doneletfortran_initarrdimf=fori=1todimdounsafe_setarri(fi)doneletinit(type(a:value_or_null)(b:any)(c:any))(kind:(a,b)kind)(layout:clayout)dimf=letarr=createkindlayoutdiminmatchlayoutwith|C_layout->c_init(borrow_arr)dimf;arr|Fortran_layout->fortran_init(borrow_arr)dimf;arrletof_array(type(a:value_or_nullmodseparable)(b:any)(c:any))(kind:(a,b)kind)(layout:clayout)data=letba=createkindlayout(Array.lengthdata)inletofs=matchlayoutwithC_layout->0|Fortran_layout->1infori=0toArray.lengthdata-1dounsafe_set(borrow_ba)(i+ofs)data.(i)done;baendmoduleArray2=structtype(!'a:any,!'b:any,!'c:any)t=('a,'b,'c)Genarray.tletcreatekindlayoutdim1dim2=Genarray.createkindlayout[|dim1;dim2|]externalget:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->int->int->('a[@local_opt])@@portable="%caml_ba_ref_2"externalset:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->int->int->('a[@local_opt])->unit@@portable="%caml_ba_set_2"externalunsafe_get:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->int->int->('a[@local_opt])@@portable="%caml_ba_unsafe_ref_2"externalunsafe_set:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->int->int->('a[@local_opt])->unit@@portable="%caml_ba_unsafe_set_2"externaldim1:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->int@@stateless="%caml_ba_dim_1"externaldim2:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->int@@stateless="%caml_ba_dim_2"externalkind:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->('a,'b)kind@@stateless="caml_ba_kind"externallayout:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->'clayout@@stateless="caml_ba_layout"externalchange_layout:('a:any)('b:any)('c:any).('a,'b,'c)t->'dlayout->('a,'b,'d)t@@portable="caml_ba_change_layout"letsize_in_bytesarr=(kind_size_in_bytes(kindarr))*(dim1arr)*(dim2arr)externalsub_left:('a:any)('b:any)('c:any).('a,'b,c_layout)t->int->int->('a,'b,c_layout)t@@portable="caml_ba_sub"externalsub_right:('a:any)('b:any)('c:any).('a,'b,fortran_layout)t->int->int->('a,'b,fortran_layout)t@@portable="caml_ba_sub"letslice_leftan=Genarray.slice_lefta[|n|]letslice_rightan=Genarray.slice_righta[|n|]externalblit:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->(('a,'b,'c)t[@local_opt])->unit@@portable="caml_ba_blit"externalfill:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->('a[@local_opt])->unit@@portable="caml_ba_fill"letc_initarrdim1dim2f=fori=0topreddim1doforj=0topreddim2dounsafe_setarrij(fij)donedoneletfortran_initarrdim1dim2f=forj=1todim2dofori=1todim1dounsafe_setarrij(fij)donedoneletinit(type(a:value_or_null)(b:any)(c:any))(kind:(a,b)kind)(layout:clayout)dim1dim2f=letarr=createkindlayoutdim1dim2inmatchlayoutwith|C_layout->c_init(borrow_arr)dim1dim2f;arr|Fortran_layout->fortran_init(borrow_arr)dim1dim2f;arrletof_array(type(a:value_or_nullmodseparable)(b:any)(c:any))(kind:(a,b)kind)(layout:clayout)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_set(borrow_ba)(i+ofs)(j+ofs)row.(j)donedone;baendmoduleArray3=structtype(!'a:any,!'b:any,!'c:any)t=('a,'b,'c)Genarray.tletcreatekindlayoutdim1dim2dim3=Genarray.createkindlayout[|dim1;dim2;dim3|]externalget:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->int->int->int->('a[@local_opt])@@portable="%caml_ba_ref_3"externalset:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->int->int->int->('a[@local_opt])->unit@@portable="%caml_ba_set_3"externalunsafe_get:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->int->int->int->('a[@local_opt])@@portable="%caml_ba_unsafe_ref_3"externalunsafe_set:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->int->int->int->('a[@local_opt])->unit@@portable="%caml_ba_unsafe_set_3"externaldim1:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->int@@stateless="%caml_ba_dim_1"externaldim2:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->int@@stateless="%caml_ba_dim_2"externaldim3:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->int@@stateless="%caml_ba_dim_3"externalkind:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->('a,'b)kind@@stateless="caml_ba_kind"externallayout:('a:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@immutable->'clayout@@stateless="caml_ba_layout"externalchange_layout:('a:any)('b:any)('c:any).('a,'b,'c)t->'dlayout->('a,'b,'d)t@@portable="caml_ba_change_layout"letsize_in_bytesarr=(kind_size_in_bytes(kindarr))*(dim1arr)*(dim2arr)*(dim3arr)externalsub_left:('a:any)('b:any)('c:any).('a,'b,c_layout)t->int->int->('a,'b,c_layout)t@@portable="caml_ba_sub"externalsub_right:('a:any)('b:any)('c:any).('a,'b,fortran_layout)t->int->int->('a,'b,fortran_layout)t@@portable="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:any)('b:any)('c:any).(('a,'b,'c)t[@local_opt])@shared->(('a,'b,'c)t[@local_opt])->unit@@portable="caml_ba_blit"externalfill:('a:value_or_null)('b:any)('c:any).(('a,'b,'c)t[@local_opt])->('a[@local_opt])->unit@@portable="caml_ba_fill"letc_initarrdim1dim2dim3f=fori=0topreddim1doforj=0topreddim2dofork=0topreddim3dounsafe_setarrijk(fijk)donedonedoneletfortran_initarrdim1dim2dim3f=fork=1todim3doforj=1todim2dofori=1todim1dounsafe_setarrijk(fijk)donedonedoneletinit(type(a:value_or_null)(b:any)(c:any))(kind:(a,b)kind)(layout:clayout)dim1dim2dim3f=letarr=createkindlayoutdim1dim2dim3inmatchlayoutwith|C_layout->c_init(borrow_arr)dim1dim2dim3f;arr|Fortran_layout->fortran_init(borrow_arr)dim1dim2dim3f;arrletof_array(type(a:value_or_nullmodseparable)(b:any)(c:any))(kind:(a,b)kind)(layout:clayout)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_set(borrow_ba)(i+ofs)(j+ofs)(k+ofs)col.(k)donedonedone;baendexternalgenarray_of_array0:('a:any)('b:any)('c:any).(('a,'b,'c)Array0.t[@local_opt])->(('a,'b,'c)Genarray.t[@local_opt])@@portable="%identity"externalgenarray_of_array1:('a:any)('b:any)('c:any).(('a,'b,'c)Array1.t[@local_opt])->(('a,'b,'c)Genarray.t[@local_opt])@@portable="%identity"externalgenarray_of_array2:('a:any)('b:any)('c:any).(('a,'b,'c)Array2.t[@local_opt])->(('a,'b,'c)Genarray.t[@local_opt])@@portable="%identity"externalgenarray_of_array3:('a:any)('b:any)('c:any).(('a,'b,'c)Array3.t[@local_opt])->(('a,'b,'c)Genarray.t[@local_opt])@@portable="%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:any)('b:any)('c:any).('a,'b,'c)Genarray.t->(intarray[@local_opt])->('a,'b,'c)Genarray.t@@portable="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@@portable="caml_ba_get_1"externalget2:unit->unit@@portable="caml_ba_get_2"externalget3:unit->unit@@portable="caml_ba_get_3"externalset1:unit->unit@@portable="caml_ba_set_1"externalset2:unit->unit@@portable="caml_ba_set_2"externalset3:unit->unit@@portable="caml_ba_set_3"