def make_case(name, nb_diracs, dim): # default domain if name == "random": positions = np.random.rand(nb_diracs, dim) elif name == "grid": positions = make_grid(nb_diracs, dim) elif name == "grid_with_rand": positions = make_grid(nb_diracs, dim, rand_val=1) elif name == "faces": # voronoi with 100 points pd = PowerDiagram(np.random.rand(5, dim)) # quantization lot = OptimalTransport(positions=make_grid(nb_diracs, dim)) lot.obj_max_dw = 1e-5 lot.verbosity = 1 for ratio in [1 - 0.85**n for n in range(50)]: # density img_size = 1000 img_points = [] items = [range(img_size) for i in range(dim)] for i in itertools.product(*items): img_points.append(i) img = pd.distances_from_boundaries( np.array(img_points) / img_size).reshape((img_size, img_size)) img = (1 - ratio) + ratio * np.exp(-(100 * img)**2) lot.set_domain(ScaledImage([0, 0], [1, 1], img / np.mean(img))) # opt for _ in range(10): lot.adjust_weights() B = lot.get_centroids() lot.set_positions(lot.get_positions() + 0.3 * (B - lot.get_positions())) positions = lot.get_positions() plt.plot(positions[:, 0], positions[:, 1], ".") plt.show() np.save("/data/{}_n{}_d{}_voro.npy".format(name, nb_diracs, dim), (positions[:, 0], positions[:, 1])) # solve if nb_diracs < 32000000: ot = OptimalTransport(positions) # ot.verbosity = 1 # solve ot.adjust_weights() # display # ot.display_vtk( "results/pd.vtk" ) np.save("/data/{}_n{}_d{}.npy".format(name, nb_diracs, dim), (positions[:, 0], positions[:, 1], ot.get_weights()))
for y in range(n): for x in range(n): positions.append([(y + 0.25 + 0.5 * np.random.rand()) / n, (x + 0.25 + 0.5 * np.random.rand()) / n]) ot = OptimalTransport(np.array(positions)) ot.verbosity = 1 # solve for l in [2, 4, 8]: t = np.linspace(-1, 1, 100) x, y = np.meshgrid(t, t) img = np.exp(-l * (x**2 + y**2)) img /= np.mean(img) # domain ot.set_domain(ScaledImage([0, 0], [1, 1], img)) quantization(ot, 0.1, 10) # display # ot.pd.display_vtk( "results/pd.vtk", centroids=True ) # optimal transport with a simple [0,1]^2 domain ot = OptimalTransport(ot.get_positions()) ot.adjust_weights() img = ot.pd.image_integrals([0, 0], [1, 1], [100, 100]) for d in range(2): plt.subplot(1, 2, d + 1) plt.imshow(img[:, :, d] / img[:, :, 2]) plt.colorbar()