28 /// |
29 /// |
29 /// The `generator` lists the component functions that have to implement [`Support`]. |
30 /// The `generator` lists the component functions that have to implement [`Support`]. |
30 /// Identifiers of the components ([`SupportGenerator::Id`], usually `usize`) are stored stored |
31 /// Identifiers of the components ([`SupportGenerator::Id`], usually `usize`) are stored stored |
31 /// in a [bisection tree][BTImpl], when one is provided as `bt`. However `bt` may also be `()` |
32 /// in a [bisection tree][BTImpl], when one is provided as `bt`. However `bt` may also be `()` |
32 /// for a [`PreBTFN`] that is only useful for vector space operations with a full [`BTFN`]. |
33 /// for a [`PreBTFN`] that is only useful for vector space operations with a full [`BTFN`]. |
33 #[derive(Clone,Debug)] |
34 #[derive(Clone,Debug,Serialize,Deserialize)] |
34 pub struct BTFN< |
35 pub struct BTFN< |
35 F : Float, |
36 F : Float, |
36 G : SupportGenerator<F, N>, |
37 G : SupportGenerator<F, N>, |
37 BT /*: BTImpl<F, N>*/, |
38 BT /*: BTImpl<F, N>*/, |
38 const N : usize |
39 const N : usize |
39 > /*where G::SupportType : LocalAnalysis<F, A, N>*/ { |
40 > /*where G::SupportType : LocalAnalysis<F, A, N>*/ { |
40 bt : BT, |
41 bt : BT, |
41 generator : Arc<G>, |
42 generator : Arc<G>, |
|
43 #[serde(skip)] |
42 _phantoms : PhantomData<F>, |
44 _phantoms : PhantomData<F>, |
43 } |
45 } |
44 |
46 |
45 impl<F : Float, G, BT, const N : usize> |
47 impl<F : Float, G, BT, const N : usize> |
46 Space for BTFN<F, G, BT, N> |
48 Space for BTFN<F, G, BT, N> |
585 } |
587 } |
586 } |
588 } |
587 } |
589 } |
588 |
590 |
589 /// Helper type to use [`P2Refiner`] for maximisation. |
591 /// Helper type to use [`P2Refiner`] for maximisation. |
|
592 #[derive(Debug, Clone, Serialize, Deserialize)] |
590 struct RefineMax; |
593 struct RefineMax; |
591 |
594 |
592 /// Helper type to use [`P2Refiner`] for minimisation. |
595 /// Helper type to use [`P2Refiner`] for minimisation. |
|
596 #[derive(Debug, Clone, Serialize, Deserialize)] |
593 struct RefineMin; |
597 struct RefineMin; |
594 |
598 |
595 /// A bisection tree [`Refiner`] for maximising or minimising a [`BTFN`]. |
599 /// A bisection tree [`Refiner`] for maximising or minimising a [`BTFN`]. |
596 /// |
600 /// |
597 /// The type parameter `T` should be either [`RefineMax`] or [`RefineMin`]. |
601 /// The type parameter `T` should be either [`RefineMax`] or [`RefineMin`]. |
|
602 #[derive(Debug, Clone, Serialize, Deserialize)] |
598 struct P2Refiner<F : Float, T> { |
603 struct P2Refiner<F : Float, T> { |
599 /// The maximum / minimum should be above / below this threshold. |
604 /// The maximum / minimum should be above / below this threshold. |
600 /// If the threshold cannot be satisfied, the refiner will return `None`. |
605 /// If the threshold cannot be satisfied, the refiner will return `None`. |
601 bound : Option<F>, |
606 bound : Option<F>, |
602 /// Tolerance for function value estimation. |
607 /// Tolerance for function value estimation. |
731 //// upper or lower bound. |
736 //// upper or lower bound. |
732 /// |
737 /// |
733 /// The type parameter `T` should be either [`RefineMax`] for upper bound or [`RefineMin`] |
738 /// The type parameter `T` should be either [`RefineMax`] for upper bound or [`RefineMin`] |
734 /// for lower bound. |
739 /// for lower bound. |
735 |
740 |
|
741 #[derive(Debug, Clone, Serialize, Deserialize)] |
736 struct BoundRefiner<F : Float, T> { |
742 struct BoundRefiner<F : Float, T> { |
737 /// The upper/lower bound to check for |
743 /// The upper/lower bound to check for |
738 bound : F, |
744 bound : F, |
739 /// Tolerance for function value estimation. |
745 /// Tolerance for function value estimation. |
740 tolerance : F, |
746 tolerance : F, |