Scorum
odds.cpp
Go to the documentation of this file.
2 
3 namespace scorum {
4 namespace protocol {
5 
6 void odds::initialize(const odds_value_type& base_n, const odds_value_type& base_d)
7 {
8  FC_ASSERT(base_n > 0, "Numerator must be positive and non zero");
9  FC_ASSERT(base_d > 0, "Denominator must be positive and non zero");
10  FC_ASSERT(base_n > base_d, "Numerator must be more then denominator (inverted probability = (0, 1))");
11  auto base = utils::make_fraction(base_n, base_d);
12  _base = std::tie(base.numerator, base.denominator);
13  auto simplified = base.simplify();
14  _simplified = std::tie(simplified.numerator, simplified.denominator);
15  auto inverted = simplified.coup().invert();
16  _inverted = std::tie(inverted.denominator, inverted.numerator);
17 }
18 
20 {
21  return utils::make_fraction(std::get<0>(_base), std::get<1>(_base));
22 }
23 
25 {
26  return utils::make_fraction(std::get<0>(_simplified), std::get<1>(_simplified));
27 }
28 
30 {
31  return utils::make_fraction(std::get<0>(_inverted), std::get<1>(_inverted));
32 }
33 
34 odds odds::from_string(const std::string& from)
35 {
36  // read english format
37  std::string s = fc::trim(from);
38  auto slash_pos = s.find('/');
39  FC_ASSERT(std::string::npos != slash_pos);
40 
41  auto n_str = s.substr(0, slash_pos);
42  FC_ASSERT(!n_str.empty());
43  auto n = fc::to_int64(n_str);
44  FC_ASSERT(n > 0 && n <= (int64_t)std::numeric_limits<odds_value_type>::max());
45 
46  auto d_str = s.substr(slash_pos + 1);
47  FC_ASSERT(!d_str.empty());
48  auto d = fc::to_int64(d_str);
49  FC_ASSERT(d > 0 && d <= (int64_t)std::numeric_limits<odds_value_type>::max());
50 
51  return utils::make_fraction((odds_value_type)n, (odds_value_type)d);
52 }
53 
54 std::string odds::to_string() const
55 {
56  auto f = base();
57  std::string result = fc::to_string(f.numerator);
58  result += '/';
59  result += fc::to_string(f.denominator);
60  return result;
61 }
62 }
63 }
64 
65 namespace fc {
66 void to_variant(const scorum::protocol::odds& var, fc::variant& vo)
67 {
68  auto base = var.base();
69  vo = fc::mutable_variant_object()("numerator", base.numerator)("denominator", base.denominator);
70 }
71 
72 void from_variant(const fc::variant& var, scorum::protocol::odds& vo)
73 {
74  using namespace scorum::protocol;
75 
76  const auto& variant_obj = var.get_object();
77  auto numerator = variant_obj["numerator"].as<odds_value_type>();
78  auto denominator = variant_obj["denominator"].as<odds_value_type>();
79 
80  vo = scorum::protocol::odds{ numerator, denominator };
81 }
82 } // namespace fc
std::string to_string() const
Definition: odds.cpp:54
static odds from_string(const std::string &from)
Definition: odds.cpp:34
odds_fraction_type simplified() const
Definition: odds.cpp:24
odds_fraction_type base() const
Definition: odds.cpp:19
odds_fraction_type inverted() const
Definition: odds.cpp:29
Definition: game.cpp:4
void to_variant(const game_type &game, fc::variant &var)
Definition: game.cpp:8
void from_variant(const fc::variant &var, game_type &game)
Definition: game.cpp:12
utils::fraction< odds_value_type, odds_value_type > odds_fraction_type
Definition: odds.hpp:11
int32_t odds_value_type
Definition: odds.hpp:10
Definition: asset.cpp:15