From f0c7568d380c5b70b9f82674ba5a848d8e01b807 Mon Sep 17 00:00:00 2001 From: Richard Bronkhorst Date: Tue, 13 Jun 2023 22:29:04 +0200 Subject: [PATCH] Update analyzer.py, base.py and five other files --- nullptr/analyzer.py | 20 +++++++++++++++----- nullptr/models/base.py | 2 +- nullptr/models/jumpgate.py | 4 ++-- nullptr/models/marketplace.py | 4 ++-- nullptr/models/system_member.py | 10 ++++++++++ nullptr/models/waypoint.py | 8 ++------ nullptr/store.py | 19 ++++++++++++++++--- 7 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 nullptr/models/system_member.py diff --git a/nullptr/analyzer.py b/nullptr/analyzer.py index 8070f4a..7c432cf 100644 --- a/nullptr/analyzer.py +++ b/nullptr/analyzer.py @@ -11,21 +11,31 @@ class Analyzer: resources = m.imports if sellbuy == 'sell' else m.exports if resource in resources: yield m - + + def get_jumpgate(self, system): + gates = self.store.all_members(system, Jumpgate) + return next(gates, None) + def find_path(self, orig, to): if orig == to: return [] - jg = self.store.get(Jumpgate, orig.symbol) - if jg is None: return None + jg = self.get_jumpgate(orig) + if jg is None: + print(f'{orig} no jg') + return None best_distance = orig.distance(to) best_hop = None for hop_str in jg.systems: hop = self.store.get(System, hop_str) - if hop is None: continue + if hop is None: + print(f'{hop_str} hopnon') + continue dist = hop.distance(to) if dist < best_distance: best_distance = dist best_hop = hop - if best_hop is None: return None + if best_hop is None: + print('nobest') + return None tail = self.find_path(best_hop, to) if tail is None: return None return [best_hop] + tail diff --git a/nullptr/models/base.py b/nullptr/models/base.py index 04a0276..d22b0b4 100644 --- a/nullptr/models/base.py +++ b/nullptr/models/base.py @@ -38,7 +38,7 @@ class Base: def dict(self): r = {} for k,v in self.__dict__.items(): - if k == 'store': + if k in ['store']: continue r[k] = deepcopy(v) return r diff --git a/nullptr/models/jumpgate.py b/nullptr/models/jumpgate.py index 01b46c5..760136a 100644 --- a/nullptr/models/jumpgate.py +++ b/nullptr/models/jumpgate.py @@ -1,7 +1,7 @@ -from .base import Base +from .system_member import SystemMember from typing import List -class Jumpgate(Base): +class Jumpgate(SystemMember): range: int faction: str systems:List[str] = [] diff --git a/nullptr/models/marketplace.py b/nullptr/models/marketplace.py index 6421681..dd5dbef 100644 --- a/nullptr/models/marketplace.py +++ b/nullptr/models/marketplace.py @@ -1,8 +1,8 @@ -from .base import Base +from .system_member import SystemMember from typing import List -class Marketplace(Base): +class Marketplace(SystemMember): imports:List[str] = [] exports:List[str] = [] exchange:List[str] = [] diff --git a/nullptr/models/system_member.py b/nullptr/models/system_member.py new file mode 100644 index 0000000..b031a1d --- /dev/null +++ b/nullptr/models/system_member.py @@ -0,0 +1,10 @@ +from .base import Base + +class SystemMember(Base): + @classmethod + def ext(cls): + return 'obj' + + def system(self): + p = self.symbol.split('-') + return f'{p[0]}-{p[1]}' diff --git a/nullptr/models/waypoint.py b/nullptr/models/waypoint.py index e6ae923..fcf6e17 100644 --- a/nullptr/models/waypoint.py +++ b/nullptr/models/waypoint.py @@ -1,8 +1,8 @@ -from .base import Base +from .system_member import SystemMember from nullptr.util import * from typing import List -class Waypoint(Base): +class Waypoint(SystemMember): x:int = 0 y:int = 0 type:str = 'unknown' @@ -23,7 +23,3 @@ class Waypoint(Base): def path(self): sector, system, _ = self.symbol.split('-') return f'atlas/{sector}/{system[0:1]}/{system}/{self.symbol}.{self.ext()}' - - def system(self): - p = self.symbol.split('-') - return f'{p[0]}-{p[1]}' diff --git a/nullptr/store.py b/nullptr/store.py index e380e47..275fe73 100644 --- a/nullptr/store.py +++ b/nullptr/store.py @@ -4,6 +4,7 @@ from nullptr.models.sector import Sector from nullptr.models.system import System from nullptr.models.agent import Agent from nullptr.models.marketplace import Marketplace +from nullptr.models.system_member import SystemMember from nullptr.models.jumpgate import Jumpgate from os.path import isfile, dirname, isdir import os @@ -17,10 +18,11 @@ class Store: self.init_models() self.data_dir = data_dir self.data = {m: {} for m in self.models} + self.system_members = {} self.dirty_objects = set() def init_models(self): - self.models = Base.__subclasses__() + self.models = all_subclasses(Base) self.extensions = {c.ext(): c for c in self.models} def dirty(self, obj): @@ -41,10 +43,9 @@ class Store: data = json.load(f) typ = self.extensions[ext] - obj = typ(symbol, self) + obj = self.create(typ, symbol) data['store'] = self obj.__dict__ = data - self.data[typ][obj.symbol] = obj return obj def load(self): @@ -68,6 +69,11 @@ class Store: def create(self, typ, symbol): obj = typ(symbol, self) self.data[typ][symbol] = obj + if issubclass(typ, SystemMember): + system_str = obj.system() + if system_str not in self.system_members: + self.system_members[system_str] = set() + self.system_members[system_str].add(obj) return obj def get(self, typ, symbol, create=False): @@ -92,6 +98,13 @@ class Store: for m in self.data[typ].values(): yield m + def all_members(self, system, typ=None): + if type(system) == System: + system = system.symbol + for m in self.system_members[system]: + if typ is None or type(m) == typ: + yield m + def flush(self): it = 0 start_time = time()