@@ -61,6 +61,7 @@ namespace paxs {
61
61
double immigrant_f64 = 0 ;
62
62
double increased_immigration = 0 ;
63
63
std::uint_least32_t mtdna_region_hash = 0 ;
64
+ std::uint_least32_t language_region_hash = 0 ;
64
65
65
66
std::uint_least32_t direction_min_distance = 100 ;
66
67
// std::array<double, 8> direction_weight{};
@@ -78,6 +79,41 @@ namespace paxs {
78
79
return (menu.find (str_) != menu.end ()) ? menu.at (str_) : SIZE_MAX;
79
80
}
80
81
82
+ void inputLanguage_List (const std::string& japan_provinces_path) noexcept {
83
+
84
+ const std::string path = japan_provinces_path + " /Language_List.tsv" ;
85
+
86
+ paxs::InputFile language_tsv (AppConfig::getInstance ()->getRootPath () + path);
87
+ if (language_tsv.fail ()) {
88
+ PAXS_WARNING (" Failed to read Language_List TSV file: " + path);
89
+ return ;
90
+ }
91
+ // 1 行目を読み込む
92
+ if (!(language_tsv.getLine ())) {
93
+ return ; // 何もない場合
94
+ }
95
+ // BOM を削除
96
+ language_tsv.deleteBOM ();
97
+ // 1 行目を分割する
98
+ std::unordered_map<std::uint_least32_t , std::size_t > menu = language_tsv.splitHashMapMurMur3 (' \t ' );
99
+ std::size_t i = 1 ;
100
+
101
+ // 1 行ずつ読み込み(区切りはタブ)
102
+ while (language_tsv.getLine ()) {
103
+ std::vector<std::string> sub_menu_v = language_tsv.split (' \t ' );
104
+ if (
105
+ sub_menu_v.size () <= getMenuIndex (menu, MurMur3::calcHash (" language" ))
106
+ ) {
107
+ PAXS_WARNING (" Failed to read Japan Language_List TSV file: " + path + " at line " + std::to_string (i));
108
+ ++i;
109
+ continue ;
110
+ }
111
+ language_list.emplace_back (sub_menu_v[menu[MurMur3::calcHash (" language" )]]);
112
+ ++i;
113
+ }
114
+
115
+ }
116
+
81
117
void inputMtDNA_List (const std::string& japan_provinces_path) noexcept {
82
118
83
119
const std::string path = japan_provinces_path + " /mtDNA_List.tsv" ;
@@ -113,6 +149,72 @@ namespace paxs {
113
149
114
150
}
115
151
152
+ void inputLanguage_Region (const std::string& japan_provinces_path) noexcept {
153
+
154
+ const std::string path = japan_provinces_path + " /Language.tsv" ;
155
+
156
+ paxs::InputFile language_tsv (AppConfig::getInstance ()->getRootPath () + path);
157
+ if (language_tsv.fail ()) {
158
+ PAXS_WARNING (" Failed to read Language TSV file: " + path);
159
+ return ;
160
+ }
161
+ // 1 行目を読み込む
162
+ if (!(language_tsv.getLine ())) {
163
+ return ; // 何もない場合
164
+ }
165
+ // BOM を削除
166
+ language_tsv.deleteBOM ();
167
+ // 1 行目を分割する
168
+ std::unordered_map<std::uint_least32_t , std::size_t > menu = language_tsv.splitHashMapMurMur3 (' \t ' );
169
+ #ifdef PAXS_DEVELOPMENT
170
+ std::size_t i = 1 ;
171
+ #endif
172
+
173
+ // 1 行ずつ読み込み(区切りはタブ)
174
+ while (language_tsv.getLine ()) {
175
+ std::vector<std::string> sub_menu_v = language_tsv.split (' \t ' );
176
+ if (
177
+ sub_menu_v.size () <= getMenuIndex (menu, MurMur3::calcHash (" language_region" )) ||
178
+ sub_menu_v.size () <= getMenuIndex (menu, MurMur3::calcHash (" language_dist" ))
179
+ ) {
180
+ #ifdef PAXS_DEVELOPMENT
181
+ PAXS_WARNING (" Failed to read Japan Language TSV file: " + path + " at line " + std::to_string (i));
182
+ #endif
183
+ continue ;
184
+ }
185
+
186
+ mtDNA_Region language_region;
187
+ std::vector<std::string> dist = paxs::StringExtensions::split (sub_menu_v[menu[MurMur3::calcHash (" language_dist" )]], ' /' );
188
+
189
+ if (dist.size () % 2 == 1 ) {
190
+ continue ;
191
+ }
192
+ if (dist.size () <= 1 ) {
193
+ continue ;
194
+ }
195
+ for (int j = 0 ; j < dist.size (); j += 2 ) {
196
+ for (int k = 0 ; k < language_list.size (); ++k) {
197
+ // 言語 の名称の index を取得し、確率分布と一緒に管理
198
+ if (language_list[k] == dist[j]) {
199
+ language_region.id .emplace_back (k);
200
+ language_region.weight .emplace_back (std::stod (dist[j + 1 ]));
201
+ break ;
202
+ }
203
+ }
204
+ }
205
+ // 確率分布を生成
206
+ language_region.dist = std::discrete_distribution<>(language_region.weight .begin (), language_region.weight .end ());
207
+
208
+ // mtDNA 地方区分のハッシュ
209
+ const std::string& mtdna_region_str = sub_menu_v[menu[MurMur3::calcHash (" haplo_group_region" )]];
210
+ language_region_list.emplace (MurMur3::calcHash (mtdna_region_str.size (), mtdna_region_str.c_str ()), language_region);
211
+
212
+ #ifdef PAXS_DEVELOPMENT
213
+ ++i;
214
+ #endif
215
+ }
216
+ }
217
+
116
218
void inputMtDNA_Region (const std::string& japan_provinces_path) noexcept {
117
219
118
220
const std::string path = japan_provinces_path + " /mtDNA.tsv" ;
@@ -244,6 +346,9 @@ namespace paxs {
244
346
245
347
const std::string& mtdna_region_str = sub_menu_v[menu[MurMur3::calcHash (" mtdna_region" )]];
246
348
district.mtdna_region_hash = MurMur3::calcHash (mtdna_region_str.size (), mtdna_region_str.c_str ());
349
+
350
+ const std::string& language_region_str = sub_menu_v[menu[MurMur3::calcHash (" language_region" )]];
351
+ district.language_region_hash = MurMur3::calcHash (language_region_str.size (), language_region_str.c_str ());
247
352
district_list.emplace_back (district);
248
353
++i;
249
354
}
@@ -257,6 +362,8 @@ namespace paxs {
257
362
258
363
inputMtDNA_List (japan_provinces_path);
259
364
inputMtDNA_Region (japan_provinces_path);
365
+ inputLanguage_List (japan_provinces_path);
366
+ inputLanguage_Region (japan_provinces_path);
260
367
inputDistrict (japan_provinces_path);
261
368
}
262
369
@@ -357,6 +464,25 @@ namespace paxs {
357
464
358
465
return district_list[0 ];
359
466
}
467
+ std::uint_least8_t getLanguage (const std::uint_least8_t id, std::mt19937& gen) noexcept {
468
+ for (const auto & district : district_list) {
469
+ if (district.id == id) {
470
+ auto & weight_list = language_region_list.at (district.language_region_hash );
471
+ return weight_list.id [weight_list.dist (gen)];
472
+ }
473
+ }
474
+ PAXS_WARNING (" Failed to get District: " + std::to_string (id));
475
+
476
+ auto & weight_list = language_region_list.at (district_list[0 ].language_region_hash );
477
+ return weight_list.id [weight_list.dist (gen)];
478
+ }
479
+ const std::string& getLanguage_Name (const std::uint_least8_t id) const noexcept {
480
+ return language_list[id];
481
+ }
482
+ std::size_t getSizeLanguage () const noexcept {
483
+ return language_list.size ();
484
+ }
485
+
360
486
std::uint_least8_t getMtDNA (const std::uint_least8_t id, std::mt19937& gen) noexcept {
361
487
for (const auto & district : district_list) {
362
488
if (district.id == id) {
@@ -418,8 +544,10 @@ namespace paxs {
418
544
std::vector<JapanRegion> japan_regions; // 日本の地方区分
419
545
std::vector<District> district_list; // 日本の地区
420
546
std::unordered_map<std::uint_least32_t , mtDNA_Region> mtdna_region_list; // mtDNA 地方区分
547
+ std::unordered_map<std::uint_least32_t , mtDNA_Region> language_region_list; // 言語 地方区分
421
548
// std::vector<std::uint_least32_t> mtdna_region_hash_list; // mtDNA ハッシュ計算用
422
549
std::vector<std::string> mtdna_list; // mtDNA
550
+ std::vector<std::string> language_list; // 言語
423
551
};
424
552
425
553
}
0 commit comments