Skip to content

Commit 9f8166e

Browse files
add RectangularExtractor row provider
1 parent 028fb6d commit 9f8166e

File tree

15 files changed

+159
-39
lines changed

15 files changed

+159
-39
lines changed

POSEIDON/src/test/java/uk/ac/ox/oxfish/model/regs/factory/SpecificProtectedAreaFactoryTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import uk.ac.ox.oxfish.regulations.ForbiddenAreasFromShapeFiles;
1111
import uk.ac.ox.poseidon.agents.api.Action;
1212
import uk.ac.ox.poseidon.agents.core.BasicAction;
13+
import uk.ac.ox.poseidon.regulations.api.ConditionalRegulations;
1314
import uk.ac.ox.poseidon.regulations.api.Regulations;
14-
import uk.ac.ox.poseidon.regulations.core.ConditionalRegulations;
1515
import uk.ac.ox.poseidon.regulations.core.conditions.AllOf;
1616
import uk.ac.ox.poseidon.regulations.core.conditions.AnyOf;
1717
import uk.ac.ox.poseidon.regulations.core.conditions.InVectorField;
@@ -41,10 +41,10 @@ class SpecificProtectedAreaFactoryTest {
4141
).apply(fishState);
4242
private final List<InVectorField> vectorFields =
4343
((AnyOf) ((ConditionalRegulations) regulations).getCondition())
44-
.getConditions()
44+
.getSubConditions()
4545
.stream()
4646
.map(AllOf.class::cast)
47-
.map(AllOf::getConditions)
47+
.map(AllOf::getSubConditions)
4848
.flatMap(Collection::stream)
4949
.filter(InVectorField.class::isInstance)
5050
.map(InVectorField.class::cast)

epo/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ plugins {
44

55
dependencies {
66
implementation(project(":POSEIDON"))
7+
implementation(project(":regulations:core"))
78
implementation("com.google.guava:guava:31.1-jre")
89
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package uk.ac.ox.poseidon.epo;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import uk.ac.ox.oxfish.model.FishState;
5+
import uk.ac.ox.oxfish.model.data.monitors.loggers.RowProvider;
6+
import uk.ac.ox.poseidon.regulations.core.conditions.InRectangularArea;
7+
import uk.ac.ox.poseidon.regulations.api.ConditionalRegulations;
8+
import uk.ac.ox.poseidon.regulations.api.Regulations;
9+
import uk.ac.ox.poseidon.regulations.api.Condition;
10+
11+
import java.util.Collection;
12+
import java.util.List;
13+
import java.util.function.Function;
14+
import java.util.stream.Collectors;
15+
import java.util.stream.Stream;
16+
17+
public class RectangularAreaExtractor implements RowProvider {
18+
private final Iterable<? extends Collection<?>> rows;
19+
20+
@Override
21+
public List<String> getHeaders() {
22+
return ImmutableList.of("min_lon", "max_lon", "min_lat", "max_lat");
23+
}
24+
25+
@Override
26+
public Iterable<? extends Collection<?>> getRows() {
27+
return rows;
28+
}
29+
30+
RectangularAreaExtractor(FishState fishState) {
31+
this.rows =
32+
extract(fishState.getRegulations(), Regulations::getSubRegulations)
33+
.filter(ConditionalRegulations.class::isInstance)
34+
.map(r -> ((ConditionalRegulations) r).getCondition())
35+
.flatMap(c -> extract(c, Condition::getSubConditions))
36+
.filter(InRectangularArea.class::isInstance)
37+
.map(InRectangularArea.class::cast)
38+
.map(rect -> ImmutableList.of(
39+
rect.getEnvelope().getMinX(),
40+
rect.getEnvelope().getMaxX(),
41+
rect.getEnvelope().getMinY(),
42+
rect.getEnvelope().getMaxY()
43+
))
44+
.collect(Collectors.toList());
45+
}
46+
47+
private static <T> Stream<T> extract(T obj, Function<T, ? extends Collection<T>> f) {
48+
return Stream.concat(
49+
Stream.of(obj),
50+
f.apply(obj)
51+
.stream()
52+
.flatMap(sub -> extract(sub, f))
53+
);
54+
}
55+
56+
}

regulations/api/src/main/java/uk/ac/ox/poseidon/regulations/api/Condition.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
import uk.ac.ox.poseidon.agents.api.Action;
44

5+
import java.util.Collections;
6+
import java.util.Set;
57
import java.util.function.Predicate;
68

79
@FunctionalInterface
810
public interface Condition extends Predicate<Action> {
11+
default Set<Condition> getSubConditions() {
12+
return Collections.emptySet();
13+
}
914
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package uk.ac.ox.poseidon.regulations.api;
2+
3+
import java.util.Set;
4+
5+
public interface ConditionalOperator extends Condition {
6+
Set<Condition> getSubConditions();
7+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package uk.ac.ox.poseidon.regulations.api;
2+
3+
public interface ConditionalRegulations extends Regulations {
4+
Condition getCondition();
5+
6+
Regulations getRegulationIfTrue();
7+
8+
Regulations getRegulationIfFalse();
9+
}

regulations/api/src/main/java/uk/ac/ox/poseidon/regulations/api/Regulations.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import uk.ac.ox.poseidon.agents.api.Action;
44

5+
import java.util.Collection;
6+
import java.util.Collections;
7+
58
import static uk.ac.ox.poseidon.regulations.api.Mode.FORBIDDEN;
69
import static uk.ac.ox.poseidon.regulations.api.Mode.MANDATORY;
710

@@ -23,4 +26,8 @@ default boolean isMandatory(final Action action) {
2326
return mode(action) == MANDATORY;
2427
}
2528

29+
default Collection<Regulations> getSubRegulations() {
30+
return Collections.emptyList();
31+
}
32+
2633
}

regulations/core/src/main/java/uk/ac/ox/poseidon/regulations/core/AbstractCompositeRegulations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ protected AbstractCompositeRegulations(
1414
this.subRegulations = ImmutableList.copyOf(subRegulations);
1515
}
1616

17-
protected Collection<Regulations> getSubRegulations() {
17+
public Collection<Regulations> getSubRegulations() {
1818
return subRegulations;
1919
}
2020

regulations/core/src/main/java/uk/ac/ox/poseidon/regulations/core/ConditionalRegulations.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import uk.ac.ox.poseidon.regulations.api.Mode;
66
import uk.ac.ox.poseidon.regulations.api.Regulations;
77

8-
public class ConditionalRegulations implements Regulations {
8+
public class ConditionalRegulations implements uk.ac.ox.poseidon.regulations.api.ConditionalRegulations {
99

1010
private final Condition condition;
1111
private final Regulations regulationsIfTrue;
@@ -21,14 +21,17 @@ public ConditionalRegulations(
2121
this.regulationsIfFalse = regulationsIfFalse;
2222
}
2323

24+
@Override
2425
public Condition getCondition() {
2526
return condition;
2627
}
2728

29+
@Override
2830
public Regulations getRegulationIfTrue() {
2931
return regulationsIfTrue;
3032
}
3133

34+
@Override
3235
public Regulations getRegulationIfFalse() {
3336
return regulationsIfFalse;
3437
}
Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,25 @@
11
package uk.ac.ox.poseidon.regulations.core.conditions;
22

3-
import com.google.common.collect.ImmutableSet;
43
import uk.ac.ox.poseidon.agents.api.Action;
54
import uk.ac.ox.poseidon.regulations.api.Condition;
65

7-
import java.util.Collection;
86
import java.util.Set;
97

10-
public class AllOf implements Condition {
8+
public class AllOf extends VariadicConditionalOperator {
119

12-
private final Set<Condition> conditions;
13-
14-
public AllOf(final Collection<Condition> conditions) {
15-
this.conditions = ImmutableSet.copyOf(conditions);
16-
}
17-
18-
public Set<Condition> getConditions() {
19-
return conditions;
10+
public AllOf(Set<Condition> operands) {
11+
super(operands);
2012
}
2113

2214
@Override
2315
public boolean test(final Action action) {
24-
return conditions.stream().allMatch(predicate -> predicate.test(action));
16+
return getSubConditions().stream().allMatch(predicate -> predicate.test(action));
2517
}
2618

2719
@Override
2820
public String toString() {
2921
return "AllOf{" +
30-
"conditions=" + conditions +
22+
"conditions=" + getSubConditions() +
3123
'}';
3224
}
3325
}

0 commit comments

Comments
 (0)