127 double *
obj,
double *rhs,
double *lbound,
double *ubound,
129 double *diag,
double *odiag,
133 double *dxs,
double *dxsn,
double *up,
137 double *ddspr,
double *ddsprn,
double *dsup,
double *ddsup,
142 double *ddv,
double *ddvn,
double *prinf,
144 double *upinf,
double *duinf,
double *
scale,
154 int *ecolpnt,
int *
count,
int *vcstat,
int *pivots,
155 int *invprm,
int *snhead,
int *nodtyp,
int *inta1,
165 int *iter,
int *corect,
int *fixn,
int *dropn,
int *fnzmax,
166 int *fnzmin,
double *addobj,
double *bigbou,
179 static const int minimize = 1;
180 static const int maximize = -1;
181 static const char less_equal =
'L';
182 static const char equal =
'E';
183 static const char greater_equal =
'G';
184 static const char range =
'R';
187 bool _variable_named;
189 std::vector<double> _rhs;
190 std::vector<char> _constraint_sense;
191 std::vector<double> _range_value;
192 std::vector<char *> _row_name;
194 std::vector<double> _objective;
195 std::vector<double> _lower_bound;
196 std::vector<double> _upper_bound;
197 std::vector<char *> _column_name;
199 std::vector<int> _coefficient_row;
200 std::vector<int> _coefficient_column;
201 std::vector<double> _coefficient_value;
206 _constraint_sense.clear();
207 for (std::vector<char *>::const_iterator iterator =
209 iterator != _row_name.end(); iterator++) {
214 void clear_column(
void)
217 _lower_bound.clear();
218 _upper_bound.clear();
219 for (std::vector<char *>::const_iterator iterator =
220 _column_name.begin();
221 iterator != _column_name.end(); iterator++) {
224 _column_name.clear();
226 void clear_coefficient(
void)
228 _coefficient_row.clear();
229 _coefficient_column.clear();
230 _coefficient_value.clear();
232 void to_csr(std::vector<int> &column_pointer,
233 std::vector<int> &row_index,
234 std::vector<double> &nonzero_value,
235 const int index_start = 1)
240 std::vector<std::vector<std::pair<int, double> > >
241 column_index(_objective.size(),
242 std::vector<std::pair<int, double> >());
244 std::vector<int>::const_iterator iterator_row =
245 _coefficient_row.begin();
246 std::vector<int>::const_iterator iterator_column =
247 _coefficient_column.begin();
248 std::vector<double>::const_iterator iterator_value =
249 _coefficient_value.begin();
251 for (; iterator_value != _coefficient_value.end();
252 iterator_row++, iterator_column++, iterator_value++) {
253 column_index[*iterator_column].push_back(
254 std::pair<int, double>(
256 *iterator_row + index_start, *iterator_value));
259 for (std::vector<std::vector<std::pair<int, double> > >::
260 iterator iterator_outer = column_index.begin();
261 iterator_outer != column_index.end(); iterator_outer++) {
263 column_pointer.push_back(row_index.size() + index_start);
264 std::sort(iterator_outer->begin(), iterator_outer->end());
265 for (std::vector<std::pair<int, double> >::const_iterator
266 iterator_inner = iterator_outer->begin();
267 iterator_inner != iterator_outer->end();
269 row_index.push_back(iterator_inner->first);
270 nonzero_value.push_back(iterator_inner->second);
274 column_pointer.push_back(row_index.size() + index_start);
277 problem_t(
const bool variable_named)
278 : _optimized(
false), _variable_named(variable_named)
291 virtual int populate(
void) = 0;
292 size_t nrow(
void)
const
296 size_t ncolumn(
void)
const
298 return _objective.size();
300 void push_back_row(
const char constraint_sense,
304 _constraint_sense.push_back(constraint_sense);
306 if (_variable_named) {
307 static const size_t name_length = 24;
308 char *
name =
new char[name_length];
310 snprintf(name, name_length,
"c%llu",
311 static_cast<unsigned long long>(_rhs.size()));
312 _row_name.push_back(name);
315 void push_back_row(
const std::string &constraint_sense,
320 if (constraint_sense ==
"<=") {
322 push_back_row(rhs, cplex_sense);
324 else if (constraint_sense ==
"==") {
326 push_back_row(rhs, cplex_sense);
328 else if (constraint_sense ==
">=") {
330 push_back_row(rhs, cplex_sense);
333 fprintf(stderr,
"%s:%d: illegal sense (`%s')\n",
334 __FILE__, __LINE__, constraint_sense.c_str());
337 void push_back_column(
const double objective,
338 const double lower_bound,
339 const double upper_bound)
341 _objective.push_back(objective);
342 _lower_bound.push_back(lower_bound);
343 _upper_bound.push_back(upper_bound);
345 if (_variable_named) {
346 static const size_t name_length = 24;
347 char *name =
new char[name_length];
349 snprintf(name, name_length,
"x%llu",
350 static_cast<unsigned long long>(
352 _column_name.push_back(name);
355 void push_back_coefficient(
356 const int row,
const int column,
const double value)
358 _coefficient_row.push_back(row);
359 _coefficient_column.push_back(column);
360 _coefficient_value.push_back(value);
362 virtual int optimize(
void) = 0;
363 int optimize_primal_simplex(
void)
367 int optimize_dual_simplex(
void)
371 int optimize_barrier(
void)
375 int optimize_network(
void)
379 int optimize_sifting(
void)
383 int optimize_concurrent(
void)
387 int optimize_deterministic_concurrent(
void)
393 int &solution_status,
double &objective_value,
394 std::vector<double> &variable_primal,
395 std::vector<double> &variable_dual,
396 std::vector<double> &variable_slack_surplus,
397 std::vector<double> &reduced_cost) = 0;
399 double &objective_value,
400 std::vector<double> &variable_primal,
401 std::vector<double> &variable_dual,
402 std::vector<double> &variable_slack_surplus,
403 std::vector<double> &reduced_cost)
407 return solve(solution_status, objective_value,
408 variable_primal, variable_dual,
409 variable_slack_surplus, reduced_cost);
412 std::vector<double> &variable_primal,
413 std::vector<double> &variable_dual,
414 std::vector<double> &variable_slack_surplus,
415 std::vector<double> &reduced_cost)
418 double objective_value;
420 return solve(solution_status, objective_value,
421 variable_primal, variable_dual,
422 variable_slack_surplus, reduced_cost);
425 int &solution_status,
double &objective_value,
426 std::vector<double> &variable_primal,
427 std::vector<double> &variable_dual)
429 std::vector<double> variable_slack_surplus;
430 std::vector<double> reduced_cost;
432 return solve(solution_status, objective_value,
433 variable_primal, variable_dual,
434 variable_slack_surplus, reduced_cost);
437 std::vector<double> &variable_primal,
438 std::vector<double> &variable_dual)
441 double objective_value;
443 return solve(solution_status, objective_value, variable_primal,
447 std::vector<double> &variable_primal)
449 std::vector<double> variable_dual;
451 return solve(variable_primal, variable_dual);
455 class environment_t {
457 std::vector<problem_t *> _problem;
460 #ifndef BPMPD_INFINITY_BOUND
461 #define BPMPD_INFINITY_BOUND 1e+30
462 #endif // BPMPD_INFINITY_BOUND
464 #ifndef BPMPD_VERSION_STRING
465 #define BPMPD_VERSION_STRING "Version 2.11 (1996 December)"
466 #endif // BPMPD_VERSION_STRING
468 class bpmpd_environment_t;
470 class bpmpd_problem_t :
public problem_t {
474 double _objective_sense;
475 double _objective_value;
476 std::vector<double> _variable_primal;
477 std::vector<double> _variable_dual;
478 int _solution_status;
480 int ampl_solution_status(
const int termination_code)
482 switch (termination_code) {
496 fprintf(stderr,
"%s:%d: error: unknown termination code "
497 "%d\n", __FILE__, __LINE__, termination_code);
500 fprintf(stderr,
"%s:%d: %d\n", __FILE__, __LINE__,
503 void set_bpmpd_parameter(
void)
588 void append_constraint_sense_bound(
589 std::vector<double> &lower_bound_bpmpd,
590 std::vector<double> &upper_bound_bpmpd)
592 for (std::vector<char>::const_iterator iterator =
593 _constraint_sense.begin();
594 iterator != _constraint_sense.end(); iterator++) {
598 upper_bound_bpmpd.push_back(0);
601 lower_bound_bpmpd.push_back(0);
602 upper_bound_bpmpd.push_back(0);
605 lower_bound_bpmpd.push_back(0);
611 iterator - _constraint_sense.begin();
613 lower_bound_bpmpd.push_back(0);
614 upper_bound_bpmpd.push_back(_range_value[index] -
620 lower_bound_bpmpd.reserve(
dims_.
mn);
621 lower_bound_bpmpd.insert(lower_bound_bpmpd.end(),
622 _lower_bound.begin(),
624 upper_bound_bpmpd.reserve(
dims_.
mn);
625 upper_bound_bpmpd.insert(upper_bound_bpmpd.end(),
626 _upper_bound.begin(),
635 bpmpd_problem_t(
void)
636 : problem_t(
false), _objective_sense(1.0),
637 _objective_value(NAN)
640 inline size_t nrow(
void)
const
644 inline size_t ncolumn(
void)
const
648 inline void set_objective_sense(
int sense)
650 _objective_sense = sense;
655 inline void save(std::string
filename)
659 void push_back_column(
const double objective,
660 const double lower_bound = 0,
663 problem_t::push_back_column(objective, lower_bound,
666 void set_size(
const size_t nonzero_value_size,
667 const double mf = 6.0,
const size_t ma = 0)
669 dims_.
n = _objective.size();
683 std::max(static_cast<size_t>(0), ma);
690 std::vector<int> column_pointer;
692 std::vector<int> row_index;
694 std::vector<double> nonzero_value;
696 to_csr(column_pointer, row_index, nonzero_value);
699 std::bind1st(std::multiplies<double>(),
703 for (
size_t i = 0;
i < 3;
i++) {
704 set_size(nonzero_value.size(), 6.0 * (1 <<
i));
709 set_bpmpd_parameter();
711 std::vector<double> diag(
dims_.
mn, 0);
712 std::vector<double> odiag(
dims_.
mn, 0);
713 std::vector<double> dxs(
dims_.
mn, 0);
714 std::vector<double> dxsn(
dims_.
mn, 0);
715 std::vector<double> up(
dims_.
mn, 0);
716 std::vector<double> dual_residual(
dims_.
mn, 0);
717 std::vector<double> ddspr(
dims_.
mn, 0);
718 std::vector<double> ddsprn(
dims_.
mn, 0);
719 std::vector<double> dsup(
dims_.
mn, 0);
720 std::vector<double> ddsup(
dims_.
mn, 0);
721 std::vector<double> ddsupn(
dims_.
mn, 0);
722 std::vector<double> ddv(
dims_.
m, 0);
723 std::vector<double> ddvn(
dims_.
m, 0);
724 std::vector<double> prinf(
dims_.
m, 0);
725 std::vector<double> upinf(
dims_.
mn, 0);
726 std::vector<double> duinf(
dims_.
mn, 0);
728 std::vector<int> vartyp(
dims_.
n, 0);
729 std::vector<int> slktyp(
dims_.
m, 0);
730 std::vector<int> colpnt(
dims_.
n1, 0);
731 std::vector<int> ecolpnt(
dims_.
mn, 0);
733 std::vector<int> vcstat(
dims_.
mn, 0);
734 std::vector<int> pivots(
dims_.
mn, 0);
735 std::vector<int> invprm(
dims_.
mn, 0);
736 std::vector<int> snhead(
dims_.
mn, 0);
737 std::vector<int> nodtyp(
dims_.
mn, 0);
738 std::vector<int> inta1(
dims_.
mn, 0);
739 std::vector<int> prehis(
dims_.
mn, 0);
741 int termination_code;
750 double bigbou = 1
e+15;
754 _variable_primal.resize(
dims_.
mn);
755 _variable_dual.resize(
dims_.
m);
757 std::vector<double> lower_bound_bpmpd = _lower_bound;
758 std::vector<double> upper_bound_bpmpd = _upper_bound;
760 append_constraint_sense_bound(lower_bound_bpmpd,
763 solver_(&_objective[0], &_rhs[0], &lower_bound_bpmpd[0],
764 &upper_bound_bpmpd[0], &diag[0], &odiag[0],
765 &_variable_primal[0], &dxs[0], &dxsn[0], &up[0],
766 &dual_residual[0], &ddspr[0], &ddsprn[0],
767 &dsup[0], &ddsup[0], &ddsupn[0],
768 &_variable_dual[0], &ddv[0], &ddvn[0], &prinf[0],
769 &upinf[0], &duinf[0], &
scale[0],
770 &nonzero_value[0], &vartyp[0], &slktyp[0],
771 &column_pointer[0], &ecolpnt[0], &
count[0],
772 &vcstat[0], &pivots[0], &invprm[0], &snhead[0],
773 &nodtyp[0], &inta1[0], &prehis[0], &row_index[0],
774 &rindex[0], &termination_code, &_objective_value,
775 &iter, &correct, &fixn, &dropn, &fnzmax, &fnzmin,
776 &addobj, &bigbou, &infinity_copy, &ft);
778 _objective_value *= _objective_sense;
779 _solution_status = ampl_solution_status(termination_code);
780 if (termination_code != -2) {
786 return _solution_status == 0 ? 0 : 1;
789 int &solution_status,
double &objective_value,
790 std::vector<double> &variable_primal,
791 std::vector<double> &variable_dual,
792 std::vector<double> &variable_slack_surplus,
793 std::vector<double> &reduced_cost)
801 int &solution_status,
double &objective_value,
802 std::vector<double> &variable_primal,
803 std::vector<double> &variable_dual)
805 variable_primal = std::vector<double>(
806 _variable_primal.begin(),
807 _variable_primal.begin() + _objective.size());
808 variable_dual = _variable_dual;
812 friend class bpmpd_environment_t;
815 class bpmpd_environment_t :
public environment_t {
817 bpmpd_environment_t(
void)
820 ~bpmpd_environment_t(
void)
823 int set_verbose(
void);
824 int set_data_checking(
void);
825 inline std::string version_str(
void)
const
829 bpmpd_problem_t problem(std::string name =
"")
831 return bpmpd_problem_t();
839 double angular_range_reduce(
const double x)
841 if (!std::isfinite(x)) {
845 static const double cody_waite_x_max = 1608.4954386379741381;
846 static const double two_pi_0 = 6.2831853071795649157;
847 static const double two_pi_1 = 2.1561211432631314669e-14;
848 static const double two_pi_2 = 1.1615423895917441336e-27;
851 if (x >= -cody_waite_x_max && x <= cody_waite_x_max) {
852 static const double inverse_two_pi =
853 0.15915494309189534197;
854 const double k = rint(x * inverse_two_pi);
855 ret = ((x - (k * two_pi_0)) - k * two_pi_1) -
862 sincosl(x, &sin_x, &cos_x);
863 ret = (double)atan2l(sin_x, cos_x);
873 size_t pf_id_reduce(
const int pf_id)
889 else if (pf_id >= 5 && pf_id <= 7) {
900 static const size_t ncms_hcal_edge_pseudorapidity = 82 + 1;
901 static const double cms_hcal_edge_pseudorapidity[
902 ncms_hcal_edge_pseudorapidity] = {
903 -5.191, -4.889, -4.716, -4.538, -4.363, -4.191, -4.013,
904 -3.839, -3.664, -3.489, -3.314, -3.139, -2.964, -2.853,
905 -2.650, -2.500, -2.322, -2.172, -2.043, -1.930, -1.830,
906 -1.740, -1.653, -1.566, -1.479, -1.392, -1.305, -1.218,
907 -1.131, -1.044, -0.957, -0.879, -0.783, -0.696, -0.609,
908 -0.522, -0.435, -0.348, -0.261, -0.174, -0.087,
910 0.087, 0.174, 0.261, 0.348, 0.435, 0.522, 0.609,
911 0.696, 0.783, 0.879, 0.957, 1.044, 1.131, 1.218,
912 1.305, 1.392, 1.479, 1.566, 1.653, 1.740, 1.830,
913 1.930, 2.043, 2.172, 2.322, 2.500, 2.650, 2.853,
914 2.964, 3.139, 3.314, 3.489, 3.664, 3.839, 4.013,
915 4.191, 4.363, 4.538, 4.716, 4.889, 5.191
919 cms_hcal_edge_pseudorapidity,
920 cms_hcal_edge_pseudorapidity +
921 ncms_hcal_edge_pseudorapidity);
923 static const size_t ncms_ecal_edge_pseudorapidity = 344 + 1;
925 for (
size_t i = 0;
i < ncms_ecal_edge_pseudorapidity;
i++) {
928 (ncms_ecal_edge_pseudorapidity - 1)) -
949 for (std::vector<particle_t>::const_iterator iterator =
951 iterator !=
_event.end(); iterator++) {
952 const unsigned int reduced_id =
953 iterator->reduced_particle_flow_id;
957 if (iterator->momentum.Eta() >=
959 iterator->momentum.Eta() <
961 const double azimuth =
962 iterator->momentum.Phi();
965 (*_perp_fourier)[
k - 1][reduced_id]
967 iterator->momentum.Pt() *
969 (*_perp_fourier)[
k - 1][reduced_id]
971 iterator->momentum.Pt() *
980 const size_t nfeature = 2 *
nfourier - 1;
993 scale[0] = 1.0 / 5400.0;
996 scale[1] = 1.0 / 130.0;
999 scale[2] = 1.0 / 220.0;
1002 const size_t index_edge_end =
1008 ((*_perp_fourier)[0 ][
j][0][0] +
1009 (*_perp_fourier)[index_edge_end][
j][0][0]);
1016 ((*_perp_fourier)[0 ][
j][
k][0] +
1017 (*_perp_fourier)[index_edge_end][
j][
k][0]);
1022 ((*_perp_fourier)[0 ][
j][
k][1] +
1023 (*_perp_fourier)[index_edge_end][
j][
k][1]);
1042 #ifdef HAVE_SPARSEHASH
1044 const voronoi_diagram_t::Face face_empty;
1045 google::dense_hash_map<voronoi_diagram_t::Face_handle,
1046 size_t, hash<voronoi_diagram_t::Face_handle> >
1049 face_index.set_empty_key(face_empty);
1050 #else // HAVE_SPARSEHASH
1051 std::map<voronoi_diagram_t::Face_handle, size_t>
1053 #endif // HAVE_SPARSEHASH
1055 for (std::vector<particle_t>::const_iterator iterator =
1057 iterator !=
_event.end(); iterator++) {
1061 for (
int k = -1;
k <= 1;
k++) {
1063 iterator->momentum.Eta(),
1064 iterator->momentum.Phi() +
1066 const voronoi_diagram_t::Face_handle
handle =
1076 for (std::vector<particle_t>::iterator iterator =
1078 iterator !=
_event.end(); iterator++) {
1079 const voronoi_diagram_t::Locate_result
result =
1080 diagram.locate(*iterator);
1081 const voronoi_diagram_t::Face_handle *face =
1082 boost::get<voronoi_diagram_t::Face_handle>(
1084 double polygon_area;
1087 voronoi_diagram_t::Ccb_halfedge_circulator
1088 circulator_start = (*face)->outer_ccb();
1089 bool unbounded =
false;
1092 voronoi_diagram_t::Ccb_halfedge_circulator
1093 circulator = circulator_start;
1098 if (circulator->has_target()) {
1100 circulator->target()->point());
1101 _event[face_index[*face]].incident.
1104 face_index[circulator->twin()->
1112 while (++circulator != circulator_start);
1114 polygon_area = INFINITY;
1117 polygon_area = polygon.area();
1123 iterator->area = fabs(polygon_area);
1128 for (std::vector<particle_t>::iterator iterator =
1130 iterator !=
_event.end(); iterator++) {
1131 int predictor_index = -1;
1132 int interpolation_index = -1;
1137 if (iterator->momentum.Eta() >=
1139 iterator->momentum.Eta() <
1141 predictor_index =
l - 1;
1150 if (iterator->momentum.Eta() >=
1152 iterator->momentum.Eta() <
1154 interpolation_index =
l - 1;
1162 if (iterator->momentum.Eta() >=
1164 iterator->momentum.Eta() <
1166 interpolation_index =
l - 1;
1171 if (predictor_index >= 0 && interpolation_index >= 0) {
1175 const double azimuth = iterator->momentum.Phi();
1176 const float (*
p)[2][82] =
1178 ue_predictor_pf[
j][predictor_index]
1181 #endif // STANDALONE
1186 for (
size_t m = 0;
m < 2;
m++) {
1187 float u =
p[
l][
m][0];
1189 for (
size_t n = 0;
n < 2 * nfourier - 1;
n++) {
1190 u += (((((((((
p[
l][
m][9 *
n + 9]) *
1192 p[
l][
m][9 *
n + 8]) *
1194 p[
l][
m][9 *
n + 7]) *
1196 p[
l][
m][9 *
n + 6]) *
1198 p[
l][
m][9 *
n + 5]) *
1200 p[
l][
m][9 *
n + 4]) *
1202 p[
l][
m][9 *
n + 3]) *
1204 p[
l][
m][9 *
n + 2]) *
1206 p[
l][
m][9 *
n + 1]) *
1210 pred += u * (
l == 0 ? 1.0 : 2.0) *
1211 (
m == 0 ?
cos(l * azimuth) :
1213 if (l == 0 &&
m == 0) {
1227 ue_interpolation_pf0[predictor_index][
1228 interpolation_index];
1232 ue_interpolation_pf1[predictor_index][
1233 interpolation_index];
1237 ue_interpolation_pf2[predictor_index][
1238 interpolation_index];
1244 interpolation_index];
1249 interpolation_index];
1254 interpolation_index];
1256 #endif // STANDALONE
1268 if (std::isfinite(iterator->area) && density >= 0) {
1271 iterator->momentum_perp_subtracted =
1272 iterator->momentum.Pt() -
1273 density * iterator->area;
1276 iterator->momentum_perp_subtracted =
1277 iterator->momentum.Pt();
1279 iterator->momentum_perp_subtracted_unequalized =
1280 iterator->momentum_perp_subtracted;
1285 boost::multi_array<double, 2> radial_distance_square(
1288 for (std::vector<particle_t>::const_iterator
1289 iterator_outer =
_event.begin();
1290 iterator_outer !=
_event.end(); iterator_outer++) {
1291 radial_distance_square
1292 [iterator_outer -
_event.begin()]
1293 [iterator_outer -
_event.begin()] = 0;
1295 for (std::vector<particle_t>::const_iterator
1296 iterator_inner =
_event.begin();
1297 iterator_inner != iterator_outer;
1299 const double deta = iterator_outer->momentum.Eta() -
1300 iterator_inner->momentum.Eta();
1301 const double dphi = angular_range_reduce(
1302 iterator_outer->momentum.Phi() -
1303 iterator_inner->momentum.Phi());
1305 radial_distance_square
1306 [iterator_outer -
_event.begin()]
1307 [iterator_inner -
_event.begin()] =
1308 deta * deta + dphi * dphi;
1309 radial_distance_square
1310 [iterator_inner -
_event.begin()]
1311 [iterator_outer -
_event.begin()] =
1312 radial_distance_square
1313 [iterator_outer -
_event.begin()]
1314 [iterator_inner -
_event.begin()];
1320 for (std::vector<particle_t>::const_iterator
1321 iterator_outer =
_event.begin();
1322 iterator_outer !=
_event.end(); iterator_outer++) {
1323 double incident_area_sum = iterator_outer->area;
1325 for (
std::set<std::vector<particle_t>::iterator>::
1326 const_iterator iterator_inner =
1327 iterator_outer->incident.begin();
1329 iterator_outer->incident.end();
1331 incident_area_sum += (*iterator_inner)->area;
1333 _active.push_back(incident_area_sum < 2.0);
1338 _event.size(), std::vector<size_t>());
1340 _event.size(), std::vector<size_t>());
1346 static const size_t npair_max = 36;
1348 for (
size_t i = 0;
i <
_event.size();
i++) {
1349 for (
size_t j = 0;
j <
_event.size();
j++) {
1351 const size_t incident_count =
1356 (radial_distance_square[
i][
j] <
1358 incident_count > 0)) {
1363 if (
_event[
i].momentum_perp_subtracted < 0) {
1364 std::vector<double> radial_distance_square_list;
1366 for (std::vector<size_t>::const_iterator iterator =
1370 const size_t j = *iterator;
1372 if (
_event[j].momentum_perp_subtracted > 0) {
1373 radial_distance_square_list.push_back(
1374 radial_distance_square[
i][j]);
1378 double radial_distance_square_max_equalization_cut =
1381 if (radial_distance_square_list.size() >= npair_max) {
1382 std::sort(radial_distance_square_list.begin(),
1383 radial_distance_square_list.end());
1384 radial_distance_square_max_equalization_cut =
1385 radial_distance_square_list[npair_max - 1];
1388 for (std::vector<size_t>::const_iterator iterator =
1392 const size_t j = *iterator;
1394 if (
_event[j].momentum_perp_subtracted > 0 &&
1395 radial_distance_square[
i][j] <
1396 radial_distance_square_max_equalization_cut) {
1402 std::pair<size_t, size_t>(
i, j));
1404 radial_distance_square[
i][j] /
1413 bpmpd_problem_t *
p =
reinterpret_cast<bpmpd_problem_t *
>(lp_problem);
1434 p->set_objective_sense(bpmpd_problem_t::minimize);
1438 static const size_t nsector_azimuth = 12;
1443 static const size_t ncms_hcal_edge_pseudorapidity = 19 + 1;
1444 static const double cms_hcal_edge_pseudorapidity[
1445 ncms_hcal_edge_pseudorapidity] = {
1446 -5.191, -4.538, -4.013,
1447 -3.489, -2.853, -2.322, -1.830, -1.305, -0.783, -0.261,
1448 0.261, 0.783, 1.305, 1.830, 2.322, 2.853, 3.489,
1453 const double *edge_pseudorapidity;
1455 nedge_pseudorapidity = ncms_hcal_edge_pseudorapidity;
1456 edge_pseudorapidity = cms_hcal_edge_pseudorapidity;
1458 const size_t nsuperblock = (nedge_pseudorapidity - 2) *
1461 size_t index_row = 0;
1462 for (
size_t index_pseudorapidity = 0;
1463 index_pseudorapidity < nedge_pseudorapidity - 2;
1464 index_pseudorapidity++) {
1465 for (
size_t index_azimuth = 0;
1466 index_azimuth < nsector_azimuth - 1;
1468 const size_t index_column =
1469 index_pseudorapidity * nsector_azimuth +
1472 bpmpd_problem_t::greater_equal, 0);
1473 p->push_back_coefficient(
1474 index_row, index_column, 1);
1475 p->push_back_coefficient(
1476 index_row, nsuperblock + index_column, -1);
1479 bpmpd_problem_t::greater_equal, 0);
1480 p->push_back_coefficient(
1481 index_row, index_column, 1);
1482 p->push_back_coefficient(
1483 index_row, nsuperblock + index_column + 1, -1);
1486 bpmpd_problem_t::greater_equal, 0);
1487 p->push_back_coefficient(
1488 index_row, index_column, 1);
1489 p->push_back_coefficient(
1491 nsuperblock + index_column + nsector_azimuth, -1);
1494 bpmpd_problem_t::greater_equal, 0);
1495 p->push_back_coefficient(
1496 index_row, index_column, 1);
1497 p->push_back_coefficient(
1499 nsuperblock + index_column + nsector_azimuth + 1,
1503 const size_t index_column =
1504 index_pseudorapidity * nsector_azimuth +
1505 nsector_azimuth - 1;
1507 bpmpd_problem_t::greater_equal, 0);
1508 p->push_back_coefficient(
1509 index_row, index_column, 1);
1510 p->push_back_coefficient(
1511 index_row, nsuperblock + index_column, -1);
1514 bpmpd_problem_t::greater_equal, 0);
1515 p->push_back_coefficient(
1516 index_row, index_column, 1);
1517 p->push_back_coefficient(
1519 nsuperblock + index_column - (nsector_azimuth - 1),
1523 bpmpd_problem_t::greater_equal, 0);
1524 p->push_back_coefficient(
1525 index_row, index_column, 1);
1526 p->push_back_coefficient(
1528 nsuperblock + index_column + nsector_azimuth, -1);
1531 bpmpd_problem_t::greater_equal, 0);
1532 p->push_back_coefficient(
1533 index_row, index_column, 1);
1534 p->push_back_coefficient(
1536 nsuperblock + index_column + nsector_azimuth -
1537 (nsector_azimuth - 1),
1542 const size_t nstaggered_block =
1543 (nedge_pseudorapidity - 1) * nsector_azimuth;
1544 const size_t nblock = nsuperblock + 2 * nstaggered_block;
1550 size_t positive_count = 0;
1552 for (std::vector<particle_t>::const_iterator iterator =
1554 iterator !=
_event.end(); iterator++) {
1555 if (iterator->momentum_perp_subtracted >= 0) {
1556 positive_index[iterator -
_event.begin()] =
1562 _ncost = nblock + positive_count;
1569 std::vector<particle_t>::const_iterator
1570 iterator_particle =
_event.begin();
1571 std::vector<bool>::const_iterator iterator_active =
1573 std::vector<std::vector<size_t> >::const_iterator
1574 iterator_recombine_index_outer =
1576 std::vector<std::vector<size_t> >::const_iterator
1577 iterator_recombine_unsigned_outer =
1579 size_t index_column_max =
_ncost - 1;
1580 for (; iterator_particle !=
_event.end();
1581 iterator_particle++, iterator_active++,
1582 iterator_recombine_index_outer++,
1583 iterator_recombine_unsigned_outer++) {
1584 if (*iterator_active) {
1585 int index_pseudorapidity = -1;
1589 if (iterator_particle->momentum.Eta() >= edge_pseudorapidity[
i - 1] &&
1590 iterator_particle->momentum.Eta() < edge_pseudorapidity[
i]) {
1591 index_pseudorapidity =
i - 1;
1595 const int index_azimuth = floor(
1596 (iterator_particle->momentum.Phi() +
M_PI) *
1597 ((nsector_azimuth >> 1) /
M_PI));
1599 if (index_pseudorapidity != -1) {
1607 iterator_particle->momentum_perp_subtracted >= 0 ?
1608 bpmpd_problem_t::equal :
1609 bpmpd_problem_t::greater_equal,
1610 iterator_particle->momentum_perp_subtracted);
1613 const double sign = iterator_particle->momentum_perp_subtracted >= 0 ? 1 : -1;
1614 const size_t index_column_block_subtract =
1616 (nedge_pseudorapidity - 1) * nsector_azimuth +
1617 index_pseudorapidity * nsector_azimuth +
1621 index_column_block_subtract;
1623 if (iterator_particle->momentum_perp_subtracted >= 0) {
1624 const size_t index_column_cost =
1625 nblock + positive_index[iterator_particle -
_event.begin()];
1627 p->push_back_coefficient(
1628 index_row, index_column_cost, 1);
1630 std::max(index_column_max, index_column_cost);
1632 p->push_back_coefficient(
1633 index_row, index_column_block_subtract, 1);
1635 std::max(index_column_max, index_column_block_subtract);
1637 for (std::vector<size_t>::const_iterator
1638 iterator_recombine_index_inner =
1639 iterator_recombine_index_outer->begin();
1640 iterator_recombine_index_inner !=
1641 iterator_recombine_index_outer->end();
1642 iterator_recombine_index_inner++) {
1643 const size_t index_column =
1644 *iterator_recombine_index_inner +
1647 p->push_back_coefficient(
1648 index_row, index_column, sign);
1650 std::max(index_column_max, index_column);
1654 const size_t index_column_block =
1656 index_pseudorapidity * nsector_azimuth +
1664 double sum_unequalized;
1666 sum_unequalized = 0;
1667 for (std::vector<size_t>::const_iterator
1668 iterator_recombine_unsigned_inner =
1669 iterator_recombine_unsigned_outer->begin();
1670 iterator_recombine_unsigned_inner !=
1671 iterator_recombine_unsigned_outer->end();
1672 iterator_recombine_unsigned_inner++) {
1674 _event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted;
1676 sum_unequalized =
std::max(0.0, sum_unequalized);
1678 if (sum_unequalized >= sum_unequalized_3 ||
1679 (sum_unequalized >= sum_unequalized_2 &&
1680 (iterator_particle -
_event.begin()) % 2 == 0) ||
1681 (sum_unequalized >= sum_unequalized_1 &&
1682 (iterator_particle -
_event.begin()) % 4 == 0) ||
1683 (sum_unequalized >= sum_unequalized_0 &&
1684 (iterator_particle -
_event.begin()) % 8 == 0)) {
1686 const double weight = sum_unequalized *
1688 iterator_particle->area));
1692 bpmpd_problem_t::greater_equal,
1695 p->push_back_coefficient(
1696 index_row, index_column_block, 1.0 / weight);
1698 for (std::vector<size_t>::const_iterator
1699 iterator_recombine_unsigned_inner =
1700 iterator_recombine_unsigned_outer->begin();
1701 iterator_recombine_unsigned_inner !=
1702 iterator_recombine_unsigned_outer->end();
1703 iterator_recombine_unsigned_inner++) {
1704 if (
_event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted >= 0) {
1705 const size_t index_column_cost =
1707 positive_index[*iterator_recombine_unsigned_inner];
1709 p->push_back_coefficient(
1710 index_row, index_column_cost, 1);
1712 std::max(index_column_max, index_column_cost);
1718 bpmpd_problem_t::greater_equal,
1721 p->push_back_coefficient(
1724 for (std::vector<size_t>::const_iterator iterator_recombine_unsigned_inner = iterator_recombine_unsigned_outer->begin();
1725 iterator_recombine_unsigned_inner != iterator_recombine_unsigned_outer->end();
1726 iterator_recombine_unsigned_inner++) {
1727 if (
_event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted >= 0) {
1728 const size_t index_column_cost =
1730 positive_index[*iterator_recombine_unsigned_inner];
1732 p->push_back_coefficient(
1733 index_row, index_column_cost, -1);
1735 std::max(index_column_max, index_column_cost);
1749 static const double epsilon_degeneracy = 1
e-2;
1755 for (
size_t i = 0;
i < nsuperblock;
i++) {
1756 p->push_back_column(
1759 for (
size_t i = nsuperblock;
i < nsuperblock + nstaggered_block;
i++) {
1760 p->push_back_column(
1763 for (
size_t i = nsuperblock + nstaggered_block;
i < nsuperblock + 2 * nstaggered_block;
i++) {
1764 p->push_back_column(
1767 for (
size_t i = nsuperblock + 2 * nstaggered_block;
i <
_ncost;
i++) {
1768 p->push_back_column(
1774 for (
size_t i = _ncost;
i <= index_column_max;
i++) {
1775 p->push_back_column(
1782 bpmpd_problem_t lp_problem =
reinterpret_cast<bpmpd_environment_t *
>(
_lp_environment)->problem();
1786 lp_problem.optimize();
1788 int solution_status;
1789 double objective_value;
1790 std::vector<double>
x;
1791 std::vector<double>
pi;
1793 lp_problem.solve(solution_status, objective_value,
1796 for (
size_t k =
_ncost;
k < x.size();
k++) {
1798 momentum_perp_subtracted < 0 &&
1800 momentum_perp_subtracted >= 0 && x[
k] >= 0) {
1802 momentum_perp_subtracted += x[
k];
1804 momentum_perp_subtracted -= x[
k];
1807 for (
size_t k = 0;
k <
_event.size();
k++) {
1810 _event[
k].momentum_perp_subtracted -=
1817 for (std::vector<particle_t>::iterator iterator =
1819 iterator !=
_event.end(); iterator++) {
1820 iterator->momentum_perp_subtracted =
std::max(
1821 0.0, iterator->momentum_perp_subtracted);
1840 const double dr_max,
1841 const bool isRealData,
1843 const std::pair<double, double> equalization_threshold,
1844 const bool remove_nonpositive)
1845 : _remove_nonpositive(remove_nonpositive),
1846 _equalization_threshold(equalization_threshold),
1847 _radial_distance_square_max(dr_max * dr_max),
1848 _positive_bound_scale(0.2),
1856 -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
1860 edge_pseudorapidity,
1880 const double perp,
const double pseudorapidity,
1881 const double azimuth,
1882 const unsigned int reduced_particle_flow_id)
1906 std::vector<double>
ret;
1908 for (std::vector<particle_t>::const_iterator iterator =
1910 iterator !=
_event.end(); iterator++) {
1911 ret.push_back(iterator->momentum_perp_subtracted);
1920 std::vector<double>
ret;
1922 for (std::vector<particle_t>::const_iterator iterator =
1924 iterator !=
_event.end(); iterator++) {
1925 ret.push_back(iterator->momentum_perp_subtracted_unequalized);
1940 std::vector<double>
ret;
1942 for (std::vector<particle_t>::const_iterator iterator =
1944 iterator !=
_event.end(); iterator++) {
1945 ret.push_back(iterator->area);
1962 std::vector<std::set<size_t> >
ret;
1964 for (std::vector<particle_t>::const_iterator
1965 iterator_outer =
_event.begin();
1966 iterator_outer !=
_event.end(); iterator_outer++) {
1969 for (
std::set<std::vector<particle_t>::iterator>::
1970 const_iterator iterator_inner =
1971 iterator_outer->incident.begin();
1972 iterator_inner != iterator_outer->incident.begin();
1974 e.insert(*iterator_inner -
_event.begin());
1985 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
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
const T & max(const T &a, const T &b)
#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
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
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]
bool insert(Storage &, ItemType *, const IdTag &)
std::vector< double > subtracted_equalized_perp(void)
#define BPMPD_INFINITY_BOUND
void set(const std::string &name, int value)
set the flag, with a run-time name