plan_gen_cli.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/env python3
  2. ''' Python generator for MATSim plans. '''
  3. import sys
  4. import lxml.etree as etree
  5. import numpy as np
  6. import joblib as jl
  7. import plan_gen.plan_gen as pg
  8. NB_CORES = 8
  9. def run_rand_person(i):
  10. ''' parallelisation '''
  11. np.random.seed(SEEDS[i])
  12. return [pg.rand_person(NODES, CLUSTERS, H_DENSITIES, W_DENSITIES)
  13. for _ in range(int(NB_PERSONS/NB_CORES))]
  14. if __name__ == '__main__':
  15. # command line arguments
  16. if len(sys.argv) != 2:
  17. print('usage:', sys.argv[0], '<params>')
  18. sys.exit(-1)
  19. DICT_PARAMS = pg.parse_params(sys.argv[1])
  20. NB_CLUSTERS = DICT_PARAMS['nc']
  21. NB_PERSONS = DICT_PARAMS['np']
  22. INPUT_NETWORK = DICT_PARAMS['nw']
  23. INPUT_HOMES = DICT_PARAMS['hcsv'] if 'hcsv' in DICT_PARAMS else None
  24. INPUT_WORKS = DICT_PARAMS['wcsv'] if 'wcsv' in DICT_PARAMS else None
  25. H_CENTERS = DICT_PARAMS['hc'] if 'hc' in DICT_PARAMS else None
  26. H_RADIUS = DICT_PARAMS['hr'] if 'hr' in DICT_PARAMS else None
  27. H_WEIGHTS = DICT_PARAMS['hw'] if 'hw' in DICT_PARAMS else None
  28. W_CENTERS = DICT_PARAMS['wc'] if 'wc' in DICT_PARAMS else None
  29. W_RADIUS = DICT_PARAMS['wr'] if 'wr' in DICT_PARAMS else None
  30. W_WEIGHTS = DICT_PARAMS['ww'] if 'ww' in DICT_PARAMS else None
  31. # prepare data
  32. NODES = pg.get_nodes(INPUT_NETWORK)
  33. CLUSTERS = pg.make_clusters(NB_CLUSTERS, NODES)
  34. if (H_CENTERS is None and INPUT_HOMES):
  35. H_CENTERS = pg.make_centers(INPUT_HOMES, NB_CLUSTERS, NODES)
  36. H_WEIGHTS = pg.parse_weights(INPUT_HOMES)
  37. H_RADIUS = np.full_like(H_WEIGHTS, 5)
  38. if (W_CENTERS is None and INPUT_WORKS):
  39. W_CENTERS = pg.make_centers(INPUT_WORKS, NB_CLUSTERS, NODES)
  40. W_WEIGHTS = pg.parse_weights(INPUT_WORKS)
  41. W_RADIUS = np.full_like(W_WEIGHTS, 5)
  42. H_DENSITIES = pg.make_densities(NB_CLUSTERS, H_CENTERS, H_RADIUS, H_WEIGHTS)
  43. H_DENSITIES = pg.clean_densities(H_DENSITIES, CLUSTERS)
  44. W_DENSITIES = pg.make_densities(NB_CLUSTERS, W_CENTERS, W_RADIUS, W_WEIGHTS)
  45. W_DENSITIES = pg.clean_densities(W_DENSITIES, CLUSTERS)
  46. # make xml
  47. SEEDS = np.random.random_integers(0, 1e9, NB_CORES)
  48. PERSONS = jl.Parallel(n_jobs=NB_CORES)(jl.delayed(run_rand_person)(i) for i in range(NB_CORES))
  49. PERSONS = sum(PERSONS,[])
  50. PLANS = pg.make_plans(PERSONS)
  51. # print XML
  52. print('<?xml version="1.0" ?>')
  53. print('<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">')
  54. print(etree.tostring(PLANS, pretty_print=True).decode('utf-8'))