Skip to content

Commit 8e231d4

Browse files
authored
Merge pull request #38 from comet-ml/CM-1597-builder-refactoring
[CM-1597] Clarify Java-SDK Experiment creation API
2 parents 20a7685 + 97e76f4 commit 8e231d4

File tree

9 files changed

+96
-37
lines changed

9 files changed

+96
-37
lines changed

README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
```
1919
#### Create experiment and log metrics and parameters:
2020
```java
21-
OnlineExperiment experiment = OnlineExperimentImpl.builder()
21+
OnlineExperiment experiment = ExperimentBuilder.OnlineExperiment()
2222
.withApiKey("someApiKey")
2323
.withProjectName("someProject")
2424
.withWorkspace("someWorkspace")
@@ -31,13 +31,13 @@ OnlineExperiment experiment = OnlineExperimentImpl.builder()
3131

3232
#### Configure you experiment object:
3333
```java
34-
#Configuration hierarchy:
35-
#Environment Variable > Configuration File Override > Default config file (application.conf)
34+
# Configuration hierarchy:
35+
Environment Variable > Configuration File Override > Default config file (application.conf)
3636

37-
#Setting configuration in code:
37+
# Setting configuration in code:
3838
OnlineExperimentImpl.builder().withApiKey("someApiKey").build();
3939

40-
#Override configuration file (can have partial keys)
40+
# Override configuration file (can have partial keys)
4141
OnlineExperimentImpl.builder().withConfig(new File("/tmp/comet.conf")).build();
4242

4343
# Read from environment variables OR from configuration file in classpath (application.conf)
@@ -55,5 +55,7 @@ COMET_MAX_AUTH_RETRIES
5555

5656
#### Examples
5757

58-
* You also can check [sample experiment](comet-examples/src/main/java/ml/comet/examples/OnlineExperimentExample.java)
58+
* You also can check
59+
* [sample experiment](comet-examples/src/main/java/ml/comet/examples/OnlineExperimentExample.java)
60+
* [MNIST classification experiment](comet-examples/src/main/java/ml/comet/examples/mnist/MnistExperimentExample.java)
5961
* For more usage examples refer to [tests](comet-java-client/src/test/java/ml/comet/experiment)

comet-examples/src/main/java/ml/comet/examples/OnlineExperimentExample.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package ml.comet.examples;
22

3+
import ml.comet.experiment.ExperimentBuilder;
34
import ml.comet.experiment.OnlineExperiment;
4-
import ml.comet.experiment.OnlineExperimentImpl;
55

66
import java.io.IOException;
77

@@ -40,13 +40,13 @@ private void run() throws IOException {
4040
//this will take configs from /comet-java-sdk/comet-examples/src/main/resources/application.conf
4141
//be sure you have set up apiKey, project, workspace in defaults.conf before you start!
4242

43-
OnlineExperiment experiment = OnlineExperimentImpl
44-
.builder()
43+
OnlineExperiment experiment = ExperimentBuilder
44+
.OnlineExperiment()
4545
.interceptStdout()
4646
.build();
4747

48-
//you can use a builder or just inject params
49-
//OnlineExperimentImpl.builder();
48+
//you can use a default builder or just inject params
49+
//OnlineExperiment experiment = ExperimentBuilder.OnlineExperiment().builder();
5050

5151
experiment.setExperimentName("Java-SDK 2.0.2");
5252
experiment.nextStep();

comet-examples/src/main/java/ml/comet/examples/mnist/MnistExperimentExample.java

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

33
import com.beust.jcommander.JCommander;
44
import com.beust.jcommander.Parameter;
5+
import ml.comet.experiment.ExperimentBuilder;
56
import ml.comet.experiment.OnlineExperiment;
6-
import ml.comet.experiment.OnlineExperimentImpl;
77
import org.deeplearning4j.datasets.iterator.impl.MnistDataSetIterator;
88
import org.deeplearning4j.nn.api.Model;
99
import org.deeplearning4j.nn.api.OptimizationAlgorithm;
@@ -63,18 +63,17 @@ public final class MnistExperimentExample {
6363
* <p>Alternatively you can set these values in the <strong>resources/application.conf</strong> file
6464
*
6565
* @param args the command line arguments.
66-
* @throws Exception if any exception occurs during experiment execution.
6766
*/
68-
public static void main(String[] args) throws Exception {
67+
public static void main(String[] args) {
6968
MnistExperimentExample main = new MnistExperimentExample();
7069
JCommander.newBuilder()
7170
.addObject(main)
7271
.build()
7372
.parse(args);
7473

7574
// update application.conf or provide environment variables as described in JavaDoc.
76-
OnlineExperiment experiment = OnlineExperimentImpl
77-
.builder()
75+
OnlineExperiment experiment = ExperimentBuilder
76+
.OnlineExperiment()
7877
.interceptStdout()
7978
.build();
8079
try {

comet-java-client/src/main/java/ml/comet/experiment/Experiment.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package ml.comet.experiment;
22

33
import ml.comet.experiment.impl.constants.AssetType;
4-
import ml.comet.experiment.model.GitMetadata;
54
import ml.comet.experiment.model.ExperimentAssetLink;
65
import ml.comet.experiment.model.ExperimentMetadataRest;
6+
import ml.comet.experiment.model.GitMetadata;
77
import ml.comet.experiment.model.GitMetadataRest;
88
import ml.comet.experiment.model.ValueMinMaxDto;
99

@@ -12,7 +12,14 @@
1212
import java.util.Optional;
1313

1414
/**
15-
* Describes the public contract of the Experiment.
15+
* The {@link Experiment} is a unit of measurable research that defines a single run with
16+
* some data/parameters/code/results.
17+
*
18+
* <p>Creating an {@link Experiment} object in your code will report a new experiment to
19+
* your Comet.ml project.
20+
*
21+
* <p>Your {@link Experiment} will automatically track and collect many things and will also
22+
* allow you to manually report anything.
1623
*/
1724
public interface Experiment {
1825

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package ml.comet.experiment;
2+
3+
import lombok.experimental.UtilityClass;
4+
import ml.comet.experiment.builder.OnlineExperimentBuilder;
5+
import ml.comet.experiment.impl.OnlineExperimentImpl;
6+
7+
/**
8+
* The factory of builders to be used for creation of different {@link Experiment} implementations.
9+
*/
10+
@UtilityClass
11+
public class ExperimentBuilder {
12+
13+
/**
14+
* Returns instance of the {@link OnlineExperimentBuilder} which can be used to
15+
* configure and create fully initialized instance of the {@link OnlineExperiment}.
16+
*
17+
* <p>The configured instance of {@link OnlineExperiment} can be created as following:
18+
* <pre>
19+
* OnlineExperiment experiment = ExperimentBuilder
20+
* .OnlineExperiment()
21+
* .build();
22+
* </pre>
23+
*
24+
* @return the instance of the {@link OnlineExperimentBuilder}.
25+
*/
26+
public static OnlineExperimentBuilder OnlineExperiment() {
27+
return OnlineExperimentImpl.builder();
28+
}
29+
}

comet-java-client/src/main/java/ml/comet/experiment/OnlineExperimentImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
/**
66
* This is stub to support backward compatibility.
77
*
8-
* @deprecated It would be replaced in the future with new experiment creation API.
8+
* @deprecated You should use {@link ExperimentBuilder#OnlineExperiment()} instead to create
9+
* instance of the {@link OnlineExperiment}.
910
*/
1011
@UtilityClass
1112
public final class OnlineExperimentImpl {
1213
/**
1314
* Returns builder to be used to create properly configured instance of {@link OnlineExperiment}.
1415
*
1516
* @return the builder to be used to create properly configured instance of {@link OnlineExperiment}.
17+
* @deprecated please use {@link ExperimentBuilder#OnlineExperiment()} instead.
1618
*/
1719
public static ml.comet.experiment.builder.OnlineExperimentBuilder builder() {
1820
return ml.comet.experiment.impl.OnlineExperimentImpl.builder();

comet-java-client/src/main/java/ml/comet/experiment/builder/ApiExperimentBuilder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,11 @@
77
* to work with Comet API synchronously.
88
*/
99
public interface ApiExperimentBuilder extends BaseCometBuilder<Experiment> {
10-
10+
/**
11+
* Allows to continue a previous experiment by providing the key of the existing experiment.
12+
*
13+
* @param experimentKey The experiment key for the experiment that is being continued
14+
* @return the builder configured with specified key of the previous experiment.
15+
*/
16+
ApiExperimentBuilder withExistingExperimentKey(String experimentKey);
1117
}

comet-java-client/src/main/java/ml/comet/experiment/impl/ApiExperimentImpl.java

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,6 @@ void init() {
4747
super.init();
4848
}
4949

50-
/**
51-
* Returns builder to create ApiExperiment instance.
52-
*
53-
* @param experimentKey the unique identifier of the existing experiment.
54-
* @return the initialized ApiExperiment instance.
55-
*/
56-
public static ApiExperimentImpl.ApiExperimentBuilderImpl builder(@NonNull final String experimentKey) {
57-
return new ApiExperimentImpl.ApiExperimentBuilderImpl(experimentKey);
58-
}
59-
6050
@Override
6151
public String getWorkspaceName() {
6252
return getMetadata().getWorkspaceName();
@@ -86,16 +76,40 @@ public Optional<String> getExperimentLink() {
8676
}
8777
}
8878

79+
/**
80+
* Returns builder to create {@link Experiment} instance.
81+
*
82+
* @param experimentKey the unique identifier of the existing experiment.
83+
* @return the initialized {@link ApiExperimentBuilder} instance.
84+
*/
85+
public static ApiExperimentImpl.ApiExperimentBuilderImpl builder(@NonNull final String experimentKey) {
86+
return builder().withExistingExperimentKey(experimentKey);
87+
}
88+
89+
/**
90+
* Returns builder to create {@link Experiment} instance.
91+
*
92+
* @return the initialized {@link ApiExperimentBuilder} instance.
93+
*/
94+
public static ApiExperimentImpl.ApiExperimentBuilderImpl builder() {
95+
return new ApiExperimentImpl.ApiExperimentBuilderImpl();
96+
}
97+
8998
/**
9099
* The builder to create properly configured ApiExperiment instance.
91100
*/
92101
public static final class ApiExperimentBuilderImpl implements ApiExperimentBuilder {
93-
private final String experimentKey;
102+
private String experimentKey;
94103
private String apiKey;
95104
private Logger logger;
96105

97-
private ApiExperimentBuilderImpl(final String anExperimentKey) {
98-
this.experimentKey = anExperimentKey;
106+
private ApiExperimentBuilderImpl() {
107+
}
108+
109+
@Override
110+
public ApiExperimentImpl.ApiExperimentBuilderImpl withExistingExperimentKey(@NonNull String experimentKey) {
111+
this.experimentKey = experimentKey;
112+
return this;
99113
}
100114

101115
@Override

comet-java-client/src/main/java/ml/comet/experiment/impl/CometApiImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public final class CometApiImpl implements CometApi {
3939
CometUtils.printCometSdkVersion();
4040
}
4141

42-
@SuppressWarnings("checkstyle:MissingJavadocMethod")
42+
@Override
4343
public List<String> getAllWorkspaces() {
4444
if (this.logger.isDebugEnabled()) {
4545
this.logger.debug("getAllWorkspaces invoked");
@@ -51,7 +51,7 @@ public List<String> getAllWorkspaces() {
5151
.getWorkspaceNames();
5252
}
5353

54-
@SuppressWarnings("checkstyle:MissingJavadocMethod")
54+
@Override
5555
public List<RestProject> getAllProjects(@NonNull String workspaceName) {
5656
if (this.logger.isDebugEnabled()) {
5757
this.logger.debug("getAllProjects invoked");
@@ -63,7 +63,7 @@ public List<RestProject> getAllProjects(@NonNull String workspaceName) {
6363
.getProjects();
6464
}
6565

66-
@SuppressWarnings("checkstyle:MissingJavadocMethod")
66+
@Override
6767
public List<ExperimentMetadataRest> getAllExperiments(@NonNull String projectId) {
6868
if (this.logger.isDebugEnabled()) {
6969
this.logger.debug("getAllExperiments invoked");
@@ -120,7 +120,7 @@ public CometApiBuilder withApiKey(@NonNull String apiKey) {
120120
}
121121

122122
/**
123-
* Factory method to build fully initialized instance of the CometApiImpl.
123+
* Factory method to build fully initialized instance of the {@link CometApi}.
124124
*
125125
* @return the fully initialized instance of the CometApiImpl.
126126
*/

0 commit comments

Comments
 (0)