105 qWarning() <<
"MlLinearModel::save – model not trained; nothing to save.";
110 root[QStringLiteral(
"model_type")] = QStringLiteral(
"linear");
112 switch (m_taskType) {
118 root[QStringLiteral(
"regularization")] = m_regularization;
119 root[QStringLiteral(
"n_features")] =
static_cast<int>(m_weights.rows());
120 root[QStringLiteral(
"n_outputs")] =
static_cast<int>(m_weights.cols());
124 for (
int r = 0; r < m_weights.rows(); ++r) {
126 for (
int c = 0; c < m_weights.cols(); ++c) {
127 row.append(
static_cast<double>(m_weights(r, c)));
131 root[QStringLiteral(
"weights")] = wArr;
135 for (
int i = 0; i < m_bias.size(); ++i) {
136 bArr.append(
static_cast<double>(m_bias(i)));
138 root[QStringLiteral(
"bias")] = bArr;
141 if (!file.open(QIODevice::WriteOnly)) {
142 qWarning() <<
"MlLinearModel::save – cannot open file" << path;
145 file.write(QJsonDocument(root).toJson(QJsonDocument::Indented));
154 if (!file.open(QIODevice::ReadOnly)) {
155 qWarning() <<
"MlLinearModel::load – cannot open file" << path;
159 QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
161 qWarning() <<
"MlLinearModel::load – invalid JSON in" << path;
165 QJsonObject root = doc.object();
168 QString tt = root[QStringLiteral(
"task_type")].toString();
173 m_regularization = root[QStringLiteral(
"regularization")].toDouble(1.0);
175 int nFeatures = root[QStringLiteral(
"n_features")].toInt();
176 int nOutputs = root[QStringLiteral(
"n_outputs")].toInt();
179 QJsonArray wArr = root[QStringLiteral(
"weights")].toArray();
180 m_weights.resize(nFeatures, nOutputs);
181 for (
int r = 0; r < nFeatures; ++r) {
182 QJsonArray row = wArr[r].toArray();
183 for (
int c = 0; c < nOutputs; ++c) {
184 m_weights(r, c) =
static_cast<float>(row[c].toDouble());
189 QJsonArray bArr = root[QStringLiteral(
"bias")].toArray();
190 m_bias.resize(nOutputs);
191 for (
int i = 0; i < nOutputs; ++i) {
192 m_bias(i) =
static_cast<float>(bArr[i].toDouble());