Support the '0 dimension case' for bigarrays#787
Conversation
Test reshaping. Also adapt the documentation. Also allow slice to produce arrays with 0 dimensions. Update Changes
otherlibs/bigarray/bigarray_stubs.c
Outdated
| @@ -1050,7 +1050,7 @@ CAMLprim value caml_ba_slice(value vb, value vind) | |||
|
|
|||
| /* Check number of indices < number of dimensions of array */ | |||
There was a problem hiding this comment.
Good catch, this is fixed now.
|
The request is well founded and the implementation rather straightforward and well tested. I'm in favor of merging if nobody is against. |
|
Could something be added to the documentation so users realize this is available/possible? |
|
The ability to have dimension 0 is mentioned in bigarray.mli. |
|
Ah, I missed those lines. I would like an Array0 module and Array1.slice to go with this. I have had projects in the past which would have benefited from an Array0. |
|
I've added an Array0 module as well as Array1.slice. It makes the change larger so let me know if you think it's not worth it. |
|
I think the addition of the module, slice function and genarray conversions make this PR much more useful. Thank you for adding them! I looked over the code and like the change. |
|
I merged, thanks to everyone for the comments, and for the nice pull request. |
|
That was pretty fast! Thanks all. |
|
Our internal continuous integration server just let me know that clang has a seemingly-legitimate complaint about the C code: |
|
Indeed I didn't noticed that num_dims is unsigned, sorry about that. Should I create a new PR to fix this ? (removing the num_dims < 0 conditions) |
|
I will do the change, run the testsuite, and commit if it works. |
|
Should be fixed in 014d941 . |
Bigarray: support 0-dimension bigarrays (just a scalar value), with an Array0 module
Address feedback on GC from async review
Co-authored-by: Malte Skarupke <[email protected]>
…l#787) Co-authored-by: Malte Skarupke <[email protected]>
25188da flambda-backend: Missed comment from PR802 (ocaml#887) 9469765 flambda-backend: Improve the semantics of asynchronous exceptions (new simpler version) (ocaml#802) d9e4dd0 flambda-backend: Fix `make runtest` on NixOS (ocaml#874) 4bbde7a flambda-backend: Simpler symbols (ocaml#753) ef37262 flambda-backend: Add opaqueness to Obj.magic under Flambda 2 (ocaml#862) a9616e9 flambda-backend: Add build system hooks for ocaml-jst (ocaml#869) 045ef67 flambda-backend: Allow the compiler to build with stock Dune (ocaml#868) 3cac5be flambda-backend: Simplify Makefile logic for natdynlinkops (ocaml#866) c5b12bf flambda-backend: Remove unnecessary install lines (ocaml#860) ff12bbe flambda-backend: Fix unused variable warning in st_stubs.c (ocaml#861) c84976c flambda-backend: Static check for noalloc: attributes (ocaml#825) ca56052 flambda-backend: Build system refactoring for ocaml-jst (ocaml#857) 39eb7f9 flambda-backend: Remove integer comparison involving nonconstant polymorphic variants (ocaml#854) c102688 flambda-backend: Fix soundness bug by using currying information from typing (ocaml#850) 6a96b61 flambda-backend: Add a primitive to enable/disable the tick thread (ocaml#852) f64370b flambda-backend: Make Obj.dup use a new primitive, %obj_dup (ocaml#843) 9b78eb2 flambda-backend: Add test for ocaml#820 (include functor soundness bug) (ocaml#841) 8f24346 flambda-backend: Add `-dtimings-precision` flag (ocaml#833) 65c2f22 flambda-backend: Add test for ocaml#829 (ocaml#831) 7b27a49 flambda-backend: Follow-up PR#829 (comballoc fixes for locals) (ocaml#830) ad7ec10 flambda-backend: Use a custom condition variable implementation (ocaml#787) 3ee650c flambda-backend: Fix soundness bug in include functor (ocaml#820) 2f57378 flambda-backend: Static check noalloc (ocaml#778) aaad625 flambda-backend: Emit begin/end region only when stack allocation is enabled (ocaml#812) 17c7173 flambda-backend: Fix .cmt for included signatures (ocaml#803) e119669 flambda-backend: Increase delays in tests/lib-threads/beat.ml (ocaml#800) ccc356d flambda-backend: Prevent dynamic loading of the same .cmxs twice in private mode, etc. (ocaml#784) 14eb572 flambda-backend: Make local extension point equivalent to local_ expression (ocaml#790) 487d11b flambda-backend: Fix tast_iterator and tast_mapper for include functor. (ocaml#795) a50a818 flambda-backend: Reduce closure allocation in List (ocaml#792) 96c9c60 flambda-backend: Merge ocaml-jst a775b88 flambda-backend: Fix ocaml/otherlibs/unix 32-bit build (ocaml#767) f7c2679 flambda-backend: Create object files internally to avoid invoking GAS (ocaml#757) c7a46bb flambda-backend: Bugfix for Cmmgen.expr_size with locals (ocaml#756) b337cb6 flambda-backend: Fix build_upstream for PR749 (ocaml#750) 8e7e81c flambda-backend: Differentiate is_int primitive between generic and variant-only versions (ocaml#749) git-subtree-dir: ocaml git-subtree-split: 25188da
change self-referencing heading styles to not wrap title with an a tag Co-authored-by: Sabine Schmaltz <[email protected]>
Handle the '0 dimension' case for bigarray in the same way other numerical libraries (e.g. numpy or tensorflow) do, which is that such a bigarray holds a scalar value.
It seems that relaxing the exceptions that currently prevent this case is enough to get this working.
Note that this PR doesn't include any support for the bigarray.{} syntax, not sure how worthy this is.
It also doesn't include a Bigarray.Array0 module but I'm happy to add one if there is any need for it.
To give some context I came along this when writing some tensorflow ocaml bindings and the current workaround is to have a wrapper around the bigarray module that handles this scalar case with a bigarray with one dimension of size one. However this isn't very neat as it requires the wrapper to store whether the embedded data is a scalar or not. It would be quite nicer to have this supported by the bigarray module directly.