62 return QStringLiteral(
"batch");
82 json[QLatin1String(
"id")] =
id;
83 json[QLatin1String(
"op_type")] =
opType;
84 json[QLatin1String(
"exec_mode")] = execModeToString(
execMode);
87 json[QLatin1String(
"attributes")] = QJsonObject::fromVariantMap(
attributes);
92 inputArr.append(p.toJson());
93 json[QLatin1String(
"inputs")] = inputArr;
97 outputArr.append(p.toJson());
98 json[QLatin1String(
"outputs")] = outputArr;
102 json[QLatin1String(
"ipc_command")] =
ipcCommand;
104 for (
const QString& arg :
ipcArgs)
106 json[QLatin1String(
"ipc_args")] = argsArr;
107 json[QLatin1String(
"ipc_work_dir")] =
ipcWorkDir;
113 json[QLatin1String(
"script")] =
script.toJson();
118 if (!verObj.isEmpty()) {
119 json[QLatin1String(
"verification")] = verObj;
126 json[QLatin1String(
"executed_at")] =
executedAt.toString(Qt::ISODate);
127 json[QLatin1String(
"dirty")] =
dirty;
137 node.
id = json[QLatin1String(
"id")].toString();
138 node.
opType = json[QLatin1String(
"op_type")].toString();
139 node.
execMode = execModeFromString(json[QLatin1String(
"exec_mode")].toString());
141 node.
attributes = json[QLatin1String(
"attributes")].toObject().toVariantMap();
144 QJsonArray inputArr = json[QLatin1String(
"inputs")].toArray();
145 for (
const QJsonValue& v : inputArr)
148 QJsonArray outputArr = json[QLatin1String(
"outputs")].toArray();
149 for (
const QJsonValue& v : outputArr)
153 node.
ipcCommand = json[QLatin1String(
"ipc_command")].toString();
154 QJsonArray argsArr = json[QLatin1String(
"ipc_args")].toArray();
155 for (
const QJsonValue& v : argsArr)
156 node.
ipcArgs.append(v.toString());
157 node.
ipcWorkDir = json[QLatin1String(
"ipc_work_dir")].toString();
158 node.
ipcTransport = json[QLatin1String(
"ipc_transport")].toString();
161 if (json.contains(QLatin1String(
"script"))) {
166 if (json.contains(QLatin1String(
"verification"))) {
171 node.
toolVersion = json[QLatin1String(
"tool_version")].toString();
172 QString execStr = json[QLatin1String(
"executed_at")].toString();
173 if (!execStr.isEmpty())
174 node.
executedAt = QDateTime::fromString(execStr, Qt::ISODate);
175 node.
dirty = json[QLatin1String(
"dirty")].toBool(
true);
177 static const QSet<QString> knownKeys = {
178 QStringLiteral(
"id"), QStringLiteral(
"op_type"),
179 QStringLiteral(
"exec_mode"), QStringLiteral(
"attributes"),
180 QStringLiteral(
"inputs"), QStringLiteral(
"outputs"),
181 QStringLiteral(
"ipc_command"), QStringLiteral(
"ipc_args"),
182 QStringLiteral(
"ipc_work_dir"), QStringLiteral(
"ipc_transport"),
183 QStringLiteral(
"script"), QStringLiteral(
"verification"),
184 QStringLiteral(
"tool_version"), QStringLiteral(
"executed_at"),
185 QStringLiteral(
"dirty")
187 for (
auto it = json.constBegin(); it != json.constEnd(); ++it) {
188 if (!knownKeys.contains(it.key()))
189 node.
extras.insert(it.key(), it.value());
199 QCborMap cbor = QCborMap::fromJsonObject(
extras);
200 cbor[QLatin1String(
"id")] =
id;
201 cbor[QLatin1String(
"op_type")] =
opType;
202 cbor[QLatin1String(
"exec_mode")] = execModeToString(
execMode);
204 cbor[QLatin1String(
"attributes")] = QCborMap::fromJsonObject(QJsonObject::fromVariantMap(
attributes));
208 inputArr.append(p.toCbor());
209 cbor[QLatin1String(
"inputs")] = inputArr;
211 QCborArray outputArr;
213 outputArr.append(p.toCbor());
214 cbor[QLatin1String(
"outputs")] = outputArr;
217 cbor[QLatin1String(
"ipc_command")] =
ipcCommand;
219 for (
const QString& arg :
ipcArgs)
221 cbor[QLatin1String(
"ipc_args")] = argsArr;
222 cbor[QLatin1String(
"ipc_work_dir")] =
ipcWorkDir;
227 cbor[QLatin1String(
"script")] =
script.toCbor();
231 if (!verCbor.isEmpty()) {
232 cbor[QLatin1String(
"verification")] = verCbor;
238 cbor[QLatin1String(
"executed_at")] =
executedAt.toString(Qt::ISODate);
239 cbor[QLatin1String(
"dirty")] =
dirty;
249 node.
id = cbor[QLatin1String(
"id")].toString();
250 node.
opType = cbor[QLatin1String(
"op_type")].toString();
251 node.
execMode = execModeFromString(cbor[QLatin1String(
"exec_mode")].toString());
253 QCborMap attrCbor = cbor[QLatin1String(
"attributes")].toMap();
254 node.
attributes = attrCbor.toJsonObject().toVariantMap();
256 QCborArray inputArr = cbor[QLatin1String(
"inputs")].toArray();
257 for (
const QCborValue& v : inputArr)
260 QCborArray outputArr = cbor[QLatin1String(
"outputs")].toArray();
261 for (
const QCborValue& v : outputArr)
264 node.
ipcCommand = cbor[QLatin1String(
"ipc_command")].toString();
265 QCborArray argsArr = cbor[QLatin1String(
"ipc_args")].toArray();
266 for (
const QCborValue& v : argsArr)
267 node.
ipcArgs.append(v.toString());
268 node.
ipcWorkDir = cbor[QLatin1String(
"ipc_work_dir")].toString();
269 node.
ipcTransport = cbor[QLatin1String(
"ipc_transport")].toString();
271 if (cbor.contains(QLatin1String(
"script"))) {
274 if (cbor.contains(QLatin1String(
"verification"))) {
278 node.
toolVersion = cbor[QLatin1String(
"tool_version")].toString();
279 QString execStr = cbor[QLatin1String(
"executed_at")].toString();
280 if (!execStr.isEmpty())
281 node.
executedAt = QDateTime::fromString(execStr, Qt::ISODate);
282 node.
dirty = cbor[QLatin1String(
"dirty")].toBool(
true);
284 static const QSet<QString> knownKeys = {
285 QStringLiteral(
"id"), QStringLiteral(
"op_type"),
286 QStringLiteral(
"exec_mode"), QStringLiteral(
"attributes"),
287 QStringLiteral(
"inputs"), QStringLiteral(
"outputs"),
288 QStringLiteral(
"ipc_command"), QStringLiteral(
"ipc_args"),
289 QStringLiteral(
"ipc_work_dir"), QStringLiteral(
"ipc_transport"),
290 QStringLiteral(
"script"), QStringLiteral(
"verification"),
291 QStringLiteral(
"tool_version"), QStringLiteral(
"executed_at"),
292 QStringLiteral(
"dirty")
294 QJsonObject cborJson = cbor.toJsonObject();
295 for (
auto it = cborJson.constBegin(); it != cborJson.constEnd(); ++it) {
296 if (!knownKeys.contains(it.key()))
297 node.
extras.insert(it.key(), it.value());
MnaNode struct declaration — one operation in the computational graph.
MNE Analysis Container Format (mna/mnx).
@ Batch
Runs once on static file-based inputs (default).
@ Ipc
Delegates to an external process via inter-process communication.
@ Stream
Runs continuously on real-time data (MNE Scan mode).
@ Script
Inline code executed via interpreter (Python, shell, R, …).
Graph node representing a processing step.
MnaNodeExecMode execMode
Execution mode.
QString toolVersion
Version of tool that last executed this node.
QString ipcCommand
External executable command.
QStringList ipcArgs
Command-line arguments (supports {{placeholder}} tokens).
bool dirty
Whether node needs re-execution.
MnaScript script
Inline source code, interpreter, language.
QList< MnaPort > inputs
Input ports.
QVariantMap attributes
Operation parameters.
QDateTime executedAt
Timestamp of last execution.
static MnaNode fromJson(const QJsonObject &json)
QString opType
Operation type (looked up in MnaOpRegistry).
MnaVerification verification
Explanation, checks, results, and provenance snapshot.
QString ipcWorkDir
Working directory for external process.
QString ipcTransport
"stdio", "tcp", "shm", "file"
static MnaNode fromCbor(const QCborMap &cbor)
QList< MnaPort > outputs
Output ports.
QJsonObject toJson() const
QString id
Unique node identifier.
QJsonObject extras
Unknown keys preserved for lossless round-trip.
static MnaPort fromJson(const QJsonObject &json)
static MnaPort fromCbor(const QCborMap &cbor)
static MnaScript fromJson(const QJsonObject &json)
static MnaScript fromCbor(const QCborMap &cbor)
static MnaVerification fromJson(const QJsonObject &json)
static MnaVerification fromCbor(const QCborMap &cbor)