212 std::vector<InvToken> tokens;
215 int nSrc =
static_cast<int>(estimate.
data.rows());
216 int nTimes =
static_cast<int>(estimate.
data.cols());
217 int srcStride = stride(nSrc, options.
maxSources);
219 int effSrc = (nSrc + srcStride - 1) / srcStride;
220 int effTime = (nTimes + timeStride - 1) / timeStride;
224 est +=
static_cast<size_t>(effSrc) * (1 + effTime) + effSrc + 6;
229 est +=
static_cast<size_t>(estimate.
positions.rows()) * 3 + 2;
237 tokens.emplace_back(methodToTokenId(estimate.
method));
251 for (
int s = 0; s < nSrc; s += srcStride)
255 for (
int s = 0; s < nSrc; s += srcStride) {
257 for (
int t = 0; t < nTimes; t += timeStride)
266 int nPos =
static_cast<int>(estimate.
positions.rows());
267 for (
int i = 0; i < nPos; i += srcStride) {
280 for (
const auto &grp : estimate.
couplings) {
286 for (
size_t k = 0; k < grp.gridIndices.size(); ++k) {
288 if (k < grp.moments.size()) {
289 tokens.emplace_back(
InvTokenId::MomX,
static_cast<float>(grp.moments[k].x()));
290 tokens.emplace_back(
InvTokenId::MomY,
static_cast<float>(grp.moments[k].y()));
291 tokens.emplace_back(
InvTokenId::MomZ,
static_cast<float>(grp.moments[k].z()));
296 int n =
static_cast<int>(grp.gridIndices.size());
297 for (
int r = 0; r < n && r < grp.correlations.rows(); ++r)
298 for (
int c = r; c < n && c < grp.correlations.cols(); ++c)
338 tokens.emplace_back(measureToTokenId(conn.measure));
345 int n =
static_cast<int>(conn.matrix.rows());
347 for (
int r = 0; r < n; ++r)
348 for (
int c = 0; c < n; ++c)
369 const size_t len = tokens.size();
371 auto advance = [&]() ->
const InvToken& {
372 return tokens[pos++];
389 if (isMethodToken(peek()))
390 est.
method = tokenIdToMethod(advance().
id);
391 else if (isSpaceToken(peek()))
393 else if (isOrientToken(peek()))
398 if (pos < len) ++pos;
404 int nSrc = 0, nTime = 0;
405 std::vector<int> verts;
406 std::vector<std::vector<float>> rows;
412 nSrc =
static_cast<int>(g.
value); ++pos;
414 nTime =
static_cast<int>(g.
value); ++pos;
423 verts.push_back(
static_cast<int>(g.
value)); ++pos;
426 std::vector<float> row;
428 row.push_back(tokens[pos].value);
431 rows.push_back(std::move(row));
436 if (pos < len) ++pos;
439 int effSrc =
static_cast<int>(rows.size());
440 int effTime = effSrc > 0 ?
static_cast<int>(rows[0].size()) : 0;
441 if (effSrc > 0 && effTime > 0) {
442 est.
data = MatrixXd(effSrc, effTime);
443 for (
int s = 0; s < effSrc; ++s)
444 for (
int t = 0; t < effTime && t < static_cast<int>(rows[s].size()); ++t)
445 est.
data(s, t) =
static_cast<double>(rows[s][t]);
447 est.
vertices = VectorXi(
static_cast<int>(verts.size()));
448 for (
int i = 0; i < static_cast<int>(verts.size()); ++i)
455 std::vector<Vector3f> posVec;
459 p.x() = tokens[pos].value;
460 p.y() = tokens[pos + 1].value;
461 p.z() = tokens[pos + 2].value;
468 if (pos < len) ++pos;
470 est.
positions = MatrixX3f(
static_cast<int>(posVec.size()), 3);
471 for (
int i = 0; i < static_cast<int>(posVec.size()); ++i)
472 est.
positions.row(i) = posVec[i].transpose();
489 if (grp.
tmin == 0.0f && grp.
tmax == 0.0f)
495 nIdx =
static_cast<int>(ct.
value); ++pos;
500 m.x() =
static_cast<double>(tokens[pos].value);
501 m.y() =
static_cast<double>(tokens[pos + 1].value);
502 m.z() =
static_cast<double>(tokens[pos + 2].value);
510 for (
int r = 0; r < n; ++r) {
512 double v =
static_cast<double>(tokens[pos].value);
525 if (pos < len) ++pos;
531 if (pos < len) ++pos;
565 if (pos < len) ++pos;
571 if (pos < len) ++pos;
584 int freqIdx = 0, timeIdx = 0;
588 if (isMeasureToken(ct.
id)) {
589 conn.
measure = tokenIdToMeasure(ct.
id); ++pos;
601 n =
static_cast<int>(ct.
value); ++pos;
603 conn.
matrix = MatrixXd(n, n);
604 for (
int r = 0; r < n; ++r)
606 conn.
matrix(r, c) =
static_cast<double>(tokens[pos].value);
611 if (pos < len) ++pos;
617 if (pos < len) ++pos;
626 if (est.
data.cols() > 0 && est.
tstep > 0) {
627 est.
times = RowVectorXf(est.
data.cols());
629 for (
int i = 1; i < est.
times.size(); ++i)