Organisationsahrefsocannl102b9f ()(lint-fmt)

(lint-fmt)

Logs

Show full logs
2025-07-20 19:29.11: New job: test ahrefs/ocannl https://github.com/ahrefs/ocannl.git#refs/heads/master (102b9f8597b7ba636456e34110b45247713051ba) (linux-x86_64:(lint-fmt))
Base: ocaml/opam:debian-12-ocaml-4.08@sha256:4b3e5b2d1be26cada6c08f752ca0b48d3b0ba20fec23648d53395a83f1ae2517
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 102b9f85
cat > Dockerfile <<'END-OF-DOCKERFILE'
FROM ocaml/opam:debian-12-ocaml-4.08@sha256:4b3e5b2d1be26cada6c08f752ca0b48d3b0ba20fec23648d53395a83f1ae2517
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-07-20 19:29.11: Using cache hint "ahrefs/ocannl-ocaml/opam:debian-12-ocaml-4.08@sha256:4b3e5b2d1be26cada6c08f752ca0b48d3b0ba20fec23648d53395a83f1ae2517-debian-12-4.08_opam-2.3-ocamlformat-0eea63ad71af2b1116c556023bedc6bf083e6125"
2025-07-20 19:29.11: Using OBuilder spec:
((from ocaml/opam:debian-12-ocaml-4.08@sha256:4b3e5b2d1be26cada6c08f752ca0b48d3b0ba20fec23648d53395a83f1ae2517)
 (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-07-20 19:29.11: Waiting for resource in pool OCluster
2025-07-20 19:29.11: Waiting for worker…
2025-07-20 19:29.11: Got resource from pool OCluster
Building on toxis.caelum.ci.dev
HEAD is now at 3c0a07cf Fixes #324: Make Tensor.print non-forcing by default; refactor forward_and_forget to forward_and_force
HEAD is now at 102b9f85 Fix Tensor.print endlines

(from ocaml/opam:debian-12-ocaml-4.08@sha256:4b3e5b2d1be26cada6c08f752ca0b48d3b0ba20fec23648d53395a83f1ae2517)
2025-07-20 19:29.12 ---> using "6cffc1a1a52caf2843bd473effea9756e568737c821ae9874d1cb7264a14fd20" 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"))
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-07-20 19:29.12 ---> using "302b09a07f3e63cf843954026241e2145dcd9d48aa46e6f73f5e6c2a8313c3c9" from cache

/: (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.1

<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[dune.3.19.1] found in cache

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed dune.3.19.1
Done.
# Run eval $(opam env) to update the current shell environment
2025-07-20 19:29.12 ---> using "cea7a1b4577ed221adf5a742377b6f150ff7832adb27838f80bf4faa7e02e12f" from cache

/: (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 dune-build-info   3.19.1   [required by ocamlformat-lib]
  - 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 menhir            20240715 [required by ocamlformat-lib]
  - install dune-configurator 3.19.1   [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
[base.v0.14.3] 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.1] found in cache
[dune-configurator.3.19.1] found in cache
[either.1.0.0] found in cache
[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] found in cache
[ocamlformat-lib.0.27.0] found in cache
[ocp-indent.1.8.1] found in cache
[re.1.11.0] found in cache
[sexplib0.v0.14.0] found in cache
[stdio.v0.14.0] found in cache
[topkg.1.0.8] found in cache
[uucp.15.0.0] found in cache
[uuseg.15.0.0] found in cache
[uutf.1.0.4] found in cache

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed seq.base
-> installed camlp-streams.5.0.1
-> installed csexp.1.5.2
-> installed either.1.0.0
-> installed cmdliner.1.3.0
-> installed fix.20250428
-> installed menhirCST.20240715
-> installed menhirLib.20240715
-> installed menhirSdk.20240715
-> installed ocaml-version.4.0.1
-> installed sexplib0.v0.14.0
-> installed re.1.11.0
-> installed dune-build-info.3.19.1
-> installed dune-configurator.3.19.1
-> installed ocamlfind.1.9.8
-> installed base-bytes.base
-> installed ocp-indent.1.8.1
-> installed ocamlbuild.0.16.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 fpath.0.7.3
-> installed menhir.20240715
-> 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-07-20 19:29.12 ---> using "77996898021cad247d81d8eceeba4066a697607f4a9fdc67bee5a3313579cd44" from cache

/src: (copy (src .) (dst /src/))
2025-07-20 19:29.12 ---> saved as "32b505031a452790ea3b04ecb53a0c07063245c6d739be3a37544fa3a80cbaca"

/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 30-43:
6 |   (pps ppx_here 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/operations/dune:17
-> required by _build/default/test/operations/config/ocannl_backend.txt
-> required by %{read:config/ocannl_backend.txt} at test/operations/dune:33
-> required by Computing directory contents of _build/default/test/operations
File "arrayjit/bin/dune", line 6, characters 7-15:
6 |   (pps ppx_here ppx_minidebug ppx_sexp_conv))
           ^^^^^^^^
Error: Library "ppx_here" 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/operations/dune:17
-> required by _build/default/test/operations/config/ocannl_backend.txt
-> required by %{read:config/ocannl_backend.txt} at test/operations/dune:33
-> required by Computing directory contents of _build/default/test/operations
File "lib/row.mli", line 1, characters 0-0:
diff --git a/_build/default/lib/row.mli b/_build/default/lib/.formatted/row.mli
index b57358a..7d504b5 100644
--- a/_build/default/lib/row.mli
+++ b/_build/default/lib/.formatted/row.mli
@@ -86,9 +86,9 @@ type total_elems =
 type row_constraint =
   | Unconstrained
   | Total_elems of { numerator : total_elems; divided_by : dim_var list }
-      (** The rows, inclusive of the further row spec, have this many elements.
-          The total is numerator / (product of divided_by variables).
-          divided_by has multiset semantics - the same variable can appear multiple times. *)
+      (** The rows, inclusive of the further row spec, have this many elements. The total is
+          numerator / (product of divided_by variables). divided_by has multiset semantics - the
+          same variable can appear multiple times. *)
   | Exact of dim list  (** The concatenated rows have these axes. *)
 [@@deriving equal, hash, compare, sexp_of]
 
File "datasets/half_moons.ml", line 1, characters 0-0:
diff --git a/_build/default/datasets/half_moons.ml b/_build/default/datasets/.formatted/half_moons.ml
index cd6bcd3..b40461a 100644
--- a/_build/default/datasets/half_moons.ml
+++ b/_build/default/datasets/.formatted/half_moons.ml
@@ -6,38 +6,33 @@ open Bigarray
 module Config = struct
   type t = {
     noise_range : float;  (** Range of noise to add to the coordinates *)
-    seed : int option;    (** Optional random seed for reproducibility *)
+    seed : int option;  (** Optional random seed for reproducibility *)
   }
 
-  let default = {
-    noise_range = 0.1;
-    seed = None;
-  }
+  let default = { noise_range = 0.1; seed = None }
 end
 
 (** Internal helper function to generate half moons with specified precision.
-    
+
     @param kind The bigarray kind (float32 or float64)
     @param config Configuration for noise and randomization
     @param len Number of samples per moon (total samples = len * 2)
-    @return A tuple of (coordinates, labels) where:
-            - coordinates is a bigarray of shape [len*2; 2] (batch_axis, output_axis)
-            - labels is a bigarray of shape [len*2; 1] (batch_axis, output_axis)
-            - First moon has label 1.0, second moon has label -1.0
-*)
+    @return
+      A tuple of (coordinates, labels) where:
+      - coordinates is a bigarray of shape [len*2; 2] (batch_axis, output_axis)
+      - labels is a bigarray of shape [len*2; 1] (batch_axis, output_axis)
+      - First moon has label 1.0, second moon has label -1.0 *)
 let generate_with_kind kind ?(config = Config.default) ~len () =
   (* Initialize random seed if specified *)
-  (match config.seed with
-  | Some seed -> Random.init seed
-  | None -> ());
+  (match config.seed with Some seed -> Random.init seed | None -> ());
 
   let noise () = Random.float (2.0 *. config.noise_range) -. config.noise_range in
   let total_samples = len * 2 in
-  
+
   (* Create bigarrays with batch axis first, then output axis *)
   let coordinates = Genarray.create kind c_layout [| total_samples; 2 |] in
   let labels = Genarray.create kind c_layout [| total_samples; 1 |] in
-  
+
   (* Generate first moon (label = 1.0) *)
   for i = 0 to len - 1 do
     let v = Float.of_int i *. Float.pi /. Float.of_int len in
@@ -46,9 +41,9 @@ let generate_with_kind kind ?(config = Config.default) ~len () =
     let y = s +. noise () in
     Genarray.set coordinates [| i; 0 |] x;
     Genarray.set coordinates [| i; 1 |] y;
-    Genarray.set labels [| i; 0 |] 1.0;
+    Genarray.set labels [| i; 0 |] 1.0
   done;
-  
+
   (* Generate second moon (label = -1.0) *)
   for i = 0 to len - 1 do
     let v = Float.of_int i *. Float.pi /. Float.of_int len in
@@ -58,50 +53,51 @@ let generate_with_kind kind ?(config = Config.default) ~len () =
     let idx = len + i in
     Genarray.set coordinates [| idx; 0 |] x;
     Genarray.set coordinates [| idx; 1 |] y;
-    Genarray.set labels [| idx; 0 |] (-1.0);
+    Genarray.set labels [| idx; 0 |] (-1.0)
   done;
-  
+
   (coordinates, labels)
 
 (** Generate the half moons dataset with the specified parameters.
-    
+
     @param config Configuration for noise and randomization
     @param len Number of samples per moon (total samples = len * 2)
-    @return A tuple of (coordinates, labels) where:
-            - coordinates is a bigarray of shape [len*2; 2] (batch_axis, output_axis)
-            - labels is a bigarray of shape [len*2; 1] (batch_axis, output_axis)
-            - First moon has label 1.0, second moon has label -1.0
-*)
-let generate ?(config = Config.default) ~len () =
-  generate_with_kind float64 ~config ~len ()
+    @return
+      A tuple of (coordinates, labels) where:
+      - coordinates is a bigarray of shape [len*2; 2] (batch_axis, output_axis)
+      - labels is a bigarray of shape [len*2; 1] (batch_axis, output_axis)
+      - First moon has label 1.0, second moon has label -1.0 *)
+let generate ?(config = Config.default) ~len () = generate_with_kind float64 ~config ~len ()
 
 (** Generate the half moons dataset with single precision floats.
-    
+
     @param config Configuration for noise and randomization
     @param len Number of samples per moon (total samples = len * 2)
-    @return A tuple of (coordinates, labels) where:
-            - coordinates is a bigarray of shape [len*2; 2] (batch_axis, output_axis) with float32 elements
-            - labels is a bigarray of shape [len*2; 1] (batch_axis, output_axis) with float32 elements
-            - First moon has label 1.0, second moon has label -1.0
-*)
+    @return
+      A tuple of (coordinates, labels) where:
+      - coordinates is a bigarray of shape [len*2; 2] (batch_axis, output_axis) with float32
+        elements
+      - labels is a bigarray of shape [len*2; 1] (batch_axis, output_axis) with float32 elements
+      - First moon has label 1.0, second moon has label -1.0 *)
 let generate_single_prec ?(config = Config.default) ~len () =
   generate_with_kind float32 ~config ~len ()
 
-(** Generate half moons dataset using the old array-based approach for compatibility.
-    This function is deprecated and provided for backwards compatibility.
-    
+(** Generate half moons dataset using the old array-based approach for compatibility. This function
+    is deprecated and provided for backwards compatibility.
+
     @param len Number of samples per moon
-    @param noise_range Range of noise to add  
-    @return A tuple of (coordinates_array, labels_array) as flat arrays
-*)
+    @param noise_range Range of noise to add
+    @return A tuple of (coordinates_array, labels_array) as flat arrays *)
 let generate_arrays ?(noise_range = 0.1) ~len () =
   let noise () = Random.float (2.0 *. noise_range) -. noise_range in
-  let coordinates = 
-    Array.concat (Array.to_list (Array.init len (fun _ ->
-        let i = Random.int len in
-        let v = Float.of_int i *. Float.pi /. Float.of_int len in
-        let c = Float.cos v and s = Float.sin v in
-        [| c +. noise (); s +. noise (); 1.0 -. c +. noise (); 0.5 -. s +. noise () |])))
+  let coordinates =
+    Array.concat
+      (Array.to_list
+         (Array.init len (fun _ ->
+              let i = Random.int len in
+              let v = Float.of_int i *. Float.pi /. Float.of_int len in
+              let c = Float.cos v and s = Float.sin v in
+              [| c +. noise (); s +. noise (); 1.0 -. c +. noise (); 0.5 -. s +. noise () |])))
   in
   let labels = Array.init (len * 2) (fun i -> if i mod 2 = 0 then 1. else -1.) in
-  (coordinates, labels)
\ No newline at end of file
+  (coordinates, labels)
File "bin/micrograd_demo_logging.ml", line 1, characters 0-0:
diff --git a/_build/default/bin/micrograd_demo_logging.ml b/_build/default/bin/.formatted/micrograd_demo_logging.ml
index 4886aca..9e16afc 100644
--- a/_build/default/bin/micrograd_demo_logging.ml
+++ b/_build/default/bin/.formatted/micrograd_demo_logging.ml
@@ -10,7 +10,7 @@ module Tn = Ir.Tnode
 
 module type Backend = Ir.Backend_intf.Backend
 
-let  () =
+let () =
   Tensor.unsafe_reinitialize ();
   Rand.init 0;
   let module Backend = (val Backends.fresh_backend ()) in
@@ -59,7 +59,9 @@ let _suspended () =
   List.iter ~f:(Option.iter ~f:(fun diff -> Train.set_hosted diff.Tensor.grad)) [ a.diff; b.diff ];
   let init_params = Tensor.init_params g in
   let update = Train.grad_update g in
-  let step = Train.to_routine (module Backend) ctx IDX.empty @@ Asgns.sequence [init_params; update] in
+  let step =
+    Train.to_routine (module Backend) ctx IDX.empty @@ Asgns.sequence [ init_params; update ]
+  in
   Tn.print_accessible_headers ();
   Utils.capture_stdout_logs @@ fun () ->
   Train.run step;
File "bin/moons_benchmark.ml", line 1, characters 0-0:
diff --git a/_build/default/bin/moons_benchmark.ml b/_build/default/bin/.formatted/moons_benchmark.ml
index f815ba9..8918c33 100644
--- a/_build/default/bin/moons_benchmark.ml
+++ b/_build/default/bin/.formatted/moons_benchmark.ml
@@ -54,7 +54,9 @@ let classify_moons ~seed ~on_device ~inlining_cutoff ~num_streams ~batch_size ~b
   (* let init_lr = 0.1 in *)
   let init_lr = 0.01 in
   let moons_config = Datasets.Half_moons.Config.{ noise_range = 0.1; seed = Some seed } in
-  let moons_coordinates, moons_labels = Datasets.Half_moons.generate ~config:moons_config ~len:flat_len () in
+  let moons_coordinates, moons_labels =
+    Datasets.Half_moons.generate ~config:moons_config ~len:flat_len ()
+  in
   let moons_flat_ndarray = Ir.Ndarray.as_array Ir.Ops.Double moons_coordinates in
   let moons_classes_ndarray = Ir.Ndarray.as_array Ir.Ops.Double moons_labels in
   let moons_flat ~b:_ = TDSL.rebatch ~l:"moons_flat" moons_flat_ndarray in
@@ -80,14 +82,14 @@ let classify_moons ~seed ~on_device ~inlining_cutoff ~num_streams ~batch_size ~b
   @@ Backend.get_global_debug_info ();
   let per_batch_callback ~at_batch ~at_step ~learning_rate ~batch_loss ~epoch_loss =
     Stdio.printf "Batch=%d, step=%d, lr=%f, batch loss=%f, epoch loss=%f\n%!" at_batch at_step
-       learning_rate batch_loss epoch_loss;
+      learning_rate batch_loss epoch_loss;
     if Option.is_none !start_time then start_time := Some (Time_now.nanoseconds_since_unix_epoch ())
   in
   (* Tn.print_accessible_headers (); *)
   let per_epoch_callback ~at_step ~at_epoch ~learning_rate ~epoch_loss =
     (* if at_epoch % 10 = 9 then *)
-      Stdio.printf "Epoch=%d, step=%d, lr=%f, epoch loss=%f\n%!" at_epoch at_step learning_rate
-        epoch_loss
+    Stdio.printf "Epoch=%d, step=%d, lr=%f, epoch loss=%f\n%!" at_epoch at_step learning_rate
+      epoch_loss
   in
 
   let {
File "bin/zero2hero_1of7.ml", line 1, characters 0-0:
diff --git a/_build/default/bin/zero2hero_1of7.ml b/_build/default/bin/.formatted/zero2hero_1of7.ml
index 29a259b..b7e2df3 100644
--- a/_build/default/bin/zero2hero_1of7.ml
+++ b/_build/default/bin/.formatted/zero2hero_1of7.ml
@@ -56,8 +56,7 @@ let _suspended () =
   let x_flat =
     Tensor.term ~grad_spec:Tensor.Require_grad
       ~label:[ "x_flat" ] (* ~input_dims:[] ~output_dims:[ 1 ] *)
-      ~fetch_op:(Constant_fill values)
-      ()
+      ~fetch_op:(Constant_fill values) ()
   in
   let step_sym, bindings = IDX.get_static_symbol ~static_range:size IDX.empty in
   (* The [let x =] line is the same as this except [let%op x =] uses [~grad_spec:If_needed]. *)
@@ -106,9 +105,7 @@ let _suspended () =
   let xs = Array.init size ~f:Float.(fun i -> (of_int i / 10.) - 5.) in
   (* Yay, the whole shape gets inferred! *)
   let x_flat =
-    Tensor.term ~grad_spec:Require_grad ~label:[ "x_flat" ]
-      ~fetch_op:(Constant_fill xs)
-      ()
+    Tensor.term ~grad_spec:Require_grad ~label:[ "x_flat" ] ~fetch_op:(Constant_fill xs) ()
   in
   let step_sym, bindings = IDX.get_static_symbol ~static_range:size IDX.empty in
   let%op x = x_flat @| step_sym in
File "lib/ppx_op.ml", line 1, characters 0-0:
diff --git a/_build/default/lib/ppx_op.ml b/_build/default/lib/.formatted/ppx_op.ml
index fe5d727..24aa423 100644
--- a/_build/default/lib/ppx_op.ml
+++ b/_build/default/lib/.formatted/ppx_op.ml
@@ -21,7 +21,7 @@ let make_p ~has_config ~loc =
 
 let make_vb ?value ~has_config ~loc ~str_loc ~ident string =
   let pat = Ast_helper.Pat.var ~loc { loc = str_loc; txt = ident } in
-  let value = match value with Some c -> [%expr Some [%e c] ] | None -> [%expr None] in
+  let value = match value with Some c -> [%expr Some [%e c]] | None -> [%expr None] in
   let v = [%expr [%e make_p ~has_config ~loc] ?value:[%e value] [%e string]] in
   let vb = Ast_helper.Vb.mk ~loc pat v in
   (pat, vb)
File "lib/train.ml", line 1, characters 0-0:
diff --git a/_build/default/lib/train.ml b/_build/default/lib/.formatted/train.ml
index 2c536b2..3909797 100644
--- a/_build/default/lib/train.ml
+++ b/_build/default/lib/.formatted/train.ml
@@ -550,8 +550,8 @@ let%track3_sexp forward_and_ctx ?(hosted = true) ?(skip_init = false)
   Task.run routine.schedule;
   routine.context
 
-(** [forward_and_force] is a wrapper around {!forward_and_ctx} that additionally forces the
-    tensor's value and ensures it is transferred back to host as needed, see the setting
+(** [forward_and_force] is a wrapper around {!forward_and_ctx} that additionally forces the tensor's
+    value and ensures it is transferred back to host as needed, see the setting
     {!Utils.settings.automatic_host_transfers}. The resulting context is ignored.
 
     Note: [Tensor.print ~force_read:true] also has this effect, so: using [forward_and_force] you
File "lib/operation.ml", line 1, characters 0-0:
diff --git a/_build/default/lib/operation.ml b/_build/default/lib/.formatted/operation.ml
index 7aae7b8..2edd85d 100644
--- a/_build/default/lib/operation.ml
+++ b/_build/default/lib/.formatted/operation.ml
@@ -375,17 +375,10 @@ let embed_symbol ?(label = []) static_sym : Tensor.t =
     (Shape.make ~batch_dims:[] ~input_dims:[] ~output_dims:[ 1 ] ())
     []
 
-(* 
-let random_seed =
-  let seed = Option.value ~default:42 @@ Utils.settings.fixed_state_for_init in
-  let res =
-    Tensor.term ~label:[ "random_seed" ] ~grad_spec:Prohibit_grad
-      ~fetch_op:(Asgns.Constant_fill [| Int.to_float seed |])
-      ()
-  in
-  Tn.update_memory_mode res.value Tn.Effectively_constant 24;
-  Tn.update_prec res.value Ir.Ops.uint4x32;
-  ref res *)
+(* let random_seed = let seed = Option.value ~default:42 @@ Utils.settings.fixed_state_for_init in
+   let res = Tensor.term ~label:[ "random_seed" ] ~grad_spec:Prohibit_grad
+   ~fetch_op:(Asgns.Constant_fill [| Int.to_float seed |]) () in Tn.update_memory_mode res.value
+   Tn.Effectively_constant 24; Tn.update_prec res.value Ir.Ops.uint4x32; ref res *)
 
 module DO = struct
   let ( * ) = matmul ~grad_spec:If_needed
@@ -448,8 +441,8 @@ end
     omitted. Note: the data should have no padding and if padding is inferred, the data will be
     copied; otherwise, the resulting tensor value shares host memory with the ndarray. *)
 let reshape ~l ?b ?(i = []) ?o ndarray =
-  Tensor.term ~label:[ l ] ?batch_dims:b ~input_dims:i ?output_dims:o ~init_data:(Asgns.Reshape ndarray)
-    ()
+  Tensor.term ~label:[ l ] ?batch_dims:b ~input_dims:i ?output_dims:o
+    ~init_data:(Asgns.Reshape ndarray) ()
 
 (** The dimensions are taken from the provided ndarray, but the split into axis kinds still needs to
     be inferred (or provided). Assumes no padding. See also: {!reshape} and {!TDSL.wrap_param}. *)
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 92101dd..6c72e1a 100644
--- a/_build/default/arrayjit/lib/assignments.ml
+++ b/_build/default/arrayjit/lib/.formatted/assignments.ml
@@ -171,7 +171,7 @@ let%diagn2_sexp to_low_level code =
     assert (Array.length idcs = Array.length (Lazy.force tn.Tn.dims));
     match buffer with
     | Node tn -> Low_level.Get (tn, idcs)
-    | Merge_buffer tn -> 
+    | Merge_buffer tn ->
         (* FIXME: NOT IMPLEMENTED YET - need to handle merge buffer access differently now *)
         Low_level.Get (tn, idcs)
   in
@@ -267,7 +267,6 @@ let%diagn2_sexp to_low_level code =
     | Fetch { array; fetch_op = Embed_symbol s; dims } ->
         Low_level.loop_over_dims (Lazy.force dims) ~body:(fun idcs ->
             set array idcs @@ Embed_index (Iterator s.static_symbol))
-
     | Fetch { array; fetch_op = Range_over_offsets; dims = (lazy dims) } ->
         Low_level.loop_over_dims dims ~body:(fun idcs ->
             let offset = Indexing.reflect_projection ~dims ~projection:idcs in
File "arrayjit/lib/metal_backend.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/lib/metal_backend.ml b/_build/default/arrayjit/lib/.formatted/metal_backend.ml
index 5bad5b7..5eb7e2f 100644
--- a/_build/default/arrayjit/lib/metal_backend.ml
+++ b/_build/default/arrayjit/lib/.formatted/metal_backend.ml
@@ -526,8 +526,8 @@ end) : Ir.Backend_impl.Lowered_backend = struct
                  ^^ string ("0.0" ^ s)))
       | ToPowOf, _ -> func "pow"
       | Threefry4x32, _ ->
-        (* FIXME: NOT IMPLEMENTED YET *)
-         func "threefry4x32" (* Metal implementation of Threefry4x32 *)
+          (* FIXME: NOT IMPLEMENTED YET *)
+          func "threefry4x32" (* Metal implementation of Threefry4x32 *)
       | Arg1, _ | Arg2, _ -> invalid_arg "Metal C_syntax_config: Arg1/Arg2 not operators"
 
     let unop_syntax prec op =
@@ -559,7 +559,11 @@ end) : Ir.Backend_impl.Lowered_backend = struct
       | Not, _ -> fun v -> string "!" ^^ v
       | Uint4x32_to_prec_uniform target_prec, _ ->
           (* FIXME: NOT IMPLEMENTED YET - placeholder for Uint4x32_to_prec_uniform conversion *)
-          fun _v -> string ("/* FIXME: uint4x32_to_" ^ Ops.prec_string target_prec ^ "_uniform */ (0.0" ^ metal_prec_suffix_float target_prec ^ ")")
+          fun _v ->
+            string
+              ("/* FIXME: uint4x32_to_" ^ Ops.prec_string target_prec ^ "_uniform */ (0.0"
+              ^ metal_prec_suffix_float target_prec
+              ^ ")")
     (* Logical not *)
 
     let convert_precision ~from ~to_ =
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 0b5136d..62d960e 100644
--- a/_build/default/arrayjit/lib/ndarray.ml
+++ b/_build/default/arrayjit/lib/.formatted/ndarray.ml
@@ -204,17 +204,15 @@ let get_voidptr_not_managed nd : unit Ctypes.ptr =
 let adjust_idx_for_padding ?padding idx =
   match padding with
   | None -> idx
-  | Some padding_arr -> 
-      Array.mapi idx ~f:(fun i dim_idx -> 
-        if i < Array.length padding_arr then
-          dim_idx + padding_arr.(i).left
-        else dim_idx)
+  | Some padding_arr ->
+      Array.mapi idx ~f:(fun i dim_idx ->
+          if i < Array.length padding_arr then dim_idx + padding_arr.(i).left else dim_idx)
 
 (** Helper function to compute end index for iteration, respecting padding margins *)
 let compute_end_idx ?padding dims axis =
   match padding with
   | None -> dims.(axis) - 1
-  | Some padding_arr when axis < Array.length padding_arr -> 
+  | Some padding_arr when axis < Array.length padding_arr ->
       dims.(axis) - padding_arr.(axis).left - padding_arr.(axis).right - 1
   | Some _ -> dims.(axis) - 1
 
@@ -247,12 +245,11 @@ let fold_bigarray ?padding arr ~init ~f =
   let dims = A.dims arr in
   let accu = ref init in
   let rec cloop idx col =
-    if col = Array.length idx then 
+    if col = Array.length idx then
       let adjusted_idx = adjust_idx_for_padding ?padding idx in
       accu := f !accu idx @@ A.get arr adjusted_idx
     else
-      let end_idx = compute_end_idx ?padding dims col
-      in
+      let end_idx = compute_end_idx ?padding dims col in
       for j = 0 to end_idx do
         idx.(col) <- j;
         cloop idx (Int.succ col)
@@ -265,15 +262,22 @@ let fold_bigarray ?padding arr ~init ~f =
 let fold_as_float ?padding ~init ~f arr =
   match arr with
   | Byte_nd arr ->
-      fold_bigarray ?padding ~init ~f:(fun accu idx c -> f accu idx @@ Float.of_int @@ Char.to_int c) arr
-  | Uint16_nd arr -> fold_bigarray ?padding ~init ~f:(fun accu idx v -> f accu idx @@ Float.of_int v) arr
-  | Int32_nd arr -> fold_bigarray ?padding ~init ~f:(fun accu idx v -> f accu idx @@ Int32.to_float v) arr
-  | Uint4x32_nd arr -> fold_bigarray ?padding ~init ~f:(fun accu idx c -> f accu idx c.Stdlib.Complex.re) arr
+      fold_bigarray ?padding ~init
+        ~f:(fun accu idx c -> f accu idx @@ Float.of_int @@ Char.to_int c)
+        arr
+  | Uint16_nd arr ->
+      fold_bigarray ?padding ~init ~f:(fun accu idx v -> f accu idx @@ Float.of_int v) arr
+  | Int32_nd arr ->
+      fold_bigarray ?padding ~init ~f:(fun accu idx v -> f accu idx @@ Int32.to_float v) arr
+  | Uint4x32_nd arr ->
+      fold_bigarray ?padding ~init ~f:(fun accu idx c -> f accu idx c.Stdlib.Complex.re) arr
   | Half_nd arr -> fold_bigarray ?padding ~init ~f arr
   | Bfloat16_nd arr ->
       fold_bigarray ?padding ~init ~f:(fun accu idx v -> f accu idx @@ bfloat16_to_float v) arr
   | Fp8_nd arr ->
-      fold_bigarray ?padding ~init ~f:(fun accu idx c -> f accu idx @@ fp8_to_float @@ Char.to_int c) arr
+      fold_bigarray ?padding ~init
+        ~f:(fun accu idx c -> f accu idx @@ fp8_to_float @@ Char.to_int c)
+        arr
   | Single_nd arr -> fold_bigarray ?padding ~init ~f arr
   | Double_nd arr -> fold_bigarray ?padding ~init ~f arr
 
@@ -317,8 +321,7 @@ let retrieve_2d_points ?from_axis ?padding ~xdim ~ydim arr =
         result := (x, y) :: !result
       else if axis = from_axis then iter (axis + 1)
       else
-        let end_idx = compute_end_idx ?padding dims axis
-        in
+        let end_idx = compute_end_idx ?padding dims axis in
         for p = 0 to end_idx do
           idx.(axis) <- p;
           iter (axis + 1)
@@ -344,8 +347,7 @@ let retrieve_1d_points ?from_axis ?padding ~xdim arr =
         result := x :: !result
       else if axis = from_axis then iter (axis + 1)
       else
-       let end_idx = compute_end_idx ?padding dims axis
-        in
+        let end_idx = compute_end_idx ?padding dims axis in
         for p = 0 to end_idx do
           idx.(axis) <- p;
           iter (axis + 1)
@@ -366,8 +368,7 @@ let retrieve_flat_values ?padding arr =
         let x = get_as_float ?padding arr idx in
         result := x :: !result
       else
-        let end_idx = compute_end_idx ?padding dims axis
-        in
+        let end_idx = compute_end_idx ?padding dims axis in
         for p = 0 to end_idx do
           idx.(axis) <- p;
           iter (axis + 1)
@@ -386,11 +387,9 @@ let set_flat_values ?padding arr values =
       if axis = n_axes then (
         if !values_idx < Array.length values then (
           set_from_float ?padding arr idx values.(!values_idx);
-          Int.incr values_idx
-        ))
+          Int.incr values_idx))
       else
-        let end_idx = compute_end_idx ?padding dims axis
-        in
+        let end_idx = compute_end_idx ?padding dims axis in
         for p = 0 to end_idx do
           idx.(axis) <- p;
           iter (axis + 1)
@@ -466,18 +465,18 @@ let int_dims_to_string ?(with_axis_numbers = false) ?padding dims =
     String.concat_array ~sep:" x "
     @@ Array.mapi dims ~f:(fun d s -> Int.to_string d ^ ":" ^ Int.to_string s)
   else
-    let dim_strings = Array.mapi dims ~f:(fun i dim ->
-      match padding with
-      | None -> Int.to_string dim
-      | Some padding_arr when i < Array.length padding_arr ->
-          let unpadded_dim = dim - padding_arr.(i).left - padding_arr.(i).right in
-          let total_padding = padding_arr.(i).left + padding_arr.(i).right in
-          if total_padding > 0 then
-            Int.to_string unpadded_dim ^ "+" ^ Int.to_string total_padding
-          else
-            Int.to_string dim
-      | Some _ -> Int.to_string dim
-    ) in
+    let dim_strings =
+      Array.mapi dims ~f:(fun i dim ->
+          match padding with
+          | None -> Int.to_string dim
+          | Some padding_arr when i < Array.length padding_arr ->
+              let unpadded_dim = dim - padding_arr.(i).left - padding_arr.(i).right in
+              let total_padding = padding_arr.(i).left + padding_arr.(i).right in
+              if total_padding > 0 then
+                Int.to_string unpadded_dim ^ "+" ^ Int.to_string total_padding
+              else Int.to_string dim
+          | Some _ -> Int.to_string dim)
+    in
     String.concat_array ~sep:"x" dim_strings
 
 (** Logs information about the array on the default ppx_minidebug runtime, if
File "arrayjit/lib/c_syntax.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/lib/c_syntax.ml b/_build/default/arrayjit/lib/.formatted/c_syntax.ml
index 776da2e..722f427 100644
--- a/_build/default/arrayjit/lib/c_syntax.ml
+++ b/_build/default/arrayjit/lib/.formatted/c_syntax.ml
@@ -646,9 +646,9 @@ module C_syntax (B : C_syntax_config) = struct
         (defs, expr)
     | Unop (Ops.Uint4x32_to_prec_uniform target_prec, v) ->
         let defs, expr_v = pp_float prec v in
-        let expr = 
-          string ("uint4x32_to_" ^ Ops.prec_string target_prec ^ "_uniform(") ^^
-          expr_v ^^ string ")"
+        let expr =
+          string ("uint4x32_to_" ^ Ops.prec_string target_prec ^ "_uniform(")
+          ^^ expr_v ^^ string ")"
         in
         (defs, expr)
     | Unop (op, v) ->
@@ -720,9 +720,9 @@ module C_syntax (B : C_syntax_config) = struct
         (B.binop_syntax prec op v1_doc v2_doc, idcs1 @ idcs2)
     | Unop (Ops.Uint4x32_to_prec_uniform target_prec, v) ->
         let v_doc, idcs = debug_float prec v in
-        let expr_doc = 
-          string ("uint4x32_to_" ^ Ops.prec_string target_prec ^ "_uniform(") ^^
-          v_doc ^^ string "){=" ^^ string B.float_log_style ^^ string "}"
+        let expr_doc =
+          string ("uint4x32_to_" ^ Ops.prec_string target_prec ^ "_uniform(")
+          ^^ v_doc ^^ string "){=" ^^ string B.float_log_style ^^ string "}"
         in
         (expr_doc, idcs)
     | Unop (op, v) ->
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 e36eeb6..18d0be0 100644
--- a/_build/default/arrayjit/lib/low_level.ml
+++ b/_build/default/arrayjit/lib/.formatted/low_level.ml
@@ -158,7 +158,6 @@ let is_constexpr_comp traced_store llv =
     | Get_local { tn; _ } | Local_scope { id = { tn; _ }; _ } ->
         let traced = get_node traced_store tn in
         traced.is_scalar_constexpr
-
     | Get (tn, _) ->
         let traced = get_node traced_store tn in
         traced.is_scalar_constexpr
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-07-20 19:29.13: Job failed: Failed: Build failed