Skip to content

Commit 666d183

Browse files
authored
[ENH] Add Greenstone example model and CG solver tests (#1048)
# Description Added a new Greenstone example model to GemPy with supporting functionality. The implementation includes: - Added a new `GREENSTONE` enum to `ExampleModel` - Created a `_generate_greenstone_model` function in the examples generator - Added the binary Greenstone.gempy model file - Updated the interpolation input factory to handle weights from solutions - Added tests for the Greenstone model including CG solver tests with PyKeops Relates to #weights-caching-and-cg-solver # Checklist - [x] My code uses type hinting for function and method arguments and return values. - [x] I have created tests which cover my code. - [x] The test code either 1. demonstrates at least one valuable use case (e.g. integration tests) or 2. verifies that outputs are as expected for given inputs (e.g. unit tests). - [x] New tests pass locally with my changes.
2 parents 4385562 + 07c5095 commit 666d183

15 files changed

+165
-40
lines changed
13 KB
Binary file not shown.

examples/examples/real/Hecho.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -215,20 +215,15 @@
215215
# %%
216216
# Setting verbose and condition number options for debugging
217217
geo_model.interpolation_options.kernel_options.compute_condition_number = True
218-
# %%
219-
# Observations and parameter adjustments
220-
# The octree refinement is making the octree grid almost dense, and smaller chunks are needed to avoid running out of memory.
221-
# Adjusting parameters accordingly:
222-
223-
geo_model.interpolation_options.evaluation_options.evaluation_chunk_size = 50_000
224218

225219
# %%
226220
gp.compute_model(
227221
gempy_model=geo_model,
228222
engine_config=gp.data.GemPyEngineConfig(
229223
backend=gp.data.AvailableBackends.PYTORCH,
230224
dtype='float64'
231-
)
225+
),
226+
validate_serialization=False
232227
)
233228

234229
# %%

gempy/API/compute_API.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from typing import Optional
55

66
import gempy_engine
7-
from gempy.API.gp2_gp3_compatibility.gp3_to_gp2_input import gempy3_to_gempy2
87
from gempy_engine.config import AvailableBackends
98
from gempy_engine.core.backend_tensor import BackendTensor
109
from gempy_engine.core.data import Solutions
@@ -14,7 +13,6 @@
1413
from ..core.data.geo_model import GeoModel
1514
from ..modules.data_manipulation import interpolation_input_from_structural_frame
1615
from ..modules.optimize_nuggets import nugget_optimizer
17-
from ..optional_dependencies import require_gempy_legacy
1816

1917
dotenv.load_dotenv()
2018

gempy/API/examples_generator.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ def generate_example_model(example_model: ExampleModel, compute_model: bool = Tr
2525
return _generate_one_fault_model_gravity(compute_model)
2626
case ExampleModel.GRABEN:
2727
return _generate_graben_model(compute_model)
28+
case ExampleModel.GREENSTONE:
29+
return _generate_greenstone_model(compute_model)
2830
case _:
2931
raise NotImplementedError(f"Example model {example_model} not implemented.")
3032

@@ -482,3 +484,26 @@ def _generate_graben_model(compute_model: bool) -> gp.data.GeoModel:
482484

483485
return geo_data
484486

487+
488+
def _generate_greenstone_model(compute_model: bool) -> gp.data.GeoModel:
489+
test_dir = os.path.dirname(os.path.abspath(__file__))
490+
491+
# Build the path relative to the test file location
492+
path = os.path.join(test_dir, '..', '..', 'examples', 'data', 'gempy_models', 'Greenstone.gempy')
493+
with open(path, 'rb') as f:
494+
binary_file = f.read()
495+
496+
from gempy.modules.serialization.save_load import _load_model_from_bytes
497+
geo_model: gp.data.GeoModel = _load_model_from_bytes(binary_file)
498+
499+
if compute_model:
500+
sol = gp.compute_model(
501+
gempy_model=geo_model,
502+
engine_config=gp.data.GemPyEngineConfig(
503+
backend=gp.data.AvailableBackends.numpy,
504+
dtype='float32'
505+
)
506+
)
507+
return geo_model
508+
509+

gempy/core/data/enumerators.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ class ExampleModel(Enum):
99
COMBINATION = auto()
1010
ONE_FAULT_GRAVITY = auto()
1111
GRABEN = auto()
12+
GREENSTONE = auto()

gempy/modules/data_manipulation/_engine_factory.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,18 @@ def interpolation_input_from_structural_frame(geo_model: "gempy.data.GeoModel")
4242
extent_transformed=geo_model.extent_transformed_transformed_by_input
4343
)
4444

45+
weights = []
46+
if geo_model.solutions is not None:
47+
for stack_sol in geo_model.solutions.root_output.outputs_centers:
48+
weights.append(stack_sol.weights)
49+
50+
4551
interpolation_input: InterpolationInput = InterpolationInput(
4652
surface_points=surface_points,
4753
orientations=orientations,
4854
grid=grid,
49-
unit_values=structural_frame.elements_ids # TODO: Here we will need to pass densities etc.
55+
unit_values=structural_frame.elements_ids, # TODO: Here we will need to pass densities etc.
56+
weights=weights
5057
)
5158

5259
return interpolation_input

gempy/modules/optimize_nuggets/_optimizer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def nugget_optimizer(
2525
engine_backend=engine_cfg.backend,
2626
use_gpu=engine_cfg.use_gpu,
2727
dtype=engine_cfg.dtype,
28+
grads=True
2829
)
2930

3031
# 2) Prepare data

requirements/base-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-r requirements.txt
22

33
# This install matplotlib
4-
gempy_viewer~=2025.1.0
4+
gempy_viewer~=2025.1.4
55
pandas

requirements/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# This install also numpy
2-
gempy_engine>=2025.2.0dev0,<2025.3.0
2+
gempy_engine>=2025.3.0dev0,<2025.4.0

test/test_model_types/test_example_models_I.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,13 @@ def test_generate_combination_model():
8080
model=model,
8181
name="Combination Scalar Field"
8282
)
83-
83+
84+
85+
def test_generate_greenstone_model():
86+
model = gp.generate_example_model(ExampleModel.GREENSTONE, compute_model=True)
87+
print(model.structural_frame)
88+
89+
if PLOT:
90+
gpv = require_gempy_viewer()
91+
gpv.plot_3d(model, image=True)
92+

0 commit comments

Comments
 (0)