from shinka.edit import apply_diff_patch
patch_str_1 = """
<<<<<<< SEARCH
import numpy as np
def construct_packing():
=======
import numpy as np
# Optional LP solver for radii (used if SciPy is available)
try:
from scipy.optimize import linprog
except Exception:
linprog = None
def construct_packing():
>>>>>>> REPLACE
dist_matrix_precompute_for_radii
Speed up the radii computation by precomputing the pairwise distance matrix once and reusing it in both the LP (when available) and the fallback loop. This reduces repeated distance calculations (norms) for the same center pairs and improves runtime reliability without changing the outcome for a fixed set of centers.
<<<<<<< SEARCH
# Compute maximum valid radii for this configuration
radii = compute_max_radii(centers)
return centers, radii
=======
# Compute maximum valid radii for this configuration
radii = compute_max_radii(centers)
return centers, radii
>>>>>>> REPLACE
"""
patch_str_2 = '''
<<<<<<< SEARCH
def compute_max_radii(centers):
"""
Compute the maximum possible radii for each circle position
such that they don't overlap and stay within the unit square.
Args:
centers: np.array of shape (n, 2) with (x, y) coordinates
Returns:
np.array of shape (n) with radius of each circle
"""
n = centers.shape[0]
radii = np.ones(n)
# First, limit by distance to square borders
for i in range(n):
x, y = centers[i]
# Distance to borders
radii[i] = min(x, y, 1 - x, 1 - y)
# Then, limit by distance to other circles
# Each pair of circles with centers at distance d can have
# sum of radii at most d to avoid overlap
for i in range(n):
for j in range(i + 1, n):
dist = np.sqrt(np.sum((centers[i] - centers[j]) ** 2))
# If current radii would cause overlap
if radii[i] + radii[j] > dist:
# Scale both radii proportionally
scale = dist / (radii[i] + radii[j])
radii[i] *= scale
radii[j] *= scale
return radii
=======
def compute_max_radii(centers, tol=1e-9, max_iter=1000):
"""
Compute the maximum possible radii for each circle position
such that they don't overlap and stay within the unit square.
Args:
centers: np.array of shape (n, 2)
Returns:
np.array of shape (n,) with radius of each circle
"""
n = centers.shape[0]
# Precompute pairwise distances
dists = np.linalg.norm(centers[:, None, :] - centers[None, :, :], axis=2)
# Boundary distance constraints
border_dist = np.minimum.reduce([centers[:, 0], centers[:, 1], 1 - centers[:, 0], 1 - centers[:, 1]])
# Initial guess for radii (some slack inside borders)
x0 = np.clip(border_dist * 0.9, 0.0, border_dist)
radii = None
# Try to solve a global max-sum-radii problem using SciPy (SLSQP)
try:
from scipy.optimize import minimize
bounds = [(0.0, bd) for bd in border_dist]
def objective(r):
return -np.sum(r)
constraints = []
for i in range(n):
for j in range(i + 1, n):
d = dists[i, j]
constraints.append({'type': 'ineq',
'fun': lambda r, i=i, j=j, d=d: d - (r[i] + r[j])})
res = minimize(objective, x0, bounds=bounds, constraints=constraints,
method='SLSQP', options={'ftol': 1e-9, 'maxiter': max_iter})
if res.success:
radii = np.clip(res.x, 0.0, border_dist)
except Exception:
radii = None
if radii is not None:
return radii
# Fallback simple relaxation if SciPy not available or failed
radii = np.ones(n)
for i in range(n):
x, y = centers[i]
radii[i] = min(x, y, 1 - x, 1 - y)
for i in range(n):
for j in range(i + 1, n):
dist = np.linalg.norm(centers[i] - centers[j])
if radii[i] + radii[j] > dist:
scale = dist / (radii[i] + radii[j])
radii[i] *= scale
radii[j] *= scale
return radii
>>>>>>> REPLACE
'''
def test_edit():
result = apply_diff_patch(
original_path="tests/circle.py",
patch_str=patch_str_1,
patch_dir=None,
)
updated_str, num_applied, output_path, error, patch_txt, diff_path = result
print(error)
assert num_applied == 2
assert output_path is None
assert error is None
def test_edit_2():
result = apply_diff_patch(
original_path="tests/circle.py",
patch_str=patch_str_2,
patch_dir=None,
)
updated_str, num_applied, output_path, error, patch_txt, diff_path = result
print(error)
assert num_applied == 1
assert output_path is None
assert error is None