src/seminorms.rs

Mon, 17 Feb 2025 14:10:52 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 17 Feb 2025 14:10:52 -0500
changeset 54
b3312eee105c
parent 35
b087e3eab191
permissions
-rw-r--r--

Make some math in documentation render

0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*! This module implements the convolution operators $𝒟$.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 The principal data type of the module is [`ConvolutionOp`] and the main abstraction
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 the trait [`DiscreteMeasureOp`].
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 */
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
7 use crate::measures::{DeltaMeasure, DiscreteMeasure, Radon, SpikeIter, RNDM};
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
8 use alg_tools::bisection_tree::*;
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
9 use alg_tools::instance::Instance;
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
10 use alg_tools::iter::{FilterMapX, Mappable};
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
11 use alg_tools::linops::{BoundedLinear, Linear, Mapping};
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 use alg_tools::loc::Loc;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 use alg_tools::mapping::RealMapping;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 use alg_tools::nalgebra_support::ToNalgebraRealField;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
15 use alg_tools::norms::Linfinity;
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
16 use alg_tools::sets::Cube;
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
17 use alg_tools::types::*;
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
18 use itertools::Itertools;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 use nalgebra::DMatrix;
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
20 use std::iter::Zip;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 use std::marker::PhantomData;
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
22 use std::ops::RangeFrom;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 /// Abstraction for operators $𝒟 ∈ 𝕃(𝒵(Ω); C_c(Ω))$.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 ///
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 /// Here $𝒵(Ω) ⊂ ℳ(Ω)$ is the space of sums of delta measures, presented by [`DiscreteMeasure`].
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
27 pub trait DiscreteMeasureOp<Domain, F>:
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
28 BoundedLinear<DiscreteMeasure<Domain, F>, Radon, Linfinity, F>
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
29 where
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
30 F: Float + ToNalgebraRealField,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
31 Domain: 'static + Clone + PartialEq,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
32 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 /// The output type of [`Self::preapply`].
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 type PreCodomain;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 /// Creates a finite-dimensional presentatin of the operator restricted to a fixed support.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 ///
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 /// <p>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 /// This returns the matrix $C_*𝒟C$, where $C ∈ 𝕃(ℝ^n; 𝒵(Ω))$, $Ca = ∑_{i=1}^n α_i δ_{x_i}$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 /// for a $x_1, …, x_n$ the coordinates given by the iterator `I`, and $a=(α_1,…,α_n)$.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 /// Here $C_* ∈ 𝕃(C_c(Ω); ℝ^n) $ stands for the preadjoint.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 /// </p>
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
43 fn findim_matrix<'a, I>(&self, points: I) -> DMatrix<F::MixedType>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
44 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
45 I: ExactSizeIterator<Item = &'a Domain> + Clone;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
47 /// [`Mapping`] that typically returns an uninitialised [`PreBTFN`]
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 /// instead of a full [`BTFN`].
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
49 fn preapply(&self, μ: DiscreteMeasure<Domain, F>) -> Self::PreCodomain;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 // Blanket implementation of a measure as a linear functional over a predual
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 // (that by assumption is a linear functional over a measure).
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 /*impl<F, Domain, Predual> Linear<Predual>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 for DiscreteMeasure<Domain, F>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 where F : Float + ToNalgebraRealField,
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 Predual : Linear<DiscreteMeasure<Domain, F>, Codomain=F> {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 type Codomain = F;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 #[inline]
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 fn apply(&self, ω : &Predual) -> F {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 ω.apply(self)
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 }*/
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 //
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 // Convolutions for discrete measures
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 //
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 /// A trait alias for simple convolution kernels.
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
71 pub trait SimpleConvolutionKernel<F: Float, const N: usize>:
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
72 RealMapping<F, N> + Support<F, N> + Bounded<F> + Clone + 'static
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
73 {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
74 }
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
76 impl<T, F: Float, const N: usize> SimpleConvolutionKernel<F, N> for T where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
77 T: RealMapping<F, N> + Support<F, N> + Bounded<F> + Clone + 'static
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
78 {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
79 }
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 /// [`SupportGenerator`] for [`ConvolutionOp`].
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
82 #[derive(Clone, Debug)]
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
83 pub struct ConvolutionSupportGenerator<F: Float, K, const N: usize>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
84 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
85 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
86 {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
87 kernel: K,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
88 centres: RNDM<F, N>,
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
91 impl<F: Float, K, const N: usize> ConvolutionSupportGenerator<F, K, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
92 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
93 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
94 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 /// Construct the convolution kernel corresponding to `δ`, i.e., one centered at `δ.x` and
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 /// weighted by `δ.α`.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 #[inline]
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
98 fn construct_kernel<'a>(
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
99 &'a self,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
100 δ: &'a DeltaMeasure<Loc<F, N>, F>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
101 ) -> Weighted<Shift<K, F, N>, F> {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 self.kernel.clone().shift(δ.x).weigh(δ.α)
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 /// This is a helper method for the implementation of [`ConvolutionSupportGenerator::all_data`].
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 /// It filters out `δ` with zero weight, and otherwise returns the corresponding convolution
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 /// kernel. The `id` is passed through as-is.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 #[inline]
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 fn construct_kernel_and_id_filtered<'a>(
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 &'a self,
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
111 (id, δ): (usize, &'a DeltaMeasure<Loc<F, N>, F>),
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 ) -> Option<(usize, Weighted<Shift<K, F, N>, F>)> {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 (δ.α != F::ZERO).then(|| (id.into(), self.construct_kernel(δ)))
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
117 impl<F: Float, K, const N: usize> SupportGenerator<F, N> for ConvolutionSupportGenerator<F, K, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
118 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
119 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
120 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 type Id = usize;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 type SupportType = Weighted<Shift<K, F, N>, F>;
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
123 type AllDataIter<'a> = FilterMapX<
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
124 'a,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
125 Zip<RangeFrom<usize>, SpikeIter<'a, Loc<F, N>, F>>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
126 Self,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
127 (Self::Id, Self::SupportType),
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
128 >;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 #[inline]
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
131 fn support_for(&self, d: Self::Id) -> Self::SupportType {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 self.construct_kernel(&self.centres[d])
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 #[inline]
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 fn support_count(&self) -> usize {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 self.centres.len()
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 #[inline]
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 fn all_data(&self) -> Self::AllDataIter<'_> {
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
142 (0..)
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
143 .zip(self.centres.iter_spikes())
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
144 .filter_mapX(self, Self::construct_kernel_and_id_filtered)
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 /// Representation of a convolution operator $𝒟$.
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
149 #[derive(Clone, Debug)]
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
150 pub struct ConvolutionOp<F, K, BT, const N: usize>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
151 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
152 F: Float + ToNalgebraRealField,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
153 BT: BTImpl<F, N, Data = usize>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
154 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
155 {
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
156 /// Depth of the [`BT`] bisection tree for the outputs [`Mapping::apply`].
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
157 depth: BT::Depth,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
158 /// Domain of the [`BT`] bisection tree for the outputs [`Mapping::apply`].
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
159 domain: Cube<F, N>,
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 /// The convolution kernel
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
161 kernel: K,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
162 _phantoms: PhantomData<(F, BT)>,
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
165 impl<F, K, BT, const N: usize> ConvolutionOp<F, K, BT, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
166 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
167 F: Float + ToNalgebraRealField,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
168 BT: BTImpl<F, N, Data = usize>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
169 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
170 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 /// Creates a new convolution operator $𝒟$ with `kernel` on `domain`.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 ///
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
173 /// The output of [`Mapping::apply`] is a [`BT`] of given `depth`.
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
174 pub fn new(depth: BT::Depth, domain: Cube<F, N>, kernel: K) -> Self {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 ConvolutionOp {
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
176 depth: depth,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
177 domain: domain,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
178 kernel: kernel,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
179 _phantoms: PhantomData,
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 /// Returns the support generator for this convolution operator.
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
184 fn support_generator(&self, μ: RNDM<F, N>) -> ConvolutionSupportGenerator<F, K, N> {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185 // TODO: can we avoid cloning μ?
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 ConvolutionSupportGenerator {
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
187 kernel: self.kernel.clone(),
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
188 centres: μ,
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
191
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 /// Returns a reference to the kernel of this convolution operator.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 pub fn kernel(&self) -> &K {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 &self.kernel
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
198 impl<F, K, BT, const N: usize> Mapping<RNDM<F, N>> for ConvolutionOp<F, K, BT, N>
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
199 where
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
200 F: Float + ToNalgebraRealField,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
201 BT: BTImpl<F, N, Data = usize>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
202 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
203 Weighted<Shift<K, F, N>, F>: LocalAnalysis<F, BT::Agg, N>,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
204 {
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
205 type Codomain = BTFN<F, ConvolutionSupportGenerator<F, K, N>, BT, N>;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
207 fn apply<I>(&self, μ: I) -> Self::Codomain
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
208 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
209 I: Instance<RNDM<F, N>>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
210 {
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
211 let g = self.support_generator(μ.own());
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
212 BTFN::construct(self.domain.clone(), self.depth, g)
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
213 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
214 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
215
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
216 /// [`ConvolutionOp`]s as linear operators over [`DiscreteMeasure`]s.
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
217 impl<F, K, BT, const N: usize> Linear<RNDM<F, N>> for ConvolutionOp<F, K, BT, N>
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
218 where
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
219 F: Float + ToNalgebraRealField,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
220 BT: BTImpl<F, N, Data = usize>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
221 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
222 Weighted<Shift<K, F, N>, F>: LocalAnalysis<F, BT::Agg, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
223 {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
224 }
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
225
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
226 impl<F, K, BT, const N: usize> BoundedLinear<RNDM<F, N>, Radon, Linfinity, F>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
227 for ConvolutionOp<F, K, BT, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
228 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
229 F: Float + ToNalgebraRealField,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
230 BT: BTImpl<F, N, Data = usize>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
231 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
232 Weighted<Shift<K, F, N>, F>: LocalAnalysis<F, BT::Agg, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
233 {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
234 fn opnorm_bound(&self, _: Radon, _: Linfinity) -> F {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
235 // With μ = ∑_i α_i δ_{x_i}, we have
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
236 // |𝒟μ|_∞
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
237 // = sup_z |∑_i α_i φ(z - x_i)|
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
238 // ≤ sup_z ∑_i |α_i| |φ(z - x_i)|
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
239 // ≤ ∑_i |α_i| |φ|_∞
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
240 // = |μ|_ℳ |φ|_∞
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
241 self.kernel.bounds().uniform()
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
242 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
243 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
244
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
245 impl<F, K, BT, const N: usize> DiscreteMeasureOp<Loc<F, N>, F> for ConvolutionOp<F, K, BT, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
246 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
247 F: Float + ToNalgebraRealField,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
248 BT: BTImpl<F, N, Data = usize>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
249 K: SimpleConvolutionKernel<F, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
250 Weighted<Shift<K, F, N>, F>: LocalAnalysis<F, BT::Agg, N>,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
251 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
252 type PreCodomain = PreBTFN<F, ConvolutionSupportGenerator<F, K, N>, N>;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
253
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
254 fn findim_matrix<'a, I>(&self, points: I) -> DMatrix<F::MixedType>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
255 where
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
256 I: ExactSizeIterator<Item = &'a Loc<F, N>> + Clone,
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
257 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
258 // TODO: Preliminary implementation. It be best to use sparse matrices or
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
259 // possibly explicit operators without matrices
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
260 let n = points.len();
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
261 let points_clone = points.clone();
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
262 let pairs = points.cartesian_product(points_clone);
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
263 let kernel = &self.kernel;
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
264 let values = pairs.map(|(x, y)| kernel.apply(y - x).to_nalgebra_mixed());
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
265 DMatrix::from_iterator(n, n, values)
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
266 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
267
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
268 /// A version of [`Mapping::apply`] that does not instantiate the [`BTFN`] codomain with
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
269 /// a bisection tree, instead returning a [`PreBTFN`]. This can improve performance when
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
270 /// the output is to be added as the right-hand-side operand to a proper BTFN.
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
271 fn preapply(&self, μ: RNDM<F, N>) -> Self::PreCodomain {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
272 BTFN::new_pre(self.support_generator(μ))
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
273 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
274 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
275
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
276 /// Generates an scalar operation (e.g. [`std::ops::Mul`], [`std::ops::Div`])
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
277 /// for [`ConvolutionSupportGenerator`].
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
278 macro_rules! make_convolutionsupportgenerator_scalarop_rhs {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
279 ($trait:ident, $fn:ident, $trait_assign:ident, $fn_assign:ident) => {
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
280 impl<F: Float, K: SimpleConvolutionKernel<F, N>, const N: usize> std::ops::$trait_assign<F>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
281 for ConvolutionSupportGenerator<F, K, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
282 {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
283 fn $fn_assign(&mut self, t: F) {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
284 self.centres.$fn_assign(t);
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
285 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
286 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
287
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
288 impl<F: Float, K: SimpleConvolutionKernel<F, N>, const N: usize> std::ops::$trait<F>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
289 for ConvolutionSupportGenerator<F, K, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
290 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
291 type Output = ConvolutionSupportGenerator<F, K, N>;
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
292 fn $fn(mut self, t: F) -> Self::Output {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
293 std::ops::$trait_assign::$fn_assign(&mut self.centres, t);
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
294 self
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
295 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
296 }
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
297 impl<'a, F: Float, K: SimpleConvolutionKernel<F, N>, const N: usize> std::ops::$trait<F>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
298 for &'a ConvolutionSupportGenerator<F, K, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
299 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
300 type Output = ConvolutionSupportGenerator<F, K, N>;
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
301 fn $fn(self, t: F) -> Self::Output {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
302 ConvolutionSupportGenerator {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
303 kernel: self.kernel.clone(),
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
304 centres: (&self.centres).$fn(t),
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
305 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
306 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
307 }
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
308 };
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
309 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
310
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
311 make_convolutionsupportgenerator_scalarop_rhs!(Mul, mul, MulAssign, mul_assign);
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
312 make_convolutionsupportgenerator_scalarop_rhs!(Div, div, DivAssign, div_assign);
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
313
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
314 /// Generates an unary operation (e.g. [`std::ops::Neg`]) for [`ConvolutionSupportGenerator`].
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
315 macro_rules! make_convolutionsupportgenerator_unaryop {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
316 ($trait:ident, $fn:ident) => {
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
317 impl<F: Float, K: SimpleConvolutionKernel<F, N>, const N: usize> std::ops::$trait
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
318 for ConvolutionSupportGenerator<F, K, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
319 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
320 type Output = ConvolutionSupportGenerator<F, K, N>;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
321 fn $fn(mut self) -> Self::Output {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
322 self.centres = self.centres.$fn();
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
323 self
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
324 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
325 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
326
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
327 impl<'a, F: Float, K: SimpleConvolutionKernel<F, N>, const N: usize> std::ops::$trait
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
328 for &'a ConvolutionSupportGenerator<F, K, N>
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
329 {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
330 type Output = ConvolutionSupportGenerator<F, K, N>;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
331 fn $fn(self) -> Self::Output {
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
332 ConvolutionSupportGenerator {
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
333 kernel: self.kernel.clone(),
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
334 centres: (&self.centres).$fn(),
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
335 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
336 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
337 }
54
b3312eee105c Make some math in documentation render
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
338 };
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
339 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
340
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
341 make_convolutionsupportgenerator_unaryop!(Neg, neg);

mercurial