1use alloc::vec::Vec;
2use burn_backend::{
3 BoolDType, ExecutionError, FloatDType, IntDType, Scalar, Shape, Slice, TensorData,
4 ops::BoolTensorOps,
5 tensor::{BoolTensor, FloatTensor, IntTensor},
6};
7use burn_backend_extension::backend_dispatch;
8
9use crate::{Dispatch, DispatchDevice};
10
11#[backend_dispatch]
12impl BoolTensorOps<Self> for Dispatch {
13 fn bool_empty(shape: Shape, device: &DispatchDevice, dtype: BoolDType) -> BoolTensor<Self> {
14 B::bool_empty(shape, device, dtype)
15 }
16
17 fn bool_zeros(shape: Shape, device: &DispatchDevice, dtype: BoolDType) -> BoolTensor<Self> {
18 B::bool_zeros(shape, device, dtype)
19 }
20
21 fn bool_ones(shape: Shape, device: &DispatchDevice, dtype: BoolDType) -> BoolTensor<Self> {
22 B::bool_ones(shape, device, dtype)
23 }
24
25 async fn bool_into_data(tensor: BoolTensor<Self>) -> Result<TensorData, ExecutionError> {
26 B::bool_into_data(tensor).await
27 }
28
29 fn bool_from_data(data: TensorData, device: &DispatchDevice) -> BoolTensor<Self> {
30 B::bool_from_data(data, device)
31 }
32
33 fn bool_into_int(tensor: BoolTensor<Self>, out_dtype: IntDType) -> IntTensor<Self> {
34 B::bool_into_int(tensor, out_dtype)
35 }
36
37 fn bool_into_float(tensor: BoolTensor<Self>, out_dtype: FloatDType) -> FloatTensor<Self> {
38 B::bool_into_float(tensor, out_dtype)
39 }
40
41 #[backend_dispatch(skip)]
42 fn bool_to_device(tensor: BoolTensor<Self>, device: &DispatchDevice) -> BoolTensor<Self> {
43 to_device!(
44 Bool,
45 bool,
46 tensor,
47 device,
48 bool_to_device,
49 |inner, device| {
50 let data =
51 burn_backend::read_sync(B1::bool_into_data(inner)).expect("Should read data");
52 B2::bool_from_data(data, device)
53 }
54 )
55 }
56
57 fn bool_reshape(tensor: BoolTensor<Self>, shape: Shape) -> BoolTensor<Self> {
58 B::bool_reshape(tensor, shape)
59 }
60
61 fn bool_slice(tensor: BoolTensor<Self>, slices: &[Slice]) -> BoolTensor<Self> {
62 B::bool_slice(tensor, slices)
63 }
64
65 fn bool_slice_assign(
66 tensor: BoolTensor<Self>,
67 slices: &[Slice],
68 value: BoolTensor<Self>,
69 ) -> BoolTensor<Self> {
70 B::bool_slice_assign(tensor, slices, value)
71 }
72
73 fn bool_mask_where(
74 tensor: BoolTensor<Self>,
75 mask: BoolTensor<Self>,
76 value: BoolTensor<Self>,
77 ) -> BoolTensor<Self> {
78 B::bool_mask_where(tensor, mask, value)
79 }
80
81 fn bool_mask_fill(
82 tensor: BoolTensor<Self>,
83 mask: BoolTensor<Self>,
84 value: Scalar,
85 ) -> BoolTensor<Self> {
86 B::bool_mask_fill(tensor, mask, value)
87 }
88
89 async fn bool_mask_select(
90 tensor: BoolTensor<Self>,
91 mask: BoolTensor<Self>,
92 ) -> BoolTensor<Self> {
93 B::bool_mask_select(tensor, mask).await
94 }
95
96 fn bool_gather(
97 dim: usize,
98 tensor: BoolTensor<Self>,
99 indices: IntTensor<Self>,
100 ) -> BoolTensor<Self> {
101 B::bool_gather(dim, tensor, indices)
102 }
103
104 fn bool_scatter_or(
105 dim: usize,
106 tensor: BoolTensor<Self>,
107 indices: IntTensor<Self>,
108 value: BoolTensor<Self>,
109 ) -> BoolTensor<Self> {
110 B::bool_scatter_or(dim, tensor, indices, value)
111 }
112
113 fn bool_equal(lhs: BoolTensor<Self>, rhs: BoolTensor<Self>) -> BoolTensor<Self> {
114 B::bool_equal(lhs, rhs)
115 }
116
117 fn bool_equal_elem(lhs: BoolTensor<Self>, rhs: Scalar) -> BoolTensor<Self> {
118 B::bool_equal_elem(lhs, rhs)
119 }
120
121 fn bool_not(tensor: BoolTensor<Self>) -> BoolTensor<Self> {
122 B::bool_not(tensor)
123 }
124
125 fn bool_and(lhs: BoolTensor<Self>, rhs: BoolTensor<Self>) -> BoolTensor<Self> {
126 B::bool_and(lhs, rhs)
127 }
128
129 fn bool_or(lhs: BoolTensor<Self>, rhs: BoolTensor<Self>) -> BoolTensor<Self> {
130 B::bool_or(lhs, rhs)
131 }
132
133 fn bool_swap_dims(tensor: BoolTensor<Self>, dim1: usize, dim2: usize) -> BoolTensor<Self> {
134 B::bool_swap_dims(tensor, dim1, dim2)
135 }
136
137 fn bool_permute(tensor: BoolTensor<Self>, axes: &[usize]) -> BoolTensor<Self> {
138 B::bool_permute(tensor, axes)
139 }
140
141 fn bool_flip(tensor: BoolTensor<Self>, axes: &[usize]) -> BoolTensor<Self> {
142 B::bool_flip(tensor, axes)
143 }
144
145 fn bool_expand(tensor: BoolTensor<Self>, shape: Shape) -> BoolTensor<Self> {
146 B::bool_expand(tensor, shape)
147 }
148
149 fn bool_unfold(
150 tensor: BoolTensor<Self>,
151 dim: usize,
152 size: usize,
153 step: usize,
154 ) -> BoolTensor<Self> {
155 B::bool_unfold(tensor, dim, size, step)
156 }
157
158 fn bool_select(
159 tensor: BoolTensor<Self>,
160 dim: usize,
161 indices: IntTensor<Self>,
162 ) -> BoolTensor<Self> {
163 B::bool_select(tensor, dim, indices)
164 }
165
166 fn bool_select_or(
167 tensor: BoolTensor<Self>,
168 dim: usize,
169 indices: IntTensor<Self>,
170 value: BoolTensor<Self>,
171 ) -> BoolTensor<Self> {
172 B::bool_select_or(tensor, dim, indices, value)
173 }
174
175 fn bool_repeat_dim(tensor: BoolTensor<Self>, dim: usize, times: usize) -> BoolTensor<Self> {
176 B::bool_repeat_dim(tensor, dim, times)
177 }
178
179 fn bool_cat(tensors: Vec<BoolTensor<Self>>, dim: usize) -> BoolTensor<Self> {
180 B::bool_cat(tensors, dim)
181 }
182
183 fn bool_not_equal(lhs: BoolTensor<Self>, rhs: BoolTensor<Self>) -> BoolTensor<Self> {
184 B::bool_not_equal(lhs, rhs)
185 }
186
187 fn bool_not_equal_elem(lhs: BoolTensor<Self>, rhs: Scalar) -> BoolTensor<Self> {
188 B::bool_not_equal_elem(lhs, rhs)
189 }
190
191 fn bool_xor(lhs: BoolTensor<Self>, rhs: BoolTensor<Self>) -> BoolTensor<Self> {
192 B::bool_xor(lhs, rhs)
193 }
194
195 fn bool_transpose(tensor: BoolTensor<Self>) -> BoolTensor<Self> {
196 B::bool_transpose(tensor)
197 }
198
199 fn bool_any(tensor: BoolTensor<Self>) -> BoolTensor<Self> {
200 B::bool_any(tensor)
201 }
202
203 fn bool_any_dim(tensor: BoolTensor<Self>, dim: usize) -> BoolTensor<Self> {
204 B::bool_any_dim(tensor, dim)
205 }
206
207 fn bool_all(tensor: BoolTensor<Self>) -> BoolTensor<Self> {
208 B::bool_all(tensor)
209 }
210
211 fn bool_all_dim(tensor: BoolTensor<Self>, dim: usize) -> BoolTensor<Self> {
212 B::bool_all_dim(tensor, dim)
213 }
214
215 async fn bool_argwhere(tensor: BoolTensor<Self>, out_dtype: IntDType) -> IntTensor<Self> {
216 B::bool_argwhere(tensor, out_dtype).await
217 }
218}