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)