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 |