Merge "Separate NormalDistribution from ProximityInfoUtils."

main
Keisuke Kuroyanagi 2014-04-04 11:18:26 +00:00 committed by Android (Google) Code Review
commit f3d9e0367e
3 changed files with 52 additions and 24 deletions

View File

@ -0,0 +1,49 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LATINIME_NORMAL_DISTRIBUTION_H
#define LATINIME_NORMAL_DISTRIBUTION_H
#include <cmath>
#include "defines.h"
namespace latinime {
// Normal distribution N(u, sigma^2).
class NormalDistribution {
public:
NormalDistribution(const float u, const float sigma)
: mU(u),
mPreComputedNonExpPart(1.0f / sqrtf(2.0f * M_PI_F
* GeometryUtils::SQUARE_FLOAT(sigma))),
mPreComputedExponentPart(-1.0f / (2.0f * GeometryUtils::SQUARE_FLOAT(sigma))) {}
float getProbabilityDensity(const float x) const {
const float shiftedX = x - mU;
return mPreComputedNonExpPart
* expf(mPreComputedExponentPart * GeometryUtils::SQUARE_FLOAT(shiftedX));
}
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(NormalDistribution);
const float mU; // mean value
const float mPreComputedNonExpPart; // = 1 / sqrt(2 * PI * sigma^2)
const float mPreComputedExponentPart; // = -1 / (2 * sigma^2)
};
} // namespace latinime
#endif // LATINIME_NORMAL_DISTRIBUTION_H

View File

@ -24,6 +24,7 @@
#include "defines.h" #include "defines.h"
#include "suggest/core/layout/geometry_utils.h" #include "suggest/core/layout/geometry_utils.h"
#include "suggest/core/layout/normal_distribution.h"
#include "suggest/core/layout/proximity_info.h" #include "suggest/core/layout/proximity_info.h"
#include "suggest/core/layout/proximity_info_params.h" #include "suggest/core/layout/proximity_info_params.h"
@ -717,8 +718,8 @@ namespace latinime {
const float sigma = speedxAngleRate + speedxNearestKeyDistanceRate const float sigma = speedxAngleRate + speedxNearestKeyDistanceRate
+ ProximityInfoParams::MIN_STANDARD_DEVIATION; + ProximityInfoParams::MIN_STANDARD_DEVIATION;
ProximityInfoUtils::NormalDistribution NormalDistribution distribution(
distribution(ProximityInfoParams::CENTER_VALUE_OF_NORMALIZED_DISTRIBUTION, sigma); ProximityInfoParams::CENTER_VALUE_OF_NORMALIZED_DISTRIBUTION, sigma);
// Summing up probability densities of all near keys. // Summing up probability densities of all near keys.
float sumOfProbabilityDensities = 0.0f; float sumOfProbabilityDensities = 0.0f;
for (int j = 0; j < keyCount; ++j) { for (int j = 0; j < keyCount; ++j) {

View File

@ -125,28 +125,6 @@ class ProximityInfoUtils {
return type == MATCH_CHAR || type == PROXIMITY_CHAR || type == ADDITIONAL_PROXIMITY_CHAR; return type == MATCH_CHAR || type == PROXIMITY_CHAR || type == ADDITIONAL_PROXIMITY_CHAR;
} }
// Normal distribution N(u, sigma^2).
struct NormalDistribution {
public:
NormalDistribution(const float u, const float sigma)
: mU(u),
mPreComputedNonExpPart(1.0f / sqrtf(2.0f * M_PI_F
* GeometryUtils::SQUARE_FLOAT(sigma))),
mPreComputedExponentPart(-1.0f / (2.0f * GeometryUtils::SQUARE_FLOAT(sigma))) {}
float getProbabilityDensity(const float x) const {
const float shiftedX = x - mU;
return mPreComputedNonExpPart
* expf(mPreComputedExponentPart * GeometryUtils::SQUARE_FLOAT(shiftedX));
}
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(NormalDistribution);
const float mU; // mean value
const float mPreComputedNonExpPart; // = 1 / sqrt(2 * PI * sigma^2)
const float mPreComputedExponentPart; // = -1 / (2 * sigma^2)
}; // struct NormalDistribution
private: private:
DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoUtils); DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoUtils);