Skip to content

Commit e477fa5

Browse files
authored
move stuff around in vortex-tensor (#6857)
## Summary Moves some stuff around in the `vortex-tensor` crate since we are about to move a lot more than just a fixed shape tensor into there. ## Testing N/A Signed-off-by: Connor Tsui <connor.tsui20@gmail.com>
1 parent 2e58c8e commit e477fa5

7 files changed

Lines changed: 99 additions & 86 deletions

File tree

vortex-tensor/public-api.lock

Lines changed: 62 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,123 @@
11
pub mod vortex_tensor
22

3-
pub mod vortex_tensor::scalar_fns
3+
pub mod vortex_tensor::fixed_shape
44

5-
pub mod vortex_tensor::scalar_fns::cosine_similarity
5+
pub struct vortex_tensor::fixed_shape::FixedShapeTensor
66

7-
pub struct vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity
7+
impl core::clone::Clone for vortex_tensor::fixed_shape::FixedShapeTensor
88

9-
impl core::clone::Clone for vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity
9+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::clone(&self) -> vortex_tensor::fixed_shape::FixedShapeTensor
1010

11-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::clone(&self) -> vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity
11+
impl core::cmp::Eq for vortex_tensor::fixed_shape::FixedShapeTensor
1212

13-
impl vortex_array::scalar_fn::vtable::ScalarFnVTable for vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity
13+
impl core::cmp::PartialEq for vortex_tensor::fixed_shape::FixedShapeTensor
1414

15-
pub type vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::Options = vortex_array::scalar_fn::vtable::EmptyOptions
15+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::eq(&self, other: &vortex_tensor::fixed_shape::FixedShapeTensor) -> bool
1616

17-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::arity(&self, _options: &Self::Options) -> vortex_array::scalar_fn::vtable::Arity
17+
impl core::default::Default for vortex_tensor::fixed_shape::FixedShapeTensor
1818

19-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::child_name(&self, _options: &Self::Options, child_idx: usize) -> vortex_array::scalar_fn::vtable::ChildName
19+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::default() -> vortex_tensor::fixed_shape::FixedShapeTensor
2020

21-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::execute(&self, _options: &Self::Options, args: &dyn vortex_array::scalar_fn::vtable::ExecutionArgs, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::array::ArrayRef>
21+
impl core::fmt::Debug for vortex_tensor::fixed_shape::FixedShapeTensor
2222

23-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::fmt_sql(&self, _options: &Self::Options, expr: &vortex_array::expr::expression::Expression, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
23+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
2424

25-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::id(&self) -> vortex_array::scalar_fn::ScalarFnId
25+
impl core::hash::Hash for vortex_tensor::fixed_shape::FixedShapeTensor
2626

27-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::is_fallible(&self, _options: &Self::Options) -> bool
27+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
2828

29-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::is_null_sensitive(&self, _options: &Self::Options) -> bool
29+
impl core::marker::StructuralPartialEq for vortex_tensor::fixed_shape::FixedShapeTensor
3030

31-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::return_dtype(&self, _options: &Self::Options, arg_dtypes: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult<vortex_array::dtype::DType>
31+
impl vortex_array::dtype::extension::vtable::ExtVTable for vortex_tensor::fixed_shape::FixedShapeTensor
3232

33-
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::validity(&self, _options: &Self::Options, expression: &vortex_array::expr::expression::Expression) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::expression::Expression>>
33+
pub type vortex_tensor::fixed_shape::FixedShapeTensor::Metadata = vortex_tensor::fixed_shape::FixedShapeTensorMetadata
3434

35-
pub struct vortex_tensor::FixedShapeTensor
35+
pub type vortex_tensor::fixed_shape::FixedShapeTensor::NativeValue<'a> = &'a vortex_array::scalar::scalar_value::ScalarValue
3636

37-
impl core::clone::Clone for vortex_tensor::FixedShapeTensor
37+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::deserialize_metadata(&self, metadata: &[u8]) -> vortex_error::VortexResult<Self::Metadata>
3838

39-
pub fn vortex_tensor::FixedShapeTensor::clone(&self) -> vortex_tensor::FixedShapeTensor
39+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::id(&self) -> vortex_array::dtype::extension::ExtId
4040

41-
impl core::cmp::Eq for vortex_tensor::FixedShapeTensor
41+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::serialize_metadata(&self, metadata: &Self::Metadata) -> vortex_error::VortexResult<alloc::vec::Vec<u8>>
4242

43-
impl core::cmp::PartialEq for vortex_tensor::FixedShapeTensor
43+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::unpack_native<'a>(&self, _metadata: &'a Self::Metadata, _storage_dtype: &'a vortex_array::dtype::DType, storage_value: &'a vortex_array::scalar::scalar_value::ScalarValue) -> vortex_error::VortexResult<Self::NativeValue>
4444

45-
pub fn vortex_tensor::FixedShapeTensor::eq(&self, other: &vortex_tensor::FixedShapeTensor) -> bool
45+
pub fn vortex_tensor::fixed_shape::FixedShapeTensor::validate_dtype(&self, metadata: &Self::Metadata, storage_dtype: &vortex_array::dtype::DType) -> vortex_error::VortexResult<()>
4646

47-
impl core::default::Default for vortex_tensor::FixedShapeTensor
47+
pub struct vortex_tensor::fixed_shape::FixedShapeTensorMetadata
4848

49-
pub fn vortex_tensor::FixedShapeTensor::default() -> vortex_tensor::FixedShapeTensor
49+
impl vortex_tensor::fixed_shape::FixedShapeTensorMetadata
5050

51-
impl core::fmt::Debug for vortex_tensor::FixedShapeTensor
51+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::dim_names(&self) -> core::option::Option<&[alloc::string::String]>
5252

53-
pub fn vortex_tensor::FixedShapeTensor::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
53+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::logical_shape(&self) -> &[usize]
5454

55-
impl core::hash::Hash for vortex_tensor::FixedShapeTensor
55+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::ndim(&self) -> usize
5656

57-
pub fn vortex_tensor::FixedShapeTensor::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
57+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::new(shape: alloc::vec::Vec<usize>) -> Self
5858

59-
impl core::marker::StructuralPartialEq for vortex_tensor::FixedShapeTensor
59+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::permutation(&self) -> core::option::Option<&[usize]>
6060

61-
impl vortex_array::dtype::extension::vtable::ExtVTable for vortex_tensor::FixedShapeTensor
61+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::physical_shape(&self) -> impl core::iter::traits::iterator::Iterator<Item = usize> + '_
6262

63-
pub type vortex_tensor::FixedShapeTensor::Metadata = vortex_tensor::FixedShapeTensorMetadata
63+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::strides(&self) -> impl core::iter::traits::iterator::Iterator<Item = usize> + '_
6464

65-
pub type vortex_tensor::FixedShapeTensor::NativeValue<'a> = &'a vortex_array::scalar::scalar_value::ScalarValue
65+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::with_dim_names(self, names: alloc::vec::Vec<alloc::string::String>) -> vortex_error::VortexResult<Self>
6666

67-
pub fn vortex_tensor::FixedShapeTensor::deserialize_metadata(&self, metadata: &[u8]) -> vortex_error::VortexResult<Self::Metadata>
67+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::with_permutation(self, permutation: alloc::vec::Vec<usize>) -> vortex_error::VortexResult<Self>
6868

69-
pub fn vortex_tensor::FixedShapeTensor::id(&self) -> vortex_array::dtype::extension::ExtId
69+
impl core::clone::Clone for vortex_tensor::fixed_shape::FixedShapeTensorMetadata
7070

71-
pub fn vortex_tensor::FixedShapeTensor::serialize_metadata(&self, metadata: &Self::Metadata) -> vortex_error::VortexResult<alloc::vec::Vec<u8>>
71+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::clone(&self) -> vortex_tensor::fixed_shape::FixedShapeTensorMetadata
7272

73-
pub fn vortex_tensor::FixedShapeTensor::unpack_native<'a>(&self, _metadata: &'a Self::Metadata, _storage_dtype: &'a vortex_array::dtype::DType, storage_value: &'a vortex_array::scalar::scalar_value::ScalarValue) -> vortex_error::VortexResult<Self::NativeValue>
73+
impl core::cmp::Eq for vortex_tensor::fixed_shape::FixedShapeTensorMetadata
7474

75-
pub fn vortex_tensor::FixedShapeTensor::validate_dtype(&self, metadata: &Self::Metadata, storage_dtype: &vortex_array::dtype::DType) -> vortex_error::VortexResult<()>
75+
impl core::cmp::PartialEq for vortex_tensor::fixed_shape::FixedShapeTensorMetadata
7676

77-
pub struct vortex_tensor::FixedShapeTensorMetadata
77+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::eq(&self, other: &vortex_tensor::fixed_shape::FixedShapeTensorMetadata) -> bool
7878

79-
impl vortex_tensor::FixedShapeTensorMetadata
79+
impl core::fmt::Debug for vortex_tensor::fixed_shape::FixedShapeTensorMetadata
8080

81-
pub fn vortex_tensor::FixedShapeTensorMetadata::dim_names(&self) -> core::option::Option<&[alloc::string::String]>
81+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
8282

83-
pub fn vortex_tensor::FixedShapeTensorMetadata::logical_shape(&self) -> &[usize]
83+
impl core::fmt::Display for vortex_tensor::fixed_shape::FixedShapeTensorMetadata
8484

85-
pub fn vortex_tensor::FixedShapeTensorMetadata::ndim(&self) -> usize
85+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
8686

87-
pub fn vortex_tensor::FixedShapeTensorMetadata::new(shape: alloc::vec::Vec<usize>) -> Self
87+
impl core::hash::Hash for vortex_tensor::fixed_shape::FixedShapeTensorMetadata
8888

89-
pub fn vortex_tensor::FixedShapeTensorMetadata::permutation(&self) -> core::option::Option<&[usize]>
89+
pub fn vortex_tensor::fixed_shape::FixedShapeTensorMetadata::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
9090

91-
pub fn vortex_tensor::FixedShapeTensorMetadata::physical_shape(&self) -> impl core::iter::traits::iterator::Iterator<Item = usize> + '_
91+
impl core::marker::StructuralPartialEq for vortex_tensor::fixed_shape::FixedShapeTensorMetadata
9292

93-
pub fn vortex_tensor::FixedShapeTensorMetadata::strides(&self) -> impl core::iter::traits::iterator::Iterator<Item = usize> + '_
93+
pub mod vortex_tensor::scalar_fns
9494

95-
pub fn vortex_tensor::FixedShapeTensorMetadata::with_dim_names(self, names: alloc::vec::Vec<alloc::string::String>) -> vortex_error::VortexResult<Self>
95+
pub mod vortex_tensor::scalar_fns::cosine_similarity
96+
97+
pub struct vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity
9698

97-
pub fn vortex_tensor::FixedShapeTensorMetadata::with_permutation(self, permutation: alloc::vec::Vec<usize>) -> vortex_error::VortexResult<Self>
99+
impl core::clone::Clone for vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity
98100

99-
impl core::clone::Clone for vortex_tensor::FixedShapeTensorMetadata
101+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::clone(&self) -> vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity
100102

101-
pub fn vortex_tensor::FixedShapeTensorMetadata::clone(&self) -> vortex_tensor::FixedShapeTensorMetadata
103+
impl vortex_array::scalar_fn::vtable::ScalarFnVTable for vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity
102104

103-
impl core::cmp::Eq for vortex_tensor::FixedShapeTensorMetadata
105+
pub type vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::Options = vortex_array::scalar_fn::vtable::EmptyOptions
104106

105-
impl core::cmp::PartialEq for vortex_tensor::FixedShapeTensorMetadata
107+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::arity(&self, _options: &Self::Options) -> vortex_array::scalar_fn::vtable::Arity
106108

107-
pub fn vortex_tensor::FixedShapeTensorMetadata::eq(&self, other: &vortex_tensor::FixedShapeTensorMetadata) -> bool
109+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::child_name(&self, _options: &Self::Options, child_idx: usize) -> vortex_array::scalar_fn::vtable::ChildName
108110

109-
impl core::fmt::Debug for vortex_tensor::FixedShapeTensorMetadata
111+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::execute(&self, _options: &Self::Options, args: &dyn vortex_array::scalar_fn::vtable::ExecutionArgs, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::array::ArrayRef>
110112

111-
pub fn vortex_tensor::FixedShapeTensorMetadata::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
113+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::fmt_sql(&self, _options: &Self::Options, expr: &vortex_array::expr::expression::Expression, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
112114

113-
impl core::fmt::Display for vortex_tensor::FixedShapeTensorMetadata
115+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::id(&self) -> vortex_array::scalar_fn::ScalarFnId
114116

115-
pub fn vortex_tensor::FixedShapeTensorMetadata::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
117+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::is_fallible(&self, _options: &Self::Options) -> bool
116118

117-
impl core::hash::Hash for vortex_tensor::FixedShapeTensorMetadata
119+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::is_null_sensitive(&self, _options: &Self::Options) -> bool
118120

119-
pub fn vortex_tensor::FixedShapeTensorMetadata::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
121+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::return_dtype(&self, _options: &Self::Options, arg_dtypes: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult<vortex_array::dtype::DType>
120122

121-
impl core::marker::StructuralPartialEq for vortex_tensor::FixedShapeTensorMetadata
123+
pub fn vortex_tensor::scalar_fns::cosine_similarity::CosineSimilarity::validity(&self, _options: &Self::Options, expression: &vortex_array::expr::expression::Expression) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::expression::Expression>>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// SPDX-FileCopyrightText: Copyright the Vortex contributors
3+
4+
//! Fixed-shape Tensor extension type.
5+
6+
/// The VTable for the Tensor extension type.
7+
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
8+
pub struct FixedShapeTensor;
9+
10+
mod metadata;
11+
pub use metadata::FixedShapeTensorMetadata;
12+
13+
mod proto;
14+
mod vtable;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use vortex::error::VortexExpect;
88
use vortex::error::VortexResult;
99
use vortex::error::vortex_err;
1010

11-
use crate::FixedShapeTensorMetadata;
11+
use crate::fixed_shape::FixedShapeTensorMetadata;
1212

1313
/// Protobuf representation of [`FixedShapeTensorMetadata`].
1414
///
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ use vortex::error::vortex_ensure;
1010
use vortex::error::vortex_ensure_eq;
1111
use vortex::scalar::ScalarValue;
1212

13-
use crate::FixedShapeTensor;
14-
use crate::FixedShapeTensorMetadata;
15-
use crate::proto;
13+
use crate::fixed_shape::FixedShapeTensor;
14+
use crate::fixed_shape::FixedShapeTensorMetadata;
15+
use crate::fixed_shape::proto;
1616

1717
impl ExtVTable for FixedShapeTensor {
1818
type Metadata = FixedShapeTensorMetadata;
@@ -80,8 +80,8 @@ mod tests {
8080
use vortex::dtype::extension::ExtVTable;
8181
use vortex::error::VortexResult;
8282

83-
use crate::FixedShapeTensor;
84-
use crate::FixedShapeTensorMetadata;
83+
use crate::fixed_shape::FixedShapeTensor;
84+
use crate::fixed_shape::FixedShapeTensorMetadata;
8585

8686
/// Serializes and deserializes the given metadata through protobuf, asserting equality.
8787
fn assert_roundtrip(metadata: &FixedShapeTensorMetadata) -> VortexResult<()> {

vortex-tensor/src/lib.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
// SPDX-License-Identifier: Apache-2.0
22
// SPDX-FileCopyrightText: Copyright the Vortex contributors
33

4-
//! Tensor extension type.
4+
//! Types and functionality for working with tensors, vectors, and related mathematical constructs
5+
//! including unit vectors, spherical coordinates, and similarity measures such as cosine
6+
//! similarity.
57
6-
mod metadata;
7-
pub use metadata::FixedShapeTensorMetadata;
8-
9-
mod proto;
10-
mod vtable;
8+
pub mod fixed_shape;
119

1210
pub mod scalar_fns;
13-
14-
/// The VTable for the Tensor extension type.
15-
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
16-
pub struct FixedShapeTensor;

vortex-tensor/src/scalar_fns/cosine_similarity.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
22
// SPDX-FileCopyrightText: Copyright the Vortex contributors
33

4-
//! Cosine similarity expression for [`FixedShapeTensor`](crate::FixedShapeTensor) arrays.
4+
//! Cosine similarity expression for [`FixedShapeTensor`](crate::fixed_shape::FixedShapeTensor)
5+
//! arrays.
56
67
use std::fmt::Formatter;
78

@@ -30,16 +31,18 @@ use vortex::scalar_fn::ExecutionArgs;
3031
use vortex::scalar_fn::ScalarFnId;
3132
use vortex::scalar_fn::ScalarFnVTable;
3233

33-
/// Cosine similarity between two [`FixedShapeTensor`] columns.
34+
// TODO(connor): We will want to add implementations for unit normalized vectors and also vectors
35+
// encoded in spherical coordinates.
36+
/// Cosine similarity between two columns.
3437
///
35-
/// Computes `dot(a, b) / (||a|| * ||b||)` over the flat backing buffer of each tensor. The
36-
/// shape and permutation do not affect the result because cosine similarity only depends on the
37-
/// element values, not their logical arrangement.
38+
/// For [`FixedShapeTensor`], computes `dot(a, b) / (||a|| * ||b||)` over the flat backing buffer of
39+
/// each tensor. The shape and permutation do not affect the result because cosine similarity only
40+
/// depends on the element values, not their logical arrangement.
3841
///
39-
/// Both inputs must be [`FixedShapeTensor`] extension arrays with the same dtype and a float
40-
/// element type (`f32` or `f64`). The output is a primitive column of the same float type.
42+
/// Right now, both inputs must be [`FixedShapeTensor`] extension arrays with the same dtype and a
43+
/// float element type. The output is a float column of the same float type.
4144
///
42-
/// [`FixedShapeTensor`]: crate::FixedShapeTensor
45+
/// [`FixedShapeTensor`]: crate::fixed_shape::FixedShapeTensor
4346
#[derive(Clone)]
4447
pub struct CosineSimilarity;
4548

@@ -259,8 +262,8 @@ mod tests {
259262
use vortex::scalar_fn::EmptyOptions;
260263
use vortex::scalar_fn::ScalarFn;
261264

262-
use crate::FixedShapeTensor;
263-
use crate::FixedShapeTensorMetadata;
265+
use crate::fixed_shape::FixedShapeTensor;
266+
use crate::fixed_shape::FixedShapeTensorMetadata;
264267
use crate::scalar_fns::cosine_similarity::CosineSimilarity;
265268

266269
/// Builds a [`FixedShapeTensor`] extension array from flat f64 elements and a logical shape.

0 commit comments

Comments
 (0)