Skip to content

Commit

Permalink
Enforce the usage of new style cost functionals
Browse files Browse the repository at this point in the history
  • Loading branch information
sblauth committed Nov 10, 2022
1 parent fb86934 commit 14422b8
Show file tree
Hide file tree
Showing 28 changed files with 154 additions and 115 deletions.
19 changes: 6 additions & 13 deletions cashocs/_constraints/constrained_problems.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,7 @@ def __init__(
List[List[fenics.DirichletBC]], List[fenics.DirichletBC], fenics.DirichletBC
],
cost_functional_form: Union[
List[_typing.CostFunctional],
_typing.CostFunctional,
List[ufl.Form],
ufl.Form,
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[fenics.Function, List[fenics.Function]],
adjoints: Union[fenics.Function, List[fenics.Function]],
Expand Down Expand Up @@ -122,7 +119,9 @@ def __init__(
self._pre_hook = _hook
self._post_hook = _hook

self.cost_functional_form_initial = _utils.enlist(cost_functional_form)
self.cost_functional_form_initial: List[_typing.CostFunctional] = _utils.enlist(
cost_functional_form
)
self.constraint_list: List[_typing.Constraint] = _utils.enlist(constraint_list)

self.constraint_dim = len(self.constraint_list)
Expand Down Expand Up @@ -267,10 +266,7 @@ def __init__(
fenics.DirichletBC, List[fenics.DirichletBC], List[List[fenics.DirichletBC]]
],
cost_functional_form: Union[
List[_typing.CostFunctional],
_typing.CostFunctional,
List[ufl.Form],
ufl.Form,
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[fenics.Function, List[fenics.Function]],
controls: Union[fenics.Function, List[fenics.Function]],
Expand Down Expand Up @@ -438,10 +434,7 @@ def __init__(
None,
],
cost_functional_form: Union[
List[_typing.CostFunctional],
_typing.CostFunctional,
List[ufl.Form],
ufl.Form,
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[fenics.Function, List[fenics.Function]],
adjoints: Union[fenics.Function, List[fenics.Function]],
Expand Down
2 changes: 2 additions & 0 deletions cashocs/_constraints/solvers.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from cashocs._optimization import cost_functional

if TYPE_CHECKING:
from cashocs import _typing
from cashocs._constraints import constrained_problems


Expand Down Expand Up @@ -175,6 +176,7 @@ def __init__(
self.A_tensors = [fenics.PETScMatrix() for _ in range(self.constraint_dim)]
self.b_tensors = [fenics.PETScVector() for _ in range(self.constraint_dim)]
self.solver_name = "Augmented Lagrangian"
self.inner_cost_functional_form: List[_typing.CostFunctional] = []

def _project_pointwise_multiplier(
self,
Expand Down
10 changes: 2 additions & 8 deletions cashocs/_optimization/optimal_control/optimal_control_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,7 @@ def __new__(
List[List[fenics.DirichletBC]], List[fenics.DirichletBC], fenics.DirichletBC
],
cost_functional_form: Union[
List[_typing.CostFunctional],
_typing.CostFunctional,
List[ufl.Form],
ufl.Form,
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[List[fenics.Function], fenics.Function],
controls: Union[List[fenics.Function], fenics.Function],
Expand Down Expand Up @@ -175,10 +172,7 @@ def __init__(
List[List[fenics.DirichletBC]], List[fenics.DirichletBC], fenics.DirichletBC
],
cost_functional_form: Union[
List[_typing.CostFunctional],
_typing.CostFunctional,
List[ufl.Form],
ufl.Form,
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[List[fenics.Function], fenics.Function],
controls: Union[List[fenics.Function], fenics.Function],
Expand Down
22 changes: 11 additions & 11 deletions cashocs/_optimization/optimization_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,7 @@ def __init__(
List[List[fenics.DirichletBC]], List[fenics.DirichletBC], fenics.DirichletBC
],
cost_functional_form: Union[
List[_typing.CostFunctional],
_typing.CostFunctional,
List[ufl.Form],
ufl.Form,
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[List[fenics.Function], fenics.Function],
adjoints: Union[List[fenics.Function], fenics.Function],
Expand Down Expand Up @@ -216,11 +213,7 @@ def _parse_cost_functional_form(
self.input_cost_functional_list = _utils.enlist(cost_functional_form)
self.cost_functional_list = []
for functional in self.input_cost_functional_list:
if isinstance(functional, ufl.Form):
self.cost_functional_list.append(
cost_functional.IntegralFunctional(functional)
)
elif isinstance(
if isinstance(
functional,
(
cost_functional.IntegralFunctional,
Expand All @@ -229,6 +222,15 @@ def _parse_cost_functional_form(
),
):
self.cost_functional_list.append(functional)
else:
raise _exceptions.InputError(
"cashocs.OptimizationProblem",
"cost_functional_list",
"You have supplied a wrong cost functional.\n"
"Starting with cashocs v2.0 only a list of "
"cashocs.IntegralFunctional, cashocs.ScalarTrackingFunctional, "
"or cashocs.MinMaxFunctional is allowed.",
)

def _parse_optional_inputs(
self,
Expand Down Expand Up @@ -563,5 +565,3 @@ def _scale_cost_functional(self) -> None:
self.desired_weights[i] / self.initial_function_values[i]
)
functional.scale(scaling_factor)
if isinstance(functional, cost_functional.IntegralFunctional):
self.input_cost_functional_list[i] = functional.form
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,7 @@ def __new__(
fenics.DirichletBC,
],
cost_functional_form: Union[
List[_typing.CostFunctional],
_typing.CostFunctional,
List[ufl.Form],
ufl.Form,
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[List[fenics.Function], fenics.Function],
adjoints: Union[List[fenics.Function], fenics.Function],
Expand Down Expand Up @@ -193,10 +190,7 @@ def __init__(
fenics.DirichletBC,
],
cost_functional_form: Union[
List[_typing.CostFunctional],
_typing.CostFunctional,
List[ufl.Form],
ufl.Form,
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[List[fenics.Function], fenics.Function],
adjoints: Union[List[fenics.Function], fenics.Function],
Expand Down
8 changes: 6 additions & 2 deletions cashocs/space_mapping/optimal_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ def __init__(
bcs_list: Union[
fenics.DirichletBC, List[fenics.DirichletBC], List[List[fenics.DirichletBC]]
],
cost_functional_form: Union[List[ufl.Form], ufl.Form],
cost_functional_form: Union[
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[List[fenics.Function], fenics.Function],
controls: Union[List[fenics.Function], fenics.Function],
adjoints: Union[List[fenics.Function], fenics.Function],
Expand Down Expand Up @@ -160,7 +162,9 @@ class ParameterExtraction:
def __init__(
self,
coarse_model: CoarseModel,
cost_functional_form: Union[List[ufl.Form], ufl.Form],
cost_functional_form: Union[
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[List[fenics.Function], fenics.Function],
controls: Union[List[fenics.Function], fenics.Function],
config: Optional[io.Config] = None,
Expand Down
8 changes: 6 additions & 2 deletions cashocs/space_mapping/shape_optimization.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,9 @@ def __init__(
List[List[fenics.DirichletBC]],
None,
],
cost_functional_form: Union[ufl.Form, List[ufl.Form]],
cost_functional_form: Union[
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[fenics.Function, List[fenics.Function]],
adjoints: Union[fenics.Function, List[fenics.Function]],
boundaries: fenics.MeshFunction,
Expand Down Expand Up @@ -169,7 +171,9 @@ class ParameterExtraction:
def __init__(
self,
coarse_model: CoarseModel,
cost_functional_form: Union[ufl.Form, List[ufl.Form]],
cost_functional_form: Union[
List[_typing.CostFunctional], _typing.CostFunctional
],
states: Union[fenics.Function, List[fenics.Function]],
config: Optional[io.Config] = None,
desired_weights: Optional[List[float]] = None,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@

y_d = Expression("sin(2*pi*x[0])*sin(2*pi*x[1])", degree=1)
alpha = 1e-6
J = Constant(0.5) * (y - y_d) * (y - y_d) * dx + Constant(0.5 * alpha) * u * u * dx
J = cashocs.IntegralFunctional(
Constant(0.5) * (y - y_d) * (y - y_d) * dx + Constant(0.5 * alpha) * u * u * dx
)

ocp = cashocs.OptimalControlProblem(e, bcs, J, y, u, p, config)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
e = inner(grad(u), grad(p)) * dx - f * p * dx
bcs = DirichletBC(V, Constant(0), boundaries, 1)

J = u * dx
J = cashocs.IntegralFunctional(u * dx)

sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,9 @@
lambd = 1e-6
y_d = Expression("sin(2*pi*x[0])*sin(2*pi*x[1])", degree=1)

J = Constant(0.5) * (y - y_d) * (y - y_d) * dx + Constant(0.5 * lambd) * u * u * dx
J = cashocs.IntegralFunctional(
Constant(0.5) * (y - y_d) * (y - y_d) * dx + Constant(0.5 * lambd) * u * u * dx
)

optimization_problem = cashocs.OptimalControlProblem(e, bcs, J, y, u, p, config)
optimization_problem.solve()
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
)

# set up the cost functional
J = Constant(1 / Re) * inner(grad(u), grad(u)) * dx
J = cashocs.IntegralFunctional(Constant(1 / Re) * inner(grad(u), grad(u)) * dx)

# define the optimization problem and solve it
optimization_problem = cashocs.ShapeOptimizationProblem(
Expand Down
2 changes: 1 addition & 1 deletion tests/remeshing_script.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
e = inner(grad(u), grad(p)) * dx - f * p * dx
bcs = DirichletBC(V, Constant(0), boundaries, 1)

J = u * dx
J = cashocs.IntegralFunctional(u * dx)

sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)
sop.solve(max_iter=8)
4 changes: 3 additions & 1 deletion tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@

y_d = Expression("sin(2*pi*x[0])*sin(2*pi*x[1])", degree=1, domain=mesh)
alpha = 1e-6
J = Constant(0.5) * (y - y_d) * (y - y_d) * dx + Constant(0.5 * alpha) * u * u * dx
J = cashocs.IntegralFunctional(
Constant(0.5) * (y - y_d) * (y - y_d) * dx + Constant(0.5 * alpha) * u * u * dx
)

ksp_options = [
["ksp_type", "cg"],
Expand Down
12 changes: 6 additions & 6 deletions tests/test_control_constraints.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
F = dot(grad(y), grad(p)) * dx - u * p * dx
bcs = cashocs.create_dirichlet_bcs(V, Constant(0.0), boundaries, [1, 2, 3, 4])

J = pow(u - 0.5, 2) * dx
J = cashocs.IntegralFunctional(pow(u - 0.5, 2) * dx)


def test_int_eq_constraint():
Expand Down Expand Up @@ -207,7 +207,7 @@ def test_pw_eq_constraints_only():
def test_int_ineq_constraints_only():
u.vector().vec().set(0.0)
u.vector().apply("")
J = pow(y - Constant(1.0), 2) * dx
J = cashocs.IntegralFunctional(pow(y - Constant(1.0), 2) * dx)
cfg = cashocs.load_config(dir_path + "/config_ocp.ini")
constraint = cashocs.InequalityConstraint(y * y * dx, upper_bound=0.5)
problem = cashocs.ConstrainedOptimalControlProblem(
Expand All @@ -226,7 +226,7 @@ def test_int_ineq_constraints_only():

u.vector().vec().set(0.0)
u.vector().apply("")
J = pow(y - Constant(0.1), 2) * dx
J = cashocs.IntegralFunctional(pow(y - Constant(0.1), 2) * dx)
cfg = cashocs.load_config(dir_path + "/config_ocp.ini")
constraint = cashocs.InequalityConstraint(y * y * dx, lower_bound=0.5)
problem = cashocs.ConstrainedOptimalControlProblem(
Expand All @@ -244,7 +244,7 @@ def test_int_ineq_constraints_only():
def test_pw_ineq_constraints_only():
u.vector().vec().set(0.0)
u.vector().apply("")
J = pow(y - Constant(1.0), 2) * dx
J = cashocs.IntegralFunctional(pow(y - Constant(1.0), 2) * dx)
cfg = cashocs.load_config(dir_path + "/config_ocp.ini")
cfg.set("OptimizationRoutine", "maximum_iterations", "500")
constraint = cashocs.InequalityConstraint(y, upper_bound=0.5, measure=dx)
Expand All @@ -264,7 +264,7 @@ def test_pw_ineq_constraints_only():

u.vector().vec().set(0.0)
u.vector().apply("")
J = pow(y - Constant(-1), 2) * dx
J = cashocs.IntegralFunctional(pow(y - Constant(-1), 2) * dx)
cfg = cashocs.load_config(dir_path + "/config_ocp.ini")
cfg.set("OptimizationRoutine", "maximum_iterations", "500")
constraint = cashocs.InequalityConstraint(y, lower_bound=-0.5, measure=dx)
Expand All @@ -285,7 +285,7 @@ def test_pw_ineq_constraints_only():
lin_expr = Expression("2*(x[0] - 0.5)", degree=1)
u.vector().vec().set(0.0)
u.vector().apply("")
J = pow(y - lin_expr, 2) * dx
J = cashocs.IntegralFunctional(pow(y - lin_expr, 2) * dx)
cfg = cashocs.load_config(dir_path + "/config_ocp.ini")
cfg.set("OptimizationRoutine", "maximum_iterations", "500")
constraint = cashocs.InequalityConstraint(
Expand Down
4 changes: 3 additions & 1 deletion tests/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@

y_d = Expression("sin(2*pi*x[0])*sin(2*pi*x[1])", degree=1, domain=mesh)
alpha = 1e-6
J = Constant(0.5) * (y - y_d) * (y - y_d) * dx + Constant(0.5 * alpha) * u * u * dx
J = cashocs.IntegralFunctional(
Constant(0.5) * (y - y_d) * (y - y_d) * dx + Constant(0.5 * alpha) * u * u * dx
)

ksp_options = [
["ksp_type", "cg"],
Expand Down
Loading

0 comments on commit 14422b8

Please sign in to comment.