Skip to content

Commit c82bd07

Browse files
feat: add minValue and maxValue fields to AlgorithmSpecificationDTO and DataModelDTO; implement corresponding test cases
1 parent 971ab23 commit c82bd07

4 files changed

Lines changed: 123 additions & 5 deletions

File tree

‎pom.xml‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@
5252
</exclusion>
5353
</exclusions>
5454
</dependency>
55+
<dependency>
56+
<groupId>org.springframework.boot</groupId>
57+
<artifactId>spring-boot-starter-test</artifactId>
58+
<scope>test</scope>
59+
</dependency>
5560
<dependency>
5661
<groupId>org.springframework.boot</groupId>
5762
<artifactId>spring-boot-jdbc</artifactId>

‎src/main/java/hbp/mip/algorithm/AlgorithmSpecificationDTO.java‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ public record AlgorithmParameterSpecificationDTO(
3030
List<String> types,
3131
String required,
3232
String multiple,
33-
String min,
34-
String max,
33+
String minValue,
34+
String maxValue,
3535
@SerializedName("default") String default_value,
3636
AlgorithmEnumDTO enums,
3737
AlgorithmEnumDTO dict_keys_enums,
38-
AlgorithmEnumDTO dict_values_enums
38+
AlgorithmEnumDTO dict_values_enums,
39+
String dict_values_type
3940

4041
) {
4142
public record AlgorithmEnumDTO(
@@ -68,6 +69,7 @@ public record TransformerSpecificationDTO(
6869
String name,
6970
String label,
7071
String desc,
72+
Integer order,
7173
Map<String, AlgorithmParameterSpecificationDTO> parameters) {
7274
@Override
7375
public Map<String, AlgorithmParameterSpecificationDTO> parameters() {

‎src/main/java/hbp/mip/datamodel/DataModelDTO.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ public static class CommonDataElementDTO {
172172
private String is_categorical;
173173
@Setter
174174
private List<DataModelDTO.EnumerationDTO> enumerations;
175-
private String min;
176-
private String max;
175+
private String minValue;
176+
private String maxValue;
177177
private String type;
178178
private String methodology;
179179
private String units;
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package hbp.mip.algorithm;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.google.gson.Gson;
6+
import com.google.gson.reflect.TypeToken;
7+
import hbp.mip.experiment.ExperimentExecutionDTO;
8+
import org.junit.jupiter.api.Test;
9+
10+
import java.lang.reflect.Type;
11+
import java.util.LinkedHashMap;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.UUID;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
18+
class AlgorithmSpecificationDTOTest {
19+
private final Gson gson = new Gson();
20+
private final ObjectMapper objectMapper = new ObjectMapper();
21+
22+
@Test
23+
void deserializesOutlierDictionaryMetadataAndPreprocessingOrder() throws Exception {
24+
String payload = """
25+
[
26+
{
27+
"name": "outlier_report",
28+
"label": "Outlier Report",
29+
"desc": "Detect outliers.",
30+
"inputdata": {
31+
"data_model": { "label": "Data model", "desc": "", "types": ["text"] },
32+
"datasets": { "label": "Datasets", "desc": "", "types": ["text"] },
33+
"y": { "label": "Y", "desc": "", "types": ["real"], "required": true, "multiple": true }
34+
},
35+
"parameters": {
36+
"folds": {
37+
"label": "Folds",
38+
"types": ["dict"],
39+
"required": false,
40+
"multiple": false,
41+
"dict_keys_enums": {
42+
"type": "input_var_names",
43+
"source": ["x", "y"]
44+
},
45+
"dict_values_type": "real"
46+
}
47+
},
48+
"preprocessing": [
49+
{
50+
"name": "outlier_winsorizer",
51+
"label": "Outlier Winsorizer",
52+
"order": 2,
53+
"parameters": {}
54+
}
55+
]
56+
}
57+
]
58+
""";
59+
60+
Type algorithmListType = new TypeToken<List<AlgorithmSpecificationDTO>>() {
61+
}.getType();
62+
List<AlgorithmSpecificationDTO> algorithms = gson.fromJson(payload, algorithmListType);
63+
64+
AlgorithmSpecificationDTO algorithm = algorithms.getFirst();
65+
AlgorithmSpecificationDTO.AlgorithmParameterSpecificationDTO folds = algorithm.parameters().get("folds");
66+
67+
assertThat(folds.dict_values_type()).isEqualTo("real");
68+
assertThat(folds.dict_keys_enums().type()).isEqualTo("input_var_names");
69+
assertThat(folds.dict_keys_enums().source()).containsExactly("x", "y");
70+
assertThat(algorithm.preprocessing().getFirst().order()).isEqualTo(2);
71+
72+
JsonNode serialized = objectMapper.readTree(objectMapper.writeValueAsString(algorithm));
73+
assertThat(serialized.at("/parameters/folds/dict_values_type").asText()).isEqualTo("real");
74+
assertThat(serialized.at("/preprocessing/0/order").asInt()).isEqualTo(2);
75+
}
76+
77+
@Test
78+
void serializesNestedOutlierPreprocessingUnchangedForExaflowRequest() throws Exception {
79+
Map<String, Object> outlierWinsorizer = new LinkedHashMap<>();
80+
outlierWinsorizer.put("strategies", Map.of("age", "iqr"));
81+
outlierWinsorizer.put("tails", Map.of("age", "both"));
82+
outlierWinsorizer.put("folds", Map.of("age", 1.5));
83+
84+
Map<String, Object> preprocessing = Map.of("outlier_winsorizer", outlierWinsorizer);
85+
ExperimentExecutionDTO.AlgorithmExecutionDTO algorithmExecutionDTO =
86+
new ExperimentExecutionDTO.AlgorithmExecutionDTO(
87+
"linear_regression",
88+
new AlgorithmRequestDTO.InputDataRequestDTO(
89+
"dm:1",
90+
List.of("ds1"),
91+
List.of("outcome"),
92+
List.of("age"),
93+
null
94+
),
95+
Map.of(),
96+
preprocessing
97+
);
98+
99+
AlgorithmRequestDTO request = AlgorithmRequestDTO.create(
100+
UUID.fromString("00000000-0000-0000-0000-000000000001"),
101+
algorithmExecutionDTO
102+
);
103+
104+
JsonNode outlierNode = objectMapper.readTree(objectMapper.writeValueAsString(request))
105+
.at("/preprocessing/outlier_winsorizer");
106+
107+
assertThat(outlierNode.at("/strategies/age").asText()).isEqualTo("iqr");
108+
assertThat(outlierNode.at("/tails/age").asText()).isEqualTo("both");
109+
assertThat(outlierNode.at("/folds/age").asDouble()).isEqualTo(1.5);
110+
}
111+
}

0 commit comments

Comments
 (0)