Skip to content

Commit 414e5af

Browse files
committed
feat(families): added logpdf-characteristicks for builtins and tests for them
1 parent 5f01953 commit 414e5af

7 files changed

Lines changed: 111 additions & 2 deletions

File tree

src/pysatl_core/families/builtins/continuous/exponential.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,28 @@ def char_func(parameters: Parametrization, t: NumericArray) -> ComplexArray:
162162
)
163163
return cast(ComplexArray, result)
164164

165+
def lpdf(parameters: Parametrization, x: NumericArray) -> NumericArray:
166+
"""
167+
Logarithm of the probability density function for exponential distribution.
168+
169+
Parameters
170+
----------
171+
parameters : Parametrization
172+
Distribution parameters object with field:
173+
- lambda_: float (rate parameter)
174+
x : NumericArray
175+
Points at which to evaluate the log-probability density function
176+
177+
Returns
178+
-------
179+
NumericArray
180+
Log-probability density values at points x.
181+
For x < 0 returns -np.inf.
182+
"""
183+
parameters = cast(_Rate, parameters)
184+
lambda_ = parameters.lambda_
185+
return np.where(x >= 0, np.log(lambda_) - lambda_ * x, -np.inf)
186+
165187
def mean_func(parameters: Parametrization) -> float:
166188
"""Mean of exponential distribution."""
167189
parameters = cast(_Rate, parameters)
@@ -210,6 +232,7 @@ def _support(_: Parametrization) -> ContinuousSupport:
210232
CharacteristicName.CDF: cdf,
211233
CharacteristicName.PPF: ppf,
212234
CharacteristicName.CF: char_func,
235+
CharacteristicName.LPDF: lpdf,
213236
CharacteristicName.MEAN: mean_func,
214237
CharacteristicName.VAR: var_func,
215238
CharacteristicName.SKEW: skew_func,

src/pysatl_core/families/builtins/continuous/normal.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,34 @@ def char_func(parameters: Parametrization, t: NumericArray) -> ComplexArray:
165165
mu = parameters.mu
166166
return cast(ComplexArray, np.exp(1j * mu * t - 0.5 * (sigma**2) * (t**2)))
167167

168+
def lpdf(parameters: Parametrization, x: NumericArray) -> NumericArray:
169+
"""
170+
Logarithm of the probability density function for normal distribution.
171+
172+
Parameters
173+
----------
174+
parameters : Parametrization
175+
Distribution parameters object with fields:
176+
- mu: float (mean)
177+
- sigma: float (standard deviation)
178+
x : NumericArray
179+
Points at which to evaluate the log-probability density function
180+
181+
Returns
182+
-------
183+
NumericArray
184+
Log-probability density values at points x
185+
"""
186+
parameters = cast(_MeanStd, parameters)
187+
sigma = parameters.sigma
188+
mu = parameters.mu
189+
190+
# log pdf = -0.5*log(2π) - log(σ) - (x-μ)²/(2σ²)
191+
return cast(
192+
NumericArray,
193+
-0.5 * np.log(2 * np.pi) - np.log(sigma) - ((x - mu) ** 2) / (2 * sigma**2),
194+
)
195+
168196
def mean_func(parameters: Parametrization) -> float:
169197
"""Mean of normal distribution."""
170198
parameters = cast(_MeanStd, parameters)
@@ -213,6 +241,7 @@ def _support(_: Parametrization) -> ContinuousSupport:
213241
CharacteristicName.CDF: cdf,
214242
CharacteristicName.PPF: ppf,
215243
CharacteristicName.CF: char_func,
244+
CharacteristicName.LPDF: lpdf,
216245
CharacteristicName.MEAN: mean_func,
217246
CharacteristicName.VAR: var_func,
218247
CharacteristicName.SKEW: skew_func,

src/pysatl_core/families/builtins/continuous/uniform.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,30 @@ def char_func(parameters: Parametrization, t: NumericArray) -> ComplexArray:
188188

189189
return cast(ComplexArray, sinc_val * np.exp(1j * center * t_arr))
190190

191+
def lpdf(parameters: Parametrization, x: NumericArray) -> NumericArray:
192+
"""
193+
Logarithm of the probability density function for uniform distribution.
194+
195+
Parameters
196+
----------
197+
parameters : Parametrization
198+
Distribution parameters object with fields:
199+
- lower_bound: float (lower bound)
200+
- upper_bound: float (upper bound)
201+
x : NumericArray
202+
Points at which to evaluate the log-probability density function
203+
204+
Returns
205+
-------
206+
NumericArray
207+
Log-probability density values at points x
208+
For x outside [lower_bound, upper_bound] returns -np.inf
209+
"""
210+
parameters = cast(_Standard, parameters)
211+
a = parameters.lower_bound
212+
b = parameters.upper_bound
213+
return np.where((x >= a) & (x <= b), -np.log(b - a), -np.inf)
214+
191215
def mean_func(parameters: Parametrization) -> float:
192216
"""Mean of uniform distribution."""
193217
parameters = cast(_Standard, parameters)
@@ -245,6 +269,7 @@ def _support(parameters: Parametrization) -> ContinuousSupport:
245269
CharacteristicName.CDF: cdf,
246270
CharacteristicName.PPF: ppf,
247271
CharacteristicName.CF: char_func,
272+
CharacteristicName.LPDF: lpdf,
248273
CharacteristicName.MEAN: mean_func,
249274
CharacteristicName.VAR: var_func,
250275
CharacteristicName.SKEW: skew_func,

src/pysatl_core/types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ class CharacteristicName(StrEnum):
285285
CDF = "cdf"
286286
PPF = "ppf"
287287
PMF = "pmf"
288+
LPDF = "lpdf" # unimplemented in graph yet
288289
CF = "cf" # unimplemented in graph yet
289290
SF = "sf" # unimplemented in graph yet
290291
MEAN = "mean" # unimplemented in graph yet

tests/unit/families/builtins/continuous/test_exponential.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ def test_analytical_computations_availability(self):
121121
CharacteristicName.CDF,
122122
CharacteristicName.PPF,
123123
CharacteristicName.CF,
124+
CharacteristicName.LPDF,
124125
CharacteristicName.MEAN,
125126
CharacteristicName.VAR,
126127
CharacteristicName.SKEW,
@@ -131,14 +132,30 @@ def test_analytical_computations_availability(self):
131132
@pytest.mark.parametrize(
132133
"char_name, test_data, scipy_func, scipy_kwargs",
133134
[
134-
(CharacteristicName.PDF, [-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], expon.pdf, {"scale": 2.0}),
135-
(CharacteristicName.CDF, [-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], expon.cdf, {"scale": 2.0}),
135+
(
136+
CharacteristicName.PDF,
137+
[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
138+
expon.pdf,
139+
{"scale": 2.0},
140+
),
141+
(
142+
CharacteristicName.CDF,
143+
[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
144+
expon.cdf,
145+
{"scale": 2.0},
146+
),
136147
(
137148
CharacteristicName.PPF,
138149
[0.001, 0.01, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99, 0.999],
139150
expon.ppf,
140151
{"scale": 2.0},
141152
),
153+
(
154+
CharacteristicName.LPDF,
155+
[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
156+
expon.logpdf,
157+
{"scale": 2.0},
158+
),
142159
],
143160
)
144161
def test_array_input_for_characteristics(self, char_name, test_data, scipy_func, scipy_kwargs):

tests/unit/families/builtins/continuous/test_normal.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ def test_analytical_computations_availability(self):
149149
CharacteristicName.CDF,
150150
CharacteristicName.PPF,
151151
CharacteristicName.CF,
152+
CharacteristicName.LPDF,
152153
CharacteristicName.MEAN,
153154
CharacteristicName.VAR,
154155
CharacteristicName.SKEW,
@@ -177,6 +178,12 @@ def test_analytical_computations_availability(self):
177178
norm.ppf,
178179
{"loc": 2.0, "scale": 1.5},
179180
),
181+
(
182+
CharacteristicName.LPDF,
183+
[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
184+
norm.logpdf,
185+
{"loc": 2.0, "scale": 1.5},
186+
),
180187
],
181188
)
182189
def test_array_input_for_characteristics(self, char_name, test_data, scipy_func, scipy_kwargs):

tests/unit/families/builtins/continuous/test_uniform.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ def test_analytical_computations_availability(self):
148148
CharacteristicName.CDF,
149149
CharacteristicName.PPF,
150150
CharacteristicName.CF,
151+
CharacteristicName.LPDF,
151152
CharacteristicName.MEAN,
152153
CharacteristicName.VAR,
153154
CharacteristicName.SKEW,
@@ -176,6 +177,12 @@ def test_analytical_computations_availability(self):
176177
uniform.ppf,
177178
{"loc": 2.0, "scale": 3.0},
178179
),
180+
(
181+
CharacteristicName.LPDF,
182+
[1.0, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0],
183+
uniform.logpdf,
184+
{"loc": 2.0, "scale": 3.0},
185+
),
179186
],
180187
)
181188
def test_array_input_for_characteristics(self, char_name, test_data, scipy_func, scipy_kwargs):

0 commit comments

Comments
 (0)