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 trait
cuerpo 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