Skip to content

Commit 92ecf0f

Browse files
committed
Fix Compound and Convolution (TODO: run tests)
1 parent 363a666 commit 92ecf0f

File tree

8 files changed

+226
-76
lines changed

8 files changed

+226
-76
lines changed

TODO

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
TODO list for `StructureAnalysis` to be updated / completed. We target a next official release of the package that must integrate with openalea CI/CD workflow and work on all plateforms.
22

33
[ ] Repare `stat_tool` and `sequence_analysis` tests
4+
+ Add vector of parameter types in DiscreteParametric
45
+ Add copy constructor DiscreteParametric::ptr_copy(distribution_transformation)?
56
+ create a new branch for each new development (do not systematically use new_python_api)
67
+ update tests to be compliant with python 3

stat_tool/src/cpp/compound.cpp

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -119,25 +119,18 @@ Compound::Compound(const DiscreteParametric &sum_dist , const DiscreteParametric
119119

120120
switch (type) {
121121

122-
case SUM : {
123-
sum_distribution = new DiscreteParametric(sum_dist , DISTRIBUTION_COPY ,
124-
(int)(sum_dist.nb_value * NB_VALUE_COEFF));
125-
if ((dist.ident == POISSON) || (dist.ident == NEGATIVE_BINOMIAL)) {
126-
distribution = new DiscreteParametric(dist.ident , dist.inf_bound , dist.sup_bound ,
127-
dist.parameter , dist.probability , COMPOUND_THRESHOLD);
128-
}
129-
else {
130-
distribution = new DiscreteParametric(dist , NORMALIZATION);
131-
}
132-
break;
133-
}
134-
135-
case ELEMENTARY : {
136-
sum_distribution = new DiscreteParametric(sum_dist , NORMALIZATION);
137-
distribution = new DiscreteParametric(dist , DISTRIBUTION_COPY ,
138-
(int)(dist.nb_value * NB_VALUE_COEFF));
139-
break;
140-
}
122+
case SUM : {
123+
sum_distribution = sum_dist.ptr_copy();
124+
distribution = dist.ptr_copy();
125+
distribution->computation(dist.offset, COMPOUND_THRESHOLD);
126+
break;
127+
}
128+
129+
case ELEMENTARY : {
130+
sum_distribution = sum_dist.ptr_copy(NORMALIZATION);
131+
distribution = dist.ptr_copy();
132+
break;
133+
}
141134
}
142135

143136
Distribution::init((sum_distribution->alloc_nb_value - 1) * (distribution->alloc_nb_value - 1) + 1);
@@ -163,8 +156,8 @@ void Compound::copy(const Compound &compound , bool data_flag)
163156
compound_data = NULL;
164157
}
165158

166-
sum_distribution = new DiscreteParametric(*(compound.sum_distribution));
167-
distribution = new DiscreteParametric(*(compound.distribution));
159+
sum_distribution = compound.sum_distribution->ptr_copy();
160+
distribution = compound.distribution->ptr_copy();
168161
}
169162

170163

stat_tool/src/cpp/compound_algorithms.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void Compound::computation(int min_nb_value , double cumul_threshold ,
6565
{
6666
int i , j;
6767
DiscreteParametric *power_dist;
68-
std::vector<boost::variant<int, float> > parameter;
68+
std::vector<boost::variant<int, double> > parameter;
6969

7070

7171
// computation of the sum distribution and the basis distribution
@@ -82,7 +82,7 @@ void Compound::computation(int min_nb_value , double cumul_threshold ,
8282

8383
parameter.resize((sum_distribution->nb_value - 1) * (distribution->nb_value - 1) + 1);
8484
for (i = 0;i < parameter.size();i++){
85-
parameter[i] = boost::variant<float>(1./ parameter.size());
85+
parameter[i] = boost::variant<double>(1./ parameter.size());
8686
}
8787

8888
power_dist = new Categorical(0, (sum_distribution->nb_value - 1) * (distribution->nb_value - 1) + 1, parameter);
@@ -432,7 +432,7 @@ Compound* FrequencyDistribution::compound_estimation(StatError &error , ostream
432432
Reestimation<double> *sum_reestim , *reestim;
433433
Compound *compound;
434434
CompoundData *compound_histo;
435-
std::vector<boost::variant<int, float> > parameter;
435+
std::vector<boost::variant<int, double> > parameter;
436436

437437

438438
compound = NULL;
@@ -505,7 +505,7 @@ Compound* FrequencyDistribution::compound_estimation(StatError &error , ostream
505505
for (i = MAX(sum_dist.offset - 1 , 1);i < sum_nb_value;i++) {
506506
parameter.resize(i * (compound->distribution->alloc_nb_value - 1) + 1);
507507
for (j = 0;j < parameter.size();j++)
508-
parameter[j] = 1./ parameter.size();
508+
parameter[j] = boost::variant<double>(1./ parameter.size());
509509

510510
power_dist[i] = new Categorical(0, i * (compound->distribution->alloc_nb_value - 1) + 1 ,
511511
parameter);
@@ -805,7 +805,7 @@ Compound* FrequencyDistribution::compound_estimation(StatError &error , ostream
805805
double proba;
806806
DiscreteParametric *unknown_dist;
807807
Compound *compound;
808-
std::vector<boost::variant<int, float> > parameter;
808+
std::vector<boost::variant<int, double> > parameter;
809809

810810
error.init();
811811

@@ -826,14 +826,14 @@ Compound* FrequencyDistribution::compound_estimation(StatError &error , ostream
826826
switch (type) {
827827
case SUM :
828828
parameter.resize(2);
829-
parameter[0] = 1.;
830-
parameter[1] = proba;
829+
parameter[0] = boost::variant<double>(1.);
830+
parameter[1] = boost::variant<double>(proba);
831831
unknown_dist = new NegativeBinomial(min_inf_bound , I_DEFAULT , parameter);
832832
break;
833833
case ELEMENTARY :
834834
parameter.resize(2);
835-
parameter[0] = 1.;
836-
parameter[1] = proba;
835+
parameter[0] = boost::variant<double>(1.);
836+
parameter[1] = boost::variant<double>(proba);
837837
unknown_dist = new NegativeBinomial(min_inf_bound , I_DEFAULT , parameter);
838838
break;
839839
}

stat_tool/src/cpp/convolution.cpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ Convolution::Convolution(int nb_dist , const DiscreteParametric **pdist)
9494

9595
distribution = new DiscreteParametric*[nb_distribution];
9696
for (i = 0;i < nb_distribution;i++) {
97-
distribution[i] = new DiscreteParametric(*pdist[i] , NORMALIZATION);
97+
distribution[i] = pdist[i]->ptr_copy(NORMALIZATION);
9898
cnb_value += distribution[i]->nb_value - 1;
9999
}
100100

@@ -124,7 +124,7 @@ Convolution::Convolution(int nb_dist , const vector<DiscreteParametric> &idist)
124124

125125
distribution = new DiscreteParametric*[nb_distribution];
126126
for (i = 0;i < nb_distribution;i++) {
127-
distribution[i] = new DiscreteParametric(idist[i] , NORMALIZATION);
127+
distribution[i] = idist[i]->ptr_copy(NORMALIZATION);
128128
cnb_value += distribution[i]->nb_value - 1;
129129
}
130130

@@ -147,22 +147,27 @@ Convolution::Convolution(const DiscreteParametric &known_dist ,
147147

148148
{
149149
convolution_data = NULL;
150+
std::vector<boost::variant<int, double> > parameter;
150151

151152
nb_distribution = 2;
152153
distribution = new DiscreteParametric*[nb_distribution];
153154

154-
if ((known_dist.ident == POISSON) || (known_dist.ident == NEGATIVE_BINOMIAL)) {
155-
distribution[0] = new DiscreteParametric(known_dist.ident , known_dist.inf_bound ,
156-
known_dist.sup_bound , known_dist.parameter ,
157-
known_dist.probability , CONVOLUTION_THRESHOLD);
158-
}
159-
else {
160-
distribution[0] = new DiscreteParametric(known_dist , NORMALIZATION);
155+
// distribution[0] = known_dist->ptr_copy();
156+
// distribution[0]->computation(known_dist.inf_bound, CONVOLUTION_THRESHOLD);
157+
158+
distribution[1] = unknown_dist>ptr_copy();
159+
160+
161+
parameter.resize(known_dist->alloc_nb_value + unknown_dist->alloc_nb_value - 1);
162+
163+
for (i = 0;i < parameter.size();i++){
164+
parameter[i] = boost::variant<double>(1./ parameter.size());
161165
}
162-
distribution[1] = new DiscreteParametric(unknown_dist , DISTRIBUTION_COPY ,
163-
(int)(unknown_dist.nb_value * NB_VALUE_COEFF));
164166

165-
Distribution::init(distribution[0]->alloc_nb_value + distribution[1]->alloc_nb_value - 1);
167+
distribution[0] = new Categorical(0, parameter.size()+1, parameter);
168+
169+
170+
Distribution::init();
166171
}
167172

168173

@@ -192,7 +197,7 @@ void Convolution::copy(const Convolution &convol , bool data_flag)
192197

193198
distribution = new DiscreteParametric*[nb_distribution];
194199
for (i = 0;i < nb_distribution;i++) {
195-
distribution[i] = new DiscreteParametric(*(convol.distribution[i]));
200+
distribution[i] = convol.distribution[i]->ptr_copy();
196201
}
197202
}
198203

@@ -282,8 +287,7 @@ DiscreteParametricModel* Convolution::extract(StatError &error , int index) cons
282287

283288
else {
284289
index--;
285-
pdist = new DiscreteParametricModel(*distribution[index] ,
286-
(convolution_data ? convolution_data->frequency_distribution[index] : NULL));
290+
pdist = distribution[index]->ptr_copy();
287291
}
288292

289293
return pdist;

stat_tool/src/cpp/discrete_mixture_algorithms.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ void DiscreteMixture::computation(int min_nb_value , double cumul_threshold , bo
141141

142142
// computation of the weight distribution
143143

144-
if (weight->ident != CATEGORICAL) {
145-
weight->computation(1 , cumul_threshold);
146-
}
144+
assert (weight->name == "Categorical");
145+
weight->computation(1 , cumul_threshold);
146+
147147

148148
// computation of the components
149149

@@ -216,7 +216,7 @@ void DiscreteMixture::init(const FrequencyDistribution &histo , bool *estimate ,
216216
for (i = 0;i < nb_component;i++) {
217217

218218
if (estimate[i]) {
219-
if ((i > 0) && (component_flag) && (component[i]->ident != BINOMIAL)) {
219+
if ((i > 0) && (component_flag)) {
220220
component[i]->inf_bound = j;
221221
}
222222
else {
@@ -242,7 +242,8 @@ void DiscreteMixture::init(const FrequencyDistribution &histo , bool *estimate ,
242242
}
243243

244244
if (estimate[i]) {
245-
switch (component[i]->ident) {
245+
component[i]->em_initialize(histo, shift_mean);
246+
/* switch (component[i]->ident) {
246247
247248
case BINOMIAL : {
248249
component[i]->sup_bound = histo.nb_value - 1;
@@ -260,7 +261,7 @@ void DiscreteMixture::init(const FrequencyDistribution &histo , bool *estimate ,
260261
component[i]->probability = 1. / ((histo.nb_value)+1+shift_mean);
261262
break;
262263
}
263-
}
264+
}*/
264265
}
265266
}
266267

0 commit comments

Comments
 (0)