Source code for copul.family.archimedean.nelsen20

import logging

import numpy as np
import sympy

from copul.family.archimedean.biv_archimedean_copula import BivArchimedeanCopula
from copul.family.archimedean.heavy_compute_arch import HeavyComputeArch
from copul.family.frechet.biv_independence_copula import BivIndependenceCopula
from copul.wrapper.cd2_wrapper import CD2Wrapper

log = logging.getLogger(__name__)


[docs] class Nelsen20(HeavyComputeArch): ac = BivArchimedeanCopula theta = sympy.symbols("theta", nonnegative=True) theta_interval = sympy.Interval(0, np.inf, left_open=False, right_open=True) special_cases = {0: BivIndependenceCopula} @property def is_absolutely_continuous(self) -> bool: return True @property def _raw_generator(self): return sympy.exp(self.t ** (-self.theta)) - sympy.exp(1) @property def _raw_inv_generator(self): return sympy.log(self.y + sympy.E) ** (-1 / self.theta) @property def _cdf_expr(self): return sympy.log( sympy.exp(self.u ** (-self.theta)) + sympy.exp(self.v ** (-self.theta)) - np.e ) ** (-1 / self.theta)
[docs] def cond_distr_2(self, u=None, v=None): theta = self.theta cond_distr = 1 / ( self.v ** (theta + 1) * ( sympy.exp(self.u ** (-theta) - self.v ** (-theta)) + 1 - np.e * sympy.exp(-(self.v ** (-theta))) ) * sympy.log( sympy.exp(self.u ** (-theta)) + sympy.exp(self.v ** (-theta)) - np.e ) ** ((theta + 1) / theta) ) return CD2Wrapper(cond_distr)(u, v)