<jupyter_start><jupyter_text>К задаче https://ru.stackoverflow.com/questions/1259494/Найти-точку-сумма-расстояний-до-которой-от-заданного-набора-точек-минимальна<jupyter_code>import numpy as np
import scipy.optimize as spo
import matplotlib.pyplot as plt
from scipy.stats import norm
import random as rnd
import numba
_factor_norm = np.sqrt(2*np.pi)
def priceNormFn(x):
    return _factor_norm*norm.pdf(x)

def priceFn(x):
    v = x/2
    v2=v*v
    return 1.0 - v2/np.sqrt(1+v2*v2)
# Штраф для функции притяжения - потенциальная яма, обращающаяся в 0 на бесконечности
# На большом расстоянии уже пофиг, что там притягивает.
def attract(power, distance):
    return -power*priceFn(distance/(power+1.0))
# Штраф для отталкивания - постепенно убывает, обращается в ноль на бесконечности
def repell(power, distance):
    return power*priceFn(distance/(power+1.0))
fig, axs = plt.subplots(1,2)
fig.set_size_inches(11,3)
x = np.linspace(0,10,100)
axs[0].plot(x, attract(1, x))
axs[1].plot(x, repell(1, x))
class Point:
    def __init__(self, coords, attracting, repelling):
        self.coords = np.array(coords)
        self.attracting_power = attracting
        self.repelling_power = repelling
    def potential(self, v):
        dv = self.coords - np.atleast_1d(v)
        distance = np.linalg.norm(dv)
        attracting_penalty = attract(self.attracting_power, distance) if self.attracting_power > 0 else 0.0
        repelling_penalty = repell(self.repelling_power, distance) if self.repelling_power > 0 else 0.0
        return attracting_penalty + repelling_penalty
    def __repr__(self):
        return f"Point({tuple(self.coords)}, {self.attracting_power}, {self.repelling_power})"
supermarket = Point((0.0, 0.0), attracting=10, repelling=0.5)
X = np.linspace(-10,10,100)
plt.plot(X, [supermarket.potential((_x,0)) for _x in X])
str(supermarket)
factory = Point((10, 1), attracting=0, repelling=5)
X = np.linspace(0,10,100)
plt.plot(X, [factory.potential((_x,0)) for _x in X])
minishop = Point((10,1), attracting=3, repelling=0)
X = np.linspace(0,10,100)
plt.plot(X, [minishop.potential((_x,0)) for _x in X])
class Potential:
    def __init__(self, points):
        self.points = points
    
    @numba.jit(forceobj=True)
    def potential(self, v):
        resPot = 0.0
        for p in self.points:
            potential = p.potential(v) 
            resPot += potential
        return resPot
    def __call__(self, v):
        return self.potential(v)
fn = Potential((supermarket, minishop, factory))
X = np.linspace(0,10,100)
plt.plot(X, [fn.potential((_x,0)) for _x in X])
X = np.linspace(-5,15,100)
Y = np.linspace(-10,10,100)

def mklevel(fn, X,Y):
    return [ [ fn((x,y)) for x in X] for y in Y]

level = mklevel(fn, X,Y)
fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(121, projection='3d')
ax.plot_wireframe(*np.meshgrid(X,Y), np.atleast_2d(level))
ax.set_xlabel('x')
ax.set_ylabel('y')

ax2 = fig.add_subplot(122)
ax2.contour(X,Y, level)
plt.contour(X,Y, level)
v = spo.minimize(lambda v: fn(v), x0=(1,0), bounds=((-5, 15), (-10, 10)))
v
fn(factory.coords)
fn(supermarket.coords)
fn(minishop.coords)
fn([-9171.37744367,    21.19829761])<jupyter_output><empty_output><jupyter_text>Эксперимент со случайными точкамислучайным образом накидаем в квадрат 20 на 20 сто точек, половина притягивающих и половина отталкивающих. Сила притяжения и отталкивания выбирается случайным образом в интервале $[0,3)$<jupyter_code># N=100
# points=[]
# for _ in range(N):
#     x = rnd.random()*20 - 10
#     y = rnd.random()*20 - 10
#     if rnd.random() > 0.5:
#         attr = 3*rnd.random()
#         rep = 0
#     else:
#         rep = 3*rnd.random()
#         attr = 0
#     points.append(Point((x,y), attr, rep))
points = [Point((-8.30472715243922, 4.075380593226381), 2.4074552697664076, 0),
 Point((-0.21555044286747638, 8.57170171393157), 1.7156388412149295, 0),
 Point((2.164217601214558, 0.1976410306531271), 0.036041103934147056, 0),
 Point((-9.830180771112511, 5.360101141854546), 1.5377623588877296, 0),
 Point((-8.990155297806343, 8.871090085339493), 0, 0.7780968993341935),
 Point((-2.945198831232836, -0.5430559320770385), 0, 0.18157882703041206),
 Point((-2.3398322859233094, 1.6800476227817995), 0, 1.04852220611981),
 Point((-2.4022061207880903, -9.062139181099422), 1.960247271272065, 0),
 Point((1.1543988777224712, -0.5182021685848497), 2.776331665555672, 0),
 Point((5.047987156283327, 2.150389437705103), 0, 2.9378520054710187),
 Point((2.5865820364421523, 7.280923751715807), 0, 2.653304958553035),
 Point((-3.8876460147068563, -7.8719081551069685), 0, 1.8330551255551653),
 Point((8.019210812572926, -5.719917712004053), 0, 1.0599060380292102),
 Point((-4.685044402676926, 6.722702646317263), 1.3092819081318874, 0),
 Point((-5.831375251729602, -3.2052379675773857), 2.4337408862763117, 0),
 Point((9.816386693122052, 3.8889911828741504), 0, 1.360270344292402),
 Point((4.543733752184998, 5.868062789893436), 0, 0.1503114371014047),
 Point((9.981700953244339, -0.2959569810219129), 0.8336021769128561, 0),
 Point((-4.445940490334836, 3.2093343796203797), 0, 0.06303959479438925),
 Point((8.012287957860128, 8.433795213157541), 0, 0.9468268137243179),
 Point((-2.22423725999737, -1.7022651171892118), 0.7494480739766, 0),
 Point((-6.233500584983432, 5.5156463082570895), 2.952813946384336, 0),
 Point((-5.64437891845327, 1.4537190808413936), 0, 1.0689167202376968),
 Point((2.170784733657092, 3.7378462661787655), 0, 0.14316521256949766),
 Point((1.7918343294209915, -6.268392480824446), 0.030667881504475747, 0),
 Point((-3.4947924057201067, 0.7055509549560153), 2.595967104314564, 0),
 Point((3.1772727769263795, -2.154849462649522), 1.6348237505549936, 0),
 Point((-0.3964067993151321, -7.665890922834961), 0, 0.4587701232425214),
 Point((-2.861318114338971, 2.086710711791861), 0, 1.202578893298392),
 Point((2.7956107941190727, 3.3620556026546957), 0, 1.7557012243898453),
 Point((2.248724164709232, 4.4721633253788955), 2.3594077158233864, 0),
 Point((1.4098549895022678, 3.452184326395235), 2.1650480516375086, 0),
 Point((5.932533688869118, -1.9836976185061275), 0, 1.3668724483304575),
 Point((-2.1996633484632806, 0.01051370887164893), 0.3987213622628544, 0),
 Point((1.3046613659856892, 7.0451660471524065), 1.717130141324579, 0),
 Point((-1.0767096598980679, 5.6053193132545935), 0, 0.9631682012174194),
 Point((5.285709895766148, -8.834795949935263), 0, 1.2763450234514957),
 Point((0.2006208398732685, 6.999400419658166), 0, 1.882638397399605),
 Point((2.189135262780251, 9.02913377070196), 2.4284858336372217, 0),
 Point((9.411196857534605, 5.4864927908824), 0, 1.3420010590463594),
 Point((-2.891303363525868, -2.7834432409988885), 0, 2.3770915231713783),
 Point((8.567206099347796, 8.46063806927339), 1.4839790634500347, 0),
 Point((9.426316200708747, 8.74967178269507), 0, 0.40423529248504353),
 Point((-5.242137678392451, -3.0050958666348055), 0.4938720799262766, 0),
 Point((-6.266606445511855, 7.2983488731132695), 0, 1.7051711515457408),
 Point((1.1873879339016113, 5.024775333352638), 2.6940441038670127, 0),
 Point((-6.37580757036369, -6.085035314184104), 0, 0.4644285112868093),
 Point((3.4108477683453593, -4.707747283977383), 2.5005940389661436, 0),
 Point((-5.554647210703189, 4.56570088729929), 2.6744648930527424, 0),
 Point((9.23442037732973, 9.208349985576284), 0, 0.421972375868778),
 Point((4.734452189879594, -4.958673766311534), 0.6405491896836747, 0),
 Point((1.4752556576122053, -9.767617792400888), 0, 1.6462102160602043),
 Point((5.912652198067489, -7.644796194345673), 0, 1.5147403703021052),
 Point((5.741783189752843, -4.314518013082715), 0, 0.6652841221919703),
 Point((-4.893830327203357, 3.431838622925625), 0, 0.17581486462196227),
 Point((5.2697589501725375, -2.1698370429959173), 1.5305600869416351, 0),
 Point((-9.042761848598387, 1.960547890530549), 1.0729136297587647, 0),
 Point((3.2235712326750328, -0.31649290570659616), 2.1826584208132074, 0),
 Point((5.5916913742939265, 7.269364662031673), 0, 2.710733333856289),
 Point((0.16715061024823008, 9.155797379675317), 0.07028594802934285, 0),
 Point((-4.150738282984639, 1.6952833862801047), 0, 2.671340224348948),
 Point((-6.422689334167931, -4.656976677623177), 0, 2.544440994575562),
 Point((-1.3332251092948297, -8.519966823387293), 0, 2.3394641302232024),
 Point((-1.9659406001575448, 3.5487872376168976), 0, 1.3249713291759724),
 Point((0.0977554586079048, 7.015583658232618), 1.486529542260454, 0),
 Point((-7.721160222964767, -6.672623773224209), 0, 0.19103916874323745),
 Point((3.9061982241660598, 0.005964345936067872), 2.1621016227437027, 0),
 Point((-9.524930998006958, -6.288088026136094), 0.9623478049553519, 0),
 Point((-2.6056165591639324, -3.1045203553867236), 0, 1.65765026727716),
 Point((-6.1894297699314915, 6.105979400932036), 0, 0.17858531509522713),
 Point((-0.9272387050487012, 3.6568789843322236), 0, 2.5566196442478164),
 Point((-0.7380106345062529, 4.027784353425023), 1.8181138421453364, 0),
 Point((5.765677602732314, 8.852343520240392), 0, 1.6413185946719846),
 Point((-8.917342577389768, -3.503231348356808), 0.18248300437773102, 0),
 Point((-6.517579569208598, 5.601895498006558), 1.3869787975199679, 0),
 Point((8.032111882422289, 1.9363445425886017), 0, 0.2560274796729982),
 Point((9.559697736251191, -1.180530479596115), 0, 0.5688206014633256),
 Point((-8.859036799011864, -9.822331758961749), 2.0450377326887033, 0),
 Point((-4.285524036788592, -1.0405625654537705), 1.548747556665624, 0),
 Point((7.134335209669899, -2.1652517758362517), 1.3340935455851786, 0),
 Point((-9.178983240297624, -4.40713447364228), 0.7213879612519094, 0),
 Point((-2.2034231990816178, 2.1002093797286), 0, 0.6928165399924989),
 Point((-1.669760070759093, -2.7993710350031753), 0, 1.6029241212143646),
 Point((2.944803492351472, -6.544762797043737), 0, 2.8001599788914184),
 Point((-8.641889337440386, 2.7461210805696297), 2.2768611625868913, 0),
 Point((0.389027429603102, 3.8111042672838273), 0.7980044782684125, 0),
 Point((5.394461651279073, -4.431685277690722), 0, 1.199180951690217),
 Point((0.9432298270268866, 1.9877411500499527), 0.8799538574081932, 0),
 Point((-3.6624679660289194, -9.807131385284977), 0.917266772166812, 0),
 Point((6.6887140612807485, -6.725841080223118), 0, 2.1174228095434096),
 Point((6.052100942939866, 5.8186298795997775), 0, 2.917854794405284),
 Point((5.754009929697187, -4.2855942876399045), 1.9524444290236862, 0),
 Point((-0.6908339953545788, -9.293476168694214), 1.2257401011386317, 0),
 Point((-9.148303660958565, -5.496621576394185), 0, 2.027444734475861),
 Point((0.9349370029467536, 8.803550178582675), 0.506143204914802, 0),
 Point((-3.7931456406932362, -7.9715078400776695), 2.6000480527832637, 0),
 Point((6.328535868599278, -7.934701539008553), 0, 1.085178069308903),
 Point((2.780763107905212, 3.7642437537658697), 0, 2.524677807797998),
 Point((-7.981453351836985, -3.998242318216752), 0, 0.9508280577181677),
 Point((-5.639880574615404, 5.374560688786012), 1.8900112859749323, 0)]
# points
pot = Potential(points)
pot((-7.5, 5))
X = np.linspace(-20,20,100)
Y = np.linspace(-20,20,100)

result=[0]
%%timeit -n 1 -r 1
result[0] = mklevel(pot, X,Y)
level = result[0]
fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(121, projection='3d')
ax.plot_wireframe(*np.meshgrid(X,Y), np.atleast_2d(level))
ax.set_xlabel('x')
ax.set_ylabel('y')


ax2 = fig.add_subplot(122)
ax2.contour(X,Y, level)
ax2.grid()
# Поиск из правого верхнего угла
spo.minimize(pot, (10,10))
# Поиск из "бесконечности"
spo.minimize(pot, (30,30))
# Поиск из центра
spo.minimize(pot, (0,0))
spo.shgo(pot, bounds=((-30, 30),(-30,30)))
spo.basinhopping(pot, (0,0))
spo.minimize(pot, (-7.5,5))
spo.dual_annealing(pot, bounds=((-30, 30),(-30,30)))<jupyter_output><empty_output><jupyter_text>Гораздо более быстрый вариантВремя счёта потенциала можно значительно, в 500 раз, улучшить, если все вычисления выполнять только над структурами numpy и откомпилировав функции в машинный код JIT компилятором numba.Вычисления функции оценивания в 10 тысячах точек для поля, создаваемого 100  центрами. С использованием классов `Potential` и `Points` заняло 11 секунд, а JIT-откомпилированная функции - 24 миллисекунды.<jupyter_code>def mk_v(x,y):
    return x+y*1.0j

@numba.njit(inline="always")
def distance(v1, v2) -> float :
    return abs(v1-v2)

@numba.njit(inline="always")
def _attract(power, v0, v1):
    d = distance(v0,v1)/2
    d = d/(abs(power) +1)
    d2 = d*d
    return -power*(1.0-d2/np.sqrt(1+d2*d2))
        
@numba.njit(inline="always")
def point_potential(point, v):
    v0, power = point
    return _attract(power, v0, v)

@numba.njit(inline='always')
def group_potential(points, v):
    pot = [_attract(power,v0, v) for v0, power in points]
    return np.real(np.sum(np.array(pot)))

@numba.njit
def potential(points, vv):
    return np.array([group_potential(points, v) for v in vv])
points = [[mk_v(-8.30472715243922, 4.075380593226381), 2.4074552697664076],
 [mk_v(-0.21555044286747638, 8.57170171393157), 1.7156388412149295],
 [mk_v(2.164217601214558, 0.1976410306531271), 0.036041103934147056],
 [mk_v(-9.830180771112511, 5.360101141854546), 1.5377623588877296],
 [mk_v(-8.990155297806343, 8.871090085339493), -0.7780968993341935],
 [mk_v(-2.945198831232836, -0.5430559320770385), -0.18157882703041206],
 [mk_v(-2.3398322859233094, 1.6800476227817995), -1.04852220611981],
 [mk_v(-2.4022061207880903, -9.062139181099422), 1.960247271272065],
 [mk_v(1.1543988777224712, -0.5182021685848497), 2.776331665555672],
 [mk_v(5.047987156283327, 2.150389437705103), -2.9378520054710187],
 [mk_v(2.5865820364421523, 7.280923751715807), -2.653304958553035],
 [mk_v(-3.8876460147068563, -7.8719081551069685), -1.8330551255551653],
 [mk_v(8.019210812572926, -5.719917712004053), -1.0599060380292102],
 [mk_v(-4.685044402676926, 6.722702646317263), 1.3092819081318874],
 [mk_v(-5.831375251729602, -3.2052379675773857), 2.4337408862763117],
 [mk_v(9.816386693122052, 3.8889911828741504), -1.360270344292402],
 [mk_v(4.543733752184998, 5.868062789893436), -0.1503114371014047],
 [mk_v(9.981700953244339, -0.2959569810219129), 0.8336021769128561],
 [mk_v(-4.445940490334836, 3.2093343796203797), -0.06303959479438925],
 [mk_v(8.012287957860128, 8.433795213157541), -0.9468268137243179],
 [mk_v(-2.22423725999737, -1.7022651171892118), 0.7494480739766],
 [mk_v(-6.233500584983432, 5.5156463082570895), 2.952813946384336],
 [mk_v(-5.64437891845327, 1.4537190808413936), -1.0689167202376968],
 [mk_v(2.170784733657092, 3.7378462661787655), -0.14316521256949766],
 [mk_v(1.7918343294209915, -6.268392480824446), 0.030667881504475747],
 [mk_v(-3.4947924057201067, 0.7055509549560153), 2.595967104314564],
 [mk_v(3.1772727769263795, -2.154849462649522), 1.6348237505549936],
 [mk_v(-0.3964067993151321, -7.665890922834961), -0.4587701232425214],
 [mk_v(-2.861318114338971, 2.086710711791861), -1.202578893298392],
 [mk_v(2.7956107941190727, 3.3620556026546957), -1.7557012243898453],
 [mk_v(2.248724164709232, 4.4721633253788955), 2.3594077158233864],
 [mk_v(1.4098549895022678, 3.452184326395235), 2.1650480516375086],
 [mk_v(5.932533688869118, -1.9836976185061275), -1.3668724483304575],
 [mk_v(-2.1996633484632806, 0.01051370887164893), 0.3987213622628544],
 [mk_v(1.3046613659856892, 7.0451660471524065), 1.717130141324579],
 [mk_v(-1.0767096598980679, 5.6053193132545935), -0.9631682012174194],
 [mk_v(5.285709895766148, -8.834795949935263), -1.2763450234514957],
 [mk_v(0.2006208398732685, 6.999400419658166), -1.882638397399605],
 [mk_v(2.189135262780251, 9.02913377070196), 2.4284858336372217],
 [mk_v(9.411196857534605, 5.4864927908824), -1.3420010590463594],
 [mk_v(-2.891303363525868, -2.7834432409988885), -2.3770915231713783],
 [mk_v(8.567206099347796, 8.46063806927339), 1.4839790634500347],
 [mk_v(9.426316200708747, 8.74967178269507), -0.40423529248504353],
 [mk_v(-5.242137678392451, -3.0050958666348055), 0.4938720799262766],
 [mk_v(-6.266606445511855, 7.2983488731132695), -1.7051711515457408],
 [mk_v(1.1873879339016113, 5.024775333352638), 2.6940441038670127],
 [mk_v(-6.37580757036369, -6.085035314184104), -0.4644285112868093],
 [mk_v(3.4108477683453593, -4.707747283977383), 2.5005940389661436],
 [mk_v(-5.554647210703189, 4.56570088729929), 2.6744648930527424],
 [mk_v(9.23442037732973, 9.208349985576284), -0.421972375868778],
 [mk_v(4.734452189879594, -4.958673766311534), 0.6405491896836747],
 [mk_v(1.4752556576122053, -9.767617792400888), -1.6462102160602043],
 [mk_v(5.912652198067489, -7.644796194345673), -1.5147403703021052],
 [mk_v(5.741783189752843, -4.314518013082715), -0.6652841221919703],
 [mk_v(-4.893830327203357, 3.431838622925625), -0.17581486462196227],
 [mk_v(5.2697589501725375, -2.1698370429959173), 1.5305600869416351],
 [mk_v(-9.042761848598387, 1.960547890530549), 1.0729136297587647],
 [mk_v(3.2235712326750328, -0.31649290570659616), 2.1826584208132074],
 [mk_v(5.5916913742939265, 7.269364662031673), -2.710733333856289],
 [mk_v(0.16715061024823008, 9.155797379675317), 0.07028594802934285],
 [mk_v(-4.150738282984639, 1.6952833862801047), -2.671340224348948],
 [mk_v(-6.422689334167931, -4.656976677623177), -2.544440994575562],
 [mk_v(-1.3332251092948297, -8.519966823387293), -2.3394641302232024],
 [mk_v(-1.9659406001575448, 3.5487872376168976), -1.3249713291759724],
 [mk_v(0.0977554586079048, 7.015583658232618), 1.486529542260454],
 [mk_v(-7.721160222964767, -6.672623773224209), -0.19103916874323745],
 [mk_v(3.9061982241660598, 0.005964345936067872), 2.1621016227437027],
 [mk_v(-9.524930998006958, -6.288088026136094), 0.9623478049553519],
 [mk_v(-2.6056165591639324, -3.1045203553867236), -1.65765026727716],
 [mk_v(-6.1894297699314915, 6.105979400932036), -0.17858531509522713],
 [mk_v(-0.9272387050487012, 3.6568789843322236), -2.5566196442478164],
 [mk_v(-0.7380106345062529, 4.027784353425023), 1.8181138421453364],
 [mk_v(5.765677602732314, 8.852343520240392), -1.6413185946719846],
 [mk_v(-8.917342577389768, -3.503231348356808), 0.18248300437773102],
 [mk_v(-6.517579569208598, 5.601895498006558), 1.3869787975199679],
 [mk_v(8.032111882422289, 1.9363445425886017), -0.2560274796729982],
 [mk_v(9.559697736251191, -1.180530479596115), -0.5688206014633256],
 [mk_v(-8.859036799011864, -9.822331758961749), 2.0450377326887033],
 [mk_v(-4.285524036788592, -1.0405625654537705), 1.548747556665624],
 [mk_v(7.134335209669899, -2.1652517758362517), 1.3340935455851786],
 [mk_v(-9.178983240297624, -4.40713447364228), 0.7213879612519094],
 [mk_v(-2.2034231990816178, 2.1002093797286), -0.6928165399924989],
 [mk_v(-1.669760070759093, -2.7993710350031753), -1.6029241212143646],
 [mk_v(2.944803492351472, -6.544762797043737), -2.8001599788914184],
 [mk_v(-8.641889337440386, 2.7461210805696297), 2.2768611625868913],
 [mk_v(0.389027429603102, 3.8111042672838273), 0.7980044782684125],
 [mk_v(5.394461651279073, -4.431685277690722), -1.199180951690217],
 [mk_v(0.9432298270268866, 1.9877411500499527), 0.8799538574081932],
 [mk_v(-3.6624679660289194, -9.807131385284977), 0.917266772166812],
 [mk_v(6.6887140612807485, -6.725841080223118), -2.1174228095434096],
 [mk_v(6.052100942939866, 5.8186298795997775), -2.917854794405284],
 [mk_v(5.754009929697187, -4.2855942876399045), 1.9524444290236862],
 [mk_v(-0.6908339953545788, -9.293476168694214), 1.2257401011386317],
 [mk_v(-9.148303660958565, -5.496621576394185), -2.027444734475861],
 [mk_v(0.9349370029467536, 8.803550178582675), 0.506143204914802],
 [mk_v(-3.7931456406932362, -7.9715078400776695), 2.6000480527832637],
 [mk_v(6.328535868599278, -7.934701539008553), -1.085178069308903],
 [mk_v(2.780763107905212, 3.7642437537658697), -2.524677807797998],
 [mk_v(-7.981453351836985, -3.998242318216752), -0.9508280577181677],
 [mk_v(-5.639880574615404, 5.374560688786012), 1.8900112859749323]]
points = [np.array(p) for p in points]
points = np.array(points)
potential(points, np.array([mk_v(0,0)]))
U,V = np.meshgrid(X,Y)
W=mk_v(U, V)
%%timeit -n 3 -r 3
result[0] = np.real(np.array([ potential(points, W_row) for W_row in W]))
levels = result[0]
_ = plt.figure(figsize=(10,10))
ax = plt.axes(projection='3d')
ax.plot_wireframe(U,V,levels)
plt.contour(U,V, levels)
%%timeit -n 1 -r 1
print(spo.dual_annealing(lambda x_y: group_potential(points, mk_v(*x_y)), bounds=((-30, 30),(-30,30))))
spo.minimize(lambda x_y: group_potential(points, mk_v(*x_y)), (-7.5,5))
group_potential(points, mk_v(-7.5,5))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.16312230497843982, 'fraction_numerical': 0.5052920423363387, 'mean_word_length': 6.066828254847645, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 17, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '372788', 'license': 'MIT', 'n_tokens_mistral': 15542, 'n_tokens_neox': 9795, 'n_words': 1246, 'path': 'python/1259494/repelling_points.ipynb', 'repo_name': 'pakuula/StackOverflow', 'size': '20408'}