#include "bimodalangle.h" #include "base.h" #include "coordinates.h" namespace motions { BimodalAngle::BimodalAngle(const double delta, const double eta, const double angle1, const double angle2, const double prob, std::mt19937_64 &rng) : BaseMotion(std::string("BimodalAngle"), delta, eta, rng), m_angle1(angle1 * M_PI / 180.0), m_angle2(angle2 * M_PI / 180.0), m_prob(prob) {} BimodalAngle::BimodalAngle(std::mt19937_64 &rng) : BaseMotion(std::string("BimodalAngle"), rng) {} void BimodalAngle::initialize() { m_prev_pos = draw_position(); m_initial_omega = omega_q(m_prev_pos); } double BimodalAngle::jump() { const double angle = m_uni_dist(m_rng) < m_prob ? m_angle1 : m_angle2; const double gamma{2 * M_PI * m_uni_dist(m_rng)}; m_prev_pos = rotate(m_prev_pos, angle, gamma); return omega_q(m_prev_pos); } void BimodalAngle::setParameters(const std::unordered_map ¶meter) { BaseMotion::setParameters(parameter); m_angle1 = parameter.at("angle1") * M_PI / 180.; m_angle2 = parameter.at("angle2") * M_PI / 180.; m_prob = parameter.at("probability1"); } std::unordered_map BimodalAngle::getParameters() const { auto parameter = BaseMotion::getParameters(); parameter["angle1"] = m_angle1 * 180 / M_PI; parameter["angle2"] = m_angle2 * 180 / M_PI; parameter["probality1"] = m_prob; return parameter; } std::string BimodalAngle::toString() const { return std::string{"BimodalAngle/angle1=" + std::to_string(m_angle1 * 180 / M_PI) + "/angle2=" + std::to_string(m_angle2 * 180 / M_PI) + "/probability1=" + std::to_string(m_prob)}; } }