aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web/src
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-09-14 03:05:28 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-09-14 03:43:26 +0200
commit13b464db253566290be6a1063ad8e296288d3339 (patch)
tree29e0a9a346f66974d6c0be0482f511e9becab51c /subprojects/language-web/src
parentfix(frontend): keep live while model generation (diff)
downloadrefinery-13b464db253566290be6a1063ad8e296288d3339.tar.gz
refinery-13b464db253566290be6a1063ad8e296288d3339.tar.zst
refinery-13b464db253566290be6a1063ad8e296288d3339.zip
feat: specify random seed for generation
Diffstat (limited to 'subprojects/language-web/src')
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java4
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java7
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ThreadPoolExecutorServiceProvider.java20
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java4
4 files changed, 29 insertions, 6 deletions
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java
index 5a60007f..9f72e462 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationService.java
@@ -34,13 +34,13 @@ public class ModelGenerationService {
34 timeoutSec = SemanticsService.getTimeout("REFINERY_MODEL_GENERATION_TIMEOUT_SEC").orElse(600L); 34 timeoutSec = SemanticsService.getTimeout("REFINERY_MODEL_GENERATION_TIMEOUT_SEC").orElse(600L);
35 } 35 }
36 36
37 public ModelGenerationStartedResult generateModel(PushWebDocumentAccess document){ 37 public ModelGenerationStartedResult generateModel(PushWebDocumentAccess document, int randomSeed) {
38 return document.modify(new CancelableUnitOfWork<>() { 38 return document.modify(new CancelableUnitOfWork<>() {
39 @Override 39 @Override
40 public ModelGenerationStartedResult exec(IXtextWebDocument state, CancelIndicator cancelIndicator) { 40 public ModelGenerationStartedResult exec(IXtextWebDocument state, CancelIndicator cancelIndicator) {
41 var pushState = (PushWebDocument) state; 41 var pushState = (PushWebDocument) state;
42 var worker = workerProvider.get(); 42 var worker = workerProvider.get();
43 worker.setState(pushState, timeoutSec); 43 worker.setState(pushState, randomSeed, timeoutSec);
44 var manager = pushState.getModelGenerationManager(); 44 var manager = pushState.getModelGenerationManager();
45 worker.start(); 45 worker.start();
46 boolean canceled = manager.setActiveModelGenerationWorker(worker, cancelIndicator); 46 boolean canceled = manager.setActiveModelGenerationWorker(worker, cancelIndicator);
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 77fc7484..9ee74207 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
@@ -79,6 +79,8 @@ public class ModelGenerationWorker implements Runnable {
79 79
80 private ScheduledExecutorService scheduledExecutorService; 80 private ScheduledExecutorService scheduledExecutorService;
81 81
82 private int randomSeed;
83
82 private long timeoutSec; 84 private long timeoutSec;
83 85
84 private Future<?> future; 86 private Future<?> future;
@@ -97,8 +99,9 @@ public class ModelGenerationWorker implements Runnable {
97 scheduledExecutorService = provider.getScheduled(ModelGenerationService.MODEL_GENERATION_TIMEOUT_EXECUTOR); 99 scheduledExecutorService = provider.getScheduled(ModelGenerationService.MODEL_GENERATION_TIMEOUT_EXECUTOR);
98 } 100 }
99 101
100 public void setState(PushWebDocument state, long timeoutSec) { 102 public void setState(PushWebDocument state, int randomSeed, long timeoutSec) {
101 this.state = state; 103 this.state = state;
104 this.randomSeed = randomSeed;
102 this.timeoutSec = timeoutSec; 105 this.timeoutSec = timeoutSec;
103 text = state.getText(); 106 text = state.getText();
104 } 107 }
@@ -188,7 +191,7 @@ public class ModelGenerationWorker implements Runnable {
188 cancellationToken.checkCancelled(); 191 cancellationToken.checkCancelled();
189 notifyResult(new ModelGenerationStatusResult(uuid, "Generating model")); 192 notifyResult(new ModelGenerationStatusResult(uuid, "Generating model"));
190 var bestFirst = new BestFirstStoreManager(store, 1); 193 var bestFirst = new BestFirstStoreManager(store, 1);
191 bestFirst.startExploration(initialVersion); 194 bestFirst.startExploration(initialVersion, randomSeed);
192 cancellationToken.checkCancelled(); 195 cancellationToken.checkCancelled();
193 var solutionStore = bestFirst.getSolutionStore(); 196 var solutionStore = bestFirst.getSolutionStore();
194 if (solutionStore.getSolutions().isEmpty()) { 197 if (solutionStore.getSolutions().isEmpty()) {
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ThreadPoolExecutorServiceProvider.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ThreadPoolExecutorServiceProvider.java
index 625909b9..ff8f4943 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ThreadPoolExecutorServiceProvider.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/ThreadPoolExecutorServiceProvider.java
@@ -9,6 +9,9 @@ import com.google.inject.Singleton;
9import org.eclipse.xtext.ide.ExecutorServiceProvider; 9import org.eclipse.xtext.ide.ExecutorServiceProvider;
10import org.eclipse.xtext.web.server.model.XtextWebDocumentAccess; 10import org.eclipse.xtext.web.server.model.XtextWebDocumentAccess;
11import org.jetbrains.annotations.NotNull; 11import org.jetbrains.annotations.NotNull;
12import org.slf4j.Logger;
13import org.slf4j.LoggerFactory;
14import tools.refinery.language.web.generator.ModelGenerationService;
12import tools.refinery.language.web.semantics.SemanticsService; 15import tools.refinery.language.web.semantics.SemanticsService;
13 16
14import java.lang.invoke.MethodHandle; 17import java.lang.invoke.MethodHandle;
@@ -25,6 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger;
25 28
26@Singleton 29@Singleton
27public class ThreadPoolExecutorServiceProvider extends ExecutorServiceProvider { 30public class ThreadPoolExecutorServiceProvider extends ExecutorServiceProvider {
31 private static final Logger LOG = LoggerFactory.getLogger(ThreadPoolExecutorServiceProvider.class);
28 private static final String DOCUMENT_LOCK_EXECUTOR; 32 private static final String DOCUMENT_LOCK_EXECUTOR;
29 private static final AtomicInteger POOL_ID = new AtomicInteger(1); 33 private static final AtomicInteger POOL_ID = new AtomicInteger(1);
30 34
@@ -33,6 +37,7 @@ public class ThreadPoolExecutorServiceProvider extends ExecutorServiceProvider {
33 private final int executorThreadCount; 37 private final int executorThreadCount;
34 private final int lockExecutorThreadCount; 38 private final int lockExecutorThreadCount;
35 private final int semanticsExecutorThreadCount; 39 private final int semanticsExecutorThreadCount;
40 private final int generatorExecutorThreadCount;
36 41
37 static { 42 static {
38 var lookup = MethodHandles.lookup(); 43 var lookup = MethodHandles.lookup();
@@ -57,7 +62,18 @@ public class ThreadPoolExecutorServiceProvider extends ExecutorServiceProvider {
57 public ThreadPoolExecutorServiceProvider() { 62 public ThreadPoolExecutorServiceProvider() {
58 executorThreadCount = getCount("REFINERY_XTEXT_THREAD_COUNT").orElse(0); 63 executorThreadCount = getCount("REFINERY_XTEXT_THREAD_COUNT").orElse(0);
59 lockExecutorThreadCount = getCount("REFINERY_XTEXT_LOCKING_THREAD_COUNT").orElse(executorThreadCount); 64 lockExecutorThreadCount = getCount("REFINERY_XTEXT_LOCKING_THREAD_COUNT").orElse(executorThreadCount);
60 semanticsExecutorThreadCount = getCount("REFINERY_XTEXT_SEMANTICS_THREAD_COUNT").orElse(executorThreadCount); 65 int semanticsCount = getCount("REFINERY_XTEXT_SEMANTICS_THREAD_COUNT").orElse(0);
66 if (semanticsCount == 0 || executorThreadCount == 0) {
67 semanticsExecutorThreadCount = 0;
68 } else {
69 semanticsExecutorThreadCount = Math.max(semanticsCount, executorThreadCount);
70 }
71 if (semanticsExecutorThreadCount != semanticsCount) {
72 LOG.warn("Setting REFINERY_XTEXT_SEMANTICS_THREAD_COUNT to {} to avoid deadlock. This value must be " +
73 "either 0 or at least as large as REFINERY_XTEXT_THREAD_COUNT to avoid lock contention.",
74 semanticsExecutorThreadCount);
75 }
76 generatorExecutorThreadCount = getCount("REFINERY_MODEL_GENERATION_THREAD_COUNT").orElse(executorThreadCount);
61 } 77 }
62 78
63 private static Optional<Integer> getCount(String name) { 79 private static Optional<Integer> getCount(String name) {
@@ -94,6 +110,8 @@ public class ThreadPoolExecutorServiceProvider extends ExecutorServiceProvider {
94 private int getSize(String key) { 110 private int getSize(String key) {
95 if (SemanticsService.SEMANTICS_EXECUTOR.equals(key)) { 111 if (SemanticsService.SEMANTICS_EXECUTOR.equals(key)) {
96 return semanticsExecutorThreadCount; 112 return semanticsExecutorThreadCount;
113 } else if (ModelGenerationService.MODEL_GENERATION_EXECUTOR.equals(key)) {
114 return generatorExecutorThreadCount;
97 } else if (DOCUMENT_LOCK_EXECUTOR.equals(key)) { 115 } else if (DOCUMENT_LOCK_EXECUTOR.equals(key)) {
98 return lockExecutorThreadCount; 116 return lockExecutorThreadCount;
99 } else { 117 } else {
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java
index a04ee226..e1d00d8f 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/server/push/PushServiceDispatcher.java
@@ -62,11 +62,13 @@ public class PushServiceDispatcher extends XtextServiceDispatcher {
62 if (!start && !cancel) { 62 if (!start && !cancel) {
63 throw new InvalidRequestException("Either start of cancel must be specified"); 63 throw new InvalidRequestException("Either start of cancel must be specified");
64 } 64 }
65 @SuppressWarnings({"squid:S4738"})
66 int randomSeed = start ? getInt(context, "randomSeed", Optional.absent()) : 0;
65 var descriptor = new ServiceDescriptor(); 67 var descriptor = new ServiceDescriptor();
66 descriptor.setService(() -> { 68 descriptor.setService(() -> {
67 try { 69 try {
68 if (start) { 70 if (start) {
69 return modelGenerationService.generateModel(document); 71 return modelGenerationService.generateModel(document, randomSeed);
70 } else { 72 } else {
71 return modelGenerationService.cancelModelGeneration(document); 73 return modelGenerationService.cancelModelGeneration(document);
72 } 74 }