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:1f8f583356b37c1cbcde061de13bfdb1a8963b80127e721c7ca17f4e884e669d 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 6c8c8df0 cat > Dockerfile <<'END-OF-DOCKERFILE' FROM ocaml/opam:debian-12-ocaml-4.08@sha256:1f8f583356b37c1cbcde061de13bfdb1a8963b80127e721c7ca17f4e884e669d USER 1000:1000 RUN 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 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-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 OCluster 2025-09-03 11:56.13: Waiting for worker… 2025-09-03 11:59.48: Got resource from pool OCluster Building on doris.caelum.ci.dev All commits already cached HEAD 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] 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-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 packages The 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.0 Done. # Run eval $(opam env) to update the current shell environment 2025-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 packages The 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.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-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.ml index 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 x let%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.ml index 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" in let j_size = Shape.get_variable_ref "j_size" in let 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" in let base_width = Shape.get_variable_ref "base_width" in let 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" in let y_size = Shape.get_variable_ref "y_size" in let 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" in Shape.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" in Shape.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" in Shape.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 2 2025-09-03 11:59.53: Job failed: Failed: Build failed