| 44 | } |
| 45 | |
| 46 | pub(super) fn broadcast_arrays(element_types: Vec<Type>) -> Result<Type> { |
| 47 | if element_types.is_empty() { |
| 48 | return Err(runtime_error!("Can't broadcast the empty sequence")); |
| 49 | } |
| 50 | for x in &element_types { |
| 51 | if !x.is_scalar() && !x.is_array() { |
| 52 | return Err(runtime_error!( |
| 53 | "Can broadcast only scalars and arrays, got {x:?}" |
| 54 | )); |
| 55 | } |
| 56 | if x.is_array() && !is_valid_shape(x.get_shape()) { |
| 57 | return Err(runtime_error!("Invalid shape: {:?}", x.get_shape())); |
| 58 | } |
| 59 | } |
| 60 | let mut result = element_types[0].clone(); |
| 61 | for item in element_types.iter().skip(1) { |
| 62 | result = broadcast_pair(result, item.clone())?; |
| 63 | } |
| 64 | Ok(result) |
| 65 | } |
| 66 | |
| 67 | pub fn index_to_number(index: &[u64], shape: &[u64]) -> u64 { |
| 68 | let mut num = 0; |