From f06427cd7375551582461f91b3458339a8227f9b Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 2 Nov 2020 02:02:40 +0100 Subject: Optimizing generator with linear objective functions --- .../vql-gen/modes3/queries/.gitignore | 45 ++ .../vql-gen/modes3/queries/EndOfSiding_step_2.java | 564 ++++++++++++++ .../vql-gen/modes3/queries/EndOfSiding_step_3.java | 717 +++++++++++++++++ .../vql-gen/modes3/queries/EndOfSiding_step_4.java | 847 +++++++++++++++++++++ .../vql-gen/modes3/queries/EndOfSiding_step_5.java | 841 ++++++++++++++++++++ .../vql-gen/modes3/queries/Modes3Queries.java | 198 +++++ .../modes3/queries/MultipleConnectedTo.java | 565 ++++++++++++++ .../modes3/queries/TooManyInputsOfSegment.java | 12 - .../modes3/queries/TrainLocations_step_2.java | 564 ++++++++++++++ .../modes3/queries/TrainLocations_step_3.java | 713 +++++++++++++++++ 10 files changed, 5054 insertions(+), 12 deletions(-) create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_2.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_3.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_4.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_5.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/MultipleConnectedTo.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_2.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_3.java (limited to 'Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries') diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore index b3e38571..a84c2906 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore @@ -31,3 +31,48 @@ /.TooManyNonStraightInputsOfTurnout.java._trace /.InputsOfTurnout.java._trace /.TooFewInputsOfTurnout.java._trace +/.CloseTrains_step_2.java._trace +/.CloseTrains_step_3.java._trace +/.CloseTrains_step_4.java._trace +/.CloseTrains_step_5.java._trace +/.CloseTrains_step_6.java._trace +/.CloseTrains_step_7.java._trace +/.MisalignedTurnout_step_2.java._trace +/.MisalignedTurnout_step_3.java._trace +/.MisalignedTurnout_step_4.java._trace +/.MisalignedTurnout_step_5.java._trace +/.ConnectedSegmentsDirected.java._trace +/Adjacent.java +/CloseTrains_step_2.java +/CloseTrains_step_3.java +/CloseTrains_step_4.java +/CloseTrains_step_5.java +/CloseTrains_step_6.java +/CloseTrains_step_7.java +/ConnectedSegmentsDirected.java +/ConnectedTo.java +/ConnectedToNotSymmetric.java +/ConnectedToReflexive.java +/InputsOfTurnout.java +/MisalignedTurnout_step_2.java +/MisalignedTurnout_step_3.java +/MisalignedTurnout_step_4.java +/MisalignedTurnout_step_5.java +/Modes3Queries.java +/Output.java +/OutputReflexive.java +/Reachable.java +/TooFewInputsOfTurnout.java +/TooManyInputsOfSegment.java +/TooManyInputsOfTurnout.java +/TurnoutConnectedToBothOutputs.java +/TurnoutOutput.java +/TurnoutOutputsAreSame.java +/Unreachable.java +/.TrainLocations_step_2.java._trace +/.TrainLocations_step_3.java._trace +/.EndOfSiding_step_2.java._trace +/.EndOfSiding_step_3.java._trace +/.EndOfSiding_step_4.java._trace +/.EndOfSiding_step_5.java._trace +/.MultipleConnectedTo.java._trace diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_2.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_2.java new file mode 100644 index 00000000..a8f68dca --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_2.java @@ -0,0 +1,564 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Train; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

Original source: + *

+ *         //
+ *         // endOfSiding
+ *         //
+ *         
+ *         pattern endOfSiding_step_2(in train : Train) {
+ *         //   frame-{@literal >}train = model-{@literal >}trains[i0];
+ *         //   frame-{@literal >}location = frame-{@literal >}train-{@literal >}location;
+ *         //   if (frame-{@literal >}location != NULL) {
+ *         //     ...
+ *         //   }
+ *         
+ *         	Train(train);
+ *         }
+ * 
+ * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class EndOfSiding_step_2 extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.endOfSiding_step_2 pattern, + * to be used in conjunction with {@link Matcher}. + * + *

Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Train fTrain; + + private static List parameterNames = makeImmutableList("train"); + + private Match(final Train pTrain) { + this.fTrain = pTrain; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "train": return this.fTrain; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fTrain; + default: return null; + } + } + + public Train getTrain() { + return this.fTrain; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("train".equals(parameterName) ) { + this.fTrain = (Train) newValue; + return true; + } + return false; + } + + public void setTrain(final Train pTrain) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fTrain = pTrain; + } + + @Override + public String patternName() { + return "modes3.queries.endOfSiding_step_2"; + } + + @Override + public List parameterNames() { + return EndOfSiding_step_2.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fTrain}; + } + + @Override + public EndOfSiding_step_2.Match toImmutable() { + return isMutable() ? newMatch(fTrain) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"train\"=" + prettyPrintValue(fTrain)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fTrain); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof EndOfSiding_step_2.Match)) { + EndOfSiding_step_2.Match other = (EndOfSiding_step_2.Match) obj; + return Objects.equals(fTrain, other.fTrain); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public EndOfSiding_step_2 specification() { + return EndOfSiding_step_2.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static EndOfSiding_step_2.Match newEmptyMatch() { + return new Mutable(null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static EndOfSiding_step_2.Match newMutableMatch(final Train pTrain) { + return new Mutable(pTrain); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return the (partial) match object. + * + */ + public static EndOfSiding_step_2.Match newMatch(final Train pTrain) { + return new Immutable(pTrain); + } + + private static final class Mutable extends EndOfSiding_step_2.Match { + Mutable(final Train pTrain) { + super(pTrain); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends EndOfSiding_step_2.Match { + Immutable(final Train pTrain) { + super(pTrain); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.endOfSiding_step_2 pattern, + * providing pattern-specific query methods. + * + *

Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

Matches of the pattern will be represented as {@link Match}. + * + *

Original source: + *

+   * //
+   * // endOfSiding
+   * //
+   * 
+   * pattern endOfSiding_step_2(in train : Train) {
+   * //   frame-{@literal >}train = model-{@literal >}trains[i0];
+   * //   frame-{@literal >}location = frame-{@literal >}train-{@literal >}location;
+   * //   if (frame-{@literal >}location != NULL) {
+   * //     ...
+   * //   }
+   * 
+   * 	Train(train);
+   * }
+   * 
+ * + * @see Match + * @see EndOfSiding_step_2 + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static EndOfSiding_step_2.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static EndOfSiding_step_2.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_TRAIN = 0; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(EndOfSiding_step_2.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Train pTrain) { + return rawStreamAllMatches(new Object[]{pTrain}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Train pTrain) { + return rawStreamAllMatches(new Object[]{pTrain}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Train pTrain) { + return rawGetOneArbitraryMatch(new Object[]{pTrain}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Train pTrain) { + return rawHasMatch(new Object[]{pTrain}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Train pTrain) { + return rawCountMatches(new Object[]{pTrain}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Train pTrain, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pTrain}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return the (partial) match object. + * + */ + public EndOfSiding_step_2.Match newMatch(final Train pTrain) { + return EndOfSiding_step_2.Match.newMatch(pTrain); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOftrain(final Object[] parameters) { + return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()); + } + + @Override + protected EndOfSiding_step_2.Match tupleToMatch(final Tuple t) { + try { + return EndOfSiding_step_2.Match.newMatch((Train) t.get(POSITION_TRAIN)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected EndOfSiding_step_2.Match arrayToMatch(final Object[] match) { + try { + return EndOfSiding_step_2.Match.newMatch((Train) match[POSITION_TRAIN]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected EndOfSiding_step_2.Match arrayToMatchMutable(final Object[] match) { + try { + return EndOfSiding_step_2.Match.newMutableMatch((Train) match[POSITION_TRAIN]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return EndOfSiding_step_2.instance(); + } + } + + private EndOfSiding_step_2() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static EndOfSiding_step_2 instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected EndOfSiding_step_2.Matcher instantiate(final ViatraQueryEngine engine) { + return EndOfSiding_step_2.Matcher.on(engine); + } + + @Override + public EndOfSiding_step_2.Matcher instantiate() { + return EndOfSiding_step_2.Matcher.create(); + } + + @Override + public EndOfSiding_step_2.Match newEmptyMatch() { + return EndOfSiding_step_2.Match.newEmptyMatch(); + } + + @Override + public EndOfSiding_step_2.Match newMatch(final Object... parameters) { + return EndOfSiding_step_2.Match.newMatch((modes3.Train) parameters[0]); + } + + /** + * Inner class allowing the singleton instance of {@link EndOfSiding_step_2} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link EndOfSiding_step_2#instance()}. + * + *

This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final EndOfSiding_step_2 INSTANCE = new EndOfSiding_step_2(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final EndOfSiding_step_2.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_train); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.endOfSiding_step_2"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("train"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_train = body.getOrCreateVariableByName("train"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_train, parameter_train) + )); + // // frame->train = model->trains[i0];// frame->location = frame->train->location;// if (frame->location != NULL) {// ...// } Train(train) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + bodies.add(body); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_3.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_3.java new file mode 100644 index 00000000..16b28a9f --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_3.java @@ -0,0 +1,717 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Segment; +import modes3.Train; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

Original source: + *

+ *         pattern endOfSiding_step_3(in train : Train, in location : Segment) {
+ *         //     int loop_bound1 = frame-{@literal >}location-{@literal >}connected_to_count;
+ *         //     for (int i1 = 0; i1 {@literal <} loop_bound1; i1++) {
+ *         //       ...
+ *         //     }
+ *         	Train(train);
+ *             Train.location(train, location);
+ *         }
+ * 
+ * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class EndOfSiding_step_3 extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.endOfSiding_step_3 pattern, + * to be used in conjunction with {@link Matcher}. + * + *

Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Train fTrain; + + private Segment fLocation; + + private static List parameterNames = makeImmutableList("train", "location"); + + private Match(final Train pTrain, final Segment pLocation) { + this.fTrain = pTrain; + this.fLocation = pLocation; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "train": return this.fTrain; + case "location": return this.fLocation; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fTrain; + case 1: return this.fLocation; + default: return null; + } + } + + public Train getTrain() { + return this.fTrain; + } + + public Segment getLocation() { + return this.fLocation; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("train".equals(parameterName) ) { + this.fTrain = (Train) newValue; + return true; + } + if ("location".equals(parameterName) ) { + this.fLocation = (Segment) newValue; + return true; + } + return false; + } + + public void setTrain(final Train pTrain) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fTrain = pTrain; + } + + public void setLocation(final Segment pLocation) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fLocation = pLocation; + } + + @Override + public String patternName() { + return "modes3.queries.endOfSiding_step_3"; + } + + @Override + public List parameterNames() { + return EndOfSiding_step_3.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fTrain, fLocation}; + } + + @Override + public EndOfSiding_step_3.Match toImmutable() { + return isMutable() ? newMatch(fTrain, fLocation) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"train\"=" + prettyPrintValue(fTrain) + ", "); + result.append("\"location\"=" + prettyPrintValue(fLocation)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fTrain, fLocation); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof EndOfSiding_step_3.Match)) { + EndOfSiding_step_3.Match other = (EndOfSiding_step_3.Match) obj; + return Objects.equals(fTrain, other.fTrain) && Objects.equals(fLocation, other.fLocation); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public EndOfSiding_step_3 specification() { + return EndOfSiding_step_3.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static EndOfSiding_step_3.Match newEmptyMatch() { + return new Mutable(null, null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static EndOfSiding_step_3.Match newMutableMatch(final Train pTrain, final Segment pLocation) { + return new Mutable(pTrain, pLocation); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return the (partial) match object. + * + */ + public static EndOfSiding_step_3.Match newMatch(final Train pTrain, final Segment pLocation) { + return new Immutable(pTrain, pLocation); + } + + private static final class Mutable extends EndOfSiding_step_3.Match { + Mutable(final Train pTrain, final Segment pLocation) { + super(pTrain, pLocation); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends EndOfSiding_step_3.Match { + Immutable(final Train pTrain, final Segment pLocation) { + super(pTrain, pLocation); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.endOfSiding_step_3 pattern, + * providing pattern-specific query methods. + * + *

Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

Matches of the pattern will be represented as {@link Match}. + * + *

Original source: + *

+   * pattern endOfSiding_step_3(in train : Train, in location : Segment) {
+   * //     int loop_bound1 = frame-{@literal >}location-{@literal >}connected_to_count;
+   * //     for (int i1 = 0; i1 {@literal <} loop_bound1; i1++) {
+   * //       ...
+   * //     }
+   * 	Train(train);
+   *     Train.location(train, location);
+   * }
+   * 
+ * + * @see Match + * @see EndOfSiding_step_3 + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static EndOfSiding_step_3.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static EndOfSiding_step_3.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_TRAIN = 0; + + private static final int POSITION_LOCATION = 1; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(EndOfSiding_step_3.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Train pTrain, final Segment pLocation) { + return rawStreamAllMatches(new Object[]{pTrain, pLocation}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Train pTrain, final Segment pLocation) { + return rawStreamAllMatches(new Object[]{pTrain, pLocation}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Train pTrain, final Segment pLocation) { + return rawGetOneArbitraryMatch(new Object[]{pTrain, pLocation}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Train pTrain, final Segment pLocation) { + return rawHasMatch(new Object[]{pTrain, pLocation}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Train pTrain, final Segment pLocation) { + return rawCountMatches(new Object[]{pTrain, pLocation}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pTrain, pLocation}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return the (partial) match object. + * + */ + public EndOfSiding_step_3.Match newMatch(final Train pTrain, final Segment pLocation) { + return EndOfSiding_step_3.Match.newMatch(pTrain, pLocation); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOftrain(final Object[] parameters) { + return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for train. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain(final EndOfSiding_step_3.Match partialMatch) { + return rawStreamAllValuesOftrain(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for train. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain(final Segment pLocation) { + return rawStreamAllValuesOftrain(new Object[]{null, pLocation}); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain(final EndOfSiding_step_3.Match partialMatch) { + return rawStreamAllValuesOftrain(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain(final Segment pLocation) { + return rawStreamAllValuesOftrain(new Object[]{null, pLocation}).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOflocation(final Object[] parameters) { + return rawStreamAllValues(POSITION_LOCATION, parameters).map(Segment.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation() { + return rawStreamAllValuesOflocation(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation() { + return rawStreamAllValuesOflocation(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for location. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation(final EndOfSiding_step_3.Match partialMatch) { + return rawStreamAllValuesOflocation(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for location. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation(final Train pTrain) { + return rawStreamAllValuesOflocation(new Object[]{pTrain, null}); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation(final EndOfSiding_step_3.Match partialMatch) { + return rawStreamAllValuesOflocation(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation(final Train pTrain) { + return rawStreamAllValuesOflocation(new Object[]{pTrain, null}).collect(Collectors.toSet()); + } + + @Override + protected EndOfSiding_step_3.Match tupleToMatch(final Tuple t) { + try { + return EndOfSiding_step_3.Match.newMatch((Train) t.get(POSITION_TRAIN), (Segment) t.get(POSITION_LOCATION)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected EndOfSiding_step_3.Match arrayToMatch(final Object[] match) { + try { + return EndOfSiding_step_3.Match.newMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected EndOfSiding_step_3.Match arrayToMatchMutable(final Object[] match) { + try { + return EndOfSiding_step_3.Match.newMutableMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return EndOfSiding_step_3.instance(); + } + } + + private EndOfSiding_step_3() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static EndOfSiding_step_3 instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected EndOfSiding_step_3.Matcher instantiate(final ViatraQueryEngine engine) { + return EndOfSiding_step_3.Matcher.on(engine); + } + + @Override + public EndOfSiding_step_3.Matcher instantiate() { + return EndOfSiding_step_3.Matcher.create(); + } + + @Override + public EndOfSiding_step_3.Match newEmptyMatch() { + return EndOfSiding_step_3.Match.newEmptyMatch(); + } + + @Override + public EndOfSiding_step_3.Match newMatch(final Object... parameters) { + return EndOfSiding_step_3.Match.newMatch((modes3.Train) parameters[0], (modes3.Segment) parameters[1]); + } + + /** + * Inner class allowing the singleton instance of {@link EndOfSiding_step_3} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link EndOfSiding_step_3#instance()}. + * + *

This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final EndOfSiding_step_3 INSTANCE = new EndOfSiding_step_3(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final EndOfSiding_step_3.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT); + + private final PParameter parameter_location = new PParameter("location", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_train, parameter_location); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.endOfSiding_step_3"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("train","location"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_train = body.getOrCreateVariableByName("train"); + PVariable var_location = body.getOrCreateVariableByName("location"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_train, parameter_train), + new ExportedParameter(body, var_location, parameter_location) + )); + // // int loop_bound1 = frame->location->connected_to_count;// for (int i1 = 0; i1 < loop_bound1; i1++) {// ...// } Train(train) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + // Train.location(train, location) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train", "location"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new Equality(body, var__virtual_0_, var_location); + bodies.add(body); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_4.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_4.java new file mode 100644 index 00000000..73df8514 --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_4.java @@ -0,0 +1,847 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Segment; +import modes3.Train; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

Original source: + *

+ *         pattern endOfSiding_step_4(in train : Train, in location : Segment, in end : Segment) {
+ *         //       frame-{@literal >}end = frame-{@literal >}location-{@literal >}connected_to[i1];
+ *         //       if (frame-{@literal >}end != NULL &&
+ *         //			 frame-{@literal >}end-{@literal >}connected_to[1] == frame-{@literal >}location &&
+ *         //           frame-{@literal >}end-{@literal >}connected_to[0] == NULL) {
+ *         //         ...
+ *         //       } 
+ *         //     	 if (frame-{@literal >}end != NULL &&
+ *         //			 frame-{@literal >}end-{@literal >}connected_to[0] == frame-{@literal >}location &&
+ *         //           frame-{@literal >}end-{@literal >}connected_to[1] == NULL) {
+ *         //         ...
+ *         //       }
+ *         	Train(train);
+ *             Train.location(train, location);
+ *             Segment.connectedTo(location, end);
+ *         }
+ * 
+ * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class EndOfSiding_step_4 extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.endOfSiding_step_4 pattern, + * to be used in conjunction with {@link Matcher}. + * + *

Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Train fTrain; + + private Segment fLocation; + + private Segment fEnd; + + private static List parameterNames = makeImmutableList("train", "location", "end"); + + private Match(final Train pTrain, final Segment pLocation, final Segment pEnd) { + this.fTrain = pTrain; + this.fLocation = pLocation; + this.fEnd = pEnd; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "train": return this.fTrain; + case "location": return this.fLocation; + case "end": return this.fEnd; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fTrain; + case 1: return this.fLocation; + case 2: return this.fEnd; + default: return null; + } + } + + public Train getTrain() { + return this.fTrain; + } + + public Segment getLocation() { + return this.fLocation; + } + + public Segment getEnd() { + return this.fEnd; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("train".equals(parameterName) ) { + this.fTrain = (Train) newValue; + return true; + } + if ("location".equals(parameterName) ) { + this.fLocation = (Segment) newValue; + return true; + } + if ("end".equals(parameterName) ) { + this.fEnd = (Segment) newValue; + return true; + } + return false; + } + + public void setTrain(final Train pTrain) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fTrain = pTrain; + } + + public void setLocation(final Segment pLocation) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fLocation = pLocation; + } + + public void setEnd(final Segment pEnd) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fEnd = pEnd; + } + + @Override + public String patternName() { + return "modes3.queries.endOfSiding_step_4"; + } + + @Override + public List parameterNames() { + return EndOfSiding_step_4.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fTrain, fLocation, fEnd}; + } + + @Override + public EndOfSiding_step_4.Match toImmutable() { + return isMutable() ? newMatch(fTrain, fLocation, fEnd) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"train\"=" + prettyPrintValue(fTrain) + ", "); + result.append("\"location\"=" + prettyPrintValue(fLocation) + ", "); + result.append("\"end\"=" + prettyPrintValue(fEnd)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fTrain, fLocation, fEnd); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof EndOfSiding_step_4.Match)) { + EndOfSiding_step_4.Match other = (EndOfSiding_step_4.Match) obj; + return Objects.equals(fTrain, other.fTrain) && Objects.equals(fLocation, other.fLocation) && Objects.equals(fEnd, other.fEnd); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public EndOfSiding_step_4 specification() { + return EndOfSiding_step_4.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static EndOfSiding_step_4.Match newEmptyMatch() { + return new Mutable(null, null, null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static EndOfSiding_step_4.Match newMutableMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return new Mutable(pTrain, pLocation, pEnd); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return the (partial) match object. + * + */ + public static EndOfSiding_step_4.Match newMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return new Immutable(pTrain, pLocation, pEnd); + } + + private static final class Mutable extends EndOfSiding_step_4.Match { + Mutable(final Train pTrain, final Segment pLocation, final Segment pEnd) { + super(pTrain, pLocation, pEnd); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends EndOfSiding_step_4.Match { + Immutable(final Train pTrain, final Segment pLocation, final Segment pEnd) { + super(pTrain, pLocation, pEnd); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.endOfSiding_step_4 pattern, + * providing pattern-specific query methods. + * + *

Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

Matches of the pattern will be represented as {@link Match}. + * + *

Original source: + *

+   * pattern endOfSiding_step_4(in train : Train, in location : Segment, in end : Segment) {
+   * //       frame-{@literal >}end = frame-{@literal >}location-{@literal >}connected_to[i1];
+   * //       if (frame-{@literal >}end != NULL &&
+   * //			 frame-{@literal >}end-{@literal >}connected_to[1] == frame-{@literal >}location &&
+   * //           frame-{@literal >}end-{@literal >}connected_to[0] == NULL) {
+   * //         ...
+   * //       } 
+   * //     	 if (frame-{@literal >}end != NULL &&
+   * //			 frame-{@literal >}end-{@literal >}connected_to[0] == frame-{@literal >}location &&
+   * //           frame-{@literal >}end-{@literal >}connected_to[1] == NULL) {
+   * //         ...
+   * //       }
+   * 	Train(train);
+   *     Train.location(train, location);
+   *     Segment.connectedTo(location, end);
+   * }
+   * 
+ * + * @see Match + * @see EndOfSiding_step_4 + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static EndOfSiding_step_4.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static EndOfSiding_step_4.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_TRAIN = 0; + + private static final int POSITION_LOCATION = 1; + + private static final int POSITION_END = 2; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(EndOfSiding_step_4.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawStreamAllMatches(new Object[]{pTrain, pLocation, pEnd}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawStreamAllMatches(new Object[]{pTrain, pLocation, pEnd}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawGetOneArbitraryMatch(new Object[]{pTrain, pLocation, pEnd}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawHasMatch(new Object[]{pTrain, pLocation, pEnd}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawCountMatches(new Object[]{pTrain, pLocation, pEnd}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Segment pEnd, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pTrain, pLocation, pEnd}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return the (partial) match object. + * + */ + public EndOfSiding_step_4.Match newMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return EndOfSiding_step_4.Match.newMatch(pTrain, pLocation, pEnd); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOftrain(final Object[] parameters) { + return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for train. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain(final EndOfSiding_step_4.Match partialMatch) { + return rawStreamAllValuesOftrain(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for train. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain(final Segment pLocation, final Segment pEnd) { + return rawStreamAllValuesOftrain(new Object[]{null, pLocation, pEnd}); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain(final EndOfSiding_step_4.Match partialMatch) { + return rawStreamAllValuesOftrain(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain(final Segment pLocation, final Segment pEnd) { + return rawStreamAllValuesOftrain(new Object[]{null, pLocation, pEnd}).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOflocation(final Object[] parameters) { + return rawStreamAllValues(POSITION_LOCATION, parameters).map(Segment.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation() { + return rawStreamAllValuesOflocation(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation() { + return rawStreamAllValuesOflocation(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for location. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation(final EndOfSiding_step_4.Match partialMatch) { + return rawStreamAllValuesOflocation(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for location. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation(final Train pTrain, final Segment pEnd) { + return rawStreamAllValuesOflocation(new Object[]{pTrain, null, pEnd}); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation(final EndOfSiding_step_4.Match partialMatch) { + return rawStreamAllValuesOflocation(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation(final Train pTrain, final Segment pEnd) { + return rawStreamAllValuesOflocation(new Object[]{pTrain, null, pEnd}).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfend(final Object[] parameters) { + return rawStreamAllValues(POSITION_END, parameters).map(Segment.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfend() { + return rawStreamAllValuesOfend(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfend() { + return rawStreamAllValuesOfend(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for end. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfend(final EndOfSiding_step_4.Match partialMatch) { + return rawStreamAllValuesOfend(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for end. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfend(final Train pTrain, final Segment pLocation) { + return rawStreamAllValuesOfend(new Object[]{pTrain, pLocation, null}); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfend(final EndOfSiding_step_4.Match partialMatch) { + return rawStreamAllValuesOfend(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfend(final Train pTrain, final Segment pLocation) { + return rawStreamAllValuesOfend(new Object[]{pTrain, pLocation, null}).collect(Collectors.toSet()); + } + + @Override + protected EndOfSiding_step_4.Match tupleToMatch(final Tuple t) { + try { + return EndOfSiding_step_4.Match.newMatch((Train) t.get(POSITION_TRAIN), (Segment) t.get(POSITION_LOCATION), (Segment) t.get(POSITION_END)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected EndOfSiding_step_4.Match arrayToMatch(final Object[] match) { + try { + return EndOfSiding_step_4.Match.newMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION], (Segment) match[POSITION_END]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected EndOfSiding_step_4.Match arrayToMatchMutable(final Object[] match) { + try { + return EndOfSiding_step_4.Match.newMutableMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION], (Segment) match[POSITION_END]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return EndOfSiding_step_4.instance(); + } + } + + private EndOfSiding_step_4() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static EndOfSiding_step_4 instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected EndOfSiding_step_4.Matcher instantiate(final ViatraQueryEngine engine) { + return EndOfSiding_step_4.Matcher.on(engine); + } + + @Override + public EndOfSiding_step_4.Matcher instantiate() { + return EndOfSiding_step_4.Matcher.create(); + } + + @Override + public EndOfSiding_step_4.Match newEmptyMatch() { + return EndOfSiding_step_4.Match.newEmptyMatch(); + } + + @Override + public EndOfSiding_step_4.Match newMatch(final Object... parameters) { + return EndOfSiding_step_4.Match.newMatch((modes3.Train) parameters[0], (modes3.Segment) parameters[1], (modes3.Segment) parameters[2]); + } + + /** + * Inner class allowing the singleton instance of {@link EndOfSiding_step_4} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link EndOfSiding_step_4#instance()}. + * + *

This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final EndOfSiding_step_4 INSTANCE = new EndOfSiding_step_4(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final EndOfSiding_step_4.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT); + + private final PParameter parameter_location = new PParameter("location", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); + + private final PParameter parameter_end = new PParameter("end", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_train, parameter_location, parameter_end); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.endOfSiding_step_4"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("train","location","end"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_train = body.getOrCreateVariableByName("train"); + PVariable var_location = body.getOrCreateVariableByName("location"); + PVariable var_end = body.getOrCreateVariableByName("end"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new TypeConstraint(body, Tuples.flatTupleOf(var_end), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_train, parameter_train), + new ExportedParameter(body, var_location, parameter_location), + new ExportedParameter(body, var_end, parameter_end) + )); + // // frame->end = frame->location->connected_to[i1];// if (frame->end != NULL &&// frame->end->connected_to[1] == frame->location &&// frame->end->connected_to[0] == NULL) {// ...// } // if (frame->end != NULL &&// frame->end->connected_to[0] == frame->location &&// frame->end->connected_to[1] == NULL) {// ...// } Train(train) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + // Train.location(train, location) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train", "location"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new Equality(body, var__virtual_0_, var_location); + // Segment.connectedTo(location, end) + new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_location, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new Equality(body, var__virtual_1_, var_end); + bodies.add(body); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_5.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_5.java new file mode 100644 index 00000000..48a2697d --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_5.java @@ -0,0 +1,841 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Segment; +import modes3.Train; +import modes3.queries.MultipleConnectedTo; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

Original source: + *

+ *         pattern endOfSiding_step_5(in train : Train, in location : Segment, in end : Segment) {
+ *         //         results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
+ *         //         results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
+ *         //         ...OR...
+ *         //         results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
+ *         //         results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
+ *         	Train(train);
+ *             Train.location(train, location);
+ *             Segment.connectedTo(location, end);
+ *         	neg find multipleConnectedTo(end);
+ *         }
+ * 
+ * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class EndOfSiding_step_5 extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.endOfSiding_step_5 pattern, + * to be used in conjunction with {@link Matcher}. + * + *

Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Train fTrain; + + private Segment fLocation; + + private Segment fEnd; + + private static List parameterNames = makeImmutableList("train", "location", "end"); + + private Match(final Train pTrain, final Segment pLocation, final Segment pEnd) { + this.fTrain = pTrain; + this.fLocation = pLocation; + this.fEnd = pEnd; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "train": return this.fTrain; + case "location": return this.fLocation; + case "end": return this.fEnd; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fTrain; + case 1: return this.fLocation; + case 2: return this.fEnd; + default: return null; + } + } + + public Train getTrain() { + return this.fTrain; + } + + public Segment getLocation() { + return this.fLocation; + } + + public Segment getEnd() { + return this.fEnd; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("train".equals(parameterName) ) { + this.fTrain = (Train) newValue; + return true; + } + if ("location".equals(parameterName) ) { + this.fLocation = (Segment) newValue; + return true; + } + if ("end".equals(parameterName) ) { + this.fEnd = (Segment) newValue; + return true; + } + return false; + } + + public void setTrain(final Train pTrain) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fTrain = pTrain; + } + + public void setLocation(final Segment pLocation) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fLocation = pLocation; + } + + public void setEnd(final Segment pEnd) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fEnd = pEnd; + } + + @Override + public String patternName() { + return "modes3.queries.endOfSiding_step_5"; + } + + @Override + public List parameterNames() { + return EndOfSiding_step_5.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fTrain, fLocation, fEnd}; + } + + @Override + public EndOfSiding_step_5.Match toImmutable() { + return isMutable() ? newMatch(fTrain, fLocation, fEnd) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"train\"=" + prettyPrintValue(fTrain) + ", "); + result.append("\"location\"=" + prettyPrintValue(fLocation) + ", "); + result.append("\"end\"=" + prettyPrintValue(fEnd)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fTrain, fLocation, fEnd); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof EndOfSiding_step_5.Match)) { + EndOfSiding_step_5.Match other = (EndOfSiding_step_5.Match) obj; + return Objects.equals(fTrain, other.fTrain) && Objects.equals(fLocation, other.fLocation) && Objects.equals(fEnd, other.fEnd); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public EndOfSiding_step_5 specification() { + return EndOfSiding_step_5.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static EndOfSiding_step_5.Match newEmptyMatch() { + return new Mutable(null, null, null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static EndOfSiding_step_5.Match newMutableMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return new Mutable(pTrain, pLocation, pEnd); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return the (partial) match object. + * + */ + public static EndOfSiding_step_5.Match newMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return new Immutable(pTrain, pLocation, pEnd); + } + + private static final class Mutable extends EndOfSiding_step_5.Match { + Mutable(final Train pTrain, final Segment pLocation, final Segment pEnd) { + super(pTrain, pLocation, pEnd); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends EndOfSiding_step_5.Match { + Immutable(final Train pTrain, final Segment pLocation, final Segment pEnd) { + super(pTrain, pLocation, pEnd); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.endOfSiding_step_5 pattern, + * providing pattern-specific query methods. + * + *

Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

Matches of the pattern will be represented as {@link Match}. + * + *

Original source: + *

+   * pattern endOfSiding_step_5(in train : Train, in location : Segment, in end : Segment) {
+   * //         results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
+   * //         results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
+   * //         ...OR...
+   * //         results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
+   * //         results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
+   * 	Train(train);
+   *     Train.location(train, location);
+   *     Segment.connectedTo(location, end);
+   * 	neg find multipleConnectedTo(end);
+   * }
+   * 
+ * + * @see Match + * @see EndOfSiding_step_5 + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static EndOfSiding_step_5.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static EndOfSiding_step_5.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_TRAIN = 0; + + private static final int POSITION_LOCATION = 1; + + private static final int POSITION_END = 2; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(EndOfSiding_step_5.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawStreamAllMatches(new Object[]{pTrain, pLocation, pEnd}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawStreamAllMatches(new Object[]{pTrain, pLocation, pEnd}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawGetOneArbitraryMatch(new Object[]{pTrain, pLocation, pEnd}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawHasMatch(new Object[]{pTrain, pLocation, pEnd}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return rawCountMatches(new Object[]{pTrain, pLocation, pEnd}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Segment pEnd, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pTrain, pLocation, pEnd}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param pEnd the fixed value of pattern parameter end, or null if not bound. + * @return the (partial) match object. + * + */ + public EndOfSiding_step_5.Match newMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) { + return EndOfSiding_step_5.Match.newMatch(pTrain, pLocation, pEnd); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOftrain(final Object[] parameters) { + return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for train. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain(final EndOfSiding_step_5.Match partialMatch) { + return rawStreamAllValuesOftrain(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for train. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain(final Segment pLocation, final Segment pEnd) { + return rawStreamAllValuesOftrain(new Object[]{null, pLocation, pEnd}); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain(final EndOfSiding_step_5.Match partialMatch) { + return rawStreamAllValuesOftrain(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain(final Segment pLocation, final Segment pEnd) { + return rawStreamAllValuesOftrain(new Object[]{null, pLocation, pEnd}).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOflocation(final Object[] parameters) { + return rawStreamAllValues(POSITION_LOCATION, parameters).map(Segment.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation() { + return rawStreamAllValuesOflocation(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation() { + return rawStreamAllValuesOflocation(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for location. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation(final EndOfSiding_step_5.Match partialMatch) { + return rawStreamAllValuesOflocation(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for location. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation(final Train pTrain, final Segment pEnd) { + return rawStreamAllValuesOflocation(new Object[]{pTrain, null, pEnd}); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation(final EndOfSiding_step_5.Match partialMatch) { + return rawStreamAllValuesOflocation(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation(final Train pTrain, final Segment pEnd) { + return rawStreamAllValuesOflocation(new Object[]{pTrain, null, pEnd}).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfend(final Object[] parameters) { + return rawStreamAllValues(POSITION_END, parameters).map(Segment.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfend() { + return rawStreamAllValuesOfend(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfend() { + return rawStreamAllValuesOfend(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for end. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfend(final EndOfSiding_step_5.Match partialMatch) { + return rawStreamAllValuesOfend(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for end. + *

+ * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfend(final Train pTrain, final Segment pLocation) { + return rawStreamAllValuesOfend(new Object[]{pTrain, pLocation, null}); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfend(final EndOfSiding_step_5.Match partialMatch) { + return rawStreamAllValuesOfend(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for end. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfend(final Train pTrain, final Segment pLocation) { + return rawStreamAllValuesOfend(new Object[]{pTrain, pLocation, null}).collect(Collectors.toSet()); + } + + @Override + protected EndOfSiding_step_5.Match tupleToMatch(final Tuple t) { + try { + return EndOfSiding_step_5.Match.newMatch((Train) t.get(POSITION_TRAIN), (Segment) t.get(POSITION_LOCATION), (Segment) t.get(POSITION_END)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected EndOfSiding_step_5.Match arrayToMatch(final Object[] match) { + try { + return EndOfSiding_step_5.Match.newMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION], (Segment) match[POSITION_END]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected EndOfSiding_step_5.Match arrayToMatchMutable(final Object[] match) { + try { + return EndOfSiding_step_5.Match.newMutableMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION], (Segment) match[POSITION_END]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return EndOfSiding_step_5.instance(); + } + } + + private EndOfSiding_step_5() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static EndOfSiding_step_5 instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected EndOfSiding_step_5.Matcher instantiate(final ViatraQueryEngine engine) { + return EndOfSiding_step_5.Matcher.on(engine); + } + + @Override + public EndOfSiding_step_5.Matcher instantiate() { + return EndOfSiding_step_5.Matcher.create(); + } + + @Override + public EndOfSiding_step_5.Match newEmptyMatch() { + return EndOfSiding_step_5.Match.newEmptyMatch(); + } + + @Override + public EndOfSiding_step_5.Match newMatch(final Object... parameters) { + return EndOfSiding_step_5.Match.newMatch((modes3.Train) parameters[0], (modes3.Segment) parameters[1], (modes3.Segment) parameters[2]); + } + + /** + * Inner class allowing the singleton instance of {@link EndOfSiding_step_5} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link EndOfSiding_step_5#instance()}. + * + *

This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final EndOfSiding_step_5 INSTANCE = new EndOfSiding_step_5(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final EndOfSiding_step_5.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT); + + private final PParameter parameter_location = new PParameter("location", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); + + private final PParameter parameter_end = new PParameter("end", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_train, parameter_location, parameter_end); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.endOfSiding_step_5"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("train","location","end"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_train = body.getOrCreateVariableByName("train"); + PVariable var_location = body.getOrCreateVariableByName("location"); + PVariable var_end = body.getOrCreateVariableByName("end"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new TypeConstraint(body, Tuples.flatTupleOf(var_end), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_train, parameter_train), + new ExportedParameter(body, var_location, parameter_location), + new ExportedParameter(body, var_end, parameter_end) + )); + // // results->matches[match_cntr].location = frame->location;// results->matches[match_cntr++].train = frame->train;// ...OR...// results->matches[match_cntr].location = frame->location;// results->matches[match_cntr++].train = frame->train; Train(train) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + // Train.location(train, location) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train", "location"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new Equality(body, var__virtual_0_, var_location); + // Segment.connectedTo(location, end) + new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_location, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new Equality(body, var__virtual_1_, var_end); + // neg find multipleConnectedTo(end) + new NegativePatternCall(body, Tuples.flatTupleOf(var_end), MultipleConnectedTo.instance().getInternalQueryRepresentation()); + bodies.add(body); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java index 6e244430..d1238d61 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java @@ -4,16 +4,34 @@ package modes3.queries; import modes3.queries.Adjacent; +import modes3.queries.CloseTrains_step_2; +import modes3.queries.CloseTrains_step_3; +import modes3.queries.CloseTrains_step_4; +import modes3.queries.CloseTrains_step_5; +import modes3.queries.CloseTrains_step_6; +import modes3.queries.CloseTrains_step_7; +import modes3.queries.ConnectedSegmentsDirected; import modes3.queries.ConnectedTo; import modes3.queries.ConnectedToNotSymmetric; import modes3.queries.ConnectedToReflexive; +import modes3.queries.EndOfSiding_step_2; +import modes3.queries.EndOfSiding_step_3; +import modes3.queries.EndOfSiding_step_4; +import modes3.queries.EndOfSiding_step_5; import modes3.queries.InputsOfTurnout; +import modes3.queries.MisalignedTurnout_step_2; +import modes3.queries.MisalignedTurnout_step_3; +import modes3.queries.MisalignedTurnout_step_4; +import modes3.queries.MisalignedTurnout_step_5; +import modes3.queries.MultipleConnectedTo; import modes3.queries.Output; import modes3.queries.OutputReflexive; import modes3.queries.Reachable; import modes3.queries.TooFewInputsOfTurnout; import modes3.queries.TooManyInputsOfSegment; import modes3.queries.TooManyInputsOfTurnout; +import modes3.queries.TrainLocations_step_2; +import modes3.queries.TrainLocations_step_3; import modes3.queries.TurnoutConnectedToBothOutputs; import modes3.queries.TurnoutOutput; import modes3.queries.TurnoutOutputsAreSame; @@ -44,6 +62,24 @@ import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; *

  • tooFewInputsOfTurnout
  • *
  • reachable
  • *
  • unreachable
  • + *
  • closeTrains_step_2
  • + *
  • closeTrains_step_3
  • + *
  • closeTrains_step_4
  • + *
  • closeTrains_step_5
  • + *
  • closeTrains_step_6
  • + *
  • closeTrains_step_7
  • + *
  • trainLocations_step_2
  • + *
  • trainLocations_step_3
  • + *
  • misalignedTurnout_step_2
  • + *
  • misalignedTurnout_step_3
  • + *
  • misalignedTurnout_step_4
  • + *
  • misalignedTurnout_step_5
  • + *
  • connectedSegmentsDirected
  • + *
  • endOfSiding_step_2
  • + *
  • endOfSiding_step_3
  • + *
  • endOfSiding_step_4
  • + *
  • endOfSiding_step_5
  • + *
  • multipleConnectedTo
  • * * * @see IQueryGroup @@ -83,6 +119,24 @@ public final class Modes3Queries extends BaseGeneratedPatternGroup { querySpecifications.add(TooFewInputsOfTurnout.instance()); querySpecifications.add(Reachable.instance()); querySpecifications.add(Unreachable.instance()); + querySpecifications.add(CloseTrains_step_2.instance()); + querySpecifications.add(CloseTrains_step_3.instance()); + querySpecifications.add(CloseTrains_step_4.instance()); + querySpecifications.add(CloseTrains_step_5.instance()); + querySpecifications.add(CloseTrains_step_6.instance()); + querySpecifications.add(CloseTrains_step_7.instance()); + querySpecifications.add(TrainLocations_step_2.instance()); + querySpecifications.add(TrainLocations_step_3.instance()); + querySpecifications.add(MisalignedTurnout_step_2.instance()); + querySpecifications.add(MisalignedTurnout_step_3.instance()); + querySpecifications.add(MisalignedTurnout_step_4.instance()); + querySpecifications.add(MisalignedTurnout_step_5.instance()); + querySpecifications.add(ConnectedSegmentsDirected.instance()); + querySpecifications.add(EndOfSiding_step_2.instance()); + querySpecifications.add(EndOfSiding_step_3.instance()); + querySpecifications.add(EndOfSiding_step_4.instance()); + querySpecifications.add(EndOfSiding_step_5.instance()); + querySpecifications.add(MultipleConnectedTo.instance()); } public ConnectedTo getConnectedTo() { @@ -204,4 +258,148 @@ public final class Modes3Queries extends BaseGeneratedPatternGroup { public Unreachable.Matcher getUnreachable(final ViatraQueryEngine engine) { return Unreachable.Matcher.on(engine); } + + public CloseTrains_step_2 getCloseTrains_step_2() { + return CloseTrains_step_2.instance(); + } + + public CloseTrains_step_2.Matcher getCloseTrains_step_2(final ViatraQueryEngine engine) { + return CloseTrains_step_2.Matcher.on(engine); + } + + public CloseTrains_step_3 getCloseTrains_step_3() { + return CloseTrains_step_3.instance(); + } + + public CloseTrains_step_3.Matcher getCloseTrains_step_3(final ViatraQueryEngine engine) { + return CloseTrains_step_3.Matcher.on(engine); + } + + public CloseTrains_step_4 getCloseTrains_step_4() { + return CloseTrains_step_4.instance(); + } + + public CloseTrains_step_4.Matcher getCloseTrains_step_4(final ViatraQueryEngine engine) { + return CloseTrains_step_4.Matcher.on(engine); + } + + public CloseTrains_step_5 getCloseTrains_step_5() { + return CloseTrains_step_5.instance(); + } + + public CloseTrains_step_5.Matcher getCloseTrains_step_5(final ViatraQueryEngine engine) { + return CloseTrains_step_5.Matcher.on(engine); + } + + public CloseTrains_step_6 getCloseTrains_step_6() { + return CloseTrains_step_6.instance(); + } + + public CloseTrains_step_6.Matcher getCloseTrains_step_6(final ViatraQueryEngine engine) { + return CloseTrains_step_6.Matcher.on(engine); + } + + public CloseTrains_step_7 getCloseTrains_step_7() { + return CloseTrains_step_7.instance(); + } + + public CloseTrains_step_7.Matcher getCloseTrains_step_7(final ViatraQueryEngine engine) { + return CloseTrains_step_7.Matcher.on(engine); + } + + public TrainLocations_step_2 getTrainLocations_step_2() { + return TrainLocations_step_2.instance(); + } + + public TrainLocations_step_2.Matcher getTrainLocations_step_2(final ViatraQueryEngine engine) { + return TrainLocations_step_2.Matcher.on(engine); + } + + public TrainLocations_step_3 getTrainLocations_step_3() { + return TrainLocations_step_3.instance(); + } + + public TrainLocations_step_3.Matcher getTrainLocations_step_3(final ViatraQueryEngine engine) { + return TrainLocations_step_3.Matcher.on(engine); + } + + public MisalignedTurnout_step_2 getMisalignedTurnout_step_2() { + return MisalignedTurnout_step_2.instance(); + } + + public MisalignedTurnout_step_2.Matcher getMisalignedTurnout_step_2(final ViatraQueryEngine engine) { + return MisalignedTurnout_step_2.Matcher.on(engine); + } + + public MisalignedTurnout_step_3 getMisalignedTurnout_step_3() { + return MisalignedTurnout_step_3.instance(); + } + + public MisalignedTurnout_step_3.Matcher getMisalignedTurnout_step_3(final ViatraQueryEngine engine) { + return MisalignedTurnout_step_3.Matcher.on(engine); + } + + public MisalignedTurnout_step_4 getMisalignedTurnout_step_4() { + return MisalignedTurnout_step_4.instance(); + } + + public MisalignedTurnout_step_4.Matcher getMisalignedTurnout_step_4(final ViatraQueryEngine engine) { + return MisalignedTurnout_step_4.Matcher.on(engine); + } + + public MisalignedTurnout_step_5 getMisalignedTurnout_step_5() { + return MisalignedTurnout_step_5.instance(); + } + + public MisalignedTurnout_step_5.Matcher getMisalignedTurnout_step_5(final ViatraQueryEngine engine) { + return MisalignedTurnout_step_5.Matcher.on(engine); + } + + public ConnectedSegmentsDirected getConnectedSegmentsDirected() { + return ConnectedSegmentsDirected.instance(); + } + + public ConnectedSegmentsDirected.Matcher getConnectedSegmentsDirected(final ViatraQueryEngine engine) { + return ConnectedSegmentsDirected.Matcher.on(engine); + } + + public EndOfSiding_step_2 getEndOfSiding_step_2() { + return EndOfSiding_step_2.instance(); + } + + public EndOfSiding_step_2.Matcher getEndOfSiding_step_2(final ViatraQueryEngine engine) { + return EndOfSiding_step_2.Matcher.on(engine); + } + + public EndOfSiding_step_3 getEndOfSiding_step_3() { + return EndOfSiding_step_3.instance(); + } + + public EndOfSiding_step_3.Matcher getEndOfSiding_step_3(final ViatraQueryEngine engine) { + return EndOfSiding_step_3.Matcher.on(engine); + } + + public EndOfSiding_step_4 getEndOfSiding_step_4() { + return EndOfSiding_step_4.instance(); + } + + public EndOfSiding_step_4.Matcher getEndOfSiding_step_4(final ViatraQueryEngine engine) { + return EndOfSiding_step_4.Matcher.on(engine); + } + + public EndOfSiding_step_5 getEndOfSiding_step_5() { + return EndOfSiding_step_5.instance(); + } + + public EndOfSiding_step_5.Matcher getEndOfSiding_step_5(final ViatraQueryEngine engine) { + return EndOfSiding_step_5.Matcher.on(engine); + } + + public MultipleConnectedTo getMultipleConnectedTo() { + return MultipleConnectedTo.instance(); + } + + public MultipleConnectedTo.Matcher getMultipleConnectedTo(final ViatraQueryEngine engine) { + return MultipleConnectedTo.Matcher.on(engine); + } } diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/MultipleConnectedTo.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/MultipleConnectedTo.java new file mode 100644 index 00000000..277006c9 --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/MultipleConnectedTo.java @@ -0,0 +1,565 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Segment; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

    Original source: + *

    + *         pattern multipleConnectedTo(s : Segment) {
    + *         	Segment.connectedTo(s, n1);
    + *         	Segment.connectedTo(s, n2);
    + *         	n1 != n2;
    + *         }
    + * 
    + * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class MultipleConnectedTo extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.multipleConnectedTo pattern, + * to be used in conjunction with {@link Matcher}. + * + *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Segment fS; + + private static List parameterNames = makeImmutableList("s"); + + private Match(final Segment pS) { + this.fS = pS; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "s": return this.fS; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fS; + default: return null; + } + } + + public Segment getS() { + return this.fS; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("s".equals(parameterName) ) { + this.fS = (Segment) newValue; + return true; + } + return false; + } + + public void setS(final Segment pS) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fS = pS; + } + + @Override + public String patternName() { + return "modes3.queries.multipleConnectedTo"; + } + + @Override + public List parameterNames() { + return MultipleConnectedTo.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fS}; + } + + @Override + public MultipleConnectedTo.Match toImmutable() { + return isMutable() ? newMatch(fS) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"s\"=" + prettyPrintValue(fS)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fS); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof MultipleConnectedTo.Match)) { + MultipleConnectedTo.Match other = (MultipleConnectedTo.Match) obj; + return Objects.equals(fS, other.fS); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public MultipleConnectedTo specification() { + return MultipleConnectedTo.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static MultipleConnectedTo.Match newEmptyMatch() { + return new Mutable(null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static MultipleConnectedTo.Match newMutableMatch(final Segment pS) { + return new Mutable(pS); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @return the (partial) match object. + * + */ + public static MultipleConnectedTo.Match newMatch(final Segment pS) { + return new Immutable(pS); + } + + private static final class Mutable extends MultipleConnectedTo.Match { + Mutable(final Segment pS) { + super(pS); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends MultipleConnectedTo.Match { + Immutable(final Segment pS) { + super(pS); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.multipleConnectedTo pattern, + * providing pattern-specific query methods. + * + *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

    Matches of the pattern will be represented as {@link Match}. + * + *

    Original source: + *

    +   * pattern multipleConnectedTo(s : Segment) {
    +   * 	Segment.connectedTo(s, n1);
    +   * 	Segment.connectedTo(s, n2);
    +   * 	n1 != n2;
    +   * }
    +   * 
    + * + * @see Match + * @see MultipleConnectedTo + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static MultipleConnectedTo.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static MultipleConnectedTo.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_S = 0; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(MultipleConnectedTo.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Segment pS) { + return rawStreamAllMatches(new Object[]{pS}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Segment pS) { + return rawStreamAllMatches(new Object[]{pS}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Segment pS) { + return rawGetOneArbitraryMatch(new Object[]{pS}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Segment pS) { + return rawHasMatch(new Object[]{pS}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Segment pS) { + return rawCountMatches(new Object[]{pS}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Segment pS, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pS}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pS the fixed value of pattern parameter s, or null if not bound. + * @return the (partial) match object. + * + */ + public MultipleConnectedTo.Match newMatch(final Segment pS) { + return MultipleConnectedTo.Match.newMatch(pS); + } + + /** + * Retrieve the set of values that occur in matches for s. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfs(final Object[] parameters) { + return rawStreamAllValues(POSITION_S, parameters).map(Segment.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for s. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfs() { + return rawStreamAllValuesOfs(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for s. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfs() { + return rawStreamAllValuesOfs(emptyArray()); + } + + @Override + protected MultipleConnectedTo.Match tupleToMatch(final Tuple t) { + try { + return MultipleConnectedTo.Match.newMatch((Segment) t.get(POSITION_S)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected MultipleConnectedTo.Match arrayToMatch(final Object[] match) { + try { + return MultipleConnectedTo.Match.newMatch((Segment) match[POSITION_S]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected MultipleConnectedTo.Match arrayToMatchMutable(final Object[] match) { + try { + return MultipleConnectedTo.Match.newMutableMatch((Segment) match[POSITION_S]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return MultipleConnectedTo.instance(); + } + } + + private MultipleConnectedTo() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static MultipleConnectedTo instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected MultipleConnectedTo.Matcher instantiate(final ViatraQueryEngine engine) { + return MultipleConnectedTo.Matcher.on(engine); + } + + @Override + public MultipleConnectedTo.Matcher instantiate() { + return MultipleConnectedTo.Matcher.create(); + } + + @Override + public MultipleConnectedTo.Match newEmptyMatch() { + return MultipleConnectedTo.Match.newEmptyMatch(); + } + + @Override + public MultipleConnectedTo.Match newMatch(final Object... parameters) { + return MultipleConnectedTo.Match.newMatch((modes3.Segment) parameters[0]); + } + + /** + * Inner class allowing the singleton instance of {@link MultipleConnectedTo} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link MultipleConnectedTo#instance()}. + * + *

    This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final MultipleConnectedTo INSTANCE = new MultipleConnectedTo(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

    The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final MultipleConnectedTo.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_s = new PParameter("s", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_s); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.multipleConnectedTo"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("s"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_s = body.getOrCreateVariableByName("s"); + PVariable var_n1 = body.getOrCreateVariableByName("n1"); + PVariable var_n2 = body.getOrCreateVariableByName("n2"); + new TypeConstraint(body, Tuples.flatTupleOf(var_s), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_s, parameter_s) + )); + // Segment.connectedTo(s, n1) + new TypeConstraint(body, Tuples.flatTupleOf(var_s), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_s, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new Equality(body, var__virtual_0_, var_n1); + // Segment.connectedTo(s, n2) + new TypeConstraint(body, Tuples.flatTupleOf(var_s), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_s, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new Equality(body, var__virtual_1_, var_n2); + // n1 != n2 + new Inequality(body, var_n1, var_n2); + bodies.add(body); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java index ff82dda1..d12ec23e 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java @@ -46,12 +46,6 @@ import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; * *

    Original source: *

    - *         //{@literal @}Constraint(message = "noInputOfSegment", severity = "error", key = { S })
    - *         //pattern noInputOfSegment(S : Segment) {
    - *         //	neg find turnout(S);
    - *         //	neg find output(_, S);
    - *         //}
    - *         
      *         {@literal @}Constraint(message = "tooManyInputsOfSegment", severity = "error", key = { S })
      *         pattern tooManyInputsOfSegment(S : SimpleSegment) {
      *         	find output(I1, S);
    @@ -251,12 +245,6 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica
        * 
        * 

    Original source: *

    -   * //{@literal @}Constraint(message = "noInputOfSegment", severity = "error", key = { S })
    -   * //pattern noInputOfSegment(S : Segment) {
    -   * //	neg find turnout(S);
    -   * //	neg find output(_, S);
    -   * //}
    -   * 
        * {@literal @}Constraint(message = "tooManyInputsOfSegment", severity = "error", key = { S })
        * pattern tooManyInputsOfSegment(S : SimpleSegment) {
        * 	find output(I1, S);
    diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_2.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_2.java
    new file mode 100644
    index 00000000..5bf153c3
    --- /dev/null
    +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_2.java
    @@ -0,0 +1,564 @@
    +/**
    + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
    + */
    +package modes3.queries;
    +
    +import java.util.Arrays;
    +import java.util.Collection;
    +import java.util.LinkedHashSet;
    +import java.util.List;
    +import java.util.Objects;
    +import java.util.Optional;
    +import java.util.Set;
    +import java.util.function.Consumer;
    +import java.util.stream.Collectors;
    +import java.util.stream.Stream;
    +import modes3.Train;
    +import org.apache.log4j.Logger;
    +import org.eclipse.emf.ecore.EClass;
    +import org.eclipse.viatra.query.runtime.api.IPatternMatch;
    +import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
    +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
    +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
    +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
    +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
    +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
    +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
    +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
    +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
    +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
    +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
    +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
    +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
    +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
    +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
    +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
    +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
    +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
    +
    +/**
    + * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
    + * 
    + * 

    Original source: + *

    + *         //
    + *         // trainLocations
    + *         //
    + *         
    + *         pattern trainLocations_step_2(in train : Train) {
    + *         //   frame-{@literal >}train = model-{@literal >}trains[i0];
    + *         //   frame-{@literal >}location = frame-{@literal >}train-{@literal >}location;
    + *         //   if (frame-{@literal >}location != NULL) {
    + *         //     ...
    + *         //   }
    + *         
    + *         	Train(train);
    + *         }
    + * 
    + * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class TrainLocations_step_2 extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.trainLocations_step_2 pattern, + * to be used in conjunction with {@link Matcher}. + * + *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Train fTrain; + + private static List parameterNames = makeImmutableList("train"); + + private Match(final Train pTrain) { + this.fTrain = pTrain; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "train": return this.fTrain; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fTrain; + default: return null; + } + } + + public Train getTrain() { + return this.fTrain; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("train".equals(parameterName) ) { + this.fTrain = (Train) newValue; + return true; + } + return false; + } + + public void setTrain(final Train pTrain) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fTrain = pTrain; + } + + @Override + public String patternName() { + return "modes3.queries.trainLocations_step_2"; + } + + @Override + public List parameterNames() { + return TrainLocations_step_2.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fTrain}; + } + + @Override + public TrainLocations_step_2.Match toImmutable() { + return isMutable() ? newMatch(fTrain) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"train\"=" + prettyPrintValue(fTrain)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fTrain); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof TrainLocations_step_2.Match)) { + TrainLocations_step_2.Match other = (TrainLocations_step_2.Match) obj; + return Objects.equals(fTrain, other.fTrain); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public TrainLocations_step_2 specification() { + return TrainLocations_step_2.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static TrainLocations_step_2.Match newEmptyMatch() { + return new Mutable(null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static TrainLocations_step_2.Match newMutableMatch(final Train pTrain) { + return new Mutable(pTrain); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return the (partial) match object. + * + */ + public static TrainLocations_step_2.Match newMatch(final Train pTrain) { + return new Immutable(pTrain); + } + + private static final class Mutable extends TrainLocations_step_2.Match { + Mutable(final Train pTrain) { + super(pTrain); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends TrainLocations_step_2.Match { + Immutable(final Train pTrain) { + super(pTrain); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.trainLocations_step_2 pattern, + * providing pattern-specific query methods. + * + *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

    Matches of the pattern will be represented as {@link Match}. + * + *

    Original source: + *

    +   * //
    +   * // trainLocations
    +   * //
    +   * 
    +   * pattern trainLocations_step_2(in train : Train) {
    +   * //   frame-{@literal >}train = model-{@literal >}trains[i0];
    +   * //   frame-{@literal >}location = frame-{@literal >}train-{@literal >}location;
    +   * //   if (frame-{@literal >}location != NULL) {
    +   * //     ...
    +   * //   }
    +   * 
    +   * 	Train(train);
    +   * }
    +   * 
    + * + * @see Match + * @see TrainLocations_step_2 + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static TrainLocations_step_2.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static TrainLocations_step_2.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_TRAIN = 0; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TrainLocations_step_2.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Train pTrain) { + return rawStreamAllMatches(new Object[]{pTrain}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Train pTrain) { + return rawStreamAllMatches(new Object[]{pTrain}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Train pTrain) { + return rawGetOneArbitraryMatch(new Object[]{pTrain}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Train pTrain) { + return rawHasMatch(new Object[]{pTrain}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Train pTrain) { + return rawCountMatches(new Object[]{pTrain}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Train pTrain, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pTrain}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @return the (partial) match object. + * + */ + public TrainLocations_step_2.Match newMatch(final Train pTrain) { + return TrainLocations_step_2.Match.newMatch(pTrain); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOftrain(final Object[] parameters) { + return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()); + } + + @Override + protected TrainLocations_step_2.Match tupleToMatch(final Tuple t) { + try { + return TrainLocations_step_2.Match.newMatch((Train) t.get(POSITION_TRAIN)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected TrainLocations_step_2.Match arrayToMatch(final Object[] match) { + try { + return TrainLocations_step_2.Match.newMatch((Train) match[POSITION_TRAIN]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected TrainLocations_step_2.Match arrayToMatchMutable(final Object[] match) { + try { + return TrainLocations_step_2.Match.newMutableMatch((Train) match[POSITION_TRAIN]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return TrainLocations_step_2.instance(); + } + } + + private TrainLocations_step_2() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static TrainLocations_step_2 instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected TrainLocations_step_2.Matcher instantiate(final ViatraQueryEngine engine) { + return TrainLocations_step_2.Matcher.on(engine); + } + + @Override + public TrainLocations_step_2.Matcher instantiate() { + return TrainLocations_step_2.Matcher.create(); + } + + @Override + public TrainLocations_step_2.Match newEmptyMatch() { + return TrainLocations_step_2.Match.newEmptyMatch(); + } + + @Override + public TrainLocations_step_2.Match newMatch(final Object... parameters) { + return TrainLocations_step_2.Match.newMatch((modes3.Train) parameters[0]); + } + + /** + * Inner class allowing the singleton instance of {@link TrainLocations_step_2} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link TrainLocations_step_2#instance()}. + * + *

    This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final TrainLocations_step_2 INSTANCE = new TrainLocations_step_2(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

    The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final TrainLocations_step_2.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_train); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.trainLocations_step_2"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("train"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_train = body.getOrCreateVariableByName("train"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_train, parameter_train) + )); + // // frame->train = model->trains[i0];// frame->location = frame->train->location;// if (frame->location != NULL) {// ...// } Train(train) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + bodies.add(body); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_3.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_3.java new file mode 100644 index 00000000..edbd4af3 --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_3.java @@ -0,0 +1,713 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Segment; +import modes3.Train; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

    Original source: + *

    + *         pattern trainLocations_step_3(in train : Train, in location : Segment) {
    + *         //     results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
    + *         //     results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
    + *         	Train(train);
    + *             Train.location(train, location);
    + *         }
    + * 
    + * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class TrainLocations_step_3 extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.trainLocations_step_3 pattern, + * to be used in conjunction with {@link Matcher}. + * + *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Train fTrain; + + private Segment fLocation; + + private static List parameterNames = makeImmutableList("train", "location"); + + private Match(final Train pTrain, final Segment pLocation) { + this.fTrain = pTrain; + this.fLocation = pLocation; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "train": return this.fTrain; + case "location": return this.fLocation; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fTrain; + case 1: return this.fLocation; + default: return null; + } + } + + public Train getTrain() { + return this.fTrain; + } + + public Segment getLocation() { + return this.fLocation; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("train".equals(parameterName) ) { + this.fTrain = (Train) newValue; + return true; + } + if ("location".equals(parameterName) ) { + this.fLocation = (Segment) newValue; + return true; + } + return false; + } + + public void setTrain(final Train pTrain) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fTrain = pTrain; + } + + public void setLocation(final Segment pLocation) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fLocation = pLocation; + } + + @Override + public String patternName() { + return "modes3.queries.trainLocations_step_3"; + } + + @Override + public List parameterNames() { + return TrainLocations_step_3.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fTrain, fLocation}; + } + + @Override + public TrainLocations_step_3.Match toImmutable() { + return isMutable() ? newMatch(fTrain, fLocation) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"train\"=" + prettyPrintValue(fTrain) + ", "); + result.append("\"location\"=" + prettyPrintValue(fLocation)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fTrain, fLocation); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof TrainLocations_step_3.Match)) { + TrainLocations_step_3.Match other = (TrainLocations_step_3.Match) obj; + return Objects.equals(fTrain, other.fTrain) && Objects.equals(fLocation, other.fLocation); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public TrainLocations_step_3 specification() { + return TrainLocations_step_3.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static TrainLocations_step_3.Match newEmptyMatch() { + return new Mutable(null, null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static TrainLocations_step_3.Match newMutableMatch(final Train pTrain, final Segment pLocation) { + return new Mutable(pTrain, pLocation); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return the (partial) match object. + * + */ + public static TrainLocations_step_3.Match newMatch(final Train pTrain, final Segment pLocation) { + return new Immutable(pTrain, pLocation); + } + + private static final class Mutable extends TrainLocations_step_3.Match { + Mutable(final Train pTrain, final Segment pLocation) { + super(pTrain, pLocation); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends TrainLocations_step_3.Match { + Immutable(final Train pTrain, final Segment pLocation) { + super(pTrain, pLocation); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.trainLocations_step_3 pattern, + * providing pattern-specific query methods. + * + *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

    Matches of the pattern will be represented as {@link Match}. + * + *

    Original source: + *

    +   * pattern trainLocations_step_3(in train : Train, in location : Segment) {
    +   * //     results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
    +   * //     results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
    +   * 	Train(train);
    +   *     Train.location(train, location);
    +   * }
    +   * 
    + * + * @see Match + * @see TrainLocations_step_3 + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static TrainLocations_step_3.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static TrainLocations_step_3.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_TRAIN = 0; + + private static final int POSITION_LOCATION = 1; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TrainLocations_step_3.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Train pTrain, final Segment pLocation) { + return rawStreamAllMatches(new Object[]{pTrain, pLocation}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Train pTrain, final Segment pLocation) { + return rawStreamAllMatches(new Object[]{pTrain, pLocation}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Train pTrain, final Segment pLocation) { + return rawGetOneArbitraryMatch(new Object[]{pTrain, pLocation}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Train pTrain, final Segment pLocation) { + return rawHasMatch(new Object[]{pTrain, pLocation}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Train pTrain, final Segment pLocation) { + return rawCountMatches(new Object[]{pTrain, pLocation}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pTrain, pLocation}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pTrain the fixed value of pattern parameter train, or null if not bound. + * @param pLocation the fixed value of pattern parameter location, or null if not bound. + * @return the (partial) match object. + * + */ + public TrainLocations_step_3.Match newMatch(final Train pTrain, final Segment pLocation) { + return TrainLocations_step_3.Match.newMatch(pTrain, pLocation); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOftrain(final Object[] parameters) { + return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain() { + return rawStreamAllValuesOftrain(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for train. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain(final TrainLocations_step_3.Match partialMatch) { + return rawStreamAllValuesOftrain(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for train. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOftrain(final Segment pLocation) { + return rawStreamAllValuesOftrain(new Object[]{null, pLocation}); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain(final TrainLocations_step_3.Match partialMatch) { + return rawStreamAllValuesOftrain(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for train. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOftrain(final Segment pLocation) { + return rawStreamAllValuesOftrain(new Object[]{null, pLocation}).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOflocation(final Object[] parameters) { + return rawStreamAllValues(POSITION_LOCATION, parameters).map(Segment.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation() { + return rawStreamAllValuesOflocation(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation() { + return rawStreamAllValuesOflocation(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for location. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation(final TrainLocations_step_3.Match partialMatch) { + return rawStreamAllValuesOflocation(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for location. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOflocation(final Train pTrain) { + return rawStreamAllValuesOflocation(new Object[]{pTrain, null}); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation(final TrainLocations_step_3.Match partialMatch) { + return rawStreamAllValuesOflocation(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for location. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOflocation(final Train pTrain) { + return rawStreamAllValuesOflocation(new Object[]{pTrain, null}).collect(Collectors.toSet()); + } + + @Override + protected TrainLocations_step_3.Match tupleToMatch(final Tuple t) { + try { + return TrainLocations_step_3.Match.newMatch((Train) t.get(POSITION_TRAIN), (Segment) t.get(POSITION_LOCATION)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected TrainLocations_step_3.Match arrayToMatch(final Object[] match) { + try { + return TrainLocations_step_3.Match.newMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected TrainLocations_step_3.Match arrayToMatchMutable(final Object[] match) { + try { + return TrainLocations_step_3.Match.newMutableMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return TrainLocations_step_3.instance(); + } + } + + private TrainLocations_step_3() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static TrainLocations_step_3 instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected TrainLocations_step_3.Matcher instantiate(final ViatraQueryEngine engine) { + return TrainLocations_step_3.Matcher.on(engine); + } + + @Override + public TrainLocations_step_3.Matcher instantiate() { + return TrainLocations_step_3.Matcher.create(); + } + + @Override + public TrainLocations_step_3.Match newEmptyMatch() { + return TrainLocations_step_3.Match.newEmptyMatch(); + } + + @Override + public TrainLocations_step_3.Match newMatch(final Object... parameters) { + return TrainLocations_step_3.Match.newMatch((modes3.Train) parameters[0], (modes3.Segment) parameters[1]); + } + + /** + * Inner class allowing the singleton instance of {@link TrainLocations_step_3} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link TrainLocations_step_3#instance()}. + * + *

    This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final TrainLocations_step_3 INSTANCE = new TrainLocations_step_3(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

    The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final TrainLocations_step_3.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT); + + private final PParameter parameter_location = new PParameter("location", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_train, parameter_location); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.trainLocations_step_3"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("train","location"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_train = body.getOrCreateVariableByName("train"); + PVariable var_location = body.getOrCreateVariableByName("location"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_train, parameter_train), + new ExportedParameter(body, var_location, parameter_location) + )); + // // results->matches[match_cntr].location = frame->location;// results->matches[match_cntr++].train = frame->train; Train(train) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + // Train.location(train, location) + new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train"))); + PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_train, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train", "location"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new Equality(body, var__virtual_0_, var_location); + bodies.add(body); + } + return bodies; + } + } +} -- cgit v1.2.3-70-g09d2