128 double *
obj,
double *rhs,
double *lbound,
double *ubound,
130 double *diag,
double *odiag,
134 double *dxs,
double *dxsn,
double *
up,
138 double *ddspr,
double *ddsprn,
double *dsup,
double *ddsup,
143 double *ddv,
double *ddvn,
double *prinf,
145 double *upinf,
double *duinf,
double *
scale,
155 int *ecolpnt,
int *
count,
int *vcstat,
int *pivots,
156 int *invprm,
int *snhead,
int *nodtyp,
int *inta1,
166 int *
iter,
int *corect,
int *fixn,
int *dropn,
int *fnzmax,
167 int *fnzmin,
double *addobj,
double *bigbou,
180 static const int minimize = 1;
181 static const int maximize = -1;
182 static const char less_equal =
'L';
183 static const char equal =
'E';
184 static const char greater_equal =
'G';
185 static const char range =
'R';
188 bool _variable_named;
190 std::vector<double> _rhs;
191 std::vector<char> _constraint_sense;
192 std::vector<double> _range_value;
193 std::vector<char *> _row_name;
195 std::vector<double> _objective;
196 std::vector<double> _lower_bound;
197 std::vector<double> _upper_bound;
198 std::vector<char *> _column_name;
200 std::vector<int> _coefficient_row;
201 std::vector<int> _coefficient_column;
202 std::vector<double> _coefficient_value;
207 _constraint_sense.clear();
208 for (std::vector<char *>::const_iterator iterator =
210 iterator != _row_name.end(); iterator++) {
215 void clear_column(
void)
218 _lower_bound.clear();
219 _upper_bound.clear();
220 for (std::vector<char *>::const_iterator iterator =
221 _column_name.begin();
222 iterator != _column_name.end(); iterator++) {
225 _column_name.clear();
227 void clear_coefficient(
void)
229 _coefficient_row.clear();
230 _coefficient_column.clear();
231 _coefficient_value.clear();
233 void to_csr(std::vector<int> &column_pointer,
234 std::vector<int> &row_index,
235 std::vector<double> &nonzero_value,
236 const int index_start = 1)
241 std::vector<std::vector<std::pair<int, double> > >
242 column_index(_objective.size(),
243 std::vector<std::pair<int, double> >());
245 std::vector<int>::const_iterator iterator_row =
246 _coefficient_row.begin();
247 std::vector<int>::const_iterator iterator_column =
248 _coefficient_column.begin();
249 std::vector<double>::const_iterator iterator_value =
250 _coefficient_value.begin();
252 for (; iterator_value != _coefficient_value.end();
253 iterator_row++, iterator_column++, iterator_value++) {
254 column_index[*iterator_column].push_back(
255 std::pair<int, double>(
257 *iterator_row + index_start, *iterator_value));
260 for (std::vector<std::vector<std::pair<int, double> > >::
261 iterator iterator_outer = column_index.begin();
262 iterator_outer != column_index.end(); iterator_outer++) {
264 column_pointer.push_back(row_index.size() + index_start);
265 std::sort(iterator_outer->begin(), iterator_outer->end());
266 for (std::vector<std::pair<int, double> >::const_iterator
267 iterator_inner = iterator_outer->begin();
268 iterator_inner != iterator_outer->end();
270 row_index.push_back(iterator_inner->first);
271 nonzero_value.push_back(iterator_inner->second);
275 column_pointer.push_back(row_index.size() + index_start);
278 problem_t(
const bool variable_named)
279 : _optimized(
false), _variable_named(variable_named)
292 virtual int populate(
void) = 0;
293 size_t nrow(
void)
const
297 size_t ncolumn(
void)
const
299 return _objective.size();
301 void push_back_row(
const char constraint_sense,
305 _constraint_sense.push_back(constraint_sense);
307 if (_variable_named) {
311 snprintf(name, name_length,
"c%llu",
312 static_cast<unsigned long long>(_rhs.size()));
313 _row_name.push_back(name);
316 void push_back_row(
const std::string &constraint_sense,
321 if (constraint_sense ==
"<=") {
323 push_back_row(rhs, cplex_sense);
325 else if (constraint_sense ==
"==") {
327 push_back_row(rhs, cplex_sense);
329 else if (constraint_sense ==
">=") {
331 push_back_row(rhs, cplex_sense);
334 fprintf(stderr,
"%s:%d: illegal sense (`%s')\n",
335 __FILE__, __LINE__, constraint_sense.c_str());
338 void push_back_column(
const double objective,
339 const double lower_bound,
340 const double upper_bound)
342 _objective.push_back(objective);
343 _lower_bound.push_back(lower_bound);
344 _upper_bound.push_back(upper_bound);
346 if (_variable_named) {
347 static const size_t name_length = 24;
350 snprintf(name, name_length,
"x%llu",
351 static_cast<unsigned long long>(
353 _column_name.push_back(name);
356 void push_back_coefficient(
357 const int row,
const int column,
const double value)
359 _coefficient_row.push_back(row);
360 _coefficient_column.push_back(column);
361 _coefficient_value.push_back(value);
363 virtual int optimize(
void) = 0;
364 int optimize_primal_simplex(
void)
368 int optimize_dual_simplex(
void)
372 int optimize_barrier(
void)
376 int optimize_network(
void)
380 int optimize_sifting(
void)
384 int optimize_concurrent(
void)
388 int optimize_deterministic_concurrent(
void)
394 int &solution_status,
double &objective_value,
395 std::vector<double> &variable_primal,
396 std::vector<double> &variable_dual,
397 std::vector<double> &variable_slack_surplus,
398 std::vector<double> &reduced_cost) = 0;
400 double &objective_value,
401 std::vector<double> &variable_primal,
402 std::vector<double> &variable_dual,
403 std::vector<double> &variable_slack_surplus,
404 std::vector<double> &reduced_cost)
408 return solve(solution_status, objective_value,
409 variable_primal, variable_dual,
410 variable_slack_surplus, reduced_cost);
413 std::vector<double> &variable_primal,
414 std::vector<double> &variable_dual,
415 std::vector<double> &variable_slack_surplus,
416 std::vector<double> &reduced_cost)
419 double objective_value;
421 return solve(solution_status, objective_value,
422 variable_primal, variable_dual,
423 variable_slack_surplus, reduced_cost);
426 int &solution_status,
double &objective_value,
427 std::vector<double> &variable_primal,
428 std::vector<double> &variable_dual)
430 std::vector<double> variable_slack_surplus;
431 std::vector<double> reduced_cost;
433 return solve(solution_status, objective_value,
434 variable_primal, variable_dual,
435 variable_slack_surplus, reduced_cost);
438 std::vector<double> &variable_primal,
439 std::vector<double> &variable_dual)
442 double objective_value;
444 return solve(solution_status, objective_value, variable_primal,
448 std::vector<double> &variable_primal)
450 std::vector<double> variable_dual;
452 return solve(variable_primal, variable_dual);
456 class environment_t {
458 std::vector<problem_t *> _problem;
461 #ifndef BPMPD_INFINITY_BOUND
462 #define BPMPD_INFINITY_BOUND 1e+30
463 #endif // BPMPD_INFINITY_BOUND
465 #ifndef BPMPD_VERSION_STRING
466 #define BPMPD_VERSION_STRING "Version 2.11 (1996 December)"
467 #endif // BPMPD_VERSION_STRING
469 class bpmpd_environment_t;
471 class bpmpd_problem_t :
public problem_t {
475 double _objective_sense;
476 double _objective_value;
477 std::vector<double> _variable_primal;
478 std::vector<double> _variable_dual;
479 int _solution_status;
481 int ampl_solution_status(
const int termination_code)
483 switch (termination_code) {
497 fprintf(stderr,
"%s:%d: error: unknown termination code "
498 "%d\n", __FILE__, __LINE__, termination_code);
501 fprintf(stderr,
"%s:%d: %d\n", __FILE__, __LINE__,
504 void set_bpmpd_parameter(
void)
589 void append_constraint_sense_bound(
590 std::vector<double> &lower_bound_bpmpd,
591 std::vector<double> &upper_bound_bpmpd)
593 for (std::vector<char>::const_iterator iterator =
594 _constraint_sense.begin();
595 iterator != _constraint_sense.end(); iterator++) {
599 upper_bound_bpmpd.push_back(0);
602 lower_bound_bpmpd.push_back(0);
603 upper_bound_bpmpd.push_back(0);
606 lower_bound_bpmpd.push_back(0);
612 iterator - _constraint_sense.begin();
614 lower_bound_bpmpd.push_back(0);
615 upper_bound_bpmpd.push_back(_range_value[index] -
621 lower_bound_bpmpd.reserve(
dims_.
mn);
622 lower_bound_bpmpd.insert(lower_bound_bpmpd.end(),
623 _lower_bound.begin(),
625 upper_bound_bpmpd.reserve(
dims_.
mn);
626 upper_bound_bpmpd.insert(upper_bound_bpmpd.end(),
627 _upper_bound.begin(),
636 bpmpd_problem_t(
void)
637 : problem_t(
false), _objective_sense(1.0),
638 _objective_value(NAN)
641 inline size_t nrow(
void)
const
645 inline size_t ncolumn(
void)
const
649 inline void set_objective_sense(
int sense)
651 _objective_sense = sense;
660 void push_back_column(
const double objective,
661 const double lower_bound = 0,
664 problem_t::push_back_column(objective, lower_bound,
667 void set_size(
const size_t nonzero_value_size,
668 const double mf = 6.0,
const size_t ma = 0)
670 dims_.
n = _objective.size();
684 std::max(static_cast<size_t>(0), ma);
691 std::vector<int> column_pointer;
693 std::vector<int> row_index;
695 std::vector<double> nonzero_value;
697 to_csr(column_pointer, row_index, nonzero_value);
700 std::bind1st(std::multiplies<double>(),
704 for (
size_t i = 0;
i < 3;
i++) {
705 set_size(nonzero_value.size(), 6.0 * (1 <<
i));
710 set_bpmpd_parameter();
712 std::vector<double> diag(
dims_.
mn, 0);
713 std::vector<double> odiag(
dims_.
mn, 0);
714 std::vector<double> dxs(
dims_.
mn, 0);
715 std::vector<double> dxsn(
dims_.
mn, 0);
717 std::vector<double> dual_residual(
dims_.
mn, 0);
718 std::vector<double> ddspr(
dims_.
mn, 0);
719 std::vector<double> ddsprn(
dims_.
mn, 0);
720 std::vector<double> dsup(
dims_.
mn, 0);
721 std::vector<double> ddsup(
dims_.
mn, 0);
722 std::vector<double> ddsupn(
dims_.
mn, 0);
723 std::vector<double> ddv(
dims_.
m, 0);
724 std::vector<double> ddvn(
dims_.
m, 0);
725 std::vector<double> prinf(
dims_.
m, 0);
726 std::vector<double> upinf(
dims_.
mn, 0);
727 std::vector<double> duinf(
dims_.
mn, 0);
729 std::vector<int> vartyp(
dims_.
n, 0);
730 std::vector<int> slktyp(
dims_.
m, 0);
731 std::vector<int> colpnt(
dims_.
n1, 0);
732 std::vector<int> ecolpnt(
dims_.
mn, 0);
734 std::vector<int> vcstat(
dims_.
mn, 0);
735 std::vector<int> pivots(
dims_.
mn, 0);
736 std::vector<int> invprm(
dims_.
mn, 0);
737 std::vector<int> snhead(
dims_.
mn, 0);
738 std::vector<int> nodtyp(
dims_.
mn, 0);
739 std::vector<int> inta1(
dims_.
mn, 0);
740 std::vector<int> prehis(
dims_.
mn, 0);
742 int termination_code;
751 double bigbou = 1
e+15;
755 _variable_primal.resize(
dims_.
mn);
756 _variable_dual.resize(
dims_.
m);
758 std::vector<double> lower_bound_bpmpd = _lower_bound;
759 std::vector<double> upper_bound_bpmpd = _upper_bound;
761 append_constraint_sense_bound(lower_bound_bpmpd,
764 solver_(&_objective[0], &_rhs[0], &lower_bound_bpmpd[0],
765 &upper_bound_bpmpd[0], &diag[0], &odiag[0],
766 &_variable_primal[0], &dxs[0], &dxsn[0], &
up[0],
767 &dual_residual[0], &ddspr[0], &ddsprn[0],
768 &dsup[0], &ddsup[0], &ddsupn[0],
769 &_variable_dual[0], &ddv[0], &ddvn[0], &prinf[0],
770 &upinf[0], &duinf[0], &
scale[0],
771 &nonzero_value[0], &vartyp[0], &slktyp[0],
772 &column_pointer[0], &ecolpnt[0], &
count[0],
773 &vcstat[0], &pivots[0], &invprm[0], &snhead[0],
774 &nodtyp[0], &inta1[0], &prehis[0], &row_index[0],
775 &rindex[0], &termination_code, &_objective_value,
776 &iter, &correct, &fixn, &dropn, &fnzmax, &fnzmin,
777 &addobj, &bigbou, &infinity_copy, &ft);
779 _objective_value *= _objective_sense;
780 _solution_status = ampl_solution_status(termination_code);
781 if (termination_code != -2) {
787 return _solution_status == 0 ? 0 : 1;
790 int &solution_status,
double &objective_value,
791 std::vector<double> &variable_primal,
792 std::vector<double> &variable_dual,
793 std::vector<double> &variable_slack_surplus,
794 std::vector<double> &reduced_cost)
802 int &solution_status,
double &objective_value,
803 std::vector<double> &variable_primal,
804 std::vector<double> &variable_dual)
806 variable_primal = std::vector<double>(
807 _variable_primal.begin(),
808 _variable_primal.begin() + _objective.size());
809 variable_dual = _variable_dual;
813 friend class bpmpd_environment_t;
816 class bpmpd_environment_t :
public environment_t {
818 bpmpd_environment_t(
void)
821 ~bpmpd_environment_t(
void)
824 int set_verbose(
void);
825 int set_data_checking(
void);
832 return bpmpd_problem_t();
840 double angular_range_reduce(
const double x)
842 if (!std::isfinite(x)) {
846 static const double cody_waite_x_max = 1608.4954386379741381;
847 static const double two_pi_0 = 6.2831853071795649157;
848 static const double two_pi_1 = 2.1561211432631314669e-14;
849 static const double two_pi_2 = 1.1615423895917441336e-27;
852 if (x >= -cody_waite_x_max && x <= cody_waite_x_max) {
853 static const double inverse_two_pi =
854 0.15915494309189534197;
855 const double k = rint(x * inverse_two_pi);
856 ret = ((x - (k * two_pi_0)) - k * two_pi_1) -
873 static const size_t ncms_hcal_edge_pseudorapidity = 82 + 1;
874 static const double cms_hcal_edge_pseudorapidity[
875 ncms_hcal_edge_pseudorapidity] = {
876 -5.191, -4.889, -4.716, -4.538, -4.363, -4.191, -4.013,
877 -3.839, -3.664, -3.489, -3.314, -3.139, -2.964, -2.853,
878 -2.650, -2.500, -2.322, -2.172, -2.043, -1.930, -1.830,
879 -1.740, -1.653, -1.566, -1.479, -1.392, -1.305, -1.218,
880 -1.131, -1.044, -0.957, -0.879, -0.783, -0.696, -0.609,
881 -0.522, -0.435, -0.348, -0.261, -0.174, -0.087,
883 0.087, 0.174, 0.261, 0.348, 0.435, 0.522, 0.609,
884 0.696, 0.783, 0.879, 0.957, 1.044, 1.131, 1.218,
885 1.305, 1.392, 1.479, 1.566, 1.653, 1.740, 1.830,
886 1.930, 2.043, 2.172, 2.322, 2.500, 2.650, 2.853,
887 2.964, 3.139, 3.314, 3.489, 3.664, 3.839, 4.013,
888 4.191, 4.363, 4.538, 4.716, 4.889, 5.191
892 cms_hcal_edge_pseudorapidity,
893 cms_hcal_edge_pseudorapidity +
894 ncms_hcal_edge_pseudorapidity);
896 static const size_t ncms_ecal_edge_pseudorapidity = 344 + 1;
898 for (
size_t i = 0;
i < ncms_ecal_edge_pseudorapidity;
i++) {
901 (ncms_ecal_edge_pseudorapidity - 1)) -
922 for (std::vector<particle_t>::const_iterator iterator =
924 iterator !=
_event.end(); iterator++) {
925 const unsigned int reduced_id =
926 iterator->reduced_particle_flow_id;
930 if (iterator->momentum.Eta() >=
932 iterator->momentum.Eta() <
934 const double azimuth =
935 iterator->momentum.Phi();
938 (*_perp_fourier)[
k - 1][reduced_id]
940 iterator->momentum.Pt() *
942 (*_perp_fourier)[
k - 1][reduced_id]
944 iterator->momentum.Pt() *
953 const size_t nfeature = 2 *
nfourier - 1;
966 scale[0] = 1.0 / 5400.0;
969 scale[1] = 1.0 / 130.0;
972 scale[2] = 1.0 / 220.0;
975 const size_t index_edge_end =
981 ((*_perp_fourier)[0 ][
j][0][0] +
982 (*_perp_fourier)[index_edge_end][
j][0][0]);
989 ((*_perp_fourier)[0 ][
j][
k][0] +
990 (*_perp_fourier)[index_edge_end][
j][
k][0]);
995 ((*_perp_fourier)[0 ][
j][
k][1] +
996 (*_perp_fourier)[index_edge_end][
j][
k][1]);
1015 #ifdef HAVE_SPARSEHASH
1017 const voronoi_diagram_t::Face face_empty;
1018 google::dense_hash_map<voronoi_diagram_t::Face_handle,
1019 size_t, hash<voronoi_diagram_t::Face_handle> >
1022 face_index.set_empty_key(face_empty);
1023 #else // HAVE_SPARSEHASH
1024 std::map<voronoi_diagram_t::Face_handle, size_t>
1026 #endif // HAVE_SPARSEHASH
1028 for (std::vector<particle_t>::const_iterator iterator =
1030 iterator !=
_event.end(); iterator++) {
1034 for (
int k = -1;
k <= 1;
k++) {
1036 iterator->momentum.Eta(),
1037 iterator->momentum.Phi() +
1039 const voronoi_diagram_t::Face_handle
handle =
1049 for (std::vector<particle_t>::iterator iterator =
1051 iterator !=
_event.end(); iterator++) {
1052 const voronoi_diagram_t::Locate_result
result =
1053 diagram.locate(*iterator);
1054 const voronoi_diagram_t::Face_handle *face =
1055 boost::get<voronoi_diagram_t::Face_handle>(
1057 double polygon_area;
1060 voronoi_diagram_t::Ccb_halfedge_circulator
1061 circulator_start = (*face)->outer_ccb();
1062 bool unbounded =
false;
1065 voronoi_diagram_t::Ccb_halfedge_circulator
1066 circulator = circulator_start;
1071 if (circulator->has_target()) {
1073 circulator->target()->point());
1074 _event[face_index[*face]].incident.
1077 face_index[circulator->twin()->
1085 while (++circulator != circulator_start);
1087 polygon_area = INFINITY;
1090 polygon_area = polygon.area();
1096 iterator->area = fabs(polygon_area);
1101 for (std::vector<particle_t>::iterator iterator =
1103 iterator !=
_event.end(); iterator++) {
1104 int predictor_index = -1;
1105 int interpolation_index = -1;
1110 if (iterator->momentum.Eta() >=
1112 iterator->momentum.Eta() <
1114 predictor_index =
l - 1;
1123 if (iterator->momentum.Eta() >=
1125 iterator->momentum.Eta() <
1127 interpolation_index =
l - 1;
1135 if (iterator->momentum.Eta() >=
1137 iterator->momentum.Eta() <
1139 interpolation_index =
l - 1;
1144 if (predictor_index >= 0 && interpolation_index >= 0) {
1148 const double azimuth = iterator->momentum.Phi();
1149 const float (*
p)[2][82] =
1151 ue_predictor_pf[
j][predictor_index]
1154 #endif // STANDALONE
1159 for (
size_t m = 0;
m < 2;
m++) {
1160 float u =
p[
l][
m][0];
1162 for (
size_t n = 0;
n < 2 * nfourier - 1;
n++) {
1163 u += (((((((((
p[
l][
m][9 *
n + 9]) *
1165 p[
l][
m][9 *
n + 8]) *
1167 p[
l][
m][9 *
n + 7]) *
1169 p[
l][
m][9 *
n + 6]) *
1171 p[
l][
m][9 *
n + 5]) *
1173 p[
l][
m][9 *
n + 4]) *
1175 p[
l][
m][9 *
n + 3]) *
1177 p[
l][
m][9 *
n + 2]) *
1179 p[
l][
m][9 *
n + 1]) *
1183 pred += u * (
l == 0 ? 1.0 : 2.0) *
1184 (
m == 0 ?
cos(l * azimuth) :
1186 if (l == 0 &&
m == 0) {
1200 ue_interpolation_pf0[predictor_index][
1201 interpolation_index];
1205 ue_interpolation_pf1[predictor_index][
1206 interpolation_index];
1210 ue_interpolation_pf2[predictor_index][
1211 interpolation_index];
1217 interpolation_index];
1222 interpolation_index];
1227 interpolation_index];
1229 #endif // STANDALONE
1241 if (std::isfinite(iterator->area) && density >= 0) {
1244 iterator->momentum_perp_subtracted =
1245 iterator->momentum.Pt() -
1246 density * iterator->area;
1249 iterator->momentum_perp_subtracted =
1250 iterator->momentum.Pt();
1252 iterator->momentum_perp_subtracted_unequalized =
1253 iterator->momentum_perp_subtracted;
1258 boost::multi_array<double, 2> radial_distance_square(
1261 for (std::vector<particle_t>::const_iterator
1262 iterator_outer =
_event.begin();
1263 iterator_outer !=
_event.end(); iterator_outer++) {
1264 radial_distance_square
1265 [iterator_outer -
_event.begin()]
1266 [iterator_outer -
_event.begin()] = 0;
1268 for (std::vector<particle_t>::const_iterator
1269 iterator_inner =
_event.begin();
1270 iterator_inner != iterator_outer;
1272 const double deta = iterator_outer->momentum.Eta() -
1273 iterator_inner->momentum.Eta();
1274 const double dphi = angular_range_reduce(
1275 iterator_outer->momentum.Phi() -
1276 iterator_inner->momentum.Phi());
1278 radial_distance_square
1279 [iterator_outer -
_event.begin()]
1280 [iterator_inner -
_event.begin()] =
1281 deta * deta + dphi * dphi;
1282 radial_distance_square
1283 [iterator_inner -
_event.begin()]
1284 [iterator_outer -
_event.begin()] =
1285 radial_distance_square
1286 [iterator_outer -
_event.begin()]
1287 [iterator_inner -
_event.begin()];
1293 for (std::vector<particle_t>::const_iterator
1294 iterator_outer =
_event.begin();
1295 iterator_outer !=
_event.end(); iterator_outer++) {
1296 double incident_area_sum = iterator_outer->area;
1298 for (std::set<std::vector<particle_t>::iterator>::
1299 const_iterator iterator_inner =
1300 iterator_outer->incident.begin();
1302 iterator_outer->incident.end();
1304 incident_area_sum += (*iterator_inner)->area;
1306 _active.push_back(incident_area_sum < 2.0);
1311 _event.size(), std::vector<size_t>());
1313 _event.size(), std::vector<size_t>());
1319 static const size_t npair_max = 36;
1321 for (
size_t i = 0;
i <
_event.size();
i++) {
1322 for (
size_t j = 0;
j <
_event.size();
j++) {
1324 const size_t incident_count =
1329 (radial_distance_square[
i][
j] <
1331 incident_count > 0)) {
1336 if (
_event[
i].momentum_perp_subtracted < 0) {
1337 std::vector<double> radial_distance_square_list;
1339 for (std::vector<size_t>::const_iterator iterator =
1343 const size_t j = *iterator;
1345 if (
_event[j].momentum_perp_subtracted > 0) {
1346 radial_distance_square_list.push_back(
1347 radial_distance_square[
i][j]);
1351 double radial_distance_square_max_equalization_cut =
1354 if (radial_distance_square_list.size() >= npair_max) {
1355 std::sort(radial_distance_square_list.begin(),
1356 radial_distance_square_list.end());
1357 radial_distance_square_max_equalization_cut =
1358 radial_distance_square_list[npair_max - 1];
1361 for (std::vector<size_t>::const_iterator iterator =
1365 const size_t j = *iterator;
1367 if (
_event[j].momentum_perp_subtracted > 0 &&
1368 radial_distance_square[
i][j] <
1369 radial_distance_square_max_equalization_cut) {
1375 std::pair<size_t, size_t>(
i, j));
1377 radial_distance_square[
i][j] /
1386 bpmpd_problem_t *
p =
reinterpret_cast<bpmpd_problem_t *
>(lp_problem);
1407 p->set_objective_sense(bpmpd_problem_t::minimize);
1411 static const size_t nsector_azimuth = 12;
1416 static const size_t ncms_hcal_edge_pseudorapidity = 19 + 1;
1417 static const double cms_hcal_edge_pseudorapidity[
1418 ncms_hcal_edge_pseudorapidity] = {
1419 -5.191, -4.538, -4.013,
1420 -3.489, -2.853, -2.322, -1.830, -1.305, -0.783, -0.261,
1421 0.261, 0.783, 1.305, 1.830, 2.322, 2.853, 3.489,
1426 const double *edge_pseudorapidity;
1428 nedge_pseudorapidity = ncms_hcal_edge_pseudorapidity;
1429 edge_pseudorapidity = cms_hcal_edge_pseudorapidity;
1431 const size_t nsuperblock = (nedge_pseudorapidity - 2) *
1434 size_t index_row = 0;
1435 for (
size_t index_pseudorapidity = 0;
1436 index_pseudorapidity < nedge_pseudorapidity - 2;
1437 index_pseudorapidity++) {
1438 for (
size_t index_azimuth = 0;
1439 index_azimuth < nsector_azimuth - 1;
1441 const size_t index_column =
1442 index_pseudorapidity * nsector_azimuth +
1445 bpmpd_problem_t::greater_equal, 0);
1446 p->push_back_coefficient(
1447 index_row, index_column, 1);
1448 p->push_back_coefficient(
1449 index_row, nsuperblock + index_column, -1);
1452 bpmpd_problem_t::greater_equal, 0);
1453 p->push_back_coefficient(
1454 index_row, index_column, 1);
1455 p->push_back_coefficient(
1456 index_row, nsuperblock + index_column + 1, -1);
1459 bpmpd_problem_t::greater_equal, 0);
1460 p->push_back_coefficient(
1461 index_row, index_column, 1);
1462 p->push_back_coefficient(
1464 nsuperblock + index_column + nsector_azimuth, -1);
1467 bpmpd_problem_t::greater_equal, 0);
1468 p->push_back_coefficient(
1469 index_row, index_column, 1);
1470 p->push_back_coefficient(
1472 nsuperblock + index_column + nsector_azimuth + 1,
1476 const size_t index_column =
1477 index_pseudorapidity * nsector_azimuth +
1478 nsector_azimuth - 1;
1480 bpmpd_problem_t::greater_equal, 0);
1481 p->push_back_coefficient(
1482 index_row, index_column, 1);
1483 p->push_back_coefficient(
1484 index_row, nsuperblock + index_column, -1);
1487 bpmpd_problem_t::greater_equal, 0);
1488 p->push_back_coefficient(
1489 index_row, index_column, 1);
1490 p->push_back_coefficient(
1492 nsuperblock + index_column - (nsector_azimuth - 1),
1496 bpmpd_problem_t::greater_equal, 0);
1497 p->push_back_coefficient(
1498 index_row, index_column, 1);
1499 p->push_back_coefficient(
1501 nsuperblock + index_column + nsector_azimuth, -1);
1504 bpmpd_problem_t::greater_equal, 0);
1505 p->push_back_coefficient(
1506 index_row, index_column, 1);
1507 p->push_back_coefficient(
1509 nsuperblock + index_column + nsector_azimuth -
1510 (nsector_azimuth - 1),
1515 const size_t nstaggered_block =
1516 (nedge_pseudorapidity - 1) * nsector_azimuth;
1517 const size_t nblock = nsuperblock + 2 * nstaggered_block;
1523 size_t positive_count = 0;
1525 for (std::vector<particle_t>::const_iterator iterator =
1527 iterator !=
_event.end(); iterator++) {
1528 if (iterator->momentum_perp_subtracted >= 0) {
1529 positive_index[iterator -
_event.begin()] =
1535 _ncost = nblock + positive_count;
1542 std::vector<particle_t>::const_iterator
1543 iterator_particle =
_event.begin();
1544 std::vector<bool>::const_iterator iterator_active =
1546 std::vector<std::vector<size_t> >::const_iterator
1547 iterator_recombine_index_outer =
1549 std::vector<std::vector<size_t> >::const_iterator
1550 iterator_recombine_unsigned_outer =
1552 size_t index_column_max =
_ncost - 1;
1553 for (; iterator_particle !=
_event.end();
1554 iterator_particle++, iterator_active++,
1555 iterator_recombine_index_outer++,
1556 iterator_recombine_unsigned_outer++) {
1557 if (*iterator_active) {
1558 int index_pseudorapidity = -1;
1562 if (iterator_particle->momentum.Eta() >= edge_pseudorapidity[
i - 1] &&
1563 iterator_particle->momentum.Eta() < edge_pseudorapidity[
i]) {
1564 index_pseudorapidity =
i - 1;
1568 const int index_azimuth = floor(
1569 (iterator_particle->momentum.Phi() +
M_PI) *
1570 ((nsector_azimuth >> 1) /
M_PI));
1572 if (index_pseudorapidity != -1) {
1580 iterator_particle->momentum_perp_subtracted >= 0 ?
1582 bpmpd_problem_t::greater_equal,
1583 iterator_particle->momentum_perp_subtracted);
1586 const double sign = iterator_particle->momentum_perp_subtracted >= 0 ? 1 : -1;
1587 const size_t index_column_block_subtract =
1589 (nedge_pseudorapidity - 1) * nsector_azimuth +
1590 index_pseudorapidity * nsector_azimuth +
1594 index_column_block_subtract;
1596 if (iterator_particle->momentum_perp_subtracted >= 0) {
1597 const size_t index_column_cost =
1598 nblock + positive_index[iterator_particle -
_event.begin()];
1600 p->push_back_coefficient(
1601 index_row, index_column_cost, 1);
1603 std::max(index_column_max, index_column_cost);
1605 p->push_back_coefficient(
1606 index_row, index_column_block_subtract, 1);
1608 std::max(index_column_max, index_column_block_subtract);
1610 for (std::vector<size_t>::const_iterator
1611 iterator_recombine_index_inner =
1612 iterator_recombine_index_outer->begin();
1613 iterator_recombine_index_inner !=
1614 iterator_recombine_index_outer->end();
1615 iterator_recombine_index_inner++) {
1616 const size_t index_column =
1617 *iterator_recombine_index_inner +
1620 p->push_back_coefficient(
1621 index_row, index_column, sign);
1623 std::max(index_column_max, index_column);
1627 const size_t index_column_block =
1629 index_pseudorapidity * nsector_azimuth +
1637 double sum_unequalized;
1639 sum_unequalized = 0;
1640 for (std::vector<size_t>::const_iterator
1641 iterator_recombine_unsigned_inner =
1642 iterator_recombine_unsigned_outer->begin();
1643 iterator_recombine_unsigned_inner !=
1644 iterator_recombine_unsigned_outer->end();
1645 iterator_recombine_unsigned_inner++) {
1647 _event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted;
1649 sum_unequalized =
std::max(0.0, sum_unequalized);
1651 if (sum_unequalized >= sum_unequalized_3 ||
1652 (sum_unequalized >= sum_unequalized_2 &&
1653 (iterator_particle -
_event.begin()) % 2 == 0) ||
1654 (sum_unequalized >= sum_unequalized_1 &&
1655 (iterator_particle -
_event.begin()) % 4 == 0) ||
1656 (sum_unequalized >= sum_unequalized_0 &&
1657 (iterator_particle -
_event.begin()) % 8 == 0)) {
1659 const double weight = sum_unequalized *
1661 iterator_particle->area));
1665 bpmpd_problem_t::greater_equal,
1668 p->push_back_coefficient(
1669 index_row, index_column_block, 1.0 / weight);
1671 for (std::vector<size_t>::const_iterator
1672 iterator_recombine_unsigned_inner =
1673 iterator_recombine_unsigned_outer->begin();
1674 iterator_recombine_unsigned_inner !=
1675 iterator_recombine_unsigned_outer->end();
1676 iterator_recombine_unsigned_inner++) {
1677 if (
_event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted >= 0) {
1678 const size_t index_column_cost =
1680 positive_index[*iterator_recombine_unsigned_inner];
1682 p->push_back_coefficient(
1683 index_row, index_column_cost, 1);
1685 std::max(index_column_max, index_column_cost);
1691 bpmpd_problem_t::greater_equal,
1694 p->push_back_coefficient(
1697 for (std::vector<size_t>::const_iterator iterator_recombine_unsigned_inner = iterator_recombine_unsigned_outer->begin();
1698 iterator_recombine_unsigned_inner != iterator_recombine_unsigned_outer->end();
1699 iterator_recombine_unsigned_inner++) {
1700 if (
_event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted >= 0) {
1701 const size_t index_column_cost =
1703 positive_index[*iterator_recombine_unsigned_inner];
1705 p->push_back_coefficient(
1706 index_row, index_column_cost, -1);
1708 std::max(index_column_max, index_column_cost);
1722 static const double epsilon_degeneracy = 1
e-2;
1728 for (
size_t i = 0;
i < nsuperblock;
i++) {
1729 p->push_back_column(
1732 for (
size_t i = nsuperblock;
i < nsuperblock + nstaggered_block;
i++) {
1733 p->push_back_column(
1736 for (
size_t i = nsuperblock + nstaggered_block;
i < nsuperblock + 2 * nstaggered_block;
i++) {
1737 p->push_back_column(
1740 for (
size_t i = nsuperblock + 2 * nstaggered_block;
i <
_ncost;
i++) {
1741 p->push_back_column(
1747 for (
size_t i = _ncost;
i <= index_column_max;
i++) {
1748 p->push_back_column(
1755 bpmpd_problem_t lp_problem =
reinterpret_cast<bpmpd_environment_t *
>(
_lp_environment)->problem();
1759 lp_problem.optimize();
1761 int solution_status;
1762 double objective_value;
1763 std::vector<double>
x;
1764 std::vector<double>
pi;
1766 lp_problem.solve(solution_status, objective_value,
1769 for (
size_t k =
_ncost;
k < x.size();
k++) {
1771 momentum_perp_subtracted < 0 &&
1773 momentum_perp_subtracted >= 0 && x[
k] >= 0) {
1775 momentum_perp_subtracted += x[
k];
1777 momentum_perp_subtracted -= x[
k];
1780 for (
size_t k = 0;
k <
_event.size();
k++) {
1783 _event[
k].momentum_perp_subtracted -=
1790 for (std::vector<particle_t>::iterator iterator =
1792 iterator !=
_event.end(); iterator++) {
1793 iterator->momentum_perp_subtracted =
std::max(
1794 0.0, iterator->momentum_perp_subtracted);
1813 const double dr_max,
1814 const bool isRealData,
1816 const std::pair<double, double> equalization_threshold,
1817 const bool remove_nonpositive)
1818 : _remove_nonpositive(remove_nonpositive),
1819 _equalization_threshold(equalization_threshold),
1820 _radial_distance_square_max(dr_max * dr_max),
1821 _positive_bound_scale(0.2),
1829 -5.191, -2.650, -2.043, -1.740, -1.479, -1.131, -0.783, -0.522, 0.522, 0.783, 1.131, 1.479, 1.740, 2.043, 2.650, 5.191
1833 edge_pseudorapidity,
1853 const double perp,
const double pseudorapidity,
1854 const double azimuth,
1855 const unsigned int reduced_particle_flow_id)
1879 std::vector<double>
ret;
1881 for (std::vector<particle_t>::const_iterator iterator =
1883 iterator !=
_event.end(); iterator++) {
1884 ret.push_back(iterator->momentum_perp_subtracted);
1893 std::vector<double>
ret;
1895 for (std::vector<particle_t>::const_iterator iterator =
1897 iterator !=
_event.end(); iterator++) {
1898 ret.push_back(iterator->momentum_perp_subtracted_unequalized);
1913 std::vector<double>
ret;
1915 for (std::vector<particle_t>::const_iterator iterator =
1917 iterator !=
_event.end(); iterator++) {
1918 ret.push_back(iterator->area);
1935 std::vector<std::set<size_t> >
ret;
1937 for (std::vector<particle_t>::const_iterator
1938 iterator_outer =
_event.begin();
1939 iterator_outer !=
_event.end(); iterator_outer++) {
1942 for (std::set<std::vector<particle_t>::iterator>::
1943 const_iterator iterator_inner =
1944 iterator_outer->incident.begin();
1945 iterator_inner != iterator_outer->incident.begin();
1947 e.insert(*iterator_inner -
_event.begin());
1958 return std::vector<double>(
std::vector< bool > _active
std::vector< std::vector< size_t > > _recombine_index
std::vector< double > perp_fourier(void)
void subtract_momentum(void)
Sin< T >::type sin(const T &t)
CGAL::Voronoi_diagram_2< delaunay_triangulation_t, CGAL::Delaunay_triangulation_adaptation_traits_2< delaunay_triangulation_t >, CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2< delaunay_triangulation_t > > voronoi_diagram_t
double _positive_bound_scale
void remove_nonpositive(void)
std::vector< double > _edge_pseudorapidity
void initialize_geometry(void)
std::vector< double > _recombine_tie
bool equal(const T &first, const T &second)
int solver_(double *obj, double *rhs, double *lbound, double *ubound, double *diag, double *odiag, double *xs, double *dxs, double *dxsn, double *up, double *dspr, double *ddspr, double *ddsprn, double *dsup, double *ddsup, double *ddsupn, double *dv, double *ddv, double *ddvn, double *prinf, double *upinf, double *duinf, double *scale, double *nonzeros, int *vartyp, int *slktyp, int *colpnt, int *ecolpnt, int *count, int *vcstat, int *pivots, int *invprm, int *snhead, int *nodtyp, int *inta1, int *prehis, int *rowidx, int *rindex, int *code, double *opt, int *iter, int *corect, int *fixn, int *dropn, int *fnzmax, int *fnzmin, double *addobj, double *bigbou, double *big, int *ft)
U second(std::pair< T, U > const &p)
delaunay_triangulation_t::Point point_2d_t
std::vector< double > _cms_ecal_edge_pseudorapidity
std::vector< double > particle_area(void)
void lp_populate(void *lp_problem)
void subtract_if_necessary(void)
void push_back_particle(const double perp, const double pseudorapidity, const double azimuth, const unsigned int reduced_particle_flow_id)
std::vector< std::pair< size_t, size_t > > _recombine
#define BPMPD_VERSION_STRING
void clear(CLHEP::HepGenMatrix &m)
Helper function: Reset all elements of a matrix to 0.
static const size_t nreduced_particle_flow_id
std::vector< std::set< size_t > > particle_incident(void)
void recombine_link(void)
Cos< T >::type cos(const T &t)
static const size_t nfourier
std::vector< size_t > _nblock_subtract
std::vector< double > _feature
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
double _radial_distance_square_max
boost::multi_array< double, 4 > * _perp_fourier
PtEtaPhiELorentzVectorD PtEtaPhiELorentzVector
Lorentz vector with cartesian internal representation.
std::vector< std::vector< size_t > > _recombine_unsigned
float ue_interpolation_pf0[15][344]
void feature_extract(void)
T perp() const
Magnitude of transverse component.
void voronoi_area_incident(void)
std::pair< double, double > _equalization_threshold
size_t nedge_pseudorapidity(void) const
VoronoiAlgorithm(const double dr_max, const bool isRealData=true, const bool isCalo=false, const std::pair< double, double > equalization_threshold=std::pair< double, double >(5.0, 35.0), const bool remove_nonpositive=true)
float ue_predictor_pf[3][15][5][2][82]
std::vector< double > _cms_hcal_edge_pseudorapidity
volatile std::atomic< bool > shutdown_flag false
CGAL::Polygon_2< CGAL::Exact_predicates_inexact_constructions_kernel > polygon_t
std::vector< double > subtracted_unequalized_perp(void)
float ue_interpolation_pf1[15][344]
float ue_interpolation_pf2[15][82]
std::vector< double > subtracted_equalized_perp(void)
#define BPMPD_INFINITY_BOUND