| 584 | } |
| 585 | |
| 586 | std::pair<py::UniquePObj<LDAModelObject>, std::vector<uint8_t>> LDAModelObject::loads(PyObject* cls, const std::vector<uint8_t>& data) |
| 587 | { |
| 588 | tomoto::serializer::imstream str{ (const char*)data.data(), (std::ptrdiff_t)data.size() }; |
| 589 | for (size_t i = 0; i < (size_t)tomoto::TermWeight::size; ++i) |
| 590 | { |
| 591 | str.seekg(0); |
| 592 | py::UniqueObj args{ py::buildPyTuple(i) }; |
| 593 | py::UniqueObj newInst{ PyObject_CallObject(cls, args.get()) }; |
| 594 | if (!newInst) throw py::ExcPropagation{}; |
| 595 | auto p = py::checkType<py::PObject<LDAModelObject>>(std::move(newInst)); |
| 596 | auto inst = p->getInst<tomoto::ILDAModel>(); |
| 597 | vector<uint8_t> extraData; |
| 598 | try |
| 599 | { |
| 600 | extraData.clear(); |
| 601 | inst->loadModel(str, &extraData); |
| 602 | } |
| 603 | catch (const tomoto::serializer::UnfitException&) |
| 604 | { |
| 605 | continue; |
| 606 | } |
| 607 | p->isPrepared = true; |
| 608 | return make_pair(std::move(p), std::move(extraData)); |
| 609 | } |
| 610 | throw runtime_error{ "`data` is not valid model file" }; |
| 611 | } |
| 612 | |
| 613 | py::UniqueObj DocumentObject::getZFromLDA() const |
| 614 | { |