# HG changeset patch # User Tuomo Valkonen # Date 1747110557 18000 # Node ID 593912dc3293332fb68179c625ea6e545295e07b # Parent 2b13f8a0c8ba27411dfe2e0829a43bd7d6e96bb1 dual_origin diff -r 2b13f8a0c8ba -r 593912dc3293 src/direct_product.rs --- a/src/direct_product.rs Mon May 12 20:40:14 2025 -0500 +++ b/src/direct_product.rs Mon May 12 23:29:17 2025 -0500 @@ -561,4 +561,8 @@ B: HasDual, { type DualSpace = Pair; + + fn dual_origin(&self) -> ::Owned { + Pair(self.0.dual_origin(), self.1.dual_origin()) + } } diff -r 2b13f8a0c8ba -r 593912dc3293 src/loc.rs --- a/src/loc.rs Mon May 12 20:40:14 2025 -0500 +++ b/src/loc.rs Mon May 12 23:29:17 2025 -0500 @@ -595,6 +595,10 @@ impl HasDual for Loc { type DualSpace = Self; + + fn dual_origin(&self) -> Self::DualSpace { + self.similar_origin() + } } impl Norm for Loc { diff -r 2b13f8a0c8ba -r 593912dc3293 src/nalgebra_support.rs --- a/src/nalgebra_support.rs Mon May 12 20:40:14 2025 -0500 +++ b/src/nalgebra_support.rs Mon May 12 23:29:17 2025 -0500 @@ -275,12 +275,16 @@ impl HasDual for Vector where M: Dim, - S: Storage + Clone, + S: StorageMut + Clone, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, { // TODO: Doesn't work with different storage formats. - type DualSpace = Self; + type DualSpace = Vector; + + fn dual_origin(&self) -> OVector { + OVector::zeros_generic(M::from_usize(self.len()), Const) + } } impl Norm for Vector diff -r 2b13f8a0c8ba -r 593912dc3293 src/norms.rs --- a/src/norms.rs Mon May 12 20:40:14 2025 -0500 +++ b/src/norms.rs Mon May 12 23:29:17 2025 -0500 @@ -3,6 +3,7 @@ */ use crate::euclidean::*; +use crate::linops::AXPY; use crate::mapping::{Instance, Mapping, Space}; use crate::types::*; use serde::{Deserialize, Serialize}; @@ -231,8 +232,10 @@ } } -pub trait HasDual: Normed { - type DualSpace: Normed; +pub trait HasDual: Normed + AXPY { + type DualSpace: Normed + AXPY; + + fn dual_origin(&self) -> ::Owned; } /// Automatically implemented trait for reflexive spaces