squish/packsim.py
2024-10-22 19:06:03 -04:00

76 lines
2.3 KiB
Python

#!/usr/bin/env python3
from __future__ import annotations
import argparse, json
from simulation import Diagram, Flow, Search, Shrink
def get_diagram(sim, t):
if t == "flow":
diagram = Diagram(sim, np.array([["voronoi", "energy"]]))
elif t == "stats":
diagram = Diagram(sim, np.array([
["voronoi", "eigs", "site_edge_count"],
["site_isos", "site_energies", "edge_lengths"]
]), cumulative=False)
elif t == "eigs":
diagram = Diagram(sim, np.array([["voronoi", "eigs"]]))
elif t == "shrink":
diagram = Diagram(sim, np.array([["voronoi", "avg_radius", "isoparam_avg"]]), cumulative=False)
return diagram
def main():
# Loading configuration and settings.
parser = argparse.ArgumentParser("Processes packing simulations.")
parser.add_argument('sim_conf', metavar='path/to/config',
help="configuration file for a simulation")
parser.add_argument('-q', '--quiet', dest='quiet', action='store_true', default=False,
help="suppress all normal output")
parser.add_argument('-l', '--log', dest='log_steps', action='store_true', default=50,
help="number of iterations before logging")
parser.add_argument('-i', '--input', dest='input_file')
parser.add_argument('-o', '--output', dest='output_file')
args = parser.parse_args()
if args.input_file is None:
config_sim(args)
else:
loaded_sim(args)
def config_sim(args):
with open(args.sim_conf) as f:
params = json.load(f)
calc_params, sim_params = params["calc"], params["sim"]
n, w, h, r, energy = calc_params["n_objects"], calc_params["width"], calc_params["height"], \
calc_params["natural_radius"], calc_params["energy"]
mode, thres, step = sim_params["mode"], sim_params["threshold"], sim_params["step_size"]
# Running simulation
if mode == "flow":
sim = Flow(n, w, h, r, energy, thres, step)
elif mode == "search":
sim = Search(n, w, h, r, energy, thres, step, sim_params["manifold_step"],
sim_params["count"])
elif mode == "shrink":
sim = Shrink(n, w, h, r, energy, thres, step, sim_params["delta_width"],
sim_params["stop_width"])
sim.initialize()
sim.run(not args.quiet, args.log_steps)
def loaded_sim(args):
pass
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print("Program terminated by user.")