pycsamt.ai.domain_gap.empirical#

Empirical field-calibrated corruption for synthetic EM surveys.

Functions

apply_empirical_corruption(survey, *, ...[, ...])

Apply jointly sampled field profiles and empirical error quantiles.

Classes

EmpiricalCorruptionResult(survey, seed, ...)

One corrupted survey and every sampled latent array.

class pycsamt.ai.domain_gap.empirical.EmpiricalCorruptionResult(survey, seed, field_station_indices, static_log10_resistivity_factor, relative_error_fraction, noise_realization, missing_mask, measurement_reliability, dimensionality_reliability, observation_reliability)[source]

Bases: object

One corrupted survey and every sampled latent array.

Parameters:
  • survey (SurveyData) – Corrupted survey with declared empirical impedance errors.

  • seed (int) – Parent random seed.

  • field_station_indices (ndarray of int) – Empirical field station selected for each synthetic station.

  • static_log10_resistivity_factor (ndarray) – Sampled log10(rho_observed / rho_smooth).

  • relative_error_fraction (ndarray) – Sampled impedance-error fractions by component.

  • noise_realization (ndarray of complex) – Additive complex noise in impedance units.

  • missing_mask (ndarray of bool) – True where an observation was removed.

  • measurement_reliability (ndarray) – Separate and combined reliability factors.

  • dimensionality_reliability (ndarray) – Separate and combined reliability factors.

  • observation_reliability (ndarray) – Separate and combined reliability factors.

survey: SurveyData
seed: int
field_station_indices: ndarray
static_log10_resistivity_factor: ndarray
relative_error_fraction: ndarray
noise_realization: ndarray
missing_mask: ndarray
measurement_reliability: ndarray
dimensionality_reliability: ndarray
observation_reliability: ndarray
property record_hash: str[source]

Return a deterministic hash of seed and sampled summaries.

Returns:

SHA-256 digest of JSON-compatible provenance.

Return type:

str

to_dict()[source]

Return compact JSON-compatible corruption provenance.

Returns:

Seed, selected field stations, and sampled ranges.

Return type:

dict

pycsamt.ai.domain_gap.empirical.apply_empirical_corruption(survey, *, field_frequencies_hz, static_log10_resistivity_profiles, measurement_reliability_profiles, dimensionality_reliability_profiles, observation_reliability_profiles, relative_error_quantiles, seed, missing_rate_by_component=None)[source]

Apply jointly sampled field profiles and empirical error quantiles.

Parameters:
  • survey (SurveyData) – Clean synthetic survey.

  • field_frequencies_hz (array-like) – Positive unique frequencies of the empirical field profiles.

  • static_log10_resistivity_profiles (array-like) – Field log10(rho_observed / rho_smooth) profiles shaped (n_field_station, n_field_frequency).

  • measurement_reliability_profiles (array-like) – Aligned empirical reliability profiles in [0, 1].

  • dimensionality_reliability_profiles (array-like) – Aligned empirical reliability profiles in [0, 1].

  • observation_reliability_profiles (array-like) – Aligned empirical reliability profiles in [0, 1].

  • relative_error_quantiles (mapping) – Component names mapped to {"levels": ..., "values": ...} monotone empirical quantile curves.

  • seed (int) – Parent random seed.

  • missing_rate_by_component (mapping or None, optional) – Empirical independent missing probabilities. Missing observations are set to complex NaN and marked invalid.

Returns:

Corrupted survey and complete sampled provenance.

Return type:

EmpiricalCorruptionResult

Notes

Static shift is supplied in apparent-resistivity space and therefore applied to impedance as 10**(0.5 * log10_rho_factor).

Examples

>>> clean = SurveyData(
...     np.ones((2, 2, 1), complex),
...     [10.0, 1.0],
...     ["A", "B"],
...     ["zxy"],
...     [[0, 0], [1, 0]],
... )
>>> result = apply_empirical_corruption(
...     clean,
...     field_frequencies_hz=[10.0, 1.0],
...     static_log10_resistivity_profiles=[[0.0, 0.0]],
...     measurement_reliability_profiles=[[0.8, 0.7]],
...     dimensionality_reliability_profiles=[[1.0, 0.5]],
...     observation_reliability_profiles=[[0.8, 0.35]],
...     relative_error_quantiles={
...         "zxy": {"levels": [0, 1], "values": [0.01, 0.05]}
...     },
...     seed=0,
... )
>>> result.survey.shape
(2, 2, 1)