Skip to content

Commit b3a4c07

Browse files
committed
added non RNG parameters for TOML parameters files
1 parent f573334 commit b3a4c07

17 files changed

+173
-93
lines changed

api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

+20-3
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
import java.nio.file.Path;
55
import java.util.List;
66
import org.fairdatapipeline.distribution.Distribution;
7+
import org.fairdatapipeline.distribution.ImmutableDistribution;
8+
import org.fairdatapipeline.estimate.ImmutableEstimate;
79
import org.fairdatapipeline.file.CleanableFileChannel;
810
import org.fairdatapipeline.parameters.ReadComponent;
11+
import org.fairdatapipeline.samples.ImmutableSamples;
912

1013
/**
1114
* This represents an object_component to read from (or raise issues with) An object_component
@@ -77,7 +80,11 @@ public Number readEstimate() {
7780
} catch (IOException e) {
7881
throw (new RuntimeException("readEstimate() -- IOException trying to read from file", e));
7982
}
80-
return data.getEstimate();
83+
if (!(data instanceof ImmutableEstimate)) {
84+
throw (new RuntimeException(
85+
"readEstimate() -- this objComponent (" + this.component_name + ") is not an estimate"));
86+
}
87+
return ((ImmutableEstimate) data).getEstimate();
8188
}
8289

8390
/**
@@ -93,7 +100,13 @@ public Distribution readDistribution() {
93100
throw (new RuntimeException(
94101
"readDistribution() -- IOException trying to read from file.", e));
95102
}
96-
return data.getDistribution();
103+
if (!(data instanceof ImmutableDistribution)) {
104+
throw (new RuntimeException(
105+
"readDistribution() -- this objComponent ("
106+
+ this.component_name
107+
+ ") is not a distribution"));
108+
}
109+
return ((ImmutableDistribution) data).getDistribution();
97110
}
98111

99112
/**
@@ -108,7 +121,11 @@ public List<Number> readSamples() {
108121
} catch (IOException e) {
109122
throw (new RuntimeException("readSamples() -- IOException trying to read from file.", e));
110123
}
111-
return data.getSamples();
124+
if (!(data instanceof ImmutableSamples)) {
125+
throw (new RuntimeException(
126+
"readSamples() -- this objComponent (" + this.component_name + ") is not a samples"));
127+
}
128+
return ((ImmutableSamples) data).getSamples();
112129
}
113130

114131
void register_me_in_registry() {

api/src/main/java/org/fairdatapipeline/distribution/Distribution.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.apache.commons.math3.distribution.RealDistribution;
1919
import org.apache.commons.math3.distribution.UniformRealDistribution;
2020
import org.apache.commons.math3.random.EmpiricalDistribution;
21-
import org.fairdatapipeline.parameters.Component;
21+
import org.fairdatapipeline.parameters.RngComponent;
2222
import org.immutables.value.Value.Auxiliary;
2323
import org.immutables.value.Value.Check;
2424
import org.immutables.value.Value.Immutable;
@@ -33,7 +33,7 @@
3333
TODO support other distributions:
3434
https://github.com/ScottishCovidResponse/SCRCIssueTracking/issues/671
3535
*/
36-
public interface Distribution extends Component {
36+
public interface Distribution extends RngComponent {
3737
enum DistributionType {
3838
gamma(),
3939
exponential(),

api/src/main/java/org/fairdatapipeline/estimate/Estimate.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
77
import java.util.List;
88
import org.fairdatapipeline.distribution.Distribution;
9-
import org.fairdatapipeline.parameters.Component;
9+
import org.fairdatapipeline.parameters.RngComponent;
1010
import org.immutables.value.Value.Immutable;
1111

1212
/** a component to store a plain simple single Number */
1313
@Immutable
1414
@JsonDeserialize
1515
@JsonSerialize
16-
public interface Estimate extends Component {
16+
public interface Estimate extends RngComponent {
1717
/** @return Number - the value that is stored in this component */
1818
@JsonProperty("value")
1919
Number internalValue();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.fairdatapipeline.parameters;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
5+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
6+
import java.util.List;
7+
import org.immutables.value.Value.Immutable;
8+
9+
@Immutable
10+
@JsonSerialize
11+
@JsonDeserialize
12+
public interface BoolList extends Component {
13+
List<Boolean> bools();
14+
15+
@JsonIgnore
16+
default List<Boolean> getBools() {
17+
return bools();
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
11
package org.fairdatapipeline.parameters;
22

3-
import org.apache.commons.math3.random.RandomGenerator;
4-
import org.immutables.value.Value.Auxiliary;
5-
6-
public interface Component extends ReadComponent, WriteComponent {
7-
@Auxiliary
8-
RandomGenerator rng();
9-
}
3+
public interface Component extends ReadComponent, WriteComponent {}

api/src/main/java/org/fairdatapipeline/parameters/ComponentsDeserializer.java

+15-7
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,16 @@ public ComponentsDeserializer(RandomGenerator rng) {
2929

3030
private static final Map<String, Class<?>> typeMapping =
3131
Map.of(
32-
"point-estimate", ImmutableEstimate.class,
33-
"distribution", ImmutableDistribution.class,
34-
"samples", ImmutableSamples.class);
32+
"point-estimate",
33+
ImmutableEstimate.class,
34+
"distribution",
35+
ImmutableDistribution.class,
36+
"samples",
37+
ImmutableSamples.class,
38+
"bools",
39+
ImmutableBoolList.class,
40+
"strings",
41+
ImmutableStringList.class);
3542

3643
@Override
3744
public Components deserialize(JsonParser jsonParser, DeserializationContext ctxt)
@@ -42,23 +49,24 @@ public Components deserialize(JsonParser jsonParser, DeserializationContext ctxt
4249
Streams.stream(rootNode.fields())
4350
.map(this::deserializeSingleComponent)
4451
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
45-
4652
return ImmutableComponents.builder().components(components).build();
4753
}
4854

4955
private Entry<String, Component> deserializeSingleComponent(Entry<String, JsonNode> entry) {
5056
String key = entry.getKey();
5157
ObjectNode componentNode = entry.getValue().deepCopy();
52-
componentNode.putPOJO("rng", new Object()); // this is a hack to force rng to populate via
53-
// RandomGeneratorDeserializer.class
5458
String type = componentNode.get("type").asText();
5559
componentNode.remove("type");
5660
Class<?> deserializeClass = typeMapping.get(type);
5761

5862
if (deserializeClass == null) {
5963
throw new IllegalArgumentException(String.format("Unsupported component type %s", type));
6064
}
61-
65+
if (RngComponent.class.isAssignableFrom(deserializeClass.getInterfaces()[0])) {
66+
componentNode.putPOJO("rng", new Object());
67+
// this is a hack to force rng to populate via
68+
// RandomGeneratorDeserializer.class
69+
}
6270
ObjectMapper objectMapper = new DataPipelineMapper(rng);
6371
Component component;
6472
try {

api/src/main/java/org/fairdatapipeline/parameters/ComponentsSerializer.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,16 @@ public ComponentsSerializer(RandomGenerator rng) {
2424

2525
private static final Map<Class<?>, String> typeMapping =
2626
Map.of(
27-
ImmutableEstimate.class, "point-estimate",
28-
ImmutableDistribution.class, "distribution",
29-
ImmutableSamples.class, "samples");
27+
ImmutableEstimate.class,
28+
"point-estimate",
29+
ImmutableDistribution.class,
30+
"distribution",
31+
ImmutableSamples.class,
32+
"samples",
33+
ImmutableStringList.class,
34+
"strings",
35+
ImmutableBoolList.class,
36+
"bools");
3037

3138
@Override
3239
public void serialize(Components components, JsonGenerator gen, SerializerProvider serializers)
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
11
package org.fairdatapipeline.parameters;
22

3-
import java.util.List;
4-
import org.fairdatapipeline.distribution.Distribution;
5-
6-
public interface ReadComponent {
7-
Number getEstimate();
8-
9-
List<Number> getSamples();
10-
11-
Distribution getDistribution();
12-
}
3+
public interface ReadComponent {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.fairdatapipeline.parameters;
2+
3+
import java.util.List;
4+
import org.apache.commons.math3.random.RandomGenerator;
5+
import org.fairdatapipeline.distribution.Distribution;
6+
import org.immutables.value.Value;
7+
8+
public interface RngComponent extends Component {
9+
@Value.Auxiliary
10+
RandomGenerator rng();
11+
12+
Number getEstimate();
13+
14+
List<Number> getSamples();
15+
16+
Distribution getDistribution();
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.fairdatapipeline.parameters;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
5+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
6+
import java.util.List;
7+
import org.immutables.value.Value.Immutable;
8+
9+
@Immutable
10+
@JsonSerialize
11+
@JsonDeserialize
12+
public interface StringList extends Component {
13+
List<String> strings();
14+
15+
@JsonIgnore
16+
default List<String> getStrings() {
17+
return strings();
18+
}
19+
}

api/src/main/java/org/fairdatapipeline/samples/Samples.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
import java.util.List;
77
import org.fairdatapipeline.distribution.Distribution;
88
import org.fairdatapipeline.distribution.ImmutableDistribution;
9-
import org.fairdatapipeline.parameters.Component;
9+
import org.fairdatapipeline.parameters.RngComponent;
1010
import org.immutables.value.Value.Immutable;
1111

1212
@Immutable
1313
@JsonSerialize
1414
@JsonDeserialize
15-
public interface Samples extends Component {
15+
public interface Samples extends RngComponent {
1616
List<Number> samples();
1717

1818
@JsonIgnore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.fairdatapipeline.parameters;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
class BoolListTest {
8+
@Test
9+
void makeBoolList() {
10+
var boollist = ImmutableBoolList.builder().addBools(true, false, true).build();
11+
assertThat(boollist.bools()).contains(true, false);
12+
}
13+
}

api/src/test/java/org/fairdatapipeline/parameters/ComponentsDeserializerTest.java

+16-26
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,10 @@
66

77
import com.fasterxml.jackson.core.JsonProcessingException;
88
import com.fasterxml.jackson.databind.ObjectMapper;
9-
import java.util.Map;
109
import org.apache.commons.math3.random.RandomGenerator;
1110
import org.fairdatapipeline.distribution.Distribution.DistributionType;
1211
import org.fairdatapipeline.distribution.ImmutableDistribution;
13-
import org.fairdatapipeline.estimate.ImmutableEstimate;
1412
import org.fairdatapipeline.mapper.DataPipelineMapper;
15-
import org.fairdatapipeline.samples.ImmutableSamples;
1613
import org.junit.jupiter.api.*;
1714

1815
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@@ -25,17 +22,9 @@ class ComponentsDeserializerTest {
2522
+ " \"shape\": 1,\n"
2623
+ " \"type\": \"distribution\"\n"
2724
+ " },\n"
28-
+ " \"example-estimate\": {\n"
29-
+ " \"type\": \"point-estimate\",\n"
30-
+ " \"value\": 1.0\n"
31-
+ " },\n"
32-
+ " \"example-samples\": {\n"
33-
+ " \"samples\": [\n"
34-
+ " 1,\n"
35-
+ " 2,\n"
36-
+ " 3\n"
37-
+ " ],\n"
38-
+ " \"type\": \"samples\"\n"
25+
+ " \"example-strings\": {\n"
26+
+ " \"strings\": [\"bram\",\"rosalie\"],\n"
27+
+ " \"type\": \"strings\"\n"
3928
+ " }\n"
4029
+ "}";
4130

@@ -53,27 +42,28 @@ public void setUp() {
5342
void deserialize() throws JsonProcessingException {
5443
Components actualComponents = objectMapper.readValue(json, Components.class);
5544

56-
var estimate = ImmutableEstimate.builder().internalValue(1.0).rng(rng).build();
5745
var distribution =
5846
ImmutableDistribution.builder()
5947
.internalType(DistributionType.gamma)
6048
.internalShape(1)
6149
.internalScale(2)
6250
.rng(rng)
6351
.build();
64-
var samples = ImmutableSamples.builder().addSamples(1, 2, 3).rng(rng).build();
65-
var expectedComponents =
52+
var strings = ImmutableStringList.builder().addStrings("bram", "rosalie").build();
53+
Components components =
6654
ImmutableComponents.builder()
67-
.components(
68-
Map.of(
69-
"example-estimate",
70-
estimate,
71-
"example-distribution",
72-
distribution,
73-
"example-samples",
74-
samples))
55+
.putComponents("example-distribution", distribution)
56+
.putComponents("example-strings", strings)
7557
.build();
58+
/* var expectedComponents =
59+
ImmutableComponents.builder()
60+
.components(
61+
Map.of(
62+
"example-distribution",
63+
distribution
64+
))
65+
.build();*/
7666

77-
assertThat(actualComponents).isEqualTo(expectedComponents);
67+
assertThat(actualComponents).isEqualTo(components);
7868
}
7969
}

api/src/test/java/org/fairdatapipeline/parameters/ComponentsSerializerTest.java

+5-17
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
import org.apache.commons.math3.random.RandomGenerator;
1212
import org.fairdatapipeline.distribution.Distribution.DistributionType;
1313
import org.fairdatapipeline.distribution.ImmutableDistribution;
14-
import org.fairdatapipeline.estimate.ImmutableEstimate;
1514
import org.fairdatapipeline.mapper.DataPipelineMapper;
16-
import org.fairdatapipeline.samples.ImmutableSamples;
1715
import org.json.JSONException;
1816
import org.junit.jupiter.api.*;
1917

@@ -27,17 +25,9 @@ class ComponentsSerializerTest {
2725
+ " \"shape\": 1,\n"
2826
+ " \"type\": \"distribution\"\n"
2927
+ " },\n"
30-
+ " \"example-estimate\": {\n"
31-
+ " \"type\": \"point-estimate\",\n"
32-
+ " \"value\": 1.0\n"
33-
+ " },\n"
34-
+ " \"example-samples\": {\n"
35-
+ " \"samples\": [\n"
36-
+ " 1,\n"
37-
+ " 2,\n"
38-
+ " 3\n"
39-
+ " ],\n"
40-
+ " \"type\": \"samples\"\n"
28+
+ " \"example-strings\": {\n"
29+
+ " \"strings\": [\"bram\",\"rosalie\"],\n"
30+
+ " \"type\": \"strings\"\n"
4131
+ " }\n"
4232
+ "}";
4333

@@ -54,20 +44,18 @@ public void setUp() {
5444
@Test
5545
void serialize() throws IOException, JSONException {
5646
var writer = new StringWriter();
57-
var estimate = ImmutableEstimate.builder().internalValue(1.0).rng(rng).build();
5847
var distribution =
5948
ImmutableDistribution.builder()
6049
.internalType(DistributionType.gamma)
6150
.internalShape(1)
6251
.internalScale(2)
6352
.rng(rng)
6453
.build();
65-
var samples = ImmutableSamples.builder().addSamples(1, 2, 3).rng(rng).build();
54+
var strings = ImmutableStringList.builder().addStrings("bram", "rosalie").build();
6655
Components components =
6756
ImmutableComponents.builder()
68-
.putComponents("example-estimate", estimate)
6957
.putComponents("example-distribution", distribution)
70-
.putComponents("example-samples", samples)
58+
.putComponents("example-strings", strings)
7159
.build();
7260

7361
objectMapper.writeValue(writer, components);

0 commit comments

Comments
 (0)