209 std::vector<InvToken> tokens;
212 int nSrc =
static_cast<int>(estimate.
data.rows());
213 int nTimes =
static_cast<int>(estimate.
data.cols());
214 int srcStride = stride(nSrc, options.
maxSources);
216 int effSrc = (nSrc + srcStride - 1) / srcStride;
217 int effTime = (nTimes + timeStride - 1) / timeStride;
221 est +=
static_cast<size_t>(effSrc) * (1 + effTime) + effSrc + 6;
226 est +=
static_cast<size_t>(estimate.
positions.rows()) * 3 + 2;
234 tokens.emplace_back(methodToTokenId(estimate.
method));
248 for (
int s = 0; s < nSrc; s += srcStride)
252 for (
int s = 0; s < nSrc; s += srcStride) {
254 for (
int t = 0; t < nTimes; t += timeStride)
263 int nPos =
static_cast<int>(estimate.
positions.rows());
264 for (
int i = 0; i < nPos; i += srcStride) {
277 for (
const auto &grp : estimate.
couplings) {
283 for (
size_t k = 0; k < grp.gridIndices.size(); ++k) {
285 if (k < grp.moments.size()) {
286 tokens.emplace_back(
InvTokenId::MomX,
static_cast<float>(grp.moments[k].x()));
287 tokens.emplace_back(
InvTokenId::MomY,
static_cast<float>(grp.moments[k].y()));
288 tokens.emplace_back(
InvTokenId::MomZ,
static_cast<float>(grp.moments[k].z()));
293 int n =
static_cast<int>(grp.gridIndices.size());
294 for (
int r = 0; r < n && r < grp.correlations.rows(); ++r)
295 for (
int c = r; c < n && c < grp.correlations.cols(); ++c)
335 tokens.emplace_back(measureToTokenId(conn.measure));
342 int n =
static_cast<int>(conn.matrix.rows());
344 for (
int r = 0; r < n; ++r)
345 for (
int c = 0; c < n; ++c)
366 const size_t len = tokens.size();
368 auto advance = [&]() ->
const InvToken& {
369 return tokens[pos++];
386 if (isMethodToken(peek()))
387 est.
method = tokenIdToMethod(advance().
id);
388 else if (isSpaceToken(peek()))
390 else if (isOrientToken(peek()))
395 if (pos < len) ++pos;
401 int nSrc = 0, nTime = 0;
402 std::vector<int> verts;
403 std::vector<std::vector<float>> rows;
409 nSrc =
static_cast<int>(g.
value); ++pos;
411 nTime =
static_cast<int>(g.
value); ++pos;
420 verts.push_back(
static_cast<int>(g.
value)); ++pos;
423 std::vector<float> row;
425 row.push_back(tokens[pos].value);
428 rows.push_back(std::move(row));
433 if (pos < len) ++pos;
436 int effSrc =
static_cast<int>(rows.size());
437 int effTime = effSrc > 0 ?
static_cast<int>(rows[0].size()) : 0;
438 if (effSrc > 0 && effTime > 0) {
439 est.
data = MatrixXd(effSrc, effTime);
440 for (
int s = 0; s < effSrc; ++s)
441 for (
int t = 0; t < effTime && t < static_cast<int>(rows[s].size()); ++t)
442 est.
data(s, t) =
static_cast<double>(rows[s][t]);
444 est.
vertices = VectorXi(
static_cast<int>(verts.size()));
445 for (
int i = 0; i < static_cast<int>(verts.size()); ++i)
452 std::vector<Vector3f> posVec;
456 p.x() = tokens[pos].value;
457 p.y() = tokens[pos + 1].value;
458 p.z() = tokens[pos + 2].value;
465 if (pos < len) ++pos;
467 est.
positions = MatrixX3f(
static_cast<int>(posVec.size()), 3);
468 for (
int i = 0; i < static_cast<int>(posVec.size()); ++i)
469 est.
positions.row(i) = posVec[i].transpose();
486 if (grp.
tmin == 0.0f && grp.
tmax == 0.0f)
492 nIdx =
static_cast<int>(ct.
value); ++pos;
497 m.x() =
static_cast<double>(tokens[pos].value);
498 m.y() =
static_cast<double>(tokens[pos + 1].value);
499 m.z() =
static_cast<double>(tokens[pos + 2].value);
507 for (
int r = 0; r < n; ++r) {
509 double v =
static_cast<double>(tokens[pos].value);
522 if (pos < len) ++pos;
528 if (pos < len) ++pos;
562 if (pos < len) ++pos;
568 if (pos < len) ++pos;
581 int freqIdx = 0, timeIdx = 0;
585 if (isMeasureToken(ct.
id)) {
586 conn.
measure = tokenIdToMeasure(ct.
id); ++pos;
598 n =
static_cast<int>(ct.
value); ++pos;
600 conn.
matrix = MatrixXd(n, n);
601 for (
int r = 0; r < n; ++r)
603 conn.
matrix(r, c) =
static_cast<double>(tokens[pos].value);
608 if (pos < len) ++pos;
614 if (pos < len) ++pos;
623 if (est.
data.cols() > 0 && est.
tstep > 0) {
624 est.
times = RowVectorXf(est.
data.cols());
626 for (
int i = 1; i < est.
times.size(); ++i)