diff --git a/examples/data/gempy_models/Greenstone.gempy b/examples/data/gempy_models/Greenstone.gempy new file mode 100644 index 000000000..c49dc13f2 Binary files /dev/null and b/examples/data/gempy_models/Greenstone.gempy differ diff --git a/examples/examples/real/Hecho.py b/examples/examples/real/Hecho.py index 79ad6639f..bdad86b70 100644 --- a/examples/examples/real/Hecho.py +++ b/examples/examples/real/Hecho.py @@ -215,12 +215,6 @@ # %% # Setting verbose and condition number options for debugging geo_model.interpolation_options.kernel_options.compute_condition_number = True -# %% -# Observations and parameter adjustments -# The octree refinement is making the octree grid almost dense, and smaller chunks are needed to avoid running out of memory. -# Adjusting parameters accordingly: - -geo_model.interpolation_options.evaluation_options.evaluation_chunk_size = 50_000 # %% gp.compute_model( @@ -228,7 +222,8 @@ engine_config=gp.data.GemPyEngineConfig( backend=gp.data.AvailableBackends.PYTORCH, dtype='float64' - ) + ), + validate_serialization=False ) # %% diff --git a/gempy/API/compute_API.py b/gempy/API/compute_API.py index 25c1fcdd2..3d8f52f7f 100644 --- a/gempy/API/compute_API.py +++ b/gempy/API/compute_API.py @@ -4,7 +4,6 @@ from typing import Optional import gempy_engine -from gempy.API.gp2_gp3_compatibility.gp3_to_gp2_input import gempy3_to_gempy2 from gempy_engine.config import AvailableBackends from gempy_engine.core.backend_tensor import BackendTensor from gempy_engine.core.data import Solutions @@ -14,7 +13,6 @@ from ..core.data.geo_model import GeoModel from ..modules.data_manipulation import interpolation_input_from_structural_frame from ..modules.optimize_nuggets import nugget_optimizer -from ..optional_dependencies import require_gempy_legacy dotenv.load_dotenv() diff --git a/gempy/API/examples_generator.py b/gempy/API/examples_generator.py index 9428754be..961ab7ac5 100644 --- a/gempy/API/examples_generator.py +++ b/gempy/API/examples_generator.py @@ -25,6 +25,8 @@ def generate_example_model(example_model: ExampleModel, compute_model: bool = Tr return _generate_one_fault_model_gravity(compute_model) case ExampleModel.GRABEN: return _generate_graben_model(compute_model) + case ExampleModel.GREENSTONE: + return _generate_greenstone_model(compute_model) case _: raise NotImplementedError(f"Example model {example_model} not implemented.") @@ -482,3 +484,26 @@ def _generate_graben_model(compute_model: bool) -> gp.data.GeoModel: return geo_data + +def _generate_greenstone_model(compute_model: bool) -> gp.data.GeoModel: + test_dir = os.path.dirname(os.path.abspath(__file__)) + + # Build the path relative to the test file location + path = os.path.join(test_dir, '..', '..', 'examples', 'data', 'gempy_models', 'Greenstone.gempy') + with open(path, 'rb') as f: + binary_file = f.read() + + from gempy.modules.serialization.save_load import _load_model_from_bytes + geo_model: gp.data.GeoModel = _load_model_from_bytes(binary_file) + + if compute_model: + sol = gp.compute_model( + gempy_model=geo_model, + engine_config=gp.data.GemPyEngineConfig( + backend=gp.data.AvailableBackends.numpy, + dtype='float32' + ) + ) + return geo_model + + diff --git a/gempy/core/data/enumerators.py b/gempy/core/data/enumerators.py index b086a1aa3..1954b3b0a 100644 --- a/gempy/core/data/enumerators.py +++ b/gempy/core/data/enumerators.py @@ -9,3 +9,4 @@ class ExampleModel(Enum): COMBINATION = auto() ONE_FAULT_GRAVITY = auto() GRABEN = auto() + GREENSTONE = auto() diff --git a/gempy/modules/data_manipulation/_engine_factory.py b/gempy/modules/data_manipulation/_engine_factory.py index c8615d05d..5c46c6968 100644 --- a/gempy/modules/data_manipulation/_engine_factory.py +++ b/gempy/modules/data_manipulation/_engine_factory.py @@ -42,11 +42,18 @@ def interpolation_input_from_structural_frame(geo_model: "gempy.data.GeoModel") extent_transformed=geo_model.extent_transformed_transformed_by_input ) + weights = [] + if geo_model.solutions is not None: + for stack_sol in geo_model.solutions.root_output.outputs_centers: + weights.append(stack_sol.weights) + + interpolation_input: InterpolationInput = InterpolationInput( surface_points=surface_points, orientations=orientations, grid=grid, - unit_values=structural_frame.elements_ids # TODO: Here we will need to pass densities etc. + unit_values=structural_frame.elements_ids, # TODO: Here we will need to pass densities etc. + weights=weights ) return interpolation_input diff --git a/gempy/modules/optimize_nuggets/_optimizer.py b/gempy/modules/optimize_nuggets/_optimizer.py index 058c17c74..f040530c7 100644 --- a/gempy/modules/optimize_nuggets/_optimizer.py +++ b/gempy/modules/optimize_nuggets/_optimizer.py @@ -25,6 +25,7 @@ def nugget_optimizer( engine_backend=engine_cfg.backend, use_gpu=engine_cfg.use_gpu, dtype=engine_cfg.dtype, + grads=True ) # 2) Prepare data diff --git a/requirements/base-requirements.txt b/requirements/base-requirements.txt index 00fb79841..51d854208 100644 --- a/requirements/base-requirements.txt +++ b/requirements/base-requirements.txt @@ -1,5 +1,5 @@ -r requirements.txt # This install matplotlib -gempy_viewer~=2025.1.0 +gempy_viewer~=2025.1.4 pandas diff --git a/requirements/requirements.txt b/requirements/requirements.txt index d818e9713..1a292ef14 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,2 +1,2 @@ # This install also numpy -gempy_engine>=2025.2.0dev0,<2025.3.0 +gempy_engine>=2025.3.0dev0,<2025.4.0 diff --git a/test/test_model_types/test_example_models_I.py b/test/test_model_types/test_example_models_I.py index a69e7acac..138eb5bde 100644 --- a/test/test_model_types/test_example_models_I.py +++ b/test/test_model_types/test_example_models_I.py @@ -80,4 +80,13 @@ def test_generate_combination_model(): model=model, name="Combination Scalar Field" ) - + + +def test_generate_greenstone_model(): + model = gp.generate_example_model(ExampleModel.GREENSTONE, compute_model=True) + print(model.structural_frame) + + if PLOT: + gpv = require_gempy_viewer() + gpv.plot_3d(model, image=True) + diff --git a/test/test_model_types/test_example_models_I.test_generate_combination_model.Combination Scalar Field.approved.txt b/test/test_model_types/test_example_models_I.test_generate_combination_model.Combination Scalar Field.approved.txt index 7f167e1e8..9506d05c3 100644 --- a/test/test_model_types/test_example_models_I.test_generate_combination_model.Combination Scalar Field.approved.txt +++ b/test/test_model_types/test_example_models_I.test_generate_combination_model.Combination Scalar Field.approved.txt @@ -1,9 +1,9 @@ -[-0.47370804 -0.22882972 -0.17098718 -0.03740668 -0.1331182 -0.36460383 - -0.15089813 -0.22213337 -0.15759448 -0.02401399 -0.12642185 0.00715865 - -0.3868865 -0.39577646 -0.08416563 -0.15540086 -0.07746928 -0.16648445 - -0.38019015 -0.24660965 -0.07077293 0.03163493 0.00935227 0.06280756 - 0.05160848 0.18518898 0.08278112 0.21636161 0.2809005 0.20966526 - 0.31207313 0.0805875 0.15851908 0.16740905 0.23864428 0.47012991 - 0.37441839 -0.04410303 0.05830483 -0.0129304 0.11395375 0.34543938 - 0.36772205 0.37661201 0.39219833 0.22305796 0.32546583 0.14293276 - 0.31876948 0.53247517 0.46123994] +[-0.47370804 -0.01512402 -0.2933686 0.42337096 0.39889468 0.23864428 + -0.42250411 -0.39133148 -0.23997105 -0.20879842 -0.2332747 -0.3133999 + -0.3534625 -0.16203947 0.03607991 0.00490728 -0.46256671 -0.32009625 + -0.29561996 -0.1531495 -0.24886102 -0.18651575 -0.1932121 -0.05074163 + -0.0596316 -0.09080423 0.10731515 0.23639291 0.21411025 0.27645551 + 0.26975916 0.33210443 0.1006188 0.24308926 0.15626771 0.29873818 + 0.28315186 0.25197923 0.45009861 0.05385985 0.17404765 0.20522028 + 0.22969656 0.2608692 0.0605562 0.09172883 0.11620511 0.14737775 + 0.29873818 0.26756555 0.46568493] diff --git a/test/test_model_types/test_example_models_I.test_generate_fault_model.Fault Scalar Field.approved.txt b/test/test_model_types/test_example_models_I.test_generate_fault_model.Fault Scalar Field.approved.txt index 590718c8f..5e1e2cd63 100644 --- a/test/test_model_types/test_example_models_I.test_generate_fault_model.Fault Scalar Field.approved.txt +++ b/test/test_model_types/test_example_models_I.test_generate_fault_model.Fault Scalar Field.approved.txt @@ -1,9 +1,13 @@ -[-0.1392846 -0.11116681 -0.26449206 -0.27858931 -0.30810439 -0.14968921 - -0.09447202 -0.14585538 0.08501889 0.15848263 -0.08214193 -0.01325316 - 0.14947106 -0.0649086 -0.36480339 -0.14775211 -0.11782683 -0.2599415 - -0.28515257 -0.0905377 0.0980803 0.05291076 -0.0704939 0.00945358 - 0.03710443 -0.0739189 -0.08710456 0.15971804 -0.05909646 0.03401982 - 0.11368978 0.18807022 0.26154531 0.30770615 0.14548409 0.19288724 - 0.383562 0.16111616 0.03852545 -0.06932341 0.08035318 0.02398674 - -0.01260595 0.04257085 0.29119355 0.26789519 0.15125526 0.17373195 - 0.27665695 0.13183626 0.14195753] +[-1.13708400e-02 -2.52401253e-01 -1.58105889e-01 -2.53046188e-01 + -1.02730053e-01 3.07857424e-02 1.65039406e-02 1.02339531e-02 + -7.49849706e-03 2.03358730e-03 1.68709401e-02 1.16318104e-02 + -5.46883208e-03 -3.66307173e-01 -2.16332415e-01 -3.08865566e-01 + -2.15389261e-01 -1.11256902e-01 2.72083076e-02 4.20445442e-02 + -7.47304561e-02 3.98513512e-02 1.63139249e-02 4.29008353e-02 + -7.33691160e-03 3.78053797e-02 1.68817500e-03 1.19697379e-02 + 2.92719967e-02 1.01708771e-02 2.46994485e-02 2.91498040e-02 + 2.38183394e-02 1.43569767e-01 2.64840495e-01 3.68607253e-01 + 2.35431983e-01 3.12159958e-01 2.13482001e-05 5.67351744e-02 + -8.42197714e-03 1.74023726e-01 1.53633321e-02 6.80918669e-03 + -1.60048318e-03 1.23676916e-01 2.07197240e-01 2.84933975e-01 + 1.27564214e-02 2.58711537e-01 2.99561004e-02] diff --git a/test/test_model_types/test_example_models_I.test_generate_fold_model.Anticline Scalar Field.approved.txt b/test/test_model_types/test_example_models_I.test_generate_fold_model.Anticline Scalar Field.approved.txt index 34a300022..f6e049a5e 100644 --- a/test/test_model_types/test_example_models_I.test_generate_fold_model.Anticline Scalar Field.approved.txt +++ b/test/test_model_types/test_example_models_I.test_generate_fold_model.Anticline Scalar Field.approved.txt @@ -1,9 +1,9 @@ -[-0.52188333 -0.50112162 -0.42984112 -0.50125078 -0.5236967 -0.35683332 - -0.38732066 -0.41792324 -0.5444072 -0.39905631 -0.44620461 -0.45210505 - -0.33743959 -0.40682861 -0.47639785 -0.4552543 -0.38059134 -0.55295399 - -0.43369522 -0.40885491 -0.48980574 -0.49550079 -0.41034204 -0.50137384 - -0.43740675 -0.35470835 -0.50319884 -0.5238445 -0.50194786 -0.33142261 - -0.50728961 -0.43556368 -0.41173995 -0.48483987 -0.46553386 -0.35610584 - -0.3657635 -0.43209016 -0.54574333 -0.43253114 -0.35558502 -0.52390714 - -0.45315845 -0.45991493 -0.46509034 -0.38966641 -0.49660931 -0.43707138 - -0.37491253 -0.32893974 -0.35520657] +[-0.52188333 -0.50112162 -0.4782676 -0.4049219 -0.52592991 -0.35477513 + -0.32950309 -0.49867861 -0.39645404 -0.3705816 -0.53297922 -0.4170038 + -0.38884941 -0.50066294 -0.52343835 -0.50147135 -0.38406676 -0.49930607 + -0.34000787 -0.36981774 -0.39715035 -0.50713183 -0.38966825 -0.5074257 + -0.53982527 -0.35470835 -0.49995446 -0.383908 -0.54971153 -0.47881636 + -0.54893268 -0.39154008 -0.41173995 -0.50805229 -0.37732251 -0.35443146 + -0.40539656 -0.38387161 -0.54517857 -0.52338116 -0.40620542 -0.47800398 + -0.49943244 -0.50482445 -0.5102548 -0.35318898 -0.55119547 -0.35075437 + -0.41029029 -0.32958424 -0.35520657] diff --git a/test/test_modules/test_cg/__init__.py b/test/test_modules/test_cg/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_modules/test_cg/test_cg_solver.py b/test/test_modules/test_cg/test_cg_solver.py new file mode 100644 index 000000000..8a999708f --- /dev/null +++ b/test/test_modules/test_cg/test_cg_solver.py @@ -0,0 +1,85 @@ +import pytest + +import gempy as gp +from gempy.core.data.enumerators import ExampleModel +from gempy.optional_dependencies import require_gempy_viewer +import gempy_engine.core.backend_tensor as BackendTensor + +from gempy_engine.modules.weights_cache.weights_cache_interface import WeightCache + +PLOT = True + +pytest.mark.skip("Run explicitly") + +def test_solve_with_cg(): + model = gp.generate_example_model(ExampleModel.GREENSTONE, compute_model=False) + print(model.structural_frame) + + WeightCache.clear_cache() + BackendTensor.PYKEOPS = False + + sol = gp.compute_model( + gempy_model=model, + engine_config=gp.data.GemPyEngineConfig( + backend=gp.data.AvailableBackends.PYTORCH, + use_gpu=True, + dtype='float64' + ) + ) + + if PLOT: + gpv = require_gempy_viewer() + gpv.plot_3d(model, image=True) + + +def test_save_weights(): + model = gp.generate_example_model(ExampleModel.GREENSTONE, compute_model=False) + print(model.structural_frame) + + sol = gp.compute_model( + gempy_model=model, + engine_config=gp.data.GemPyEngineConfig( + backend=gp.data.AvailableBackends.PYTORCH, + use_gpu=False, + dtype='float32' + ) + ) + weights1 = sol.octrees_output[0].outputs_centers[0].weights + weights2 = sol.octrees_output[0].outputs_centers[1].weights + weights3 = sol.octrees_output[0].outputs_centers[2].weights + + WeightCache.clear_cache() + BackendTensor.PYKEOPS = False + + sol = gp.compute_model( + gempy_model=model, + engine_config=gp.data.GemPyEngineConfig( + backend=gp.data.AvailableBackends.PYTORCH, + use_gpu=False, + dtype='float32' + ) + ) + + if PLOT: + gpv = require_gempy_viewer() + gpv.plot_3d(model, image=True) + + +def test_keops_x_torch(): + model = gp.generate_example_model(ExampleModel.GREENSTONE, compute_model=False) + print(model.structural_frame) + + WeightCache.clear_cache() + BackendTensor.PYKEOPS = False + sol = gp.compute_model( + gempy_model=model, + engine_config=gp.data.GemPyEngineConfig( + backend=gp.data.AvailableBackends.PYTORCH, + use_gpu=False, + dtype='float32' + ) + ) + + if PLOT: + gpv = require_gempy_viewer() + gpv.plot_3d(model, image=True)