// Native broadcasting follows trailing dimensions: equal extents or one == 1.
let matrix = NDArray<Float64>(shape: List(2, 3), fill: 2.0)
let bias = NDArray<Float64>(shape: List(3), fill: 0.0)
bias.set(List(0), 10.0)
bias.set(List(1), 20.0)
bias.set(List(2), 30.0)
let shifted = matrix.add(bias)
print(shifted.shape())
print(shifted.to_list())
let columns = NDArray<Float64>(shape: List(2, 1), fill: 5.0)
print(columns.mul(bias).to_list())
let right = NDArray<Float64>(shape: List(3, 2), fill: 1.0)
let product = matrix.matmul(right)
print(product.shape())
print(product.to_list())
print(product.mean())
let detached_tensor = product.to_tensor()
print(type_of(detached_tensor))
let integers = Array<Int64>(size: 6, fill: 1)
print(integers.reshape(List(2, 3)).to_float().add(bias).to_list())
