2025-06-13 17:13.59: New job: test ahrefs/ocannl https://github.com/ahrefs/ocannl.git#refs/heads/master (4a291573c46f63d3f21f1d56bc89e6d1bd40fe85) (linux-x86_64:(lint-fmt)) Base: ocaml/opam:debian-12-ocaml-4.08@sha256:48fa4a7216c3973bb95572cf5dca98cbbcefe90f288f552e7ac70a8ccd438aa7 ocamlformat version: version 0.27.0 (from opam) To reproduce locally: git clone --recursive "https://github.com/ahrefs/ocannl.git" -b "master" && cd "ocannl" && git reset --hard 4a291573 cat > Dockerfile <<'END-OF-DOCKERFILE' FROM ocaml/opam:debian-12-ocaml-4.08@sha256:48fa4a7216c3973bb95572cf5dca98cbbcefe90f288f552e7ac70a8ccd438aa7 USER 1000:1000 RUN cd ~/opam-repository && (git cat-file -e 0eea63ad71af2b1116c556023bedc6bf083e6125 || git fetch origin master) && git reset -q --hard 0eea63ad71af2b1116c556023bedc6bf083e6125 && git log --no-decorate -n1 --oneline && opam update -u RUN opam depext -i dune WORKDIR /src RUN opam depext -i ocamlformat=0.27.0 COPY --chown=1000:1000 . /src/ RUN opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2) END-OF-DOCKERFILE docker build . END-REPRO-BLOCK 2025-06-13 17:13.59: Using cache hint "ahrefs/ocannl-ocaml/opam:debian-12-ocaml-4.08@sha256:48fa4a7216c3973bb95572cf5dca98cbbcefe90f288f552e7ac70a8ccd438aa7-debian-12-4.08_opam-2.3-ocamlformat-0eea63ad71af2b1116c556023bedc6bf083e6125" 2025-06-13 17:13.59: Using OBuilder spec: ((from ocaml/opam:debian-12-ocaml-4.08@sha256:48fa4a7216c3973bb95572cf5dca98cbbcefe90f288f552e7ac70a8ccd438aa7) (user (uid 1000) (gid 1000)) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "cd ~/opam-repository && (git cat-file -e 0eea63ad71af2b1116c556023bedc6bf083e6125 || git fetch origin master) && git reset -q --hard 0eea63ad71af2b1116c556023bedc6bf083e6125 && git log --no-decorate -n1 --oneline && opam update -u")) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam depext -i dune")) (workdir /src) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam depext -i ocamlformat=0.27.0")) (copy (src .) (dst /src/)) (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)")) ) 2025-06-13 17:13.59: Waiting for resource in pool OCluster 2025-06-13 17:13.59: Waiting for worker… 2025-06-13 17:13.59: Got resource from pool OCluster Building on odawa.caelum.ci.dev hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> Initialized empty Git repository in /var/cache/obuilder/ocluster/git/ocannl.git-6892d315d851562e83f7284a240d4486ed11f9c7/.git/ HEAD is now at 4a291573 Convolutions clarification and a bit of formatting (from ocaml/opam:debian-12-ocaml-4.08@sha256:48fa4a7216c3973bb95572cf5dca98cbbcefe90f288f552e7ac70a8ccd438aa7) 2025-06-13 17:14.01 ---> using "d1b97f3f32fc7cff4791d73e3fff398d19cc5b0541c709028ff05a921e22d2c8" from cache /: (user (uid 1000) (gid 1000)) /: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "cd ~/opam-repository && (git cat-file -e 0eea63ad71af2b1116c556023bedc6bf083e6125 || git fetch origin master) && git reset -q --hard 0eea63ad71af2b1116c556023bedc6bf083e6125 && git log --no-decorate -n1 --oneline && opam update -u")) From https://github.com/ocaml/opam-repository * branch master -> FETCH_HEAD 0d013e603b..c7269f729a master -> origin/master 0eea63ad71 Merge pull request #27946 from mtelvers/opam-publish-ocaml-version.4.0.1 <><> Updating package repositories ><><><><><><><><><><><><><><><><><><><><><><> [default] Initialised default (at git+file:///home/opam/opam-repository): [INFO] opam 2.1 and 2.2 include many performance and security improvements over 2.0; please consider upgrading (https://opam.ocaml.org/doc/Install.html) Everything as up-to-date as possible (run with --verbose to show unavailable upgrades). However, you may "opam upgrade" these packages explicitly, which will ask permission to downgrade or uninstall the conflicting packages. Nothing to do. # Run eval $(opam env) to update the current shell environment 2025-06-13 17:14.51 ---> saved as "96cf7cb4f290bdde63e0891300660f309335b98ec063b9c2de517b6b08952aac" /: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam depext -i dune")) # Detecting depexts using vars: arch=x86_64, os=linux, os-distribution=debian, os-family=debian # No extra OS packages requirements found. # All required OS packages found. # Now letting opam install the packages The following actions will be performed: - install dune 3.19.0 <><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><> [dune.3.19.0] downloaded from https://github.com/ocaml/dune/releases/download/3.19.0/dune-3.19.0.tbz <><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> -> installed dune.3.19.0 Done. # Run eval $(opam env) to update the current shell environment 2025-06-13 17:15.14 ---> saved as "89c0585fea6e0efe18837c1dd4fe4772483d123bc62d2e4be11e9db74e5475f0" /: (workdir /src) /src: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam depext -i ocamlformat=0.27.0")) # Detecting depexts using vars: arch=x86_64, os=linux, os-distribution=debian, os-family=debian # No extra OS packages requirements found. # All required OS packages found. # Now letting opam install the packages The following actions will be performed: - install sexplib0 v0.14.0 [required by base] - install cmdliner 1.3.0 [required by ocamlformat] - install menhirLib 20240715 [required by ocamlformat-lib] - install menhirCST 20240715 [required by menhir] - install ocamlbuild 0.16.1 [required by fpath, astring, uuseg] - install menhirSdk 20240715 [required by ocamlformat-lib] - install either 1.0.0 [required by ocamlformat-lib] - install ocaml-version 4.0.1 [required by ocamlformat-lib] - install camlp-streams 5.0.1 [required by ocamlformat-lib] - install csexp 1.5.2 [required by ocamlformat] - install seq base [required by re] - install fix 20250428 [required by ocamlformat-lib] - install ocamlfind 1.9.8 [required by ocp-indent, astring, fpath, uuseg] - install dune-build-info 3.19.0 [required by ocamlformat-lib] - install menhir 20240715 [required by ocamlformat-lib] - install dune-configurator 3.19.0 [required by base] - install re 1.11.0 [required by ocamlformat] - install topkg 1.0.8 [required by fpath, astring, uuseg] - install base-bytes base [required by ocp-indent] - install base v0.14.3 [required by ocamlformat-lib] - install uutf 1.0.4 [required by ocamlformat-lib] - install astring 0.8.5 [required by ocamlformat-lib] - install ocp-indent 1.8.1 [required by ocamlformat-lib] - install stdio v0.14.0 [required by ocamlformat-lib] - install uucp 15.0.0 [required by uuseg] - install fpath 0.7.3 [required by ocamlformat-lib] - install uuseg 15.0.0 [required by ocamlformat-lib] - install ocamlformat-lib 0.27.0 [required by ocamlformat] - install ocamlformat 0.27.0 ===== 29 to install ===== <><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><> [astring.0.8.5] found in cache [camlp-streams.5.0.1] found in cache [cmdliner.1.3.0] found in cache [csexp.1.5.2] found in cache [dune-build-info.3.19.0] found in cache [dune-configurator.3.19.0] found in cache [either.1.0.0] found in cache [base.v0.14.3] downloaded from https://github.com/janestreet/base/archive/v0.14.3.tar.gz [fix.20250428] found in cache [fpath.0.7.3] found in cache [menhir.20240715] found in cache [menhirCST.20240715] found in cache [menhirLib.20240715] found in cache [menhirSdk.20240715] found in cache [ocaml-version.4.0.1] found in cache [ocamlbuild.0.16.1] found in cache [ocamlfind.1.9.8] found in cache [ocamlformat.0.27.0] downloaded from https://github.com/ocaml-ppx/ocamlformat/releases/download/0.27.0/ocamlformat-0.27.0.tbz [ocp-indent.1.8.1] downloaded from https://github.com/OCamlPro/ocp-indent/archive/1.8.1.tar.gz [ocamlformat-lib.0.27.0] downloaded from https://github.com/ocaml-ppx/ocamlformat/releases/download/0.27.0/ocamlformat-0.27.0.tbz [re.1.11.0] found in cache [topkg.1.0.8] found in cache [sexplib0.v0.14.0] downloaded from https://ocaml.janestreet.com/ocaml-core/v0.14/files/sexplib0-v0.14.0.tar.gz [stdio.v0.14.0] downloaded from https://ocaml.janestreet.com/ocaml-core/v0.14/files/stdio-v0.14.0.tar.gz [uutf.1.0.4] found in cache [uuseg.15.0.0] downloaded from https://erratique.ch/software/uuseg/releases/uuseg-15.0.0.tbz [uucp.15.0.0] downloaded from https://erratique.ch/software/uucp/releases/uucp-15.0.0.tbz <><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> -> installed seq.base -> installed camlp-streams.5.0.1 -> installed csexp.1.5.2 -> installed cmdliner.1.3.0 -> installed either.1.0.0 -> installed fix.20250428 -> installed menhirCST.20240715 -> installed menhirLib.20240715 -> installed menhirSdk.20240715 -> installed ocaml-version.4.0.1 -> installed re.1.11.0 -> installed sexplib0.v0.14.0 -> installed dune-build-info.3.19.0 -> installed dune-configurator.3.19.0 -> installed ocamlfind.1.9.8 -> installed base-bytes.base -> installed ocamlbuild.0.16.1 -> installed ocp-indent.1.8.1 -> installed base.v0.14.3 -> installed topkg.1.0.8 -> installed stdio.v0.14.0 -> installed uutf.1.0.4 -> installed astring.0.8.5 -> installed menhir.20240715 -> installed fpath.0.7.3 -> installed uucp.15.0.0 -> installed uuseg.15.0.0 -> installed ocamlformat-lib.0.27.0 -> installed ocamlformat.0.27.0 Done. <><> ocp-indent.1.8.1 installed successfully ><><><><><><><><><><><><><><><><><> => This package requires additional configuration for use in editors. Install package 'user-setup', or manually: * for Emacs, add these lines to ~/.emacs: (add-to-list 'load-path "/home/opam/.opam/4.08/share/emacs/site-lisp") (require 'ocp-indent) * for Vim, add this line to ~/.vimrc: set rtp^="/home/opam/.opam/4.08/share/ocp-indent/vim" # Run eval $(opam env) to update the current shell environment 2025-06-13 17:16.00 ---> saved as "3806f45ef51bb70dc27c6783fa556ac6054f53765f6f6e5d7f0761003690b07c" /src: (copy (src .) (dst /src/)) 2025-06-13 17:16.01 ---> saved as "67c9cf801ccda52bd9ed897d50d4bc984bb6a12a3e71cc4f69db3ed476199271" /src: (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)")) File "arrayjit/bin/dune", line 6, characters 21-34: 6 | (pps ppx_minidebug ppx_sexp_conv)) ^^^^^^^^^^^^^ Error: Library "ppx_sexp_conv" not found. -> required by _build/default/arrayjit/bin/read_config.exe -> required by %{dep:../../arrayjit/bin/read_config.exe} at test/dune:25 -> required by _build/default/test/config/ocannl_backend.txt -> required by %{read:config/ocannl_backend.txt} at test/dune:44 -> required by Computing directory contents of _build/default/test File "arrayjit/bin/dune", line 6, characters 7-20: 6 | (pps ppx_minidebug ppx_sexp_conv)) ^^^^^^^^^^^^^ Error: Library "ppx_minidebug" not found. -> required by _build/default/arrayjit/bin/.merlin-conf/exe-read_config -> required by _build/default/arrayjit/bin/read_config.exe -> required by %{dep:../../arrayjit/bin/read_config.exe} at test/dune:25 -> required by _build/default/test/config/ocannl_backend.txt -> required by %{read:config/ocannl_backend.txt} at test/dune:44 -> required by Computing directory contents of _build/default/test File "arrayjit/test/test_numerical_types.ml", line 1, characters 0-0: diff --git a/_build/default/arrayjit/test/test_numerical_types.ml b/_build/default/arrayjit/test/.formatted/test_numerical_types.ml index 222a2ec..971d196 100644 --- a/_build/default/arrayjit/test/test_numerical_types.ml +++ b/_build/default/arrayjit/test/.formatted/test_numerical_types.ml @@ -48,13 +48,15 @@ let test_padding () = Stdio.printf "\n\nTesting padding functionality:\n"; (* Test padding with float32 array *) - let padding_config = [| (1, 1); (2, 1) |] in (* left=1,right=1 for first dim; left=2,right=1 for second dim *) + let padding_config = [| (1, 1); (2, 1) |] in + (* left=1,right=1 for first dim; left=2,right=1 for second dim *) let padding_value = -999.0 in - let padded_dims = [| 4; 6 |] in (* (2+1+1) x (3+2+1) *) - + let padded_dims = [| 4; 6 |] in + (* (2+1+1) x (3+2+1) *) + let arr = - Ndarray.create_array ~debug:"padded_test" Ops.single ~dims:padded_dims + Ndarray.create_array ~debug:"padded_test" Ops.single ~dims:padded_dims ~padding:(Some (padding_config, padding_value)) (Ops.Constant_fill { values = [| 1.0; 2.0; 3.0; 4.0; 5.0; 6.0 |]; strict = true }) in @@ -65,12 +67,13 @@ let test_padding () = for j = 0 to dims.(1) - 1 do let idx = [| i; j |] in let value = Ndarray.get_as_float arr idx in - Stdio.printf "%8.1f " value; + Stdio.printf "%8.1f " value done; Stdio.printf "\n" done; - - Stdio.printf "\nExpected: padding value (-999.0) in margins, data values (1.0-6.0) in center region\n" + + Stdio.printf + "\nExpected: padding value (-999.0) in margins, data values (1.0-6.0) in center region\n" let () = test_bfloat16_conversions (); File "lib/shape.mli", line 1, characters 0-0: diff --git a/_build/default/lib/shape.mli b/_build/default/lib/.formatted/shape.mli index be0773c..6537143 100644 --- a/_build/default/lib/shape.mli +++ b/_build/default/lib/.formatted/shape.mli @@ -108,10 +108,7 @@ val make : that these are dimensions labels and not axis labels: they need not be unique for a row, are inferred when provided, and must match whenever the axis sizes must match. *) -val to_string_hum : - ?style:Row.print_style -> - t -> - string +val to_string_hum : ?style:Row.print_style -> t -> string val unsafe_reinitialize : unit -> unit (** Bring global state to its initialization values. This invalidates any unfinished inference. *) File "arrayjit/lib/assignments.ml", line 1, characters 0-0: diff --git a/_build/default/arrayjit/lib/assignments.ml b/_build/default/arrayjit/lib/.formatted/assignments.ml index bd3908f..3e41a7e 100644 --- a/_build/default/arrayjit/lib/assignments.ml +++ b/_build/default/arrayjit/lib/.formatted/assignments.ml @@ -154,20 +154,20 @@ let%diagn2_sexp to_low_level code = let projections = Lazy.force projections in let basecase rev_iters = (* Create a substitution from product iterators to loop iterators *) - let subst_map = + let subst_map = let loop_iters = Array.of_list_rev rev_iters in Array.mapi projections.product_iterators ~f:(fun i prod_iter -> - (prod_iter, Indexing.Iterator loop_iters.(i))) + (prod_iter, Indexing.Iterator loop_iters.(i))) |> Array.to_list |> Map.of_alist_exn (module Indexing.Symbol) in (* Substitute in projections *) let subst_index = function | Indexing.Fixed_idx _ as idx -> idx - | Indexing.Iterator s as idx -> - Option.value ~default:idx (Map.find subst_map s) + | Indexing.Iterator s as idx -> Option.value ~default:idx (Map.find subst_map s) | Indexing.Affine { symbols; offset } -> - (* For affine indices, we don't substitute - they should already use the right symbols *) + (* For affine indices, we don't substitute - they should already use the right + symbols *) Indexing.Affine { symbols; offset } in let lhs_idcs = Array.map projections.project_lhs ~f:subst_index in File "arrayjit/lib/tnode.ml", line 1, characters 0-0: diff --git a/_build/default/arrayjit/lib/tnode.ml b/_build/default/arrayjit/lib/.formatted/tnode.ml index d58ce98..2d9cc89 100644 --- a/_build/default/arrayjit/lib/tnode.ml +++ b/_build/default/arrayjit/lib/.formatted/tnode.ml @@ -105,7 +105,6 @@ let dims_without_padding tn = Array.map2_exn dims padding ~f:(fun dim (left, right) -> dim - left - right) let get_padding tn = Lazy.force tn.padding - let id { id; _ } = "n" ^ Int.to_string id let label a = String.concat ~sep:"_" a.label let is_alphanum_ = String.for_all ~f:(fun c -> Char.equal c '_' || Char.is_alphanum c) @@ -540,8 +539,8 @@ let create ?default_prec ~id ~label ~dims ~padding init_op = lazy (if is_hosted_force tn 30 then Some - (Nd.create_array ~debug (Lazy.force prec) ~dims:(Lazy.force dims) ~padding:(Lazy.force padding) - init_op) + (Nd.create_array ~debug (Lazy.force prec) ~dims:(Lazy.force dims) + ~padding:(Lazy.force padding) init_op) else None) and prec = lazy File "lib/tensor.ml", line 1, characters 0-0: diff --git a/_build/default/lib/tensor.ml b/_build/default/lib/.formatted/tensor.ml index 8b877b4..36e4fda 100644 --- a/_build/default/lib/tensor.ml +++ b/_build/default/lib/.formatted/tensor.ml @@ -238,7 +238,11 @@ let op ~(label : string list) ?(ternary_op = Shape.Pointwise_tern) in let grad_id = session_state.next_id in session_state.next_id <- session_state.next_id + 1; - let g = Tn.create ~default_prec ~id:grad_id ~label:("grad" :: label) ~dims ~padding:(lazy None) default_init_op in + let g = + Tn.create ~default_prec ~id:grad_id ~label:("grad" :: label) ~dims + ~padding:(lazy None) + default_init_op + in let is_bck_root ti = Map.mem session_state.backprop_roots ti.id in let zero_grads = let zero_g ti = @@ -358,7 +362,8 @@ let ndarray ?(label = []) ?(grad_spec = Prohibit_grad) ?batch_dims ?input_dims ? let dims = Array.concat_map [| batch_ds; output_ds; input_ds |] ~f:Array.of_list in let debug = "Temporary array for pretty-printing" in let ndarr = - Nd.create_array ~debug Ir.Ops.double ~dims ~padding:None (Ir.Ops.Constant_fill { values; strict }) + Nd.create_array ~debug Ir.Ops.double ~dims ~padding:None + (Ir.Ops.Constant_fill { values; strict }) in let ( ! ) = List.length in let b = Buffer.create 1024 in @@ -590,7 +595,7 @@ let to_doc ?(spy = false) ~with_grad ~with_code ?(with_low_level = false) let label = Tn.label t.value in let prefix_str = "[" ^ Int.to_string t.id ^ "]: " ^ label ^ " shape " - ^ Shape.to_string_hum ~style:Row.Axis_number_and_size sh + ^ Shape.to_string_hum ~style:Row.Axis_number_and_size sh ^ " " in let grad_txt diff = @@ -631,7 +636,9 @@ let to_doc ?(spy = false) ~with_grad ~with_code ?(with_low_level = false) Array.exists ~f:(Fn.non String.is_empty) labels || Shape.(List.exists ~f:Row.(equal_dim @@ get_dim ~d:1 ()) sh.input.dims) in - let axes_spec = if needs_spec then Some (Shape.to_string_hum ~style:Row.Only_labels sh) else None in + let axes_spec = + if needs_spec then Some (Shape.to_string_hum ~style:Row.Only_labels sh) else None + in let num_batch_axes = List.length sh.batch.dims in let num_input_axes = List.length sh.input.dims in let num_output_axes = List.length sh.output.dims in File "arrayjit/lib/ndarray.ml", line 1, characters 0-0: diff --git a/_build/default/arrayjit/lib/ndarray.ml b/_build/default/arrayjit/lib/.formatted/ndarray.ml index f062552..747022d 100644 --- a/_build/default/arrayjit/lib/ndarray.ml +++ b/_build/default/arrayjit/lib/.formatted/ndarray.ml @@ -132,41 +132,42 @@ let indices_to_offset ~dims ~idcs = let create_bigarray (type ocaml elt_t) (prec : (ocaml, elt_t) Ops.precision) ~dims ~padding (init_op : Ops.init_op) : (ocaml, elt_t) bigarray = Option.iter Utils.settings.fixed_state_for_init ~f:(fun seed -> Rand.Lib.init seed); - + (* Handle padding: dims already includes padding, compute unpadded dimensions *) - let unpadded_dims, padding_info = match padding with - | None -> dims, None + let unpadded_dims, padding_info = + match padding with + | None -> (dims, None) | Some (pad_config, pad_value) -> - let unpadded_dims = Array.map2_exn dims pad_config ~f:(fun dim (left, right) -> - dim - left - right) in + let unpadded_dims = + Array.map2_exn dims pad_config ~f:(fun dim (left, right) -> dim - left - right) + in (unpadded_dims, Some (pad_config, pad_value)) in - + let arr = create_bigarray_of_prec prec dims in - + (* Fill with padding value if padding is specified *) (match padding_info with - | None -> () - | Some (_, pad_value) -> - (* Fill the entire array with padding value using precision-specific fill *) - (match prec with - | Ops.Byte -> A.fill arr (Char.of_int_exn @@ Int.of_float pad_value) - | Ops.Uint16 -> A.fill arr (Int.of_float pad_value) - | Ops.Int32 -> A.fill arr (Int32.of_float pad_value) - | Ops.Half -> A.fill arr pad_value - | Ops.Bfloat16 -> A.fill arr (float_to_bfloat16 pad_value) - | Ops.Fp8 -> A.fill arr (Char.of_int_exn @@ float_to_fp8 pad_value) - | Ops.Single -> A.fill arr pad_value - | Ops.Double -> A.fill arr pad_value)); - + | None -> () + | Some (_, pad_value) -> ( + (* Fill the entire array with padding value using precision-specific fill *) + match prec with + | Ops.Byte -> A.fill arr (Char.of_int_exn @@ Int.of_float pad_value) + | Ops.Uint16 -> A.fill arr (Int.of_float pad_value) + | Ops.Int32 -> A.fill arr (Int32.of_float pad_value) + | Ops.Half -> A.fill arr pad_value + | Ops.Bfloat16 -> A.fill arr (float_to_bfloat16 pad_value) + | Ops.Fp8 -> A.fill arr (Char.of_int_exn @@ float_to_fp8 pad_value) + | Ops.Single -> A.fill arr pad_value + | Ops.Double -> A.fill arr pad_value)); + (* Helper function to convert unpadded indices to padded indices *) let unpadded_to_padded_indices idcs = match padding_info with | None -> idcs - | Some (pad_config, _) -> - Array.map2_exn idcs pad_config ~f:(fun idx (left, _) -> idx + left) + | Some (pad_config, _) -> Array.map2_exn idcs pad_config ~f:(fun idx (left, _) -> idx + left) in - + (* For non-constant fill operations, we need to iterate over unpadded dimensions *) let init_unpadded_region init_func = let rec loop_dims idcs dim_idx = @@ -181,7 +182,7 @@ let create_bigarray (type ocaml elt_t) (prec : (ocaml, elt_t) Ops.precision) ~di in loop_dims (Array.create ~len:(Array.length unpadded_dims) 0) 0 in - + let constant_fill_f f values strict = let len = Array.length values in if strict then ( @@ -195,32 +196,32 @@ let create_bigarray (type ocaml elt_t) (prec : (ocaml, elt_t) Ops.precision) ~di init_unpadded_region (fun idcs -> f values.(indices_to_offset ~dims:unpadded_dims ~idcs))) else init_unpadded_region (fun idcs -> - f values.(indices_to_offset ~dims:unpadded_dims ~idcs % len)) + f values.(indices_to_offset ~dims:unpadded_dims ~idcs % len)) in let constant_fill_float values strict = constant_fill_f Fn.id values strict in - + (match (prec, init_op) with | Ops.Byte, Constant_fill { values; strict } -> ignore (constant_fill_f (Fn.compose Char.of_int_exn Int.of_float) values strict) | Ops.Byte, Range_over_offsets -> - init_unpadded_region (fun idcs -> Char.of_int_exn @@ indices_to_offset ~dims:unpadded_dims ~idcs) + init_unpadded_region (fun idcs -> + Char.of_int_exn @@ indices_to_offset ~dims:unpadded_dims ~idcs) | Ops.Byte, Standard_uniform -> init_unpadded_region (fun _ -> Rand.Lib.char ()) - | Ops.Uint16, Constant_fill { values; strict } -> + | Ops.Uint16, Constant_fill { values; strict } -> ignore (constant_fill_f Int.of_float values strict) | Ops.Uint16, Range_over_offsets -> init_unpadded_region (fun idcs -> indices_to_offset ~dims:unpadded_dims ~idcs) | Ops.Uint16, Standard_uniform -> init_unpadded_region (fun _ -> Random.int 65536) - | Ops.Int32, Constant_fill { values; strict } -> + | Ops.Int32, Constant_fill { values; strict } -> ignore (constant_fill_f Int32.of_float values strict) | Ops.Int32, Range_over_offsets -> - init_unpadded_region (fun idcs -> Int32.of_int_exn @@ indices_to_offset ~dims:unpadded_dims ~idcs) - | Ops.Int32, Standard_uniform -> - init_unpadded_region (fun _ -> Random.int32 Int32.max_value) + init_unpadded_region (fun idcs -> + Int32.of_int_exn @@ indices_to_offset ~dims:unpadded_dims ~idcs) + | Ops.Int32, Standard_uniform -> init_unpadded_region (fun _ -> Random.int32 Int32.max_value) | Ops.Half, Constant_fill { values; strict } -> ignore (constant_fill_float values strict) | Ops.Half, Range_over_offsets -> init_unpadded_region (fun idcs -> Float.of_int @@ indices_to_offset ~dims:unpadded_dims ~idcs) - | Ops.Half, Standard_uniform -> - init_unpadded_region (fun _ -> Rand.Lib.float_range 0.0 1.0) + | Ops.Half, Standard_uniform -> init_unpadded_region (fun _ -> Rand.Lib.float_range 0.0 1.0) | Ops.Bfloat16, Constant_fill { values; strict } -> ignore (constant_fill_f float_to_bfloat16 values strict) | Ops.Bfloat16, Range_over_offsets -> @@ -232,23 +233,25 @@ let create_bigarray (type ocaml elt_t) (prec : (ocaml, elt_t) Ops.precision) ~di ignore (constant_fill_f (Fn.compose Char.of_int_exn float_to_fp8) values strict) | Ops.Fp8, Range_over_offsets -> init_unpadded_region (fun idcs -> - Char.of_int_exn @@ float_to_fp8 @@ Float.of_int @@ indices_to_offset ~dims:unpadded_dims ~idcs) + Char.of_int_exn @@ float_to_fp8 @@ Float.of_int + @@ indices_to_offset ~dims:unpadded_dims ~idcs) | Ops.Fp8, Standard_uniform -> - init_unpadded_region (fun _ -> Char.of_int_exn @@ float_to_fp8 @@ Rand.Lib.float_range 0.0 1.0) + init_unpadded_region (fun _ -> + Char.of_int_exn @@ float_to_fp8 @@ Rand.Lib.float_range 0.0 1.0) | Ops.Single, Constant_fill { values; strict } -> ignore (constant_fill_float values strict) | Ops.Single, Range_over_offsets -> init_unpadded_region (fun idcs -> Float.of_int @@ indices_to_offset ~dims:unpadded_dims ~idcs) - | Ops.Single, Standard_uniform -> - init_unpadded_region (fun _ -> Rand.Lib.float_range 0.0 1.0) + | Ops.Single, Standard_uniform -> init_unpadded_region (fun _ -> Rand.Lib.float_range 0.0 1.0) | Ops.Double, Constant_fill { values; strict } -> ignore (constant_fill_float values strict) | Ops.Double, Range_over_offsets -> init_unpadded_region (fun idcs -> Float.of_int @@ indices_to_offset ~dims:unpadded_dims ~idcs) - | Ops.Double, Standard_uniform -> - init_unpadded_region (fun _ -> Rand.Lib.float_range 0.0 1.0) + | Ops.Double, Standard_uniform -> init_unpadded_region (fun _ -> Rand.Lib.float_range 0.0 1.0) | _, File_mapped (filename, stored_prec) -> (* For file mapping, we don't support padding yet - require no padding *) if Option.is_some padding then - raise @@ Utils.User_error "Ndarray.create_bigarray: File_mapped initialization does not support padding"; + raise + @@ Utils.User_error + "Ndarray.create_bigarray: File_mapped initialization does not support padding"; (* See: https://github.com/janestreet/torch/blob/master/src/torch/dataset_helper.ml#L3 *) if not @@ Ops.equal_prec stored_prec (Ops.pack_prec prec) then raise @@ -384,8 +387,7 @@ let reset_bigarray (init_op : Ops.init_op) (type o b) (prec : (o, b) Ops.precisi | Ops.Int32, Constant_fill { values; strict } -> constant_set_f Int32.of_float values strict | Ops.Int32, Range_over_offsets -> set_bigarray arr ~f:(fun idcs -> Int32.of_int_exn @@ indices_to_offset ~dims ~idcs) - | Ops.Int32, Standard_uniform -> - set_bigarray arr ~f:(fun _ -> Random.int32 Int32.max_value) + | Ops.Int32, Standard_uniform -> set_bigarray arr ~f:(fun _ -> Random.int32 Int32.max_value) | Ops.Half, Constant_fill { values; strict } -> constant_set_float values strict | Ops.Half, Range_over_offsets -> set_bigarray arr ~f:(fun idcs -> Float.of_int @@ indices_to_offset ~dims ~idcs) @@ -558,8 +560,8 @@ let hash_t nd = Nativeint.hash @@ to_native nd let used_memory = Atomic.make 0 -let%track7_sexp create_array ~debug:(_debug : string) (prec : Ops.prec) ~(dims : int array) - ~padding init_op = +let%track7_sexp create_array ~debug:(_debug : string) (prec : Ops.prec) ~(dims : int array) ~padding + init_op = (* dims already includes padding if padding is specified *) let size_in_bytes : int = (if Array.length dims = 0 then 0 else Array.reduce_exn dims ~f:( * )) * Ops.prec_in_bytes prec File "arrayjit/lib/gcc_backend.ml", line 1, characters 0-0: diff --git a/_build/default/arrayjit/lib/gcc_backend.ml b/_build/default/arrayjit/lib/.formatted/gcc_backend.ml index 6bcb3b9..8d7a7ec 100644 --- a/_build/default/arrayjit/lib/gcc_backend.ml +++ b/_build/default/arrayjit/lib/.formatted/gcc_backend.ml @@ -233,10 +233,9 @@ let compile_main ~name ~log_functions ~env { ctx; nodes; get_ident; merge_node; | Iterator s -> Map.find_exn env s | Affine { symbols; offset } -> List.fold symbols ~init:(RValue.int ctx c_index offset) ~f:(fun acc (coeff, s) -> - RValue.binary_op ctx Plus c_index acc - (RValue.binary_op ctx Mult c_index - (RValue.int ctx c_index coeff) - (Map.find_exn env s)))) + RValue.binary_op ctx Plus c_index acc + (RValue.binary_op ctx Mult c_index (RValue.int ctx c_index coeff) + (Map.find_exn env s)))) with e -> Stdlib.Format.eprintf "exec_as_gccjit: missing index from@ %a@ among environment keys:@ %a\n%!" Sexp.pp_hum @@ -359,10 +358,14 @@ let compile_main ~name ~log_functions ~env { ctx; nodes; get_ident; merge_node; | Embed_index (Fixed_idx i) -> (Int.to_string i, []) | Embed_index (Iterator s) -> (Indexing.symbol_ident s ^ "{=%d}", [ Map.find_exn env s ]) | Embed_index (Affine { symbols; offset }) -> - let terms = List.map symbols ~f:(fun (coeff, s) -> - if coeff = 1 then Indexing.symbol_ident s - else Int.to_string coeff ^ "*" ^ Indexing.symbol_ident s) in - let expr = String.concat ~sep:"+" (terms @ if offset = 0 then [] else [Int.to_string offset]) in + let terms = + List.map symbols ~f:(fun (coeff, s) -> + if coeff = 1 then Indexing.symbol_ident s + else Int.to_string coeff ^ "*" ^ Indexing.symbol_ident s) + in + let expr = + String.concat ~sep:"+" (terms @ if offset = 0 then [] else [ Int.to_string offset ]) + in (expr, []) | Binop (Arg1, v1, _v2) -> loop v1 | Binop (Arg2, _v1, v2) -> loop v2 @@ -524,10 +527,9 @@ let compile_main ~name ~log_functions ~env { ctx; nodes; get_ident; merge_node; raise e) | Embed_index (Affine { symbols; offset }) -> List.fold symbols ~init:(RValue.int ctx num_typ offset) ~f:(fun acc (coeff, s) -> - RValue.binary_op ctx Plus num_typ acc - (RValue.binary_op ctx Mult num_typ - (RValue.int ctx num_typ coeff) - (RValue.cast ctx (Map.find_exn env s) num_typ))) + RValue.binary_op ctx Plus num_typ acc + (RValue.binary_op ctx Mult num_typ (RValue.int ctx num_typ coeff) + (RValue.cast ctx (Map.find_exn env s) num_typ))) | Binop (Arg2, _, c2) -> loop c2 | Binop (Arg1, c1, _) -> loop c1 | Binop (op, c1, c2) -> loop_binop op ~num_typ prec ~v1:(loop c1) ~v2:(loop c2) File "arrayjit/lib/low_level.ml", line 1, characters 0-0: diff --git a/_build/default/arrayjit/lib/low_level.ml b/_build/default/arrayjit/lib/.formatted/low_level.ml index 7e519f9..ea6ac75 100644 --- a/_build/default/arrayjit/lib/low_level.ml +++ b/_build/default/arrayjit/lib/.formatted/low_level.ml @@ -157,7 +157,7 @@ let visit_llc traced_store ~merge_node_id reverse_node_map ~max_visits llc = | Iterator s -> Option.value ~default:(* static index *) 0 @@ Map.find env s | Indexing.Affine { symbols; offset } -> List.fold symbols ~init:offset ~f:(fun acc (coeff, s) -> - acc + coeff * (Option.value ~default:0 @@ Map.find env s))) + acc + (coeff * (Option.value ~default:0 @@ Map.find env s)))) in let rec loop_proc env llc = let loop = loop_proc env in @@ -196,8 +196,8 @@ let visit_llc traced_store ~merge_node_id reverse_node_map ~max_visits llc = assert (Tn.equal old_tn tn) | Indexing.Affine { symbols; _ } -> List.iter symbols ~f:(fun (_, s) -> - let old_tn = Hashtbl.find_or_add reverse_node_map s ~default:(fun () -> tn) in - assert (Tn.equal old_tn tn))) + let old_tn = Hashtbl.find_or_add reverse_node_map s ~default:(fun () -> tn) in + assert (Tn.equal old_tn tn))) | Set_local (_, llv) -> loop_float env llv | Comment _ -> () | Staged_compilation _ -> () @@ -279,11 +279,14 @@ let%diagn2_sexp check_and_store_virtual traced static_indices top_llc = function | Fixed_idx _ -> None | Iterator s -> Option.some_if (not @@ Set.mem static_indices s) s - | Affine { symbols; _ } -> + | Affine { symbols; _ } -> ( (* For affine indices, collect all symbols that are not static *) List.filter_map symbols ~f:(fun (_, s) -> - Option.some_if (not @@ Set.mem static_indices s) s) - |> function [] -> None | [s] -> Some s | _ -> failwith "check_idcs: multiple non-static symbols in affine index") + Option.some_if (not @@ Set.mem static_indices s) s) + |> function + | [] -> None + | [ s ] -> Some s + | _ -> failwith "check_idcs: multiple non-static symbols in affine index")) in let num_syms = Array.count indices ~f:(function Iterator s -> not @@ Set.mem static_indices s | _ -> false) @@ -349,11 +352,13 @@ let%diagn2_sexp check_and_store_virtual traced static_indices top_llc = raise @@ Non_virtual 10) | Embed_index (Affine { symbols; _ }) -> List.iter symbols ~f:(fun (_, s) -> - if not @@ Set.mem env_dom s then ( - if not (Set.mem static_indices s) then - [%log2 - "Inlining candidate has an escaping variable", (s : Indexing.symbol), (top_llc : t)]; - raise @@ Non_virtual 10)) + if not @@ Set.mem env_dom s then ( + if not (Set.mem static_indices s) then + [%log2 + "Inlining candidate has an escaping variable", + (s : Indexing.symbol), + (top_llc : t)]; + raise @@ Non_virtual 10)) | Ternop (_, llv1, llv2, llv3) -> loop_float ~env_dom llv1; loop_float ~env_dom llv2; @@ -686,7 +691,7 @@ let simplify_llc llc = | Get_global _ -> llv | Embed_index (Fixed_idx i) -> Constant (Float.of_int i) | Embed_index (Iterator _) -> llv - | Embed_index (Affine _) -> llv (* Cannot simplify affine expressions to constants *) + | Embed_index (Affine _) -> llv (* Cannot simplify affine expressions to constants *) | Binop (Arg1, llv1, _) -> loop_float llv1 | Binop (Arg2, _, llv2) -> loop_float llv2 | Binop (op, Constant c1, Constant c2) -> Constant (Ops.interpret_binop op c1 c2) dune build @fmt failed "/usr/bin/env" "bash" "-c" "opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2)" failed with exit status 2 2025-06-13 17:16.02: Job failed: Failed: Build failed