GOOGLE ADS

lunes, 25 de abril de 2022

¿Cómo reduzco la especificación genérica repetida?

En este ejemplo, repito na::SVector<f64, NumStates>un montón, ¿puedo definir un tipo?

type StateVector = na::SVector<f64, NumStates>;

¿Me gusta esto? Me sale un error que associated type defaults are unstable. ¿Hay otra manera?

use nalgebra as na;
pub trait Cost<const NumStates: usize, const NumControls: usize> {
fn stage_cost(&self, x: &na::SVector<f64, NumStates>, u: &na::SVector<f64, NumControls>)
-> f64;
fn stage_grad(
&self,
x: &na::SVector<f64, NumStates>,
u: &na::SVector<f64, NumControls>,
grad_x: &mut na::SVector<f64, NumStates>,
grad_u: &mut na::SVector<f64, NumControls>,
);
fn terminal_cost(&self, x: &na::SVector<f64, NumStates>) -> f64;
fn terminal_grad(
&self,
x: &na::SVector<f64, NumStates>,
grad: &mut na::SVector<f64, NumStates>,
);
}


Solución del problema

Como señala un comentarista, la posición importa. Sospecho que su bloque de código que crea el error se ve así:

use nalgebra as na;
pub trait Cost<const NumStates: usize, const NumControls: usize> {
type StateVector = na::SVector<f64, NumStates>;
fn stage_cost(&self, x: &na::SVector<f64, NumStates>, u: &na::SVector<f64, NumControls>)
-> f64;
fn stage_grad(
&self,
x: &na::SVector<f64, NumStates>,
u: &na::SVector<f64, NumControls>,
grad_x: &mut na::SVector<f64, NumStates>,
grad_u: &mut na::SVector<f64, NumControls>,
);
fn terminal_cost(&self, x: &na::SVector<f64, NumStates>) -> f64;
fn terminal_grad(
&self,
x: &na::SVector<f64, NumStates>,
grad: &mut na::SVector<f64, NumStates>,
);
}

Esto crea un tipo asociado que no puede tener un tipo predeterminado en estable.

Defina su alias de tipo fuera del traitcuerpo y habrá resuelto su problema:

use algebra as na;
type StateVector<const D: usize> = na::SVector<f64, D>;
pub trait Cost<const NumStates: usize, const NumControls: usize> {
fn stage_cost(&self, x: &StateVector<NumStates>, u: &StateVector<NumControls>)
-> f64;
fn stage_grad(
&self,
x: &StateVector<NumStates>,
u: &StateVector<NumControls>,
grad_x: &mut StateVector<NumStates>,
grad_u: &mut StateVector<NumControls>,
);
fn terminal_cost(&self, x: &StateVector<NumStates>) -> f64;
fn terminal_grad(
&self,
x: &StateVector<NumStates>,
grad: &mut StateVector<NumStates>,
);
}

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...