Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nonrandomparameters #10

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
3 changes: 1 addition & 2 deletions api/src/main/java/org/fairdatapipeline/api/CodeRepo.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.fairdatapipeline.api;

import java.net.URL;
import java.util.List;
import org.fairdatapipeline.dataregistry.restclient.APIURL;

Expand All @@ -15,7 +14,7 @@ class CodeRepo {

CodeRepo(
String latest_commit,
URL repo_url,
String repo_url,
String description,
List<APIURL> authors,
Coderun coderun) {
Expand Down
11 changes: 1 addition & 10 deletions api/src/main/java/org/fairdatapipeline/api/Coderun.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.nio.file.*;
import java.time.LocalDateTime;
import java.util.*;
Expand Down Expand Up @@ -237,18 +235,11 @@ private void prepare_code_run() {
this.registryCode_run.setSubmission_script(this.script_object.getUrl());
String latest_commit = this.config.run_metadata().latest_commit().orElse("");
String remote_repo = this.config.run_metadata().remote_repo().orElse("");
URL remote_repo_url;
try {
remote_repo_url = new URL(remote_repo);
} catch (MalformedURLException e) {
throw (new ConfigException(
"Remote repo must be a valid URL; (" + remote_repo + " isn't)", e));
}

this.codeRepo =
new CodeRepo(
latest_commit,
remote_repo_url,
remote_repo,
"Analysis / processing script location",
this.authors,
this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,14 @@
import java.nio.file.Path;
import java.util.List;
import org.fairdatapipeline.distribution.Distribution;
import org.fairdatapipeline.distribution.ImmutableDistribution;
import org.fairdatapipeline.estimate.ImmutableEstimate;
import org.fairdatapipeline.file.CleanableFileChannel;
import org.fairdatapipeline.parameters.ImmutableBoolList;
import org.fairdatapipeline.parameters.ImmutableNumberList;
import org.fairdatapipeline.parameters.ImmutableStringList;
import org.fairdatapipeline.parameters.ReadComponent;
import org.fairdatapipeline.samples.ImmutableSamples;

/**
* This represents an object_component to read from (or raise issues with) An object_component
Expand Down Expand Up @@ -77,7 +83,11 @@
} catch (IOException e) {
throw (new RuntimeException("readEstimate() -- IOException trying to read from file", e));
}
return data.getEstimate();
if (!(data instanceof ImmutableEstimate)) {
throw (new RuntimeException(

Check warning on line 87 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L87 was not covered by tests
"readEstimate() -- this objComponent (" + this.component_name + ") is not an estimate"));
}
return ((ImmutableEstimate) data).getEstimate();
}

/**
Expand All @@ -93,7 +103,70 @@
throw (new RuntimeException(
"readDistribution() -- IOException trying to read from file.", e));
}
return data.getDistribution();
if (!(data instanceof ImmutableDistribution)) {
throw (new RuntimeException(

Check warning on line 107 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L107 was not covered by tests
"readDistribution() -- this objComponent ("
+ this.component_name
+ ") is not a distribution"));
}
return ((ImmutableDistribution) data).getDistribution();
}

/**
* read the Bools that were stored as this component in a TOML file.
*
* @return the Bools object
*/
public List<Boolean> readBools() {
ReadComponent data;
try (CleanableFileChannel fileChannel = this.getFileChannel()) {
data = this.dp.coderun.parameterDataReader.read(fileChannel, this.component_name);
} catch (IOException e) {
throw (new RuntimeException("readBools() -- IOException trying to read from file.", e));

Check warning on line 125 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_read.java#L124-L125

Added lines #L124 - L125 were not covered by tests
}
if (!(data instanceof ImmutableBoolList)) {
throw (new RuntimeException(

Check warning on line 128 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L128 was not covered by tests
"readBools() -- this objComponent (" + this.component_name + ") is not a BoolList"));
}
return ((ImmutableBoolList) data).getBools();
}

/**
* read the Strings that were stored as this component in a TOML file.
*
* @return the Strings object
*/
public List<String> readStrings() {
ReadComponent data;
try (CleanableFileChannel fileChannel = this.getFileChannel()) {
data = this.dp.coderun.parameterDataReader.read(fileChannel, this.component_name);
} catch (IOException e) {
throw (new RuntimeException("readStrings() -- IOException trying to read from file.", e));

Check warning on line 144 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_read.java#L143-L144

Added lines #L143 - L144 were not covered by tests
}
if (!(data instanceof ImmutableStringList)) {
throw (new RuntimeException(

Check warning on line 147 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L147 was not covered by tests
"readStrings() -- this objComponent (" + this.component_name + ") is not a StringList"));
}
return ((ImmutableStringList) data).getStrings();
}

/**
* read the Numbers that were stored as this component in a TOML file.
*
* @return the Numbers object
*/
public List<Number> readNumbers() {
ReadComponent data;
try (CleanableFileChannel fileChannel = this.getFileChannel()) {
data = this.dp.coderun.parameterDataReader.read(fileChannel, this.component_name);
} catch (IOException e) {
throw (new RuntimeException("readStrings() -- IOException trying to read from file.", e));

Check warning on line 163 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_read.java#L162-L163

Added lines #L162 - L163 were not covered by tests
}
if (!(data instanceof ImmutableNumberList)) {
throw (new RuntimeException(

Check warning on line 166 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L166 was not covered by tests
"readNumbers() -- this objComponent (" + this.component_name + ") is not a NumberList"));
}
return ((ImmutableNumberList) data).getNumbers();
}

/**
Expand All @@ -108,7 +181,11 @@
} catch (IOException e) {
throw (new RuntimeException("readSamples() -- IOException trying to read from file.", e));
}
return data.getSamples();
if (!(data instanceof ImmutableSamples)) {
throw (new RuntimeException(

Check warning on line 185 in api/src/main/java/org/fairdatapipeline/api/Object_component_read.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L185 was not covered by tests
"readSamples() -- this objComponent (" + this.component_name + ") is not a samples"));
}
return ((ImmutableSamples) data).getSamples();
}

void register_me_in_registry() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import org.fairdatapipeline.distribution.Distribution;
import org.fairdatapipeline.estimate.ImmutableEstimate;
import org.fairdatapipeline.file.CleanableFileChannel;
import org.fairdatapipeline.parameters.BoolList;
import org.fairdatapipeline.parameters.NumberList;
import org.fairdatapipeline.parameters.StringList;
import org.fairdatapipeline.samples.Samples;

/**
Expand Down Expand Up @@ -64,6 +67,9 @@
* @param estimateNumber the number to write.
*/
public void writeEstimate(Number estimateNumber) {
if (this.been_used) {
throw (new RuntimeException("obj component already written"));
}
var estimate =
ImmutableEstimate.builder().internalValue(estimateNumber).rng(this.dp.coderun.rng).build();

Expand All @@ -72,6 +78,7 @@
} catch (IOException e) {
throw (new RuntimeException("writeEstimate() -- IOException trying to write to file.", e));
}
this.been_used = true;
}

/**
Expand All @@ -80,12 +87,67 @@
* @param distribution the Distribution to write
*/
public void writeDistribution(Distribution distribution) {
if (this.been_used) {
throw (new RuntimeException("obj component already written"));
}
try (CleanableFileChannel fileChannel = this.getFileChannel()) {
this.dp.coderun.parameterDataWriter.write(fileChannel, this.component_name, distribution);
} catch (IOException e) {
throw (new RuntimeException(
"writeDistribution() -- IOException trying to write to file.", e));
}
this.been_used = true;
}

/**
* write a BoolList, as this named component in the data product.
*
* @param bools the Booleans to write
*/
public void writeBools(BoolList bools) {
if (this.been_used) {
throw (new RuntimeException("obj component already written"));

Check warning on line 109 in api/src/main/java/org/fairdatapipeline/api/Object_component_write.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_write.java#L109

Added line #L109 was not covered by tests
}
try (CleanableFileChannel fileChannel = this.getFileChannel()) {
this.dp.coderun.parameterDataWriter.write(fileChannel, this.component_name, bools);
} catch (IOException e) {
throw (new RuntimeException("writeBools() -- IOException trying to write to file.", e));

Check warning on line 114 in api/src/main/java/org/fairdatapipeline/api/Object_component_write.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_write.java#L113-L114

Added lines #L113 - L114 were not covered by tests
}
this.been_used = true;
}

/**
* write a StringList, as this named component in the data product.
*
* @param strings the Strings to write
*/
public void writeStrings(StringList strings) {
if (this.been_used) {
throw (new RuntimeException("obj component already written"));

Check warning on line 126 in api/src/main/java/org/fairdatapipeline/api/Object_component_write.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_write.java#L126

Added line #L126 was not covered by tests
}
try (CleanableFileChannel fileChannel = this.getFileChannel()) {
this.dp.coderun.parameterDataWriter.write(fileChannel, this.component_name, strings);
} catch (IOException e) {
throw (new RuntimeException("writeStrings() -- IOException trying to write to file.", e));

Check warning on line 131 in api/src/main/java/org/fairdatapipeline/api/Object_component_write.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_write.java#L130-L131

Added lines #L130 - L131 were not covered by tests
}
this.been_used = true;
}

/**
* write NumberList, as this named component in the data product.
*
* @param numbers the Numbers to write
*/
public void writeNumbers(NumberList numbers) {
if (this.been_used) {
throw (new RuntimeException("obj component already written"));

Check warning on line 143 in api/src/main/java/org/fairdatapipeline/api/Object_component_write.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_write.java#L143

Added line #L143 was not covered by tests
}
try (CleanableFileChannel fileChannel = this.getFileChannel()) {
this.dp.coderun.parameterDataWriter.write(fileChannel, this.component_name, numbers);
} catch (IOException e) {
throw (new RuntimeException("writeStrings() -- IOException trying to write to file.", e));

Check warning on line 148 in api/src/main/java/org/fairdatapipeline/api/Object_component_write.java

View check run for this annotation

Codecov / codecov/patch

api/src/main/java/org/fairdatapipeline/api/Object_component_write.java#L147-L148

Added lines #L147 - L148 were not covered by tests
}
this.been_used = true;
}

/**
Expand All @@ -94,11 +156,15 @@
* @param samples a Samples object containing the samples
*/
public void writeSamples(Samples samples) {
if (this.been_used) {
throw (new RuntimeException("obj component already written"));
}
try (CleanableFileChannel fileChannel = this.getFileChannel()) {
this.dp.coderun.parameterDataWriter.write(fileChannel, this.component_name, samples);
} catch (IOException e) {
throw (new RuntimeException("writeSamples() -- IOException trying to write to file.", e));
}
this.been_used = true;
}

void register_me_in_code_run() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
Expand All @@ -14,6 +13,7 @@
/** This is used to store a file or a remote repo to the registry as a RegistryStorage_location. */
class Storage_location {
private static final Logger logger = LoggerFactory.getLogger(Storage_location.class);

RegistryStorage_location registryStorage_location;

/**
Expand All @@ -25,8 +25,8 @@ class Storage_location {
* we will use the existing one instead of storing this one.
* @param coderun link back to the Coderun that created us.
*/
Storage_location(URL remote_repo, String latest_commit, Coderun coderun) {
String[] split_repo = Storage_root.url_to_root(remote_repo);
Storage_location(String remote_repo, String latest_commit, Coderun coderun) {
String[] split_repo = Storage_root.gitrepo_to_root(remote_repo);
Storage_root storage_root = new Storage_root(URI.create(split_repo[0]), coderun.restClient);
create_storagelocation(latest_commit, storage_root, coderun, split_repo[1], null);
}
Expand Down
34 changes: 26 additions & 8 deletions api/src/main/java/org/fairdatapipeline/api/Storage_root.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package org.fairdatapipeline.api;

import java.net.URI;
import java.net.URL;
import java.nio.file.Path;
import java.util.Collections;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.fairdatapipeline.dataregistry.content.RegistryStorage_root;
import org.fairdatapipeline.dataregistry.restclient.APIURL;
import org.fairdatapipeline.dataregistry.restclient.RestClient;

/** Retrieve or create the RegistryStorage_root with a given 'root'. */
class Storage_root {
private static Pattern git_repo_url =
Pattern.compile("(\\w+://)(.+@)*([\\w\\d\\.]+)(:[\\d]+){0,1}/*(.*)");
private static Pattern git_repo_file = Pattern.compile("file://(.*)");
private static Pattern git_repo_ssh = Pattern.compile("(.+@)([\\w\\d\\.]+):(.*)");
RegistryStorage_root registryStorage_root;

/**
Expand Down Expand Up @@ -47,15 +53,27 @@ Path getPath() {
}

/**
* split the repository URL into a storage root (proto://authority/ part) and path (/xxx/xxx) part
* split the repository location into a storage root HTTPS: proto://authority/path/to/stuff
* becomes proto://authority AND /path/to/stuff SSH: [email protected]:bboskamp/BTv.git becomes
* [email protected] AND /bboskamp/BTv.git
*
* @param url the URL to split up into scheme/authority and path.
* @param repo_location the repository location string to split up into scheme/authority and path.
* @return string array of length 2.
*/
static String[] url_to_root(URL url) {
String path = url.getPath().substring(1);
String scheme_and_authority_part =
url.toString().substring(0, url.toString().length() - path.length());
return new String[] {scheme_and_authority_part, path};
static String[] gitrepo_to_root(String repo_location) {
Matcher m1 = git_repo_url.matcher(repo_location);
if (m1.find())
return new String[] {
Objects.toString(m1.group(1), "")
+ Objects.toString(m1.group(2), "")
+ Objects.toString(m1.group(3), "")
+ Objects.toString(m1.group(4), ""),
m1.group(5)
};
m1 = git_repo_file.matcher(repo_location);
if (m1.find()) return new String[] {"file://", m1.group(1)};
m1 = git_repo_ssh.matcher(repo_location);
if (m1.find()) return new String[] {m1.group(1) + m1.group(2), m1.group(3)};
return new String[] {};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import org.apache.commons.math3.distribution.RealDistribution;
import org.apache.commons.math3.distribution.UniformRealDistribution;
import org.apache.commons.math3.random.EmpiricalDistribution;
import org.fairdatapipeline.parameters.Component;
import org.fairdatapipeline.parameters.RngComponent;
import org.immutables.value.Value.Auxiliary;
import org.immutables.value.Value.Check;
import org.immutables.value.Value.Immutable;
Expand All @@ -33,7 +33,7 @@
TODO support other distributions:
https://github.com/ScottishCovidResponse/SCRCIssueTracking/issues/671
*/
public interface Distribution extends Component {
public interface Distribution extends RngComponent {
enum DistributionType {
gamma(),
exponential(),
Expand Down
4 changes: 2 additions & 2 deletions api/src/main/java/org/fairdatapipeline/estimate/Estimate.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.util.List;
import org.fairdatapipeline.distribution.Distribution;
import org.fairdatapipeline.parameters.Component;
import org.fairdatapipeline.parameters.RngComponent;
import org.immutables.value.Value.Immutable;

/** a component to store a plain simple single Number */
@Immutable
@JsonDeserialize
@JsonSerialize
public interface Estimate extends Component {
public interface Estimate extends RngComponent {
/** @return Number - the value that is stored in this component */
@JsonProperty("value")
Number internalValue();
Expand Down
Loading
Loading