# Source code for openquake.hazardlib.mfd.base

```
# The Hazard Library
# Copyright (C) 2012-2023 GEM Foundation
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Module :mod:`openquake.hazardlib.mfd.base` defines base class for MFD --
:class:`BaseMFD`.
"""
import abc
[docs]class BaseMFD(metaclass=abc.ABCMeta):
"""
Abstract base class for Magnitude-Frequency Distribution function.
"""
#: The set of modification type names that are supported by an MFD.
#: Each modification should have a corresponding method named
#: ``modify_modificationname()`` where the actual modification
#: logic resides.
MODIFICATIONS = abc.abstractproperty()
[docs] def modify(self, modification, parameters):
"""
Apply a single modification to an MFD parameters.
Reflects the modification method and calls it passing ``parameters``
as keyword arguments. See also :attr:`MODIFICATIONS`.
Modifications can be applied one on top of another. The logic
of stacking modifications is up to a specific MFD implementation.
:param modification:
String name representing the type of modification.
:param parameters:
Dictionary of parameters needed for modification.
:raises ValueError:
If ``modification`` is missing from :attr:`MODIFICATIONS`.
"""
if modification not in self.MODIFICATIONS:
raise ValueError('Modification %s is not supported by %s' %
(modification, type(self).__name__))
meth = getattr(self, 'modify_%s' % modification)
meth(**parameters)
self.check_constraints()
[docs] @abc.abstractmethod
def check_constraints(self):
"""
Check MFD-specific constraints and raise :exc:`ValueError`
in case of violation.
This method must be implemented by subclasses.
"""
[docs] @abc.abstractmethod
def get_annual_occurrence_rates(self):
"""
Return an MFD annual occurrence rates histogram.
This method must be implemented by subclasses.
:return:
The list of tuples, each tuple containing a pair
``(magnitude, occurrence_rate)``. Each pair represents
a single bin of the histogram with ``magnitude`` being
the center of the bin. Magnitude values are monotonically
increasing by value of bin width. ``occurence_rate``
represents the number of events per year with magnitude
that falls in between bin's boundaries.
"""
[docs] @abc.abstractmethod
def get_min_max_mag(self):
"""
Return the minimum and maximum magnitudes this MFD is defined for.
This method must be implemented by subclasses.
:return:
Magnitude value, float number.
"""
def __repr__(self):
"""
Returns the name of the magnitude frequency distribution class
"""
return "<%s>" % self.__class__.__name__
```