Loading native/jni/src/proximity_info_params.cpp +55 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ * limitations under the License. */ #include "defines.h" #include "proximity_info_params.h" namespace latinime { Loading @@ -26,10 +27,17 @@ const int ProximityInfoParams::NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR = 1 << NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR_LOG_2; const float ProximityInfoParams::NOT_A_DISTANCE_FLOAT = -1.0f; // Per method constants /* Per method constants */ // Used by ProximityInfoStateUtils::initGeometricDistanceInfos() const float ProximityInfoParams::NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD = 4.0f; // Used by ProximityInfoStateUtils::updateNearKeysDistances() const float ProximityInfoParams::NEAR_KEY_THRESHOLD_FOR_DISTANCE = 2.0f; // Used by ProximityInfoStateUtils::isPrevLocalMin() const float ProximityInfoParams::MARGIN_FOR_PREV_LOCAL_MIN = 0.01f; // Used by ProximityInfoStateUtils::getPointScore() const int ProximityInfoParams::DISTANCE_BASE_SCALE = 100; const float ProximityInfoParams::NEAR_KEY_THRESHOLD_FOR_POINT_SCORE = 0.6f; const int ProximityInfoParams::CORNER_CHECK_DISTANCE_THRESHOLD_SCALE = 25; Loading @@ -39,6 +47,52 @@ const float ProximityInfoParams::CORNER_ANGLE_THRESHOLD_FOR_POINT_SCORE = M_PI_F const float ProximityInfoParams::CORNER_SUM_ANGLE_THRESHOLD = M_PI_F / 4.0f; const float ProximityInfoParams::CORNER_SCORE = 1.0f; // Used by ProximityInfoStateUtils::refreshSpeedRates() const int ProximityInfoParams::NUM_POINTS_FOR_SPEED_CALCULATION = 2; // Used by ProximityInfoStateUtils::pushTouchPoint() const int ProximityInfoParams::LAST_POINT_SKIP_DISTANCE_SCALE = 4; // Used by ProximityInfoStateUtils::updateAlignPointProbabilities() const float ProximityInfoParams::MIN_PROBABILITY = 0.000001f; const float ProximityInfoParams::MAX_SKIP_PROBABILITY = 0.95f; const float ProximityInfoParams::SKIP_FIRST_POINT_PROBABILITY = 0.01f; const float ProximityInfoParams::SKIP_LAST_POINT_PROBABILITY = 0.1f; const float ProximityInfoParams::MIN_SPEED_RATE_FOR_SKIP_PROBABILITY = 0.15f; const float ProximityInfoParams::SPEED_WEIGHT_FOR_SKIP_PROBABILITY = 0.9f; const float ProximityInfoParams::SLOW_STRAIGHT_WEIGHT_FOR_SKIP_PROBABILITY = 0.6f; const float ProximityInfoParams::NEAREST_DISTANCE_WEIGHT = 0.5f; const float ProximityInfoParams::NEAREST_DISTANCE_BIAS = 0.5f; const float ProximityInfoParams::NEAREST_DISTANCE_WEIGHT_FOR_LAST = 0.6f; const float ProximityInfoParams::NEAREST_DISTANCE_BIAS_FOR_LAST = 0.4f; const float ProximityInfoParams::ANGLE_WEIGHT = 0.90f; const float ProximityInfoParams::DEEP_CORNER_ANGLE_THRESHOLD = M_PI_F * 60.0f / 180.0f; const float ProximityInfoParams::SKIP_DEEP_CORNER_PROBABILITY = 0.1f; const float ProximityInfoParams::CORNER_ANGLE_THRESHOLD = M_PI_F * 30.0f / 180.0f; const float ProximityInfoParams::STRAIGHT_ANGLE_THRESHOLD = M_PI_F * 15.0f / 180.0f; const float ProximityInfoParams::SKIP_CORNER_PROBABILITY = 0.4f; const float ProximityInfoParams::SPEED_MARGIN = 0.1f; const float ProximityInfoParams::CENTER_VALUE_OF_NORMALIZED_DISTRIBUTION = 0.0f; // TODO: The variance is critical for accuracy; thus, adjusting these parameter by machine // learning or something would be efficient. const float ProximityInfoParams::SPEEDxANGLE_WEIGHT_FOR_STANDARD_DIVIATION = 0.3f; const float ProximityInfoParams::MAX_SPEEDxANGLE_RATE_FOR_STANDERD_DIVIATION = 0.25f; const float ProximityInfoParams::SPEEDxNEAREST_WEIGHT_FOR_STANDARD_DIVIATION = 0.5f; const float ProximityInfoParams::MAX_SPEEDxNEAREST_RATE_FOR_STANDERD_DIVIATION = 0.15f; const float ProximityInfoParams::MIN_STANDERD_DIVIATION = 0.37f; const float ProximityInfoParams::PREV_DISTANCE_WEIGHT = 0.5f; const float ProximityInfoParams::NEXT_DISTANCE_WEIGHT = 0.6f; // Used by ProximityInfoStateUtils::suppressCharProbabilities() const float ProximityInfoParams::SUPPRESSION_LENGTH_WEIGHT = 1.5f; const float ProximityInfoParams::MIN_SUPPRESSION_RATE = 0.1f; const float ProximityInfoParams::SUPPRESSION_WEIGHT = 0.5f; const float ProximityInfoParams::SUPPRESSION_WEIGHT_FOR_PROBABILITY_GAIN = 0.1f; const float ProximityInfoParams::SKIP_PROBABALITY_WEIGHT_FOR_PROBABILITY_GAIN = 0.3f; // Used by ProximityInfoStateUtils::getMostProbableString() const float ProximityInfoParams::DEMOTION_LOG_PROBABILITY = 0.3f; // TODO: Investigate if this is required const float ProximityInfoParams::SEARCH_KEY_RADIUS_RATIO = 0.95f; } // namespace latinime native/jni/src/proximity_info_params.h +44 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,50 @@ class ProximityInfoParams { static const float CORNER_SUM_ANGLE_THRESHOLD; static const float CORNER_SCORE; // Used by ProximityInfoStateUtils::refreshSpeedRates() static const int NUM_POINTS_FOR_SPEED_CALCULATION; // Used by ProximityInfoStateUtils::pushTouchPoint() static const int LAST_POINT_SKIP_DISTANCE_SCALE; // Used by ProximityInfoStateUtils::updateAlignPointProbabilities() static const float MIN_PROBABILITY; static const float MAX_SKIP_PROBABILITY; static const float SKIP_FIRST_POINT_PROBABILITY; static const float SKIP_LAST_POINT_PROBABILITY; static const float MIN_SPEED_RATE_FOR_SKIP_PROBABILITY; static const float SPEED_WEIGHT_FOR_SKIP_PROBABILITY; static const float SLOW_STRAIGHT_WEIGHT_FOR_SKIP_PROBABILITY; static const float NEAREST_DISTANCE_WEIGHT; static const float NEAREST_DISTANCE_BIAS; static const float NEAREST_DISTANCE_WEIGHT_FOR_LAST; static const float NEAREST_DISTANCE_BIAS_FOR_LAST; static const float ANGLE_WEIGHT; static const float DEEP_CORNER_ANGLE_THRESHOLD; static const float SKIP_DEEP_CORNER_PROBABILITY; static const float CORNER_ANGLE_THRESHOLD; static const float STRAIGHT_ANGLE_THRESHOLD; static const float SKIP_CORNER_PROBABILITY; static const float SPEED_MARGIN; static const float CENTER_VALUE_OF_NORMALIZED_DISTRIBUTION; static const float SPEEDxANGLE_WEIGHT_FOR_STANDARD_DIVIATION; static const float MAX_SPEEDxANGLE_RATE_FOR_STANDERD_DIVIATION; static const float SPEEDxNEAREST_WEIGHT_FOR_STANDARD_DIVIATION; static const float MAX_SPEEDxNEAREST_RATE_FOR_STANDERD_DIVIATION; static const float MIN_STANDERD_DIVIATION; static const float PREV_DISTANCE_WEIGHT; static const float NEXT_DISTANCE_WEIGHT; // Used by ProximityInfoStateUtils::suppressCharProbabilities() static const float SUPPRESSION_LENGTH_WEIGHT; static const float MIN_SUPPRESSION_RATE; static const float SUPPRESSION_WEIGHT; static const float SUPPRESSION_WEIGHT_FOR_PROBABILITY_GAIN; static const float SKIP_PROBABALITY_WEIGHT_FOR_PROBABILITY_GAIN; // Used by ProximityInfoStateUtils::getMostProbableString() static const float DEMOTION_LOG_PROBABILITY; private: DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoParams); static const int NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR_LOG_2; Loading native/jni/src/proximity_info_state.cpp +16 −17 Original line number Diff line number Diff line Loading @@ -89,29 +89,28 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi } if (xCoordinates && yCoordinates) { mSampledInputSize = ProximityInfoStateUtils::updateTouchPoints( mProximityInfo->getMostCommonKeyWidth(), mProximityInfo, mMaxPointToKeyLength, mInputProximities, xCoordinates, yCoordinates, times, pointerIds, inputSize, isGeometric, pointerId, pushTouchPointStartIndex, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice); mSampledInputSize = ProximityInfoStateUtils::updateTouchPoints(mProximityInfo, mMaxPointToKeyLength, mInputProximities, xCoordinates, yCoordinates, times, pointerIds, inputSize, isGeometric, pointerId, pushTouchPointStartIndex, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice); } if (mSampledInputSize > 0 && isGeometric) { mAverageSpeed = ProximityInfoStateUtils::refreshSpeedRates( inputSize, xCoordinates, yCoordinates, times, lastSavedInputSize, mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice, &mSpeedRates, &mDirections); ProximityInfoStateUtils::refreshBeelineSpeedRates( mProximityInfo->getMostCommonKeyWidth(), mAverageSpeed, inputSize, xCoordinates, yCoordinates, times, mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledInputIndice, &mBeelineSpeedPercentiles); mAverageSpeed = ProximityInfoStateUtils::refreshSpeedRates(inputSize, xCoordinates, yCoordinates, times, lastSavedInputSize, mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice, &mSpeedRates, &mDirections); ProximityInfoStateUtils::refreshBeelineSpeedRates(mProximityInfo->getMostCommonKeyWidth(), mAverageSpeed, inputSize, xCoordinates, yCoordinates, times, mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledInputIndice, &mBeelineSpeedPercentiles); } if (mSampledInputSize > 0) { ProximityInfoStateUtils::initGeometricDistanceInfos( mProximityInfo, mProximityInfo->getKeyCount(), mSampledInputSize, lastSavedInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledNearKeysVector, &mSampledDistanceCache_G); ProximityInfoStateUtils::initGeometricDistanceInfos(mProximityInfo, mSampledInputSize, lastSavedInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledNearKeysVector, &mSampledDistanceCache_G); if (isGeometric) { // updates probabilities of skipping or mapping each key for all points. ProximityInfoStateUtils::updateAlignPointProbabilities( Loading Loading
native/jni/src/proximity_info_params.cpp +55 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ * limitations under the License. */ #include "defines.h" #include "proximity_info_params.h" namespace latinime { Loading @@ -26,10 +27,17 @@ const int ProximityInfoParams::NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR = 1 << NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR_LOG_2; const float ProximityInfoParams::NOT_A_DISTANCE_FLOAT = -1.0f; // Per method constants /* Per method constants */ // Used by ProximityInfoStateUtils::initGeometricDistanceInfos() const float ProximityInfoParams::NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD = 4.0f; // Used by ProximityInfoStateUtils::updateNearKeysDistances() const float ProximityInfoParams::NEAR_KEY_THRESHOLD_FOR_DISTANCE = 2.0f; // Used by ProximityInfoStateUtils::isPrevLocalMin() const float ProximityInfoParams::MARGIN_FOR_PREV_LOCAL_MIN = 0.01f; // Used by ProximityInfoStateUtils::getPointScore() const int ProximityInfoParams::DISTANCE_BASE_SCALE = 100; const float ProximityInfoParams::NEAR_KEY_THRESHOLD_FOR_POINT_SCORE = 0.6f; const int ProximityInfoParams::CORNER_CHECK_DISTANCE_THRESHOLD_SCALE = 25; Loading @@ -39,6 +47,52 @@ const float ProximityInfoParams::CORNER_ANGLE_THRESHOLD_FOR_POINT_SCORE = M_PI_F const float ProximityInfoParams::CORNER_SUM_ANGLE_THRESHOLD = M_PI_F / 4.0f; const float ProximityInfoParams::CORNER_SCORE = 1.0f; // Used by ProximityInfoStateUtils::refreshSpeedRates() const int ProximityInfoParams::NUM_POINTS_FOR_SPEED_CALCULATION = 2; // Used by ProximityInfoStateUtils::pushTouchPoint() const int ProximityInfoParams::LAST_POINT_SKIP_DISTANCE_SCALE = 4; // Used by ProximityInfoStateUtils::updateAlignPointProbabilities() const float ProximityInfoParams::MIN_PROBABILITY = 0.000001f; const float ProximityInfoParams::MAX_SKIP_PROBABILITY = 0.95f; const float ProximityInfoParams::SKIP_FIRST_POINT_PROBABILITY = 0.01f; const float ProximityInfoParams::SKIP_LAST_POINT_PROBABILITY = 0.1f; const float ProximityInfoParams::MIN_SPEED_RATE_FOR_SKIP_PROBABILITY = 0.15f; const float ProximityInfoParams::SPEED_WEIGHT_FOR_SKIP_PROBABILITY = 0.9f; const float ProximityInfoParams::SLOW_STRAIGHT_WEIGHT_FOR_SKIP_PROBABILITY = 0.6f; const float ProximityInfoParams::NEAREST_DISTANCE_WEIGHT = 0.5f; const float ProximityInfoParams::NEAREST_DISTANCE_BIAS = 0.5f; const float ProximityInfoParams::NEAREST_DISTANCE_WEIGHT_FOR_LAST = 0.6f; const float ProximityInfoParams::NEAREST_DISTANCE_BIAS_FOR_LAST = 0.4f; const float ProximityInfoParams::ANGLE_WEIGHT = 0.90f; const float ProximityInfoParams::DEEP_CORNER_ANGLE_THRESHOLD = M_PI_F * 60.0f / 180.0f; const float ProximityInfoParams::SKIP_DEEP_CORNER_PROBABILITY = 0.1f; const float ProximityInfoParams::CORNER_ANGLE_THRESHOLD = M_PI_F * 30.0f / 180.0f; const float ProximityInfoParams::STRAIGHT_ANGLE_THRESHOLD = M_PI_F * 15.0f / 180.0f; const float ProximityInfoParams::SKIP_CORNER_PROBABILITY = 0.4f; const float ProximityInfoParams::SPEED_MARGIN = 0.1f; const float ProximityInfoParams::CENTER_VALUE_OF_NORMALIZED_DISTRIBUTION = 0.0f; // TODO: The variance is critical for accuracy; thus, adjusting these parameter by machine // learning or something would be efficient. const float ProximityInfoParams::SPEEDxANGLE_WEIGHT_FOR_STANDARD_DIVIATION = 0.3f; const float ProximityInfoParams::MAX_SPEEDxANGLE_RATE_FOR_STANDERD_DIVIATION = 0.25f; const float ProximityInfoParams::SPEEDxNEAREST_WEIGHT_FOR_STANDARD_DIVIATION = 0.5f; const float ProximityInfoParams::MAX_SPEEDxNEAREST_RATE_FOR_STANDERD_DIVIATION = 0.15f; const float ProximityInfoParams::MIN_STANDERD_DIVIATION = 0.37f; const float ProximityInfoParams::PREV_DISTANCE_WEIGHT = 0.5f; const float ProximityInfoParams::NEXT_DISTANCE_WEIGHT = 0.6f; // Used by ProximityInfoStateUtils::suppressCharProbabilities() const float ProximityInfoParams::SUPPRESSION_LENGTH_WEIGHT = 1.5f; const float ProximityInfoParams::MIN_SUPPRESSION_RATE = 0.1f; const float ProximityInfoParams::SUPPRESSION_WEIGHT = 0.5f; const float ProximityInfoParams::SUPPRESSION_WEIGHT_FOR_PROBABILITY_GAIN = 0.1f; const float ProximityInfoParams::SKIP_PROBABALITY_WEIGHT_FOR_PROBABILITY_GAIN = 0.3f; // Used by ProximityInfoStateUtils::getMostProbableString() const float ProximityInfoParams::DEMOTION_LOG_PROBABILITY = 0.3f; // TODO: Investigate if this is required const float ProximityInfoParams::SEARCH_KEY_RADIUS_RATIO = 0.95f; } // namespace latinime
native/jni/src/proximity_info_params.h +44 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,50 @@ class ProximityInfoParams { static const float CORNER_SUM_ANGLE_THRESHOLD; static const float CORNER_SCORE; // Used by ProximityInfoStateUtils::refreshSpeedRates() static const int NUM_POINTS_FOR_SPEED_CALCULATION; // Used by ProximityInfoStateUtils::pushTouchPoint() static const int LAST_POINT_SKIP_DISTANCE_SCALE; // Used by ProximityInfoStateUtils::updateAlignPointProbabilities() static const float MIN_PROBABILITY; static const float MAX_SKIP_PROBABILITY; static const float SKIP_FIRST_POINT_PROBABILITY; static const float SKIP_LAST_POINT_PROBABILITY; static const float MIN_SPEED_RATE_FOR_SKIP_PROBABILITY; static const float SPEED_WEIGHT_FOR_SKIP_PROBABILITY; static const float SLOW_STRAIGHT_WEIGHT_FOR_SKIP_PROBABILITY; static const float NEAREST_DISTANCE_WEIGHT; static const float NEAREST_DISTANCE_BIAS; static const float NEAREST_DISTANCE_WEIGHT_FOR_LAST; static const float NEAREST_DISTANCE_BIAS_FOR_LAST; static const float ANGLE_WEIGHT; static const float DEEP_CORNER_ANGLE_THRESHOLD; static const float SKIP_DEEP_CORNER_PROBABILITY; static const float CORNER_ANGLE_THRESHOLD; static const float STRAIGHT_ANGLE_THRESHOLD; static const float SKIP_CORNER_PROBABILITY; static const float SPEED_MARGIN; static const float CENTER_VALUE_OF_NORMALIZED_DISTRIBUTION; static const float SPEEDxANGLE_WEIGHT_FOR_STANDARD_DIVIATION; static const float MAX_SPEEDxANGLE_RATE_FOR_STANDERD_DIVIATION; static const float SPEEDxNEAREST_WEIGHT_FOR_STANDARD_DIVIATION; static const float MAX_SPEEDxNEAREST_RATE_FOR_STANDERD_DIVIATION; static const float MIN_STANDERD_DIVIATION; static const float PREV_DISTANCE_WEIGHT; static const float NEXT_DISTANCE_WEIGHT; // Used by ProximityInfoStateUtils::suppressCharProbabilities() static const float SUPPRESSION_LENGTH_WEIGHT; static const float MIN_SUPPRESSION_RATE; static const float SUPPRESSION_WEIGHT; static const float SUPPRESSION_WEIGHT_FOR_PROBABILITY_GAIN; static const float SKIP_PROBABALITY_WEIGHT_FOR_PROBABILITY_GAIN; // Used by ProximityInfoStateUtils::getMostProbableString() static const float DEMOTION_LOG_PROBABILITY; private: DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoParams); static const int NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR_LOG_2; Loading
native/jni/src/proximity_info_state.cpp +16 −17 Original line number Diff line number Diff line Loading @@ -89,29 +89,28 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi } if (xCoordinates && yCoordinates) { mSampledInputSize = ProximityInfoStateUtils::updateTouchPoints( mProximityInfo->getMostCommonKeyWidth(), mProximityInfo, mMaxPointToKeyLength, mInputProximities, xCoordinates, yCoordinates, times, pointerIds, inputSize, isGeometric, pointerId, pushTouchPointStartIndex, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice); mSampledInputSize = ProximityInfoStateUtils::updateTouchPoints(mProximityInfo, mMaxPointToKeyLength, mInputProximities, xCoordinates, yCoordinates, times, pointerIds, inputSize, isGeometric, pointerId, pushTouchPointStartIndex, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice); } if (mSampledInputSize > 0 && isGeometric) { mAverageSpeed = ProximityInfoStateUtils::refreshSpeedRates( inputSize, xCoordinates, yCoordinates, times, lastSavedInputSize, mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice, &mSpeedRates, &mDirections); ProximityInfoStateUtils::refreshBeelineSpeedRates( mProximityInfo->getMostCommonKeyWidth(), mAverageSpeed, inputSize, xCoordinates, yCoordinates, times, mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledInputIndice, &mBeelineSpeedPercentiles); mAverageSpeed = ProximityInfoStateUtils::refreshSpeedRates(inputSize, xCoordinates, yCoordinates, times, lastSavedInputSize, mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice, &mSpeedRates, &mDirections); ProximityInfoStateUtils::refreshBeelineSpeedRates(mProximityInfo->getMostCommonKeyWidth(), mAverageSpeed, inputSize, xCoordinates, yCoordinates, times, mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledInputIndice, &mBeelineSpeedPercentiles); } if (mSampledInputSize > 0) { ProximityInfoStateUtils::initGeometricDistanceInfos( mProximityInfo, mProximityInfo->getKeyCount(), mSampledInputSize, lastSavedInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledNearKeysVector, &mSampledDistanceCache_G); ProximityInfoStateUtils::initGeometricDistanceInfos(mProximityInfo, mSampledInputSize, lastSavedInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledNearKeysVector, &mSampledDistanceCache_G); if (isGeometric) { // updates probabilities of skipping or mapping each key for all points. ProximityInfoStateUtils::updateAlignPointProbabilities( Loading