src/linops.rs

branch
dev
changeset 65
9327d544ca0b
parent 62
d8305c9b6fdf
child 66
15bfebfbfa3e
equal deleted inserted replaced
64:4f6ca107ccb1 65:9327d544ca0b
105 /// For an operator $A$ this is an operator $A\_\*$ 105 /// For an operator $A$ this is an operator $A\_\*$
106 /// such that its adjoint $(A\_\*)^\*=A$. The space `X` is the domain of the `Self` 106 /// such that its adjoint $(A\_\*)^\*=A$. The space `X` is the domain of the `Self`
107 /// operator. The space `Ypre` is the predual of its codomain, and should be the 107 /// operator. The space `Ypre` is the predual of its codomain, and should be the
108 /// domain of the adjointed operator. `Self::Preadjoint` should be 108 /// domain of the adjointed operator. `Self::Preadjoint` should be
109 /// [`Adjointable`]`<'a,Ypre,X>`. 109 /// [`Adjointable`]`<'a,Ypre,X>`.
110 110 /// We do not make additional restrictions on `Self::Preadjoint` (in particular, it
111 /// does not have to be adjointable) to allow `X` to be a subspace yet the preadjoint
112 /// have the full space as the codomain, etc.
111 pub trait Preadjointable<X : Space, Ypre : Space> : Linear<X> { 113 pub trait Preadjointable<X : Space, Ypre : Space> : Linear<X> {
112 type PreadjointCodomain : Space; 114 type PreadjointCodomain : Space;
113 type Preadjoint<'a> : Adjointable< 115 type Preadjoint<'a> : Linear<
114 Ypre, X, AdjointCodomain=Self::Codomain, Codomain=Self::PreadjointCodomain 116 Ypre, Codomain=Self::PreadjointCodomain
115 > where Self : 'a; 117 > where Self : 'a;
116 118
117 /// Form the adjoint operator of `self`. 119 /// Form the adjoint operator of `self`.
118 fn preadjoint(&self) -> Self::Preadjoint<'_>; 120 fn preadjoint(&self) -> Self::Preadjoint<'_>;
119 } 121 }
367 B : Space, 369 B : Space,
368 Yʹ : Space, 370 Yʹ : Space,
369 S : Preadjointable<A, Yʹ>, 371 S : Preadjointable<A, Yʹ>,
370 T : Preadjointable<B, Yʹ>, 372 T : Preadjointable<B, Yʹ>,
371 Self : Linear<Pair<A, B>>, 373 Self : Linear<Pair<A, B>>,
372 for<'a> ColOp<S::Preadjoint<'a>, T::Preadjoint<'a>> : Adjointable< 374 for<'a> ColOp<S::Preadjoint<'a>, T::Preadjoint<'a>> : Linear<
373 Yʹ, Pair<A,B>, 375 Yʹ, Codomain=Pair<S::PreadjointCodomain, T::PreadjointCodomain>,
374 Codomain=Pair<S::PreadjointCodomain, T::PreadjointCodomain>,
375 AdjointCodomain = Self::Codomain,
376 >, 376 >,
377 { 377 {
378 type PreadjointCodomain = Pair<S::PreadjointCodomain, T::PreadjointCodomain>; 378 type PreadjointCodomain = Pair<S::PreadjointCodomain, T::PreadjointCodomain>;
379 type Preadjoint<'a> = ColOp<S::Preadjoint<'a>, T::Preadjoint<'a>> where Self : 'a; 379 type Preadjoint<'a> = ColOp<S::Preadjoint<'a>, T::Preadjoint<'a>> where Self : 'a;
380 380
413 Yʹ : Space, 413 Yʹ : Space,
414 R : Space + ClosedAdd, 414 R : Space + ClosedAdd,
415 S : Preadjointable<A, Xʹ, PreadjointCodomain = R>, 415 S : Preadjointable<A, Xʹ, PreadjointCodomain = R>,
416 T : Preadjointable<A, Yʹ, PreadjointCodomain = R>, 416 T : Preadjointable<A, Yʹ, PreadjointCodomain = R>,
417 Self : Linear<A>, 417 Self : Linear<A>,
418 for<'a> RowOp<S::Preadjoint<'a>, T::Preadjoint<'a>> : Adjointable< 418 for<'a> RowOp<S::Preadjoint<'a>, T::Preadjoint<'a>> : Linear<
419 Pair<Xʹ,Yʹ>, A, 419 Pair<Xʹ,Yʹ>, Codomain = R,
420 Codomain = R,
421 AdjointCodomain = Self::Codomain,
422 >, 420 >,
423 { 421 {
424 type PreadjointCodomain = R; 422 type PreadjointCodomain = R;
425 type Preadjoint<'a> = RowOp<S::Preadjoint<'a>, T::Preadjoint<'a>> where Self : 'a; 423 type Preadjoint<'a> = RowOp<S::Preadjoint<'a>, T::Preadjoint<'a>> where Self : 'a;
426 424
516 Yʹ : Space, 514 Yʹ : Space,
517 R : Space, 515 R : Space,
518 S : Preadjointable<A, Xʹ>, 516 S : Preadjointable<A, Xʹ>,
519 T : Preadjointable<B, Yʹ>, 517 T : Preadjointable<B, Yʹ>,
520 Self : Linear<Pair<A, B>>, 518 Self : Linear<Pair<A, B>>,
521 for<'a> DiagOp<S::Preadjoint<'a>, T::Preadjoint<'a>> : Adjointable< 519 for<'a> DiagOp<S::Preadjoint<'a>, T::Preadjoint<'a>> : Linear<
522 Pair<Xʹ,Yʹ>, Pair<A, B>, 520 Pair<Xʹ,Yʹ>, Codomain=R,
523 Codomain=R,
524 AdjointCodomain = Self::Codomain,
525 >, 521 >,
526 { 522 {
527 type PreadjointCodomain = R; 523 type PreadjointCodomain = R;
528 type Preadjoint<'a> = DiagOp<S::Preadjoint<'a>, T::Preadjoint<'a>> where Self : 'a; 524 type Preadjoint<'a> = DiagOp<S::Preadjoint<'a>, T::Preadjoint<'a>> where Self : 'a;
529 525

mercurial