From e2da5dfd64ddc9be2d700fd0a40cb40110495bd8 Mon Sep 17 00:00:00 2001 From: Thomas Schmelzer Date: Tue, 14 Jan 2025 13:00:51 +0400 Subject: [PATCH] solver with test-case --- src/cvx/ball/solver.py | 25 +++++++++++++++++++ .../.gitkeep => cvx/ball/utils/__init__.py} | 0 2 files changed, 25 insertions(+) create mode 100644 src/cvx/ball/solver.py rename src/{tests/resources/.gitkeep => cvx/ball/utils/__init__.py} (100%) diff --git a/src/cvx/ball/solver.py b/src/cvx/ball/solver.py new file mode 100644 index 0000000..06f7f27 --- /dev/null +++ b/src/cvx/ball/solver.py @@ -0,0 +1,25 @@ +import cvxpy as cp +import numpy as np + +from .utils.circle import Circle + + +def min_circle_cvx(points, **kwargs): + # Use con_1 if no constraint construction is defined + # cvxpy variable for the radius + r = cp.Variable(name="Radius") + # cvxpy variable for the midpoint + x = cp.Variable(points.shape[1], name="Midpoint") + objective = cp.Minimize(r) + constraints = [ + cp.SOC( + r * np.ones(points.shape[0]), + points - cp.outer(np.ones(points.shape[0]), x), + axis=1, + ) + ] + + problem = cp.Problem(objective=objective, constraints=constraints) + problem.solve(**kwargs) + + return Circle(radius=float(r.value), center=x.value) diff --git a/src/tests/resources/.gitkeep b/src/cvx/ball/utils/__init__.py similarity index 100% rename from src/tests/resources/.gitkeep rename to src/cvx/ball/utils/__init__.py