| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- // 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;
|