Organisationsahrefsocannl1f8007 ()(lint-fmt)

(lint-fmt)

Logs

Show full logs
2025-11-27 17:45.56: New job: test ahrefs/ocannl https://github.com/ahrefs/ocannl.git#refs/heads/master (1f80072750fec2a0dbf9b61bf397384a3824c40e) (linux-x86_64:(lint-fmt))
Base: ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321
ocamlformat version: version 0.28.1 (from opam)

To reproduce locally:

git clone --recursive "https://github.com/ahrefs/ocannl.git" -b "master" && cd "ocannl" && git reset --hard 1f800727
cat > Dockerfile <<'END-OF-DOCKERFILE'
FROM ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321
USER 1000:1000
RUN cd ~/opam-repository && (git cat-file -e 6c1b38620288b5bf349067f089a7b1fc91185d94 || git fetch origin master) && git reset -q --hard 6c1b38620288b5bf349067f089a7b1fc91185d94 && git log --no-decorate -n1 --oneline && opam update -u
RUN opam depext -i dune
WORKDIR /src
RUN opam depext -i ocamlformat=0.28.1
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-11-27 17:45.56: Using cache hint "ahrefs/ocannl-ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321-debian-13-4.08_opam-2.4-ocamlformat-6c1b38620288b5bf349067f089a7b1fc91185d94"
2025-11-27 17:45.56: Using OBuilder spec:
((from ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321)
 (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 6c1b38620288b5bf349067f089a7b1fc91185d94 || git fetch origin master) && git reset -q --hard 6c1b38620288b5bf349067f089a7b1fc91185d94 && 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.28.1"))
 (copy (src .) (dst /src/))
 (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)"))
)

2025-11-27 17:45.56: Waiting for resource in pool OCluster
2025-11-27 17:45.56: Waiting for worker…
2025-11-27 17:45.56: Got resource from pool OCluster
Building on bremusa.ocamllabs.io
HEAD is now at 2356bf8d README update
HEAD is now at 1f800727 Update test expectations

(from ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321)
2025-11-27 17:45.57 ---> using "d458486dd7823c592e7ea9c88366c5f90e1939c3b51f3abbd6760272096f8a3e" 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 6c1b38620288b5bf349067f089a7b1fc91185d94 || git fetch origin master) && git reset -q --hard 6c1b38620288b5bf349067f089a7b1fc91185d94 && git log --no-decorate -n1 --oneline && opam update -u"))
6c1b386202 Merge pull request #28774 from Julow/release-ocamlformat-0.28.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-11-27 17:46.55 ---> saved as "a7d3c7d9f6aff7dc059c465a33e7ef3fda4b4a1ee9c79bef8645b5cd4da72b96"

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

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

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed dune.3.20.2
Done.
# Run eval $(opam env) to update the current shell environment
2025-11-27 17:47.21 ---> saved as "b8799a0f87a66bd49a9341889a0027044c03db80ad17a5edb3adaf72f166d8fd"

/: (workdir /src)

/src: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
           (network host)
           (shell "opam depext -i ocamlformat=0.28.1"))
# 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 ocamlbuild        0.16.1   [required by fpath, astring, uuseg]
  - install either            1.0.0    [required by ocamlformat-lib]
  - install menhirLib         20250912 [required by ocamlformat-lib]
  - install csexp             1.5.2    [required by ocamlformat]
  - install camlp-streams     5.0.1    [required by ocamlformat-lib]
  - install seq               base     [required by re]
  - install menhirSdk         20250912 [required by ocamlformat-lib]
  - install fix               20250919 [required by ocamlformat-lib]
  - install menhirCST         20250912 [required by menhir]
  - install ocamlfind         1.9.8    [required by ocp-indent, astring, fpath, uuseg]
  - install dune-build-info   3.20.2   [required by ocamlformat-lib]
  - install cmdliner          2.0.0    [required by ocamlformat]
  - install ocaml-version     4.0.3    [required by ocamlformat-lib]
  - install dune-configurator 3.20.2   [required by base]
  - install re                1.11.0   [required by ocamlformat]
  - install menhir            20250912 [required by ocamlformat-lib]
  - install topkg             1.1.1    [required by fpath, astring, uuseg]
  - install ocp-indent        1.9.0    [required by ocamlformat-lib]
  - 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 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.28.1   [required by ocamlformat]
  - install ocamlformat       0.28.1
===== 28 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.2.0.0] found in cache
[csexp.1.5.2] found in cache
[dune-build-info.3.20.2] found in cache
[dune-configurator.3.20.2] found in cache
[either.1.0.0] found in cache
[fix.20250919] found in cache
[fpath.0.7.3] found in cache
[menhir.20250912] found in cache
[menhirCST.20250912] found in cache
[menhirLib.20250912] found in cache
[menhirSdk.20250912] found in cache
[ocaml-version.4.0.3] found in cache
[ocamlbuild.0.16.1] found in cache
[ocamlfind.1.9.8] found in cache
[ocamlformat.0.28.1] found in cache
[ocamlformat-lib.0.28.1] found in cache
[ocp-indent.1.9.0] 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.1.1] 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 fix.20250919
-> installed cmdliner.2.0.0
-> installed menhirCST.20250912
-> installed menhirLib.20250912
-> installed menhirSdk.20250912
-> installed ocaml-version.4.0.3
-> installed re.1.11.0
-> installed sexplib0.v0.14.0
-> installed dune-build-info.3.20.2
-> installed dune-configurator.3.20.2
-> installed ocamlfind.1.9.8
-> installed ocp-indent.1.9.0
-> installed ocamlbuild.0.16.1
-> installed base.v0.14.3
-> installed topkg.1.1.1
-> installed stdio.v0.14.0
-> installed uutf.1.0.4
-> installed astring.0.8.5
-> installed fpath.0.7.3
-> installed menhir.20250912
-> installed uucp.15.0.0
-> installed uuseg.15.0.0
-> installed ocamlformat-lib.0.28.1
-> installed ocamlformat.0.28.1
Done.

<><> ocp-indent.1.9.0 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-11-27 17:48.14 ---> saved as "7b71439e6ac9917292b28dc59ecc075d01d03dd2ef11c372809a6cf99e594a22"

/src: (copy (src .) (dst /src/))
2025-11-27 17:48.15 ---> saved as "740ea5d06b9e288b98ae6c1a1852127971b679853cfa3b666dca4b2014ef3366"

/src: (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)"))
File "tensor/einsum_types.ml", line 1, characters 0-0:
diff --git a/_build/default/tensor/einsum_types.ml b/_build/default/tensor/.formatted/einsum_types.ml
index 20634eb..2753b9e 100644
--- a/_build/default/tensor/einsum_types.ml
+++ b/_build/default/tensor/.formatted/einsum_types.ml
@@ -11,17 +11,14 @@ type axis_spec =
 
 type axis_key_kind = [ `Batch | `Input | `Output ] [@@deriving equal, compare, sexp]
 
-type axis_key = {
-  in_axes : axis_key_kind;
-  pos : int;
-  from_end : bool;
-}
+type axis_key = { in_axes : axis_key_kind; pos : int; from_end : bool }
 [@@deriving equal, compare, sexp]
 
 module AxisKey = struct
   module T = struct
     type t = axis_key [@@deriving equal, compare, sexp]
   end
+
   include T
   include Comparator.Make (T)
 end
File "tensor/einsum_parser.mli", line 1, characters 0-0:
diff --git a/_build/default/tensor/einsum_parser.mli b/_build/default/tensor/.formatted/einsum_parser.mli
index 37c1317..11e907b 100644
--- a/_build/default/tensor/einsum_parser.mli
+++ b/_build/default/tensor/.formatted/einsum_parser.mli
@@ -1,36 +1,33 @@
 (** Entry point for the einsum parser library.
 
-    This module provides functions to parse einsum notation specifications
-    using a Menhir-based parser.
-*)
+    This module provides functions to parse einsum notation specifications using a Menhir-based
+    parser. *)
 
 open Base
 
 (* Re-export types from Einsum_types *)
 include module type of Einsum_types
 
-(** Exception raised when parsing fails. *)
 exception Parse_error of string
+(** Exception raised when parsing fails. *)
 
-(** Determine if a spec uses multichar mode.
-    Multichar mode is triggered by presence of: ',', '*', '+', '^', '&' *)
 val is_multichar : string -> bool
+(** Determine if a spec uses multichar mode. Multichar mode is triggered by presence of: ',', '*',
+    '+', '^', '&' *)
 
+val axis_labels_of_spec : string -> parsed_axis_labels
 (** Parse an axis labels specification.
 
     Examples:
     - "abc" (single-char mode)
     - "a, b, c" (multichar mode, triggered by comma)
     - "batch|input->output"
-    - "...a..b"
-*)
-val axis_labels_of_spec : string -> parsed_axis_labels
+    - "...a..b" *)
 
+val einsum_of_spec : string -> parsed_axis_labels * parsed_axis_labels option * parsed_axis_labels
 (** Parse an einsum specification.
 
     Examples:
     - "ij;jk=>ik" (matrix multiplication)
     - "ij=>ji" (transpose/permute)
-    - "i,j->2*i+j" (convolution)
-*)
-val einsum_of_spec : string -> parsed_axis_labels * parsed_axis_labels option * parsed_axis_labels
+    - "i,j->2*i+j" (convolution) *)
File "tensor/einsum_parser.ml", line 1, characters 0-0:
diff --git a/_build/default/tensor/einsum_parser.ml b/_build/default/tensor/.formatted/einsum_parser.ml
index 7820992..3ee7eff 100644
--- a/_build/default/tensor/einsum_parser.ml
+++ b/_build/default/tensor/.formatted/einsum_parser.ml
@@ -1,8 +1,7 @@
 (** Entry point for the einsum parser library.
 
-    This module provides functions to parse einsum notation specifications
-    using a Menhir-based parser (instead of Angstrom).
-*)
+    This module provides functions to parse einsum notation specifications using a Menhir-based
+    parser (instead of Angstrom). *)
 
 open Base
 
@@ -18,28 +17,24 @@ let is_multichar = Lexer.is_multichar
 let axis_labels_of_spec spec =
   let multichar = is_multichar spec in
   let lexbuf = Lexing.from_string spec in
-  try
-    Parser.axis_labels_spec (Lexer.token multichar) lexbuf
-  with
-  | Lexer.Syntax_error msg ->
-      raise (Parse_error ("Lexer error: " ^ msg))
+  try Parser.axis_labels_spec (Lexer.token multichar) lexbuf with
+  | Lexer.Syntax_error msg -> raise (Parse_error ("Lexer error: " ^ msg))
   | Parser.Error ->
       let pos = lexbuf.Lexing.lex_curr_p in
       let line = pos.Lexing.pos_lnum in
       let col = pos.Lexing.pos_cnum - pos.Lexing.pos_bol in
-      raise (Parse_error (Printf.sprintf "Parse error at line %d, column %d in spec: %s" line col spec))
+      raise
+        (Parse_error (Printf.sprintf "Parse error at line %d, column %d in spec: %s" line col spec))
 
 (* Parse einsum specification *)
 let einsum_of_spec spec =
   let multichar = is_multichar spec in
   let lexbuf = Lexing.from_string spec in
-  try
-    Parser.einsum_spec (Lexer.token multichar) lexbuf
-  with
-  | Lexer.Syntax_error msg ->
-      raise (Parse_error ("Lexer error: " ^ msg))
+  try Parser.einsum_spec (Lexer.token multichar) lexbuf with
+  | Lexer.Syntax_error msg -> raise (Parse_error ("Lexer error: " ^ msg))
   | Parser.Error ->
       let pos = lexbuf.Lexing.lex_curr_p in
       let line = pos.Lexing.pos_lnum in
       let col = pos.Lexing.pos_cnum - pos.Lexing.pos_bol in
-      raise (Parse_error (Printf.sprintf "Parse error at line %d, column %d in spec: %s" line col spec))
+      raise
+        (Parse_error (Printf.sprintf "Parse error at line %d, column %d in spec: %s" line col spec))
File "tensor/ppx_extend_dsls.ml", line 1, characters 0-0:
diff --git a/_build/default/tensor/ppx_extend_dsls.ml b/_build/default/tensor/.formatted/ppx_extend_dsls.ml
index e30e785..352c5b7 100644
--- a/_build/default/tensor/ppx_extend_dsls.ml
+++ b/_build/default/tensor/.formatted/ppx_extend_dsls.ml
@@ -50,19 +50,19 @@ let str_expander ~loc:pstr_loc ~path:_ str_items =
     let item_bindings, op_item_bindings =
       List.unzip
       @@ List.concat_map str_items ~f:(function
-           | { pstr_desc = Pstr_value (Nonrecursive, bindings); pstr_loc = loc; _ } ->
-               List.map bindings ~f:(fun binding ->
-                   let params, binding = transform_dsl_binding ~loc ~dsl_name binding in
-                   let op_binding = transform_op_binding params binding in
-                   (binding, op_binding))
-           | { pstr_loc = loc; _ } ->
-               let pat = Ast_helper.Pat.var ~loc { txt = "syntax_error"; loc } in
-               let v =
-                 Ast_builder.Default.pexp_extension ~loc
-                 @@ Location.error_extensionf ~loc
-                      "ppx_extend_dsls: currently only non-recursive value bindings are supported"
-               in
-               [ (Ast_helper.Vb.mk ~loc pat v, Ast_helper.Vb.mk ~loc pat v) ])
+        | { pstr_desc = Pstr_value (Nonrecursive, bindings); pstr_loc = loc; _ } ->
+            List.map bindings ~f:(fun binding ->
+                let params, binding = transform_dsl_binding ~loc ~dsl_name binding in
+                let op_binding = transform_op_binding params binding in
+                (binding, op_binding))
+        | { pstr_loc = loc; _ } ->
+            let pat = Ast_helper.Pat.var ~loc { txt = "syntax_error"; loc } in
+            let v =
+              Ast_builder.Default.pexp_extension ~loc
+              @@ Location.error_extensionf ~loc
+                   "ppx_extend_dsls: currently only non-recursive value bindings are supported"
+            in
+            [ (Ast_helper.Vb.mk ~loc pat v, Ast_helper.Vb.mk ~loc pat v) ])
     in
     let item = { pstr_desc = Pstr_value (Nonrecursive, item_bindings); pstr_loc } in
     let op_item = { pstr_desc = Pstr_value (Nonrecursive, op_item_bindings); pstr_loc } in
File "tensor/row.mli", line 1, characters 0-0:
diff --git a/_build/default/tensor/row.mli b/_build/default/tensor/.formatted/row.mli
index f7da42b..aa8bf20 100644
--- a/_build/default/tensor/row.mli
+++ b/_build/default/tensor/.formatted/row.mli
@@ -128,12 +128,7 @@ type row_entry =
 type constraint_ =
   | Dim_eq of { d1 : dim; d2 : dim; origin : constraint_origin list }
   | Row_eq of { r1 : t; r2 : t; origin : constraint_origin list }
-  | Dim_ineq of {
-      cur : dim;
-      subr : dim;
-      from_ : Sexp.t;
-      origin : constraint_origin list;
-    }
+  | Dim_ineq of { cur : dim; subr : dim; from_ : Sexp.t; origin : constraint_origin list }
   | Row_ineq of { cur : t; subr : t; origin : constraint_origin list }
   | Dim_constr of { d : dim; constr : dim_constraint; origin : constraint_origin list }
   | Rows_constr of { r : t list; constr : row_constraint; origin : constraint_origin list }
@@ -197,7 +192,6 @@ type proj [@@deriving compare, equal, sexp]
 type proj_env [@@deriving sexp_of]
 
 val fresh_row_proj : t -> t
-
 val populate_dim_proj_in_solved : environment -> environment
 
 type proj_equation =
File "arrayjit/test/tree_map_test.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/test/tree_map_test.ml b/_build/default/arrayjit/test/.formatted/tree_map_test.ml
index 5f9acfa..3939c56 100644
--- a/_build/default/arrayjit/test/tree_map_test.ml
+++ b/_build/default/arrayjit/test/.formatted/tree_map_test.ml
@@ -5,7 +5,6 @@ open Utils
 (* Demo of Tree_map with tree-preserving sexp output *)
 let () =
   let open Tree_map in
-
   (* Create a tree by inserting values *)
   let tree =
     empty
@@ -23,8 +22,10 @@ let () =
   printf "%s\n\n" (Sexp.to_string_hum (sexp_of_t Int.sexp_of_t String.sexp_of_t tree));
 
   (* Test lookups *)
-  printf "Finding key 4: %s\n" (Option.value ~default:"not found" (find ~compare:Int.compare ~key:4 tree));
-  printf "Finding key 10: %s\n" (Option.value ~default:"not found" (find ~compare:Int.compare ~key:10 tree));
+  printf "Finding key 4: %s\n"
+    (Option.value ~default:"not found" (find ~compare:Int.compare ~key:4 tree));
+  printf "Finding key 10: %s\n"
+    (Option.value ~default:"not found" (find ~compare:Int.compare ~key:10 tree));
 
   (* Print as association list *)
   printf "\nAs alist (in-order): ";
File "arrayjit/lib/context.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/lib/context.ml b/_build/default/arrayjit/lib/.formatted/context.ml
index 9752637..d1edcba 100644
--- a/_build/default/arrayjit/lib/context.ml
+++ b/_build/default/arrayjit/lib/.formatted/context.ml
@@ -24,7 +24,7 @@ type backend_wrapper =
       -> backend_wrapper
 
 type t = {
-  backend_wrapper : (backend_wrapper [@sexp.opaque]);
+  backend_wrapper : (backend_wrapper[@sexp.opaque]);
   device_id : int;
   backend_name : string;
   initialized_nodes : Set.M(Tn).t; (* Track which nodes have been initialized *)
File "test/einsum/test_einsum_parser.ml", line 1, characters 0-0:
diff --git a/_build/default/test/einsum/test_einsum_parser.ml b/_build/default/test/einsum/.formatted/test_einsum_parser.ml
index 8169f5c..23ce388 100644
--- a/_build/default/test/einsum/test_einsum_parser.ml
+++ b/_build/default/test/einsum/.formatted/test_einsum_parser.ml
@@ -12,17 +12,15 @@ let test_single_char () =
   (* Test 2: With batch and input *)
   let spec2 = "b|i->o" in
   let labels2 = Einsum_parser.axis_labels_of_spec spec2 in
-  printf "  'b|i->o' -> batch:%d input:%d output:%d\n"
-    labels2.given_batch labels2.given_input labels2.given_output;
+  printf "  'b|i->o' -> batch:%d input:%d output:%d\n" labels2.given_batch labels2.given_input
+    labels2.given_output;
 
   (* Test 3: Einsum spec *)
   let spec3 = "ij;jk=>ik" in
-  let (l1, l2_opt, l3) = Einsum_parser.einsum_of_spec spec3 in
+  let l1, l2_opt, l3 = Einsum_parser.einsum_of_spec spec3 in
   let l2 = Option.value_exn l2_opt in
-  printf "  'ij;jk=>ik' -> (%d,%d);(%d,%d)=>(%d,%d)\n"
-    l1.given_input l1.given_output
-    l2.given_input l2.given_output
-    l3.given_input l3.given_output;
+  printf "  'ij;jk=>ik' -> (%d,%d);(%d,%d)=>(%d,%d)\n" l1.given_input l1.given_output l2.given_input
+    l2.given_output l3.given_input l3.given_output;
 
   printf "\n"
 
File "arrayjit/lib/datatypes.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/lib/datatypes.ml b/_build/default/arrayjit/lib/.formatted/datatypes.ml
index 35404a7..d1a76ca 100644
--- a/_build/default/arrayjit/lib/datatypes.ml
+++ b/_build/default/arrayjit/lib/.formatted/datatypes.ml
@@ -39,8 +39,8 @@ let tl_exn = function
   | Empty -> raise @@ Not_found_s (Sexp.Atom "mutable_list.tl_exn")
   | Cons { tl; _ } -> tl
 
-(** A dynamic array of weak references. *)
 type 'a weak_dynarray = 'a Stdlib.Weak.t ref
+(** A dynamic array of weak references. *)
 
 let weak_create () : 'a weak_dynarray = ref @@ Stdlib.Weak.create 0
 
@@ -67,12 +67,12 @@ let weak_iter (arr : 'a weak_dynarray) ~f =
     Option.iter (W.get !arr i) ~f
   done
 
-(** A lazy value that can be safely forced and compared by unique ID. *)
 type 'a safe_lazy = {
   mutable value : [ `Callback of unit -> 'a | `Value of 'a ];
   unique_id : string;
 }
 [@@deriving sexp_of]
+(** A lazy value that can be safely forced and compared by unique ID. *)
 
 let safe_lazy unique_id f = { value = `Callback f; unique_id }
 
@@ -123,37 +123,42 @@ let sexp_of_safe_lazy sexp_of_elem gated =
       Sexp.List [ Sexp.Atom "value"; status ];
     ]
 
-(** A persistent map implemented as a balanced binary tree.
-    The sexp_of function preserves and displays the tree structure. *)
+(** A persistent map implemented as a balanced binary tree. The sexp_of function preserves and
+    displays the tree structure. *)
 module Tree_map = struct
   type ('k, 'v) t =
     | Empty
-    | Node of {
-        key : 'k;
-        value : 'v;
-        left : ('k, 'v) t;
-        right : ('k, 'v) t;
-        height : int;
-      }
+    | Node of { key : 'k; value : 'v; left : ('k, 'v) t; right : ('k, 'v) t; height : int }
 
   let empty = Empty
-
   let height = function Empty -> 0 | Node { height; _ } -> height
 
   let create key value left right =
     Node { key; value; left; right; height = 1 + max (height left) (height right) }
 
-  let balance_factor = function
-    | Empty -> 0
-    | Node { left; right; _ } -> height left - height right
+  let balance_factor = function Empty -> 0 | Node { left; right; _ } -> height left - height right
 
   let rotate_right = function
-    | Node { key; value; left = Node { key = lkey; value = lvalue; left = ll; right = lr; _ }; right; _ } ->
+    | Node
+        {
+          key;
+          value;
+          left = Node { key = lkey; value = lvalue; left = ll; right = lr; _ };
+          right;
+          _;
+        } ->
         create lkey lvalue ll (create key value lr right)
     | t -> t
 
   let rotate_left = function
-    | Node { key; value; left; right = Node { key = rkey; value = rvalue; left = rl; right = rr; _ }; _ } ->
+    | Node
+        {
+          key;
+          value;
+          left;
+          right = Node { key = rkey; value = rvalue; left = rl; right = rr; _ };
+          _;
+        } ->
         create rkey rvalue (create key value left rl) rr
     | t -> t
 
@@ -162,18 +167,22 @@ module Tree_map = struct
     | bf when bf > 1 -> (
         match t with
         | Node { left; _ } when balance_factor left < 0 ->
-            rotate_right (create (match t with Node n -> n.key | _ -> assert false)
-                           (match t with Node n -> n.value | _ -> assert false)
-                           (rotate_left left)
-                           (match t with Node n -> n.right | _ -> assert false))
+            rotate_right
+              (create
+                 (match t with Node n -> n.key | _ -> assert false)
+                 (match t with Node n -> n.value | _ -> assert false)
+                 (rotate_left left)
+                 (match t with Node n -> n.right | _ -> assert false))
         | _ -> rotate_right t)
     | bf when bf < -1 -> (
         match t with
         | Node { right; _ } when balance_factor right > 0 ->
-            rotate_left (create (match t with Node n -> n.key | _ -> assert false)
-                          (match t with Node n -> n.value | _ -> assert false)
-                          (match t with Node n -> n.left | _ -> assert false)
-                          (rotate_right right))
+            rotate_left
+              (create
+                 (match t with Node n -> n.key | _ -> assert false)
+                 (match t with Node n -> n.value | _ -> assert false)
+                 (match t with Node n -> n.left | _ -> assert false)
+                 (rotate_right right))
         | _ -> rotate_left t)
     | _ -> t
 
@@ -200,7 +209,9 @@ module Tree_map = struct
     | Empty -> false
     | Node n ->
         let c = compare key n.key in
-        if c = 0 then true else if c < 0 then mem ~compare ~key n.left else mem ~compare ~key n.right
+        if c = 0 then true
+        else if c < 0 then mem ~compare ~key n.left
+        else mem ~compare ~key n.right
 
   let rec fold t ~init ~f =
     match t with
@@ -221,14 +232,12 @@ module Tree_map = struct
   let rec map t ~f =
     match t with
     | Empty -> Empty
-    | Node n ->
-        create n.key (f n.value) (map n.left ~f) (map n.right ~f)
+    | Node n -> create n.key (f n.value) (map n.left ~f) (map n.right ~f)
 
   let rec mapi t ~f =
     match t with
     | Empty -> Empty
-    | Node n ->
-        create n.key (f ~key:n.key ~data:n.value) (mapi n.left ~f) (mapi n.right ~f)
+    | Node n -> create n.key (f ~key:n.key ~data:n.value) (mapi n.left ~f) (mapi n.right ~f)
 
   let to_alist t = List.rev (fold t ~init:[] ~f:(fun ~key ~data acc -> (key, data) :: acc))
 
File "test/operations/test_where_simple.ml", line 1, characters 0-0:
diff --git a/_build/default/test/operations/test_where_simple.ml b/_build/default/test/operations/.formatted/test_where_simple.ml
index 3a1f08c..9940f2a 100644
--- a/_build/default/test/operations/test_where_simple.ml
+++ b/_build/default/test/operations/.formatted/test_where_simple.ml
@@ -7,7 +7,7 @@ let () =
   Tensor.unsafe_reinitialize ();
   let ctx = Context.auto () in
   (* Simple test: where(true, x, y) should have gradient flow to x only *)
-  let x = Tensor.number  ~grad_spec:Require_grad 2.0 in
+  let x = Tensor.number ~grad_spec:Require_grad 2.0 in
   let y = Tensor.number ~grad_spec:Require_grad 3.0 in
   let cond = Tensor.number 1.0 in
   (* true *)
File "arrayjit/lib/indexing.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/lib/indexing.ml b/_build/default/arrayjit/lib/.formatted/indexing.ml
index e4c9e9b..89414e4 100644
--- a/_build/default/arrayjit/lib/indexing.ml
+++ b/_build/default/arrayjit/lib/.formatted/indexing.ml
@@ -291,15 +291,15 @@ let identity_projections ?debug_info ?derived_for ~lhs_dims () =
 let reflect_projection ~(dims : int array) ~(projection : axis_index array) =
   Array.zip_exn dims projection
   |> Array.fold_right ~init:(1, [], 0) ~f:(fun (dim, idx) (stride, symbols, offset) ->
-         match idx with
-         | Fixed_idx fixed_offset -> (stride * dim, symbols, offset + (fixed_offset * stride))
-         | Iterator sym -> (stride * dim, (stride, sym) :: symbols, offset)
-         | Affine { symbols = affine_symbols; offset = affine_offset } ->
-             let new_symbols =
-               List.map affine_symbols ~f:(fun (coeff, sym) -> (coeff * stride, sym))
-             in
-             (stride * dim, new_symbols @ symbols, offset + (affine_offset * stride))
-         | Sub_axis -> (stride * dim, symbols, offset))
+      match idx with
+      | Fixed_idx fixed_offset -> (stride * dim, symbols, offset + (fixed_offset * stride))
+      | Iterator sym -> (stride * dim, (stride, sym) :: symbols, offset)
+      | Affine { symbols = affine_symbols; offset = affine_offset } ->
+          let new_symbols =
+            List.map affine_symbols ~f:(fun (coeff, sym) -> (coeff * stride, sym))
+          in
+          (stride * dim, new_symbols @ symbols, offset + (affine_offset * stride))
+      | Sub_axis -> (stride * dim, symbols, offset))
   |> fun (_, symbols, offset) -> Affine { symbols; offset }
 
 type variable_ref = { ref_label : string; mutable solved_dim : int option }
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 1b0d474..aa856f0 100644
--- a/_build/default/lib/train.ml
+++ b/_build/default/lib/.formatted/train.ml
@@ -183,7 +183,8 @@ let every_non_literal_on_host =
 
 module Lazy = Utils.Lazy
 
-let%track7_sexp to_routine (ctx : Context.t) ?(output_cd_file = false) ?(hosted = true) bindings comp =
+let%track7_sexp to_routine (ctx : Context.t) ?(output_cd_file = false) ?(hosted = true) bindings
+    comp =
   if output_cd_file then (
     let name = Asgns.get_name_exn comp.Asgns.asgns in
     if not Utils.settings.output_debug_files_in_build_directory then
File "test/operations/primitive_ops.ml", line 1, characters 0-0:
diff --git a/_build/default/test/operations/primitive_ops.ml b/_build/default/test/operations/.formatted/primitive_ops.ml
index ccf0ebb..e3b3174 100644
--- a/_build/default/test/operations/primitive_ops.ml
+++ b/_build/default/test/operations/.formatted/primitive_ops.ml
@@ -31,9 +31,9 @@ let plot_unop ?(x_min = -5.) ?(x_max = 5.) ~f () =
   let ys, dys =
     Array.unzip
     @@ Array.mapi xs ~f:(fun i _ ->
-           step_ref := i;
-           Train.run ctx fx_routine;
-           (fx.@[0], x.@%[0]))
+        step_ref := i;
+        Train.run ctx fx_routine;
+        (fx.@[0], x.@%[0]))
   in
   (* It is fine to loop around the data: it's "next epoch". We redo the work though. *)
   PrintBox_utils.plot ~x_label:"x" ~y_label:"f(x)"
File "test/operations/test_random_histograms.ml", line 1, characters 0-0:
diff --git a/_build/default/test/operations/test_random_histograms.ml b/_build/default/test/operations/.formatted/test_random_histograms.ml
index 7d0e22d..558b282 100644
--- a/_build/default/test/operations/test_random_histograms.ml
+++ b/_build/default/test/operations/.formatted/test_random_histograms.ml
@@ -18,16 +18,15 @@ let print_histogram bins ~title ~max_width =
   let max_count = Array.max_elt bins ~compare:Int.compare |> Option.value ~default:0 in
   let total = Array.fold bins ~init:0 ~f:( + ) in
   Array.iteri bins ~f:(fun i count ->
-      let bar_width = (count * max_width) / max_count in
+      let bar_width = count * max_width / max_count in
       let bar = String.make bar_width '#' in
-      let percentage = (Float.of_int count /. Float.of_int total) *. 100.0 in
+      let percentage = Float.of_int count /. Float.of_int total *. 100.0 in
       printf "Bin %2d: %s %4d (%.1f%%)\n" i bar count percentage)
 
 let test_uniform_at_histogram () =
   Tensor.unsafe_reinitialize ();
   let ctx = Context.auto () in
   let module O = TDSL.O in
-
   (* Generate a large batch of random numbers using uniform_at *)
   (* Note: uniform_at produces 4 values per counter input (from uint4x32) *)
   let num_counters = 2500 in
@@ -42,8 +41,8 @@ let test_uniform_at_histogram () =
   ignore (Ocannl.Train.forward_once ctx uniform_values);
   let result = Ir.Tnode.get_values uniform_values.value in
 
-  printf "Generated %d values from %d counters (%.1fx expansion)\n"
-    (Array.length result) num_counters
+  printf "Generated %d values from %d counters (%.1fx expansion)\n" (Array.length result)
+    num_counters
     (Float.of_int (Array.length result) /. Float.of_int num_counters);
 
   (* Create and print histogram *)
@@ -52,10 +51,9 @@ let test_uniform_at_histogram () =
   print_histogram bins ~title:"Uniform Distribution [0, 1) Histogram" ~max_width:40;
 
   (* Statistical tests *)
-  let mean = Array.fold result ~init:0.0 ~f:(+.) /. Float.of_int (Array.length result) in
+  let mean = Array.fold result ~init:0.0 ~f:( +. ) /. Float.of_int (Array.length result) in
   let variance =
-    Array.fold result ~init:0.0 ~f:(fun acc x ->
-        acc +. ((x -. mean) *. (x -. mean)))
+    Array.fold result ~init:0.0 ~f:(fun acc x -> acc +. ((x -. mean) *. (x -. mean)))
     /. Float.of_int (Array.length result)
   in
   let std_dev = Float.sqrt variance in
@@ -73,8 +71,8 @@ let test_uniform_at_histogram () =
         let diff = Float.of_int observed -. expected_per_bin in
         acc +. (diff *. diff /. expected_per_bin))
   in
-  printf "  Chi-square statistic: %.2f (df=%d, critical value at 0.05: ~%.2f)\n"
-    chi_square (num_bins - 1) 30.14;
+  printf "  Chi-square statistic: %.2f (df=%d, critical value at 0.05: ~%.2f)\n" chi_square
+    (num_bins - 1) 30.14;
 
   (* Check if all values are in range *)
   let all_in_range = Array.for_all result ~f:(fun x -> Float.(x >= 0.0 && x < 1.0)) in
@@ -84,7 +82,6 @@ let test_normal_at_histogram () =
   Tensor.unsafe_reinitialize ();
   let ctx = Context.auto () in
   let module O = TDSL.O in
-
   (* Generate a large batch of random numbers using normal_at *)
   (* Note: normal_at also produces 4 values per counter input *)
   let num_counters = 2500 in
@@ -100,10 +97,9 @@ let test_normal_at_histogram () =
   let result = Ir.Tnode.get_values normal_values.value in
 
   (* Calculate statistics *)
-  let mean = Array.fold result ~init:0.0 ~f:(+.) /. Float.of_int (Array.length result) in
+  let mean = Array.fold result ~init:0.0 ~f:( +. ) /. Float.of_int (Array.length result) in
   let variance =
-    Array.fold result ~init:0.0 ~f:(fun acc x ->
-        acc +. ((x -. mean) *. (x -. mean)))
+    Array.fold result ~init:0.0 ~f:(fun acc x -> acc +. ((x -. mean) *. (x -. mean)))
     /. Float.of_int (Array.length result)
   in
   let std_dev = Float.sqrt variance in
@@ -124,15 +120,9 @@ let test_normal_at_histogram () =
   printf "  Max: %.4f\n" max_val;
 
   (* Check what percentage falls within standard deviations *)
-  let within_1_std =
-    Array.count result ~f:(fun x -> Float.(abs x <= 1.0))
-  in
-  let within_2_std =
-    Array.count result ~f:(fun x -> Float.(abs x <= 2.0))
-  in
-  let within_3_std =
-    Array.count result ~f:(fun x -> Float.(abs x <= 3.0))
-  in
+  let within_1_std = Array.count result ~f:(fun x -> Float.(abs x <= 1.0)) in
+  let within_2_std = Array.count result ~f:(fun x -> Float.(abs x <= 2.0)) in
+  let within_3_std = Array.count result ~f:(fun x -> Float.(abs x <= 3.0)) in
 
   printf "  Within 1 std dev: %.1f%% (expected: ~68.3%%)\n"
     (Float.of_int within_1_std /. Float.of_int (Array.length result) *. 100.0);
@@ -143,20 +133,23 @@ let test_normal_at_histogram () =
 
   (* Normality test using skewness and kurtosis *)
   let skewness =
-    let sum_cubed = Array.fold result ~init:0.0 ~f:(fun acc x ->
-        let diff = x -. mean in
-        acc +. (diff *. diff *. diff))
+    let sum_cubed =
+      Array.fold result ~init:0.0 ~f:(fun acc x ->
+          let diff = x -. mean in
+          acc +. (diff *. diff *. diff))
     in
     sum_cubed /. (Float.of_int (Array.length result) *. std_dev *. std_dev *. std_dev)
   in
 
   let kurtosis =
-    let sum_fourth = Array.fold result ~init:0.0 ~f:(fun acc x ->
-        let diff = x -. mean in
-        let diff2 = diff *. diff in
-        acc +. (diff2 *. diff2))
+    let sum_fourth =
+      Array.fold result ~init:0.0 ~f:(fun acc x ->
+          let diff = x -. mean in
+          let diff2 = diff *. diff in
+          acc +. (diff2 *. diff2))
     in
-    (sum_fourth /. (Float.of_int (Array.length result) *. std_dev *. std_dev *. std_dev *. std_dev)) -. 3.0
+    (sum_fourth /. (Float.of_int (Array.length result) *. std_dev *. std_dev *. std_dev *. std_dev))
+    -. 3.0
   in
 
   printf "  Skewness: %.4f (expected: ~0.0)\n" skewness;
@@ -166,7 +159,6 @@ let test_batched_generation_consistency () =
   Tensor.unsafe_reinitialize ();
   let ctx = Context.auto () in
   let module O = TDSL.O in
-
   (* Test that batched generation gives consistent results *)
   let batch_size = 100 in
   let num_batches = 10 in
@@ -205,9 +197,8 @@ let test_batched_generation_consistency () =
     Array.sort sorted ~compare:Float.compare;
     let unique = ref 1 in
     for i = 1 to Array.length sorted - 1 do
-      let diff = Float.abs (sorted.(i) -. sorted.(i-1)) in
-      if Float.(diff > 1e-7) then
-        unique := !unique + 1
+      let diff = Float.abs (sorted.(i) -. sorted.(i - 1)) in
+      if Float.(diff > 1e-7) then unique := !unique + 1
     done;
     !unique
   in
@@ -217,11 +208,9 @@ let test_batched_generation_consistency () =
   let unique_normal = count_unique !all_normal_values in
 
   printf "Generated %d values in %d batches of %d\n" total_values num_batches batch_size;
-  printf "Uniform values: %d unique out of %d (%.1f%%)\n"
-    unique_uniform total_values
+  printf "Uniform values: %d unique out of %d (%.1f%%)\n" unique_uniform total_values
     (Float.of_int unique_uniform /. Float.of_int total_values *. 100.0);
-  printf "Normal values: %d unique out of %d (%.1f%%)\n"
-    unique_normal total_values
+  printf "Normal values: %d unique out of %d (%.1f%%)\n" unique_normal total_values
     (Float.of_int unique_normal /. Float.of_int total_values *. 100.0);
 
   (* Verify batch consistency of statistical properties *)
@@ -234,40 +223,44 @@ let test_batched_generation_consistency () =
     let normal_batch = Array.sub !all_normal_values ~pos:start_idx ~len:batch_size in
 
     batch_means_uniform.(batch) <-
-      Array.fold uniform_batch ~init:0.0 ~f:(+.) /. Float.of_int batch_size;
+      Array.fold uniform_batch ~init:0.0 ~f:( +. ) /. Float.of_int batch_size;
     batch_means_normal.(batch) <-
-      Array.fold normal_batch ~init:0.0 ~f:(+.) /. Float.of_int batch_size
+      Array.fold normal_batch ~init:0.0 ~f:( +. ) /. Float.of_int batch_size
   done;
 
   let mean_of_means_uniform =
-    Array.fold batch_means_uniform ~init:0.0 ~f:(+.) /. Float.of_int num_batches
+    Array.fold batch_means_uniform ~init:0.0 ~f:( +. ) /. Float.of_int num_batches
   in
   let mean_of_means_normal =
-    Array.fold batch_means_normal ~init:0.0 ~f:(+.) /. Float.of_int num_batches
+    Array.fold batch_means_normal ~init:0.0 ~f:( +. ) /. Float.of_int num_batches
   in
 
   let std_of_means_uniform =
-    let diff_sum = Array.fold batch_means_uniform ~init:0.0 ~f:(fun acc x ->
-        let diff = x -. mean_of_means_uniform in
-        acc +. (diff *. diff)) in
+    let diff_sum =
+      Array.fold batch_means_uniform ~init:0.0 ~f:(fun acc x ->
+          let diff = x -. mean_of_means_uniform in
+          acc +. (diff *. diff))
+    in
     Float.sqrt (diff_sum /. Float.of_int num_batches)
   in
   let std_of_means_normal =
-    let diff_sum = Array.fold batch_means_normal ~init:0.0 ~f:(fun acc x ->
-        let diff = x -. mean_of_means_normal in
-        acc +. (diff *. diff)) in
+    let diff_sum =
+      Array.fold batch_means_normal ~init:0.0 ~f:(fun acc x ->
+          let diff = x -. mean_of_means_normal in
+          acc +. (diff *. diff))
+    in
     Float.sqrt (diff_sum /. Float.of_int num_batches)
   in
 
   printf "\nBatch means consistency:\n";
-  printf "  Uniform: mean of batch means = %.4f, std = %.4f\n"
-    mean_of_means_uniform std_of_means_uniform;
-  printf "  Normal: mean of batch means = %.4f, std = %.4f\n"
-    mean_of_means_normal std_of_means_normal
+  printf "  Uniform: mean of batch means = %.4f, std = %.4f\n" mean_of_means_uniform
+    std_of_means_uniform;
+  printf "  Normal: mean of batch means = %.4f, std = %.4f\n" mean_of_means_normal
+    std_of_means_normal
 
 let () =
   test_uniform_at_histogram ();
   printf "\n";
   test_normal_at_histogram ();
   printf "\n";
-  test_batched_generation_consistency ()
\ No newline at end of file
+  test_batched_generation_consistency ()
File "test/operations/zero2hero_1of7.ml", line 1, characters 0-0:
diff --git a/_build/default/test/operations/zero2hero_1of7.ml b/_build/default/test/operations/.formatted/zero2hero_1of7.ml
index f68634c..d2bc5e2 100644
--- a/_build/default/test/operations/zero2hero_1of7.ml
+++ b/_build/default/test/operations/.formatted/zero2hero_1of7.ml
@@ -175,9 +175,9 @@ let%expect_test "Graph drawing fetch" =
   let ys, dys =
     Array.unzip
     @@ Array.mapi xs ~f:(fun i _ ->
-           step_ref := i;
-           Train.run ctx fx_routine;
-           (fx.@[0], x.@%[0]))
+        step_ref := i;
+        Train.run ctx fx_routine;
+        (fx.@[0], x.@%[0]))
   in
   (* It is fine to loop around the data: it's "next epoch". We redo the work though. *)
   let plot_box =
File "tensor/ppx_shared.ml", line 1, characters 0-0:
diff --git a/_build/default/tensor/ppx_shared.ml b/_build/default/tensor/.formatted/ppx_shared.ml
index 8c26a58..33ae188 100644
--- a/_build/default/tensor/ppx_shared.ml
+++ b/_build/default/tensor/.formatted/ppx_shared.ml
@@ -298,8 +298,8 @@ let expr_expander_with_punning translate ~loc ~path:_ payload =
       let vbss, bindings =
         List.unzip
         @@ List.map bindings ~f:(fun vb ->
-               let vbs, v = translate ?ident_label:(Some vb.pvb_pat) vb.pvb_expr in
-               (vbs, { vb with pvb_expr = v }))
+            let vbs, v = translate ?ident_label:(Some vb.pvb_pat) vb.pvb_expr in
+            (vbs, { vb with pvb_expr = v }))
       in
       let expr = { payload with pexp_desc = Pexp_let (recflag, bindings, body) } in
       let_opt ~loc (reduce_vbss vbss) expr
File "tensor/ppx_op.ml", line 1, characters 0-0:
diff --git a/_build/default/tensor/ppx_op.ml b/_build/default/tensor/.formatted/ppx_op.ml
index 2873eda..df32d9c 100644
--- a/_build/default/tensor/ppx_op.ml
+++ b/_build/default/tensor/.formatted/ppx_op.ml
@@ -367,14 +367,14 @@ let rec translate ~no_grads_for_inline_defs ~num_configs ~is_toplevel ~opt_label
       let vbs_args, processed_args =
         List.unzip
         @@ List.mapi args ~f:(fun i (arg_label, arg_expr) ->
-               match unit_position with
-               | Some unit_pos when i < unit_pos ->
-                   (* Before unit: preserve as OCaml expression *)
-                   (no_vbs, (arg_label, arg_expr))
-               | _ ->
-                   (* After unit or no unit: transform *)
-                   let vbs, e = loop arg_expr in
-                   (vbs, (arg_label, e)))
+            match unit_position with
+            | Some unit_pos when i < unit_pos ->
+                (* Before unit: preserve as OCaml expression *)
+                (no_vbs, (arg_label, arg_expr))
+            | _ ->
+                (* After unit or no unit: transform *)
+                let vbs, e = loop arg_expr in
+                (vbs, (arg_label, e)))
       in
       let all_vbs = reduce_vbss (vbs_fn :: vbs_args) in
       (all_vbs, Ast_builder.Default.pexp_apply ~loc e_fn processed_args)
@@ -422,10 +422,10 @@ let rec translate ~no_grads_for_inline_defs ~num_configs ~is_toplevel ~opt_label
           let labels =
             Option.to_list label
             @ List.filter_map args ~f:(function
-                | { pparam_desc = Pparam_val (_, _, pat); _ } ->
-                    let loc = pat.ppat_loc in
-                    Some [%expr [%e pat2expr pat].Tensor.value.Ir.Tnode.label]
-                | _ -> None)
+              | { pparam_desc = Pparam_val (_, _, pat); _ } ->
+                  let loc = pat.ppat_loc in
+                  Some [%expr [%e pat2expr pat].Tensor.value.Ir.Tnode.label]
+              | _ -> None)
           in
           let label_locs = List.map labels ~f:(fun label -> label.pexp_loc) in
           let label_starts = List.map label_locs ~f:(fun l -> l.loc_start) in
@@ -453,8 +453,8 @@ let rec translate ~no_grads_for_inline_defs ~num_configs ~is_toplevel ~opt_label
                 let vbs, cases =
                   List.unzip
                   @@ List.map cases ~f:(fun ({ pc_rhs; _ } as c) ->
-                         let vbs, pc_rhs = loop ~label pc_rhs in
-                         (vbs, { c with pc_rhs }))
+                      let vbs, pc_rhs = loop ~label pc_rhs in
+                      (vbs, { c with pc_rhs }))
                 in
                 ( List.fold vbs
                     ~init:(Map.empty (module String))
@@ -472,8 +472,8 @@ let rec translate ~no_grads_for_inline_defs ~num_configs ~is_toplevel ~opt_label
             let vbs, cases =
               List.unzip
               @@ List.map cases ~f:(fun ({ pc_rhs; _ } as c) ->
-                     let vbs, pc_rhs = loop ?label pc_rhs in
-                     (vbs, { c with pc_rhs }))
+                  let vbs, pc_rhs = loop ?label pc_rhs in
+                  (vbs, { c with pc_rhs }))
             in
             ( List.fold vbs
                 ~init:(Map.empty (module String))
@@ -531,18 +531,18 @@ let rec translate ~no_grads_for_inline_defs ~num_configs ~is_toplevel ~opt_label
       let vbss, cases =
         List.unzip
         @@ List.map cases ~f:(fun ({ pc_rhs; _ } as c) ->
-               let vbs, pc_rhs = loop ?label pc_rhs in
-               (vbs, { c with pc_rhs }))
+            let vbs, pc_rhs = loop ?label pc_rhs in
+            (vbs, { c with pc_rhs }))
       in
       (reduce_vbss vbss, { expr with pexp_desc = Pexp_match (expr1, cases) })
   | { pexp_desc = Pexp_let (recflag, bindings, body); _ } ->
       let vbss1, bindings =
         List.unzip
         @@ List.map bindings ~f:(fun binding ->
-               let vbs, pvb_expr =
-                 loop ~label:[%expr [ [%e pat2string binding.pvb_pat] ]] binding.pvb_expr
-               in
-               (vbs, { binding with pvb_expr }))
+            let vbs, pvb_expr =
+              loop ~label:[%expr [ [%e pat2string binding.pvb_pat] ]] binding.pvb_expr
+            in
+            (vbs, { binding with pvb_expr }))
       in
       let vbs2, body = loop ?label body in
       (reduce_vbss (vbss1 @ [ vbs2 ]), { expr with pexp_desc = Pexp_let (recflag, bindings, body) })
File "arrayjit/lib/backends.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/lib/backends.ml b/_build/default/arrayjit/lib/.formatted/backends.ml
index 166603a..b013e06 100644
--- a/_build/default/arrayjit/lib/backends.ml
+++ b/_build/default/arrayjit/lib/.formatted/backends.ml
@@ -32,7 +32,7 @@ module Add_buffer_retrieval_and_syncing (Backend : No_buffer_retrieval_or_syncin
         (Fn.compose (List.filter ~f:(fun (_, e) -> not (Backend.is_done e)))
         @@ Option.value ~default:[])
     |> List.iter ~f:(fun (work_stream, e) ->
-           if not (equal_stream work_stream s) then Backend.will_wait_for ctx e)
+        if not (equal_stream work_stream s) then Backend.will_wait_for ctx e)
 
   let wait_for_ready ~dst ~src tn =
     let s = src.stream in
@@ -40,7 +40,7 @@ module Add_buffer_retrieval_and_syncing (Backend : No_buffer_retrieval_or_syncin
     (* TODO: maybe it's worthwhile to clean up s.updating_for every now and then. *)
     Hashtbl.find s.updating_for tn
     |> Option.iter ~f:(fun upd_e ->
-           if not (equal_stream s d || Backend.is_done upd_e) then Backend.will_wait_for dst upd_e)
+        if not (equal_stream s d || Backend.is_done upd_e) then Backend.will_wait_for dst upd_e)
 
   let%track3_sexp to_host (ctx : Backend.context) (tn : Tn.t) =
     match (tn, Map.find ctx.ctx_arrays tn) with
@@ -269,13 +269,13 @@ let lower_batch_assignments optim_ctx ?names ?occupancy bindings asgns_l =
   let occupancy = Option.value occupancy ~default:(fun ~name:_ ~src_n:_ -> true) in
   Array.unzip
   @@ Array.mapi names ~f:(fun src_n name ->
-         let asgns = asgns_l.(src_n) in
-         if occupancy ~name ~src_n then
-           ( Some name,
-             Some
-               (Assignments.lower optim_ctx ~unoptim_ll_source ~ll_source ~cd_source ~name bound
-                  asgns) )
-         else (None, None))
+      let asgns = asgns_l.(src_n) in
+      if occupancy ~name ~src_n then
+        ( Some name,
+          Some
+            (Assignments.lower optim_ctx ~unoptim_ll_source ~ll_source ~cd_source ~name bound asgns)
+        )
+      else (None, None))
 
 let%debug3_sexp verify_prior_context ~use_host_memory ~ctx_arrays ~from_prior_context : unit =
   Set.iter from_prior_context ~f:(fun tn ->
@@ -659,8 +659,7 @@ let%track5_sexp fresh_backend ?backend_name ?(config = For_parallel_copying) ()
       : Backend)
   | "sync_cc" ->
       (module Make_device_backend_from_lowered (Schedulers.Sync) (Cc_backend) (Config) : Backend)
-  | "cuda" ->
-      (module Raise_backend ((Cuda_backend_impl.Fresh (Config) : Lowered_backend)) : Backend)
+  | "cuda" -> (module Raise_backend (Cuda_backend_impl.Fresh (Config) : Lowered_backend) : Backend)
   | "metal" ->
-      (module Raise_backend ((Metal_backend_impl.Fresh (Config) : Lowered_backend)) : Backend)
+      (module Raise_backend (Metal_backend_impl.Fresh (Config) : Lowered_backend) : Backend)
   | backend -> invalid_arg [%string "Backends.fresh_backend: unknown backend %{backend}"]
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 9061870..fdce12a 100644
--- a/_build/default/arrayjit/lib/tnode.ml
+++ b/_build/default/arrayjit/lib/.formatted/tnode.ml
@@ -165,22 +165,22 @@ let debug_memory_mode = function
   | None -> "unknown"
   | Some (mem, prov) ->
       (match mem with
-      | Effectively_constant -> "Const"
-      | Virtual -> "Virt"
-      | Never_virtual -> "Non-virt"
-      | Local -> "Local"
-      | Device_only -> "Dev"
-      | Materialized -> "Material"
-      | On_device Unset -> "On-dev"
-      | On_device Shared_cross_streams -> "Dev-shared"
-      | On_device Per_stream -> "Dev-stream"
-      | Hosted Constant -> "Host-const"
-      | Hosted Nonconstant -> "Host-non-const"
-      | Hosted Unset_hosted -> "Host-unset"
-      | Hosted Volatile -> "Hosted"
-      | Hosted (Changed_on_devices Unset) -> "Host&dev"
-      | Hosted (Changed_on_devices Per_stream) -> "Host&stream"
-      | Hosted (Changed_on_devices Shared_cross_streams) -> "Host&shared")
+        | Effectively_constant -> "Const"
+        | Virtual -> "Virt"
+        | Never_virtual -> "Non-virt"
+        | Local -> "Local"
+        | Device_only -> "Dev"
+        | Materialized -> "Material"
+        | On_device Unset -> "On-dev"
+        | On_device Shared_cross_streams -> "Dev-shared"
+        | On_device Per_stream -> "Dev-stream"
+        | Hosted Constant -> "Host-const"
+        | Hosted Nonconstant -> "Host-non-const"
+        | Hosted Unset_hosted -> "Host-unset"
+        | Hosted Volatile -> "Hosted"
+        | Hosted (Changed_on_devices Unset) -> "Host&dev"
+        | Hosted (Changed_on_devices Per_stream) -> "Host&stream"
+        | Hosted (Changed_on_devices Shared_cross_streams) -> "Host&shared")
       ^ "/" ^ Int.to_string prov
 
 let log_debug_info ~from_log_level tn =
Warning: Invalid documentation comment:
File "tensor/shape.ml", line 24, characters 0-0:
End of text is not allowed in '[...]' (code).
File "arrayjit/lib/utils.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/lib/utils.ml b/_build/default/arrayjit/lib/.formatted/utils.ml
index a170906..d2a97b7 100644
--- a/_build/default/arrayjit/lib/utils.ml
+++ b/_build/default/arrayjit/lib/.formatted/utils.ml
@@ -119,25 +119,25 @@ let config_file_args =
       let result =
         config_lines
         |> List.filter ~f:(fun l ->
-               not (String.is_prefix ~prefix:"~~" l || String.is_prefix ~prefix:"#" l))
+            not (String.is_prefix ~prefix:"~~" l || String.is_prefix ~prefix:"#" l))
         |> List.map ~f:(String.split ~on:'=')
         |> List.filter_map ~f:(function
-             | [] -> None
-             | [ s ] when String.is_empty s -> None
-             | key :: [ v ] ->
-                 let key =
-                   String.(
-                     lowercase @@ strip ~drop:(fun c -> equal_char '-' c || equal_char ' ' c) key)
-                 in
-                 let key =
-                   if String.is_prefix key ~prefix:"ocannl" then
-                     String.drop_prefix key 6 |> String.strip ~drop:(equal_char '_')
-                   else key
-                 in
-                 str_nonempty ~f:(pair key) v
-             | l ->
-                 failwith @@ "OCANNL: invalid syntax in the config file " ^ fname
-                 ^ ", should have a single '=' on each non-empty line, found: " ^ String.concat l)
+          | [] -> None
+          | [ s ] when String.is_empty s -> None
+          | key :: [ v ] ->
+              let key =
+                String.(
+                  lowercase @@ strip ~drop:(fun c -> equal_char '-' c || equal_char ' ' c) key)
+              in
+              let key =
+                if String.is_prefix key ~prefix:"ocannl" then
+                  String.drop_prefix key 6 |> String.strip ~drop:(equal_char '_')
+                else key
+              in
+              str_nonempty ~f:(pair key) v
+          | l ->
+              failwith @@ "OCANNL: invalid syntax in the config file " ^ fname
+              ^ ", should have a single '=' on each non-empty line, found: " ^ String.concat l)
         |> Hashtbl.of_alist (module String)
         |> function
         | `Ok h -> h
@@ -379,11 +379,11 @@ let get_local_debug_runtime =
     else
       String.split pairs_str ~on:';'
       |> List.filter_map ~f:(fun pair_str ->
-             match String.split pair_str ~on:',' with
-             | [ id1; id2 ] ->
-                 Option.try_with (fun () ->
-                     (Int.of_string (String.strip id1), Int.of_string (String.strip id2)))
-             | _ -> None)
+          match String.split pair_str ~on:',' with
+          | [ id1; id2 ] ->
+              Option.try_with (fun () ->
+                  (Int.of_string (String.strip id1), Int.of_string (String.strip id2)))
+          | _ -> None)
   in
   let truncate_children =
     let arg = get_global_arg ~default:"" ~arg_name:"debug_log_truncate_children" in
File "tensor/tensor.ml", line 1, characters 0-0:
diff --git a/_build/default/tensor/tensor.ml b/_build/default/tensor/.formatted/tensor.ml
index 3aa7188..ee2d694 100644
--- a/_build/default/tensor/tensor.ml
+++ b/_build/default/tensor/.formatted/tensor.ml
@@ -119,9 +119,9 @@ let%debug7_sexp rec init_params ?skip (t : t) : Asgns.comp =
   let params : t list =
     Set.to_list t.params
     |> (match skip with
-       | None -> Fn.id
-       | Some skip -> List.filter ~f:(fun p -> not (Map.mem skip p.value)))
-       (* Compare to ordered_ts in op -- we need to sort to avoid computed-after-use bugs! *)
+      | None -> Fn.id
+      | Some skip -> List.filter ~f:(fun p -> not (Map.mem skip p.value)))
+      (* Compare to ordered_ts in op -- we need to sort to avoid computed-after-use bugs! *)
     |> List.sort ~compare:(fun p1 p2 -> Int.ascending p1.id p2.id)
   in
   let asgns =
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 cfb97ba..0a6b758 100644
--- a/_build/default/arrayjit/lib/c_syntax.ml
+++ b/_build/default/arrayjit/lib/.formatted/c_syntax.ml
@@ -759,19 +759,19 @@ module C_syntax (B : C_syntax_config) = struct
     let params : (string * param_source) list =
       List.rev
       @@ Hashtbl.fold traced_store ~init:[] ~f:(fun ~key:tn ~data:_ params ->
-             let backend_info, is_param =
-               if Tn.is_virtual_force tn 334 then ("Virt", false)
-               else if in_ctx tn then ("Ctx", true)
-               else if Tn.is_materialized_force tn 335 then ("Global", true)
-               else if Tn.known_not_materialized tn then ("Local", false)
-               else assert false
-             in
-             let backend_info = Sexp.Atom backend_info in
-             if not @@ Utils.sexp_mem ~elem:backend_info tn.backend_info then
-               tn.backend_info <- Utils.sexp_append ~elem:backend_info tn.backend_info;
-             if is_param then
-               (B.typ_of_prec (Lazy.force tn.Tn.prec) ^ " *" ^ get_ident tn, Param_ptr tn) :: params
-             else params)
+          let backend_info, is_param =
+            if Tn.is_virtual_force tn 334 then ("Virt", false)
+            else if in_ctx tn then ("Ctx", true)
+            else if Tn.is_materialized_force tn 335 then ("Global", true)
+            else if Tn.known_not_materialized tn then ("Local", false)
+            else assert false
+          in
+          let backend_info = Sexp.Atom backend_info in
+          if not @@ Utils.sexp_mem ~elem:backend_info tn.backend_info then
+            tn.backend_info <- Utils.sexp_append ~elem:backend_info tn.backend_info;
+          if is_param then
+            (B.typ_of_prec (Lazy.force tn.Tn.prec) ^ " *" ^ get_ident tn, Param_ptr tn) :: params
+          else params)
     in
     let idx_params =
       List.map idx_params ~f:(fun s ->
@@ -788,7 +788,7 @@ module C_syntax (B : C_syntax_config) = struct
       Option.(
         to_list
         @@ map merge_node ~f:(fun tn ->
-               ("const " ^ B.typ_of_prec (Lazy.force tn.prec) ^ " *merge_buffer", Merge_buffer)))
+            ("const " ^ B.typ_of_prec (Lazy.force tn.prec) ^ " *merge_buffer", Merge_buffer)))
     in
     let all_params = log_file_param @ merge_param @ idx_params @ params in
     let sorted_params =
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 efff2f6..ac068a2 100644
--- a/_build/default/arrayjit/lib/ndarray.ml
+++ b/_build/default/arrayjit/lib/.formatted/ndarray.ml
@@ -691,22 +691,21 @@ let render_array ?(brief = false) ?(prefix = "") ?(entries_per_axis = 4) ?(label
     let outer_grid v =
       (if brief then Fn.id else B.frame ~stretch:false)
       @@ B.init_grid ~bars:true ~line:nlines ~col:ncols (fun ~line ~col ->
-             if (not brief) && line = 0 && col = 0 then
-               B.lines @@ List.filter ~f:(Fn.non String.is_empty) @@ [ tag ~pos:v label0 ind0 ]
-             else if (not brief) && line = 0 then
-               B.lines
-               @@ List.filter ~f:(Fn.non String.is_empty)
-               @@ [ tag ~pos:(col - 1) label2 ind2; tag label4 ind4 ]
-             else if (not brief) && col = 0 then
-               B.lines
-               @@ List.filter ~f:(Fn.non String.is_empty)
-               @@ [ tag ~pos:(line - 1) label1 ind1; tag label3 ind3 ]
-             else
-               let nline = if brief then line else line - 1 in
-               let ncol = if brief then col else col - 1 in
-               if elide_for ncol ~ind:ind2 || elide_for nline ~ind:ind1 then
-                 B.hpad 1 @@ B.line "..."
-               else inner_grid v nline ncol)
+          if (not brief) && line = 0 && col = 0 then
+            B.lines @@ List.filter ~f:(Fn.non String.is_empty) @@ [ tag ~pos:v label0 ind0 ]
+          else if (not brief) && line = 0 then
+            B.lines
+            @@ List.filter ~f:(Fn.non String.is_empty)
+            @@ [ tag ~pos:(col - 1) label2 ind2; tag label4 ind4 ]
+          else if (not brief) && col = 0 then
+            B.lines
+            @@ List.filter ~f:(Fn.non String.is_empty)
+            @@ [ tag ~pos:(line - 1) label1 ind1; tag label3 ind3 ]
+          else
+            let nline = if brief then line else line - 1 in
+            let ncol = if brief then col else col - 1 in
+            if elide_for ncol ~ind:ind2 || elide_for nline ~ind:ind1 then B.hpad 1 @@ B.line "..."
+            else inner_grid v nline ncol)
     in
     let screens =
       B.init_grid ~bars:true ~line:size0 ~col:1 (fun ~line ~col:_ ->
File "arrayjit/lib/cuda_backend.ml", line 1, characters 0-0:
diff --git a/_build/default/arrayjit/lib/cuda_backend.ml b/_build/default/arrayjit/lib/.formatted/cuda_backend.ml
index 79d1754..d083ec6 100644
--- a/_build/default/arrayjit/lib/cuda_backend.ml
+++ b/_build/default/arrayjit/lib/.formatted/cuda_backend.ml
@@ -1014,10 +1014,10 @@ end) : Ir.Backend_impl.Lowered_backend = struct
       Array.mapi code_batch.params_and_names ~f:(fun i pns ->
           Option.value ~default:None
           @@ Option.map2 pns ctx_arrays.(i) ~f:(fun (params, name) ctx_arrays ->
-                 let task =
-                   link_proc ~prior_context ~name ~params ~ctx_arrays lowered_bindings run_module
-                 in
-                 Some task))
+              let task =
+                link_proc ~prior_context ~name ~params ~ctx_arrays lowered_bindings run_module
+              in
+              Some task))
     in
     (lowered_bindings, procs)
 
File "tensor/ppx_cd.ml", line 1, characters 0-0:
diff --git a/_build/default/tensor/ppx_cd.ml b/_build/default/tensor/.formatted/ppx_cd.ml
index f366b08..a8ea01d 100644
--- a/_build/default/tensor/ppx_cd.ml
+++ b/_build/default/tensor/.formatted/ppx_cd.ml
@@ -421,8 +421,8 @@ let handle_cases ~bad_pun_hints ~proj_in_scope transl cases =
   let fields, transformed_cases =
     List.unzip
     @@ List.map cases ~f:(fun ({ pc_rhs; _ } as c) ->
-           let res = transl ~bad_pun_hints ~proj_in_scope pc_rhs in
-           ((res.vbs, res.typ, res.slot), { c with pc_rhs = res.expr }))
+        let res = transl ~bad_pun_hints ~proj_in_scope pc_rhs in
+        ((res.vbs, res.typ, res.slot), { c with pc_rhs = res.expr }))
   in
   let vbss, typs, slots = List.unzip3 fields in
   (* TODO: make the inference of typ and slot more strict by detecting mismatches. *)
@@ -450,55 +450,55 @@ let translate ?ident_label (expr : expression) : result =
     let assignment_op accu_op =
       loc
       |> Option.value_or_thunk (Hashtbl.find assignment_ops accu_op) ~default:(fun () _loc ->
-             ( false,
-               Ast_builder.Default.pexp_extension ~loc
-               @@ Location.error_extensionf ~loc
-                    "ppx_ocannl %%cd: expected an assignment operator, one of: %s %s"
-                    "=+ (Add), =- (Sub), =* (Mul),=/ (Div), =** (ToPowOf), =?/ (Relu_gate), =?^ \
-                     (Satur01_gate), =|| (Or),  =&& (And), =@^ (Max), =@- (Min), =^^^^ \
-                     (threefry4x32), =: (Arg2), =:+, =:-,"
-                    " =:*, =:/, =:**, =:?/, =:?^, =:||, =:&&, =:@^, =:@-, =:^^^^ (same with \
-                     initializing the tensor to the neutral value before the start of the \
-                     calculation)" ))
+          ( false,
+            Ast_builder.Default.pexp_extension ~loc
+            @@ Location.error_extensionf ~loc
+                 "ppx_ocannl %%cd: expected an assignment operator, one of: %s %s"
+                 "=+ (Add), =- (Sub), =* (Mul),=/ (Div), =** (ToPowOf), =?/ (Relu_gate), =?^ \
+                  (Satur01_gate), =|| (Or),  =&& (And), =@^ (Max), =@- (Min), =^^^^ \
+                  (threefry4x32), =: (Arg2), =:+, =:-,"
+                 " =:*, =:/, =:**, =:?/, =:?^, =:||, =:&&, =:@^, =:@-, =:^^^^ (same with \
+                  initializing the tensor to the neutral value before the start of the \
+                  calculation)" ))
     in
     let unary_op un_op =
       loc
       |> Option.value_or_thunk (Hashtbl.find unary_ops un_op) ~default:(fun () loc ->
-             ( [%expr Shape.Pointwise_un],
-               Ast_builder.Default.pexp_extension ~loc
-               @@ Location.error_extensionf ~loc
-                    "ppx_ocannl %%cd: expected a unary operator, one of: %s"
-                    "id, relu, sat01, exp, log, exp2, log2, sin, cos, sqrt, recip, recip_sqrt, \
-                     neg, tanh, uint4x32_to_prec_uniform1" ))
+          ( [%expr Shape.Pointwise_un],
+            Ast_builder.Default.pexp_extension ~loc
+            @@ Location.error_extensionf ~loc
+                 "ppx_ocannl %%cd: expected a unary operator, one of: %s"
+                 "id, relu, sat01, exp, log, exp2, log2, sin, cos, sqrt, recip, recip_sqrt, neg, \
+                  tanh, uint4x32_to_prec_uniform1" ))
     in
     let vec_unary_op vec_un_op =
       loc
       |> Option.value_or_thunk (Hashtbl.find vec_unary_ops vec_un_op) ~default:(fun () loc ->
-             ( [%expr Shape.Uint4x32_to_prec_uniform],
-               Ast_builder.Default.pexp_extension ~loc
-               @@ Location.error_extensionf ~loc
-                    "ppx_ocannl %%cd: expected a vector unary operator, one of: \
-                     uint4x32_to_prec_uniform; found: %s"
-                    vec_un_op ))
+          ( [%expr Shape.Uint4x32_to_prec_uniform],
+            Ast_builder.Default.pexp_extension ~loc
+            @@ Location.error_extensionf ~loc
+                 "ppx_ocannl %%cd: expected a vector unary operator, one of: \
+                  uint4x32_to_prec_uniform; found: %s"
+                 vec_un_op ))
     in
     let binary_op bin_op =
       loc
       |> Option.value_or_thunk (Hashtbl.find binary_ops bin_op) ~default:(fun () _loc ->
-             ( [%expr Shape.Pointwise_bin],
-               Ast_builder.Default.pexp_extension ~loc
-               @@ Location.error_extensionf ~loc
-                    "ppx_ocannl %%cd: expected a binary operator, one of: %s"
-                    "+ (Add), - (Sub), * (Mul), / (Div), **(ToPowOf), -?/ (Relu_gate), -?^ \
-                     (Satur01_gate), -/> (Arg2), <  (Cmplt), = (Cmpeq), <> (Cmpne), || (Or), && \
-                     (And), % (Mod), @^(Max), @- (Min), ^^^^ (threefry4x32)" ))
+          ( [%expr Shape.Pointwise_bin],
+            Ast_builder.Default.pexp_extension ~loc
+            @@ Location.error_extensionf ~loc
+                 "ppx_ocannl %%cd: expected a binary operator, one of: %s"
+                 "+ (Add), - (Sub), * (Mul), / (Div), **(ToPowOf), -?/ (Relu_gate), -?^ \
+                  (Satur01_gate), -/> (Arg2), <  (Cmplt), = (Cmpeq), <> (Cmpne), || (Or), && \
+                  (And), % (Mod), @^(Max), @- (Min), ^^^^ (threefry4x32)" ))
     in
     let ternary_op tern_op =
       loc
       |> Option.value_or_thunk (Hashtbl.find ternary_ops tern_op) ~default:(fun () _loc ->
-             ( [%expr Shape.Pointwise_tern],
-               Ast_builder.Default.pexp_extension ~loc
-               @@ Location.error_extensionf ~loc
-                    "ppx_ocannl %%cd: expected a ternary operator, one of: where, fma" ))
+          ( [%expr Shape.Pointwise_tern],
+            Ast_builder.Default.pexp_extension ~loc
+            @@ Location.error_extensionf ~loc
+                 "ppx_ocannl %%cd: expected a ternary operator, one of: where, fma" ))
     in
     (* TODO: collapse these (code reuse) *)
     let process_assign_ternop ~accu_op ~lhs ~tern_op ~rhs1 ~rhs2 ~rhs3 ?projections ~proj_in_scope
@@ -926,11 +926,11 @@ let translate ?ident_label (expr : expression) : result =
     | { pexp_desc = Pexp_array _; _ }
     | { pexp_desc = Pexp_construct ({ txt = Lident "::"; _ }, _); _ } ->
         { default_result with expr = ndarray_op ~ndarray_fn:[%expr NTDSL.ndarray] expr }
-    | { pexp_desc = Pexp_ident { txt = Lident ("lhs"); _ }; _ } ->
+    | { pexp_desc = Pexp_ident { txt = Lident "lhs"; _ }; _ } ->
         { default_result with typ = Array; slot = LHS }
-        | { pexp_desc = Pexp_ident { txt = Lident ("v"); _ }; _ } ->
-          { default_result with typ = Array; slot = LHS; expr = [%expr t.Tensor.value] }
-      | { pexp_desc = Pexp_ident { txt = Lident "g"; _ }; _ } ->
+    | { pexp_desc = Pexp_ident { txt = Lident "v"; _ }; _ } ->
+        { default_result with typ = Array; slot = LHS; expr = [%expr t.Tensor.value] }
+    | { pexp_desc = Pexp_ident { txt = Lident "g"; _ }; _ } ->
         { default_result with typ = Array; slot = LHS }
     | { pexp_desc = Pexp_ident { txt = Lident "rhs1"; _ }; _ } ->
         { default_result with typ = Array; slot = RHS1 }
@@ -1308,10 +1308,10 @@ let translate ?ident_label (expr : expression) : result =
         let elements =
           expr :: List.map ~f:snd exprs
           |> List.map ~f:(function
-               | { pexp_desc = Pexp_constant (Pconst_string _); _ } as s -> s
-               | [%expr [%e? t].value] -> [%expr Ir.Tnode.debug_name [%e t].value]
-               | [%expr [%e? t].grad] -> [%expr Ir.Tnode.debug_name [%e t].value ^ ".grad"]
-               | t -> [%expr Ir.Tnode.debug_name [%e t].value])
+            | { pexp_desc = Pexp_constant (Pconst_string _); _ } as s -> s
+            | [%expr [%e? t].value] -> [%expr Ir.Tnode.debug_name [%e t].value]
+            | [%expr [%e? t].grad] -> [%expr Ir.Tnode.debug_name [%e t].value ^ ".grad"]
+            | t -> [%expr Ir.Tnode.debug_name [%e t].value])
         in
         let res2 = loop ~proj_in_scope expr2 in
         let block =
@@ -1593,18 +1593,18 @@ let translate ?ident_label (expr : expression) : result =
         let proj_in_scope =
           proj_in_scope
           || List.exists args ~f:(function
-               | { pparam_desc = Pparam_val ((Labelled s | Optional s), _, _); _ }
-                 when String.equal s "projections" ->
-                   true
-               | _ -> false)
+            | { pparam_desc = Pparam_val ((Labelled s | Optional s), _, _); _ }
+              when String.equal s "projections" ->
+                true
+            | _ -> false)
         in
         let bad_pun_hints =
           Set.union_list (module String)
           @@ bad_pun_hints
              :: List.map args ~f:(fun arg ->
-                    match arg.pparam_desc with
-                    | Pparam_val (_, _, pat) -> collect_pat_idents pat
-                    | _ -> Set.empty (module String))
+                 match arg.pparam_desc with
+                 | Pparam_val (_, _, pat) -> collect_pat_idents pat
+                 | _ -> Set.empty (module String))
         in
         let result =
           match body with
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 4e2ca58..41da273 100644
--- a/_build/default/arrayjit/lib/low_level.ml
+++ b/_build/default/arrayjit/lib/.formatted/low_level.ml
@@ -372,7 +372,7 @@ let visit_llc traced_store ~merge_node_id reverse_node_map ~max_visits llc =
         if
           (not virtualize_settings.inline_complex_computations)
           || Option.value_map access_pos ~default:true ~f:(fun pos ->
-                 not ([%equal: int array] pos at_pos))
+              not ([%equal: int array] pos at_pos))
         then
           Hashtbl.update traced.accesses at_pos
             ~f:(visit ~is_assigned:(traced.zeroed_out || Hash_set.mem traced.assignments at_pos))
@@ -712,11 +712,11 @@ let%track7_sexp inline_computation ~id
     let computations =
       Hashtbl.find computations_table traced.tn
       |> Option.value_or_thunk ~default:(fun () ->
-             raise
-             @@ Utils.User_error
-                  [%string
-                    "Stale optimize_ctx: No computations found for #%{traced.tn.Tn.id#Int}: \
-                     %{Tn.debug_name traced.tn}"])
+          raise
+          @@ Utils.User_error
+               [%string
+                 "Stale optimize_ctx: No computations found for #%{traced.tn.Tn.id#Int}: \
+                  %{Tn.debug_name traced.tn}"])
     in
     let body = List.rev_filter_map ~f:loop_proc computations in
     if List.is_empty body then raise @@ Non_virtual 14 else Some (unflat_lines body)
Warning: Invalid documentation comment:
File "tensor/row.ml", line 819, characters 39-49:
'{ var; _ }': bad markup.
Suggestion: did you mean '{! var; _ }' or '[ var; _ ]'?
File "tensor/row.ml", line 1, characters 0-0:
diff --git a/_build/default/tensor/row.ml b/_build/default/tensor/.formatted/row.ml
index 4e7ae6b..6861322 100644
--- a/_build/default/tensor/row.ml
+++ b/_build/default/tensor/.formatted/row.ml
@@ -3252,8 +3252,7 @@ type proj_env = {
 }
 [@@deriving sexp_of]
 
-type proj_equation = Proj_eq of proj * proj | Iterated of proj
-[@@deriving compare, equal, sexp]
+type proj_equation = Proj_eq of proj * proj | Iterated of proj [@@deriving compare, equal, sexp]
 
 let%track4_sexp get_proj_equations (inequalities : constraint_ list) proj_axis_env env :
     proj_equation list =
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-11-27 17:48.16: Job failed: Failed: Build failed