11use crate :: data:: TimeSeries ;
22use crate :: float_trait:: Float ;
33use crate :: multicolor:: PassbandTrait ;
4- use crate :: PassbandSet ;
4+ use crate :: { DataSample , PassbandSet } ;
55
66use itertools:: Either ;
77use itertools:: EitherOrBoth ;
88use itertools:: Itertools ;
99use std:: collections:: BTreeMap ;
10- use std:: ops:: { Deref , DerefMut } ;
1110
12- pub struct MultiColorTimeSeries < ' a , P : PassbandTrait , T : Float > ( BTreeMap < P , TimeSeries < ' a , T > > ) ;
11+ pub struct MultiColorTimeSeries < ' a , P : PassbandTrait , T : Float > {
12+ mapping : BTreeMap < P , TimeSeries < ' a , T > > ,
13+ flat : Option < FlatMultiColorTimeSeries < ' static , P , T > > ,
14+ }
1315
1416impl < ' a , ' p , P , T > MultiColorTimeSeries < ' a , P , T >
1517where
1618 P : PassbandTrait + ' p ,
1719 T : Float ,
1820{
1921 pub fn new ( map : impl Into < BTreeMap < P , TimeSeries < ' a , T > > > ) -> Self {
20- Self ( map. into ( ) )
22+ Self {
23+ mapping : map. into ( ) ,
24+ flat : None ,
25+ }
26+ }
27+
28+ pub fn flatten ( & mut self ) -> & FlatMultiColorTimeSeries < ' static , P , T > {
29+ self . flat
30+ . get_or_insert_with ( || FlatMultiColorTimeSeries :: from_mapping ( & mut self . mapping ) )
31+ }
32+
33+ pub fn passbands < ' slf > (
34+ & ' slf self ,
35+ ) -> std:: collections:: btree_map:: Keys < ' slf , P , TimeSeries < ' a , T > >
36+ where
37+ ' a : ' slf ,
38+ {
39+ self . mapping . keys ( )
2140 }
2241
2342 pub fn iter_passband_set < ' slf , ' ps > (
2443 & ' slf self ,
2544 passband_set : & ' ps PassbandSet < P > ,
26- ) -> impl Iterator < Item = ( & P , Option < & TimeSeries < ' a , T > > ) > + ' ps
45+ ) -> impl Iterator < Item = ( & P , Option < & TimeSeries < ' a , T > > ) > + ' slf
2746 where
28- ' a : ' ps ,
29- ' slf : ' ps ,
30- ' ps : ' slf ,
47+ ' a : ' slf ,
48+ ' ps : ' a ,
3149 {
3250 match passband_set {
33- PassbandSet :: AllAvailable => Either :: Left ( self . 0 . iter ( ) . map ( |( p, ts) | ( p, Some ( ts) ) ) ) ,
51+ PassbandSet :: AllAvailable => {
52+ Either :: Left ( self . mapping . iter ( ) . map ( |( p, ts) | ( p, Some ( ts) ) ) )
53+ }
3454 PassbandSet :: FixedSet ( set) => Either :: Right ( self . iter_matched_passbands ( set. iter ( ) ) ) ,
3555 }
3656 }
3757
3858 pub fn iter_passband_set_mut < ' slf , ' ps > (
3959 & ' slf mut self ,
4060 passband_set : & ' ps PassbandSet < P > ,
41- ) -> impl Iterator < Item = ( & P , Option < & mut TimeSeries < ' a , T > > ) > + ' ps
61+ ) -> impl Iterator < Item = ( & P , Option < & mut TimeSeries < ' a , T > > ) > + ' slf
4262 where
43- ' a : ' ps ,
44- ' slf : ' ps ,
45- ' ps : ' slf ,
63+ ' a : ' slf ,
64+ ' ps : ' a ,
4665 {
4766 match passband_set {
4867 PassbandSet :: AllAvailable => {
49- Either :: Left ( self . 0 . iter_mut ( ) . map ( |( p, ts) | ( p, Some ( ts) ) ) )
68+ Either :: Left ( self . mapping . iter_mut ( ) . map ( |( p, ts) | ( p, Some ( ts) ) ) )
5069 }
5170 PassbandSet :: FixedSet ( set) => {
5271 Either :: Right ( self . iter_matched_passbands_mut ( set. iter ( ) ) )
@@ -58,15 +77,15 @@ where
5877 & self ,
5978 passband_it : impl Iterator < Item = & ' p P > ,
6079 ) -> impl Iterator < Item = ( & ' p P , Option < & TimeSeries < ' a , T > > ) > {
61- passband_it. map ( |p| ( p, self . 0 . get ( p) ) )
80+ passband_it. map ( |p| ( p, self . mapping . get ( p) ) )
6281 }
6382
6483 pub fn iter_matched_passbands_mut (
6584 & mut self ,
6685 passband_it : impl Iterator < Item = & ' p P > ,
6786 ) -> impl Iterator < Item = ( & ' p P , Option < & mut TimeSeries < ' a , T > > ) > {
6887 passband_it
69- . merge_join_by ( self . 0 . iter_mut ( ) , |p1, ( p2, _ts) | p1. cmp ( p2) )
88+ . merge_join_by ( self . mapping . iter_mut ( ) , |p1, ( p2, _ts) | p1. cmp ( p2) )
7089 . filter_map ( |either_or_both| match either_or_both {
7190 // mcts misses required passband
7291 EitherOrBoth :: Left ( p) => Some ( ( p, None ) ) ,
@@ -78,24 +97,48 @@ where
7897 }
7998}
8099
81- impl < ' a , P : PassbandTrait , T : Float > Deref for MultiColorTimeSeries < ' a , P , T > {
82- type Target = BTreeMap < P , TimeSeries < ' a , T > > ;
83-
84- fn deref ( & self ) -> & Self :: Target {
85- & self . 0
100+ impl < ' a , P : PassbandTrait , T : Float > FromIterator < ( P , TimeSeries < ' a , T > ) >
101+ for MultiColorTimeSeries < ' a , P , T >
102+ {
103+ fn from_iter < I : IntoIterator < Item = ( P , TimeSeries < ' a , T > ) > > ( iter : I ) -> Self {
104+ Self {
105+ mapping : iter. into_iter ( ) . collect ( ) ,
106+ flat : None ,
107+ }
86108 }
87109}
88110
89- impl < ' a , P : PassbandTrait , T : Float > DerefMut for MultiColorTimeSeries < ' a , P , T > {
90- fn deref_mut ( & mut self ) -> & mut Self :: Target {
91- & mut self . 0
92- }
111+ pub struct FlatMultiColorTimeSeries < ' a , P : PassbandTrait , T : Float > {
112+ pub t : DataSample < ' a , T > ,
113+ pub m : DataSample < ' a , T > ,
114+ pub w : DataSample < ' a , T > ,
115+ pub passbands : Vec < P > ,
93116}
94117
95- impl < ' a , P : PassbandTrait , T : Float > FromIterator < ( P , TimeSeries < ' a , T > ) >
96- for MultiColorTimeSeries < ' a , P , T >
118+ impl < P , T > FlatMultiColorTimeSeries < ' static , P , T >
119+ where
120+ P : PassbandTrait ,
121+ T : Float ,
97122{
98- fn from_iter < I : IntoIterator < Item = ( P , TimeSeries < ' a , T > ) > > ( iter : I ) -> Self {
99- Self ( iter. into_iter ( ) . collect ( ) )
123+ pub fn from_mapping ( mapping : & mut BTreeMap < P , TimeSeries < T > > ) -> Self {
124+ let ( t, m, w, passbands) : ( Vec < _ > , Vec < _ > , Vec < _ > , _ ) = mapping
125+ . iter_mut ( )
126+ . map ( |( p, ts) | {
127+ itertools:: multizip ( (
128+ ts. t . as_slice ( ) . iter ( ) . copied ( ) ,
129+ ts. m . as_slice ( ) . iter ( ) . copied ( ) ,
130+ ts. w . as_slice ( ) . iter ( ) . copied ( ) ,
131+ std:: iter:: repeat ( p. clone ( ) ) ,
132+ ) )
133+ } )
134+ . kmerge_by ( |( t1, _, _, _) , ( t2, _, _, _) | t1 <= t2)
135+ . multiunzip ( ) ;
136+
137+ Self {
138+ t : t. into ( ) ,
139+ m : m. into ( ) ,
140+ w : w. into ( ) ,
141+ passbands,
142+ }
100143 }
101144}
0 commit comments