Import the pre-trained model.
| 741 | |
| 742 | // Import the pre-trained model. |
| 743 | Lycoris *loadModel(const std::string &path, uint32_t capacity) { |
| 744 | std::ifstream infile(path); |
| 745 | std::string str; |
| 746 | std::getline(infile, str); |
| 747 | infile.close(); |
| 748 | |
| 749 | if (str.empty()) { |
| 750 | std::cout << "Wrong path." << std::endl; |
| 751 | exit(1); |
| 752 | } |
| 753 | |
| 754 | auto data = LycorisUtils::split(str); |
| 755 | auto source = new Individual(); |
| 756 | source->inputNum = uint32_t(std::stoul(data[0])); |
| 757 | source->outputNum = uint32_t(std::stoul(data[1])); |
| 758 | source->innovationNum = uint32_t(std::stoul(data[2])); |
| 759 | source->nodeSum = uint32_t(std::stoul(data[3])); |
| 760 | source->fitness = std::stof(data[4]); |
| 761 | |
| 762 | source->nodeSlice = new std::vector<uint32_t>(std::stoul(data[5])); |
| 763 | uint32_t pointer = 6; |
| 764 | for (uint32_t i = 0; i < std::stoul(data[5]); ++i) { |
| 765 | (*(source->nodeSlice))[i] = uint32_t(std::stoul(data[pointer])); |
| 766 | pointer++; |
| 767 | } |
| 768 | |
| 769 | auto mapLength = uint32_t(std::stoul(data[pointer])); |
| 770 | pointer++; |
| 771 | source->nodeMap = new std::map<uint32_t, Node *>(); |
| 772 | for (uint32_t i = 0; i < mapLength; ++i) { |
| 773 | auto key = uint32_t(std::stoul(data[pointer])); |
| 774 | pointer++; |
| 775 | auto temp1 = data[pointer]; |
| 776 | pointer++; |
| 777 | auto temp2 = data[pointer]; |
| 778 | pointer++; |
| 779 | auto n = new Node(uint32_t(std::stoul(temp1)), uint32_t(std::stoul(temp2))); |
| 780 | n->value = std::stof(data[pointer]); |
| 781 | pointer++; |
| 782 | n->bias = std::stof(data[pointer]); |
| 783 | pointer++; |
| 784 | |
| 785 | auto genomeLength = uint32_t(std::stoul(data[pointer])); |
| 786 | pointer++; |
| 787 | for (uint32_t j = 0; j < genomeLength; ++j) { |
| 788 | Gen g; |
| 789 | g.in = uint32_t(std::stoul(data[pointer])); |
| 790 | pointer++; |
| 791 | g.out = uint32_t(std::stoul(data[pointer])); |
| 792 | pointer++; |
| 793 | Ome o; |
| 794 | o.weight = std::stof(data[pointer]); |
| 795 | pointer++; |
| 796 | o.innovationNum = uint32_t(std::stoul(data[pointer])); |
| 797 | pointer++; |
| 798 | (*(n->genomeMap))[g] = o; |
| 799 | } |
| 800 |