I am running into a Rust error using nalgebra 0.21 to solve a linear least-squares problem.
I’m adding a row to an MxD to allow for a bias term to create a M+1 x D matrix, and multiplying the resulting matrix by its transpose as part of a least-squares calculation. The problem seems to be that the resulting matrix has no DimName trait implementation for the generic parameter for the number of rows (M+1).
impl<M, N> LinearModel<M, N> where
M: DimName + DimAdd<U1>,
N: DimName,
DefaultAllocator: Allocator<Fxx, M> + Allocator<Fxx, N> +
Allocator<Fxx, N, M>,
Owned<Fxx, N>: Copy,
Owned<Fxx, N, M>: Copy,
{
pub fn update_bulk<D: DimName>(&self,
x: &MatrixMN<Fxx, M, D>,
y: &MatrixMN<Fxx, D, N>) -> () where
Owned<Fxx, M, D>: Copy,
DefaultAllocator: Reallocator<Fxx, M, D, DimSum<M, U1>, D> +
Reallocator<Fxx, DimSum<M, U1>, D, D, DimSum<M, U1>> +
Allocator<Fxx, D, N> +
Allocator<Fxx, D, M> + Allocator<Fxx, M, D> + Allocator<Fxx, M, M>
{
let x1 = x.insert_row(M::dim(), 1.0); // (M+1 x D) OK
let x1t = x1.transpose(); // (D x M+1) OK
let xxt = x1 * x1t; // (M+1 x M+1) <- error
if let Some(xxt1) = xxt.try_inverse() {
....
I get an error
error[E0277]: the trait bound `<M as model::na::DimAdd<model::na::U1>>::Output: model::na::DimName` is not satisfied
--> src/model.rs:80:22
|
80 | let xxt = x1 * x1t; // M+1 x M+1
| ^ the trait `model::na::DimName` is not implemented for `<M as model::na::DimAdd<model::na::U1>>::Output`
|
= note: required because of the requirements on the impl of `model::na::allocator::Allocator<f64, <M as model::na::DimAdd<model::na::U1>>::Output, <M as model::na::DimAdd<model::na::U1>>::Output>` for `model::na::DefaultAllocator`
help: consider further restricting the associated type
|
76 | Allocator<Fxx, D, M> + Allocator<Fxx, M, D> + Allocator<Fxx, M, M>, <M as model::na::DimAdd<model::na::U1>>::Output: model::na::DimName
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I’m guessing that when I extend M to M+1 in add_row()
which uses DimSum<M, U1>
, that I lose Output
from DimName
, but I’m not sure how to update my litany of Allocator
traits to include the proper Output
implementation.
Thanks for any pointers, advice, wise words, incantations, etc…