Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
23 changes: 23 additions & 0 deletions news/constraint-var.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
**Added:**

* No news added: Create new constraint variables in each solve to have clean setup.

**Changed:**

* <news item>

**Deprecated:**

* <news item>

**Removed:**

* <news item>

**Fixed:**

* <news item>

**Security:**

* <news item>
14 changes: 8 additions & 6 deletions src/diffpy/apps/parametric_refinement/refinement_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -537,9 +537,9 @@ def _solve(
for var_name, value in constraints[0].items():
if var_name not in recipe._parameters:
recipe.create_new_variable(var_name, value)
for constraint_name, constraint_eq_str in constraints[1].items():
constraint_var = self.get_variable(constraint_name)["obj"]
recipe.add_constraint(constraint_var, constraint_eq_str)
for constrained_name, constraint_eq_str in constraints[1].items():
constrained_var = self.get_variable(constrained_name)["obj"]
recipe.add_constraint(constrained_var, constraint_eq_str)

variables = [self.get_variable(name)["obj"] for name in variable_names]
variable_names = ["_".join(name.split(".")) for name in variable_names]
Expand All @@ -548,6 +548,8 @@ def _solve(
if var in recipe._parameters.values():
tag_manager.tag(var, "listed_var")
continue
if var.name in recipe._parameters:
recipe.delete_variable(recipe._parameters[var.name])
recipe.add_variable(var, name=variable_names[i], tag="listed_var")
for eq_or_var_name, arg_dict in bounds.items():
lb = arg_dict.get("lower_bound", -numpy.inf)
Expand Down Expand Up @@ -582,9 +584,9 @@ def _solve(
result_string = "Refinement Finished."

if constraints:
for constraint_name, constraint_eq_str in constraints[1].items():
constraint_var = self.get_variable(constraint_name)["obj"]
recipe.unconstrain(constraint_var)
for constrained_name, constraint_eq_str in constraints[1].items():
constrained_var = self.get_variable(constrained_name)["obj"]
recipe.remove_constraint(constrained_var)
return {
"success": bool(result.success),
"status": int(result.status),
Expand Down
79 changes: 79 additions & 0 deletions tests/test_refinement_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,85 @@ def test_refine_ni():
)


def test_constraints():
# C1: Mannly apply the constraints.
# Expect get the correct results and the contrsaints has no effect on
# the session.
session = RefinementSession()
session.add_profile_from_file(
profile_name="ni_profile", profile_path=str(_DATA_DIR / "Ni.gr")
)
session.set_profile_calculation_range(
profile_name="ni_profile",
xmin=1.5,
xmax=20,
dx=0.01,
)
session.update_profile_meta(
profile_name="ni_profile",
meta={"qmin": 0.1},
)
session.add_pdf_model(
model_name="pdf",
structure_file_path=str(_DATA_DIR / "Ni.cif"),
finite=False,
)
session.set_variables_value(
name_value_dict={
"pdf.phase.lattice.a": 3.52,
"pdf.scale": 0.4,
"pdf.phase.Ni0.Uiso": 0.005,
"pdf.delta2": 2,
"pdf.qdamp": 0.04,
"pdf.qbroad": 0.02,
"pdf.phase.lattice.alpha": 90,
"pdf.phase.lattice.beta": 90,
"pdf.phase.lattice.gamma": 90,
},
)
session.solve(
profile_names=["ni_profile"],
model_names=["pdf"],
constraints=[
{"lattice": None, "uiso": None},
{
"pdf.phase.lattice.a": "lattice",
"pdf.phase.lattice.b": "lattice",
"pdf.phase.lattice.c": "lattice",
"pdf.phase.Ni0.Uiso": "uiso",
"pdf.phase.Ni1.Uiso": "uiso",
"pdf.phase.Ni2.Uiso": "uiso",
"pdf.phase.Ni3.Uiso": "uiso",
},
],
variable_names=[
"lattice",
"pdf.scale",
"uiso",
"pdf.delta2",
"pdf.qdamp",
"pdf.qbroad",
],
)
name_to_cmi_name = {
"pdf.scale": "s0",
"pdf.phase.lattice.a": "G1_a",
"pdf.phase.Ni0.Uiso": "G1_Uiso_0",
"pdf.delta2": "G1_delta2",
"pdf.qdamp": "qdamp",
"pdf.qbroad": "qbroad",
}
ni_refined_parameters = run_ni_example()
for name, cmi_name in name_to_cmi_name.items():
assert numpy.isclose(
session.get_variable(name)["value"],
ni_refined_parameters[cmi_name],
rtol=1e-2,
)
recipe = list(session.recipes_dict.values())[0]
assert len(recipe._constraints) == 0


def test_refine_multi_contribution():
session = RefinementSession()
session.add_profile_from_file(
Expand Down
Loading