123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231includeArrayletinit_matrixmnf=initm(funi->initn(funj->fij))letshuffle~randarray=fori=lengtharray-1downto0doletj=rand(i+1)inlettmp=unsafe_getarrayiinunsafe_setarrayiarray.(j);unsafe_setarrayjtmpdone(*
type 'a t = 'a array
*)(*
let create_float l = Array.make l 0.
let make_float = create_float
*)(*
let create_float = Array.make_float
*)letfold_left_mapfinitarray=letr=refinitinletarray'=Array.map(funitem->let(accu,item')=f!riteminr:=accu;item')arrayin!r,array'letrecfind_opt_recfarrayi=ifi>=lengtharraythenNoneelseletitem=unsafe_getarrayiiniffitemthenSomeitemelsefind_opt_recfarray(succi)letfind_optfarray=find_opt_recfarray0letrecfind_map_recfarrayi=ifi>=lengtharraythenNoneelsematchf(unsafe_getarrayi)with|None->find_map_recfarray(succi)|Some_asresult->resultletfind_mapfarray=find_map_recfarray0letsplitarray=letl=lengtharrayinifl=0then([||],[||])elselet(fst0,snd0)=unsafe_getarray0inletarray_fst=Array.makelfst0inletarray_snd=Array.makelsnd0infori=1tol-1dolet(fsti,sndi)=unsafe_getarrayiinArray.unsafe_setarray_fstifsti;Array.unsafe_setarray_sndisndi;done;(array_fst,array_snd)letcombinearray_fstarray_snd=iflengtharray_fst<>lengtharray_sndtheninvalid_arg"Array.combine";Array.init(lengtharray_fst)(funi->(unsafe_getarray_fsti,unsafe_getarray_sndi))(*
exception Iter
let for_all2 f array1 array2 =
if length array1 <> length array2 then
invalid_arg "Array.for_all2";
try
for i = 0 to length array1 - 1 do
if not (f (unsafe_get array1 i) (unsafe_get array2 i)) then
raise Iter
done;
true
with Iter -> false
let exists2 f array1 array2 =
if length array1 <> length array2 then
invalid_arg "Array.exists2";
try
for i = 0 to length array1 - 1 do
if f (unsafe_get array1 i) (unsafe_get array2 i) then
raise Iter
done;
false
with Iter -> true
*)(*
let iter2 f array1 array2 =
if length array1 <> length array2 then
invalid_arg "Array.iter2";
for i = 0 to length array1 - 1 do
f (unsafe_get array1 i) (unsafe_get array2 i)
done
let map2 f array1 array2 =
if length array1 <> length array2 then
invalid_arg "Array.map2";
init (length array1)
(fun i -> f (unsafe_get array1 i) (unsafe_get array2 i))
let for_all f array =
try
for i = 0 to length array - 1 do
if not (f (unsafe_get array i)) then
raise Iter
done;
true
with Iter -> false
let exists f array =
try
for i = 0 to length array - 1 do
if f (unsafe_get array i) then
raise Iter
done;
false
with Iter -> true
let mem item =
exists (( = ) item)
let memq item =
exists (( == ) item)
*)(*
module Floatarray = struct
let create = create_float
let length : Stdcompat__root.floatarray -> int = length
let get : Stdcompat__root.floatarray -> int -> float = get
let set : Stdcompat__root.floatarray -> int -> float -> unit = set
let unsafe_get : Stdcompat__root.floatarray -> int -> float = unsafe_get
let unsafe_set : Stdcompat__root.floatarray -> int -> float -> unit
= unsafe_set
end
*)(*
let to_seq s = Stdcompat__tools.vec_to_seq length unsafe_get s
let to_seqi s = Stdcompat__tools.vec_to_seqi length unsafe_get s
*)(*
(* Array.of_seq is redefined in OCaml 4.07.0 to circumvent a bug in the
implementation of the standard library. See:
- https://caml.inria.fr/mantis/view.php?id=7820
- https://github.com/ocaml/ocaml/pull/1897 *)
let of_rev_list l =
match l with
| [] -> [||]
| hd :: tl ->
let len = List.length l in
let result = make len hd in
let rec fill i l =
match l with
| [] -> result
| hd :: tl ->
unsafe_set result i hd;
fill (pred i) tl in
fill (len - 2) tl
let of_seq g =
of_rev_list (Stdcompat__seq.fold_left (fun accu x -> x :: accu) [] g)
*)letmap_inplacefarray=fori=0tolengtharray-1dounsafe_setarrayi(f(unsafe_getarrayi))doneletmapi_inplacefarray=fori=0tolengtharray-1dounsafe_setarrayi(fi(unsafe_getarrayi))doneletrecfind_index_fromindexparray=ifindex<lengtharraythenifp(unsafe_getarrayindex)thenSomeindexelsefind_index_from(succindex)parrayelseNoneletfind_indexparray=find_index_from0parrayletrecfind_mapi_fromindexfarray=ifindex<lengtharraythenmatchfindex(unsafe_getarrayindex)with|None->find_mapi_from(succindex)farray|some->someelseNoneletfind_mapifarray=find_mapi_from0farray