/*
* SPDX-FileCopyrightText: 2021-2023 The Refinery Authors
*
* SPDX-License-Identifier: EPL-2.0
*/
package tools.refinery.store.dse;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import tools.refinery.store.dse.modification.ModificationAdapter;
import tools.refinery.store.dse.strategy.BestFirstStoreManager;
import tools.refinery.store.dse.tests.DummyRandomCriterion;
import tools.refinery.store.dse.tests.DummyRandomObjective;
import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter;
import tools.refinery.store.dse.transition.Rule;
import tools.refinery.store.model.ModelStore;
import tools.refinery.store.query.ModelQueryAdapter;
import tools.refinery.store.query.interpreter.QueryInterpreterAdapter;
import tools.refinery.store.query.view.AnySymbolView;
import tools.refinery.store.query.view.KeyOnlyView;
import tools.refinery.store.representation.Symbol;
import tools.refinery.store.statecoding.StateCoderAdapter;
import tools.refinery.visualization.ModelVisualizerAdapter;
import tools.refinery.visualization.internal.FileFormat;
import java.util.List;
import static tools.refinery.store.dse.modification.actions.ModificationActionLiterals.create;
import static tools.refinery.store.dse.transition.actions.ActionLiterals.add;
class DebugTest {
private static final Symbol classModel = Symbol.of("ClassModel", 1);
private static final Symbol classElement = Symbol.of("ClassElement", 1);
private static final Symbol feature = Symbol.of("Feature", 1);
private static final Symbol features = Symbol.of("Features", 2);
private static final Symbol classes = Symbol.of("Classes", 2);
private static final AnySymbolView classModelView = new KeyOnlyView<>(classModel);
@Test
@Disabled("This test is only for debugging purposes")
void BFSTest() {
var createClassRule = Rule.of("CreateClass", (builder, model) -> builder
.clause(
classModelView.call(model)
)
.action((newClassElement) -> List.of(
create(newClassElement),
add(classElement, newClassElement),
add(classes, model, newClassElement)
)));
var createFeatureRule = Rule.of("CreateFeature", (builder, model) -> builder
.clause(
classModelView.call(model)
)
.action((newFeature) -> List.of(
create(newFeature),
add(feature, newFeature),
add(features, model, newFeature)
)));
var store = ModelStore.builder()
.symbols(classModel, classElement, feature, classes, features)
.with(QueryInterpreterAdapter.builder())
.with(ModelVisualizerAdapter.builder()
.withOutputPath("test_output")
.withFormat(FileFormat.DOT)
.withFormat(FileFormat.SVG)
.saveStates()
.saveDesignSpace())
.with(StateCoderAdapter.builder())
.with(ModificationAdapter.builder())
.with(DesignSpaceExplorationAdapter.builder()
.transformations(createClassRule, createFeatureRule)
.objectives(new DummyRandomObjective())
.accept(new DummyRandomCriterion())
.exclude(new DummyRandomCriterion()))
.build();
var model = store.createEmptyModel();
var dseAdapter = model.getAdapter(ModificationAdapter.class);
// dseAdapter.setRandom(1);
var queryEngine = model.getAdapter(ModelQueryAdapter.class);
var modelElementInterpretation = model.getInterpretation(classModel);
var classElementInterpretation = model.getInterpretation(classElement);
var modelElement = dseAdapter.createObject();
modelElementInterpretation.put(modelElement, true);
classElementInterpretation.put(modelElement, true);
var initialVersion = model.commit();
queryEngine.flushChanges();
var bestFirst = new BestFirstStoreManager(store, 50);
bestFirst.startExploration(initialVersion);
var resultStore = bestFirst.getSolutionStore();
System.out.println("states size: " + resultStore.getSolutions().size());
}
}