pddl-workspace
Version:
94 lines • 4.64 kB
JavaScript
;
/* --------------------------------------------------------------------------------------------
* 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