diff options
Diffstat (limited to 'subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/planning/operations/PProject.java')
-rw-r--r-- | subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/planning/operations/PProject.java | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/planning/operations/PProject.java b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/planning/operations/PProject.java new file mode 100644 index 00000000..d0539b2c --- /dev/null +++ b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/planning/operations/PProject.java | |||
@@ -0,0 +1,109 @@ | |||
1 | /******************************************************************************* | ||
2 | * Copyright (c) 2010-2014, Bergmann Gabor, Istvan Rath and Daniel Varro | ||
3 | * This program and the accompanying materials are made available under the | ||
4 | * terms of the Eclipse Public License v. 2.0 which is available at | ||
5 | * http://www.eclipse.org/legal/epl-v20.html. | ||
6 | * | ||
7 | * SPDX-License-Identifier: EPL-2.0 | ||
8 | *******************************************************************************/ | ||
9 | package tools.refinery.viatra.runtime.matchers.planning.operations; | ||
10 | |||
11 | import java.util.Collection; | ||
12 | import java.util.Collections; | ||
13 | import java.util.List; | ||
14 | import java.util.Set; | ||
15 | import java.util.stream.Collectors; | ||
16 | |||
17 | import tools.refinery.viatra.runtime.matchers.planning.SubPlan; | ||
18 | import tools.refinery.viatra.runtime.matchers.psystem.PConstraint; | ||
19 | import tools.refinery.viatra.runtime.matchers.psystem.PVariable; | ||
20 | import tools.refinery.viatra.runtime.matchers.util.Preconditions; | ||
21 | |||
22 | /** | ||
23 | * Represents a projection of a single parent SubPlan onto a limited set of variables. | ||
24 | * <p> May optionally prescribe an ordering of variables (List, as opposed to Set). | ||
25 | * | ||
26 | * @author Bergmann Gabor | ||
27 | * | ||
28 | */ | ||
29 | public class PProject extends POperation { | ||
30 | |||
31 | private Collection<PVariable> toVariables; | ||
32 | private boolean ordered; | ||
33 | |||
34 | |||
35 | public PProject(Set<PVariable> toVariables) { | ||
36 | super(); | ||
37 | this.toVariables = toVariables; | ||
38 | this.ordered = false; | ||
39 | } | ||
40 | public PProject(List<PVariable> toVariables) { | ||
41 | super(); | ||
42 | this.toVariables = toVariables; | ||
43 | this.ordered = true; | ||
44 | } | ||
45 | |||
46 | public Collection<PVariable> getToVariables() { | ||
47 | return toVariables; | ||
48 | } | ||
49 | public boolean isOrdered() { | ||
50 | return ordered; | ||
51 | } | ||
52 | |||
53 | @Override | ||
54 | public Set<? extends PConstraint> getDeltaConstraints() { | ||
55 | return Collections.emptySet(); | ||
56 | } | ||
57 | @Override | ||
58 | public int numParentSubPlans() { | ||
59 | return 1; | ||
60 | } | ||
61 | @Override | ||
62 | public void checkConsistency(SubPlan subPlan) { | ||
63 | super.checkConsistency(subPlan); | ||
64 | final SubPlan parentPlan = subPlan.getParentPlans().get(0); | ||
65 | |||
66 | Preconditions.checkArgument(parentPlan.getVisibleVariables().containsAll(toVariables), | ||
67 | () -> toVariables.stream() | ||
68 | .filter(input -> !parentPlan.getVisibleVariables().contains(input)).map(PVariable::getName) | ||
69 | .collect(Collectors.joining(",", "Variables missing from project: ", ""))); | ||
70 | } | ||
71 | |||
72 | @Override | ||
73 | public String getShortName() { | ||
74 | return String.format("PROJECT%s_{%s}", ordered? "!" : "", | ||
75 | toVariables.stream().map(PVariable::getName).collect(Collectors.joining(","))); | ||
76 | } | ||
77 | |||
78 | @Override | ||
79 | public int hashCode() { | ||
80 | final int prime = 31; | ||
81 | int result = 1; | ||
82 | result = prime * result + (ordered ? 1231 : 1237); | ||
83 | result = prime * result | ||
84 | + ((toVariables == null) ? 0 : toVariables.hashCode()); | ||
85 | return result; | ||
86 | } | ||
87 | @Override | ||
88 | public boolean equals(Object obj) { | ||
89 | if (this == obj) | ||
90 | return true; | ||
91 | if (obj == null) | ||
92 | return false; | ||
93 | if (!(obj instanceof PProject)) | ||
94 | return false; | ||
95 | PProject other = (PProject) obj; | ||
96 | if (ordered != other.ordered) | ||
97 | return false; | ||
98 | if (toVariables == null) { | ||
99 | if (other.toVariables != null) | ||
100 | return false; | ||
101 | } else if (!toVariables.equals(other.toVariables)) | ||
102 | return false; | ||
103 | return true; | ||
104 | } | ||
105 | |||
106 | |||
107 | |||
108 | |||
109 | } | ||