aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/interval/IntervalAggregationMode.java
blob: f106e3053351f101c805b9c89973d4e623627471 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.interval;

import java.util.function.BinaryOperator;

public enum IntervalAggregationMode implements BinaryOperator<Interval> {
	SUM("intervalSum", "Sum a set of intervals") {
		@Override
		public IntervalRedBlackNode createNode(Interval interval) {
			return new IntervalRedBlackNode(interval) {
				public boolean isMultiplicitySensitive() {
					return true;
				}

				public Interval multiply(Interval interval, int count) {
					return interval.operator_multiply(count);
				};

				@Override
				public Interval op(Interval left, Interval right) {
					return left.operator_plus(right);
				}
			};
		}
		
		@Override
		public Interval getNeutral() {
			return Interval.ZERO;
		}
	},
	
	MIN("intervalMin", "Find the minimum a set of intervals") {
		@Override
		public IntervalRedBlackNode createNode(Interval interval) {
			return new IntervalRedBlackNode(interval) {
				@Override
				public Interval op(Interval left, Interval right) {
					return left.min(right);
				}
			};
		}
	},
	
	MAX("intervalMax", "Find the maximum a set of intervals") {
		@Override
		public IntervalRedBlackNode createNode(Interval interval) {
			return new IntervalRedBlackNode(interval) {
				@Override
				public Interval op(Interval left, Interval right) {
					return left.max(right);
				}
			};
		}
	},

	JOIN("intervalJoin", "Calculate the smallest interval containing all the intervals in a set") {
		@Override
		public IntervalRedBlackNode createNode(Interval interval) {
			return new IntervalRedBlackNode(interval) {
				@Override
				public Interval op(Interval left, Interval right) {
					return left.join(right);
				}
			};
		}
	};

	private final String modeName;
	private final String description;
	private final IntervalRedBlackNode empty;

	IntervalAggregationMode(String modeName, String description) {
		this.modeName = modeName;
		this.description = description;
		empty = createNode(null);
	}

	public String getModeName() {
		return modeName;
	}

	public String getDescription() {
		return description;
	}

	public IntervalRedBlackNode getEmpty() {
		return empty;
	}

	@Override
	public Interval apply(Interval left, Interval right) {
		return empty.op(left, right);
	}

	public abstract IntervalRedBlackNode createNode(Interval interval);
	
	public Interval getNeutral() {
		return Interval.EMPTY;
	}
}