From 6ca3a351a93679fbfbd847f0a9d6c09569906027 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 3 Nov 2023 03:19:51 +0100 Subject: refactor(langauge-web): use generator facades --- .../web/generator/ModelGenerationWorker.java | 91 ++++------------------ .../web/semantics/PartialInterpretation2Json.java | 7 +- .../language/web/semantics/SemanticsWorker.java | 57 +++++--------- 3 files changed, 42 insertions(+), 113 deletions(-) (limited to 'subprojects/language-web/src') diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java index 1fce10a4..7b4f957c 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java @@ -6,36 +6,18 @@ package tools.refinery.language.web.generator; import com.google.inject.Inject; -import com.google.inject.Provider; -import org.eclipse.emf.common.util.URI; -import org.eclipse.xtext.diagnostics.Severity; -import org.eclipse.xtext.resource.IResourceFactory; -import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.service.OperationCanceledManager; -import org.eclipse.xtext.util.LazyStringInputStream; -import org.eclipse.xtext.validation.CheckMode; -import org.eclipse.xtext.validation.IResourceValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import tools.refinery.language.model.problem.Problem; -import tools.refinery.language.semantics.metadata.MetadataCreator; -import tools.refinery.language.semantics.model.ModelInitializer; +import tools.refinery.generator.ModelGeneratorBuilder; +import tools.refinery.generator.ValidationErrorsException; import tools.refinery.language.web.semantics.PartialInterpretation2Json; import tools.refinery.language.web.xtext.server.ThreadPoolExecutorServiceProvider; import tools.refinery.language.web.xtext.server.push.PushWebDocument; -import tools.refinery.store.dse.propagation.PropagationAdapter; -import tools.refinery.store.dse.strategy.BestFirstStoreManager; -import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter; -import tools.refinery.store.model.ModelStore; -import tools.refinery.store.query.interpreter.QueryInterpreterAdapter; -import tools.refinery.store.reasoning.ReasoningAdapter; -import tools.refinery.store.reasoning.ReasoningStoreAdapter; import tools.refinery.store.reasoning.literal.Concreteness; -import tools.refinery.store.statecoding.StateCoderAdapter; import tools.refinery.store.util.CancellationToken; import java.io.IOException; -import java.util.Map; import java.util.UUID; import java.util.concurrent.*; @@ -56,19 +38,7 @@ public class ModelGenerationWorker implements Runnable { private OperationCanceledManager operationCanceledManager; @Inject - private Provider resourceSetProvider; - - @Inject - private IResourceFactory resourceFactory; - - @Inject - private IResourceValidator resourceValidator; - - @Inject - private ModelInitializer initializer; - - @Inject - private MetadataCreator metadataCreator; + private ModelGeneratorBuilder generatorBuilder; @Inject private PartialInterpretation2Json partialInterpretation2Json; @@ -157,56 +127,29 @@ public class ModelGenerationWorker implements Runnable { public ModelGenerationResult doRun() throws IOException { cancellationToken.checkCancelled(); - var resourceSet = resourceSetProvider.get(); - var uri = URI.createURI("__synthetic_" + uuid + ".problem"); - var resource = resourceFactory.createResource(uri); - resourceSet.getResources().add(resource); - var inputStream = new LazyStringInputStream(text); - resource.load(inputStream, Map.of()); - cancellationToken.checkCancelled(); - var issues = resourceValidator.validate(resource, CheckMode.ALL, () -> cancelled || Thread.interrupted()); - cancellationToken.checkCancelled(); - for (var issue : issues) { - if (issue.getSeverity() == Severity.ERROR) { - return new ModelGenerationErrorResult(uuid, "Validation error: " + issue.getMessage()); + try { + generatorBuilder.cancellationToken(cancellationToken); + generatorBuilder.fromString(text); + } catch (ValidationErrorsException e) { + var errors = e.getErrors(); + if (errors != null && !errors.isEmpty()) { + return new ModelGenerationErrorResult(uuid, "Validation error: " + errors.get(0).getMessage()); } + throw e; } - if (resource.getContents().isEmpty() || !(resource.getContents().get(0) instanceof Problem problem)) { - return new ModelGenerationErrorResult(uuid, "Model generation problem not found"); - } - cancellationToken.checkCancelled(); - var storeBuilder = ModelStore.builder() - .cancellationToken(cancellationToken) - .with(QueryInterpreterAdapter.builder()) - .with(PropagationAdapter.builder()) - .with(StateCoderAdapter.builder()) - .with(DesignSpaceExplorationAdapter.builder()) - .with(ReasoningAdapter.builder() - .requiredInterpretations(Concreteness.CANDIDATE)); - var modelSeed = initializer.createModel(problem, storeBuilder); - var store = storeBuilder.build(); - cancellationToken.checkCancelled(); - var model = store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(modelSeed); - var initialVersion = model.commit(); - cancellationToken.checkCancelled(); + var generator = generatorBuilder.build(); notifyResult(new ModelGenerationStatusResult(uuid, "Generating model")); - var bestFirst = new BestFirstStoreManager(store, 1); - bestFirst.startExploration(initialVersion, randomSeed); - cancellationToken.checkCancelled(); - var solutionStore = bestFirst.getSolutionStore(); - if (solutionStore.getSolutions().isEmpty()) { + generator.setRandomSeed(randomSeed); + if (!generator.tryRun()) { return new ModelGenerationErrorResult(uuid, "Problem is unsatisfiable"); } notifyResult(new ModelGenerationStatusResult(uuid, "Saving generated model")); - model.restore(solutionStore.getSolutions().get(0).version()); cancellationToken.checkCancelled(); - metadataCreator.setInitializer(initializer); - var nodesMetadata = metadataCreator.getNodesMetadata(model.getAdapter(ReasoningAdapter.class).getNodeCount(), - false); + var nodesMetadata = generator.getNodesMetadata(); cancellationToken.checkCancelled(); - var relationsMetadata = metadataCreator.getRelationsMetadata(); + var relationsMetadata = generator.getProblemTrace().getRelationsMetadata(); cancellationToken.checkCancelled(); - var partialInterpretation = partialInterpretation2Json.getPartialInterpretation(initializer, model, + var partialInterpretation = partialInterpretation2Json.getPartialInterpretation(generator, Concreteness.CANDIDATE, cancellationToken); return new ModelGenerationSuccessResult(uuid, nodesMetadata, relationsMetadata, partialInterpretation); } diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java index 5d5da8fe..7afed5c0 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java @@ -9,7 +9,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.inject.Inject; import com.google.inject.Singleton; -import tools.refinery.language.semantics.model.ModelInitializer; +import tools.refinery.generator.AbstractRefinery; import tools.refinery.language.semantics.model.SemanticsUtils; import tools.refinery.store.map.Cursor; import tools.refinery.store.model.Model; @@ -27,11 +27,12 @@ public class PartialInterpretation2Json { @Inject private SemanticsUtils semanticsUtils; - public JsonObject getPartialInterpretation(ModelInitializer initializer, Model model, Concreteness concreteness, + public JsonObject getPartialInterpretation(AbstractRefinery refinery, Concreteness concreteness, CancellationToken cancellationToken) { + var model = refinery.getModel(); var adapter = model.getAdapter(ReasoningAdapter.class); var json = new JsonObject(); - for (var entry : initializer.getRelationTrace().entrySet()) { + for (var entry : refinery.getProblemTrace().getRelationTrace().entrySet()) { var relation = entry.getKey(); var partialSymbol = entry.getValue(); var tuples = getTuplesJson(adapter, concreteness, partialSymbol); diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java index fb89bea6..a8f16c84 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java @@ -15,15 +15,10 @@ import org.eclipse.xtext.validation.FeatureBasedDiagnostic; import org.eclipse.xtext.validation.IDiagnosticConverter; import org.eclipse.xtext.validation.Issue; import org.eclipse.xtext.web.server.validation.ValidationResult; +import tools.refinery.generator.ModelSemantics; +import tools.refinery.generator.ModelSemanticsBuilder; import tools.refinery.language.model.problem.Problem; -import tools.refinery.language.semantics.metadata.MetadataCreator; -import tools.refinery.language.semantics.model.ModelInitializer; import tools.refinery.language.semantics.model.TracedException; -import tools.refinery.store.dse.propagation.PropagationAdapter; -import tools.refinery.store.model.ModelStore; -import tools.refinery.store.query.interpreter.QueryInterpreterAdapter; -import tools.refinery.store.reasoning.ReasoningAdapter; -import tools.refinery.store.reasoning.ReasoningStoreAdapter; import tools.refinery.store.reasoning.literal.Concreteness; import tools.refinery.store.reasoning.translator.TranslationException; import tools.refinery.store.util.CancellationToken; @@ -44,10 +39,7 @@ class SemanticsWorker implements Callable { private IDiagnosticConverter diagnosticConverter; @Inject - private ModelInitializer initializer; - - @Inject - private MetadataCreator metadataCreator; + private ModelSemanticsBuilder semanticsBuilder; private Problem problem; @@ -64,36 +56,29 @@ class SemanticsWorker implements Callable { @Override public SemanticsResult call() { - var builder = ModelStore.builder() - .cancellationToken(cancellationToken) - .with(QueryInterpreterAdapter.builder()) - .with(PropagationAdapter.builder()) - .with(ReasoningAdapter.builder() - .requiredInterpretations(Concreteness.PARTIAL)); + semanticsBuilder.cancellationToken(cancellationToken); cancellationToken.checkCancelled(); + ModelSemantics semantics; try { - var modelSeed = initializer.createModel(problem, builder); - cancellationToken.checkCancelled(); - metadataCreator.setInitializer(initializer); - cancellationToken.checkCancelled(); - var nodesMetadata = metadataCreator.getNodesMetadata(); - cancellationToken.checkCancelled(); - var relationsMetadata = metadataCreator.getRelationsMetadata(); - cancellationToken.checkCancelled(); - var store = builder.build(); - cancellationToken.checkCancelled(); - var model = store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(modelSeed); + semanticsBuilder.problem(problem); cancellationToken.checkCancelled(); - var partialInterpretation = partialInterpretation2Json.getPartialInterpretation(initializer, model, - Concreteness.PARTIAL, cancellationToken); - - return new SemanticsSuccessResult(nodesMetadata, relationsMetadata, partialInterpretation); - } catch (TracedException e) { - return getTracedErrorResult(e.getSourceElement(), e.getMessage()); + semantics = semanticsBuilder.build(); } catch (TranslationException e) { - var sourceElement = initializer.getInverseTrace(e.getPartialSymbol()); - return getTracedErrorResult(sourceElement, e.getMessage()); + return new SemanticsInternalErrorResult(e.getMessage()); + } catch (TracedException e) { + var cause = e.getCause(); + // Suppress the type of the cause exception. + var message = cause == null ? e.getMessage() : cause.getMessage(); + return getTracedErrorResult(e.getSourceElement(), message); } + cancellationToken.checkCancelled(); + var nodesMetadata = semantics.getNodesMetadata(); + cancellationToken.checkCancelled(); + var relationsMetadata = semantics.getProblemTrace().getRelationsMetadata(); + cancellationToken.checkCancelled(); + var partialInterpretation = partialInterpretation2Json.getPartialInterpretation(semantics, + Concreteness.PARTIAL, cancellationToken); + return new SemanticsSuccessResult(nodesMetadata, relationsMetadata, partialInterpretation); } private SemanticsResult getTracedErrorResult(EObject sourceElement, String message) { -- cgit v1.2.3-54-g00ecf