inlab-geo / cofi

Common Framework for Inference
https://cofi.readthedocs.io/en/latest/
BSD 2-Clause "Simplified" License
17 stars 4 forks source link
earth-science geoscience inference inversion python

CoFI (Common Framework for Inference)

PyPI version Conda Version Documentation Status codecov Slack

Related repositories by InLab:

Introduction

CoFI (Common Framework for Inference) is an open source initiative for interfacing between generic inference algorithms and specific geoscience problems.

With a mission to bridge the gap between the domain expertise and the inference expertise, CoFI provides an interface across a wide range of inference algorithms from different sources, underpinned by a rich set of domain relevant examples.

Read the documentation, and let us know your feedback or any issues!

Installation

From PyPI:

$ pip install cofi

Or alternatively, from conda-forge:

$ conda install -c conda-forge cofi

Check CoFI documentation - installation page for details on dependencies and setting up with virtual environments.

Basic Usage

graph TD;
    base_problem_details(inv_problem = BaseProblem#40;#41;\ninv_problem.set_objective#40;DEFINE ME#41;\ninv_problem.set_jacobian#40;DEFINE ME#41;\ninv_problem.set_initial_model#40;DEFINE ME#41;):::cls_code_block
    inversion_options_details(inv_options = InversionOptions#40;#41;\ninv_options.set_tool#40;#34;scipy.linalg.lstsq#34;#41;):::cls_code_block
    inversion_details(inv=Inversion#40;inv_problem, inv_options#41;\nresult = inv.run#40;#41;):::cls_code_block

    subgraph base_problem ["Base Problem"]
        base_problem_details
    end

    subgraph inversion_options ["Inversion Options"]
        inversion_options_details
    end

    subgraph inversion ["Inversion"]
        inversion_details
    end

    base_problem --> inversion;
    inversion_options --> inversion;

    classDef cls_base_problem fill: oldlace, stroke-width: 0;
    classDef cls_inversion_options fill: oldlace, stroke-width: 0;
    classDef cls_inversion fill: lavender, stroke-width: 0;
    classDef cls_code_block fill: lightgrey, stroke-width: 0, text-align: left;

    class base_problem cls_base_problem;
    class inversion_options cls_inversion_options;
    class inversion cls_inversion;

CoFI API has flexible ways of defining an inversion problem. For instance:

import cofi

inv_problem = cofi.BaseProblem()
inv_problem.set_objective(my_objective_func)
inv_problem.set_initial_model(my_starting_point)

Once a problem is defined, cofi can tell you what inference tools you can use based on what level of information you've provided:

inv_problem.suggest_tools()   # a tree will be printed

Run an inversion with these lines:

inv_options = cofi.InversionOptions()
inv_options.set_tool("torch.optim")
inv_options.set_params(options={"num_iterations": 50, "algorithm": "Adam"})

inv = cofi.Inversion(inv_problem, inv_options)
result = inv.run()
print(result.success)
print(result.model)

And now an inversion is completed! Check out our example gallery and tutorial pages for more real-world or advanced use cases.

Contributing

Interested in contributing? Please check out our contributor's guide.

Licence

This project is distributed under a 2-clause BSD licence. A copy of this licence is provided with distributions of the software.