@@ -48,6 +48,9 @@ class ADOutlierHBOSTest: public ADOutlierHBOS{
4848 ( (HbosParam*)m_param )->copy (p);
4949 }
5050
51+ HbosParam & get_local_parameters () const { return *((HbosParam*)m_local_param); }
52+
53+ void test_updateGlobalModel (){ this ->updateGlobalModel (); }
5154};
5255
5356class ADOutlierCOPODTest : public ADOutlierCOPOD {
@@ -107,6 +110,67 @@ TEST(ADOutlierHBOSTestSyncParamWithoutPS, Works){
107110 EXPECT_EQ (local_params_ps.get_hbosstats (), g->get_hbosstats ());
108111}
109112
113+
114+
115+
116+ TEST (ADOutlierHBOSTestSyncParamFrequencyWithoutPS, Works){
117+ HbosParam local_params_ps;
118+
119+ std::default_random_engine gen;
120+ std::normal_distribution<double > dist (500 .,100 .), dist2 (1000 .,200 .);
121+
122+ int N = 50 ;
123+
124+ ADOutlierHBOSTest outlier;
125+ outlier.setGlobalModelSyncFrequency (3 );
126+
127+ HbosParam &local_params = outlier.get_local_parameters ();
128+ HbosParam l, l2, g;
129+ {
130+ Histogram &h = l[0 ].getHistogram ();
131+ std::vector<double > runtime (N);
132+ for (int i=0 ;i<N;i++) runtime[i] = dist (gen);
133+ h.create_histogram (runtime);
134+ }
135+
136+ const HbosParam & global_params = *( (HbosParam const *)outlier.get_global_parameters () );
137+
138+ // On first update we expect the global model to be set to be the same as the local model, then the local model flushed
139+ local_params.assign (l);
140+ g.assign (l);
141+ outlier.test_updateGlobalModel ();
142+
143+ EXPECT_EQ (g, global_params);
144+ EXPECT_EQ (local_params.size (), 0 );
145+
146+ // Second update should maintain the state of the local model
147+ local_params.assign (l);
148+ outlier.test_updateGlobalModel ();
149+
150+ EXPECT_EQ (g, global_params);
151+ EXPECT_EQ (local_params.size (), 1 );
152+ EXPECT_EQ (l, local_params);
153+
154+ // Third update we update the state of the local model as if we were adding new data, but the global model will again remain fixed
155+ local_params.update (l);
156+ l2.assign (l);
157+ l2.update (l);
158+ outlier.test_updateGlobalModel ();
159+
160+ EXPECT_EQ (g, global_params);
161+ EXPECT_EQ (local_params.size (), 1 );
162+ EXPECT_EQ (l2, local_params);
163+
164+ // Fourth update should update the global model and flush the local
165+ local_params.update (l);
166+ l2.update (l);
167+ g.update (l2);
168+ outlier.test_updateGlobalModel ();
169+
170+ EXPECT_EQ (g, global_params);
171+ EXPECT_EQ (local_params.size (), 0 );
172+ }
173+
110174TEST (ADOutlierSSTDTestSyncParamWithoutPS, Works){
111175 SstdParam local_params_ps;
112176
0 commit comments