UNPKG

pddl-workspace

Version:
94 lines 4.64 kB
"use strict"; /* -------------------------------------------------------------------------------------------- * Copyright (c) Jan Dolejsi. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. * ------------------------------------------------------------------------------------------ */ Object.defineProperty(exports, "__esModule", { value: true }); exports.PddlPlanParser = exports.UNSPECIFIED_DOMAIN = exports.UNSPECIFIED_PROBLEM = void 0; const PlanInfo_1 = require("../PlanInfo"); const PddlPlanBuilder_1 = require("./PddlPlanBuilder"); const DocumentPositionResolver_1 = require("../DocumentPositionResolver"); const vscode_uri_1 = require("vscode-uri"); const PlanStep_1 = require("../PlanStep"); exports.UNSPECIFIED_PROBLEM = 'unspecified'; exports.UNSPECIFIED_DOMAIN = 'unspecified'; class PddlPlanParser { constructor() { this.planStepPattern = /^\s*((\d+|\d+\.\d+)\s*:)?\s*\((.*)\)\s*(\[(?:D:)?\s*(\d+|\d+\.\d+)\s*(?:;\s*C:[\d.]+)?\])?\s*$/gim; this.planStatesEvaluatedPattern = /^\s*;?\s*States evaluated[\w ]*:[ ]*(\d*)\s*$/i; this.planMetricPattern = /[\w ]*(cost|metric)[^-\w]*:?\s*([+-]?\d*(\.\d+)?|[+-]?\d(\.\d+)?[Ee][+-]?\d+)\s*$/i; } static parsePlanMeta(fileText) { let problemName = exports.UNSPECIFIED_PROBLEM; const problemMatch = fileText.match(/^;;\s*!problem:\s*([\w-]+)\s*$/m); if (problemMatch) { problemName = problemMatch[1]; } let domainName = exports.UNSPECIFIED_DOMAIN; const domainMatch = fileText.match(/^;;\s*!domain:\s*([\w-]+)\s*$/m); if (domainMatch) { domainName = domainMatch[1]; } return { domainName: domainName, problemName: problemName }; } static getPlanMeta(domainName, problemName, endl) { return `;;!domain: ${domainName}${endl};;!problem: ${problemName}${endl}`; } parseText(planText, epsilon = 0.001, fileUri = vscode_uri_1.URI.parse('string://noname'), fileVersion = -1, positionResolver) { const meta = PddlPlanParser.parsePlanMeta(planText); const definedPositionResolver = positionResolver !== null && positionResolver !== void 0 ? positionResolver : new DocumentPositionResolver_1.SimpleDocumentPositionResolver(planText); const planInfo = new PlanInfo_1.PlanInfo(fileUri, fileVersion, meta.problemName, meta.domainName, planText, definedPositionResolver); const planBuilder = new PddlPlanBuilder_1.PddlPlanBuilder(epsilon); planText.split('\n').forEach((planLine, index) => this.tryParseLine(planLine, index, planBuilder)); planInfo.setSteps(planBuilder.getSteps()); planInfo.metric = planBuilder.getMetric(); planInfo.statesEvaluated = planBuilder.getStatesEvaluated(); return planInfo; } tryParseLine(planLine, index, planBuilder) { const planStep = this.parse(planLine, index, planBuilder); if (planStep) { planBuilder.add(planStep); } else { this.parsePlanQuality(planLine, planBuilder); } } /** * Parses one line from the plan * @param planLine line of text from the plan file * @param lineIndex index of the line being parsed */ parse(planLine, lineIndex, planBuilder) { this.planStepPattern.lastIndex = 0; const group = this.planStepPattern.exec(planLine); if (group) { // this line is a valid plan step const time = group[2] ? parseFloat(group[2]) : planBuilder.getMakespan(); const action = group[3].trim(); const isDurative = group[5] ? true : false; const duration = isDurative ? parseFloat(group[5]) : planBuilder.epsilon; return new PlanStep_1.PlanStep(time, action, isDurative, duration, lineIndex); } else { return undefined; } } parsePlanQuality(planLine, planBuilder) { var _a; let group; this.planStatesEvaluatedPattern.lastIndex = 0; this.planMetricPattern.lastIndex = 0; if (group = this.planStatesEvaluatedPattern.exec(planLine)) { planBuilder.setStatesEvaluated(parseInt(group[1])); } else if (!planLine.match(/action/i) && (group = this.planMetricPattern.exec(planLine))) { if (((_a = group[2]) === null || _a === void 0 ? void 0 : _a.length) > 0) { planBuilder.setMetric(parseFloat(group[2])); } } } } exports.PddlPlanParser = PddlPlanParser; //# sourceMappingURL=PddlPlanParser.js.map