netron / message.js
shethjenil's picture
Upload 30 files
d0d9416 verified
// 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;