Kernel bounding for AT modified.

This commit is contained in:
Dongryeol Lee
2010-11-01 03:20:43 +00:00
parent 06e5b85a9b
commit 796c859c4b
@@ -26,101 +26,34 @@ class AxilrodTeller {
const core::gnp::TripleRangeDistanceSq &range_in) const {
const arma::mat &min_distance_sq = range_in.min_distance_sq();
const arma::mat &max_distance_sq = range_in.max_distance_sq();
double numerator_first_part =
-3.0 * core::math::Pow<3, 1>(max_distance_sq.at(0, 1));
double max_diff =
std::max(
fabs(
max_distance_sq.at(0, 2) - min_distance_sq.at(1, 2)),
fabs(
min_distance_sq.at(0, 2) - max_distance_sq.at(1, 2)));
double numerator_second_part =
-3.0 * core::math::Sqr(max_diff) *
(max_distance_sq.at(0, 2) + max_distance_sq.at(1, 2));
double denominator = 8.0 * pow(
min_distance_sq.at(0, 1) *
min_distance_sq.at(0, 2) *
min_distance_sq.at(1, 2), 2.5);
return (numerator_first_part + numerator_second_part) / denominator /
normalizing_constant_;
return -2 / pow(
min_distance_sq.at(0, 1) *
min_distance_sq.at(0, 2) *
min_distance_sq.at(1, 2), 1.5) / normalizing_constant_;
}
double maximum_negative_contribution(
const core::gnp::TripleRangeDistanceSq &range_in) const {
const arma::mat &min_distance_sq = range_in.min_distance_sq();
const arma::mat &max_distance_sq = range_in.max_distance_sq();
double numerator_first_part =
-3.0 * core::math::Pow<3, 1>(min_distance_sq.at(0, 1));
double numerator_second_part = 0;
if(max_distance_sq.at(0, 2) <= min_distance_sq.at(1, 2) ||
max_distance_sq.at(1, 2) <= min_distance_sq.at(0, 2)) {
double difference =
std::min(
fabs(min_distance_sq.at(1, 2) - max_distance_sq.at(0, 2)),
fabs(min_distance_sq.at(0, 2) - max_distance_sq.at(1, 2)));
numerator_second_part =
-3.0 * core::math::Sqr(difference) *
(min_distance_sq.at(0, 2) + min_distance_sq.at(1, 2));
}
double denominator = 8.0 * pow(
max_distance_sq.at(0, 1) *
max_distance_sq.at(0, 2) *
max_distance_sq.at(1, 2), 2.5);
return (numerator_first_part + numerator_second_part) / denominator /
normalizing_constant_;
return 0;
}
double minimum_positive_contribution(
const core::gnp::TripleRangeDistanceSq &range_in) const {
const arma::mat &min_distance_sq = range_in.min_distance_sq();
const arma::mat &max_distance_sq = range_in.max_distance_sq();
double numerator_first_part =
3.0 * core::math::Sqr(min_distance_sq.at(0, 1)) *
(min_distance_sq.at(0, 2) + min_distance_sq.at(1, 2));
double numerator_second_part =
min_distance_sq.at(0, 1) * (
3.0 * core::math::Sqr(min_distance_sq.at(0, 2)) +
2.0 * min_distance_sq.at(0, 2) * min_distance_sq.at(1, 2) +
3.0 * core::math::Sqr(min_distance_sq.at(1, 2)));
double denominator = 8.0 * pow(
max_distance_sq.at(0, 1) *
max_distance_sq.at(0, 2) *
max_distance_sq.at(1, 2), 2.5);
return (numerator_first_part + numerator_second_part) / denominator /
normalizing_constant_;
return 0;
}
double maximum_positive_contribution(
const core::gnp::TripleRangeDistanceSq &range_in) const {
const arma::mat &min_distance_sq = range_in.min_distance_sq();
const arma::mat &max_distance_sq = range_in.max_distance_sq();
double numerator_first_part =
3.0 * core::math::Sqr(max_distance_sq.at(0, 1)) *
(max_distance_sq.at(0, 2) + max_distance_sq.at(1, 2));
double numerator_second_part =
max_distance_sq.at(0, 1) * (
3.0 * core::math::Sqr(max_distance_sq.at(0, 2)) +
2.0 * max_distance_sq.at(0, 2) * max_distance_sq.at(1, 2) +
3.0 * core::math::Sqr(max_distance_sq.at(1, 2)));
double denominator = 8.0 * pow(
min_distance_sq.at(0, 1) *
min_distance_sq.at(0, 2) *
min_distance_sq.at(1, 2), 2.5);
return (numerator_first_part + numerator_second_part) / denominator /
normalizing_constant_;
return 1.375 / pow(
min_distance_sq.at(0, 1) *
min_distance_sq.at(0, 2) *
min_distance_sq.at(1, 2), 1.5) / normalizing_constant_;
}
core::math::Range RangeUnnormOnSq(