Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FEAT: implement quantum problem set filter #287

Merged
merged 38 commits into from
Nov 6, 2024
Merged
Changes from 22 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
f190b2f
Added '*.swp' (temporary vim-files) to .gitignore
grayson-helmholz Jul 19, 2024
67b6747
Added test-skeleton for Issue#272
grayson-helmholz Jul 23, 2024
631f692
created QNP-setter and its test
grayson-helmholz Aug 6, 2024
c18d411
inlined fixture-arguments, function-renaming
grayson-helmholz Aug 6, 2024
5a997d0
iss272: faulty filters for QNProblemSet
grayson-helmholz Aug 8, 2024
ad5ea05
FIX: stabilize test fixture
redeboer Aug 8, 2024
6fbf83b
added pid&spin_projection -> non-zero results
grayson-helmholz Aug 21, 2024
557ec57
cleanup of test_solving.py
grayson-helmholz Aug 21, 2024
e54289e
changed tuple to set in test-case
grayson-helmholz Aug 22, 2024
b99bcdc
Merge branch 'main' into filter_quantum_numbers
grayson-helmholz Aug 26, 2024
99a594d
got the test_solving.py from old branch: remove_spin-proj[...]
grayson-helmholz Aug 27, 2024
559b2f4
moved Edge/NodeQuantumNumberTypes to quantum_numbers.py
grayson-helmholz Aug 27, 2024
2808ed7
domain-keys now have specific type
grayson-helmholz Aug 27, 2024
75e743c
Merge branch 'main' into filter_quantum_numbers
grayson-helmholz Oct 16, 2024
8332f09
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 16, 2024
a1287e8
Moved import of Iterable into TYPE_CHECKING-Block
grayson-helmholz Oct 16, 2024
ed844c4
added 'blank' qn's in conf.py
grayson-helmholz Oct 16, 2024
f48d0ed
changed qn's from obj to class
grayson-helmholz Oct 16, 2024
d1c0cc8
Merge branch 'main' into filter_quantum_numbers
grayson-helmholz Oct 18, 2024
a58b774
cleanup
grayson-helmholz Oct 18, 2024
da7ac25
Merge branch 'filter_quantum_numbers' of github.com:CompWA/qrules int…
grayson-helmholz Oct 18, 2024
b8cb284
using specific no. of soltuions in test_solving
grayson-helmholz Oct 21, 2024
6f8102d
moved problem-set-filter, added docstring
grayson-helmholz Oct 21, 2024
25c716e
example of filter-function in visualize-notebook
grayson-helmholz Oct 29, 2024
3102359
parametrized filter-test, added Rules and Edge/Node-Types to conf
grayson-helmholz Oct 29, 2024
fddd324
moved Rules and Edge/Node-Types in conf to target_substitutions
grayson-helmholz Oct 29, 2024
1ff13a1
reworked conf, added docstrings to Rules and Edge/NodeTypes
grayson-helmholz Oct 29, 2024
56bb188
Merge branch 'main' into filter_quantum_numbers
grayson-helmholz Oct 29, 2024
c941876
MAINT: sort `api_target_substitutions`
redeboer Oct 30, 2024
1231441
modified docstrings for cross-refs
grayson-helmholz Nov 5, 2024
0bb42cc
renamed arguments, added `dict_set_intersection`
grayson-helmholz Nov 5, 2024
1099cf5
changed type-hint, removed redundant variable
grayson-helmholz Nov 5, 2024
678c4fb
Merge remote-tracking branch 'origin/main' into filter_quantum_numbers
grayson-helmholz Nov 5, 2024
d735bbd
reverted version-changes and hidden-sources in notebooks
grayson-helmholz Nov 5, 2024
4bbcada
fixed bug in #301, new note in warning
grayson-helmholz Nov 5, 2024
1d22412
Merge branch 'filter_quantum_numbers' of github.com:CompWA/qrules int…
grayson-helmholz Nov 5, 2024
a0bef13
test_solving now asserts different no. of solutions
grayson-helmholz Nov 5, 2024
929bc48
fixed hitting assert twice
grayson-helmholz Nov 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 162 additions & 0 deletions tests/unit/test_solving.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
from __future__ import annotations

from typing import TYPE_CHECKING

import attrs
import pytest

import qrules.particle
import qrules.quantum_numbers
import qrules.system_control
import qrules.transition
from qrules.conservation_rules import (
GraphElementRule,
c_parity_conservation,
parity_conservation,
spin_magnitude_conservation,
spin_validity,
)
from qrules.quantum_numbers import (
EdgeQuantumNumbers,
EdgeQuantumNumberTypes,
NodeQuantumNumbers,
NodeQuantumNumberTypes,
)
from qrules.solving import CSPSolver, EdgeSettings, NodeSettings, QNProblemSet
from qrules.topology import MutableTransition

if TYPE_CHECKING:
from collections.abc import Iterable

from qrules.argument_handling import Rule


def test_solve(
all_particles: qrules.particle.ParticleCollection,
quantum_number_problem_set: QNProblemSet,
) -> None:
solver = CSPSolver(all_particles)
result = solver.find_solutions(quantum_number_problem_set)
assert len(result.solutions) == 19


def test_solve_with_filtered_quantum_number_problem_set(
all_particles: qrules.particle.ParticleCollection,
quantum_number_problem_set: QNProblemSet,
) -> None:
solver = CSPSolver(all_particles)
new_quantum_number_problem_set = filter_quantum_number_problem_set(
quantum_number_problem_set,
edge_rules={spin_validity},
node_rules={
spin_magnitude_conservation,
parity_conservation,
c_parity_conservation,
},
edge_properties_and_domains={
EdgeQuantumNumbers.pid, # had to be added for c_parity_conservation to work
EdgeQuantumNumbers.spin_magnitude,
# EdgeQuantumNumbers.spin_projection, # can be left out to reduce the number of solutions
EdgeQuantumNumbers.parity,
EdgeQuantumNumbers.c_parity,
},
node_properties_and_domains=(
NodeQuantumNumbers.l_magnitude,
NodeQuantumNumbers.s_magnitude,
),
)
result = solver.find_solutions(new_quantum_number_problem_set)

assert len(result.solutions) == 127


def filter_quantum_number_problem_set(
quantum_number_problem_set: QNProblemSet,
edge_rules: set[GraphElementRule],
node_rules: set[Rule],
edge_properties_and_domains: Iterable[EdgeQuantumNumberTypes],
node_properties_and_domains: Iterable[NodeQuantumNumberTypes],
) -> QNProblemSet:
old_edge_settings = quantum_number_problem_set.solving_settings.states
old_node_settings = quantum_number_problem_set.solving_settings.interactions
old_edge_properties = quantum_number_problem_set.initial_facts.states
old_node_properties = quantum_number_problem_set.initial_facts.interactions
new_edge_settings = {
edge_id: EdgeSettings(
conservation_rules=edge_rules,
rule_priorities=edge_setting.rule_priorities,
qn_domains=({
key: val
for key, val in edge_setting.qn_domains.items()
if key in set(edge_properties_and_domains)
}),
)
for edge_id, edge_setting in old_edge_settings.items()
}
new_node_settings = {
node_id: NodeSettings(
conservation_rules=node_rules,
rule_priorities=node_setting.rule_priorities,
qn_domains=({
key: val
for key, val in node_setting.qn_domains.items()
if key in set(node_properties_and_domains)
}),
)
for node_id, node_setting in old_node_settings.items()
}
new_combined_settings = MutableTransition(
topology=quantum_number_problem_set.solving_settings.topology,
states=new_edge_settings,
interactions=new_node_settings,
)
new_edge_properties = {
edge_id: {
edge_quantum_number: scalar
for edge_quantum_number, scalar in graph_edge_property_map.items()
if edge_quantum_number in edge_properties_and_domains
}
for edge_id, graph_edge_property_map in old_edge_properties.items()
}
new_node_properties = {
node_id: {
node_quantum_number: scalar
for node_quantum_number, scalar in graph_node_property_map.items()
if node_quantum_number in node_properties_and_domains
}
for node_id, graph_node_property_map in old_node_properties.items()
}
new_combined_properties = MutableTransition(
topology=quantum_number_problem_set.initial_facts.topology,
states=new_edge_properties,
interactions=new_node_properties,
)
return attrs.evolve(
quantum_number_problem_set,
solving_settings=new_combined_settings,
initial_facts=new_combined_properties,
)


@pytest.fixture(scope="session")
def all_particles():
return [
qrules.system_control.create_edge_properties(part)
for part in qrules.particle.load_pdg()
]


@pytest.fixture(scope="session")
def quantum_number_problem_set() -> QNProblemSet:
stm = qrules.StateTransitionManager(
initial_state=["psi(2S)"],
final_state=["gamma", "eta", "eta"],
formalism="helicity",
)
problem_sets = stm.create_problem_sets()
qn_problem_sets = [
p.to_qn_problem_set()
for strength in sorted(problem_sets)
for p in problem_sets[strength]
]
return qn_problem_sets[0]
Loading