50 lines
1.8 KiB
JavaScript
50 lines
1.8 KiB
JavaScript
'use strict';
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
exports.resolveOperator = void 0;
|
|
function resolveOperator(node, opsets, rules) {
|
|
for (const rule of rules) {
|
|
const opType = rule[0];
|
|
const domain = rule[1];
|
|
const versionSelector = rule[2];
|
|
const opImpl = rule[3];
|
|
const opInit = rule[4];
|
|
if (node.opType === opType) {
|
|
// operator type matches
|
|
for (const opset of opsets) {
|
|
// opset '' and 'ai.onnx' are considered the same.
|
|
if (opset.domain === domain || (opset.domain === 'ai.onnx' && domain === '')) {
|
|
// opset domain found
|
|
if (matchSelector(opset.version, versionSelector)) {
|
|
return { opImpl, opInit };
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw new TypeError(
|
|
`cannot resolve operator '${node.opType}' with opsets: ${opsets
|
|
.map((set) => `${set.domain || 'ai.onnx'} v${set.version}`)
|
|
.join(', ')}`,
|
|
);
|
|
}
|
|
exports.resolveOperator = resolveOperator;
|
|
function matchSelector(version, selector) {
|
|
if (selector.endsWith('+')) {
|
|
// minimum version match ('7+' expects version>=7)
|
|
const rangeStart = Number.parseInt(selector.substring(0, selector.length - 1), 10);
|
|
return !isNaN(rangeStart) && rangeStart <= version;
|
|
} else if (selector.split('-').length === 2) {
|
|
// range match ('6-8' expects 6<=version<=8)
|
|
const pair = selector.split('-');
|
|
const rangeStart = Number.parseInt(pair[0], 10);
|
|
const rangeEnd = Number.parseInt(pair[1], 10);
|
|
return !isNaN(rangeStart) && !isNaN(rangeEnd) && rangeStart <= version && version <= rangeEnd;
|
|
} else {
|
|
// exact match ('7' expects version===7)
|
|
return Number.parseInt(selector, 10) === version;
|
|
}
|
|
}
|
|
//# sourceMappingURL=opset.js.map
|