Skip to content

Commit ec409ef

Browse files
committed
Randomise artisan switching
1 parent bf7e237 commit ec409ef

9 files changed

Lines changed: 170 additions & 93 deletions

File tree

src/openvic-simulation/economy/production/ArtisanalProducer.cpp

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "ArtisanalProducer.hpp"
22

33
#include <cstddef>
4-
#include <random>
4+
#include <XoshiroCpp.hpp>
55

66
#include "openvic-simulation/country/CountryInstance.hpp"
77
#include "openvic-simulation/economy/GoodDefinition.hpp"
@@ -14,6 +14,7 @@
1414
#include "openvic-simulation/pop/PopValuesFromProvince.hpp"
1515
#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
1616
#include "openvic-simulation/utility/Typedefs.hpp"
17+
#include "openvic-simulation/utility/WeightedSampling.hpp"
1718

1819
using namespace OpenVic;
1920

@@ -48,14 +49,21 @@ void ArtisanalProducer::set_production_type(ProductionType const* const new_prod
4849
void ArtisanalProducer::artisan_tick(
4950
Pop& pop,
5051
PopValuesFromProvince const& values_from_province,
52+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
5153
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
5254
memory::vector<fixed_point_t>& pop_max_quantity_to_buy_per_good,
5355
memory::vector<fixed_point_t>& pop_money_to_spend_per_good,
5456
memory::vector<fixed_point_t>& reusable_map_0,
5557
memory::vector<fixed_point_t>& reusable_map_1
5658
) {
5759
ProductionType const* const old_production_type = production_type_nullable;
58-
set_production_type(pick_production_type(pop, values_from_province));
60+
set_production_type(
61+
pick_production_type(
62+
pop,
63+
values_from_province,
64+
random_number_generator
65+
)
66+
);
5967
if (production_type_nullable == nullptr) {
6068
return;
6169
}
@@ -340,7 +348,8 @@ fixed_point_t ArtisanalProducer::calculate_production_type_score(
340348

341349
ProductionType const* ArtisanalProducer::pick_production_type(
342350
Pop& pop,
343-
PopValuesFromProvince const& values_from_province
351+
PopValuesFromProvince const& values_from_province,
352+
XoshiroCpp::Xoshiro128StarStar& random_number_generator
344353
) const {
345354
bool should_pick_new_production_type;
346355
const auto ranked_artisanal_production_types = values_from_province.get_ranked_artisanal_production_types();
@@ -396,25 +405,11 @@ ProductionType const* ArtisanalProducer::pick_production_type(
396405
weights_sum += weight;
397406
}
398407

399-
//TODO move to utilities or something
400-
std::random_device rd;
401-
std::mt19937 rng { rd() };
402-
std::uniform_int_distribution<fixed_point_t::value_type> distribution {
403-
fixed_point_t::_0.get_raw_value(),
404-
weights_sum.get_raw_value()
405-
};
406-
407-
const fixed_point_t random_number = fixed_point_t::parse_raw(distribution(rng));
408-
fixed_point_t weights_running_total = 0;
409-
ProductionType const* new_production_type = ranked_artisanal_production_types.back().first;
410-
for (auto it = weights.begin(); it < weights.end(); ++it) {
411-
weights_running_total += *it;
412-
if (random_number <= weights_running_total) {
413-
const size_t i = it - weights.begin();
414-
new_production_type = ranked_artisanal_production_types[i].first;
415-
break;
416-
}
417-
}
408+
const size_t sample_index = sample_weighted_index(
409+
random_number_generator(),
410+
weights,
411+
weights_sum
412+
);
418413

419-
return new_production_type;
414+
return ranked_artisanal_production_types[sample_index].first;
420415
}

src/openvic-simulation/economy/production/ArtisanalProducer.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
#include "openvic-simulation/types/PopSize.hpp"
99
#include "openvic-simulation/utility/Getters.hpp"
1010

11+
namespace XoshiroCpp {
12+
class Xoshiro128StarStar;
13+
}
14+
1115
namespace OpenVic {
1216
struct GoodDefinition;
1317
struct GoodInstanceManager;
@@ -31,7 +35,8 @@ namespace OpenVic {
3135
void set_production_type(ProductionType const* const new_production_type);
3236
ProductionType const* pick_production_type(
3337
Pop& pop,
34-
PopValuesFromProvince const& values_from_province
38+
PopValuesFromProvince const& values_from_province,
39+
XoshiroCpp::Xoshiro128StarStar& random_number_generator
3540
) const;
3641

3742
static fixed_point_t calculate_production_type_score(
@@ -57,6 +62,7 @@ namespace OpenVic {
5762
void artisan_tick(
5863
Pop& pop,
5964
PopValuesFromProvince const& values_from_province,
65+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
6066
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
6167
memory::vector<fixed_point_t>& pop_max_quantity_to_buy_per_good,
6268
memory::vector<fixed_point_t>& pop_money_to_spend_per_good,

src/openvic-simulation/map/ProvinceInstance.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ void ProvinceInstance::update_gamestate(InstanceManager const& instance_manager)
389389
void ProvinceInstance::province_tick(
390390
const Date today,
391391
PopValuesFromProvince& reusable_pop_values,
392+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
392393
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
393394
utility::forwardable_span<
394395
memory::vector<fixed_point_t>,
@@ -402,7 +403,12 @@ void ProvinceInstance::province_tick(
402403
if (!pops.empty()) {
403404
reusable_pop_values.update_pop_values_from_province(*this);
404405
for (Pop& pop : pops) {
405-
pop.pop_tick(reusable_pop_values, reusable_goods_mask, reusable_vectors);
406+
pop.pop_tick(
407+
reusable_pop_values,
408+
random_number_generator,
409+
reusable_goods_mask,
410+
reusable_vectors
411+
);
406412
}
407413
}
408414

@@ -513,14 +519,21 @@ bool ProvinceInstance::apply_history_to_province(ProvinceHistoryEntry const& ent
513519
void ProvinceInstance::initialise_for_new_game(
514520
const Date today,
515521
PopValuesFromProvince& reusable_pop_values,
522+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
516523
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
517524
utility::forwardable_span<
518525
memory::vector<fixed_point_t>,
519526
VECTORS_FOR_PROVINCE_TICK
520527
> reusable_vectors
521528
) {
522529
initialise_rgo();
523-
province_tick(today, reusable_pop_values, reusable_goods_mask, reusable_vectors);
530+
province_tick(
531+
today,
532+
reusable_pop_values,
533+
random_number_generator,
534+
reusable_goods_mask,
535+
reusable_vectors
536+
);
524537
}
525538

526539
void ProvinceInstance::initialise_rgo() {

src/openvic-simulation/map/ProvinceInstance.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ namespace OpenVic {
195195
void province_tick(
196196
const Date today,
197197
PopValuesFromProvince& reusable_pop_values,
198+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
198199
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
199200
utility::forwardable_span<
200201
memory::vector<fixed_point_t>,
@@ -204,6 +205,7 @@ namespace OpenVic {
204205
void initialise_for_new_game(
205206
const Date today,
206207
PopValuesFromProvince& reusable_pop_values,
208+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
207209
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
208210
utility::forwardable_span<
209211
memory::vector<fixed_point_t>,

src/openvic-simulation/pop/Pop.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,8 @@ void Pop::allocate_for_needs(
424424
}
425425

426426
void Pop::pop_tick(
427-
PopValuesFromProvince& shared_values,
427+
PopValuesFromProvince const& shared_values,
428+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
428429
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
429430
utility::forwardable_span<
430431
memory::vector<fixed_point_t>,
@@ -433,6 +434,7 @@ void Pop::pop_tick(
433434
) {
434435
pop_tick_without_cleanup(
435436
shared_values,
437+
random_number_generator,
436438
reusable_goods_mask,
437439
reusable_vectors
438440
);
@@ -442,7 +444,8 @@ void Pop::pop_tick(
442444
}
443445

444446
void Pop::pop_tick_without_cleanup(
445-
PopValuesFromProvince& shared_values,
447+
PopValuesFromProvince const& shared_values,
448+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
446449
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
447450
utility::forwardable_span<
448451
memory::vector<fixed_point_t>,
@@ -466,6 +469,7 @@ void Pop::pop_tick_without_cleanup(
466469
artisanal_producer.artisan_tick(
467470
*this,
468471
shared_values,
472+
random_number_generator,
469473
reusable_goods_mask,
470474
max_quantity_to_buy_per_good,
471475
money_to_spend_per_good,

src/openvic-simulation/pop/Pop.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ namespace OpenVic {
172172
fixed_point_t& cash_left_to_spend
173173
);
174174
void pop_tick_without_cleanup(
175-
PopValuesFromProvince& shared_values,
175+
PopValuesFromProvince const& shared_values,
176+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
176177
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
177178
utility::forwardable_span<
178179
memory::vector<fixed_point_t>,
@@ -210,7 +211,8 @@ namespace OpenVic {
210211
#undef DECLARE_POP_MONEY_STORE_FUNCTIONS
211212

212213
void pop_tick(
213-
PopValuesFromProvince& shared_values,
214+
PopValuesFromProvince const& shared_values,
215+
XoshiroCpp::Xoshiro128StarStar& random_number_generator,
214216
IndexedFlatMap<GoodDefinition, char>& reusable_goods_mask,
215217
utility::forwardable_span<
216218
memory::vector<fixed_point_t>,

0 commit comments

Comments
 (0)