GroundTruthObservation.java

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

import java.util.Objects;
import org.hammer.audio.experimental.acoustic.scenario.ScenarioSource;
import org.hammer.audio.geometry.Vector2;

/**
 * Ground-truth state for one source at one benchmark timestamp.
 *
 * @param source source metadata
 * @param expectedPositionMeters expected source position in meters, or {@code null} if unavailable
 * @param expectedVelocityMetersPerSecond expected source velocity, or {@code null} if unavailable
 * @param expectedFrequencyHz expected source frequency in hertz, or {@code null} if unavailable
 */
public record GroundTruthObservation(
    ScenarioSource source,
    Vector2 expectedPositionMeters,
    Vector2 expectedVelocityMetersPerSecond,
    Double expectedFrequencyHz) {

  public GroundTruthObservation {
    Objects.requireNonNull(source, "source");
  }

  public boolean hasPositionTruth() {
    return expectedPositionMeters != null;
  }

  public boolean hasFrequencyTruth() {
    return expectedFrequencyHz != null;
  }

  public boolean hasDopplerTruth() {
    return expectedPositionMeters != null && expectedVelocityMetersPerSecond != null;
  }

  public boolean hasAlignmentTruth() {
    return hasPositionTruth() || hasFrequencyTruth();
  }
}