File: econsim.py

package info (click to toggle)
naev 0.8.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 386,084 kB
  • sloc: ansic: 93,149; xml: 87,292; python: 2,347; sh: 904; makefile: 654; lisp: 162; awk: 4
file content (104 lines) | stat: -rwxr-xr-x 3,028 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env python3

__version__="0.1"

import os, sys
from optparse import OptionParser

import pydot

config = dict({
        'datPath': '../../dat/',
        'verbose': True})

def planet_filter( p ):
   details = assetsObj.getPlanetDetails( p )
   return details and int(details['population']) > 0


if __name__ == "__main__":
   from datreader import readers

   # Load data
   ssysObj   = readers.ssys(**config)
   assetsObj = readers.assets(**config)

   # Create graph
   print("Creating graph")
   graph     = pydot.Dot( 'Naev_Universe', graph_type='graph' )

   # Iterate over systems and planets
   ssys_added = []
   jumps_added = []
   i = 1
   for ssysName, planets in ssysObj.assetsList.items():

      # Create jumps
      jumps = ssysObj.jumpgatesForSystem( ssysName )
      jump_nodes = []
      for j in jumps:
         # Sort by name
         jname = j['target']
         if jname < ssysName:
            name = '%s-%s' % (jname, ssysName)
         else:
            name = '%s-%s' % (ssysName, jname)
         # First time addition
         if name not in jumps_added:
            node = pydot.Node( name, shape='diamond' )
            graph.add_node( node )
            jumps_added.append( name )
         # Add edges between jumps for empty systems
         for jn in jump_nodes:
            edge = pydot.Edge( name, jn )
            graph.add_edge( edge )
         # Add node
         jump_nodes.append( name )

      # We don't want all the planets
      planets_filtered = list(filter( planet_filter, planets ))
      planets_added = list()
      # Create cluster
      if len(planets_filtered) > 0:
         subg = pydot.Cluster( "sys_%d"%i, label=ssysName )
         # Iterate to create maps
         for p in planets_filtered:
            # Add the node
            node     = pydot.Node( p )
            subg.add_node( node )
         graph.add_subgraph( subg )
         for p in planets_filtered:
            # Add planet links
            for t in planets_filtered:
               if p == t or t in planets_added:
                  continue
               edge = pydot.Edge( p, t, style='dotted' )
               graph.add_edge( edge )
            # Add jump edges
            for j in jump_nodes:
               edge = pydot.Edge( p, j )
               graph.add_edge( edge )
            # Visited planet
            planets_added.append(p)
      
      ssys_added.append( ssysName )
      i += 1

   #graph.set_prog( 'neato' )
   graph.set_simplify( False )
   graph.set( 'aspect',    1 )
   #graph.set( 'maxiter',   100000 )
   #graph.set( 'overlap',   False )
   nodes = graph.get_nodes()
   edges = graph.get_edges()
   v     = len(nodes)
   e     = len(edges)
   sparse = float(e+v)/float(v**2)
   print(("   %d nodes and %d edges (%.3f%% sparse)" % (v, e, sparse*100)))
   print("Outputting as naev_universe")
   graph.write_raw('naev_universe.dot')
   #graph.write_png('naev_universe.png', prog='neato', format='png')
   graph.write('naev_universe.png', prog='neato', format='png')