2.26.5.24. pycsamt.agents.joint_agent#
pycsamt.agents.joint_agent#
JointInversionAgent — Multi-modal joint MT inversion via DRCNN.
Wraps JointInverter:
Fuses a primary MT dataset with a secondary modality (TEM, CSAMT, gravity proxy, or a second MT profile at a different frequency range).
Both modalities are observed at the same stations. When no secondary dataset is supplied the agent synthesises a complementary low-frequency response from the same
LayeredModelto demonstrate the joint-inversion pipeline.Produces a joint resistivity section (station × depth) that benefits from the complementary depth sensitivities of the two modalities.
Architecture#
The DRCNNNet (Dense-Residual CNN) is used
as the shared feature extractor; each modality has its own encoding branch
before the fused prediction head.
Requires PyTorch or TensorFlow.
Classes
|
Multi-modal MT joint inversion using DRCNN. |
- class pycsamt.agents.joint_agent.JointInversionAgent(*, api_key=None, model=None, llm_provider='claude', modalities=None, n_layers=5, n_freqs_primary=40, n_freqs_secondary=20, n_train_samples=2000, epochs=30, growth_rate=32)[source]
Bases:
BaseAgentMulti-modal MT joint inversion using DRCNN.
- Parameters:
api_key (str)
model (str)
llm_provider (str)
modalities (list[str]) – Names of the two modalities, e.g.
["mt", "tem"]. The first entry is the primary modality (loaded fromsites/path); the second is loaded fromsecondary_pathor synthesised when absent.n_layers (int) – Number of depth layers in the output model (default 5).
n_freqs_primary (int) – Frequencies for the primary MT response features (default 40).
n_freqs_secondary (int) – Frequencies for the secondary modality features (default 20).
n_train_samples (int) – Synthetic training samples shared across both modalities (default 2000).
epochs (int) – Training epochs (default 30).
growth_rate (int) – DRCNN dense-block growth rate (default 32).
keys (Output data)
----------
path (sites /)
secondary_path (str, optional — secondary modality EDI/TEM path)
output_dir (str, optional)
period_range ([T_min, T_max], optional)
keys
----------------
JointInverter (inverter)
{station (rms_per_station dict)
{station
float (rms_global)
list[str] (modalities)
dict (figure_paths)
dict
Examples
>>> agent = JointInversionAgent( ... modalities=["mt", "tem"], n_layers=5, epochs=20 ... ) >>> result = agent.execute({"path": "/data/L22PLT"}) >>> result["rms_global"] 0.31
- SYSTEM_PROMPT: str = 'You are an expert in multi-modal geophysical joint inversion using deep learning.\nGiven a joint MT inversion result, write 4-5 sentences that:\n1. Describe the two modalities fused and their complementary depth sensitivities.\n2. Assess the joint prediction quality (RMS, depth range, station count).\n3. Compare the joint result to a single-modality approach where possible.\n4. Identify where the secondary modality most improved the primary inversion.\n5. Recommend validation (borehole, gravity, seismic) and next modelling steps.\nReply in plain scientific English.\n'
Override in subclasses to give the LLM its domain expertise.
- execute(input_data)[source]
Run this agent on input_data and return an
AgentResult.Subclasses must implement this method. The contract:
Reset
self._last_cost = 0.0at the top.Record wall-clock time with
t0 = time.time().Return
AgentResult(elapsed_seconds=time.time()-t0, cost_estimate_usd=self._last_cost, ...).
- Parameters:
- Return type: