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