7254f7b4d1
Build / Build (macos-latest) (push) Has been cancelled
Build / Build (ubuntu-latest) (push) Has been cancelled
Build / Build (windows-latest) (push) Has been cancelled
Build / Analyze (javascript) (push) Has been cancelled
Build / Analyze (python) (push) Has been cancelled
171 lines
5.3 KiB
JavaScript
171 lines
5.3 KiB
JavaScript
|
|
// Experimental
|
|
|
|
const message = {};
|
|
|
|
message.ModelFactory = class {
|
|
|
|
async match(context) {
|
|
const stream = context.stream;
|
|
if (stream) {
|
|
const buffer = stream.peek(Math.min(64, stream.length));
|
|
const content = String.fromCharCode.apply(null, buffer);
|
|
const match = content.match(/^{\s*"signature":\s*"(.*)"\s*,\s*/);
|
|
if (match && match[1].startsWith('netron:')) {
|
|
const obj = await context.peek('json');
|
|
if (obj && obj.signature && obj.signature.startsWith('netron:')) {
|
|
return context.set('message', obj);
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
async open(context) {
|
|
return new message.Model(context.value);
|
|
}
|
|
};
|
|
|
|
message.Model = class {
|
|
|
|
constructor(data) {
|
|
this.format = data.format || '';
|
|
this.format = this.format.replace(/\s+(\d+\.\d+)$/, ' v$1'); // Format v2.0
|
|
this.producer = data.producer || '';
|
|
this.version = data.version || '';
|
|
this.description = data.description || '';
|
|
this.metadata = (data.metadata || []).map((entry) => {
|
|
return { name: entry.name, value: entry.value };
|
|
});
|
|
const modules = data.modules || data.graphs || [];
|
|
this.modules = modules.map((module) => new message.Module(module));
|
|
}
|
|
};
|
|
|
|
message.Module = class {
|
|
|
|
constructor(data) {
|
|
this.inputs = [];
|
|
this.outputs = [];
|
|
this.nodes = [];
|
|
const values = new Map();
|
|
values.map = (index) => {
|
|
if (!values.has(index)) {
|
|
values.set(index, new message.Value({ name: index.toString() }));
|
|
}
|
|
return values.get(index);
|
|
};
|
|
if (Array.isArray(data.values)) {
|
|
for (let i = 0; i < data.values.length; i++) {
|
|
values.set(i, new message.Value(data.values[i]));
|
|
}
|
|
}
|
|
if (Array.isArray(data.arguments)) {
|
|
for (let i = 0; i < data.arguments.length; i++) {
|
|
values.set(data.arguments[i].name, new message.Value(data.arguments[i]));
|
|
}
|
|
}
|
|
for (const argument of data.inputs || []) {
|
|
argument.value = argument.value.map((index) => values.map(index)).filter((argument) => !argument.initializer);
|
|
if (argument.value.filter((argument) => !argument.initializer).length > 0) {
|
|
this.inputs.push(new message.Argument(argument));
|
|
}
|
|
}
|
|
for (const argument of data.outputs || []) {
|
|
argument.value = argument.value.map((index) => values.map(index));
|
|
if (argument.value.filter((argument) => !argument.initializer).length > 0) {
|
|
this.outputs.push(new message.Argument(argument));
|
|
}
|
|
}
|
|
for (const node of data.nodes || []) {
|
|
for (const argument of node.inputs || []) {
|
|
if (!argument.value && argument.arguments) {
|
|
argument.value = argument.arguments;
|
|
delete argument.arguments;
|
|
}
|
|
argument.value = argument.value.map((index) => values.map(index));
|
|
}
|
|
for (const argument of node.outputs || []) {
|
|
if (!argument.value && argument.arguments) {
|
|
argument.value = argument.arguments;
|
|
delete argument.arguments;
|
|
}
|
|
argument.value = argument.value.map((index) => values.map(index));
|
|
}
|
|
this.nodes.push(new message.Node(node));
|
|
}
|
|
}
|
|
};
|
|
|
|
message.Argument = class {
|
|
|
|
constructor(data) {
|
|
this.name = data.name || '';
|
|
this.value = data.value || [];
|
|
this.type = data.type || null;
|
|
}
|
|
};
|
|
|
|
message.Value = class {
|
|
|
|
constructor(data) {
|
|
this.name = data.name !== undefined && data.name !== null ? data.name.toString() : '';
|
|
this.initializer = data.initializer ? new message.Tensor(data.initializer) : null;
|
|
if (this.initializer && this.initializer.type) {
|
|
this.type = this.initializer.type;
|
|
} else {
|
|
this.type = data.type ? new message.TensorType(data.type) : null;
|
|
}
|
|
}
|
|
};
|
|
|
|
message.Node = class {
|
|
|
|
constructor(data) {
|
|
this.type = { name: data.type.name, category: data.type.category };
|
|
this.name = data.name || '';
|
|
this.inputs = (data.inputs || []).map((input) => new message.Argument(input));
|
|
this.outputs = (data.outputs || []).map((output) => new message.Argument(output));
|
|
this.attributes = (data.attributes || []).map((attribute) => new message.Argument(attribute));
|
|
}
|
|
};
|
|
|
|
message.TensorType = class {
|
|
|
|
constructor(data) {
|
|
this.dataType = data.dataType;
|
|
this.shape = new message.TensorShape(data.shape);
|
|
}
|
|
|
|
toString() {
|
|
return this.dataType + this.shape.toString();
|
|
}
|
|
};
|
|
|
|
message.TensorShape = class {
|
|
|
|
constructor(data) {
|
|
this.dimensions = data.dimensions;
|
|
}
|
|
|
|
toString() {
|
|
return `[${this.dimensions}]`;
|
|
}
|
|
};
|
|
|
|
message.Tensor = class {
|
|
|
|
constructor(data) {
|
|
this.type = new message.TensorType(data.type);
|
|
}
|
|
};
|
|
|
|
message.Error = class extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'Message Error';
|
|
}
|
|
};
|
|
|
|
export const ModelFactory = message.ModelFactory;
|