WorkbenchExperimentExporter.java

package org.hammer.audio.experimental.acoustic.workbench;

import java.util.Map;
import java.util.Objects;
import org.hammer.audio.acquisition.LocalizationExperiment;
import org.hammer.audio.acquisition.LocalizationExperimentCodec;

/** Exports the reproducibility and hardware context associated with a workbench result. */
public final class WorkbenchExperimentExporter {

  private WorkbenchExperimentExporter() {
    // utility class
  }

  /** Return the deterministic machine-readable experiment manifest. */
  public static String toManifest(WorkbenchRunResult result) {
    return new LocalizationExperimentCodec().encode(experiment(result));
  }

  /** Return a compact human-readable experiment and hardware summary. */
  public static String toMarkdown(WorkbenchRunResult result) {
    LocalizationExperiment experiment = experiment(result);
    StringBuilder output =
        new StringBuilder("# Localization Experiment\n\n| Field | Value |\n|---|---|\n");
    appendRow(output, "Experiment", experiment.experimentId());
    appendRow(output, "Stage", experiment.stage());
    appendRow(output, "Input mode", experiment.inputMode());
    appendRow(output, "Source", experiment.sourceReference());
    appendRow(output, "Profile", experiment.profile().profileId());
    appendRow(output, "Layout", experiment.profile().layout());
    appendRow(output, "Microphones", experiment.profile().array().channels());
    experiment
        .profile()
        .liveCaptureConfiguration()
        .ifPresent(
            configuration ->
                appendRow(output, "Capture device", configuration.device().deviceId()));
    experiment
        .profile()
        .calibrationProfile()
        .ifPresent(calibration -> appendRow(output, "Calibration", calibration.profileId()));
    for (Map.Entry<String, String> entry : experiment.metadata().entrySet()) {
      appendRow(output, "Metadata: " + entry.getKey(), entry.getValue());
    }
    return output.toString();
  }

  private static LocalizationExperiment experiment(WorkbenchRunResult result) {
    Objects.requireNonNull(result, "result");
    return result
        .experimentMetadata()
        .orElseThrow(
            () -> new IllegalArgumentException("workbench result has no experiment metadata"));
  }

  private static void appendRow(StringBuilder output, String field, Object value) {
    output.append("| ").append(field).append(" | ").append(value).append(" |\n");
  }
}