2025-09-03 11:56.13: New job: test ahrefs/ocannl https://github.com/ahrefs/ocannl.git#refs/heads/master (6c8c8df0863c02adcf90abc50c89aee75cf4d8b5) (linux-x86_64:(lint-fmt))Base: ocaml/opam:debian-12-ocaml-4.08@sha256:1f8f583356b37c1cbcde061de13bfdb1a8963b80127e721c7ca17f4e884e669docamlformat 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 6c8c8df0cat > Dockerfile <<'END-OF-DOCKERFILE'FROM ocaml/opam:debian-12-ocaml-4.08@sha256:1f8f583356b37c1cbcde061de13bfdb1a8963b80127e721c7ca17f4e884e669dUSER 1000:1000RUN cd ~/opam-repository && (git cat-file -e b8021439f8c57ba6435bc2263f6596671f4f4466 || git fetch origin master) && git reset -q --hard b8021439f8c57ba6435bc2263f6596671f4f4466 && git log --no-decorate -n1 --oneline && opam update -uRUN opam depext -i duneWORKDIR /srcRUN opam depext -i ocamlformat=0.27.0COPY --chown=1000:1000 . /src/RUN opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2)END-OF-DOCKERFILEdocker build .END-REPRO-BLOCK2025-09-03 11:56.13: Using cache hint "ahrefs/ocannl-ocaml/opam:debian-12-ocaml-4.08@sha256:1f8f583356b37c1cbcde061de13bfdb1a8963b80127e721c7ca17f4e884e669d-debian-12-4.08_opam-2.4-ocamlformat-b8021439f8c57ba6435bc2263f6596671f4f4466"2025-09-03 11:56.13: Using OBuilder spec:((from ocaml/opam:debian-12-ocaml-4.08@sha256:1f8f583356b37c1cbcde061de13bfdb1a8963b80127e721c7ca17f4e884e669d)(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 b8021439f8c57ba6435bc2263f6596671f4f4466 || git fetch origin master) && git reset -q --hard b8021439f8c57ba6435bc2263f6596671f4f4466 && 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-09-03 11:56.13: Waiting for resource in pool OCluster2025-09-03 11:56.13: Waiting for worker…2025-09-03 11:59.48: Got resource from pool OClusterBuilding on doris.caelum.ci.devAll commits already cachedHEAD is now at 6c8c8df0 Implement shape equality constraints with set_dim and set_equal(from ocaml/opam:debian-12-ocaml-4.08@sha256:1f8f583356b37c1cbcde061de13bfdb1a8963b80127e721c7ca17f4e884e669d)2025-09-03 11:59.50 ---> using "b69d5f1106f8a1cfb35e904f37f2ccc38216aa61a22ee32dd7c324a91608cf44" 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 b8021439f8c57ba6435bc2263f6596671f4f4466 || git fetch origin master) && git reset -q --hard b8021439f8c57ba6435bc2263f6596671f4f4466 && git log --no-decorate -n1 --oneline && opam update -u"))b8021439f8 Merge pull request #28261 from kit-ty-kate/deploy-fix-25819<><> Updating package repositories ><><><><><><><><><><><><><><><><><><><><><><>[default] Initialiseddefault (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 environment2025-09-03 11:59.50 ---> using "1be76adbf83434462493f6d60d3a403af1e722bb13c1f26df1ed667dd3ad008c" 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 packagesThe following actions will be performed:- install dune 3.20.0<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>[dune.3.20.0] found in cache<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>-> installed dune.3.20.0Done.# Run eval $(opam env) to update the current shell environment2025-09-03 11:59.50 ---> using "76384e7e1078506ef4c7e0c049f9a49f543e9fdc75f2cd2f57b1b769d15b1cc0" 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 packagesThe following actions will be performed:- install sexplib0 v0.14.0 [required by base]- install menhirLib 20240715 [required by ocamlformat-lib]- install menhirCST 20240715 [required by menhir]- install ocamlbuild 0.16.1 [required by fpath, astring, uuseg]- install cmdliner 1.3.0 [required by ocamlformat]- install menhirSdk 20240715 [required by ocamlformat-lib]- install either 1.0.0 [required by ocamlformat-lib]- install dune-build-info 3.20.0 [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 fix 20250428 [required by ocamlformat-lib]- install ocaml-version 4.0.1 [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.20.0 [required by base]- install re 1.11.0 [required by ocamlformat]- install topkg 1.1.0 [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.20.0] found in cache[dune-configurator.3.20.0] 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.1.0] 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 cmdliner.1.3.0-> installed either.1.0.0-> installed fix.20250428-> installed menhirCST.20240715-> installed menhirLib.20240715-> installed menhirSdk.20240715-> installed ocaml-version.4.0.1-> installed re.1.11.0-> installed sexplib0.v0.14.0-> installed dune-build-info.3.20.0-> installed dune-configurator.3.20.0-> installed ocamlfind.1.9.8-> installed base-bytes.base-> installed ocamlbuild.0.16.1-> installed ocp-indent.1.8.1-> installed base.v0.14.3-> installed topkg.1.1.0-> installed stdio.v0.14.0-> installed uutf.1.0.4-> installed astring.0.8.5-> installed menhir.20240715-> installed fpath.0.7.3-> installed uucp.15.0.0-> installed uuseg.15.0.0-> installed ocamlformat-lib.0.27.0-> installed ocamlformat.0.27.0Done.<><> 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 environment2025-09-03 11:59.50 ---> using "ee5f36fa10328bf844b6feeab861ac0336aa35be5e288d81331a0c9c26b8859a" from cache/src: (copy (src .) (dst /src/))2025-09-03 11:59.51 ---> saved as "9f4caabae1a8ee7552f208a59a4bd9f714fd44ad9127cc28c4e22693fccf8575"/src: (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)"))File "test/ppx/test_ppx_op.ml", line 1, characters 0-0:diff --git a/_build/default/test/ppx/test_ppx_op.ml b/_build/default/test/ppx/.formatted/test_ppx_op.mlindex 6683528..78bcf88 100644--- a/_build/default/test/ppx/test_ppx_op.ml+++ b/_build/default/test/ppx/.formatted/test_ppx_op.ml@@ -28,11 +28,11 @@ let%op _use_layer =fun x -> l1 (l2 x)let%op _config_layer ~label () =-let l = mlp_layer ~label:(label @ [ "L" ]) ~hid_dim:3 () in-fun x -> l x+ let l = mlp_layer ~label:(label @ [ "L" ]) ~hid_dim:3 () in+ fun x -> l xlet%op _three_layer_perceptron ~label ~dim1 ~dim2 ~dim3 () =-let l1 = mlp_layer ~label:(label @ [ "L1" ]) ~hid_dim:dim1 () in-let l2 = mlp_layer ~label:(label @ [ "L2" ]) ~hid_dim:dim2 () in-let l3 = mlp_layer ~label:(label @ [ "L3" ]) ~hid_dim:dim3 () in-fun x -> l3 (l2 (l1 x))+ let l1 = mlp_layer ~label:(label @ [ "L1" ]) ~hid_dim:dim1 () in+ let l2 = mlp_layer ~label:(label @ [ "L2" ]) ~hid_dim:dim2 () in+ let l3 = mlp_layer ~label:(label @ [ "L3" ]) ~hid_dim:dim3 () in+ fun x -> l3 (l2 (l1 x))File "test/operations/test_einsum_capture.ml", line 1, characters 0-0:diff --git a/_build/default/test/operations/test_einsum_capture.ml b/_build/default/test/operations/.formatted/test_einsum_capture.mlindex 5f77b8e..f02bf57 100644--- a/_build/default/test/operations/test_einsum_capture.ml+++ b/_build/default/test/operations/.formatted/test_einsum_capture.ml@@ -263,24 +263,26 @@ let capture_for_shape_inference () =Stdio.printf "\n=== Testing pure shape inference with equality constraints ===\n";(* Test 1: Pure matrix multiply with constraint-driven shape inference *)- let%op m1 = { m1 = uniform1 () } in (* No shape specified *)- let%op m2 = { m2 = uniform1 () } in (* No shape specified *)+ let%op m1 = { m1 = uniform1 () } in+ (* No shape specified *)+ let%op m2 = { m2 = uniform1 () } in+ (* No shape specified *)let%op result1 = m1 *+ "ij;jk=>ik" [ "i"; "j"; "k" ] m2 in-+(* Set constraints to drive shape inference *)let i_size = Shape.get_variable_ref "i_size" inlet j_size = Shape.get_variable_ref "j_size" inlet k_size = Shape.get_variable_ref "k_size" in-+Shape.set_dim i_size 3;- Shape.set_dim j_size 4;+ Shape.set_dim j_size 4;Shape.set_dim k_size 5;Shape.set_equal i i_size;Shape.set_equal j j_size;Shape.set_equal k k_size;-+let ctx = Train.forward_once (module Backend) result1 in-+Stdio.printf "Test 1 - Matrix multiply with constraint-driven shapes:\n";Stdio.printf " m1 inferred shape: %s\n" (Shape.to_string_hum m1.shape);Stdio.printf " m2 inferred shape: %s\n" (Shape.to_string_hum m2.shape);@@ -289,28 +291,32 @@ let capture_for_shape_inference () =(match i.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?")(match j.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?")(match k.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?");-+(* Test 2: Chain of operations with constraint propagation *)- let%op base = { base = uniform1 () } in (* No shape specified *)+ let%op base = { base = uniform1 () } in+ (* No shape specified *)let%op transposed = base ++ "ab=>ba" [ "a"; "b" ] in- let%op multiplied = { mult_input = uniform1 () } in (* No shape specified *)+ let%op multiplied = { mult_input = uniform1 () } in+ (* No shape specified *)let%op final = transposed *+ "ba;bc=>ac" [ "a"; "b"; "c" ] multiplied in-+(* Set dimensions directly on the captured variables *)let base_height = Shape.get_variable_ref "base_height" inlet base_width = Shape.get_variable_ref "base_width" inlet mult_depth = Shape.get_variable_ref "mult_depth" in-+Shape.set_dim base_height 6;Shape.set_dim base_width 8;Shape.set_dim mult_depth 10;-- Shape.set_equal a base_height; (* This should propagate through the chain *)- Shape.set_equal b base_width; (* This should propagate through the chain *)++ Shape.set_equal a base_height;+ (* This should propagate through the chain *)+ Shape.set_equal b base_width;+ (* This should propagate through the chain *)Shape.set_equal c mult_depth;-+let ctx = Train.forward_once (module Backend) ~ctx final in-+Stdio.printf "\nTest 2 - Chain operations with constraint propagation:\n";Stdio.printf " base inferred shape: %s\n" (Shape.to_string_hum base.shape);Stdio.printf " transposed inferred shape: %s\n" (Shape.to_string_hum transposed.shape);@@ -320,27 +326,29 @@ let capture_for_shape_inference () =(match a.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?")(match b.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?")(match c.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?");-+(* Test 3: Simple 3-tensor einsum with pure inference *)- let%op tensor1 = { tensor1 = uniform1 () } in (* No shape specified *)- let%op tensor2 = { tensor2 = uniform1 () } in (* No shape specified *)+ let%op tensor1 = { tensor1 = uniform1 () } in+ (* No shape specified *)+ let%op tensor2 = { tensor2 = uniform1 () } in+ (* No shape specified *)let%op result3 = tensor1 *+ "xy;yz=>xz" [ "x"; "y"; "z" ] tensor2 in-+(* Set up constraints for shape inference *)let x_size = Shape.get_variable_ref "x_size" inlet y_size = Shape.get_variable_ref "y_size" inlet z_size = Shape.get_variable_ref "z_size" in-+Shape.set_dim x_size 7;Shape.set_dim y_size 8;Shape.set_dim z_size 9;-+Shape.set_equal x x_size;Shape.set_equal y y_size;Shape.set_equal z z_size;-+let ctx = Train.forward_once (module Backend) ~ctx result3 in-+Stdio.printf "\nTest 3 - Simple 3-tensor einsum with pure inference:\n";Stdio.printf " tensor1 inferred shape: %s\n" (Shape.to_string_hum tensor1.shape);Stdio.printf " tensor2 inferred shape: %s\n" (Shape.to_string_hum tensor2.shape);@@ -349,33 +357,36 @@ let capture_for_shape_inference () =(match x.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?")(match y.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?")(match z.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?");-+(* Test 4: Complex inference with mixed constraints *)- let%op complex1 = { complex1 = uniform1 () } in (* No shape specified *)- let%op complex2 = { complex2 = uniform1 () } in (* No shape specified *)+ let%op complex1 = { complex1 = uniform1 () } in+ (* No shape specified *)+ let%op complex2 = { complex2 = uniform1 () } in+ (* No shape specified *)let%op complex_result = complex1 *+ "pqr;rst=>pqst" [ "p"; "q"; "r"; "s"; "t" ] complex2 in-+(* Set up interdependent constraints *)let size_constraint = Shape.get_variable_ref "size_constraint" inShape.set_dim size_constraint 4;-+(* Make p = t = size_constraint, and q = s *)Shape.set_equal p size_constraint;- Shape.set_equal t size_constraint;+ Shape.set_equal t size_constraint;Shape.set_equal q s;-+(* Set r to specific value *)let r_size = Shape.get_variable_ref "r_size" inShape.set_dim r_size 6;Shape.set_equal r r_size;-+(* Set q to a different specific value *)let q_size = Shape.get_variable_ref "q_size" inShape.set_dim q_size 5;- Shape.set_equal q q_size; (* This will also constrain s=5 due to q=s *)-+ Shape.set_equal q q_size;++ (* This will also constrain s=5 due to q=s *)let _ctx = Train.forward_once (module Backend) ~ctx complex_result in-+Stdio.printf "\nTest 4 - Complex interdependent constraints:\n";Stdio.printf " complex1 inferred shape: %s\n" (Shape.to_string_hum complex1.shape);Stdio.printf " complex2 inferred shape: %s\n" (Shape.to_string_hum complex2.shape);@@ -387,7 +398,7 @@ let capture_for_shape_inference () =(match s.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?")(match t.var_ref.solved_dim with Some d -> Int.to_string d | None -> "?");Stdio.printf " Expected: p=4, q=5, r=6, s=5, t=4 (with q=s and p=t constraints satisfied)\n";-+Stdio.printf "=== Pure shape inference tests completed ===\n"let () =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 22025-09-03 11:59.53: Job failed: Failed: Build failed