diff options
Diffstat (limited to 'generator')
| -rw-r--r-- | generator/generator.cpp | 135 | ||||
| -rw-r--r-- | generator/generator.h | 8 |
2 files changed, 143 insertions, 0 deletions
| diff --git a/generator/generator.cpp b/generator/generator.cpp index 1c3b5c4..aaf546c 100644 --- a/generator/generator.cpp +++ b/generator/generator.cpp | |||
| @@ -530,6 +530,138 @@ void generator::run() { | |||
| 530 | } | 530 | } |
| 531 | } | 531 | } |
| 532 | 532 | ||
| 533 | // Red/Blue Bottom | ||
| 534 | std::unordered_map<size_t, std::set<size_t>> meronyms_by_holonym; | ||
| 535 | { | ||
| 536 | std::list<std::string> lines(readFile(wordNetPath_ + "wn_mm.pl")); | ||
| 537 | hatkirby::progress ppgs("Reading member meronymy...", lines.size()); | ||
| 538 | for (auto line : lines) { | ||
| 539 | ppgs.update(); | ||
| 540 | |||
| 541 | std::regex relation("^mm\\((1\\d{8}),(1\\d{8})\\)\\."); | ||
| 542 | std::smatch relation_data; | ||
| 543 | if (!std::regex_search(line, relation_data, relation)) { | ||
| 544 | continue; | ||
| 545 | } | ||
| 546 | |||
| 547 | int lookup1 = std::stoi(relation_data[1]); | ||
| 548 | int lookup2 = std::stoi(relation_data[2]); | ||
| 549 | |||
| 550 | if (synset_by_wnid_.count(lookup1) && synset_by_wnid_.count(lookup2)) { | ||
| 551 | for (size_t word_id1 : synsets_.at(synset_by_wnid_.at(lookup1))) { | ||
| 552 | for (size_t word_id2 : synsets_.at(synset_by_wnid_.at(lookup2))) { | ||
| 553 | meronyms_by_holonym[word_id1].insert(word_id2); | ||
| 554 | } | ||
| 555 | } | ||
| 556 | } | ||
| 557 | } | ||
| 558 | } | ||
| 559 | |||
| 560 | { | ||
| 561 | std::list<std::string> lines(readFile(wordNetPath_ + "wn_mp.pl")); | ||
| 562 | hatkirby::progress ppgs("Reading part meronymy...", lines.size()); | ||
| 563 | for (auto line : lines) { | ||
| 564 | ppgs.update(); | ||
| 565 | |||
| 566 | std::regex relation("^mp\\((1\\d{8}),(1\\d{8})\\)\\."); | ||
| 567 | std::smatch relation_data; | ||
| 568 | if (!std::regex_search(line, relation_data, relation)) { | ||
| 569 | continue; | ||
| 570 | } | ||
| 571 | |||
| 572 | int lookup1 = std::stoi(relation_data[1]); | ||
| 573 | int lookup2 = std::stoi(relation_data[2]); | ||
| 574 | |||
| 575 | if (synset_by_wnid_.count(lookup1) && synset_by_wnid_.count(lookup2)) { | ||
| 576 | for (size_t word_id1 : synsets_.at(synset_by_wnid_.at(lookup1))) { | ||
| 577 | for (size_t word_id2 : synsets_.at(synset_by_wnid_.at(lookup2))) { | ||
| 578 | meronyms_by_holonym[word_id1].insert(word_id2); | ||
| 579 | } | ||
| 580 | } | ||
| 581 | } | ||
| 582 | } | ||
| 583 | } | ||
| 584 | |||
| 585 | { | ||
| 586 | std::list<std::string> lines(readFile(wordNetPath_ + "wn_ms.pl")); | ||
| 587 | hatkirby::progress ppgs("Reading substance meronymy...", lines.size()); | ||
| 588 | for (auto line : lines) { | ||
| 589 | ppgs.update(); | ||
| 590 | |||
| 591 | std::regex relation("^ms\\((1\\d{8}),(1\\d{8})\\)\\."); | ||
| 592 | std::smatch relation_data; | ||
| 593 | if (!std::regex_search(line, relation_data, relation)) { | ||
| 594 | continue; | ||
| 595 | } | ||
| 596 | |||
| 597 | int lookup1 = std::stoi(relation_data[1]); | ||
| 598 | int lookup2 = std::stoi(relation_data[2]); | ||
| 599 | |||
| 600 | if (synset_by_wnid_.count(lookup1) && synset_by_wnid_.count(lookup2)) { | ||
| 601 | for (size_t word_id1 : synsets_.at(synset_by_wnid_.at(lookup1))) { | ||
| 602 | for (size_t word_id2 : synsets_.at(synset_by_wnid_.at(lookup2))) { | ||
| 603 | meronyms_by_holonym[word_id1].insert(word_id2); | ||
| 604 | } | ||
| 605 | } | ||
| 606 | } | ||
| 607 | } | ||
| 608 | } | ||
| 609 | |||
| 610 | { | ||
| 611 | hatkirby::progress ppgs("Generating red/blue bottom puzzles...", | ||
| 612 | meronyms_by_holonym.size()); | ||
| 613 | |||
| 614 | for (const auto& [holonym_id, meronym_ids] : meronyms_by_holonym) { | ||
| 615 | ppgs.update(); | ||
| 616 | |||
| 617 | for (size_t meronym_id : meronym_ids) { | ||
| 618 | const Word& holonym_word = words_.at(holonym_id); | ||
| 619 | const Word& meronym_word = words_.at(meronym_id); | ||
| 620 | |||
| 621 | Form& holonym_form = forms_.at(holonym_word.base_form_id); | ||
| 622 | Form& meronym_form = forms_.at(meronym_word.base_form_id); | ||
| 623 | |||
| 624 | holonym_form.puzzles[kBlueBottom].insert(meronym_form.id); | ||
| 625 | meronym_form.puzzles[kRedBottom].insert(holonym_form.id); | ||
| 626 | } | ||
| 627 | } | ||
| 628 | } | ||
| 629 | |||
| 630 | // Purple Top | ||
| 631 | { | ||
| 632 | hatkirby::progress ppgs("Generating purple top puzzles...", | ||
| 633 | pronunciations_by_rhyme_.size()); | ||
| 634 | |||
| 635 | for (const auto& [rhyme, pronunciation_ids] : pronunciations_by_rhyme_) { | ||
| 636 | ppgs.update(); | ||
| 637 | |||
| 638 | for (size_t p_id1 : pronunciation_ids) { | ||
| 639 | const Pronunciation& p1 = pronunciations_.at(p_id1); | ||
| 640 | if (p1.prerhyme.empty()) { | ||
| 641 | continue; | ||
| 642 | } | ||
| 643 | |||
| 644 | for (size_t p_id2 : pronunciation_ids) { | ||
| 645 | const Pronunciation& p2 = pronunciations_.at(p_id2); | ||
| 646 | if (p2.prerhyme.empty()) { | ||
| 647 | continue; | ||
| 648 | } | ||
| 649 | |||
| 650 | if (p1.prerhyme != p2.prerhyme) { | ||
| 651 | for (size_t f_id1 : p1.form_ids) { | ||
| 652 | for (size_t f_id2 : p2.form_ids) { | ||
| 653 | if (f_id1 != f_id2) { | ||
| 654 | Form& form1 = forms_.at(f_id1); | ||
| 655 | form1.puzzles[kPurpleTop].insert(f_id2); | ||
| 656 | } | ||
| 657 | } | ||
| 658 | } | ||
| 659 | } | ||
| 660 | } | ||
| 661 | } | ||
| 662 | } | ||
| 663 | } | ||
| 664 | |||
| 533 | // Count up all of the generated puzzles. | 665 | // Count up all of the generated puzzles. |
| 534 | int total_puzzles = 0; | 666 | int total_puzzles = 0; |
| 535 | int reusable_words = 0; | 667 | int reusable_words = 0; |
| @@ -555,6 +687,9 @@ void generator::run() { | |||
| 555 | std::cout << "Black bottoms: " << per_puzzle_type[kBlackBottom] << std::endl; | 687 | std::cout << "Black bottoms: " << per_puzzle_type[kBlackBottom] << std::endl; |
| 556 | std::cout << "Black double bottoms: " << per_puzzle_type[kDoubleBlackBottom] | 688 | std::cout << "Black double bottoms: " << per_puzzle_type[kDoubleBlackBottom] |
| 557 | << std::endl; | 689 | << std::endl; |
| 690 | std::cout << "Red bottoms: " << per_puzzle_type[kRedBottom] << std::endl; | ||
| 691 | std::cout << "Blue bottoms: " << per_puzzle_type[kBlueBottom] << std::endl; | ||
| 692 | std::cout << "Purple tops: " << per_puzzle_type[kPurpleTop] << std::endl; | ||
| 558 | } | 693 | } |
| 559 | 694 | ||
| 560 | size_t generator::LookupOrCreatePronunciation(const std::string& phonemes) { | 695 | size_t generator::LookupOrCreatePronunciation(const std::string& phonemes) { |
| diff --git a/generator/generator.h b/generator/generator.h index fc66789..f89bab9 100644 --- a/generator/generator.h +++ b/generator/generator.h | |||
| @@ -19,6 +19,14 @@ enum PuzzleType { | |||
| 19 | kBlackMiddle = 5, | 19 | kBlackMiddle = 5, |
| 20 | kBlackBottom = 6, | 20 | kBlackBottom = 6, |
| 21 | kDoubleBlackBottom = 7, | 21 | kDoubleBlackBottom = 7, |
| 22 | kRedTop = 8, | ||
| 23 | kRedMiddle = 9, | ||
| 24 | kRedBottom = 10, | ||
| 25 | kBlueTop = 11, | ||
| 26 | kBlueMiddle = 12, | ||
| 27 | kBlueBottom = 13, | ||
| 28 | kPurpleTop = 14, | ||
| 29 | kPurpleMiddle = 15, | ||
| 22 | }; | 30 | }; |
| 23 | 31 | ||
| 24 | class generator { | 32 | class generator { |
