87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
import torch
|
|
import pytest
|
|
from pina.problem.zoo import Poisson2DSquareProblem as Poisson
|
|
from pina import LabelTensor
|
|
from pina.domain import Union
|
|
from pina.domain import CartesianDomain
|
|
|
|
|
|
def test_discretise_domain():
|
|
n = 10
|
|
poisson_problem = Poisson()
|
|
boundaries = ["g1", "g2", "g3", "g4"]
|
|
poisson_problem.discretise_domain(n, "grid", domains=boundaries)
|
|
for b in boundaries:
|
|
assert poisson_problem.discretised_domains[b].shape[0] == n
|
|
poisson_problem.discretise_domain(n, "random", domains=boundaries)
|
|
for b in boundaries:
|
|
assert poisson_problem.discretised_domains[b].shape[0] == n
|
|
|
|
poisson_problem.discretise_domain(n, "grid", domains=["D"])
|
|
assert poisson_problem.discretised_domains["D"].shape[0] == n**2
|
|
poisson_problem.discretise_domain(n, "random", domains=["D"])
|
|
assert poisson_problem.discretised_domains["D"].shape[0] == n
|
|
|
|
poisson_problem.discretise_domain(n, "latin", domains=["D"])
|
|
assert poisson_problem.discretised_domains["D"].shape[0] == n
|
|
|
|
poisson_problem.discretise_domain(n, "lh", domains=["D"])
|
|
assert poisson_problem.discretised_domains["D"].shape[0] == n
|
|
|
|
poisson_problem.discretise_domain(n)
|
|
|
|
|
|
def test_variables_correct_order_sampling():
|
|
n = 10
|
|
poisson_problem = Poisson()
|
|
poisson_problem.discretise_domain(n, "grid", domains=["D"])
|
|
assert poisson_problem.discretised_domains["D"].labels == sorted(
|
|
poisson_problem.input_variables
|
|
)
|
|
|
|
poisson_problem.discretise_domain(n, "grid", domains=["D"])
|
|
assert poisson_problem.discretised_domains["D"].labels == sorted(
|
|
poisson_problem.input_variables
|
|
)
|
|
|
|
|
|
def test_add_points():
|
|
poisson_problem = Poisson()
|
|
poisson_problem.discretise_domain(0, "random", domains=["D"])
|
|
new_pts = LabelTensor(torch.tensor([[0.5, -0.5]]), labels=["x", "y"])
|
|
poisson_problem.add_points({"D": new_pts})
|
|
assert torch.isclose(
|
|
poisson_problem.discretised_domains["D"].extract("x"),
|
|
new_pts.extract("x"),
|
|
)
|
|
assert torch.isclose(
|
|
poisson_problem.discretised_domains["D"].extract("y"),
|
|
new_pts.extract("y"),
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize("mode", ["random", "grid"])
|
|
def test_custom_sampling_logic(mode):
|
|
poisson_problem = Poisson()
|
|
sampling_rules = {
|
|
"x": {"n": 100, "mode": mode},
|
|
"y": {"n": 50, "mode": mode},
|
|
}
|
|
poisson_problem.discretise_domain(sample_rules=sampling_rules)
|
|
for domain in ["g1", "g2", "g3", "g4"]:
|
|
assert poisson_problem.discretised_domains[domain].shape[0] == 100 * 50
|
|
assert poisson_problem.discretised_domains[domain].labels == ["x", "y"]
|
|
|
|
|
|
@pytest.mark.parametrize("mode", ["random", "grid"])
|
|
def test_wrong_custom_sampling_logic(mode):
|
|
d2 = CartesianDomain({"x": [1, 2], "y": [0, 1]})
|
|
poisson_problem = Poisson()
|
|
poisson_problem.domains["D"] = Union([poisson_problem.domains["D"], d2])
|
|
sampling_rules = {
|
|
"x": {"n": 100, "mode": mode},
|
|
"y": {"n": 50, "mode": mode},
|
|
}
|
|
with pytest.raises(RuntimeError):
|
|
poisson_problem.discretise_domain(sample_rules=sampling_rules)
|