From 3162ee52725312b917bcb17a121f4149b2d191b1 Mon Sep 17 00:00:00 2001 From: Eisinger Date: Thu, 30 Apr 2026 10:43:41 +0200 Subject: [PATCH 01/11] Optimisations in q_agent. Added reporting of parameters to pendulum environment. --- models/q_anti-pendulum.json | 303 +++++++++--------- scripts/use_q_ide.py | 44 ++- .../envs/controlled_crane_pendulum.py | 15 +- src/crane_controller/q_agent.py | 58 ++-- 4 files changed, 226 insertions(+), 194 deletions(-) diff --git a/models/q_anti-pendulum.json b/models/q_anti-pendulum.json index e5468f5..80143f0 100644 --- a/models/q_anti-pendulum.json +++ b/models/q_anti-pendulum.json @@ -1,238 +1,231 @@ { - "date": "29.04.2026 06:53:49", + "start-training": "30.04.2026 08:29:32", + "end-training": "30.04.2026 08:29:54", "pendulum": { - "start_speed": "1.0", - "render_mode": "none", + "wire-length": "10.0", + "wire-q-factor": "50.0", + "reward-factors": "(1.0, 0.0015, 0.0)", + "acceleration": "0.1", + "step-size": "0.1", + "observations-discretization": "{'pos': (0, 1), 'speed': (0, 1), 'distance': (0.0, 1.0, 2.0, 5.0, 10.0, 20.0), 'sector': (0, 1), 'energies': (np.float64(0.0), np.float64(0.014941105158016455), np.float64(0.373300117199762), np.float64(1.4903594295023934), np.float64(5.916153900902383), np.float64(13.142907888746564), np.float64(98.1))}", "reward_limit": "0.0" }, "q_agent": { - "use_trained": "True", - "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_trained.json", - "episodes": "6000", - "steps": "30006000", + "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_anti-pendulum.json", + "use_file": "rw", + "episodes": "10", + "steps": "40020", "learning_rate": "0.1", - "discount_factor": "0.95" + "discount_factor": "0.95", + "epsilon-decay": "0.001", + "final-epsilon": "0.1", + "epsilon": "0.98" }, "q_values": { "(0, 0, 0, 1, 1)": [ - -0.7127999098776818, - -0.7204031480080048, - -0.7412199306092444 + -0.16705581244794693, + -0.1282253386578821, + -0.09732839899973421 ], "(0, 0, 0, 0, 0)": [ - -0.39882058710042717, - -0.43180066871885253, - -0.36789168710316733 + -0.37890841049813784, + -0.3221144173089857, + -0.3983817365055842 ], "(0, 0, 0, 1, 0)": [ - -0.49644387699601483, - -0.476832491697103, - -0.4808429865234992 + -0.2664435349978729, + -0.17001690959731303, + -0.2325842595231777 ], "(0, 0, 1, 1, 0)": [ - -0.3645407668594485, - -0.34941296493381946, - -0.19816466371287308 + -0.15064415891825617, + -0.2511495308113964, + -0.25691496256409363 ], "(0, 1, 1, 1, 0)": [ - -0.27335521972045285, - -0.31790379183091966, - -0.2034872242749172 + -0.20723301719553744, + -0.2388453016403667, + -0.16750979906585578 ], "(0, 1, 0, 1, 0)": [ - -0.6087312502217588, - -0.6754940805998394, - -0.6535399837815964 + -0.21424728224181977, + -0.22083742688011837, + -0.2194005545131396 ], "(0, 1, 0, 2, 0)": [ - -0.3949208069494323, - -0.4631147311708943, - -0.4776412098931605 + -0.048696104408199575, + -0.05034525692645991, + -0.05258803579860084 ], "(0, 0, 0, 2, 0)": [ - -0.2712981364627587, - -0.17654049561221843, - -0.2508326205458066 + -0.052053372911474195, + -0.05245228578367619, + -0.056669454625284825 ], "(0, 0, 1, 2, 0)": [ - -0.48498802268403846, - -0.4395215670942963, - -0.4722944229115358 + -0.04772137252269057, + -0.05881755142692484, + -0.054423243178985496 ], "(0, 1, 1, 2, 0)": [ - -0.4990197857734165, - -0.5327879501542365, - -0.4941112778002146 + -0.05278649224808442, + -0.07632187326419965, + -0.060938333453418286 ], "(0, 0, 0, 3, 0)": [ - -0.5387880192090378, - -0.4784712525147248, - -0.517952873228921 + -0.24369975025229282, + -0.24695892939305783, + -0.24911621770298206 ], "(0, 0, 1, 3, 0)": [ - -0.9096919737168466, - -0.9127452620968198, - -0.9420045562304813 + -0.24027345169278405, + -0.24031167906999237, + -0.24314101938021784 ], "(0, 1, 1, 3, 0)": [ - -0.8667830882886871, - -0.8757935260356404, - -0.8758730446292982 + -0.24861198983323804, + -0.23256743828903015, + -0.23006936132916378 ], "(0, 1, 0, 3, 0)": [ - -0.43694463364384284, - -0.32317351557573637, - -0.37671045435695716 + -0.23803043434121016, + -0.23300086647016396, + -0.252096348380666 ], "(0, 0, 1, 4, 0)": [ - -0.9306066987431686, - -0.9344436974699757, - -0.9655748330701439 + -0.29577889270947405, + -0.2981742809792015, + -0.29791983068372924 ], "(0, 1, 1, 4, 0)": [ - -1.009825188680733, - -1.016868953064729, - -0.9957558578136729 + -0.2958234315862551, + -0.30645418768275684, + -0.30661740666730875 ], "(0, 1, 0, 4, 0)": [ - -1.0369014461449961, - -1.0197443807886495, - -0.9976879186706535 + -0.3029623394714542, + -0.3018348837313605, + -0.3286817686032363 ], "(0, 0, 0, 4, 0)": [ - -0.8997996021390884, - -0.8913054855090478, - -0.8905808268698551 + -0.29781883698756567, + -0.2940971933423739, + -0.29733487917694584 ], "(0, 1, 0, 5, 0)": [ - -1.5826848759769268, - -2.7445575744690793, - -2.418367271258592 + -0.6329437113580243, + -0.6297747244548322, + -0.628882264517245 ], "(0, 0, 0, 5, 0)": [ - -1.6683128963172371, - -2.251311793007559, - -2.3851805260338708 + -0.6277272058045739, + -0.6384550155569291, + -0.6303149829373899 ], "(0, 0, 1, 5, 0)": [ - -2.2373735329153392, - -1.540495957571949, - -2.76737403946213 + -0.6396081577986387, + -0.6334955382726669, + -0.6407924717823796 ], "(0, 1, 1, 5, 0)": [ - -2.3314084980057013, - -1.5138347954693265, - -3.01917937692279 - ], - "(0, 1, 0, 1, 1)": [ - -0.261055476317184, - -0.27846357082465933, - -0.2774020188584469 + -0.6400694360313026, + -0.633976678537013, + -0.6330865725095266 ], "(0, 0, 1, 1, 1)": [ - -0.1342852547795026, - -0.2470169520959763, - -0.2126480225045462 + -0.10369497244449818, + -0.11119982054398986, + -0.12993117280633998 ], "(0, 1, 1, 1, 1)": [ - -0.2797380701937499, - -0.2945979948624919, - -0.24076792235861236 + -0.10542409331231692, + -0.11768594196503504, + -0.07456918970206615 ], - "(0, 1, 1, 2, 1)": [ - -0.2728844361768713, - -0.13972184601087123, - -0.3275551939924255 + "(0, 1, 0, 1, 1)": [ + -0.14656019585858246, + -0.1326055167833163, + -0.12885325016738228 ], "(0, 1, 0, 2, 1)": [ - -0.455039876626072, - -0.43296129057936117, - -0.4316836608934558 + -0.11967009468971596, + -0.12216127394629554, + -0.1429122098640283 ], "(0, 0, 0, 2, 1)": [ - -0.5686315534261919, - -0.5538077807341172, - -0.5496103554748915 + -0.128347455422042, + -0.1487387200161241, + -0.16517981243223914 + ], + "(0, 0, 1, 2, 1)": [ + -0.2682879902850379, + -0.19492371557724883, + -0.19236122464754474 + ], + "(0, 1, 1, 2, 1)": [ + -0.15105097271312573, + -0.20727413471853204, + -0.20105859767753256 ], "(0, 0, 0, 3, 1)": [ - -0.3966116309786595, - -0.3317568230750391, - -0.30858102473455185 + -0.11746821209617946, + -0.12239144215834397, + -0.13720619491970695 ], "(0, 0, 1, 3, 1)": [ - -0.8315655206780324, - -0.8333814435452305, - -0.7756715486070018 + -0.11651570970036011, + -0.11862687420946329, + -0.1260539064368246 ], "(0, 1, 1, 3, 1)": [ - -0.9831842749294987, - -0.9782200055298229, - -0.9930127344944251 + -0.1450901027213944, + -0.12420631784497436, + -0.12104519333576104 ], "(0, 1, 0, 3, 1)": [ - -0.6539627507980373, - -0.5852573030361744, - -0.6763166111516389 - ], - "(0, 1, 0, 4, 1)": [ - -0.9026947631459618, - -0.9407969095587947, - -0.965156293555089 - ], - "(0, 0, 0, 4, 1)": [ - -1.0295607537932239, - -1.0110078430982656, - -1.0217477290303583 + -0.13278128970879577, + -0.14433471293373654, + -0.14787321638372558 ], "(0, 0, 1, 4, 1)": [ - -1.0198724273521527, - -1.0273376264121616, - -1.0372176976745933 + -0.1720169164100566, + -0.1697573068991259, + -0.18563861409468002 ], "(0, 1, 1, 4, 1)": [ - -0.8367514960793316, - -0.8072150440466215, - -0.7999324124740165 + -0.19331603592176078, + -0.16465692724409528, + -0.1870968740626517 ], - "(0, 0, 1, 5, 1)": [ - -2.826052632887979, - -2.8216800501972115, - -2.8339346737355218 + "(0, 1, 0, 4, 1)": [ + -0.16839244888515778, + -0.15548076071108868, + -0.15890884729639157 + ], + "(0, 0, 0, 4, 1)": [ + -0.16755688928521928, + -0.1598773466377167, + -0.17156379062820235 ], "(0, 1, 1, 5, 1)": [ - -2.769926115050464, - -2.7896094930838444, - -2.784544336312168 + -1.0698086689883646, + -1.095931248568509, + -1.1160177171578312 ], "(0, 1, 0, 5, 1)": [ - -2.7928766121585795, - -2.7887103458307694, - -2.7938313222414037 + -1.1027542984743757, + -1.0928909342292816, + -1.0833097769293856 ], "(0, 0, 0, 5, 1)": [ - -2.8104767031828572, - -2.8062208641671322, - -2.8101316497840574 + -1.088841306513128, + -1.1035400078582027, + -1.1176895277220635 ], - "(0, 0, 1, 2, 1)": [ - -0.5213427535062244, - -0.5910962186115551, - -0.47068284911064734 - ], - "(0, 0, 1, 0, 0)": [ - -0.41286468970384216, - -0.42684989269569895, - -169.29165129913554 - ], - "(0, 1, 0, 0, 0)": [ - -0.11933872055277986, - -0.1195010821067479, - -0.1499420269134481 - ], - "(0, 1, 1, 0, 0)": [ - -0.20624980702980253, - -0.22645535674627537, - -0.18943028486599597 + "(0, 0, 1, 5, 1)": [ + -1.0994216179219447, + -1.1237160556971877, + -1.1090547917156828 ] } } \ No newline at end of file diff --git a/scripts/use_q_ide.py b/scripts/use_q_ide.py index fa3c4c7..03c8e72 100644 --- a/scripts/use_q_ide.py +++ b/scripts/use_q_ide.py @@ -26,15 +26,15 @@ def do_use(kwargs: dict[str, Any]) -> None: render (str)='none': render mode of environment reward (float)=-0.1: reward limit at which episode is terminated file (str): Optional definition of model-save file - use_trained (bool): Use pre-trained data? + use_file (str): How 'file' is used (if exists): 'r', 'w', 'rw' episodes (int)=10000: nnumber of episodes run in the training steps (int)=5000: number of steps per episodes (if not terminated or truncated) - + t_fac (float)=0.001 """ if "dry-train" in kwargs: # Check training setup (over-write some parameters) - kwargs.update({"render": "plot", "file": None, "use_trained": False, "episodes": 10, "steps": 1000}) + kwargs.update({"render": "plot", "file": None, "use_file": 'r', "episodes": 10, "steps": 1000}) elif "dry_do" in kwargs: # Run a few episodes on trained data (file can be set by caller) - kwargs.update({"render": "plot", "use_trained": True, "episodes": 10, "steps": 1000}) + kwargs.update({"render": "plot", "use_file": 'r', "episodes": 10, "steps": 1000}) env = AntiPendulumEnv( build_crane, seed=1, @@ -43,31 +43,49 @@ def do_use(kwargs: dict[str, Any]) -> None: render_mode=kwargs.get("render", "none"), reward_limit=kwargs.get("reward", 0.0), discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), + reward_fac = (1.0, 0.0015,kwargs.get('t_fac',0.0)), ) filename = kwargs.get("file") if filename is not None: Path(filename).parent.mkdir(parents=True, exist_ok=True) - use_trained = kwargs.get("use_trained", False) - agent = QLearningAgent(env, filename=filename, use_trained=use_trained) + use_file = kwargs.get("use_file", 'r') + agent = QLearningAgent(env, filename=filename, use_file=use_file) agent.do_episodes(n_episodes=kwargs.get("episodes", 100), max_steps=kwargs.get("steps", 5000)) if filename is not None: LOGGER.info(f"Model saved to {filename}") if __name__ == "__main__": + # ruff: disable[ERA001] ## we intentionally work with commenting out lines here + def _args( base:dict[str,Any], upd:dict[str,Any])-> dict[str,Any]: + base.update(upd) + return base + models = Path(__file__).parent.resolve().parent / "models" - args = { + anti = { # anti-pendulum settings "v0": 1.0, "render": "none", "reward": 0.0, "file": models / "q_anti-pendulum.json", - "use_trained": True, + "use_file": 'rw', + "episodes": 1000, + "steps": 2000, + "t_fac":0.0, + } + pend = { # start pendulum settings + "v0": 0.0, + "render": "none", + "reward": 200.0, + "file": models / "q_pendulum.json", + "use_file": 'rw', "episodes": 1000, - "steps": 5000, + "steps": 2000, + "t_fac":0.0, } - # args.update({'episodes':6000, 'use_trained':True}) # noqa: ERA001 ## do a mayor training adding to data - args.update({"episodes": 10, "render": "plot"}) - # args.update({'dry-train':True,}) # noqa: ERA001 ## check the setup before a long training - # args.update({'dry_do':True}) # noqa: ERA001 + args = _args(anti, {'episodes':10}) # anti-pendulum training + # args = _args(pend, {'episodes':10000}) # pendulum training + # args = _args( anti, {"episodes": 10, "render": "plot","use_file":'r'}) # show anti-pendulum results + # args = _args( pend, {"episodes": 10, "render": "plot", "use_file":'r'}) # show start pendulum results + # args = args.update(_args(anti, {'dry-train':True,})) # check the setup before a long training do_use(args) diff --git a/src/crane_controller/envs/controlled_crane_pendulum.py b/src/crane_controller/envs/controlled_crane_pendulum.py index 78c6c69..6658ae1 100644 --- a/src/crane_controller/envs/controlled_crane_pendulum.py +++ b/src/crane_controller/envs/controlled_crane_pendulum.py @@ -87,6 +87,7 @@ class AntiPendulumEnv(gym.Env[AntiPendulumObs, int]): When provided, activates discrete observation mode with the given category boundaries. Expected keys: ``"angles"``, ``"pos"``, ``"speed"``, ``"distance"``, ``"sector"`` (default None). + reward_fac (tuple[float,...])=(1.0,0.0015,0.001): Weights between reward contributions """ metadata: ClassVar[dict[str, object]] = { # pyright: ignore[reportIncompatibleVariableOverride] # Gymnasium metadata typing is loose @@ -102,7 +103,7 @@ class AntiPendulumEnv(gym.Env[AntiPendulumObs, int]): "show-len-1": False, "x-max": None, } - + def __init__( # noqa: PLR0913 - environment API needs explicit parameters self, crane: Callable[..., Crane], @@ -487,3 +488,15 @@ def render(self) -> None: """Render the current episode.""" if self.render_mode == "play-back": # show the animation self.show_animation() + + def get_parameters(self) -> dict[str,Any]: + """Return the environment parameter settings as dict.""" + return { + 'wire-length':self.wire.length, + 'wire-q-factor':self.wire.q_factor, + 'reward-factors': self.reward_fac, + 'acceleration':self.acc, + 'step-size':self.dt, + 'observations-discretization':None if not hasattr(self,'discrete') else self.discrete, + 'reward_limit':self.reward_limit + } diff --git a/src/crane_controller/q_agent.py b/src/crane_controller/q_agent.py index fbf5529..ee26090 100644 --- a/src/crane_controller/q_agent.py +++ b/src/crane_controller/q_agent.py @@ -65,7 +65,7 @@ class QLearningAgent: discount_factor : float, optional How much to value future rewards, in the range [0, 1] (default 0.95). filename (Path): Optional path to filename for pre-trained data and saving of results - use_trained (bool) = False: load pre-trained values? + use_file (str) = 'r': How to use filename. 'r', 'w', 'rw'. File is not read when not found! """ DEFAULT_DISCRETE: ClassVar[dict[str, tuple[float | int, ...]]] = { @@ -81,11 +81,11 @@ def __init__( env: AntiPendulumEnv, learning_rate: float = 0.1, initial_epsilon: float = 1.0, + epsilon_decay:float = 1e-3, final_epsilon: float = 0.1, discount_factor: float = 0.95, filename: Path | None = None, - *, - use_trained: bool = False, + use_file: str = 'r', ) -> None: """Initialize the Q-learning agent. @@ -93,23 +93,20 @@ def __init__( """ self.env = env self.filename = Path(filename) if filename is not None else None - self.use_trained = use_trained + self.use_file = use_file self.q_values: defaultdict[tuple[int, ...], np.ndarray] - if self.use_trained and self.filename is not None and self.filename.exists(): - self.q_values = self.read_dumped(self.filename) - self.epsilon = final_epsilon # assume that we are fully learned - else: # start from scratch, but save the q_values afterwards - self.q_values = defaultdict(lambda: np.array((0.0,) * env.action_space.n, float)) # type: ignore[attr-defined,type-var] - self.epsilon = initial_epsilon # start from scratch self.lr = learning_rate self.discount_factor = discount_factor # How much we care about future rewards # Exploration parameters + self.epsilon = initial_epsilon + self.epsilon_decay = epsilon_decay self.final_epsilon = final_epsilon # Track learning progress self.training_error: list[float] = [] + self.previous_steps = 0 def analyse_q(self, obs: tuple[int, ...]) -> None: """Log Q-table entries matching an observation pattern. @@ -207,10 +204,13 @@ def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = Visualization mode - 0 for none, 1 for training summary, 2 for per-episode analysis (default 0). """ - if self.use_trained: + if 'r' in self.use_file and self.filename is not None and self.filename.exists(): + self.q_values = self.read_dumped(self.filename) logger.info("Starting %s episodes, using pre-trained values from %s", n_episodes, self.filename) - else: + else: # start from scratch + self.q_values = defaultdict(lambda: np.array((0.0,) * self.env.action_space.n, float)) # type: ignore[attr-defined,type-var] logger.info("Starting new training with %s episodes.", n_episodes) + start_time = dt.datetime.now(dt.UTC) total_steps = 0 for _episode in tqdm(range(n_episodes)): # Start a new episode @@ -233,13 +233,17 @@ def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = truncated |= nsteps > max_steps total_steps += nsteps # Reduce exploration rate (agent becomes less random over time): - self.epsilon = max(self.final_epsilon, self.epsilon - self.epsilon / (n_episodes / 2)) + self.epsilon = max(self.final_epsilon, self.epsilon - self.epsilon_decay) if show == SHOW_TRAINING_SUMMARY: self.analyse_training() - if self.filename: - self.dump_results(episodes=n_episodes, steps=total_steps) - - def dump_results(self, filename: str | Path = "", episodes: int = -1, steps: int = -1) -> None: + if self.filename and 'w' in self.use_file: + self.dump_results(episodes=n_episodes, steps=total_steps, start_time=start_time) + + def dump_results(self, + filename: str | Path = "", + episodes: int = -1, + steps: int = -1, + start_time:dt.datetime|None=None) -> None: """Dump the Q-values to a JSON file. Args: @@ -247,6 +251,7 @@ def dump_results(self, filename: str | Path = "", episodes: int = -1, steps: int When empty, the filename provided at construction time is used (default ""). episodes (int): the number of episodes which have been run steps (int): the limiting number of steps per episode + start_time (dt.datetime): clock-time when the training started """ if not filename: # automatic file name if self.filename is None: @@ -259,20 +264,21 @@ def dump_results(self, filename: str | Path = "", episodes: int = -1, steps: int converted: dict[str, list[float]] = {} for k, v in self.q_values.items(): converted |= {str(k): list(v)} + env_parameters = { k:str(v) for k,v in self.env.get_parameters().items()} content = { - "date": dt.datetime.now(dt.UTC).strftime("%d.%m.%Y %H:%M:%S"), - "pendulum": { - "start_speed": str(self.env.start_speed), - "render_mode": str(self.env.render_mode), - "reward_limit": str(self.env.reward_limit), - }, + "start-training":"unknown" if start_time is None else start_time.strftime("%d.%m.%Y %H:%M:%S"), + "end-training": dt.datetime.now(dt.UTC).strftime("%d.%m.%Y %H:%M:%S"), + "pendulum": env_parameters, "q_agent": { - "use_trained": str(self.use_trained), "filename": str(self.filename), + "use_file": self.use_file, "episodes": str(episodes), - "steps": str(steps), + "steps": str(steps+self.previous_steps), "learning_rate": str(self.lr), "discount_factor": str(self.discount_factor), + "epsilon-decay":str(self.epsilon_decay), + "final-epsilon":str(self.final_epsilon), + "epsilon":str(self.epsilon), }, "q_values": converted, } @@ -296,6 +302,8 @@ def read_dumped(self, filename: str | Path) -> defaultdict[tuple[int, ...], np.n path = Path(filename) with path.open(encoding="utf-8") as _f: from_dump = json.load(_f) + self.previous_steps = int(from_dump["q_agent"]["steps"]) + self.epsilon = float(from_dump["q_agent"].get("epsilon", 1.0)) q_values: defaultdict[tuple[int, ...], np.ndarray] = defaultdict( lambda: np.array((0.0,) * self.env.action_space.n, float) # type: ignore[attr-defined,type-var] ) From 8d5cc936266ac1b9e0295a189f8502d36dcc1c8c Mon Sep 17 00:00:00 2001 From: Eisinger Date: Thu, 30 Apr 2026 10:55:21 +0200 Subject: [PATCH 02/11] Fixed quality issues --- scripts/use_q_ide.py | 30 +++++++++--------- .../envs/controlled_crane_pendulum.py | 22 ++++++------- src/crane_controller/q_agent.py | 31 +++++++++---------- tests/test_q.py | 6 ++-- 4 files changed, 44 insertions(+), 45 deletions(-) diff --git a/scripts/use_q_ide.py b/scripts/use_q_ide.py index 03c8e72..4edb17e 100644 --- a/scripts/use_q_ide.py +++ b/scripts/use_q_ide.py @@ -32,9 +32,9 @@ def do_use(kwargs: dict[str, Any]) -> None: t_fac (float)=0.001 """ if "dry-train" in kwargs: # Check training setup (over-write some parameters) - kwargs.update({"render": "plot", "file": None, "use_file": 'r', "episodes": 10, "steps": 1000}) + kwargs.update({"render": "plot", "file": None, "use_file": "r", "episodes": 10, "steps": 1000}) elif "dry_do" in kwargs: # Run a few episodes on trained data (file can be set by caller) - kwargs.update({"render": "plot", "use_file": 'r', "episodes": 10, "steps": 1000}) + kwargs.update({"render": "plot", "use_file": "r", "episodes": 10, "steps": 1000}) env = AntiPendulumEnv( build_crane, seed=1, @@ -43,13 +43,13 @@ def do_use(kwargs: dict[str, Any]) -> None: render_mode=kwargs.get("render", "none"), reward_limit=kwargs.get("reward", 0.0), discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), - reward_fac = (1.0, 0.0015,kwargs.get('t_fac',0.0)), + reward_fac=(1.0, 0.0015, kwargs.get("t_fac", 0.0)), ) filename = kwargs.get("file") if filename is not None: Path(filename).parent.mkdir(parents=True, exist_ok=True) - use_file = kwargs.get("use_file", 'r') + use_file = kwargs.get("use_file", "r") agent = QLearningAgent(env, filename=filename, use_file=use_file) agent.do_episodes(n_episodes=kwargs.get("episodes", 100), max_steps=kwargs.get("steps", 5000)) if filename is not None: @@ -57,35 +57,37 @@ def do_use(kwargs: dict[str, Any]) -> None: if __name__ == "__main__": - # ruff: disable[ERA001] ## we intentionally work with commenting out lines here - def _args( base:dict[str,Any], upd:dict[str,Any])-> dict[str,Any]: + + def _args(base: dict[str, Any], upd: dict[str, Any]) -> dict[str, Any]: base.update(upd) return base - + models = Path(__file__).parent.resolve().parent / "models" - anti = { # anti-pendulum settings + anti = { # anti-pendulum settings "v0": 1.0, "render": "none", "reward": 0.0, "file": models / "q_anti-pendulum.json", - "use_file": 'rw', + "use_file": "rw", "episodes": 1000, "steps": 2000, - "t_fac":0.0, + "t_fac": 0.0, } - pend = { # start pendulum settings + pend = { # start pendulum settings "v0": 0.0, "render": "none", "reward": 200.0, "file": models / "q_pendulum.json", - "use_file": 'rw', + "use_file": "rw", "episodes": 1000, "steps": 2000, - "t_fac":0.0, + "t_fac": 0.0, } - args = _args(anti, {'episodes':10}) # anti-pendulum training + # ruff: disable[ERA001] ## we intentionally work with commenting out lines here + args = _args(anti, {"episodes": 10}) # anti-pendulum training # args = _args(pend, {'episodes':10000}) # pendulum training # args = _args( anti, {"episodes": 10, "render": "plot","use_file":'r'}) # show anti-pendulum results # args = _args( pend, {"episodes": 10, "render": "plot", "use_file":'r'}) # show start pendulum results # args = args.update(_args(anti, {'dry-train':True,})) # check the setup before a long training + # ruff: enable[ERA001] do_use(args) diff --git a/src/crane_controller/envs/controlled_crane_pendulum.py b/src/crane_controller/envs/controlled_crane_pendulum.py index 09454fe..49f5ff2 100644 --- a/src/crane_controller/envs/controlled_crane_pendulum.py +++ b/src/crane_controller/envs/controlled_crane_pendulum.py @@ -5,7 +5,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING, ClassVar +from typing import TYPE_CHECKING, Any, ClassVar import gymnasium as gym import matplotlib.pyplot as plt @@ -103,7 +103,7 @@ class AntiPendulumEnv(gym.Env[AntiPendulumObs, int]): "show-len-1": False, "x-max": None, } - + def __init__( # noqa: PLR0913 - environment API needs explicit parameters self, crane: Callable[..., Crane], @@ -495,14 +495,14 @@ def render(self) -> None: elif self.render_mode == "plot": self.show_plot(self.nresets) - def get_parameters(self) -> dict[str,Any]: + def get_parameters(self) -> dict[str, Any]: """Return the environment parameter settings as dict.""" return { - 'wire-length':self.wire.length, - 'wire-q-factor':self.wire.q_factor, - 'reward-factors': self.reward_fac, - 'acceleration':self.acc, - 'step-size':self.dt, - 'observations-discretization':None if not hasattr(self,'discrete') else self.discrete, - 'reward_limit':self.reward_limit - } + "wire-length": self.wire.length, + "wire-q-factor": self.wire.q_factor, + "reward-factors": self.reward_fac, + "acceleration": self.acc, + "step-size": self.dt, + "observations-discretization": None if not hasattr(self, "discrete") else self.discrete, + "reward_limit": self.reward_limit, + } diff --git a/src/crane_controller/q_agent.py b/src/crane_controller/q_agent.py index ee26090..dd115f7 100644 --- a/src/crane_controller/q_agent.py +++ b/src/crane_controller/q_agent.py @@ -80,12 +80,11 @@ def __init__( self, env: AntiPendulumEnv, learning_rate: float = 0.1, - initial_epsilon: float = 1.0, - epsilon_decay:float = 1e-3, + epsilon_decay: float = 1e-3, final_epsilon: float = 0.1, discount_factor: float = 0.95, filename: Path | None = None, - use_file: str = 'r', + use_file: str = "r", ) -> None: """Initialize the Q-learning agent. @@ -100,7 +99,7 @@ def __init__( self.discount_factor = discount_factor # How much we care about future rewards # Exploration parameters - self.epsilon = initial_epsilon + self.epsilon = 1.0 self.epsilon_decay = epsilon_decay self.final_epsilon = final_epsilon @@ -204,7 +203,7 @@ def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = Visualization mode - 0 for none, 1 for training summary, 2 for per-episode analysis (default 0). """ - if 'r' in self.use_file and self.filename is not None and self.filename.exists(): + if "r" in self.use_file and self.filename is not None and self.filename.exists(): self.q_values = self.read_dumped(self.filename) logger.info("Starting %s episodes, using pre-trained values from %s", n_episodes, self.filename) else: # start from scratch @@ -236,14 +235,12 @@ def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = self.epsilon = max(self.final_epsilon, self.epsilon - self.epsilon_decay) if show == SHOW_TRAINING_SUMMARY: self.analyse_training() - if self.filename and 'w' in self.use_file: + if self.filename and "w" in self.use_file: self.dump_results(episodes=n_episodes, steps=total_steps, start_time=start_time) - def dump_results(self, - filename: str | Path = "", - episodes: int = -1, - steps: int = -1, - start_time:dt.datetime|None=None) -> None: + def dump_results( + self, filename: str | Path = "", episodes: int = -1, steps: int = -1, start_time: dt.datetime | None = None + ) -> None: """Dump the Q-values to a JSON file. Args: @@ -264,21 +261,21 @@ def dump_results(self, converted: dict[str, list[float]] = {} for k, v in self.q_values.items(): converted |= {str(k): list(v)} - env_parameters = { k:str(v) for k,v in self.env.get_parameters().items()} + env_parameters = {k: str(v) for k, v in self.env.get_parameters().items()} content = { - "start-training":"unknown" if start_time is None else start_time.strftime("%d.%m.%Y %H:%M:%S"), + "start-training": "unknown" if start_time is None else start_time.strftime("%d.%m.%Y %H:%M:%S"), "end-training": dt.datetime.now(dt.UTC).strftime("%d.%m.%Y %H:%M:%S"), "pendulum": env_parameters, "q_agent": { "filename": str(self.filename), "use_file": self.use_file, "episodes": str(episodes), - "steps": str(steps+self.previous_steps), + "steps": str(steps + self.previous_steps), "learning_rate": str(self.lr), "discount_factor": str(self.discount_factor), - "epsilon-decay":str(self.epsilon_decay), - "final-epsilon":str(self.final_epsilon), - "epsilon":str(self.epsilon), + "epsilon-decay": str(self.epsilon_decay), + "final-epsilon": str(self.final_epsilon), + "epsilon": str(self.epsilon), }, "q_values": converted, } diff --git a/tests/test_q.py b/tests/test_q.py index 832621d..fd6fa05 100644 --- a/tests/test_q.py +++ b/tests/test_q.py @@ -32,7 +32,7 @@ def test_q_analyse(crane: Callable[..., Crane], *, show: bool) -> None: crane, discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), ) - agent = QLearningAgent(env, filename=Path("q_trained.json"), use_trained=True) + agent = QLearningAgent(env, filename=Path("q_trained.json"), use_file='r') for k, v in agent.q_values.items(): assert len(k) == 5, len(v) == 3 for pos in (0, 1): @@ -57,12 +57,12 @@ def test_intervals(crane: Callable[..., Crane]): discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), ) - agent = QLearningAgent(env, filename=save_path, use_trained=False) + agent = QLearningAgent(env, filename=save_path, use_file='w') for i in range(10): _ = env.reset(seed=i + 1) agent.do_episodes(n_episodes=2, max_steps=100) if i == 0: - agent = QLearningAgent(env, filename=save_path, use_trained=True) + agent = QLearningAgent(env, filename=save_path, use_file='rw') logger.info(f"Model saved to {save_path}") From 7578bb9ded864026f04b60ed65702239407e6914 Mon Sep 17 00:00:00 2001 From: Eisinger Date: Thu, 30 Apr 2026 12:37:23 +0200 Subject: [PATCH 03/11] Fixed remaining quality issues --- models/q_pendulum.json | 1258 +++++++++++++++++++++++++++++++ src/crane_controller/q_agent.py | 25 +- tests/test_q.py | 10 +- 3 files changed, 1281 insertions(+), 12 deletions(-) create mode 100644 models/q_pendulum.json diff --git a/models/q_pendulum.json b/models/q_pendulum.json new file mode 100644 index 0000000..24b3925 --- /dev/null +++ b/models/q_pendulum.json @@ -0,0 +1,1258 @@ +{ + "date": "30.04.2026 05:15:03", + "pendulum": { + "start_speed": "0.0", + "render_mode": "none", + "reward_limit": "1000.0" + }, + "q_agent": { + "use_trained": "True", + "filename": "/home/se/osp/packages/crane-controller/models/q_pendulum.json", + "episodes": "10000", + "steps": "19991482", + "learning_rate": "0.1", + "discount_factor": "0.95" + }, + "q_values": { + "(1, 0, 0, 1, 1)": [ + -0.0015285453382582262, + -0.0019110699513047503, + -0.000421685773718873 + ], + "(1, 0, 0, 0, 0)": [ + 0.0016483778628561532, + 0.0009174558585016858, + 0.0001847120557717193 + ], + "(1, 1, 1, 1, 0)": [ + -0.00011618763900436013, + 0.0021056726444264756, + -0.0009250088093969632 + ], + "(2, 0, 0, 1, 1)": [ + 0.30381525310187946, + 0.13268574959167037, + 0.08968956867959964 + ], + "(2, 0, 1, 1, 1)": [ + 0.07021166494175266, + 0.11544068028302096, + 0.2655879939625879 + ], + "(2, 1, 1, 2, 1)": [ + 0.0468700802191448, + 0.24296967824838114, + 0.057465378203944484 + ], + "(2, 1, 0, 2, 1)": [ + 0.247316722251548, + 0.07724841470718162, + 0.04444885410818501 + ], + "(2, 0, 0, 2, 1)": [ + 0.03151075349886775, + 0.1198098266764795, + 0.026761926901275757 + ], + "(2, 0, 0, 3, 1)": [ + 0.24750790139852671, + -0.00742543468925339, + 0.003439802770232106 + ], + "(2, 0, 1, 3, 1)": [ + 0.013165205849978824, + 0.020782332264133313, + 0.16600804643720815 + ], + "(2, 1, 1, 3, 1)": [ + 0.006877018618653728, + 0.017372356548709385, + 0.1822037784645431 + ], + "(2, 1, 0, 3, 1)": [ + 0.011260461429967967, + -0.06408511029671254, + 0.16832760241231254 + ], + "(2, 1, 0, 4, 1)": [ + 0.30877072872600403, + 0.17712588766549373, + -0.11992985889469697 + ], + "(2, 0, 0, 4, 1)": [ + 0.07171333312506538, + 0.3196709073875426, + -0.010305375893922684 + ], + "(2, 0, 1, 4, 1)": [ + 0.0460495219813757, + -0.025981954700818086, + 0.35798806472060796 + ], + "(2, 1, 1, 4, 1)": [ + 0.28024071171042864, + -0.08081625384759063, + -0.06021051977246365 + ], + "(2, 0, 1, 5, 1)": [ + 0.11199272160151952, + 0.34003948184320887, + 0.15555212679650068 + ], + "(2, 1, 1, 5, 1)": [ + -0.06388301321252567, + -0.27230305038177305, + 0.3227408520413516 + ], + "(2, 1, 0, 5, 1)": [ + 0.33544847358707, + -0.014778838303531092, + -0.13036007932481597 + ], + "(2, 0, 0, 5, 1)": [ + 0.3368562070401561, + -0.06442413772899995, + 0.015851813972102308 + ], + "(1, 1, 1, 5, 1)": [ + -0.873610573166523, + -0.8795035200229879, + -0.8813170678799008 + ], + "(1, 1, 0, 5, 1)": [ + -0.8588580712968287, + -0.8603630825591916, + -0.8545640919171729 + ], + "(1, 0, 0, 5, 1)": [ + -0.876058331400781, + -0.8812733294953802, + -0.8781109627654614 + ], + "(1, 0, 1, 5, 1)": [ + -0.8754681221299438, + -0.8811483806653537, + -0.8795342715024759 + ], + "(2, 1, 1, 1, 1)": [ + 0.2575141349768899, + 0.14721086451092427, + 0.13938193635472462 + ], + "(2, 0, 1, 2, 1)": [ + 0.049090745483137355, + 0.035345162836350655, + 0.1850890582095332 + ], + "(3, 0, 0, 3, 1)": [ + 0.408660876661018, + 0.42698247924321825, + 0.40792534233546174 + ], + "(3, 0, 1, 3, 1)": [ + 0.3600676621922624, + 0.3929021532144681, + 0.461063559575569 + ], + "(3, 1, 1, 3, 1)": [ + 0.43092477422897313, + 0.4760286469676715, + 0.5329087094566657 + ], + "(3, 1, 0, 3, 1)": [ + 0.4099435292952729, + 0.43676458251571, + 0.5251269059135935 + ], + "(3, 0, 0, 4, 1)": [ + 0.4048621627470891, + 0.4066271465074262, + 0.4043352559362854 + ], + "(3, 0, 1, 4, 1)": [ + 0.39328686645976846, + 0.39556738781196227, + 0.3959743788190199 + ], + "(3, 1, 0, 5, 1)": [ + 0.2918677426270124, + 0.2808605809982236, + 0.3364418740886684 + ], + "(3, 0, 0, 5, 1)": [ + 0.015025569672587752, + 0.08196942899783732, + 0.3327158807318435 + ], + "(3, 0, 1, 5, 1)": [ + 0.15452953096605598, + 0.32706016277878186, + 0.19602635793745557 + ], + "(2, 1, 0, 1, 1)": [ + 0.28308955078023956, + 0.16197169711955506, + 0.11997498874359913 + ], + "(3, 1, 1, 5, 1)": [ + 0.04055530756891616, + 0.2713994534576125, + 0.39683102819432226 + ], + "(4, 0, 0, 5, 1)": [ + 4.061952905462236, + 1.8796422036374005, + 2.6392271976381876 + ], + "(4, 0, 1, 5, 1)": [ + 1.8612065508222904, + 2.103909066858137, + 4.240572243261516 + ], + "(4, 1, 1, 5, 1)": [ + 2.7147234118909207, + 4.2477919190765006, + 2.532801305018678 + ], + "(4, 1, 0, 5, 1)": [ + 5.335646400509759, + 2.3417395159744956, + 2.8731429101445904 + ], + "(1, 0, 1, 1, 1)": [ + -0.003409519735202579, + -0.0013383819217571565, + 0.0002056980625474665 + ], + "(3, 1, 1, 4, 1)": [ + 0.38529100751464557, + 0.3942557035549322, + 0.4431156152070642 + ], + "(3, 0, 0, 2, 1)": [ + 0.5090782560731483, + 0.4798070339288543, + 0.4440706186764382 + ], + "(3, 0, 1, 2, 1)": [ + 0.4031617038672731, + 0.41820257002525474, + 0.4254288577893825 + ], + "(3, 1, 0, 2, 1)": [ + 0.5383778912624413, + 0.5816045650663727, + 0.44907309167118936 + ], + "(3, 0, 0, 1, 1)": [ + 0.3820396000856337, + 0.4244240876422671, + 0.4809947245965916 + ], + "(3, 0, 1, 1, 1)": [ + 0.48309577607918963, + 0.4359746680582087, + 0.47844205657321176 + ], + "(3, 1, 1, 2, 1)": [ + 0.4510595166267413, + 0.5413951132995184, + 0.5396546938623438 + ], + "(3, 1, 0, 4, 1)": [ + 0.4911755694970669, + 0.4273041013300876, + 0.4113438183162773 + ], + "(3, 1, 0, 1, 1)": [ + 0.41206946560587604, + 0.4276691064016972, + 0.3891151329059017 + ], + "(3, 0, 0, 1, 0)": [ + 0.595092804268447, + 0.5709074723626882, + 0.4357015522877032 + ], + "(3, 0, 1, 1, 0)": [ + 0.5048087137826464, + 0.5131171175030076, + 0.5824969529639638 + ], + "(2, 0, 1, 1, 0)": [ + 0.16890785501899347, + 0.07849898959202127, + 0.13065691356841727 + ], + "(2, 1, 1, 1, 0)": [ + -0.0019192156044434555, + 0.11937402910019926, + 0.06218611939997548 + ], + "(2, 1, 0, 1, 0)": [ + 0.15656530313154501, + 0.05852070858351637, + 0.05917317431102258 + ], + "(2, 0, 0, 1, 0)": [ + 0.11925737271077642, + 0.06270232978106371, + 0.016145004918409697 + ], + "(3, 1, 1, 1, 1)": [ + 0.415554313371666, + 0.4251120871709033, + 0.41738534617858564 + ], + "(3, 1, 0, 1, 0)": [ + 0.5175638162159195, + 0.4768692444308892, + 0.4092874554117059 + ], + "(1, 1, 0, 1, 0)": [ + 0.007559388663013664, + -0.07141246975944493, + -0.03218011823701119 + ], + "(1, 1, 1, 1, 1)": [ + -0.006336313500421211, + -0.00722006182105164, + -0.015438778111669823 + ], + "(1, 1, 0, 1, 1)": [ + -0.011637555446352072, + -0.03469500547718182, + -0.06946810336387721 + ], + "(1, 1, 0, 2, 1)": [ + -0.02059287808812973, + -0.020207666113278937, + -0.023751195001154267 + ], + "(1, 0, 0, 2, 1)": [ + -0.03136891469721944, + -0.018845272510248604, + -0.025639212801306065 + ], + "(2, 0, 0, 2, 0)": [ + -0.007405306099820059, + 0.13416722893659513, + -0.003863979660054713 + ], + "(3, 0, 0, 2, 0)": [ + 0.4968529980315005, + 0.6083878273580536, + 0.5107250954251326 + ], + "(3, 0, 1, 2, 0)": [ + 0.4572105904076367, + 0.48251636216964044, + 0.5371402979328573 + ], + "(3, 1, 1, 2, 0)": [ + 0.5834210121161674, + 0.5447607381569435, + 0.6522461652145303 + ], + "(3, 1, 1, 3, 0)": [ + 0.4515300417767746, + 0.45066875186289224, + 0.6830079417945389 + ], + "(3, 1, 0, 3, 0)": [ + 0.5338016897375181, + 0.5414142734086245, + 0.6346264676956274 + ], + "(3, 0, 0, 3, 0)": [ + 0.561690114055678, + 0.5920536892988973, + 0.5543067752647609 + ], + "(3, 0, 1, 3, 0)": [ + 0.5489920980754698, + 0.5660011505184062, + 0.5167225836179886 + ], + "(2, 1, 1, 3, 0)": [ + 0.1494485963494498, + -0.03830396513846329, + 0.015657549848606813 + ], + "(2, 1, 0, 3, 0)": [ + 0.20593271843361607, + 0.09479740257152519, + 0.0959316384523621 + ], + "(2, 1, 0, 2, 0)": [ + 0.13616448787873342, + 0.019560267471690474, + -0.005724736049839602 + ], + "(3, 1, 0, 2, 0)": [ + 0.683590879589438, + 0.5526158769509005, + 0.46954602590689115 + ], + "(1, 0, 0, 1, 0)": [ + 0.03733255481235882, + -0.02849128758664682, + -0.09589936241358511 + ], + "(1, 1, 1, 2, 1)": [ + -0.006083016288581055, + -0.03523377742840035, + -0.019203666274691625 + ], + "(1, 0, 1, 2, 1)": [ + -0.01686144825783039, + -0.008924069806829863, + 0.009536322538022453 + ], + "(1, 0, 1, 3, 1)": [ + -0.034434632147796705, + 0.00024112079172242465, + -0.03197066856336422 + ], + "(1, 1, 1, 3, 1)": [ + -0.01895592863353697, + -0.04411521018370294, + 0.01775191105812379 + ], + "(1, 1, 0, 3, 1)": [ + 0.04225706506102414, + -0.0367929078115716, + -0.04368072481979268 + ], + "(1, 0, 0, 3, 1)": [ + -0.007437638387498356, + -0.044450404397953926, + -0.04469796462300711 + ], + "(1, 1, 1, 4, 1)": [ + -0.09646741076342318, + -0.09875923262296923, + -0.07611277807180256 + ], + "(1, 1, 0, 4, 1)": [ + 0.004840534632955751, + -0.09842756570162219, + -0.09016058064434311 + ], + "(1, 0, 0, 4, 1)": [ + -0.09004032812642203, + -0.07791186134035129, + -0.09719535819232616 + ], + "(1, 0, 1, 4, 1)": [ + -0.05966874855523139, + 0.00806343851278417, + -0.0359359869255538 + ], + "(1, 0, 1, 1, 0)": [ + -0.020070667836140862, + -0.00023703353233769307, + -0.019699742890545824 + ], + "(1, 0, 1, 2, 0)": [ + -0.08614089449335621, + -0.07468383088946322, + -0.028281994617095248 + ], + "(1, 1, 1, 2, 0)": [ + -0.020887757859586534, + -0.05007737176424587, + 0.013443648795931901 + ], + "(1, 1, 0, 2, 0)": [ + -0.25387563088246234, + -0.008011626613088369, + -0.18283538351700016 + ], + "(1, 1, 0, 3, 0)": [ + -0.07464578664914494, + -0.043449407581580696, + -0.11463260589847274 + ], + "(1, 0, 0, 3, 0)": [ + -0.14350968802347358, + -0.04083978797784146, + -0.09909284163171486 + ], + "(1, 0, 1, 3, 0)": [ + -0.1370625750166114, + -0.0724585837043522, + -0.0009240473895465921 + ], + "(1, 1, 1, 3, 0)": [ + -0.03626126792752658, + -0.03710154477294096, + 0.0032683572316288146 + ], + "(1, 0, 1, 4, 0)": [ + 0.0014061010064767788, + -0.04452670073239082, + -0.07821196453222311 + ], + "(1, 1, 1, 4, 0)": [ + -0.17474951197312322, + -0.5414578832524665, + -0.22510473565580394 + ], + "(1, 1, 0, 4, 0)": [ + -0.1328897390182134, + -0.034781929591368305, + -0.16080111281963685 + ], + "(1, 0, 0, 4, 0)": [ + -0.1475330350868065, + -0.18227419935411793, + 0.001484675759361425 + ], + "(1, 0, 0, 5, 0)": [ + -0.9545247785708878, + -0.9514659970621401, + -0.90452487601084 + ], + "(1, 0, 1, 5, 0)": [ + -0.8391556754298948, + -0.7701522287778763, + -0.8233480591505404 + ], + "(1, 1, 1, 5, 0)": [ + -1.093243461459317, + -1.1130313370385934, + -1.117598650488551 + ], + "(1, 1, 0, 5, 0)": [ + -1.060052207589391, + -1.0520482450609705, + -1.0541775063616219 + ], + "(2, 0, 1, 2, 0)": [ + 0.0019578641658367663, + 0.025663384896343185, + 0.1263307771397902 + ], + "(2, 0, 1, 3, 0)": [ + 0.023588571331503803, + 0.12134317356917385, + 0.2760718263547822 + ], + "(2, 0, 0, 3, 0)": [ + 0.1161666059796964, + 0.2235732549534617, + 0.07430355449847614 + ], + "(2, 1, 1, 2, 0)": [ + 0.03458905003176114, + 0.0007093755508323987, + 0.17288176348599543 + ], + "(1, 0, 1, 0, 0)": [ + 0.0011937985794666583, + 0.0006577923193096143, + -8.048310965484833e-05 + ], + "(1, 1, 1, 0, 0)": [ + 0.0015724376946350388, + 0.0007011948995402796, + -7.399361560918754e-05 + ], + "(2, 0, 0, 4, 0)": [ + -0.05649924448818272, + -0.09895201781380289, + 0.010597525817515366 + ], + "(2, 0, 1, 4, 0)": [ + -0.08358002678014068, + -0.09810695789263416, + -0.00041284702559314396 + ], + "(2, 1, 1, 4, 0)": [ + 0.09217839560450072, + -0.017320517480429995, + -0.03878804552748378 + ], + "(2, 1, 0, 4, 0)": [ + 0.1925844035349752, + 0.012835236335966602, + -0.042144040424107326 + ], + "(2, 1, 0, 5, 0)": [ + -1.4444514200032612, + -1.445392257262375, + -1.4481597245532174 + ], + "(2, 0, 0, 5, 0)": [ + -1.4712160523544338, + -1.470824695284624, + -1.3327809396730481 + ], + "(2, 0, 1, 5, 0)": [ + -1.4469254687808646, + -1.5299065594273575, + -1.5281209393177229 + ], + "(2, 1, 1, 5, 0)": [ + -1.3128182215345525, + -1.4477609597552596, + -1.4392818680144006 + ], + "(3, 1, 1, 1, 0)": [ + 0.45806194208553763, + 0.46093042135097084, + 0.474475379606745 + ], + "(4, 0, 1, 4, 1)": [ + 1.4164846977098555, + 1.4459868052131215, + 1.4616804923252622 + ], + "(4, 1, 1, 4, 1)": [ + 1.4129498511120588, + 1.4025285190325392, + 1.4393948253927626 + ], + "(1, 1, 0, 0, 0)": [ + 0.0010373859416610812, + 0.0011703526531334982, + 0.0007493443523265281 + ], + "(1, 0, 0, 2, 0)": [ + -0.10532136935062486, + -0.03584791600007468, + -0.11854695228463348 + ], + "(3, 0, 1, 5, 0)": [ + 0.02285934492582601, + -0.07103977867880287, + 0.019668059978482654 + ], + "(3, 1, 1, 5, 0)": [ + 0.03469354291860075, + 0.044038976296537, + 0.013242232441255847 + ], + "(3, 1, 0, 5, 0)": [ + -0.020181802884764344, + 0.06649176778651363, + 0.06509248190323355 + ], + "(3, 0, 0, 5, 0)": [ + 0.028824321631020555, + 0.029977268479488877, + 0.026545109024266954 + ], + "(3, 1, 0, 4, 0)": [ + 0.6296155314616831, + 0.4336608270212875, + 0.39276605272085297 + ], + "(3, 0, 0, 4, 0)": [ + 0.7770847854086554, + 0.5242727900048311, + 0.5206170117506856 + ], + "(3, 0, 1, 4, 0)": [ + 0.5314214160012682, + 0.7844820846414253, + 0.5074484536943829 + ], + "(3, 1, 1, 4, 0)": [ + 0.3754666321452126, + 0.7229753308135625, + 0.3995770969535575 + ], + "(4, 1, 0, 4, 1)": [ + 1.4963873160873034, + 1.467341373698872, + 1.4384319896246058 + ], + "(4, 1, 0, 3, 1)": [ + 1.5752245110522871, + 1.5602010532290964, + 1.492566856395298 + ], + "(4, 0, 0, 3, 1)": [ + 1.519151228092836, + 1.5227125117824454, + 1.4903275891051206 + ], + "(4, 0, 0, 4, 1)": [ + 1.6473288659015743, + 1.7275422975605321, + 1.5048793902151347 + ], + "(4, 0, 1, 3, 1)": [ + 1.4129889090497951, + 1.452240570193209, + 1.4625105948676116 + ], + "(4, 1, 1, 3, 1)": [ + 1.4646407295985004, + 1.4732073804218064, + 1.511095490878426 + ], + "(4, 1, 0, 2, 1)": [ + 2.106400147645301, + 1.6356823386754527, + 1.6995586432240426 + ], + "(4, 0, 0, 2, 1)": [ + 2.161395368605027, + 1.5237311046844422, + 1.8173060474051923 + ], + "(4, 0, 0, 1, 1)": [ + 2.3493776509278357, + 1.7130386451873514, + 1.8850438496049542 + ], + "(4, 0, 1, 1, 1)": [ + 2.1151543614085875, + 1.6543782490876844, + 2.2703735803195966 + ], + "(4, 1, 1, 1, 1)": [ + 1.918925083602411, + 1.74973854680099, + 2.5088229704031644 + ], + "(4, 1, 1, 1, 0)": [ + 1.7371298756417777, + 1.962531149214229, + 2.264878889586818 + ], + "(4, 1, 0, 1, 0)": [ + 2.020061243093679, + 1.8524421509129365, + 1.9286353167781694 + ], + "(4, 0, 0, 1, 0)": [ + 1.6817658822452428, + 1.6421444458419396, + 2.3586227153499326 + ], + "(4, 0, 1, 1, 0)": [ + 1.78836241223083, + 1.848369564939383, + 2.453235378342548 + ], + "(4, 0, 1, 2, 1)": [ + 1.5272002349823173, + 1.774756715807296, + 2.2631339867701725 + ], + "(4, 1, 0, 1, 1)": [ + 1.9677313784165418, + 2.433707323529033, + 1.7422610937368759 + ], + "(4, 1, 1, 2, 1)": [ + 1.490825730025895, + 1.6990871895059803, + 2.1039556756595323 + ], + "(5, 1, 0, 5, 1)": [ + 6.123750372525588, + 8.70575880253172, + 6.260498065482083 + ], + "(5, 0, 0, 5, 1)": [ + 7.308611772562493, + 5.240209399773695, + 5.920309823658606 + ], + "(5, 0, 1, 5, 1)": [ + 6.96203305289973, + 4.890002993836127, + 11.78691576141891 + ], + "(5, 1, 1, 5, 1)": [ + 6.713821193839766, + 9.316098624644017, + 5.311107957816669 + ], + "(6, 1, 1, 5, 1)": [ + 15.047660106650373, + 16.821457503565934, + 27.71374620203335 + ], + "(6, 1, 0, 5, 1)": [ + 16.384453849684327, + 28.353343581666334, + 20.687843932731177 + ], + "(6, 0, 0, 5, 1)": [ + 30.01197247830154, + 18.86235490305763, + 19.344672586909752 + ], + "(6, 0, 1, 5, 1)": [ + 26.558921440960397, + 18.868850427579066, + 16.828520283531955 + ], + "(4, 0, 1, 3, 0)": [ + 2.1925640020257102, + 2.95691906279798, + 3.4723878527181853 + ], + "(4, 1, 1, 3, 0)": [ + 2.198797063712139, + 2.21724652824473, + 4.963837212356006 + ], + "(4, 1, 0, 3, 0)": [ + 3.886035854924468, + 2.4084368048531406, + 2.8785873750775908 + ], + "(4, 0, 0, 3, 0)": [ + 2.4390869073407133, + 3.1202053796624596, + 3.440342237225939 + ], + "(4, 1, 1, 2, 0)": [ + 1.7198249761230124, + 1.7264336589470106, + 2.55030041839504 + ], + "(4, 1, 0, 2, 0)": [ + 2.857534274934687, + 1.8560661471861224, + 1.7892755484782197 + ], + "(4, 1, 0, 4, 0)": [ + 5.208515876962349, + 4.076311172617219, + 3.1256266560673907 + ], + "(4, 0, 0, 4, 0)": [ + 5.359684776234321, + 2.8072297945126206, + 3.9345761324135915 + ], + "(4, 0, 1, 4, 0)": [ + 3.2715111780893653, + 5.189496212005362, + 4.395806899462235 + ], + "(4, 1, 1, 4, 0)": [ + 3.536815804580715, + 3.9015860629086827, + 5.135748652698586 + ], + "(4, 0, 1, 5, 0)": [ + -0.8730882647726272, + -0.8192135917755976, + -0.8542523954122301 + ], + "(4, 1, 1, 5, 0)": [ + -0.8245347871065521, + -0.8326455650944975, + 0.9991824483293552 + ], + "(4, 0, 1, 2, 0)": [ + 1.9753930346045618, + 1.9649213400482635, + 1.9809836107767345 + ], + "(4, 1, 0, 5, 0)": [ + -0.6336931013817524, + 1.110335983119446, + 0.010250432901592221 + ], + "(4, 0, 0, 5, 0)": [ + -0.5955443430025976, + -0.5479728074067413, + -0.5137459310071231 + ], + "(4, 0, 0, 2, 0)": [ + 2.306030089074062, + 2.0513914882428184, + 1.7358723965792504 + ], + "(5, 0, 1, 2, 1)": [ + 5.938331314830866, + 5.923671010454649, + 6.322198810091958 + ], + "(5, 0, 1, 1, 1)": [ + 6.3713621509072205, + 4.278415316748207, + 5.217314857720529 + ], + "(5, 1, 0, 1, 1)": [ + 6.271680380359423, + 6.118414945090114, + 5.863101745784359 + ], + "(5, 0, 0, 1, 1)": [ + 6.343186747568721, + 5.938795353886484, + 6.033491402716604 + ], + "(5, 1, 1, 1, 1)": [ + 5.855501877516305, + 5.146222646836102, + 6.270943831177874 + ], + "(5, 1, 1, 2, 1)": [ + 5.965178381510156, + 4.951535473108393, + 6.335327059170063 + ], + "(5, 1, 0, 2, 1)": [ + 6.101590240378415, + 5.943638909366957, + 6.166377646864589 + ], + "(5, 1, 0, 3, 1)": [ + 9.399681750212956, + 6.046443374728028, + 5.472047895906149 + ], + "(5, 0, 0, 3, 1)": [ + 7.264852310738755, + 6.100976298895757, + 10.121931565466037 + ], + "(5, 0, 1, 3, 1)": [ + 6.058497642090931, + 6.64055605254837, + 12.820985400788588 + ], + "(5, 1, 1, 3, 1)": [ + 6.295127566601765, + 8.86480034761974, + 6.525986911785163 + ], + "(5, 0, 0, 4, 1)": [ + 11.620473329796793, + 5.852233709190965, + 6.172684561311558 + ], + "(5, 0, 1, 4, 1)": [ + 5.853903246175382, + 7.465633418352998, + 14.203272816632714 + ], + "(5, 1, 1, 4, 1)": [ + 8.411250446883901, + 6.821876889600531, + 10.420607535997695 + ], + "(5, 1, 0, 4, 1)": [ + 10.978468161677114, + 6.095771009776962, + 7.448828231947645 + ], + "(5, 0, 0, 5, 0)": [ + 4.168560040349653, + 4.1193373810885126, + 4.189200305683654 + ], + "(5, 0, 1, 5, 0)": [ + 3.9037126196648213, + 3.952725477446389, + 3.925950696362765 + ], + "(5, 0, 0, 4, 0)": [ + 6.989124827386673, + 6.709668768383307, + 6.164502340428653 + ], + "(5, 0, 1, 4, 0)": [ + 6.470192212401894, + 6.206583505620243, + 6.219341416738382 + ], + "(5, 1, 1, 4, 0)": [ + 6.44804048006831, + 6.470249716808012, + 6.499092139332864 + ], + "(5, 1, 0, 4, 0)": [ + 6.60974475903126, + 5.809620089830466, + 6.38325714226122 + ], + "(5, 0, 1, 3, 0)": [ + 5.902298693239425, + 6.513993949524509, + 6.050931365245501 + ], + "(5, 1, 1, 3, 0)": [ + 5.7219438824090165, + 6.654252839175707, + 5.854631300383308 + ], + "(5, 1, 0, 3, 0)": [ + 7.060124662461811, + 6.133863344872211, + 5.887388222544612 + ], + "(5, 1, 0, 2, 0)": [ + 6.420811088645497, + 5.484591712572488, + 5.344338090966727 + ], + "(5, 1, 0, 1, 0)": [ + 7.60161765328693, + 5.415707409756238, + 5.625087230101972 + ], + "(5, 0, 0, 1, 0)": [ + 6.362344373068486, + 6.250819401040948, + 5.0532246397904155 + ], + "(5, 0, 0, 2, 1)": [ + 6.389023020089472, + 5.921270205667463, + 5.710168906134173 + ], + "(2, 1, 1, 0, 0)": [ + 0.007418340685015537, + 0.0, + 0.0 + ], + "(5, 1, 1, 5, 0)": [ + 3.993346037475164, + 4.02595780895983, + 3.958113797811793 + ], + "(5, 1, 0, 5, 0)": [ + 3.8704975586426262, + 3.829895425894513, + 3.8484935557684774 + ], + "(5, 0, 0, 3, 0)": [ + 7.206895605095726, + 6.361422712879813, + 6.382153739961362 + ], + "(6, 1, 1, 3, 0)": [ + 39.16516514968102, + 0.0, + 13.874993945259016 + ], + "(6, 1, 0, 3, 0)": [ + 189.25859455848735, + 0.0, + 29.91897931545399 + ], + "(6, 1, 0, 2, 0)": [ + 17.158262188709795, + 1.9514931582028616, + 0.0 + ], + "(6, 0, 0, 1, 0)": [ + 25.614850876813907, + 0.0, + 6.3154150574104975 + ], + "(6, 0, 0, 1, 1)": [ + 17.352813028917932, + 2.580182984411188, + 2.140465724900898 + ], + "(6, 0, 1, 1, 1)": [ + 31.2334214211808, + 4.9985873791887645, + 0.0 + ], + "(6, 0, 1, 2, 1)": [ + 29.335273825224643, + 14.06297569453392, + 21.55271341124275 + ], + "(6, 1, 1, 3, 1)": [ + 23.25511720982458, + 16.649397764488587, + 19.90803592789075 + ], + "(6, 1, 0, 3, 1)": [ + 26.80171996379373, + 0.0, + 18.557566348591283 + ], + "(5, 0, 0, 2, 0)": [ + 6.128584915294166, + 4.74501528893155, + 5.71323506758402 + ], + "(5, 0, 1, 1, 0)": [ + 5.433105157444771, + 6.061572284699453, + 5.812568088606896 + ], + "(5, 0, 1, 2, 0)": [ + 9.299494331173243, + 4.798479530028196, + 5.0529263281147205 + ], + "(5, 1, 1, 1, 0)": [ + 5.411730171435421, + 5.336890832671549, + 3.6940890253938563 + ], + "(6, 1, 0, 4, 1)": [ + 46.0361726410884, + 185.7281789946067, + 24.898756482539923 + ], + "(6, 0, 0, 4, 1)": [ + 240.5192583338726, + 19.671210374109826, + 32.44011863831897 + ], + "(6, 0, 1, 4, 1)": [ + 217.5041757792318, + 36.04632868615748, + 35.48728683017791 + ], + "(6, 1, 0, 5, 0)": [ + 43.831876602918115, + 27.8889817150394, + 41.01229025098874 + ], + "(6, 0, 0, 5, 0)": [ + 37.31076342912965, + 72.17808547747593, + 93.69829260586646 + ], + "(6, 0, 1, 5, 0)": [ + 30.225634154900494, + 57.043973946193184, + 19.12245464571805 + ], + "(6, 1, 1, 5, 0)": [ + 22.31531135227297, + 31.702532410298858, + 24.52593989472061 + ], + "(6, 1, 0, 4, 0)": [ + 51.69128813332314, + 43.10494568818312, + 31.630799280419943 + ], + "(6, 0, 0, 4, 0)": [ + 118.94112981801939, + 21.91343878965308, + 0.0 + ], + "(6, 0, 1, 4, 0)": [ + 43.63117424617634, + 72.1459389593239, + 244.531009560538 + ], + "(6, 1, 1, 4, 1)": [ + 40.439091364812, + 62.86471099901328, + 28.21579086570153 + ], + "(5, 1, 1, 2, 0)": [ + 6.0763041725669105, + 3.2256356687419245, + 1.9883725448540135 + ], + "(2, 1, 0, 0, 0)": [ + 0.04124880442854498, + 0.0, + 0.0 + ], + "(6, 1, 1, 4, 0)": [ + 33.12059537789176, + 36.79265587145829, + 33.0038579587303 + ], + "(6, 0, 0, 3, 0)": [ + 6.610554709899747, + 0.0, + 0.0 + ], + "(6, 0, 0, 2, 0)": [ + 19.103288763514552, + 1.7250724331149645, + 0.0 + ], + "(6, 0, 1, 2, 0)": [ + 11.45538182633565, + 0.0, + 0.0 + ], + "(6, 0, 1, 1, 0)": [ + 36.245136836621846, + 0.0, + 0.0 + ], + "(6, 1, 1, 1, 0)": [ + 51.319980637299345, + 10.223271940420567, + 3.1856529540347966 + ], + "(6, 1, 1, 1, 1)": [ + 28.43873600008985, + 3.5188606871528423, + 5.206377154699371 + ], + "(6, 1, 0, 1, 1)": [ + 254.43695151567147, + 0.0, + 4.383567406279885 + ], + "(6, 1, 0, 2, 1)": [ + 4.645323738237858, + 41.06083981486784, + 0.0 + ], + "(6, 0, 0, 2, 1)": [ + 34.28350285678632, + 34.97694231722596, + 0.0 + ], + "(6, 0, 1, 3, 1)": [ + 23.303998337366593, + 23.665273191046108, + 23.58001108802269 + ], + "(4, 1, 1, 0, 0)": [ + 0.32071104927797534, + 0.0, + 0.0 + ], + "(6, 0, 0, 3, 1)": [ + 29.960345351525937, + 12.223389700753652, + 14.174347922430263 + ], + "(2, 0, 1, 0, 0)": [ + 0.023708233987275087, + 0.0, + 0.0 + ], + "(6, 1, 1, 2, 1)": [ + 32.770471384636984, + 0.0, + 0.0 + ], + "(6, 1, 1, 2, 0)": [ + 0.0, + 8.425163932932508, + 0.0 + ], + "(6, 1, 0, 1, 0)": [ + 11.400227838868048, + 2.5621867842074355, + 1.6266017364584542 + ], + "(6, 0, 1, 3, 0)": [ + 410.21798252237346, + 103.80547176610862, + 0.0 + ] + } +} \ No newline at end of file diff --git a/src/crane_controller/q_agent.py b/src/crane_controller/q_agent.py index dd115f7..0ad178a 100644 --- a/src/crane_controller/q_agent.py +++ b/src/crane_controller/q_agent.py @@ -283,7 +283,7 @@ def dump_results( json.dump(content, _f, indent=3) logger.info("Updated q_values saved to %s", _filename.resolve()) - def read_dumped(self, filename: str | Path) -> defaultdict[tuple[int, ...], np.ndarray]: + def read_dumped(self, filename: str | Path | None = None) -> defaultdict[tuple[int, ...], np.ndarray]: """Read a Q-values dict from a JSON file. Parameters @@ -296,17 +296,24 @@ def read_dumped(self, filename: str | Path) -> defaultdict[tuple[int, ...], np.n defaultdict[tuple[int, ...], np.ndarray] Loaded Q-values mapping observation tuples to action-value arrays. """ - path = Path(filename) - with path.open(encoding="utf-8") as _f: - from_dump = json.load(_f) - self.previous_steps = int(from_dump["q_agent"]["steps"]) - self.epsilon = float(from_dump["q_agent"].get("epsilon", 1.0)) q_values: defaultdict[tuple[int, ...], np.ndarray] = defaultdict( lambda: np.array((0.0,) * self.env.action_space.n, float) # type: ignore[attr-defined,type-var] ) - assert "q_values" in from_dump, f"Key 'q_values' not found in file {filename}" - for k, v in from_dump["q_values"].items(): - q_values.update({literal_eval(k): np.array(v) if isinstance(v, list) else v}) + if filename is None and self.filename is None: # there is no file to read. Return empty defautdict + pass + else: + if filename is not None: + path = Path(filename) + elif self.filename is not None: + path = Path(self.filename) + + with path.open(encoding="utf-8") as _f: + from_dump = json.load(_f) + self.previous_steps = int(from_dump["q_agent"]["steps"]) + self.epsilon = float(from_dump["q_agent"].get("epsilon", 1.0)) + assert "q_values" in from_dump, f"Key 'q_values' not found in file {filename}" + for k, v in from_dump["q_values"].items(): + q_values.update({literal_eval(k): np.array(v) if isinstance(v, list) else v}) return q_values def analyse_training(self, window: int = 500) -> None: diff --git a/tests/test_q.py b/tests/test_q.py index fd6fa05..6a62eca 100644 --- a/tests/test_q.py +++ b/tests/test_q.py @@ -32,7 +32,9 @@ def test_q_analyse(crane: Callable[..., Crane], *, show: bool) -> None: crane, discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), ) - agent = QLearningAgent(env, filename=Path("q_trained.json"), use_file='r') + assert Path("q_trained.json").exists(), "File 'q_trained.json' not found" + agent = QLearningAgent(env, filename=Path("q_trained.json"), use_file="r") + agent.q_values = agent.read_dumped() for k, v in agent.q_values.items(): assert len(k) == 5, len(v) == 3 for pos in (0, 1): @@ -57,12 +59,12 @@ def test_intervals(crane: Callable[..., Crane]): discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), ) - agent = QLearningAgent(env, filename=save_path, use_file='w') + agent = QLearningAgent(env, filename=save_path, use_file="w") for i in range(10): _ = env.reset(seed=i + 1) agent.do_episodes(n_episodes=2, max_steps=100) if i == 0: - agent = QLearningAgent(env, filename=save_path, use_file='rw') + agent = QLearningAgent(env, filename=save_path, use_file="rw") logger.info(f"Model saved to {save_path}") @@ -72,6 +74,8 @@ def test_intervals(crane: Callable[..., Crane]): import pytest + from crane_controller.crane_factory import build_crane # noqa: F401 + retcode = pytest.main(["-rP -s -v", __file__]) assert retcode == 0, f"Return code {retcode}" os.chdir(Path(__file__).parent.absolute() / "test_working_directory") From b9ff6d97aa79ab67321619382a50bf423fa23313 Mon Sep 17 00:00:00 2001 From: Eisinger Date: Thu, 30 Apr 2026 15:53:01 +0200 Subject: [PATCH 04/11] Include read epsilon_decay when continuing a training, overwriting the value from the (new) agent. epsilon_decay default changed to 1e-4. New results from q-learning included. --- models/q_anti-pendulum.json | 271 +++++++++++++++++--------------- scripts/use_q_ide.py | 4 +- src/crane_controller/q_agent.py | 3 +- 3 files changed, 147 insertions(+), 131 deletions(-) diff --git a/models/q_anti-pendulum.json b/models/q_anti-pendulum.json index 80143f0..85ab37d 100644 --- a/models/q_anti-pendulum.json +++ b/models/q_anti-pendulum.json @@ -1,6 +1,6 @@ { - "start-training": "30.04.2026 08:29:32", - "end-training": "30.04.2026 08:29:54", + "start-training": "30.04.2026 11:49:22", + "end-training": "30.04.2026 13:40:30", "pendulum": { "wire-length": "10.0", "wire-q-factor": "50.0", @@ -13,219 +13,234 @@ "q_agent": { "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_anti-pendulum.json", "use_file": "rw", - "episodes": "10", - "steps": "40020", + "episodes": "2000", + "steps": "6043020", "learning_rate": "0.1", "discount_factor": "0.95", "epsilon-decay": "0.001", "final-epsilon": "0.1", - "epsilon": "0.98" + "epsilon": "0.1" }, "q_values": { "(0, 0, 0, 1, 1)": [ - -0.16705581244794693, - -0.1282253386578821, - -0.09732839899973421 + -0.13665139042486474, + -0.10179172074284769, + -0.03615620048379082 ], "(0, 0, 0, 0, 0)": [ - -0.37890841049813784, - -0.3221144173089857, - -0.3983817365055842 + -0.3855117367492396, + -0.3977828071547589, + -0.3073444787070865 ], "(0, 0, 0, 1, 0)": [ - -0.2664435349978729, - -0.17001690959731303, - -0.2325842595231777 + -0.29353749709276, + -0.01245142162171615, + -0.18353348032889846 ], "(0, 0, 1, 1, 0)": [ - -0.15064415891825617, - -0.2511495308113964, - -0.25691496256409363 + -0.22450214202690819, + -0.011561431340910916, + -0.1607899174877803 ], "(0, 1, 1, 1, 0)": [ - -0.20723301719553744, - -0.2388453016403667, - -0.16750979906585578 + -0.18635102620612973, + -0.014918333953243068, + -0.19796550577122185 ], "(0, 1, 0, 1, 0)": [ - -0.21424728224181977, - -0.22083742688011837, - -0.2194005545131396 + -0.2145730606952124, + -0.08559682487920808, + -0.23241014511502056 ], "(0, 1, 0, 2, 0)": [ - -0.048696104408199575, - -0.05034525692645991, - -0.05258803579860084 + -0.15422746939849802, + -0.10111065548903554, + -0.14008905307453026 ], "(0, 0, 0, 2, 0)": [ - -0.052053372911474195, - -0.05245228578367619, - -0.056669454625284825 + -0.11621741035295982, + -0.136189021105371, + -0.04124338407154954 ], "(0, 0, 1, 2, 0)": [ - -0.04772137252269057, - -0.05881755142692484, - -0.054423243178985496 + -0.02277006644413333, + -0.13713080583764461, + -0.14179060788269038 ], "(0, 1, 1, 2, 0)": [ - -0.05278649224808442, - -0.07632187326419965, - -0.060938333453418286 + -0.1349583618360337, + -0.16924737718439545, + -0.1680842291860991 ], "(0, 0, 0, 3, 0)": [ - -0.24369975025229282, - -0.24695892939305783, - -0.24911621770298206 + -0.10858577021970485, + -0.12418990186300555, + -0.09049991808047572 ], "(0, 0, 1, 3, 0)": [ - -0.24027345169278405, - -0.24031167906999237, - -0.24314101938021784 + -0.07941711160006829, + -0.0857258888169698, + -0.08216417483037675 ], "(0, 1, 1, 3, 0)": [ - -0.24861198983323804, - -0.23256743828903015, - -0.23006936132916378 + -0.09088298902159943, + -0.08990627639447457, + -0.09077903505343787 ], "(0, 1, 0, 3, 0)": [ - -0.23803043434121016, - -0.23300086647016396, - -0.252096348380666 + -0.05470242304134086, + -0.05140006893860253, + -0.04592915973935223 ], "(0, 0, 1, 4, 0)": [ - -0.29577889270947405, - -0.2981742809792015, - -0.29791983068372924 + -0.1435545874574983, + -0.15231057248465216, + -0.15086957427182499 ], "(0, 1, 1, 4, 0)": [ - -0.2958234315862551, - -0.30645418768275684, - -0.30661740666730875 + -0.12139056771543123, + -0.21535329215297502, + -7.412694388042563 ], "(0, 1, 0, 4, 0)": [ - -0.3029623394714542, - -0.3018348837313605, - -0.3286817686032363 + -0.134709312919711, + -0.2503011744582585, + -47.30780376798799 ], "(0, 0, 0, 4, 0)": [ - -0.29781883698756567, - -0.2940971933423739, - -0.29733487917694584 + -0.14326072107267074, + -0.1371132606497332, + -0.14073483467765396 ], "(0, 1, 0, 5, 0)": [ - -0.6329437113580243, - -0.6297747244548322, - -0.628882264517245 + -0.14921092460534552, + -0.5336663925124036, + -0.413160457318822 ], "(0, 0, 0, 5, 0)": [ - -0.6277272058045739, - -0.6384550155569291, - -0.6303149829373899 + -0.16817182471742664, + -0.1831098089787067, + -0.16880169485719884 ], "(0, 0, 1, 5, 0)": [ - -0.6396081577986387, - -0.6334955382726669, - -0.6407924717823796 + -0.22330769106781206, + -0.164930407464341, + -0.1585054303950049 ], "(0, 1, 1, 5, 0)": [ - -0.6400694360313026, - -0.633976678537013, - -0.6330865725095266 + -0.1408499847124823, + -0.23484133236611604, + -0.3455137865525159 ], "(0, 0, 1, 1, 1)": [ - -0.10369497244449818, - -0.11119982054398986, - -0.12993117280633998 + -0.10777995324012056, + -0.01942676901122676, + -0.08416528524778964 ], "(0, 1, 1, 1, 1)": [ - -0.10542409331231692, - -0.11768594196503504, - -0.07456918970206615 + -0.020055193708830747, + -0.1009643749752495, + -0.1819727036838127 ], "(0, 1, 0, 1, 1)": [ - -0.14656019585858246, - -0.1326055167833163, - -0.12885325016738228 + -0.09581720731770141, + -0.17129694552682964, + -0.007358568090630821 ], "(0, 1, 0, 2, 1)": [ - -0.11967009468971596, - -0.12216127394629554, - -0.1429122098640283 + -0.05629874689761112, + -0.05997232601255042, + -0.013786458351433332 ], "(0, 0, 0, 2, 1)": [ - -0.128347455422042, - -0.1487387200161241, - -0.16517981243223914 + -0.19923861861268571, + -0.02587201671587543, + -0.13903271453636865 ], "(0, 0, 1, 2, 1)": [ - -0.2682879902850379, - -0.19492371557724883, - -0.19236122464754474 + -0.1204099926263145, + -0.02639568487280513, + -0.09331258152285944 ], "(0, 1, 1, 2, 1)": [ - -0.15105097271312573, - -0.20727413471853204, - -0.20105859767753256 + -0.014954709519526446, + -0.08954397697589433, + -0.10256389706199417 ], "(0, 0, 0, 3, 1)": [ - -0.11746821209617946, - -0.12239144215834397, - -0.13720619491970695 + -0.07597091419941952, + -0.08521568787348147, + -0.0767067975458054 ], "(0, 0, 1, 3, 1)": [ - -0.11651570970036011, - -0.11862687420946329, - -0.1260539064368246 + -0.07768760972828949, + -0.15556947861941556, + -0.10213663795530971 ], "(0, 1, 1, 3, 1)": [ - -0.1450901027213944, - -0.12420631784497436, - -0.12104519333576104 + -0.006677023045033242, + -0.12168865598235325, + -0.11006819308277363 ], "(0, 1, 0, 3, 1)": [ - -0.13278128970879577, - -0.14433471293373654, - -0.14787321638372558 + -0.0697119229410046, + -0.09423853202784556, + -0.006601675203503434 ], "(0, 0, 1, 4, 1)": [ - -0.1720169164100566, - -0.1697573068991259, - -0.18563861409468002 + -0.18849044357597325, + -0.06091103734585244, + -0.16438848786875762 ], "(0, 1, 1, 4, 1)": [ - -0.19331603592176078, - -0.16465692724409528, - -0.1870968740626517 + -0.019168554778457022, + -0.18565904626703944, + -0.16910122873025832 ], "(0, 1, 0, 4, 1)": [ - -0.16839244888515778, - -0.15548076071108868, - -0.15890884729639157 + -0.12186343148374591, + -0.1353245425973399, + -0.010326133307475296 ], "(0, 0, 0, 4, 1)": [ - -0.16755688928521928, - -0.1598773466377167, - -0.17156379062820235 + -0.18803040883070493, + -0.18806111288250146, + -0.07370698948029014 ], "(0, 1, 1, 5, 1)": [ - -1.0698086689883646, - -1.095931248568509, - -1.1160177171578312 + -0.28044334846311725, + -0.34174178181292564, + -0.08571555802193095 ], "(0, 1, 0, 5, 1)": [ - -1.1027542984743757, - -1.0928909342292816, - -1.0833097769293856 + -0.3678985661744148, + -0.09066726725097075, + -0.506598781689325 ], "(0, 0, 0, 5, 1)": [ - -1.088841306513128, - -1.1035400078582027, - -1.1176895277220635 + -0.4346946110999083, + -0.08965319306320729, + -0.39860453597868206 ], "(0, 0, 1, 5, 1)": [ - -1.0994216179219447, - -1.1237160556971877, - -1.1090547917156828 + -0.5390323341639348, + -0.07573563164410979, + -0.4365671199679866 + ], + "(0, 1, 0, 0, 0)": [ + -0.10155517152045257, + -0.09703513305872391, + -0.13317800430561305 + ], + "(0, 0, 1, 0, 0)": [ + -0.3468722158158501, + -0.3601257867654982, + -0.35361639690141167 + ], + "(0, 1, 1, 0, 0)": [ + -0.1740876940193742, + -0.16639211647507102, + -0.1595306814502831 ] } } \ No newline at end of file diff --git a/scripts/use_q_ide.py b/scripts/use_q_ide.py index 4edb17e..883abc7 100644 --- a/scripts/use_q_ide.py +++ b/scripts/use_q_ide.py @@ -52,7 +52,7 @@ def do_use(kwargs: dict[str, Any]) -> None: use_file = kwargs.get("use_file", "r") agent = QLearningAgent(env, filename=filename, use_file=use_file) agent.do_episodes(n_episodes=kwargs.get("episodes", 100), max_steps=kwargs.get("steps", 5000)) - if filename is not None: + if filename is not None and 'w' in agent.use_file: LOGGER.info(f"Model saved to {filename}") @@ -84,7 +84,7 @@ def _args(base: dict[str, Any], upd: dict[str, Any]) -> dict[str, Any]: "t_fac": 0.0, } # ruff: disable[ERA001] ## we intentionally work with commenting out lines here - args = _args(anti, {"episodes": 10}) # anti-pendulum training + args = _args(anti, {"episodes": 2000}) # anti-pendulum (additional) training # args = _args(pend, {'episodes':10000}) # pendulum training # args = _args( anti, {"episodes": 10, "render": "plot","use_file":'r'}) # show anti-pendulum results # args = _args( pend, {"episodes": 10, "render": "plot", "use_file":'r'}) # show start pendulum results diff --git a/src/crane_controller/q_agent.py b/src/crane_controller/q_agent.py index 0ad178a..2b824d1 100644 --- a/src/crane_controller/q_agent.py +++ b/src/crane_controller/q_agent.py @@ -80,7 +80,7 @@ def __init__( self, env: AntiPendulumEnv, learning_rate: float = 0.1, - epsilon_decay: float = 1e-3, + epsilon_decay: float = 1e-4, final_epsilon: float = 0.1, discount_factor: float = 0.95, filename: Path | None = None, @@ -311,6 +311,7 @@ def read_dumped(self, filename: str | Path | None = None) -> defaultdict[tuple[i from_dump = json.load(_f) self.previous_steps = int(from_dump["q_agent"]["steps"]) self.epsilon = float(from_dump["q_agent"].get("epsilon", 1.0)) + self.epsilon_decay = float(from_dump["q_agent"].get("epsilon", 1e-4)) assert "q_values" in from_dump, f"Key 'q_values' not found in file {filename}" for k, v in from_dump["q_values"].items(): q_values.update({literal_eval(k): np.array(v) if isinstance(v, list) else v}) From 67707d63baa233cafcd2cc5227d80d95789981ad Mon Sep 17 00:00:00 2001 From: Eisinger Date: Sun, 3 May 2026 06:52:47 +0200 Subject: [PATCH 05/11] Corrected an error from one of the last commits which makes the energy contribution of the observation negative. Added new anti-pendulum trained model. --- models/q_anti-pendulum.json | 1530 ++++++++++++++--- models/q_pendulum.json | 1258 -------------- scripts/use_q_ide.py | 8 +- .../envs/controlled_crane_pendulum.py | 13 +- 4 files changed, 1316 insertions(+), 1493 deletions(-) delete mode 100644 models/q_pendulum.json diff --git a/models/q_anti-pendulum.json b/models/q_anti-pendulum.json index 85ab37d..f2715c8 100644 --- a/models/q_anti-pendulum.json +++ b/models/q_anti-pendulum.json @@ -1,246 +1,1326 @@ { - "start-training": "30.04.2026 11:49:22", - "end-training": "30.04.2026 13:40:30", + "start-training": "02.05.2026 06:16:23", + "end-training": "02.05.2026 11:56:01", "pendulum": { "wire-length": "10.0", "wire-q-factor": "50.0", "reward-factors": "(1.0, 0.0015, 0.0)", "acceleration": "0.1", "step-size": "0.1", - "observations-discretization": "{'pos': (0, 1), 'speed': (0, 1), 'distance': (0.0, 1.0, 2.0, 5.0, 10.0, 20.0), 'sector': (0, 1), 'energies': (np.float64(0.0), np.float64(0.014941105158016455), np.float64(0.373300117199762), np.float64(1.4903594295023934), np.float64(5.916153900902383), np.float64(13.142907888746564), np.float64(98.1))}", + "observations-discretization": "{'energies': (np.float64(0.0), np.float64(0.014941105158016455), np.float64(0.373300117199762), np.float64(1.4903594295023934), np.float64(5.916153900902383), np.float64(13.142907888746564), np.float64(98.1)), 'pos': (0, 1), 'speed': (0, 1), 'distance': (0.0, 1.0, 2.0, 5.0, 10.0, 20.0), 'sector': (0, 1)}", "reward_limit": "0.0" }, "q_agent": { "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_anti-pendulum.json", "use_file": "rw", - "episodes": "2000", - "steps": "6043020", + "episodes": "10000", + "steps": "22011000", "learning_rate": "0.1", "discount_factor": "0.95", - "epsilon-decay": "0.001", + "epsilon-decay": "0.900000000000011", "final-epsilon": "0.1", "epsilon": "0.1" }, "q_values": { - "(0, 0, 0, 1, 1)": [ - -0.13665139042486474, - -0.10179172074284769, - -0.03615620048379082 - ], - "(0, 0, 0, 0, 0)": [ - -0.3855117367492396, - -0.3977828071547589, - -0.3073444787070865 - ], - "(0, 0, 0, 1, 0)": [ - -0.29353749709276, - -0.01245142162171615, - -0.18353348032889846 - ], - "(0, 0, 1, 1, 0)": [ - -0.22450214202690819, - -0.011561431340910916, - -0.1607899174877803 - ], - "(0, 1, 1, 1, 0)": [ - -0.18635102620612973, - -0.014918333953243068, - -0.19796550577122185 - ], - "(0, 1, 0, 1, 0)": [ - -0.2145730606952124, - -0.08559682487920808, - -0.23241014511502056 - ], - "(0, 1, 0, 2, 0)": [ - -0.15422746939849802, - -0.10111065548903554, - -0.14008905307453026 - ], - "(0, 0, 0, 2, 0)": [ - -0.11621741035295982, - -0.136189021105371, - -0.04124338407154954 - ], - "(0, 0, 1, 2, 0)": [ - -0.02277006644413333, - -0.13713080583764461, - -0.14179060788269038 - ], - "(0, 1, 1, 2, 0)": [ - -0.1349583618360337, - -0.16924737718439545, - -0.1680842291860991 - ], - "(0, 0, 0, 3, 0)": [ - -0.10858577021970485, - -0.12418990186300555, - -0.09049991808047572 - ], - "(0, 0, 1, 3, 0)": [ - -0.07941711160006829, - -0.0857258888169698, - -0.08216417483037675 - ], - "(0, 1, 1, 3, 0)": [ - -0.09088298902159943, - -0.08990627639447457, - -0.09077903505343787 - ], - "(0, 1, 0, 3, 0)": [ - -0.05470242304134086, - -0.05140006893860253, - -0.04592915973935223 - ], - "(0, 0, 1, 4, 0)": [ - -0.1435545874574983, - -0.15231057248465216, - -0.15086957427182499 - ], - "(0, 1, 1, 4, 0)": [ - -0.12139056771543123, - -0.21535329215297502, - -7.412694388042563 - ], - "(0, 1, 0, 4, 0)": [ - -0.134709312919711, - -0.2503011744582585, - -47.30780376798799 - ], - "(0, 0, 0, 4, 0)": [ - -0.14326072107267074, - -0.1371132606497332, - -0.14073483467765396 - ], - "(0, 1, 0, 5, 0)": [ - -0.14921092460534552, - -0.5336663925124036, - -0.413160457318822 - ], - "(0, 0, 0, 5, 0)": [ - -0.16817182471742664, - -0.1831098089787067, - -0.16880169485719884 - ], - "(0, 0, 1, 5, 0)": [ - -0.22330769106781206, - -0.164930407464341, - -0.1585054303950049 - ], - "(0, 1, 1, 5, 0)": [ - -0.1408499847124823, - -0.23484133236611604, - -0.3455137865525159 - ], - "(0, 0, 1, 1, 1)": [ - -0.10777995324012056, - -0.01942676901122676, - -0.08416528524778964 - ], - "(0, 1, 1, 1, 1)": [ - -0.020055193708830747, - -0.1009643749752495, - -0.1819727036838127 - ], - "(0, 1, 0, 1, 1)": [ - -0.09581720731770141, - -0.17129694552682964, - -0.007358568090630821 - ], - "(0, 1, 0, 2, 1)": [ - -0.05629874689761112, - -0.05997232601255042, - -0.013786458351433332 - ], - "(0, 0, 0, 2, 1)": [ - -0.19923861861268571, - -0.02587201671587543, - -0.13903271453636865 - ], - "(0, 0, 1, 2, 1)": [ - -0.1204099926263145, - -0.02639568487280513, - -0.09331258152285944 - ], - "(0, 1, 1, 2, 1)": [ - -0.014954709519526446, - -0.08954397697589433, - -0.10256389706199417 - ], - "(0, 0, 0, 3, 1)": [ - -0.07597091419941952, - -0.08521568787348147, - -0.0767067975458054 - ], - "(0, 0, 1, 3, 1)": [ - -0.07768760972828949, - -0.15556947861941556, - -0.10213663795530971 - ], - "(0, 1, 1, 3, 1)": [ - -0.006677023045033242, - -0.12168865598235325, - -0.11006819308277363 - ], - "(0, 1, 0, 3, 1)": [ - -0.0697119229410046, - -0.09423853202784556, - -0.006601675203503434 - ], - "(0, 0, 1, 4, 1)": [ - -0.18849044357597325, - -0.06091103734585244, - -0.16438848786875762 - ], - "(0, 1, 1, 4, 1)": [ - -0.019168554778457022, - -0.18565904626703944, - -0.16910122873025832 - ], - "(0, 1, 0, 4, 1)": [ - -0.12186343148374591, - -0.1353245425973399, - -0.010326133307475296 - ], - "(0, 0, 0, 4, 1)": [ - -0.18803040883070493, - -0.18806111288250146, - -0.07370698948029014 - ], - "(0, 1, 1, 5, 1)": [ - -0.28044334846311725, - -0.34174178181292564, - -0.08571555802193095 - ], - "(0, 1, 0, 5, 1)": [ - -0.3678985661744148, - -0.09066726725097075, - -0.506598781689325 - ], - "(0, 0, 0, 5, 1)": [ - -0.4346946110999083, - -0.08965319306320729, - -0.39860453597868206 - ], - "(0, 0, 1, 5, 1)": [ - -0.5390323341639348, - -0.07573563164410979, - -0.4365671199679866 - ], - "(0, 1, 0, 0, 0)": [ - -0.10155517152045257, - -0.09703513305872391, - -0.13317800430561305 - ], - "(0, 0, 1, 0, 0)": [ - -0.3468722158158501, - -0.3601257867654982, - -0.35361639690141167 - ], - "(0, 1, 1, 0, 0)": [ - -0.1740876940193742, - -0.16639211647507102, - -0.1595306814502831 + "(3, 0, 0, 1, 1)": [ + -1.0679910671279653, + -1.110681877962423, + -0.41915413353759845 + ], + "(3, 0, 0, 0, 0)": [ + -0.9213374700587837, + -0.9155540359405517, + -0.9399636472476928 + ], + "(3, 0, 0, 1, 0)": [ + -1.1273137731893534, + -1.1284292762399748, + -1.0102714445825918 + ], + "(3, 0, 1, 1, 0)": [ + -1.170772753467116, + -0.8469803815276317, + -1.0868058537451306 + ], + "(3, 1, 1, 1, 0)": [ + -0.8681203028287104, + -1.07984104458665, + -1.0280968661330658 + ], + "(3, 1, 0, 1, 0)": [ + -1.1902993340217654, + -1.1174683064390465, + -1.117338021754873 + ], + "(3, 1, 0, 2, 0)": [ + -0.8981769848135274, + -1.024051402087251, + -0.9152356514467404 + ], + "(3, 0, 0, 2, 0)": [ + -0.7883197767671347, + -0.9998942960791635, + -0.9205860957407767 + ], + "(3, 0, 1, 2, 0)": [ + -1.1275283369462716, + -1.1450398396847963, + -1.126814297252274 + ], + "(3, 1, 1, 2, 0)": [ + -0.6814344753037649, + -1.1296524734861837, + -1.139886971831043 + ], + "(2, 1, 0, 2, 0)": [ + -0.2184258376605628, + -0.20340333867177465, + -0.21458748416353496 + ], + "(2, 0, 0, 2, 0)": [ + -0.21663452762593394, + -0.2569651413364418, + -0.17986576955343098 + ], + "(2, 0, 0, 3, 0)": [ + -0.23943912006540502, + -0.21302019057825242, + -0.27015104989984423 + ], + "(2, 0, 1, 3, 0)": [ + -0.23509642934988545, + -0.21545972361144733, + -0.2267123440864149 + ], + "(2, 1, 1, 3, 0)": [ + -0.19026984617449708, + -0.17806330009663418, + -0.1736647865486621 + ], + "(2, 1, 0, 3, 0)": [ + -0.3941196449958593, + -0.22164434901634586, + -0.2134812385530895 + ], + "(2, 0, 1, 4, 0)": [ + -0.2097834585026931, + -0.24666995076935308, + -0.25373857853718934 + ], + "(2, 1, 1, 4, 0)": [ + -0.2759874185807895, + -0.3093088380921312, + -0.2381934089297431 + ], + "(2, 1, 0, 4, 0)": [ + -0.31727582237320173, + -0.3307198197737338, + -0.3241620523467016 + ], + "(2, 0, 0, 4, 0)": [ + -0.34622455778916233, + -0.28425156960535347, + -0.24247822016308812 + ], + "(1, 0, 0, 4, 0)": [ + -0.11649867241162995, + -0.12120725133738347, + -0.005921299589782451 + ], + "(1, 0, 1, 4, 0)": [ + -0.08551413320982315, + -0.1387059769406753, + -0.007806571927053064 + ], + "(2, 1, 0, 5, 0)": [ + -3.8245399062881322, + -3.824172526643906, + -3.8370301117294545 + ], + "(2, 0, 0, 5, 0)": [ + -3.867824759520852, + -3.8439322346269655, + -3.835200707481058 + ], + "(1, 0, 0, 5, 0)": [ + -5.512650894613301, + -5.5010721371057105, + -5.465820718406662 + ], + "(2, 0, 1, 5, 0)": [ + -3.485529156122162, + -3.845834300257472, + -3.831169611698396 + ], + "(1, 0, 1, 5, 0)": [ + -5.470586310992861, + -5.474552185809867, + -5.478512693659493 + ], + "(1, 1, 1, 5, 0)": [ + -5.545542800572466, + -5.558492366040909, + -5.529410714046352 + ], + "(2, 1, 1, 5, 0)": [ + -3.740607589859895, + -3.735419375930869, + -3.739605840358064 + ], + "(1, 1, 0, 5, 0)": [ + -5.601260382087573, + -5.6141735413750515, + -5.604041472342646 + ], + "(3, 0, 1, 1, 1)": [ + -0.5629130435854454, + -0.9838559385459248, + -0.8949497409541708 + ], + "(3, 1, 1, 1, 1)": [ + -0.859725723597195, + -0.5458068273632999, + -0.8866737404146082 + ], + "(3, 1, 0, 1, 1)": [ + -1.034748028119836, + -0.5170485419958282, + -0.9806039202372469 + ], + "(2, 1, 0, 1, 0)": [ + -0.18501417802997483, + -0.18802214154251384, + -0.18680367276732765 + ], + "(2, 0, 0, 1, 0)": [ + -0.17656084548747633, + -0.18009045369362325, + -0.18019787851078808 + ], + "(2, 0, 1, 1, 0)": [ + -0.18748344846649878, + -0.18539320427327852, + -0.18906729235282815 + ], + "(2, 1, 1, 1, 0)": [ + -0.22076892073303223, + -0.24793092868085437, + -0.21829387185436022 + ], + "(2, 1, 1, 2, 0)": [ + -0.2774339008551959, + -0.27791096221428363, + -0.23346034735074367 + ], + "(3, 1, 0, 3, 0)": [ + -0.7282565190508381, + -0.9900885019249691, + -0.989971463704755 + ], + "(3, 0, 0, 3, 0)": [ + -1.0243279316795144, + -0.9679116672116896, + -0.5908024664033348 + ], + "(3, 0, 1, 3, 0)": [ + -0.7630884369592039, + -1.0018044116676168, + -0.9222822501830901 + ], + "(3, 1, 1, 3, 0)": [ + -0.8679081693343687, + -0.8713405895165993, + -0.882134743047456 + ], + "(2, 0, 1, 2, 0)": [ + -0.24104192471327143, + -0.19776244680465158, + -0.22851829695493597 + ], + "(2, 0, 0, 1, 1)": [ + -0.14576980478793666, + -0.16284851663785888, + -0.06224351780739461 + ], + "(2, 0, 1, 1, 1)": [ + -0.2148773982540717, + -0.05938812592073324, + -0.2125745582888412 + ], + "(2, 1, 1, 1, 1)": [ + -0.1406235665717706, + -0.28203570306460557, + -0.246131452751267 + ], + "(2, 1, 0, 1, 1)": [ + -0.14685835593580937, + -0.17119527792379846, + -0.08231457188416876 + ], + "(2, 1, 0, 2, 1)": [ + -0.19864125944765276, + -0.17653453057999832, + -0.13578440958796043 + ], + "(2, 0, 0, 2, 1)": [ + -0.1555105394096738, + -0.2472625529718001, + -0.23692730350500177 + ], + "(2, 0, 1, 2, 1)": [ + -0.2991450400285979, + -0.29935589159806486, + -0.12327182416625308 + ], + "(2, 1, 1, 2, 1)": [ + -0.3471859967321119, + -0.4296960152978751, + -0.29224040436683185 + ], + "(2, 0, 0, 3, 1)": [ + -0.27296590315793545, + -0.13611602289804434, + -0.239884206216131 + ], + "(2, 0, 1, 3, 1)": [ + -0.12655473877612425, + -0.2535854981708081, + -0.23655628563633407 + ], + "(2, 1, 1, 3, 1)": [ + -0.35086194437746876, + -0.39814343151302445, + -0.38273519209835166 + ], + "(2, 1, 0, 3, 1)": [ + -0.3594256674719777, + -0.5018633964983203, + -0.47506777964234004 + ], + "(1, 0, 0, 2, 1)": [ + -0.03952570057480613, + -0.03276573427749324, + -0.030642332730822463 + ], + "(1, 0, 1, 2, 1)": [ + -0.04644291029637304, + -0.04840298540742884, + -0.04873423315198787 + ], + "(1, 1, 1, 2, 1)": [ + -0.05388778252622612, + -0.12278017719404431, + -0.06632854179754616 + ], + "(1, 1, 0, 2, 1)": [ + -0.07921563522578597, + -0.038367724722816986, + -0.063237086060482 + ], + "(1, 1, 1, 1, 1)": [ + -0.02401849722950171, + -0.1377423508491871, + -0.035114333735318706 + ], + "(1, 1, 0, 1, 1)": [ + -0.04518442542923341, + -0.04786407605163934, + -0.04659592515807536 + ], + "(1, 0, 0, 1, 1)": [ + -0.03595861296657249, + -0.039761823378762315, + -0.03769872970520503 + ], + "(1, 0, 1, 1, 1)": [ + -0.028815100482542398, + -0.019480596871779634, + -0.029639144511337444 + ], + "(2, 0, 0, 4, 1)": [ + -0.5294228604319029, + -0.5590238336473268, + -0.41176012538663975 + ], + "(2, 0, 1, 4, 1)": [ + -0.22430719251552728, + -0.07985033211552926, + -0.16232907241467082 + ], + "(2, 1, 1, 4, 1)": [ + -0.08145124248400931, + -0.21769459649619397, + -0.1593890045828511 + ], + "(2, 1, 0, 4, 1)": [ + -0.48623888763258905, + -0.41742444109567195, + -0.6294027962997758 + ], + "(2, 1, 1, 5, 1)": [ + -1.8994560174744375, + -2.2353965545846464, + -0.9122368678258063 + ], + "(2, 1, 0, 5, 1)": [ + -0.9759891553387082, + -1.3622049356175714, + -1.4439613557007753 + ], + "(2, 0, 0, 5, 1)": [ + -0.9692504889829188, + -1.651659122082731, + -1.140513827724224 + ], + "(2, 0, 1, 5, 1)": [ + -2.5880982455715444, + -1.9944990247179943, + -0.9538729711682539 + ], + "(1, 0, 0, 5, 1)": [ + -1.0968815599507726, + -1.5026429111188824, + -0.1073756967270721 + ], + "(1, 0, 1, 5, 1)": [ + -0.8619951953925427, + -0.6556885810483055, + -0.08119388447867634 + ], + "(1, 1, 1, 5, 1)": [ + -0.26508044605059183, + -0.2783929133640923, + -0.02539340327856676 + ], + "(1, 1, 0, 5, 1)": [ + -0.15028794817895103, + -0.20440457498249387, + -0.029023592630201427 + ], + "(3, 0, 1, 2, 1)": [ + -0.8307143842795423, + -0.5773026997215118, + -0.929927235660665 + ], + "(3, 1, 1, 2, 1)": [ + -0.5772564143411784, + -0.8932995920211088, + -0.6989917630146333 + ], + "(3, 1, 0, 2, 1)": [ + -1.073211732784507, + -0.855299331593141, + -0.8232202819589415 + ], + "(3, 0, 0, 2, 1)": [ + -0.923632082408891, + -0.9247267119907955, + -0.6468953757653081 + ], + "(3, 0, 0, 3, 1)": [ + -0.6394897127848305, + -0.7340477841957704, + -0.5181252513081902 + ], + "(3, 0, 1, 3, 1)": [ + -0.8937235094416299, + -0.6932667570313359, + -0.48568512058187413 + ], + "(3, 1, 1, 3, 1)": [ + -0.5409799961353358, + -0.7796399197269814, + -0.7594490780936252 + ], + "(3, 1, 0, 3, 1)": [ + -0.6545949005224745, + -0.6931986664303526, + -0.5128530802296823 + ], + "(1, 1, 1, 4, 0)": [ + -0.006267546809350346, + -0.071506658362785, + -0.05721370593957202 + ], + "(1, 1, 0, 4, 0)": [ + -0.011834350653177986, + -0.11465206468727204, + -0.07341357021309242 + ], + "(3, 1, 0, 4, 1)": [ + -0.8102078678442004, + -0.9177714125566699, + -0.707994412131045 + ], + "(3, 0, 0, 4, 1)": [ + -0.8600717486809838, + -1.2218277946737544, + -0.6076915348748687 + ], + "(3, 0, 1, 4, 1)": [ + -0.9267305493470831, + -0.9568948710440423, + -0.645050327251187 + ], + "(3, 1, 1, 4, 1)": [ + -0.6815550649535739, + -0.8220706331433774, + -1.0559085423304426 + ], + "(1, 1, 0, 3, 1)": [ + -0.09299729822639691, + -0.09347719323901467, + -0.09071269927538811 + ], + "(1, 0, 0, 3, 1)": [ + -0.0837708430009454, + -0.08314041773036976, + -0.08295819075695357 + ], + "(1, 0, 1, 3, 1)": [ + -0.08589628458821519, + -0.08777894631661534, + -0.08732578759515346 + ], + "(1, 1, 1, 3, 1)": [ + -0.09259884875751484, + -0.09385600133744688, + -0.10177157243314822 + ], + "(1, 1, 1, 3, 0)": [ + -0.06813079922072852, + -0.0067435855138492035, + -0.06440144856410124 + ], + "(1, 1, 0, 3, 0)": [ + -0.06506140124927248, + -0.05977439858481188, + -0.005462143228379877 + ], + "(1, 0, 0, 3, 0)": [ + -0.08156471124758687, + -0.08456976706745396, + -0.00404898513417271 + ], + "(1, 0, 1, 3, 0)": [ + -0.005896902209677571, + -0.07171024669840459, + -0.06654008399566524 + ], + "(1, 0, 0, 2, 0)": [ + -0.02219402382732805, + -0.04658678536438388, + -0.04290549872720911 + ], + "(1, 0, 1, 2, 0)": [ + -0.07413174929728189, + -0.010902068996063996, + -0.0711014826928577 + ], + "(1, 1, 1, 2, 0)": [ + -0.004503286552458026, + -0.09325628500138287, + -0.07829624068711999 + ], + "(1, 1, 0, 1, 0)": [ + -0.014907648034403006, + -0.017629548371804773, + -0.010963961423553778 + ], + "(1, 0, 0, 4, 1)": [ + -0.16388751037973964, + -0.13546188573035972, + -0.13194813749769618 + ], + "(1, 0, 1, 4, 1)": [ + -0.12720083589552428, + -0.1240015125280934, + -0.12827564921580467 + ], + "(1, 1, 1, 4, 1)": [ + -0.15169920503532877, + -0.14849310619301653, + -0.14830752781447082 + ], + "(1, 1, 0, 4, 1)": [ + -0.17117788658007088, + -0.2570247212211289, + -0.22043943594113632 + ], + "(3, 0, 0, 4, 0)": [ + -0.935957517661739, + -0.8741628643909318, + -0.9642891903753898 + ], + "(3, 0, 1, 4, 0)": [ + -0.8889661699468129, + -0.8992930672115816, + -0.8928405717719389 + ], + "(1, 1, 0, 2, 0)": [ + -0.047389204646554266, + -0.07177401878611174, + -0.003414182242928885 + ], + "(1, 1, 1, 1, 0)": [ + -0.0031223136242218355, + -0.02465389795874292, + -0.04581015989270518 + ], + "(1, 0, 0, 1, 0)": [ + -0.0732149748459828, + -0.06456921923153577, + -0.011363579406010668 + ], + "(3, 1, 0, 4, 0)": [ + -0.8538542222821633, + -0.9762960000792233, + -0.8372985666321078 + ], + "(3, 1, 0, 0, 0)": [ + -0.736288513594841, + -0.7427294717665378, + -0.6892531862036398 + ], + "(1, 0, 1, 1, 0)": [ + -0.06650375372103795, + -0.11163829257435914, + -0.009433645112219797 + ], + "(3, 0, 1, 0, 0)": [ + -0.6680308041344067, + -0.8815375050200256, + -0.8619180900295701 + ], + "(3, 1, 1, 0, 0)": [ + -0.9480938852904889, + -0.8998782091376097, + -0.7603660520784794 + ], + "(3, 1, 1, 4, 0)": [ + -1.0003339874232537, + -0.8679189961031905, + -0.8832677581149115 + ], + "(3, 1, 0, 5, 0)": [ + -2.977027543744521, + -2.752439283281814, + -1.793214304601806 + ], + "(2, 0, 0, 0, 0)": [ + -0.19736445761814894, + -0.19687784012632223, + -0.1456435908875613 + ], + "(5, 0, 1, 0, 0)": [ + -7.877333299322492, + -9.017206590043456, + -8.875031302458787 + ], + "(5, 1, 1, 1, 1)": [ + -9.439420370053188, + -8.405215818947548, + -8.882766016862826 + ], + "(5, 1, 0, 1, 1)": [ + -8.570488223265878, + -9.040442072724684, + -7.735954920134191 + ], + "(5, 0, 0, 1, 1)": [ + -8.394510374790025, + -8.211714961182981, + -6.523894996772898 + ], + "(5, 0, 1, 1, 1)": [ + -5.791777592018223, + -8.198600279587456, + -7.581499573764865 + ], + "(4, 1, 1, 1, 1)": [ + -4.657897331418944, + -4.37909653952978, + -3.1141378688860692 + ], + "(4, 1, 0, 1, 1)": [ + -4.662357614889094, + -3.0799917544864495, + -4.684222452975122 + ], + "(4, 0, 0, 1, 1)": [ + -4.114849641611714, + -3.5971589785403086, + -2.907401815734824 + ], + "(4, 0, 1, 1, 1)": [ + -3.631409759038911, + -3.784269419524094, + -2.9245936196951923 + ], + "(4, 1, 0, 2, 1)": [ + -4.103159828194269, + -4.076324573790363, + -4.072704009693106 + ], + "(4, 0, 0, 2, 1)": [ + -4.558597340708664, + -4.215846855313657, + -4.231615458442613 + ], + "(4, 0, 1, 2, 1)": [ + -4.210968677935139, + -4.302798464973418, + -4.119589644898803 + ], + "(4, 1, 1, 2, 1)": [ + -4.148304040547841, + -4.20309170225514, + -4.202753846173705 + ], + "(4, 0, 0, 3, 1)": [ + -4.493365742324821, + -3.5572734403077155, + -4.102839037113279 + ], + "(4, 0, 1, 3, 1)": [ + -4.785440027514513, + -3.62105397204959, + -4.522031431131259 + ], + "(4, 1, 1, 3, 1)": [ + -3.4444020399570148, + -4.520367335080097, + -4.538393593478434 + ], + "(4, 1, 0, 3, 1)": [ + -3.582503050008212, + -3.729075680061947, + -3.6866722289236744 + ], + "(2, 1, 1, 0, 0)": [ + -0.15669864784656357, + -0.08652529030466029, + -0.15344557308326373 + ], + "(2, 0, 1, 0, 0)": [ + -0.1680328719198184, + -0.1314234063459338, + -0.17464250264759898 + ], + "(4, 0, 0, 0, 0)": [ + -3.341126641713325, + -3.6869003546572072, + -3.49368972230538 + ], + "(4, 0, 0, 1, 0)": [ + -2.837629753683945, + -4.12750258069974, + -4.56616705882044 + ], + "(5, 0, 0, 0, 0)": [ + -6.638649368943689, + -8.905784553782132, + -8.43714813935995 + ], + "(5, 0, 0, 1, 0)": [ + -9.157658015035292, + -8.889362610921518, + -8.08703468684667 + ], + "(5, 0, 1, 1, 0)": [ + -7.865346602002181, + -8.731007369377588, + -9.0631697522648 + ], + "(5, 1, 1, 1, 0)": [ + -9.604221782468612, + -9.665760693122413, + -7.58317445080715 + ], + "(5, 1, 0, 1, 0)": [ + -9.218421439535135, + -8.852890301377313, + -8.675354973140916 + ], + "(5, 0, 1, 2, 0)": [ + -7.538419688657766, + -14.201690958003097, + -7.951516002970245 + ], + "(5, 1, 1, 2, 0)": [ + -7.936487077161325, + -7.199771295362781, + -7.941299924754709 + ], + "(5, 1, 0, 2, 0)": [ + -7.8999724037772845, + -7.333129844541226, + -7.779392901154807 + ], + "(5, 0, 0, 2, 0)": [ + -7.618480353285548, + -7.835886758350185, + -6.706812622207227 + ], + "(4, 1, 1, 2, 0)": [ + -3.563726208353684, + -3.5055373629395965, + -3.471104649707583 + ], + "(4, 1, 0, 2, 0)": [ + -3.8316973297575343, + -3.145128647594828, + -3.818500469275935 + ], + "(4, 1, 0, 3, 0)": [ + -4.1852148664375255, + -3.346624137547338, + -3.952887052234162 + ], + "(4, 0, 0, 3, 0)": [ + -4.459169123887398, + -4.514847539794854, + -4.524762788430744 + ], + "(4, 0, 1, 3, 0)": [ + -4.606170369229526, + -4.637568202180502, + -4.616376423041719 + ], + "(4, 1, 1, 3, 0)": [ + -4.206707100979519, + -3.3423022544947485, + -4.168137709948456 + ], + "(4, 0, 0, 4, 0)": [ + -4.234105664057562, + -4.237107468766884, + -4.236101643750965 + ], + "(4, 0, 1, 4, 0)": [ + -4.268205733816586, + -4.395574638860902, + -4.2860192727749755 + ], + "(4, 1, 1, 4, 0)": [ + -4.523838814577903, + -4.497763698262584, + -4.512721149370325 + ], + "(4, 1, 0, 4, 0)": [ + -4.425559055688517, + -4.4001293021904635, + -4.4303079982660325 + ], + "(4, 0, 1, 5, 0)": [ + -4.695094383033599, + -2.3239797427783784, + -4.367210306851003 + ], + "(4, 1, 1, 5, 0)": [ + -5.259179480809952, + -2.2441688305326273, + -4.381531267317479 + ], + "(4, 1, 0, 5, 0)": [ + -5.786105302528829, + -4.417781321861663, + -2.326597107114164 + ], + "(4, 0, 0, 5, 0)": [ + -5.130586334384959, + -2.3406340172202156, + -5.07897586718162 + ], + "(3, 0, 0, 5, 0)": [ + -2.924560984883939, + -2.8107063942111292, + -2.0328230352736933 + ], + "(3, 0, 1, 5, 0)": [ + -1.9328607976834506, + -2.804541653901778, + -2.9309719453923853 + ], + "(3, 1, 1, 5, 0)": [ + -2.9456885624252993, + -2.566887192544894, + -1.777186983798028 + ], + "(4, 0, 1, 0, 0)": [ + -3.3306992321198767, + -3.045871305234635, + -3.7283276733390323 + ], + "(4, 0, 1, 1, 0)": [ + -4.6192737406771265, + -3.649056837741786, + -2.9775062785178994 + ], + "(4, 1, 1, 1, 0)": [ + -3.0211479770108185, + -3.7078688744914023, + -4.302064119555902 + ], + "(4, 1, 0, 1, 0)": [ + -2.8619160693328065, + -3.953852267245893, + -3.7365879745006985 + ], + "(4, 0, 1, 2, 0)": [ + -3.4470436309560295, + -3.552127590337103, + -3.5003641436099846 + ], + "(4, 0, 0, 2, 0)": [ + -3.526712297043562, + -3.623098151859292, + -3.046457570202431 + ], + "(3, 0, 1, 5, 1)": [ + -1.1052694485550838, + -0.9780968173728476, + -1.0506876870353603 + ], + "(3, 1, 1, 5, 1)": [ + -1.033315718542053, + -0.9889151794959199, + -1.222215784543791 + ], + "(3, 1, 0, 5, 1)": [ + -1.2611701955332641, + -1.3037566716497595, + -0.9764730013980599 + ], + "(3, 0, 0, 5, 1)": [ + -1.1640404921311382, + -1.2282837210279365, + -0.9643975201119706 + ], + "(4, 1, 1, 0, 0)": [ + -3.267791161685298, + -3.3887900609125823, + -3.194460947446834 + ], + "(5, 1, 1, 0, 0)": [ + -8.518646554251474, + -8.517321979328182, + -8.74694398533162 + ], + "(4, 0, 0, 4, 1)": [ + -3.37227611676004, + -3.031641243665272, + -3.1584842259226544 + ], + "(4, 0, 1, 4, 1)": [ + -3.9099863640133568, + -3.0640284956927717, + -3.151604624961842 + ], + "(5, 1, 0, 3, 0)": [ + -5.965063124416357, + -6.430086478045828, + -6.643583818558305 + ], + "(5, 0, 0, 3, 0)": [ + -6.526490030611686, + -6.547862029479745, + -5.466246373833379 + ], + "(5, 0, 1, 3, 0)": [ + -6.104546825104379, + -7.008641265864339, + -6.512955596597061 + ], + "(5, 1, 1, 3, 0)": [ + -6.701981921064349, + -8.835306639855613, + -5.961329702158425 + ], + "(5, 0, 1, 4, 0)": [ + -6.59207369716748, + -17.015278387213122, + -9.026068759170137 + ], + "(5, 1, 0, 2, 1)": [ + -7.9010560398275596, + -7.85911448760359, + -7.892476895729203 + ], + "(5, 0, 0, 2, 1)": [ + -7.598089719813386, + -7.590815116206432, + -7.280054614354281 + ], + "(5, 0, 1, 2, 1)": [ + -7.817248607059643, + -6.99281226198276, + -7.540685669280034 + ], + "(5, 0, 1, 3, 1)": [ + -7.813387923097066, + -7.428752000991667, + -7.7719685746240845 + ], + "(5, 1, 1, 3, 1)": [ + -7.7102705710751, + -7.877328797572447, + -7.615435667350875 + ], + "(5, 1, 0, 3, 1)": [ + -8.208091433591923, + -8.015765975098713, + -7.148539624959201 + ], + "(5, 0, 0, 3, 1)": [ + -78.22615666661633, + -6.684483570525371, + -9.383946612768721 + ], + "(5, 1, 0, 4, 1)": [ + -10.061310992642312, + -88.94429965449777, + -6.3061823488645405 + ], + "(5, 0, 0, 4, 1)": [ + -7.891604129552659, + -153.84764259723215, + -6.110857151900652 + ], + "(5, 0, 1, 4, 1)": [ + -5.887902428569501, + -7.3459812044226105, + -9.124587739117226 + ], + "(5, 1, 1, 4, 1)": [ + -6.581840730664341, + -8.188464657045806, + -7.984637447786009 + ], + "(5, 1, 1, 5, 1)": [ + -146.57110473216096, + -16.80124781658259, + -38.9024334529018 + ], + "(5, 1, 0, 5, 1)": [ + -12.233626111174665, + -29.89971358865652, + -12.308922528283345 + ], + "(5, 0, 0, 5, 1)": [ + -11.777609487500728, + -10.856860694858064, + -9.202115025810192 + ], + "(4, 0, 0, 5, 1)": [ + -2.5612929024199738, + -3.0886806887815372, + -1.7967682184999256 + ], + "(5, 0, 1, 5, 1)": [ + -15.333936592667815, + -12.541692939398601, + -124.28149277979192 + ], + "(4, 0, 1, 5, 1)": [ + -2.6085683166286406, + -3.1791384466830657, + -1.736400609147868 + ], + "(4, 1, 1, 5, 1)": [ + -1.7293352062281198, + -2.30617061164696, + -2.9030734040758843 + ], + "(4, 1, 0, 5, 1)": [ + -2.684069086067236, + -2.466780845040611, + -1.5180741662159034 + ], + "(1, 1, 0, 0, 0)": [ + -0.024789070105125956, + -0.0075217289243905356, + -0.018209466679464048 + ], + "(2, 1, 0, 0, 0)": [ + -0.1460584377642487, + -0.14294287165799524, + -0.12318002440270179 + ], + "(5, 1, 1, 2, 1)": [ + -7.8199466469582815, + -7.824869863024521, + -7.071568144537861 + ], + "(4, 1, 1, 4, 1)": [ + -3.00812910862564, + -3.0636189202552444, + -3.26484420019774 + ], + "(4, 1, 0, 4, 1)": [ + -3.1679320972033755, + -2.940800355271365, + -3.1710797009268554 + ], + "(4, 1, 0, 0, 0)": [ + -3.205336193222848, + -2.861221920215627, + -2.9660904434374284 + ], + "(1, 0, 1, 0, 0)": [ + -0.022374116776514512, + -0.006087568760539901, + -0.022624413419781938 + ], + "(1, 1, 1, 0, 0)": [ + -0.015337551229075113, + -0.007726550110573426, + -0.028441883799041376 + ], + "(5, 1, 1, 4, 0)": [ + -6.858672234210656, + -264.9787633292171, + -9.368267733867274 + ], + "(5, 1, 0, 4, 0)": [ + -6.763832787203489, + -133.0630328217745, + -9.310800869316676 + ], + "(5, 0, 0, 4, 0)": [ + -7.737498456636583, + -8.399778242217225, + -6.565626813501766 + ], + "(5, 1, 0, 5, 0)": [ + -9.921319792574753, + -20.73049636352885, + -26.62630405121402 + ], + "(5, 0, 0, 5, 0)": [ + -31.66707527265042, + -10.516962421080692, + -17.65856833020611 + ], + "(5, 0, 1, 5, 0)": [ + -29.379059120237507, + -9.522886174494472, + -55.53399974359518 + ], + "(5, 1, 1, 5, 0)": [ + -9.843935646871683, + -117.99589328100338, + -10.295374665350472 + ], + "(1, 0, 0, 0, 0)": [ + -0.016559523734369853, + -0.008228903479180136, + -0.01954171905937028 + ], + "(6, 1, 1, 2, 0)": [ + -1116.5144126711714, + -1057.0663804285532, + -1006.4410252993137 + ], + "(6, 1, 1, 1, 0)": [ + -973.1594826274455, + -1859.9553385448164, + -1517.6529328713239 + ], + "(6, 1, 0, 1, 0)": [ + -1236.2894842908408, + -1131.906764202921, + -1505.883621644145 + ], + "(6, 0, 0, 1, 0)": [ + -1466.0721319970694, + -1544.5142229844855, + -1152.9170897944741 + ], + "(6, 0, 1, 1, 0)": [ + -1570.7635068133768, + -981.4430142694713, + -1703.5183645294412 + ], + "(6, 1, 0, 1, 1)": [ + -1155.2567011764704, + -1032.1943847007128, + -1335.5446158661819 + ], + "(6, 0, 0, 1, 1)": [ + -1100.667912897434, + -2339.538301920014, + -1609.5225264067299 + ], + "(6, 0, 1, 1, 1)": [ + -1278.4581284785775, + -1684.889589986408, + -1029.4206215136228 + ], + "(6, 1, 1, 1, 1)": [ + -1453.3435071395206, + -1975.8622519262826, + -969.7839308859689 + ], + "(6, 1, 1, 2, 1)": [ + -2025.3196391545582, + -1835.3756213702516, + -1970.9568469251994 + ], + "(6, 1, 0, 2, 1)": [ + -1808.7411976548024, + -1926.8457198677565, + -1922.154254471494 + ], + "(6, 0, 0, 2, 1)": [ + -1879.5507853739712, + -1896.5155828780667, + -1900.3847160958696 + ], + "(6, 0, 1, 2, 1)": [ + -1838.546093861708, + -1947.2731890025766, + -1953.5502392507804 + ], + "(6, 1, 1, 3, 1)": [ + -2601.963351793299, + -1520.7929543903476, + -2009.1839631971604 + ], + "(6, 1, 0, 3, 1)": [ + -2538.9830465698537, + -1470.5364589013388, + -2556.7724197874645 + ], + "(6, 0, 0, 3, 1)": [ + -2415.7430327611105, + -1480.6332741347496, + -2389.3712015666824 + ], + "(6, 0, 1, 3, 1)": [ + -1427.037154226102, + -2468.0867126015783, + -2693.097591883856 + ], + "(6, 1, 1, 4, 1)": [ + -2528.502350850205, + -1019.9324960749066, + -2399.1506249762306 + ], + "(6, 1, 0, 4, 1)": [ + -1011.0413400551581, + -2743.7810832747255, + -1972.5007198389508 + ], + "(6, 0, 0, 4, 1)": [ + -2296.5878845237426, + -1153.1131816139768, + -2287.6304479319706 + ], + "(6, 0, 1, 4, 1)": [ + -1041.4282409867158, + -2719.908177221292, + -2718.5135630922123 + ], + "(6, 1, 1, 5, 1)": [ + -294.39123552343875, + -1250.822627678743, + -2798.5589219834333 + ], + "(6, 1, 0, 5, 1)": [ + -3357.830654247613, + -294.5761052752778, + -2102.6742725104464 + ], + "(6, 0, 0, 5, 1)": [ + -300.0150698687376, + -2449.74821396103, + -1705.4349967068156 + ], + "(6, 0, 1, 5, 1)": [ + -300.12135420445907, + -2189.804585497691, + -1751.3784784308189 + ], + "(5, 1, 0, 0, 0)": [ + -8.031772491032987, + -6.795735492938614, + -7.499899268094892 + ], + "(6, 1, 0, 5, 0)": [ + -1785.8124786328717, + -1063.459164590437, + -600.1942675997082 + ], + "(6, 0, 0, 5, 0)": [ + -1060.43907183845, + -586.2639856018499, + -1130.7244425421625 + ], + "(6, 0, 1, 5, 0)": [ + -1284.8186703543374, + -1208.509487610621, + -609.6653379439501 + ], + "(6, 1, 1, 5, 0)": [ + -1192.7341066601605, + -600.924762931327, + -1785.5614365309605 + ], + "(6, 0, 0, 4, 0)": [ + -1174.0083559070758, + -2028.4199603906045, + -2156.1684423507136 + ], + "(6, 0, 1, 4, 0)": [ + -2540.949512040624, + -2233.986752517052, + -1106.9090750131995 + ], + "(6, 1, 1, 4, 0)": [ + -1743.30513025061, + -2475.314499777569, + -1085.0861281545672 + ], + "(6, 1, 0, 4, 0)": [ + -1071.798513651489, + -2240.6300952840056, + -1979.464227039147 + ], + "(6, 0, 0, 3, 0)": [ + -2280.5458022568973, + -2534.7749689606944, + -1389.9764829156918 + ], + "(6, 0, 1, 3, 0)": [ + -2255.080462459018, + -2221.34171538017, + -1368.4724537300879 + ], + "(6, 1, 1, 3, 0)": [ + -2223.4327566394413, + -1452.9122175437542, + -2363.8219199208106 + ], + "(6, 1, 0, 3, 0)": [ + -2113.4480170748416, + -2126.3965731071935, + -1422.2125476270976 + ], + "(6, 0, 1, 2, 0)": [ + -862.9705226501901, + -885.050497775557, + -946.2179144798675 + ], + "(6, 1, 0, 2, 0)": [ + -885.1094302868878, + -841.5076360251412, + -938.5948842174429 + ], + "(6, 0, 0, 2, 0)": [ + -846.2577639094857, + -1135.7882685222858, + -989.109655789047 ] } } \ No newline at end of file diff --git a/models/q_pendulum.json b/models/q_pendulum.json deleted file mode 100644 index 24b3925..0000000 --- a/models/q_pendulum.json +++ /dev/null @@ -1,1258 +0,0 @@ -{ - "date": "30.04.2026 05:15:03", - "pendulum": { - "start_speed": "0.0", - "render_mode": "none", - "reward_limit": "1000.0" - }, - "q_agent": { - "use_trained": "True", - "filename": "/home/se/osp/packages/crane-controller/models/q_pendulum.json", - "episodes": "10000", - "steps": "19991482", - "learning_rate": "0.1", - "discount_factor": "0.95" - }, - "q_values": { - "(1, 0, 0, 1, 1)": [ - -0.0015285453382582262, - -0.0019110699513047503, - -0.000421685773718873 - ], - "(1, 0, 0, 0, 0)": [ - 0.0016483778628561532, - 0.0009174558585016858, - 0.0001847120557717193 - ], - "(1, 1, 1, 1, 0)": [ - -0.00011618763900436013, - 0.0021056726444264756, - -0.0009250088093969632 - ], - "(2, 0, 0, 1, 1)": [ - 0.30381525310187946, - 0.13268574959167037, - 0.08968956867959964 - ], - "(2, 0, 1, 1, 1)": [ - 0.07021166494175266, - 0.11544068028302096, - 0.2655879939625879 - ], - "(2, 1, 1, 2, 1)": [ - 0.0468700802191448, - 0.24296967824838114, - 0.057465378203944484 - ], - "(2, 1, 0, 2, 1)": [ - 0.247316722251548, - 0.07724841470718162, - 0.04444885410818501 - ], - "(2, 0, 0, 2, 1)": [ - 0.03151075349886775, - 0.1198098266764795, - 0.026761926901275757 - ], - "(2, 0, 0, 3, 1)": [ - 0.24750790139852671, - -0.00742543468925339, - 0.003439802770232106 - ], - "(2, 0, 1, 3, 1)": [ - 0.013165205849978824, - 0.020782332264133313, - 0.16600804643720815 - ], - "(2, 1, 1, 3, 1)": [ - 0.006877018618653728, - 0.017372356548709385, - 0.1822037784645431 - ], - "(2, 1, 0, 3, 1)": [ - 0.011260461429967967, - -0.06408511029671254, - 0.16832760241231254 - ], - "(2, 1, 0, 4, 1)": [ - 0.30877072872600403, - 0.17712588766549373, - -0.11992985889469697 - ], - "(2, 0, 0, 4, 1)": [ - 0.07171333312506538, - 0.3196709073875426, - -0.010305375893922684 - ], - "(2, 0, 1, 4, 1)": [ - 0.0460495219813757, - -0.025981954700818086, - 0.35798806472060796 - ], - "(2, 1, 1, 4, 1)": [ - 0.28024071171042864, - -0.08081625384759063, - -0.06021051977246365 - ], - "(2, 0, 1, 5, 1)": [ - 0.11199272160151952, - 0.34003948184320887, - 0.15555212679650068 - ], - "(2, 1, 1, 5, 1)": [ - -0.06388301321252567, - -0.27230305038177305, - 0.3227408520413516 - ], - "(2, 1, 0, 5, 1)": [ - 0.33544847358707, - -0.014778838303531092, - -0.13036007932481597 - ], - "(2, 0, 0, 5, 1)": [ - 0.3368562070401561, - -0.06442413772899995, - 0.015851813972102308 - ], - "(1, 1, 1, 5, 1)": [ - -0.873610573166523, - -0.8795035200229879, - -0.8813170678799008 - ], - "(1, 1, 0, 5, 1)": [ - -0.8588580712968287, - -0.8603630825591916, - -0.8545640919171729 - ], - "(1, 0, 0, 5, 1)": [ - -0.876058331400781, - -0.8812733294953802, - -0.8781109627654614 - ], - "(1, 0, 1, 5, 1)": [ - -0.8754681221299438, - -0.8811483806653537, - -0.8795342715024759 - ], - "(2, 1, 1, 1, 1)": [ - 0.2575141349768899, - 0.14721086451092427, - 0.13938193635472462 - ], - "(2, 0, 1, 2, 1)": [ - 0.049090745483137355, - 0.035345162836350655, - 0.1850890582095332 - ], - "(3, 0, 0, 3, 1)": [ - 0.408660876661018, - 0.42698247924321825, - 0.40792534233546174 - ], - "(3, 0, 1, 3, 1)": [ - 0.3600676621922624, - 0.3929021532144681, - 0.461063559575569 - ], - "(3, 1, 1, 3, 1)": [ - 0.43092477422897313, - 0.4760286469676715, - 0.5329087094566657 - ], - "(3, 1, 0, 3, 1)": [ - 0.4099435292952729, - 0.43676458251571, - 0.5251269059135935 - ], - "(3, 0, 0, 4, 1)": [ - 0.4048621627470891, - 0.4066271465074262, - 0.4043352559362854 - ], - "(3, 0, 1, 4, 1)": [ - 0.39328686645976846, - 0.39556738781196227, - 0.3959743788190199 - ], - "(3, 1, 0, 5, 1)": [ - 0.2918677426270124, - 0.2808605809982236, - 0.3364418740886684 - ], - "(3, 0, 0, 5, 1)": [ - 0.015025569672587752, - 0.08196942899783732, - 0.3327158807318435 - ], - "(3, 0, 1, 5, 1)": [ - 0.15452953096605598, - 0.32706016277878186, - 0.19602635793745557 - ], - "(2, 1, 0, 1, 1)": [ - 0.28308955078023956, - 0.16197169711955506, - 0.11997498874359913 - ], - "(3, 1, 1, 5, 1)": [ - 0.04055530756891616, - 0.2713994534576125, - 0.39683102819432226 - ], - "(4, 0, 0, 5, 1)": [ - 4.061952905462236, - 1.8796422036374005, - 2.6392271976381876 - ], - "(4, 0, 1, 5, 1)": [ - 1.8612065508222904, - 2.103909066858137, - 4.240572243261516 - ], - "(4, 1, 1, 5, 1)": [ - 2.7147234118909207, - 4.2477919190765006, - 2.532801305018678 - ], - "(4, 1, 0, 5, 1)": [ - 5.335646400509759, - 2.3417395159744956, - 2.8731429101445904 - ], - "(1, 0, 1, 1, 1)": [ - -0.003409519735202579, - -0.0013383819217571565, - 0.0002056980625474665 - ], - "(3, 1, 1, 4, 1)": [ - 0.38529100751464557, - 0.3942557035549322, - 0.4431156152070642 - ], - "(3, 0, 0, 2, 1)": [ - 0.5090782560731483, - 0.4798070339288543, - 0.4440706186764382 - ], - "(3, 0, 1, 2, 1)": [ - 0.4031617038672731, - 0.41820257002525474, - 0.4254288577893825 - ], - "(3, 1, 0, 2, 1)": [ - 0.5383778912624413, - 0.5816045650663727, - 0.44907309167118936 - ], - "(3, 0, 0, 1, 1)": [ - 0.3820396000856337, - 0.4244240876422671, - 0.4809947245965916 - ], - "(3, 0, 1, 1, 1)": [ - 0.48309577607918963, - 0.4359746680582087, - 0.47844205657321176 - ], - "(3, 1, 1, 2, 1)": [ - 0.4510595166267413, - 0.5413951132995184, - 0.5396546938623438 - ], - "(3, 1, 0, 4, 1)": [ - 0.4911755694970669, - 0.4273041013300876, - 0.4113438183162773 - ], - "(3, 1, 0, 1, 1)": [ - 0.41206946560587604, - 0.4276691064016972, - 0.3891151329059017 - ], - "(3, 0, 0, 1, 0)": [ - 0.595092804268447, - 0.5709074723626882, - 0.4357015522877032 - ], - "(3, 0, 1, 1, 0)": [ - 0.5048087137826464, - 0.5131171175030076, - 0.5824969529639638 - ], - "(2, 0, 1, 1, 0)": [ - 0.16890785501899347, - 0.07849898959202127, - 0.13065691356841727 - ], - "(2, 1, 1, 1, 0)": [ - -0.0019192156044434555, - 0.11937402910019926, - 0.06218611939997548 - ], - "(2, 1, 0, 1, 0)": [ - 0.15656530313154501, - 0.05852070858351637, - 0.05917317431102258 - ], - "(2, 0, 0, 1, 0)": [ - 0.11925737271077642, - 0.06270232978106371, - 0.016145004918409697 - ], - "(3, 1, 1, 1, 1)": [ - 0.415554313371666, - 0.4251120871709033, - 0.41738534617858564 - ], - "(3, 1, 0, 1, 0)": [ - 0.5175638162159195, - 0.4768692444308892, - 0.4092874554117059 - ], - "(1, 1, 0, 1, 0)": [ - 0.007559388663013664, - -0.07141246975944493, - -0.03218011823701119 - ], - "(1, 1, 1, 1, 1)": [ - -0.006336313500421211, - -0.00722006182105164, - -0.015438778111669823 - ], - "(1, 1, 0, 1, 1)": [ - -0.011637555446352072, - -0.03469500547718182, - -0.06946810336387721 - ], - "(1, 1, 0, 2, 1)": [ - -0.02059287808812973, - -0.020207666113278937, - -0.023751195001154267 - ], - "(1, 0, 0, 2, 1)": [ - -0.03136891469721944, - -0.018845272510248604, - -0.025639212801306065 - ], - "(2, 0, 0, 2, 0)": [ - -0.007405306099820059, - 0.13416722893659513, - -0.003863979660054713 - ], - "(3, 0, 0, 2, 0)": [ - 0.4968529980315005, - 0.6083878273580536, - 0.5107250954251326 - ], - "(3, 0, 1, 2, 0)": [ - 0.4572105904076367, - 0.48251636216964044, - 0.5371402979328573 - ], - "(3, 1, 1, 2, 0)": [ - 0.5834210121161674, - 0.5447607381569435, - 0.6522461652145303 - ], - "(3, 1, 1, 3, 0)": [ - 0.4515300417767746, - 0.45066875186289224, - 0.6830079417945389 - ], - "(3, 1, 0, 3, 0)": [ - 0.5338016897375181, - 0.5414142734086245, - 0.6346264676956274 - ], - "(3, 0, 0, 3, 0)": [ - 0.561690114055678, - 0.5920536892988973, - 0.5543067752647609 - ], - "(3, 0, 1, 3, 0)": [ - 0.5489920980754698, - 0.5660011505184062, - 0.5167225836179886 - ], - "(2, 1, 1, 3, 0)": [ - 0.1494485963494498, - -0.03830396513846329, - 0.015657549848606813 - ], - "(2, 1, 0, 3, 0)": [ - 0.20593271843361607, - 0.09479740257152519, - 0.0959316384523621 - ], - "(2, 1, 0, 2, 0)": [ - 0.13616448787873342, - 0.019560267471690474, - -0.005724736049839602 - ], - "(3, 1, 0, 2, 0)": [ - 0.683590879589438, - 0.5526158769509005, - 0.46954602590689115 - ], - "(1, 0, 0, 1, 0)": [ - 0.03733255481235882, - -0.02849128758664682, - -0.09589936241358511 - ], - "(1, 1, 1, 2, 1)": [ - -0.006083016288581055, - -0.03523377742840035, - -0.019203666274691625 - ], - "(1, 0, 1, 2, 1)": [ - -0.01686144825783039, - -0.008924069806829863, - 0.009536322538022453 - ], - "(1, 0, 1, 3, 1)": [ - -0.034434632147796705, - 0.00024112079172242465, - -0.03197066856336422 - ], - "(1, 1, 1, 3, 1)": [ - -0.01895592863353697, - -0.04411521018370294, - 0.01775191105812379 - ], - "(1, 1, 0, 3, 1)": [ - 0.04225706506102414, - -0.0367929078115716, - -0.04368072481979268 - ], - "(1, 0, 0, 3, 1)": [ - -0.007437638387498356, - -0.044450404397953926, - -0.04469796462300711 - ], - "(1, 1, 1, 4, 1)": [ - -0.09646741076342318, - -0.09875923262296923, - -0.07611277807180256 - ], - "(1, 1, 0, 4, 1)": [ - 0.004840534632955751, - -0.09842756570162219, - -0.09016058064434311 - ], - "(1, 0, 0, 4, 1)": [ - -0.09004032812642203, - -0.07791186134035129, - -0.09719535819232616 - ], - "(1, 0, 1, 4, 1)": [ - -0.05966874855523139, - 0.00806343851278417, - -0.0359359869255538 - ], - "(1, 0, 1, 1, 0)": [ - -0.020070667836140862, - -0.00023703353233769307, - -0.019699742890545824 - ], - "(1, 0, 1, 2, 0)": [ - -0.08614089449335621, - -0.07468383088946322, - -0.028281994617095248 - ], - "(1, 1, 1, 2, 0)": [ - -0.020887757859586534, - -0.05007737176424587, - 0.013443648795931901 - ], - "(1, 1, 0, 2, 0)": [ - -0.25387563088246234, - -0.008011626613088369, - -0.18283538351700016 - ], - "(1, 1, 0, 3, 0)": [ - -0.07464578664914494, - -0.043449407581580696, - -0.11463260589847274 - ], - "(1, 0, 0, 3, 0)": [ - -0.14350968802347358, - -0.04083978797784146, - -0.09909284163171486 - ], - "(1, 0, 1, 3, 0)": [ - -0.1370625750166114, - -0.0724585837043522, - -0.0009240473895465921 - ], - "(1, 1, 1, 3, 0)": [ - -0.03626126792752658, - -0.03710154477294096, - 0.0032683572316288146 - ], - "(1, 0, 1, 4, 0)": [ - 0.0014061010064767788, - -0.04452670073239082, - -0.07821196453222311 - ], - "(1, 1, 1, 4, 0)": [ - -0.17474951197312322, - -0.5414578832524665, - -0.22510473565580394 - ], - "(1, 1, 0, 4, 0)": [ - -0.1328897390182134, - -0.034781929591368305, - -0.16080111281963685 - ], - "(1, 0, 0, 4, 0)": [ - -0.1475330350868065, - -0.18227419935411793, - 0.001484675759361425 - ], - "(1, 0, 0, 5, 0)": [ - -0.9545247785708878, - -0.9514659970621401, - -0.90452487601084 - ], - "(1, 0, 1, 5, 0)": [ - -0.8391556754298948, - -0.7701522287778763, - -0.8233480591505404 - ], - "(1, 1, 1, 5, 0)": [ - -1.093243461459317, - -1.1130313370385934, - -1.117598650488551 - ], - "(1, 1, 0, 5, 0)": [ - -1.060052207589391, - -1.0520482450609705, - -1.0541775063616219 - ], - "(2, 0, 1, 2, 0)": [ - 0.0019578641658367663, - 0.025663384896343185, - 0.1263307771397902 - ], - "(2, 0, 1, 3, 0)": [ - 0.023588571331503803, - 0.12134317356917385, - 0.2760718263547822 - ], - "(2, 0, 0, 3, 0)": [ - 0.1161666059796964, - 0.2235732549534617, - 0.07430355449847614 - ], - "(2, 1, 1, 2, 0)": [ - 0.03458905003176114, - 0.0007093755508323987, - 0.17288176348599543 - ], - "(1, 0, 1, 0, 0)": [ - 0.0011937985794666583, - 0.0006577923193096143, - -8.048310965484833e-05 - ], - "(1, 1, 1, 0, 0)": [ - 0.0015724376946350388, - 0.0007011948995402796, - -7.399361560918754e-05 - ], - "(2, 0, 0, 4, 0)": [ - -0.05649924448818272, - -0.09895201781380289, - 0.010597525817515366 - ], - "(2, 0, 1, 4, 0)": [ - -0.08358002678014068, - -0.09810695789263416, - -0.00041284702559314396 - ], - "(2, 1, 1, 4, 0)": [ - 0.09217839560450072, - -0.017320517480429995, - -0.03878804552748378 - ], - "(2, 1, 0, 4, 0)": [ - 0.1925844035349752, - 0.012835236335966602, - -0.042144040424107326 - ], - "(2, 1, 0, 5, 0)": [ - -1.4444514200032612, - -1.445392257262375, - -1.4481597245532174 - ], - "(2, 0, 0, 5, 0)": [ - -1.4712160523544338, - -1.470824695284624, - -1.3327809396730481 - ], - "(2, 0, 1, 5, 0)": [ - -1.4469254687808646, - -1.5299065594273575, - -1.5281209393177229 - ], - "(2, 1, 1, 5, 0)": [ - -1.3128182215345525, - -1.4477609597552596, - -1.4392818680144006 - ], - "(3, 1, 1, 1, 0)": [ - 0.45806194208553763, - 0.46093042135097084, - 0.474475379606745 - ], - "(4, 0, 1, 4, 1)": [ - 1.4164846977098555, - 1.4459868052131215, - 1.4616804923252622 - ], - "(4, 1, 1, 4, 1)": [ - 1.4129498511120588, - 1.4025285190325392, - 1.4393948253927626 - ], - "(1, 1, 0, 0, 0)": [ - 0.0010373859416610812, - 0.0011703526531334982, - 0.0007493443523265281 - ], - "(1, 0, 0, 2, 0)": [ - -0.10532136935062486, - -0.03584791600007468, - -0.11854695228463348 - ], - "(3, 0, 1, 5, 0)": [ - 0.02285934492582601, - -0.07103977867880287, - 0.019668059978482654 - ], - "(3, 1, 1, 5, 0)": [ - 0.03469354291860075, - 0.044038976296537, - 0.013242232441255847 - ], - "(3, 1, 0, 5, 0)": [ - -0.020181802884764344, - 0.06649176778651363, - 0.06509248190323355 - ], - "(3, 0, 0, 5, 0)": [ - 0.028824321631020555, - 0.029977268479488877, - 0.026545109024266954 - ], - "(3, 1, 0, 4, 0)": [ - 0.6296155314616831, - 0.4336608270212875, - 0.39276605272085297 - ], - "(3, 0, 0, 4, 0)": [ - 0.7770847854086554, - 0.5242727900048311, - 0.5206170117506856 - ], - "(3, 0, 1, 4, 0)": [ - 0.5314214160012682, - 0.7844820846414253, - 0.5074484536943829 - ], - "(3, 1, 1, 4, 0)": [ - 0.3754666321452126, - 0.7229753308135625, - 0.3995770969535575 - ], - "(4, 1, 0, 4, 1)": [ - 1.4963873160873034, - 1.467341373698872, - 1.4384319896246058 - ], - "(4, 1, 0, 3, 1)": [ - 1.5752245110522871, - 1.5602010532290964, - 1.492566856395298 - ], - "(4, 0, 0, 3, 1)": [ - 1.519151228092836, - 1.5227125117824454, - 1.4903275891051206 - ], - "(4, 0, 0, 4, 1)": [ - 1.6473288659015743, - 1.7275422975605321, - 1.5048793902151347 - ], - "(4, 0, 1, 3, 1)": [ - 1.4129889090497951, - 1.452240570193209, - 1.4625105948676116 - ], - "(4, 1, 1, 3, 1)": [ - 1.4646407295985004, - 1.4732073804218064, - 1.511095490878426 - ], - "(4, 1, 0, 2, 1)": [ - 2.106400147645301, - 1.6356823386754527, - 1.6995586432240426 - ], - "(4, 0, 0, 2, 1)": [ - 2.161395368605027, - 1.5237311046844422, - 1.8173060474051923 - ], - "(4, 0, 0, 1, 1)": [ - 2.3493776509278357, - 1.7130386451873514, - 1.8850438496049542 - ], - "(4, 0, 1, 1, 1)": [ - 2.1151543614085875, - 1.6543782490876844, - 2.2703735803195966 - ], - "(4, 1, 1, 1, 1)": [ - 1.918925083602411, - 1.74973854680099, - 2.5088229704031644 - ], - "(4, 1, 1, 1, 0)": [ - 1.7371298756417777, - 1.962531149214229, - 2.264878889586818 - ], - "(4, 1, 0, 1, 0)": [ - 2.020061243093679, - 1.8524421509129365, - 1.9286353167781694 - ], - "(4, 0, 0, 1, 0)": [ - 1.6817658822452428, - 1.6421444458419396, - 2.3586227153499326 - ], - "(4, 0, 1, 1, 0)": [ - 1.78836241223083, - 1.848369564939383, - 2.453235378342548 - ], - "(4, 0, 1, 2, 1)": [ - 1.5272002349823173, - 1.774756715807296, - 2.2631339867701725 - ], - "(4, 1, 0, 1, 1)": [ - 1.9677313784165418, - 2.433707323529033, - 1.7422610937368759 - ], - "(4, 1, 1, 2, 1)": [ - 1.490825730025895, - 1.6990871895059803, - 2.1039556756595323 - ], - "(5, 1, 0, 5, 1)": [ - 6.123750372525588, - 8.70575880253172, - 6.260498065482083 - ], - "(5, 0, 0, 5, 1)": [ - 7.308611772562493, - 5.240209399773695, - 5.920309823658606 - ], - "(5, 0, 1, 5, 1)": [ - 6.96203305289973, - 4.890002993836127, - 11.78691576141891 - ], - "(5, 1, 1, 5, 1)": [ - 6.713821193839766, - 9.316098624644017, - 5.311107957816669 - ], - "(6, 1, 1, 5, 1)": [ - 15.047660106650373, - 16.821457503565934, - 27.71374620203335 - ], - "(6, 1, 0, 5, 1)": [ - 16.384453849684327, - 28.353343581666334, - 20.687843932731177 - ], - "(6, 0, 0, 5, 1)": [ - 30.01197247830154, - 18.86235490305763, - 19.344672586909752 - ], - "(6, 0, 1, 5, 1)": [ - 26.558921440960397, - 18.868850427579066, - 16.828520283531955 - ], - "(4, 0, 1, 3, 0)": [ - 2.1925640020257102, - 2.95691906279798, - 3.4723878527181853 - ], - "(4, 1, 1, 3, 0)": [ - 2.198797063712139, - 2.21724652824473, - 4.963837212356006 - ], - "(4, 1, 0, 3, 0)": [ - 3.886035854924468, - 2.4084368048531406, - 2.8785873750775908 - ], - "(4, 0, 0, 3, 0)": [ - 2.4390869073407133, - 3.1202053796624596, - 3.440342237225939 - ], - "(4, 1, 1, 2, 0)": [ - 1.7198249761230124, - 1.7264336589470106, - 2.55030041839504 - ], - "(4, 1, 0, 2, 0)": [ - 2.857534274934687, - 1.8560661471861224, - 1.7892755484782197 - ], - "(4, 1, 0, 4, 0)": [ - 5.208515876962349, - 4.076311172617219, - 3.1256266560673907 - ], - "(4, 0, 0, 4, 0)": [ - 5.359684776234321, - 2.8072297945126206, - 3.9345761324135915 - ], - "(4, 0, 1, 4, 0)": [ - 3.2715111780893653, - 5.189496212005362, - 4.395806899462235 - ], - "(4, 1, 1, 4, 0)": [ - 3.536815804580715, - 3.9015860629086827, - 5.135748652698586 - ], - "(4, 0, 1, 5, 0)": [ - -0.8730882647726272, - -0.8192135917755976, - -0.8542523954122301 - ], - "(4, 1, 1, 5, 0)": [ - -0.8245347871065521, - -0.8326455650944975, - 0.9991824483293552 - ], - "(4, 0, 1, 2, 0)": [ - 1.9753930346045618, - 1.9649213400482635, - 1.9809836107767345 - ], - "(4, 1, 0, 5, 0)": [ - -0.6336931013817524, - 1.110335983119446, - 0.010250432901592221 - ], - "(4, 0, 0, 5, 0)": [ - -0.5955443430025976, - -0.5479728074067413, - -0.5137459310071231 - ], - "(4, 0, 0, 2, 0)": [ - 2.306030089074062, - 2.0513914882428184, - 1.7358723965792504 - ], - "(5, 0, 1, 2, 1)": [ - 5.938331314830866, - 5.923671010454649, - 6.322198810091958 - ], - "(5, 0, 1, 1, 1)": [ - 6.3713621509072205, - 4.278415316748207, - 5.217314857720529 - ], - "(5, 1, 0, 1, 1)": [ - 6.271680380359423, - 6.118414945090114, - 5.863101745784359 - ], - "(5, 0, 0, 1, 1)": [ - 6.343186747568721, - 5.938795353886484, - 6.033491402716604 - ], - "(5, 1, 1, 1, 1)": [ - 5.855501877516305, - 5.146222646836102, - 6.270943831177874 - ], - "(5, 1, 1, 2, 1)": [ - 5.965178381510156, - 4.951535473108393, - 6.335327059170063 - ], - "(5, 1, 0, 2, 1)": [ - 6.101590240378415, - 5.943638909366957, - 6.166377646864589 - ], - "(5, 1, 0, 3, 1)": [ - 9.399681750212956, - 6.046443374728028, - 5.472047895906149 - ], - "(5, 0, 0, 3, 1)": [ - 7.264852310738755, - 6.100976298895757, - 10.121931565466037 - ], - "(5, 0, 1, 3, 1)": [ - 6.058497642090931, - 6.64055605254837, - 12.820985400788588 - ], - "(5, 1, 1, 3, 1)": [ - 6.295127566601765, - 8.86480034761974, - 6.525986911785163 - ], - "(5, 0, 0, 4, 1)": [ - 11.620473329796793, - 5.852233709190965, - 6.172684561311558 - ], - "(5, 0, 1, 4, 1)": [ - 5.853903246175382, - 7.465633418352998, - 14.203272816632714 - ], - "(5, 1, 1, 4, 1)": [ - 8.411250446883901, - 6.821876889600531, - 10.420607535997695 - ], - "(5, 1, 0, 4, 1)": [ - 10.978468161677114, - 6.095771009776962, - 7.448828231947645 - ], - "(5, 0, 0, 5, 0)": [ - 4.168560040349653, - 4.1193373810885126, - 4.189200305683654 - ], - "(5, 0, 1, 5, 0)": [ - 3.9037126196648213, - 3.952725477446389, - 3.925950696362765 - ], - "(5, 0, 0, 4, 0)": [ - 6.989124827386673, - 6.709668768383307, - 6.164502340428653 - ], - "(5, 0, 1, 4, 0)": [ - 6.470192212401894, - 6.206583505620243, - 6.219341416738382 - ], - "(5, 1, 1, 4, 0)": [ - 6.44804048006831, - 6.470249716808012, - 6.499092139332864 - ], - "(5, 1, 0, 4, 0)": [ - 6.60974475903126, - 5.809620089830466, - 6.38325714226122 - ], - "(5, 0, 1, 3, 0)": [ - 5.902298693239425, - 6.513993949524509, - 6.050931365245501 - ], - "(5, 1, 1, 3, 0)": [ - 5.7219438824090165, - 6.654252839175707, - 5.854631300383308 - ], - "(5, 1, 0, 3, 0)": [ - 7.060124662461811, - 6.133863344872211, - 5.887388222544612 - ], - "(5, 1, 0, 2, 0)": [ - 6.420811088645497, - 5.484591712572488, - 5.344338090966727 - ], - "(5, 1, 0, 1, 0)": [ - 7.60161765328693, - 5.415707409756238, - 5.625087230101972 - ], - "(5, 0, 0, 1, 0)": [ - 6.362344373068486, - 6.250819401040948, - 5.0532246397904155 - ], - "(5, 0, 0, 2, 1)": [ - 6.389023020089472, - 5.921270205667463, - 5.710168906134173 - ], - "(2, 1, 1, 0, 0)": [ - 0.007418340685015537, - 0.0, - 0.0 - ], - "(5, 1, 1, 5, 0)": [ - 3.993346037475164, - 4.02595780895983, - 3.958113797811793 - ], - "(5, 1, 0, 5, 0)": [ - 3.8704975586426262, - 3.829895425894513, - 3.8484935557684774 - ], - "(5, 0, 0, 3, 0)": [ - 7.206895605095726, - 6.361422712879813, - 6.382153739961362 - ], - "(6, 1, 1, 3, 0)": [ - 39.16516514968102, - 0.0, - 13.874993945259016 - ], - "(6, 1, 0, 3, 0)": [ - 189.25859455848735, - 0.0, - 29.91897931545399 - ], - "(6, 1, 0, 2, 0)": [ - 17.158262188709795, - 1.9514931582028616, - 0.0 - ], - "(6, 0, 0, 1, 0)": [ - 25.614850876813907, - 0.0, - 6.3154150574104975 - ], - "(6, 0, 0, 1, 1)": [ - 17.352813028917932, - 2.580182984411188, - 2.140465724900898 - ], - "(6, 0, 1, 1, 1)": [ - 31.2334214211808, - 4.9985873791887645, - 0.0 - ], - "(6, 0, 1, 2, 1)": [ - 29.335273825224643, - 14.06297569453392, - 21.55271341124275 - ], - "(6, 1, 1, 3, 1)": [ - 23.25511720982458, - 16.649397764488587, - 19.90803592789075 - ], - "(6, 1, 0, 3, 1)": [ - 26.80171996379373, - 0.0, - 18.557566348591283 - ], - "(5, 0, 0, 2, 0)": [ - 6.128584915294166, - 4.74501528893155, - 5.71323506758402 - ], - "(5, 0, 1, 1, 0)": [ - 5.433105157444771, - 6.061572284699453, - 5.812568088606896 - ], - "(5, 0, 1, 2, 0)": [ - 9.299494331173243, - 4.798479530028196, - 5.0529263281147205 - ], - "(5, 1, 1, 1, 0)": [ - 5.411730171435421, - 5.336890832671549, - 3.6940890253938563 - ], - "(6, 1, 0, 4, 1)": [ - 46.0361726410884, - 185.7281789946067, - 24.898756482539923 - ], - "(6, 0, 0, 4, 1)": [ - 240.5192583338726, - 19.671210374109826, - 32.44011863831897 - ], - "(6, 0, 1, 4, 1)": [ - 217.5041757792318, - 36.04632868615748, - 35.48728683017791 - ], - "(6, 1, 0, 5, 0)": [ - 43.831876602918115, - 27.8889817150394, - 41.01229025098874 - ], - "(6, 0, 0, 5, 0)": [ - 37.31076342912965, - 72.17808547747593, - 93.69829260586646 - ], - "(6, 0, 1, 5, 0)": [ - 30.225634154900494, - 57.043973946193184, - 19.12245464571805 - ], - "(6, 1, 1, 5, 0)": [ - 22.31531135227297, - 31.702532410298858, - 24.52593989472061 - ], - "(6, 1, 0, 4, 0)": [ - 51.69128813332314, - 43.10494568818312, - 31.630799280419943 - ], - "(6, 0, 0, 4, 0)": [ - 118.94112981801939, - 21.91343878965308, - 0.0 - ], - "(6, 0, 1, 4, 0)": [ - 43.63117424617634, - 72.1459389593239, - 244.531009560538 - ], - "(6, 1, 1, 4, 1)": [ - 40.439091364812, - 62.86471099901328, - 28.21579086570153 - ], - "(5, 1, 1, 2, 0)": [ - 6.0763041725669105, - 3.2256356687419245, - 1.9883725448540135 - ], - "(2, 1, 0, 0, 0)": [ - 0.04124880442854498, - 0.0, - 0.0 - ], - "(6, 1, 1, 4, 0)": [ - 33.12059537789176, - 36.79265587145829, - 33.0038579587303 - ], - "(6, 0, 0, 3, 0)": [ - 6.610554709899747, - 0.0, - 0.0 - ], - "(6, 0, 0, 2, 0)": [ - 19.103288763514552, - 1.7250724331149645, - 0.0 - ], - "(6, 0, 1, 2, 0)": [ - 11.45538182633565, - 0.0, - 0.0 - ], - "(6, 0, 1, 1, 0)": [ - 36.245136836621846, - 0.0, - 0.0 - ], - "(6, 1, 1, 1, 0)": [ - 51.319980637299345, - 10.223271940420567, - 3.1856529540347966 - ], - "(6, 1, 1, 1, 1)": [ - 28.43873600008985, - 3.5188606871528423, - 5.206377154699371 - ], - "(6, 1, 0, 1, 1)": [ - 254.43695151567147, - 0.0, - 4.383567406279885 - ], - "(6, 1, 0, 2, 1)": [ - 4.645323738237858, - 41.06083981486784, - 0.0 - ], - "(6, 0, 0, 2, 1)": [ - 34.28350285678632, - 34.97694231722596, - 0.0 - ], - "(6, 0, 1, 3, 1)": [ - 23.303998337366593, - 23.665273191046108, - 23.58001108802269 - ], - "(4, 1, 1, 0, 0)": [ - 0.32071104927797534, - 0.0, - 0.0 - ], - "(6, 0, 0, 3, 1)": [ - 29.960345351525937, - 12.223389700753652, - 14.174347922430263 - ], - "(2, 0, 1, 0, 0)": [ - 0.023708233987275087, - 0.0, - 0.0 - ], - "(6, 1, 1, 2, 1)": [ - 32.770471384636984, - 0.0, - 0.0 - ], - "(6, 1, 1, 2, 0)": [ - 0.0, - 8.425163932932508, - 0.0 - ], - "(6, 1, 0, 1, 0)": [ - 11.400227838868048, - 2.5621867842074355, - 1.6266017364584542 - ], - "(6, 0, 1, 3, 0)": [ - 410.21798252237346, - 103.80547176610862, - 0.0 - ] - } -} \ No newline at end of file diff --git a/scripts/use_q_ide.py b/scripts/use_q_ide.py index 883abc7..f3532a4 100644 --- a/scripts/use_q_ide.py +++ b/scripts/use_q_ide.py @@ -64,7 +64,7 @@ def _args(base: dict[str, Any], upd: dict[str, Any]) -> dict[str, Any]: models = Path(__file__).parent.resolve().parent / "models" anti = { # anti-pendulum settings - "v0": 1.0, + "v0": -5.0, "render": "none", "reward": 0.0, "file": models / "q_anti-pendulum.json", @@ -84,9 +84,9 @@ def _args(base: dict[str, Any], upd: dict[str, Any]) -> dict[str, Any]: "t_fac": 0.0, } # ruff: disable[ERA001] ## we intentionally work with commenting out lines here - args = _args(anti, {"episodes": 2000}) # anti-pendulum (additional) training - # args = _args(pend, {'episodes':10000}) # pendulum training - # args = _args( anti, {"episodes": 10, "render": "plot","use_file":'r'}) # show anti-pendulum results + #args = _args(anti, {"episodes": 10000}) # anti-pendulum (additional) training + #args = _args(pend, {'episodes':1000}) # pendulum training + args = _args( anti, {"episodes": 10, "render": "plot","use_file":'r'}) # show anti-pendulum results # args = _args( pend, {"episodes": 10, "render": "plot", "use_file":'r'}) # show start pendulum results # args = args.update(_args(anti, {'dry-train':True,})) # check the setup before a long training # ruff: enable[ERA001] diff --git a/src/crane_controller/envs/controlled_crane_pendulum.py b/src/crane_controller/envs/controlled_crane_pendulum.py index 49f5ff2..72a6b00 100644 --- a/src/crane_controller/envs/controlled_crane_pendulum.py +++ b/src/crane_controller/envs/controlled_crane_pendulum.py @@ -68,7 +68,7 @@ class AntiPendulumEnv(gym.Env[AntiPendulumObs, int]): acc : float, optional Acceleration magnitude applied to the crane (default 0.1). start_speed : float, optional - Fixed start speed in degrees. A negative value causes a random speed + Fixed start speed in m/s. A negative value causes a random speed in the range ``[-|start_speed|, |start_speed|]`` each episode (default 1.0). render_mode : str, optional @@ -148,7 +148,6 @@ def __init__( # noqa: PLR0913 - environment API needs explicit parameters self.spaces_min = np.array((-size, -max_speed, 0.0, -max_speed), float) self.spaces_max = np.array((size, max_speed, np.pi, max_speed), float) self.observation_space = spaces.Box(self.spaces_min, self.spaces_max, shape=(4,), dtype=np.float64) - self.nresets: int = 0 self.acc = acc self.start_speed = start_speed @@ -192,11 +191,13 @@ def _init_discrete( (with ``'angles'`` replaced by ``'energies'``). """ # We replace the angles with pendulum energy levels, which are easier to use for observation calculation - observation_space = spaces.MultiDiscrete(np.array([len(spec[k]) for k in spec])) angles = spec.pop("angles") energies = [9.81 * self.wire.length * (1.0 - np.cos(np.radians(a))) for a in angles] - spec["energies"] = tuple(energies) - return (observation_space, spec) + _spec = {"energies" : tuple(energies)} + for k,v in spec.items(): + _spec.update({k:v}) + observation_space = spaces.MultiDiscrete(np.array([len(_spec[k]) for k in _spec])) + return (observation_space, _spec) def _reward_plot_init(self, marker: str = "") -> Line2D: point = plt.plot(0, 0, marker)[0] if marker else plt.plot(0, 0)[0] @@ -346,7 +347,7 @@ def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], floa obs: tuple[int, ...] | np.ndarray if len(self.discrete): - obs = self._get_discrete_obs(energy) + obs = self._get_discrete_obs(abs(energy)) err = 0 else: From 8e0acd568ba2224c3fdede1b3c7b1e47826003af Mon Sep 17 00:00:00 2001 From: Eisinger Date: Tue, 16 Jun 2026 10:26:33 +0200 Subject: [PATCH 06/11] Changes to Q-learning while trying to get it to work --- .../envs/controlled_crane_pendulum.py | 471 ++++++++++-------- tests/test_q.py | 253 +++++++++- 2 files changed, 518 insertions(+), 206 deletions(-) diff --git a/src/crane_controller/envs/controlled_crane_pendulum.py b/src/crane_controller/envs/controlled_crane_pendulum.py index 72a6b00..44f15f5 100644 --- a/src/crane_controller/envs/controlled_crane_pendulum.py +++ b/src/crane_controller/envs/controlled_crane_pendulum.py @@ -11,6 +11,7 @@ import matplotlib.pyplot as plt import numpy as np from gymnasium import spaces +from component_model.utils.transform import cartesian_to_spherical from py_crane.animation import AnimatePlayBackLines if TYPE_CHECKING: @@ -26,31 +27,22 @@ POLAR_Z_TOLERANCE = 0.1 -def _level(idx: int, val: float, categories: tuple[float, ...]) -> tuple[int, int]: +def _level(val: float, categories: tuple[float, ...]) -> int: """Determine the bucket index for a value given ordered categories. - Parameters - ---------- - idx : int - Fallback index returned when `val` falls below the first category. - val : float - Value to classify. - categories : tuple[float, ...] - Ordered category boundaries. - - Returns - ------- - tuple[int, int] - ``(bucket_index, error_flag)`` where *error_flag* is `idx` when the - value is below the first category and ``0`` otherwise. - """ - if val < categories[0]: - return 0, idx - return next( - ((i, 0) for i, category in enumerate(categories) if val <= category), - (len(categories) - 1, idx), - ) + val < categories[0] => -1, categories[k] <= val < categories[k+1] => k, val>=categories[-1] => -1 + + Args: + val (float): Value to classify. + categories (tuple[float, ...]): Ordered category boundaries. + Returns: + tuple[int, int]: ``bucket_index`` of value with respect to categories. -1 if outside categories. + """ + for i,x in enumerate(categories): + if val < x: + return i-1 + return -1 # Observation is either a discrete tuple or a continuous ndarray AntiPendulumObs = tuple[int, ...] | np.ndarray @@ -61,33 +53,22 @@ class AntiPendulumEnv(gym.Env[AntiPendulumObs, int]): Uses the matplotlib-based animation module from py-crane. - Parameters - ---------- - crane : Callable[..., Crane] - Factory callable that creates the crane object. - acc : float, optional - Acceleration magnitude applied to the crane (default 0.1). - start_speed : float, optional - Fixed start speed in m/s. A negative value causes a random speed - in the range ``[-|start_speed|, |start_speed|]`` each episode - (default 1.0). - render_mode : str, optional - One of the modes listed in ``metadata["render_modes"]`` - (default ``"none"``). - size : float, optional - Axis length in all directions (default 10.0). - seed : int or None, optional - Seed for repeatable random numbers (default None). - reward_limit : float, optional - Reward at which an episode is terminated and the anti-pendulum is - deemed successful (default 50.0). - dt : float, optional - Simulation time step (default 1.0). - discrete : dict[str, tuple[float | int, ...]] or None, optional - When provided, activates discrete observation mode with the given - category boundaries. Expected keys: ``"angles"``, ``"pos"``, - ``"speed"``, ``"distance"``, ``"sector"`` (default None). - reward_fac (tuple[float,...])=(1.0,0.0015,0.001): Weights between reward contributions + Args: + crane (Callable[..., Crane]): Factory callable that creates the crane object. + acc (float)=0.1: Acceleration magnitude applied to the crane. + start_speed (float)=1.0: Fixed start speed in m/s. A negative value causes a random speed + in the range ``[-|start_speed|, |start_speed|]`` each episode + render_mode (str)='none': One of the modes listed in ``metadata["render_modes"]`` + size (float)=0.0: Axis length in all directions + seed (int)=None: Seed for repeatable random numbers. + reward_limit (float)=None: Reward at which an episode is terminated and the anti-pendulum is deemed successful + reward_truncate (float)=None: Reward at which an episode is truncated. + Environment sets this reward to signal truncation. + dt (float)=1.0: Simulation time step + discrete (dict[str, tuple[float | int, ...]]: When provided, activates discrete observation mode with the given + category boundaries. Expected keys: `angle`,`pos`,`speed`,`distance`,`crane-sector`,`crane-speed` + reward_fac (tuple[float,...])=(1.0,0.005): Weights between reward contributions + discount (float) = 0.8: discount factor for acceleration history to include in (discrete) observation """ metadata: ClassVar[dict[str, object]] = { # pyright: ignore[reportIncompatibleVariableOverride] # Gymnasium metadata typing is loose @@ -104,6 +85,23 @@ class AntiPendulumEnv(gym.Env[AntiPendulumObs, int]): "x-max": None, } + DEFAULT_DISCRETE: ClassVar[dict[str, tuple[float | int, ...]]] = { + "angle": (0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 90.0), + "distance": (0.0, 0.5, 1.0, 2.0), + "pos": (0, 1), + "speed": (0, 1), + "c_pos": (0, 1), + "c_speed": (0, 1), + 'avg-acc': np.linspace(-1.25, 1.25, 11), + } + DISCRETE2: ClassVar[dict[str, tuple[float | int, ...]]] = { + 'angle': np.radians((-32,-16,-8,-4,-2,-1,0,1,2,4,8,16,32)), + 'speed': np.linspace(-5,5,11), # only x-component to preserve sign! + 'c-pos': np.array( (-2.0, -1.0, -0.5, -0.25, -0.125, 0, 0.125, 0.25, 0.5, 1.0, 2.0), float), + 'c-speed': np.array( (-2.0, -1.0, -0.5, -0.25, -0.125, 0, 0.125, 0.25, 0.5, 1.0, 2.0), float), + 'avg-acc': np.linspace(-1.25, 1.25, 11), + } + def __init__( # noqa: PLR0913 - environment API needs explicit parameters self, crane: Callable[..., Crane], @@ -112,10 +110,12 @@ def __init__( # noqa: PLR0913 - environment API needs explicit parameters render_mode: str = "none", size: float = 10.0, seed: int | None = None, - reward_limit: float = 50.0, + reward_limit: float|None = None, + reward_truncate: float|None = None, dt: float = 1.0, discrete: dict[str, tuple[float | int, ...]] | None = None, - reward_fac: tuple[float, float, float] = (1.0, 0.0015, 0.001), + reward_fac: tuple[float, float, float] = (1.0, 0.005), + discount: float = 0.8, ) -> None: """Initialize the anti-pendulum environment. @@ -129,6 +129,7 @@ def __init__( # noqa: PLR0913 - environment API needs explicit parameters assert render_mode in self.metadata["render_modes"], f"render_mode: {render_mode}" # type: ignore[operator] # metadata values are typed as object self.render_mode = render_mode self.reward_fac = reward_fac + self.discount = discount self.reward_stats: list[list[float]] = [] self._playback: list[list[float]] = [] self.rewards: list[float] = [] @@ -139,65 +140,108 @@ def __init__( # noqa: PLR0913 - environment API needs explicit parameters self.obeservation_space: spaces.Box | spaces.Discrete # pyright: ignore[reportMissingTypeArgument] # Discrete type arg not needed here # Continuous observations are crane position, crane velocity, wire polar angle, and load x-velocity. - self.min_speed = 0.1 # np.sqrt(2*reward_limit) # starting with less does not make sense (goal already reached) max_speed = np.sqrt(9.81 * self.wire.length) # speed for pendulum at +/- 90 deg. Polar as deflection from -z + self.discrete : dict[str, tuple[float | int, ...]] = {} # set by .init_discrete + observation_space + self.acc_hist : float = 0.0 # used for DISCRETE2. Set by .init_discrete + if discrete is not None: - self.observation_space, self.discrete = self._init_discrete(discrete) + self.init_discrete(discrete) else: - self.discrete = {} self.spaces_min = np.array((-size, -max_speed, 0.0, -max_speed), float) self.spaces_max = np.array((size, max_speed, np.pi, max_speed), float) self.observation_space = spaces.Box(self.spaces_min, self.spaces_max, shape=(4,), dtype=np.float64) - self.nresets: int = 0 + + self.dt = dt self.acc = acc + #self.dist_d2_max = abs(self.distance_max) + abs(self.speed_max*self.dt) + self.tau_max = self.distance_max / self.acc/ self.dt # time with min. speed from 0 to end + + self.nresets: int = 0 self.start_speed = start_speed self.size = size self.figsize: tuple[float, float] = (-size, size) # The matplotlib animation window - self.reward_limit = reward_limit + if reward_limit is None: # automatic limit + self.reward_limit = sum( f*x for f,x in zip(reward_fac, (self.energy_max,self.distance_max), strict=True)) + else: + self.reward_limit = reward_limit + + self.reward_truncate = 0 if reward_truncate is None else reward_truncate self.nsuccess: int = 0 - self.reward = 0.0 # a basic reward (pendulum energy + distance measure) - self.dt = dt + self.reward = 0.0 # start value for reward # We have 1 acceleration action which can each be min, zero or max, corresponding to acceleration of crane - self.action_space = spaces.Discrete(3, start=0, seed=42, dtype=np.int64) - self.action_to_acc = {0: -self.acc, 1: 0.0, 2: self.acc} + _ = super().reset(seed=seed) + self.action_space = spaces.Discrete(3, start=0, dtype=np.uint16) self.steps: int = 0 self.time: float = 0.0 - _ = super().reset(seed=seed) + self.obs : tuple[int, ...] | np.ndarray # previous observation + self.energy0 : float = 0.0 # save the initial energy (set by reset()) - def _init_discrete( + def init_discrete( self, - spec: dict[str, tuple[float | int, ...]], - ) -> tuple[spaces.MultiDiscrete, dict[str, tuple[float | int, ...]]]: + spec: dict[str, tuple[float | int, ...]] | None = None, + ) -> None: """Translate the observation-space spec into a MultiDiscrete space. - Expected keys in `spec`:: + Expected keys in default spec:: - 'angles' - amplitude categories (converted to energy levels) + 'angle' - amplitude categories (converted to energy levels) + 'distance' - distance categories from origin 'pos' - load position (+/- x) 'speed' - load speed (+/- x) - 'distance' - distance categories from origin - 'sector' - crane position sector (+/- x) - - Parameters - ---------- - spec : dict[str, tuple[float | int, ...]] - Mapping of observation dimension names to category boundaries. - - Returns - ------- - tuple[spaces.MultiDiscrete, dict[str, tuple[float | int, ...]]] - The constructed ``MultiDiscrete`` space and the updated spec - (with ``'angles'`` replaced by ``'energies'``). + 'c_pos' - crane position sector (+/- x) + 'c_speed' - crane speed (+/- x) + 'avg-acc' - average acceleration history + + Args: + spec (dict[str, tuple[float | int, ...]]): Mapping of observation dimension names to category boundaries. + + Returns: + tuple[spaces.MultiDiscrete, dict[str, tuple[float | int, ...]]]: The constructed ``MultiDiscrete`` space + and the updated spec (with ``'angle'`` replaced by ``'energy'``). """ - # We replace the angles with pendulum energy levels, which are easier to use for observation calculation - angles = spec.pop("angles") - energies = [9.81 * self.wire.length * (1.0 - np.cos(np.radians(a))) for a in angles] - _spec = {"energies" : tuple(energies)} - for k,v in spec.items(): - _spec.update({k:v}) - observation_space = spaces.MultiDiscrete(np.array([len(_spec[k]) for k in _spec])) - return (observation_space, _spec) + _spec = spec.copy() if spec is not None else AntiPendulumEnv.DEFAULT_DISCRETE.copy() + self.acc_hist = 0.0 + if 'distance' in _spec: + # We replace the angle with pendulum energy levels, which are easier to use for observation calculation + angle = _spec.pop("angle") + energy = [9.81 * self.wire.length * (1.0 - np.cos(np.radians(a))) for a in angle] + spec_e = {"energy": tuple(energy)} + + for k, v in _spec.items(): + spec_e.update({k: v}) + + elif 'speed' in _spec: #DISCRETE2 + spec_e = _spec + else: + raise ValueError("Unknown discretization {_spec}") from None + + self.observation_space = spaces.MultiDiscrete(np.array([len(spec_e[k]) for k in spec_e])) + self.discrete = spec_e + + @property + def energy_max(self): + try: + return self.discrete['energy'][-1] + except KeyError as err: + logger.error(f"'energy' not part of discretization, such that maximum value is not defined: {err}") + + @property + def distance_max(self): + try: + return self.discrete['distance'][-1] + except KeyError as err1: + try: + return self.discrete['c-pos'][-1] + except KeyError as err2: + logger.error(f"'distance' or 'c-pos' not part of discretization. => maximum value not defined: {err2}") + + @property + def speed_max(self): + try: + return self.distance_max/ self.dt/ 10 + except KeyError as err: + logger.error(f"'distance' not part of discretization. => maximum speed value is not defined: {err}") def _reward_plot_init(self, marker: str = "") -> Line2D: point = plt.plot(0, 0, marker)[0] if marker else plt.plot(0, 0)[0] @@ -208,10 +252,8 @@ def _reward_plot_init(self, marker: str = "") -> Line2D: def _append_playback(self, time: float) -> None: """Append the current crane state to the playback buffer. - Parameters - ---------- - time : float - Current simulation time. + Args: + time (float): Current simulation time. """ if not len(self._playback): # no records there yet self._playback.append([time]) # slot 0 for time @@ -239,10 +281,8 @@ def show_animation(self) -> None: def show_plot(self, episode: int) -> None: """Plot detailed traces for a single episode. - Parameters - ---------- - episode : int - Episode number used in the plot title. + Args: + episode (int): Episode number used in the plot title. """ _, (ax1, ax2, ax3, ax4) = plt.subplots(4, 1, figsize=(16, 12)) times = self.dt * np.arange(len(self.traces["c_x"])) @@ -268,20 +308,16 @@ def show_plot(self, episode: int) -> None: plt.show() for key in self.traces: self.traces[key] = [] - self.rewards = [] def _get_continuous_obs(self) -> tuple[np.ndarray, int]: """Return continuous observations and an out-of-bounds error flag. - Returns - ------- - tuple[np.ndarray, int] - ``(observation, error_flag)`` where *error_flag* is ``0`` when all - values are within bounds, or the 1-based index of the first - out-of-bounds dimension. + Returns: + tuple[np.ndarray, int]: ``(observation, error_flag)`` where *error_flag* is ``0`` when all + values are within bounds, or the 1-based index of the first out-of-bounds dimension. """ err = 0 - obs = np.array( + self.obs = np.array( ( self.crane.position[0], self.crane.velocity[0], @@ -291,68 +327,75 @@ def _get_continuous_obs(self) -> tuple[np.ndarray, int]: float, ) - for i, (_obs, _min, _max) in enumerate(zip(obs, self.spaces_min, self.spaces_max, strict=True)): + for i, (_obs, _min, _max) in enumerate(zip(self.obs, self.spaces_min, self.spaces_max, strict=True)): if not _min <= _obs <= _max: err = i + 1 - return obs, err + return self.obs, err - def _get_discrete_obs(self, energy: float) -> tuple[int, ...]: + def _get_discrete_obs(self, energy: float, acc:float) -> tuple(tuple[int, ...],bool): """Return the discrete observation tuple from the current crane state. - Parameters - ---------- - energy : float - Current pendulum energy. + Args: + energy (float): Current pendulum energy. + acc (float): current acceleration command - Returns - ------- - tuple[int, ...] - Discretised observation ``(energy_level, side, speed_sign, - distance_level, sector)``. + Returns: + tuple[int, ...]: Discretised observation ``(energy_level, side, speed_sign, distance_level, sector)``. """ - energy_level, _ = _level(1, energy, self.discrete["energies"]) - distance_level, _ = _level(3, abs(self.crane.position[0]), self.discrete["distance"]) - return ( - energy_level, - int(self.wire.end[0] - self.wire.origin[0] < 0.0), - int(self.wire.cm_v[0] < 0.0), # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - distance_level, - int(self.crane.position[0] < 0.0), - ) + self.acc_hist = self.discount* self.acc_hist + (1.0-self.discount)* acc + if 'distance' in self.discrete: + obs = [_level(energy, self.discrete["energy"]), + _level(abs(self.crane.position[0]), self.discrete["distance"]), + int(self.wire.end[0] - self.wire.origin[0] < 0.0), + int(self.wire.cm_v[0] < 0.0), # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire + int(self.crane.position[0] < 0.0), + int(self.crane.velocity[0] < 0.0), + _level(self.acc_hist, self.discrete['avg_acc']), + ] + elif 'speed' in self.discrete: + angle = np.pi - self.wire.boom[1] + der_angle = np.arctan2( self.wire.cm_v[0], self.wire.length - self.wire.cm_v[2]) + obs = [_level(np.pi - self.wire.boom[1], self.discrete['angle']), + _level(self.wire.cm_v[0], self.discrete['speed']), # only x-component, to keep sign! + _level(self.crane.position[0], self.discrete['c-pos']), + _level(self.crane.velocity[0], self.discrete['c-speed']), + _level(self.acc_hist, self.discrete['avg-acc']), + ] + else: + raise ValueError(f"Unknown discretization {self.discrete}.") from None + trunc = any(i<0 for i in obs) + return (tuple(obs), trunc) + def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], float, int]: - """Compute the current observation and reward from the crane state. + """Compute the current observation, the reward and the truncation flag from the crane state. - In discrete mode the observation keys are:: - - 'energies' - energy categories of the load - 'side' - current side of the load (+/- x) - 'distance' - distance categories from origin - 'sector' - crane position sector (+/- x) + In discrete mode the observation keys are as defined in .DEFAULT_DISCRETE + + Args: + acc (float): Acceleration used to get to this state (for use in traces) - Returns - ------- - tuple[np.ndarray | tuple[int, ...], float, int] - ``(observation, reward, error_flag)``. + Returns: + tuple[np.ndarray | tuple[int, ...], float, int]: ``(observation, reward, truncate_flag)``. """ - energy = 9.81 * self.wire.end[2] + 0.5 * np.dot(self.wire.cm_v, self.wire.cm_v) # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - if self.start_speed != 0.0: # anti-pendulum mode - energy = -energy - if np.sign(self.crane.position[0]) == np.sign(self.crane.velocity[0]): # moving away from origo - positional = -self.wire.length * (abs(self.crane.position[0]) + self.crane.velocity[0] ** 2 / self.acc) - else: - positional = 0.0 # if the crane moves towards the origo we do not subtract reward - self.reward = sum(f * r for f, r in zip(self.reward_fac, (energy, positional, -self.time), strict=True)) + # calculate the minimum time for the crane to stop at zero (optimal acceleration usage) + x0 = self.crane.position[0] + v0 = self.crane.velocity[0] + a = self.acc # absolute max acceleration + _r = [ + 9.81*self.wire.end[2]+0.5*np.dot(self.wire.cm_v,self.wire.cm_v), # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire + abs(x0), + v0*v0 + ] - obs: tuple[int, ...] | np.ndarray if len(self.discrete): - obs = self._get_discrete_obs(abs(energy)) - err = 0 - + self.obs, truncate = self._get_discrete_obs(_r[0], acc) else: - obs, err = self._get_continuous_obs() + self.obs, truncate = self._get_continuous_obs() + self.reward = sum( f*x for f,x in zip(self.reward_fac, _r, strict=True)) + if self.render_mode == "plot": self.traces["c_x"].append(self.crane.position[0]) self.traces["c_v"].append(self.crane.velocity[0]) @@ -360,20 +403,7 @@ def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], floa self.traces["l_v"].append(self.wire.cm_v[0]) # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire self.traces["acc"].append(acc) - return (obs, self.reward, err) - - def low_reward(self) -> float: - """Return the lowest possible reward for the current mode. - - Returns - ------- - float - Zero in start-pendulum mode, or the negative maximum pendulum - energy in stop-pendulum mode. - """ - if self.start_speed == 0.0: - return 0.0 - return -float(self.discrete["energies"][-1]) + return (self.obs, self.reward, truncate) def _get_info(self, reward: float, steps: int) -> dict[str, float | int]: return {"steps": steps, "reward": reward} @@ -406,23 +436,14 @@ def reset( seed (int): Optional random seed (default None). options (dict[str, object]): Optional additional arguments to super().reset(). Default None. - Returns - ------- - tuple[tuple[int, ...] | np.ndarray, dict[str, float | int]] - Initial observation and info dict. + Returns: + tuple[tuple[int, ...] | np.ndarray, dict[str, float | int]]: Initial observation and info dict. """ self.reset_crane() - if self.nresets <= 0: # reset during instantiation. Initialize - if self.render_mode == "data": - self._reward_point = self._reward_plot_init("b.") - - else: # reset between episodes. Data are available - self.reward_stats.append([self.steps, self.reward]) - if self.render_mode == "data": - self._reward_point.set_data([r[0] for r in self.reward_stats], [r[1] for r in self.reward_stats]) - plt.pause(1e-10) - elif self.render_mode == "play-back" and len(self._playback): + if self.nresets > 0: # reset between episodes. Data are available + self.reward_stats.append(self.reward_stats_calc( self.steps)) + if self.render_mode == "play-back" and len(self._playback): self.show_animation() self._playback = [] elif self.render_mode == "plot": @@ -433,48 +454,48 @@ def reset( self.nresets += 1 if self.start_speed == 0.0: # run in 'start' mode, learning how to start the pendulum action assert self.wire.cm_v[0] == 0.0, f"Load speed expected zero. Found {self.wire.cm_v[0]}" # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - elif self.start_speed < 0.0: # random speed in 'stop' mode [-,+] range - speed = self.np_random.uniform( - -(-self.start_speed - self.min_speed), - (-self.start_speed - self.min_speed), - ) - speed = speed + self.min_speed if speed >= 0 else speed - self.min_speed + else: + if self.start_speed < 0.0: # random speed in 'stop' mode [-,+] range + speed = 0 + lim = -self.reward_limit/ self.reward_fac[0] + while speed* speed < lim: # try until start-speed is high enough to not terminate + speed = self.np_random.uniform(self.start_speed, -self.start_speed) + else: # fixed speed in 'stop' mode (more control) + speed = self.start_speed self.wire.cm_v[0] = speed # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - else: # fixed speed in 'stop' mode (more control) - self.wire.cm_v[0] = self.start_speed # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - obs, self.reward, _ = self._get_obs() + self.energy0 = 0.5* speed* speed + + if len(self.discrete): + self.obs = (0,)*len(self.discrete) + self.obs, self.reward, _ = self._get_obs() + #logger.info(f"RESET speed:{speed}. obs:{self.obs}=>{self.reward}") if self.render_mode == "play-back": self._append_playback(0.0) self.steps = 0 self.time = 0.0 info = self._get_info(self.reward, self.steps) - return obs, info + self.rewards = [float(self.reward)] + return self.obs, info def step(self, action: int) -> tuple[tuple[int, ...] | np.ndarray, float, bool, bool, dict[str, float | int]]: """Advance the environment by one time step. - Parameters - ---------- - action : int - Action index selecting the crane acceleration. + Args: + action (int): Action index selecting the crane acceleration. - Returns - ------- - tuple[tuple[int, ...] | np.ndarray, float, bool, bool, dict[str, float | int]] - ``(observation, reward, terminated, truncated, info)``. + Returns: + tuple[tuple[int, ...] | np.ndarray, float, bool, bool, dict[str, float | int]]: + (observation, reward, terminated, truncated, info) """ - action_idx = action - if action_idx not in self.action_to_acc: - action_idx += 1 - acc = self.action_to_acc[action_idx] + acc = -self.acc if action==0 else (0.0 if action==1 else self.acc) self.crane.d_velocity[0] = acc self.steps += 1 _ = self.crane.do_step(self.time, self.dt) self.time += self.dt - obs, self.reward, truncated = self._get_obs(acc) + self.obs, self.reward, truncated = self._get_obs(acc) if self.render_mode != "none": - self.rewards.append(self.reward) + self.rewards.append(float(self.reward)) if self.render_mode == "play-back": self._append_playback(self.steps) @@ -487,7 +508,7 @@ def step(self, action: int) -> tuple[tuple[int, ...] | np.ndarray, float, bool, if terminated: self.nsuccess += 1 info = self._get_info(self.reward, self.steps) - return obs, self.reward, terminated, (truncated > 0), info + return self.obs, self.reward, terminated, (truncated > 0), info def render(self) -> None: """Render the current episode.""" @@ -496,6 +517,34 @@ def render(self) -> None: elif self.render_mode == "plot": self.show_plot(self.nresets) + def set_state(self, pos:np.ndarray|float, speed:np.ndarray|float, direction:np.ndarray|float, w_speed:np.ndarray|float): + """Set the state of the pendulum. Used for test purposes. + + Args: + pos (ndarray|float): crane position as vector or only x component + speed (ndarray|float): crane speed as vector or only x component + direction (ndarray|float): wire direction vector or polar angle in radians + w_speed (ndarray|float): load speed vector or x-value of speed + """ + self.crane.position = np.array((pos,0,0), float) if isinstance(pos, float) else pos + self.crane.velocity = np.array((speed,0,0), float) if isinstance(speed, float) else speed + self.crane.d_velocity = np.array((0,0,0),float) + self.crane.boom0.update_child() + self.wire.origin_v = self.crane.velocity + self.wire.origin_acc = np.array((0,0,0), float) + self.wire.direction = np.array((np.sin(direction),0,-np.cos(direction)), float) if isinstance(direction, float) else direction + self.wire.boom[1:] = cartesian_to_spherical(self.wire.direction)[1:] + self.wire._c_m = self.wire.origin + self.wire.direction* self.wire.length + self.wire.cm_v = np.array((w_speed,0,0), float) if isinstance(w_speed, float) else speed + self.wire.cm_acc = np.array((0,0,0), float) + #self.wire.pendulum_relax() + if not isinstance(w_speed, float) or float(w_speed) > 1e-10: + z_fac = -self.wire.direction[0]/self.wire.direction[2] # ensure orthogonality of speed to direction + self.wire.cm_v = w_speed* np.array((1,0,z_fac), float) if isinstance(w_speed, float) else w_speed + self.wire.calc_statics_dynamics(None) + + + def get_parameters(self) -> dict[str, Any]: """Return the environment parameter settings as dict.""" return { @@ -506,4 +555,24 @@ def get_parameters(self) -> dict[str, Any]: "step-size": self.dt, "observations-discretization": None if not hasattr(self, "discrete") else self.discrete, "reward_limit": self.reward_limit, + "start-load-speed": self.start_speed, } + + def reward_stats_calc(self, steps:int): + """After an episode is run, analyse the .rewards list statistically. + The list is then reset before the next episode is run. + + * number of steps for the episode + * average reward gain over episode + * standard deviation of reward gains + * reward gain trend over episode + """ + rewards = np.array(self.rewards, float) + avg = np.average( rewards) + std = np.std(rewards) + avg_gain = np.average( rewards[1:] - rewards[:-1]) + std_gain = np.std( rewards[1:] - rewards[:-1]) + gain_trend = np.average( rewards[2:] - 2* rewards[1:-1] + rewards[:-2]) + return (steps, avg, std, avg_gain, std_gain, gain_trend) + + \ No newline at end of file diff --git a/tests/test_q.py b/tests/test_q.py index 6a62eca..ea95e24 100644 --- a/tests/test_q.py +++ b/tests/test_q.py @@ -1,24 +1,28 @@ import logging import shutil +from typing import Any from collections.abc import Callable +import itertools from pathlib import Path import numpy as np from py_crane.crane import Crane -from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv +from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv, _level from crane_controller.q_agent import QLearningAgent logger = logging.getLogger(__name__) + + def test_smoke(crane: Callable[..., Crane], *, show: bool) -> None: env = AntiPendulumEnv( crane, start_speed=-1.0, render_mode="plot" if show else "none", reward_limit=-0.05, - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), + discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), ) agent = QLearningAgent(env, filename=None) agent.do_episodes(n_episodes=5, max_steps=200) @@ -30,7 +34,7 @@ def test_q_analyse(crane: Callable[..., Crane], *, show: bool) -> None: _ = shutil.copy2(models / "q_trained.json", ".") # copy to working_directory env = AntiPendulumEnv( crane, - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), + discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), ) assert Path("q_trained.json").exists(), "File 'q_trained.json' not found" agent = QLearningAgent(env, filename=Path("q_trained.json"), use_file="r") @@ -56,7 +60,7 @@ def test_intervals(crane: Callable[..., Crane]): start_speed=-1.0, render_mode="none", reward_limit=-0.05, - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), + discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), ) agent = QLearningAgent(env, filename=save_path, use_file="w") @@ -67,6 +71,240 @@ def test_intervals(crane: Callable[..., Crane]): agent = QLearningAgent(env, filename=save_path, use_file="rw") logger.info(f"Model saved to {save_path}") +def test_levels(crane: Callable[..., Crane]) -> None: + def check(val:float,expected:tuple[float,...]) -> None: + assert _level(val, env.discrete['energy']) == expected, f"Level {val} =? {_level(val, env.discrete['energy'])}" + + env = AntiPendulumEnv(crane) + print(env.discrete) + check( 0, 0) + check(-1e-10, -1) + check(1e-10, 0) + check(0.014, 0) + check(0.015, 1) + check(0.3, 1) + check(0.4, 2) + check(1.4, 2) + check(1.5, 3) + check(5.9, 3) + check(6.0, 4) + check(13.1, 4) + check(13.2, 5) + check(98, 5) + check(99, 6) + check(float('inf'),6) + +def test_discretization( crane: Callable[..., Crane], *, show: bool, discretization: dict[str:Any]) -> None: + """Test the discretization with respect to yielding unique rewards.""" + env = AntiPendulumEnv( + crane, + start_speed=2.0, + render_mode="none", + reward_limit=0.0, + reward_fac=(0.01,0.01), + discrete=discretization.copy(), + ) + env.reset() + agent = QLearningAgent(env) + for a in range(len(discretization['angle'])-1): + for s in range(len(discretization['speed'])-1): + for c_p in range(len(discretization['c-pos'])-1): + for c_s in range(len(discretization['c-speed'])-1): + action_sum = [0]*3 + for angle, speed, c_pos, c_speed in itertools.product( + (discretization['angle'][a], discretization['angle'][a+1]), + (discretization['speed'][s], discretization['speed'][s+1]), + (discretization['c-pos'][c_p], discretization['c-pos'][c_p+1]), + (discretization['c-speed'][c_s], discretization['c-speed'][c_s+1]) + ): + reward_max = float('-inf') + for action in range(3): + env.set_state(c_pos, c_speed, angle, speed) + obs, reward, term, trunc, _ = env.step(action) + if reward > reward_max: + action_max = action + reward_max = reward + action_sum[action_max] += 1 + if (max(action_sum)!=16 and + action_sum[0]>0 and + action_sum[2]>0 and + action_sum[0]==action_sum[2] + ): + print(f"angle:{a}, speed:{s}, c_pos:{c_p}, c_speed:{c_s}: {action_sum}") + + +def test_state( crane: Callable[..., Crane], *, show: bool) -> None: + """Set state and calculate reward.""" + def check_step(act:int, + obs:tuple[int,...]|None=None, + reward:float|None=None, + terminated:bool|None=None, + truncated:bool|None=None) -> None: + _obs, _reward, _terminated, _truncated, _ = env.step(1) + if obs is not None: + assert np.allclose( _obs, obs), f"obs. Found {_obs}. Expected {obs}" + if reward is not None: + assert abs( reward - _reward) < 1e-9, f"reward. Found {_reward}. Expected {reward}" + assert terminated is None or _terminated == terminated, f"terminated. Found {_terminated}.Expected {terminated}" + assert truncated is None or _truncated == truncated, f"truncated. Found {_truncated}. Expected {truncated}" + + def get_state(): + """Get state variables as tuple and text.""" + state = (float(env.crane.position[0]), + float(env.crane.velocity[0]), + float(np.degrees(np.pi-env.wire.boom[1])), + float(env.wire.cm_v[0])) + txt = f"pos:{state[0]}, speed:{state[1]}, angle:{state[2]}, x-speed:{state[3]}" + return state, txt + + env = AntiPendulumEnv( + crane, + start_speed=1.0, + render_mode="none", + reward_limit=0.0, + reward_fac=(0.01,0.01), + discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), + ) + env.reset() + agent = QLearningAgent(env) + + env.set_state(pos=0.0, speed=0.0, direction=0.0, w_speed=0.0) + for i in range(10): + assert np.allclose( get_state()[0], (0,0,0,0)) + env.step(1) # check that nothing moves + + env.step(0) + state = get_state()[0] + assert np.allclose( get_state()[0][:2], (-0.1,-0.1)), f"Found {get_state()[0][:2]}" + assert get_state()[0][2] > 0.26 + assert get_state()[0][3] > 0.08 + + env.set_state + + #env.reset() + env.set_state(1.0, 2.0, 0.0, 0.0) + assert np.allclose( get_state()[0], (1.0,2.0,0,0)), f"Found {get_state()[0]}" + env.step(1) + assert np.allclose( get_state()[0], (3.0, 2.0, 5.532267250195097, -1.7318224679112262)), f"Found {get_state()[0]}" + + env.set_state(0.0, 0.0, np.radians(10), -2.0) + assert np.allclose( get_state()[0], (0.0,0.0,10,-2)), f"Found {get_state()[0]}" + env.step(1) + assert np.allclose( get_state()[0], (0.0,0.0,1.0274015154955907,-0.8379044477976203)), f"Found {get_state()[0]}" + #print(f"State: {get_state()[1]}") + #check_step( 1, obs=(0, 0, 0, 0, 0, 0, 0, 1, 1), reward=0, terminated=True, truncated=False) + #env.set_state(pos=18.0, speed=0.0, direction=0.0, w_speed=0.0) + #print( env.step(1)) + env.set_state(pos=2.0, speed=0.0, direction=0.0, w_speed=0.0) + res = env.step( 1) # neutral step + actions = (0,0,0,1,1,1,2,2,1,) + reward = float('-inf') + reward_sum = 0.0 + agent.episodes_init() + for s in range(len(actions)): + obs0,reward0 = res[:2] + res = env.step(actions[s]) + if res[1] <= reward: + print(f"step:{s}, actions:{actions[:s]}, obs:{res[0]}, reward:{float(res[1])}") + break + agent.update_q(obs0, actions[s], res[1], terminated=False, next_obs=res[0], prev_reward=reward) + reward = float(res[1]) + reward_sum += reward + print( f"reward:{reward}, avg:{reward_sum/s}") + print(f"pos:{env.crane.position}, speed:{env.crane.velocity}, dir:{env.wire.direction}, v_w:{env.wire.cm_v}") + for k,v in agent.q_values.items(): + print(k, v) + #env.set_state(pos=18.0, speed=0.0, direction=0.0, w_speed=0.0) + #print( env.step(2)) + +def test_state2( crane: Callable[..., Crane], *, show: bool) -> None: + """Set state and calculate reward.""" + def check_step(act:int, + obs:tuple[int,...]|None=None, + reward:float|None=None, + terminated:bool|None=None, + truncated:bool|None=None) -> None: + _obs, _reward, _terminated, _truncated, _ = env.step(1) + if obs is not None: + assert np.allclose( _obs, obs), f"obs. Found {_obs}. Expected {obs}" + if reward is not None: + assert abs( reward - _reward) < 1e-9, f"reward. Found {_reward}. Expected {reward}" + assert terminated is None or _terminated == terminated, f"terminated. Found {_terminated}.Expected {terminated}" + assert truncated is None or _truncated == truncated, f"truncated. Found {_truncated}. Expected {truncated}" + + def get_state(): + """Get state variables as tuple and text.""" + state = (float(env.crane.position[0]), + float(env.crane.velocity[0]), + float(np.degrees(np.pi-env.wire.boom[1])), + float(env.wire.cm_v[0])) + txt = f"pos:{state[0]}, speed:{state[1]}, angle:{state[2]}, x-speed:{state[3]}" + return state, txt + + env = AntiPendulumEnv( + crane, + start_speed=1.0, + render_mode="none", + reward_limit=0.0, + reward_fac=(0.01,0.000), + discrete=AntiPendulumEnv.DISCRETE2.copy(), + ) + env.reset() + agent = QLearningAgent(env) + + env.set_state(pos=0.0, speed=0.0, direction=0.0, w_speed=0.0) + for i in range(10): + assert np.allclose( get_state()[0], (0,0,0,0)) + env.step(1) # check that nothing moves + + env.step(0) + state = get_state()[0] + assert np.allclose( state, (-0.1, -0.1, 0.26384339641900634, 0.08276160999714069)) + print("Experiment:") + for a in range(3): + env.set_state( pos=0.0, speed=0.0, direction=np.radians(3.0), w_speed=1.5) + env.step( a) + #env.step(1) + print(a, get_state()[1], env._get_obs()) + + + +def test_update_q_values(crane: Callable[..., Crane], *, show: bool) -> None: + env = AntiPendulumEnv( + crane, + start_speed=-1.0, + render_mode="none", + reward_limit=-0.05, + reward_fac=(0.01,0.01), + discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), + ) + env.reset() + agent = QLearningAgent(env) + env.set_state(pos=2.0, speed=0.0, direction=0.0, w_speed=0.0) + res = env.step( 1) # neutral step + agent.episode_init() + + obs, _ = env.reset() # first reward is also available as self.env.reward + num_failed = 0 + nsteps = 0 + + for i in range(1000): + prev_reward = env.reward + action = agent.get_action(obs) # choose action (initially random, gradually more intelligent) + next_obs, _reward, terminated, truncated, _ = env.step(action) # take action and observe result + reward = float(_reward) + agent.update_q(obs, action, reward, terminated=False, next_obs=next_obs, prev_reward=prev_reward) + # Move to next state + obs = next_obs + nsteps += 1 + truncated = False + + print(env.rewards) + for k,v in agent.q_values.items(): + pass#print(k, v) + + + if __name__ == "__main__": import os @@ -76,10 +314,15 @@ def test_intervals(crane: Callable[..., Crane]): from crane_controller.crane_factory import build_crane # noqa: F401 - retcode = pytest.main(["-rP -s -v", __file__]) + retcode = 0#pytest.main(["-rP -s -v", __file__]) assert retcode == 0, f"Return code {retcode}" os.chdir(Path(__file__).parent.absolute() / "test_working_directory") + # test_levels(build_crane) # test_smoke(build_crane, show=True) # test_q_analyse(build_crane, show=True) # test_intervals(build_crane) + # test_state(build_crane, show=True) + test_state2(build_crane, show=True) + #test_update_q_values(build_crane, show=True) + #test_discretization(build_crane, show=True, discretization=AntiPendulumEnv.DISCRETE2) \ No newline at end of file From 8e07c10940746787581126e07f9ecb9e8cf833ba Mon Sep 17 00:00:00 2001 From: Eisinger Date: Tue, 16 Jun 2026 13:16:45 +0200 Subject: [PATCH 07/11] Adapting branch eis to the changes on main --- CHANGELOG.md | 3 + models/q_anti-pendulum.json | 1326 -- models/q_anti-pendulum_2.json | 12227 ++++++++++++++++ models/q_trained.json | 238 - pyproject.toml | 5 +- scripts/analyse_q.py | 2 +- scripts/play_q.py | 2 +- scripts/train_q.py | 2 +- scripts/use_q_ide.py | 119 +- src/crane_controller/algorithm.py | 87 +- .../envs/controlled_crane_pendulum.py | 21 +- src/crane_controller/envs/simple_test_env.py | 217 + src/crane_controller/q_agent.py | 280 +- tests/test_simple_q_env.py | 93 + 14 files changed, 12802 insertions(+), 1820 deletions(-) delete mode 100644 models/q_anti-pendulum.json create mode 100644 models/q_anti-pendulum_2.json delete mode 100644 models/q_trained.json create mode 100644 src/crane_controller/envs/simple_test_env.py create mode 100644 tests/test_simple_q_env.py diff --git a/CHANGELOG.md b/CHANGELOG.md index abebab6..abf2e38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ The changelog format is based on [Keep a Changelog](https://keepachangelog.com/e space types work correctly during inference. ### Fixed +* Fixed general incompatibilities between the updated repository and changes in `eis`branch. * `ProximalPolicyOptimizationAgent.load()` now applies a `TimeLimit` wrapper (max 3000 steps), matching the training configuration. Without it, `play_ppo.py` ran indefinitely on a converged model whose near-zero reward never crossed the termination threshold. @@ -77,6 +78,8 @@ The changelog format is based on [Keep a Changelog](https://keepachangelog.com/e vs training step as a PNG alongside the model after each training run. ### Changed +* Removed unused reward factors in reward calculation +* Adapted the y-size of plots, such that it fits also smaler screens without scrolling * `AntiPendulumEnv` parameter `size` renamed to `rail_limit`; `TrainingConfig.size` renamed to `rail_limit`; `--size` CLI flag renamed to `--rail-limit`. Semantics unchanged: half-span of the crane rail in metres (crane spans +-rail_limit). diff --git a/models/q_anti-pendulum.json b/models/q_anti-pendulum.json deleted file mode 100644 index f2715c8..0000000 --- a/models/q_anti-pendulum.json +++ /dev/null @@ -1,1326 +0,0 @@ -{ - "start-training": "02.05.2026 06:16:23", - "end-training": "02.05.2026 11:56:01", - "pendulum": { - "wire-length": "10.0", - "wire-q-factor": "50.0", - "reward-factors": "(1.0, 0.0015, 0.0)", - "acceleration": "0.1", - "step-size": "0.1", - "observations-discretization": "{'energies': (np.float64(0.0), np.float64(0.014941105158016455), np.float64(0.373300117199762), np.float64(1.4903594295023934), np.float64(5.916153900902383), np.float64(13.142907888746564), np.float64(98.1)), 'pos': (0, 1), 'speed': (0, 1), 'distance': (0.0, 1.0, 2.0, 5.0, 10.0, 20.0), 'sector': (0, 1)}", - "reward_limit": "0.0" - }, - "q_agent": { - "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_anti-pendulum.json", - "use_file": "rw", - "episodes": "10000", - "steps": "22011000", - "learning_rate": "0.1", - "discount_factor": "0.95", - "epsilon-decay": "0.900000000000011", - "final-epsilon": "0.1", - "epsilon": "0.1" - }, - "q_values": { - "(3, 0, 0, 1, 1)": [ - -1.0679910671279653, - -1.110681877962423, - -0.41915413353759845 - ], - "(3, 0, 0, 0, 0)": [ - -0.9213374700587837, - -0.9155540359405517, - -0.9399636472476928 - ], - "(3, 0, 0, 1, 0)": [ - -1.1273137731893534, - -1.1284292762399748, - -1.0102714445825918 - ], - "(3, 0, 1, 1, 0)": [ - -1.170772753467116, - -0.8469803815276317, - -1.0868058537451306 - ], - "(3, 1, 1, 1, 0)": [ - -0.8681203028287104, - -1.07984104458665, - -1.0280968661330658 - ], - "(3, 1, 0, 1, 0)": [ - -1.1902993340217654, - -1.1174683064390465, - -1.117338021754873 - ], - "(3, 1, 0, 2, 0)": [ - -0.8981769848135274, - -1.024051402087251, - -0.9152356514467404 - ], - "(3, 0, 0, 2, 0)": [ - -0.7883197767671347, - -0.9998942960791635, - -0.9205860957407767 - ], - "(3, 0, 1, 2, 0)": [ - -1.1275283369462716, - -1.1450398396847963, - -1.126814297252274 - ], - "(3, 1, 1, 2, 0)": [ - -0.6814344753037649, - -1.1296524734861837, - -1.139886971831043 - ], - "(2, 1, 0, 2, 0)": [ - -0.2184258376605628, - -0.20340333867177465, - -0.21458748416353496 - ], - "(2, 0, 0, 2, 0)": [ - -0.21663452762593394, - -0.2569651413364418, - -0.17986576955343098 - ], - "(2, 0, 0, 3, 0)": [ - -0.23943912006540502, - -0.21302019057825242, - -0.27015104989984423 - ], - "(2, 0, 1, 3, 0)": [ - -0.23509642934988545, - -0.21545972361144733, - -0.2267123440864149 - ], - "(2, 1, 1, 3, 0)": [ - -0.19026984617449708, - -0.17806330009663418, - -0.1736647865486621 - ], - "(2, 1, 0, 3, 0)": [ - -0.3941196449958593, - -0.22164434901634586, - -0.2134812385530895 - ], - "(2, 0, 1, 4, 0)": [ - -0.2097834585026931, - -0.24666995076935308, - -0.25373857853718934 - ], - "(2, 1, 1, 4, 0)": [ - -0.2759874185807895, - -0.3093088380921312, - -0.2381934089297431 - ], - "(2, 1, 0, 4, 0)": [ - -0.31727582237320173, - -0.3307198197737338, - -0.3241620523467016 - ], - "(2, 0, 0, 4, 0)": [ - -0.34622455778916233, - -0.28425156960535347, - -0.24247822016308812 - ], - "(1, 0, 0, 4, 0)": [ - -0.11649867241162995, - -0.12120725133738347, - -0.005921299589782451 - ], - "(1, 0, 1, 4, 0)": [ - -0.08551413320982315, - -0.1387059769406753, - -0.007806571927053064 - ], - "(2, 1, 0, 5, 0)": [ - -3.8245399062881322, - -3.824172526643906, - -3.8370301117294545 - ], - "(2, 0, 0, 5, 0)": [ - -3.867824759520852, - -3.8439322346269655, - -3.835200707481058 - ], - "(1, 0, 0, 5, 0)": [ - -5.512650894613301, - -5.5010721371057105, - -5.465820718406662 - ], - "(2, 0, 1, 5, 0)": [ - -3.485529156122162, - -3.845834300257472, - -3.831169611698396 - ], - "(1, 0, 1, 5, 0)": [ - -5.470586310992861, - -5.474552185809867, - -5.478512693659493 - ], - "(1, 1, 1, 5, 0)": [ - -5.545542800572466, - -5.558492366040909, - -5.529410714046352 - ], - "(2, 1, 1, 5, 0)": [ - -3.740607589859895, - -3.735419375930869, - -3.739605840358064 - ], - "(1, 1, 0, 5, 0)": [ - -5.601260382087573, - -5.6141735413750515, - -5.604041472342646 - ], - "(3, 0, 1, 1, 1)": [ - -0.5629130435854454, - -0.9838559385459248, - -0.8949497409541708 - ], - "(3, 1, 1, 1, 1)": [ - -0.859725723597195, - -0.5458068273632999, - -0.8866737404146082 - ], - "(3, 1, 0, 1, 1)": [ - -1.034748028119836, - -0.5170485419958282, - -0.9806039202372469 - ], - "(2, 1, 0, 1, 0)": [ - -0.18501417802997483, - -0.18802214154251384, - -0.18680367276732765 - ], - "(2, 0, 0, 1, 0)": [ - -0.17656084548747633, - -0.18009045369362325, - -0.18019787851078808 - ], - "(2, 0, 1, 1, 0)": [ - -0.18748344846649878, - -0.18539320427327852, - -0.18906729235282815 - ], - "(2, 1, 1, 1, 0)": [ - -0.22076892073303223, - -0.24793092868085437, - -0.21829387185436022 - ], - "(2, 1, 1, 2, 0)": [ - -0.2774339008551959, - -0.27791096221428363, - -0.23346034735074367 - ], - "(3, 1, 0, 3, 0)": [ - -0.7282565190508381, - -0.9900885019249691, - -0.989971463704755 - ], - "(3, 0, 0, 3, 0)": [ - -1.0243279316795144, - -0.9679116672116896, - -0.5908024664033348 - ], - "(3, 0, 1, 3, 0)": [ - -0.7630884369592039, - -1.0018044116676168, - -0.9222822501830901 - ], - "(3, 1, 1, 3, 0)": [ - -0.8679081693343687, - -0.8713405895165993, - -0.882134743047456 - ], - "(2, 0, 1, 2, 0)": [ - -0.24104192471327143, - -0.19776244680465158, - -0.22851829695493597 - ], - "(2, 0, 0, 1, 1)": [ - -0.14576980478793666, - -0.16284851663785888, - -0.06224351780739461 - ], - "(2, 0, 1, 1, 1)": [ - -0.2148773982540717, - -0.05938812592073324, - -0.2125745582888412 - ], - "(2, 1, 1, 1, 1)": [ - -0.1406235665717706, - -0.28203570306460557, - -0.246131452751267 - ], - "(2, 1, 0, 1, 1)": [ - -0.14685835593580937, - -0.17119527792379846, - -0.08231457188416876 - ], - "(2, 1, 0, 2, 1)": [ - -0.19864125944765276, - -0.17653453057999832, - -0.13578440958796043 - ], - "(2, 0, 0, 2, 1)": [ - -0.1555105394096738, - -0.2472625529718001, - -0.23692730350500177 - ], - "(2, 0, 1, 2, 1)": [ - -0.2991450400285979, - -0.29935589159806486, - -0.12327182416625308 - ], - "(2, 1, 1, 2, 1)": [ - -0.3471859967321119, - -0.4296960152978751, - -0.29224040436683185 - ], - "(2, 0, 0, 3, 1)": [ - -0.27296590315793545, - -0.13611602289804434, - -0.239884206216131 - ], - "(2, 0, 1, 3, 1)": [ - -0.12655473877612425, - -0.2535854981708081, - -0.23655628563633407 - ], - "(2, 1, 1, 3, 1)": [ - -0.35086194437746876, - -0.39814343151302445, - -0.38273519209835166 - ], - "(2, 1, 0, 3, 1)": [ - -0.3594256674719777, - -0.5018633964983203, - -0.47506777964234004 - ], - "(1, 0, 0, 2, 1)": [ - -0.03952570057480613, - -0.03276573427749324, - -0.030642332730822463 - ], - "(1, 0, 1, 2, 1)": [ - -0.04644291029637304, - -0.04840298540742884, - -0.04873423315198787 - ], - "(1, 1, 1, 2, 1)": [ - -0.05388778252622612, - -0.12278017719404431, - -0.06632854179754616 - ], - "(1, 1, 0, 2, 1)": [ - -0.07921563522578597, - -0.038367724722816986, - -0.063237086060482 - ], - "(1, 1, 1, 1, 1)": [ - -0.02401849722950171, - -0.1377423508491871, - -0.035114333735318706 - ], - "(1, 1, 0, 1, 1)": [ - -0.04518442542923341, - -0.04786407605163934, - -0.04659592515807536 - ], - "(1, 0, 0, 1, 1)": [ - -0.03595861296657249, - -0.039761823378762315, - -0.03769872970520503 - ], - "(1, 0, 1, 1, 1)": [ - -0.028815100482542398, - -0.019480596871779634, - -0.029639144511337444 - ], - "(2, 0, 0, 4, 1)": [ - -0.5294228604319029, - -0.5590238336473268, - -0.41176012538663975 - ], - "(2, 0, 1, 4, 1)": [ - -0.22430719251552728, - -0.07985033211552926, - -0.16232907241467082 - ], - "(2, 1, 1, 4, 1)": [ - -0.08145124248400931, - -0.21769459649619397, - -0.1593890045828511 - ], - "(2, 1, 0, 4, 1)": [ - -0.48623888763258905, - -0.41742444109567195, - -0.6294027962997758 - ], - "(2, 1, 1, 5, 1)": [ - -1.8994560174744375, - -2.2353965545846464, - -0.9122368678258063 - ], - "(2, 1, 0, 5, 1)": [ - -0.9759891553387082, - -1.3622049356175714, - -1.4439613557007753 - ], - "(2, 0, 0, 5, 1)": [ - -0.9692504889829188, - -1.651659122082731, - -1.140513827724224 - ], - "(2, 0, 1, 5, 1)": [ - -2.5880982455715444, - -1.9944990247179943, - -0.9538729711682539 - ], - "(1, 0, 0, 5, 1)": [ - -1.0968815599507726, - -1.5026429111188824, - -0.1073756967270721 - ], - "(1, 0, 1, 5, 1)": [ - -0.8619951953925427, - -0.6556885810483055, - -0.08119388447867634 - ], - "(1, 1, 1, 5, 1)": [ - -0.26508044605059183, - -0.2783929133640923, - -0.02539340327856676 - ], - "(1, 1, 0, 5, 1)": [ - -0.15028794817895103, - -0.20440457498249387, - -0.029023592630201427 - ], - "(3, 0, 1, 2, 1)": [ - -0.8307143842795423, - -0.5773026997215118, - -0.929927235660665 - ], - "(3, 1, 1, 2, 1)": [ - -0.5772564143411784, - -0.8932995920211088, - -0.6989917630146333 - ], - "(3, 1, 0, 2, 1)": [ - -1.073211732784507, - -0.855299331593141, - -0.8232202819589415 - ], - "(3, 0, 0, 2, 1)": [ - -0.923632082408891, - -0.9247267119907955, - -0.6468953757653081 - ], - "(3, 0, 0, 3, 1)": [ - -0.6394897127848305, - -0.7340477841957704, - -0.5181252513081902 - ], - "(3, 0, 1, 3, 1)": [ - -0.8937235094416299, - -0.6932667570313359, - -0.48568512058187413 - ], - "(3, 1, 1, 3, 1)": [ - -0.5409799961353358, - -0.7796399197269814, - -0.7594490780936252 - ], - "(3, 1, 0, 3, 1)": [ - -0.6545949005224745, - -0.6931986664303526, - -0.5128530802296823 - ], - "(1, 1, 1, 4, 0)": [ - -0.006267546809350346, - -0.071506658362785, - -0.05721370593957202 - ], - "(1, 1, 0, 4, 0)": [ - -0.011834350653177986, - -0.11465206468727204, - -0.07341357021309242 - ], - "(3, 1, 0, 4, 1)": [ - -0.8102078678442004, - -0.9177714125566699, - -0.707994412131045 - ], - "(3, 0, 0, 4, 1)": [ - -0.8600717486809838, - -1.2218277946737544, - -0.6076915348748687 - ], - "(3, 0, 1, 4, 1)": [ - -0.9267305493470831, - -0.9568948710440423, - -0.645050327251187 - ], - "(3, 1, 1, 4, 1)": [ - -0.6815550649535739, - -0.8220706331433774, - -1.0559085423304426 - ], - "(1, 1, 0, 3, 1)": [ - -0.09299729822639691, - -0.09347719323901467, - -0.09071269927538811 - ], - "(1, 0, 0, 3, 1)": [ - -0.0837708430009454, - -0.08314041773036976, - -0.08295819075695357 - ], - "(1, 0, 1, 3, 1)": [ - -0.08589628458821519, - -0.08777894631661534, - -0.08732578759515346 - ], - "(1, 1, 1, 3, 1)": [ - -0.09259884875751484, - -0.09385600133744688, - -0.10177157243314822 - ], - "(1, 1, 1, 3, 0)": [ - -0.06813079922072852, - -0.0067435855138492035, - -0.06440144856410124 - ], - "(1, 1, 0, 3, 0)": [ - -0.06506140124927248, - -0.05977439858481188, - -0.005462143228379877 - ], - "(1, 0, 0, 3, 0)": [ - -0.08156471124758687, - -0.08456976706745396, - -0.00404898513417271 - ], - "(1, 0, 1, 3, 0)": [ - -0.005896902209677571, - -0.07171024669840459, - -0.06654008399566524 - ], - "(1, 0, 0, 2, 0)": [ - -0.02219402382732805, - -0.04658678536438388, - -0.04290549872720911 - ], - "(1, 0, 1, 2, 0)": [ - -0.07413174929728189, - -0.010902068996063996, - -0.0711014826928577 - ], - "(1, 1, 1, 2, 0)": [ - -0.004503286552458026, - -0.09325628500138287, - -0.07829624068711999 - ], - "(1, 1, 0, 1, 0)": [ - -0.014907648034403006, - -0.017629548371804773, - -0.010963961423553778 - ], - "(1, 0, 0, 4, 1)": [ - -0.16388751037973964, - -0.13546188573035972, - -0.13194813749769618 - ], - "(1, 0, 1, 4, 1)": [ - -0.12720083589552428, - -0.1240015125280934, - -0.12827564921580467 - ], - "(1, 1, 1, 4, 1)": [ - -0.15169920503532877, - -0.14849310619301653, - -0.14830752781447082 - ], - "(1, 1, 0, 4, 1)": [ - -0.17117788658007088, - -0.2570247212211289, - -0.22043943594113632 - ], - "(3, 0, 0, 4, 0)": [ - -0.935957517661739, - -0.8741628643909318, - -0.9642891903753898 - ], - "(3, 0, 1, 4, 0)": [ - -0.8889661699468129, - -0.8992930672115816, - -0.8928405717719389 - ], - "(1, 1, 0, 2, 0)": [ - -0.047389204646554266, - -0.07177401878611174, - -0.003414182242928885 - ], - "(1, 1, 1, 1, 0)": [ - -0.0031223136242218355, - -0.02465389795874292, - -0.04581015989270518 - ], - "(1, 0, 0, 1, 0)": [ - -0.0732149748459828, - -0.06456921923153577, - -0.011363579406010668 - ], - "(3, 1, 0, 4, 0)": [ - -0.8538542222821633, - -0.9762960000792233, - -0.8372985666321078 - ], - "(3, 1, 0, 0, 0)": [ - -0.736288513594841, - -0.7427294717665378, - -0.6892531862036398 - ], - "(1, 0, 1, 1, 0)": [ - -0.06650375372103795, - -0.11163829257435914, - -0.009433645112219797 - ], - "(3, 0, 1, 0, 0)": [ - -0.6680308041344067, - -0.8815375050200256, - -0.8619180900295701 - ], - "(3, 1, 1, 0, 0)": [ - -0.9480938852904889, - -0.8998782091376097, - -0.7603660520784794 - ], - "(3, 1, 1, 4, 0)": [ - -1.0003339874232537, - -0.8679189961031905, - -0.8832677581149115 - ], - "(3, 1, 0, 5, 0)": [ - -2.977027543744521, - -2.752439283281814, - -1.793214304601806 - ], - "(2, 0, 0, 0, 0)": [ - -0.19736445761814894, - -0.19687784012632223, - -0.1456435908875613 - ], - "(5, 0, 1, 0, 0)": [ - -7.877333299322492, - -9.017206590043456, - -8.875031302458787 - ], - "(5, 1, 1, 1, 1)": [ - -9.439420370053188, - -8.405215818947548, - -8.882766016862826 - ], - "(5, 1, 0, 1, 1)": [ - -8.570488223265878, - -9.040442072724684, - -7.735954920134191 - ], - "(5, 0, 0, 1, 1)": [ - -8.394510374790025, - -8.211714961182981, - -6.523894996772898 - ], - "(5, 0, 1, 1, 1)": [ - -5.791777592018223, - -8.198600279587456, - -7.581499573764865 - ], - "(4, 1, 1, 1, 1)": [ - -4.657897331418944, - -4.37909653952978, - -3.1141378688860692 - ], - "(4, 1, 0, 1, 1)": [ - -4.662357614889094, - -3.0799917544864495, - -4.684222452975122 - ], - "(4, 0, 0, 1, 1)": [ - -4.114849641611714, - -3.5971589785403086, - -2.907401815734824 - ], - "(4, 0, 1, 1, 1)": [ - -3.631409759038911, - -3.784269419524094, - -2.9245936196951923 - ], - "(4, 1, 0, 2, 1)": [ - -4.103159828194269, - -4.076324573790363, - -4.072704009693106 - ], - "(4, 0, 0, 2, 1)": [ - -4.558597340708664, - -4.215846855313657, - -4.231615458442613 - ], - "(4, 0, 1, 2, 1)": [ - -4.210968677935139, - -4.302798464973418, - -4.119589644898803 - ], - "(4, 1, 1, 2, 1)": [ - -4.148304040547841, - -4.20309170225514, - -4.202753846173705 - ], - "(4, 0, 0, 3, 1)": [ - -4.493365742324821, - -3.5572734403077155, - -4.102839037113279 - ], - "(4, 0, 1, 3, 1)": [ - -4.785440027514513, - -3.62105397204959, - -4.522031431131259 - ], - "(4, 1, 1, 3, 1)": [ - -3.4444020399570148, - -4.520367335080097, - -4.538393593478434 - ], - "(4, 1, 0, 3, 1)": [ - -3.582503050008212, - -3.729075680061947, - -3.6866722289236744 - ], - "(2, 1, 1, 0, 0)": [ - -0.15669864784656357, - -0.08652529030466029, - -0.15344557308326373 - ], - "(2, 0, 1, 0, 0)": [ - -0.1680328719198184, - -0.1314234063459338, - -0.17464250264759898 - ], - "(4, 0, 0, 0, 0)": [ - -3.341126641713325, - -3.6869003546572072, - -3.49368972230538 - ], - "(4, 0, 0, 1, 0)": [ - -2.837629753683945, - -4.12750258069974, - -4.56616705882044 - ], - "(5, 0, 0, 0, 0)": [ - -6.638649368943689, - -8.905784553782132, - -8.43714813935995 - ], - "(5, 0, 0, 1, 0)": [ - -9.157658015035292, - -8.889362610921518, - -8.08703468684667 - ], - "(5, 0, 1, 1, 0)": [ - -7.865346602002181, - -8.731007369377588, - -9.0631697522648 - ], - "(5, 1, 1, 1, 0)": [ - -9.604221782468612, - -9.665760693122413, - -7.58317445080715 - ], - "(5, 1, 0, 1, 0)": [ - -9.218421439535135, - -8.852890301377313, - -8.675354973140916 - ], - "(5, 0, 1, 2, 0)": [ - -7.538419688657766, - -14.201690958003097, - -7.951516002970245 - ], - "(5, 1, 1, 2, 0)": [ - -7.936487077161325, - -7.199771295362781, - -7.941299924754709 - ], - "(5, 1, 0, 2, 0)": [ - -7.8999724037772845, - -7.333129844541226, - -7.779392901154807 - ], - "(5, 0, 0, 2, 0)": [ - -7.618480353285548, - -7.835886758350185, - -6.706812622207227 - ], - "(4, 1, 1, 2, 0)": [ - -3.563726208353684, - -3.5055373629395965, - -3.471104649707583 - ], - "(4, 1, 0, 2, 0)": [ - -3.8316973297575343, - -3.145128647594828, - -3.818500469275935 - ], - "(4, 1, 0, 3, 0)": [ - -4.1852148664375255, - -3.346624137547338, - -3.952887052234162 - ], - "(4, 0, 0, 3, 0)": [ - -4.459169123887398, - -4.514847539794854, - -4.524762788430744 - ], - "(4, 0, 1, 3, 0)": [ - -4.606170369229526, - -4.637568202180502, - -4.616376423041719 - ], - "(4, 1, 1, 3, 0)": [ - -4.206707100979519, - -3.3423022544947485, - -4.168137709948456 - ], - "(4, 0, 0, 4, 0)": [ - -4.234105664057562, - -4.237107468766884, - -4.236101643750965 - ], - "(4, 0, 1, 4, 0)": [ - -4.268205733816586, - -4.395574638860902, - -4.2860192727749755 - ], - "(4, 1, 1, 4, 0)": [ - -4.523838814577903, - -4.497763698262584, - -4.512721149370325 - ], - "(4, 1, 0, 4, 0)": [ - -4.425559055688517, - -4.4001293021904635, - -4.4303079982660325 - ], - "(4, 0, 1, 5, 0)": [ - -4.695094383033599, - -2.3239797427783784, - -4.367210306851003 - ], - "(4, 1, 1, 5, 0)": [ - -5.259179480809952, - -2.2441688305326273, - -4.381531267317479 - ], - "(4, 1, 0, 5, 0)": [ - -5.786105302528829, - -4.417781321861663, - -2.326597107114164 - ], - "(4, 0, 0, 5, 0)": [ - -5.130586334384959, - -2.3406340172202156, - -5.07897586718162 - ], - "(3, 0, 0, 5, 0)": [ - -2.924560984883939, - -2.8107063942111292, - -2.0328230352736933 - ], - "(3, 0, 1, 5, 0)": [ - -1.9328607976834506, - -2.804541653901778, - -2.9309719453923853 - ], - "(3, 1, 1, 5, 0)": [ - -2.9456885624252993, - -2.566887192544894, - -1.777186983798028 - ], - "(4, 0, 1, 0, 0)": [ - -3.3306992321198767, - -3.045871305234635, - -3.7283276733390323 - ], - "(4, 0, 1, 1, 0)": [ - -4.6192737406771265, - -3.649056837741786, - -2.9775062785178994 - ], - "(4, 1, 1, 1, 0)": [ - -3.0211479770108185, - -3.7078688744914023, - -4.302064119555902 - ], - "(4, 1, 0, 1, 0)": [ - -2.8619160693328065, - -3.953852267245893, - -3.7365879745006985 - ], - "(4, 0, 1, 2, 0)": [ - -3.4470436309560295, - -3.552127590337103, - -3.5003641436099846 - ], - "(4, 0, 0, 2, 0)": [ - -3.526712297043562, - -3.623098151859292, - -3.046457570202431 - ], - "(3, 0, 1, 5, 1)": [ - -1.1052694485550838, - -0.9780968173728476, - -1.0506876870353603 - ], - "(3, 1, 1, 5, 1)": [ - -1.033315718542053, - -0.9889151794959199, - -1.222215784543791 - ], - "(3, 1, 0, 5, 1)": [ - -1.2611701955332641, - -1.3037566716497595, - -0.9764730013980599 - ], - "(3, 0, 0, 5, 1)": [ - -1.1640404921311382, - -1.2282837210279365, - -0.9643975201119706 - ], - "(4, 1, 1, 0, 0)": [ - -3.267791161685298, - -3.3887900609125823, - -3.194460947446834 - ], - "(5, 1, 1, 0, 0)": [ - -8.518646554251474, - -8.517321979328182, - -8.74694398533162 - ], - "(4, 0, 0, 4, 1)": [ - -3.37227611676004, - -3.031641243665272, - -3.1584842259226544 - ], - "(4, 0, 1, 4, 1)": [ - -3.9099863640133568, - -3.0640284956927717, - -3.151604624961842 - ], - "(5, 1, 0, 3, 0)": [ - -5.965063124416357, - -6.430086478045828, - -6.643583818558305 - ], - "(5, 0, 0, 3, 0)": [ - -6.526490030611686, - -6.547862029479745, - -5.466246373833379 - ], - "(5, 0, 1, 3, 0)": [ - -6.104546825104379, - -7.008641265864339, - -6.512955596597061 - ], - "(5, 1, 1, 3, 0)": [ - -6.701981921064349, - -8.835306639855613, - -5.961329702158425 - ], - "(5, 0, 1, 4, 0)": [ - -6.59207369716748, - -17.015278387213122, - -9.026068759170137 - ], - "(5, 1, 0, 2, 1)": [ - -7.9010560398275596, - -7.85911448760359, - -7.892476895729203 - ], - "(5, 0, 0, 2, 1)": [ - -7.598089719813386, - -7.590815116206432, - -7.280054614354281 - ], - "(5, 0, 1, 2, 1)": [ - -7.817248607059643, - -6.99281226198276, - -7.540685669280034 - ], - "(5, 0, 1, 3, 1)": [ - -7.813387923097066, - -7.428752000991667, - -7.7719685746240845 - ], - "(5, 1, 1, 3, 1)": [ - -7.7102705710751, - -7.877328797572447, - -7.615435667350875 - ], - "(5, 1, 0, 3, 1)": [ - -8.208091433591923, - -8.015765975098713, - -7.148539624959201 - ], - "(5, 0, 0, 3, 1)": [ - -78.22615666661633, - -6.684483570525371, - -9.383946612768721 - ], - "(5, 1, 0, 4, 1)": [ - -10.061310992642312, - -88.94429965449777, - -6.3061823488645405 - ], - "(5, 0, 0, 4, 1)": [ - -7.891604129552659, - -153.84764259723215, - -6.110857151900652 - ], - "(5, 0, 1, 4, 1)": [ - -5.887902428569501, - -7.3459812044226105, - -9.124587739117226 - ], - "(5, 1, 1, 4, 1)": [ - -6.581840730664341, - -8.188464657045806, - -7.984637447786009 - ], - "(5, 1, 1, 5, 1)": [ - -146.57110473216096, - -16.80124781658259, - -38.9024334529018 - ], - "(5, 1, 0, 5, 1)": [ - -12.233626111174665, - -29.89971358865652, - -12.308922528283345 - ], - "(5, 0, 0, 5, 1)": [ - -11.777609487500728, - -10.856860694858064, - -9.202115025810192 - ], - "(4, 0, 0, 5, 1)": [ - -2.5612929024199738, - -3.0886806887815372, - -1.7967682184999256 - ], - "(5, 0, 1, 5, 1)": [ - -15.333936592667815, - -12.541692939398601, - -124.28149277979192 - ], - "(4, 0, 1, 5, 1)": [ - -2.6085683166286406, - -3.1791384466830657, - -1.736400609147868 - ], - "(4, 1, 1, 5, 1)": [ - -1.7293352062281198, - -2.30617061164696, - -2.9030734040758843 - ], - "(4, 1, 0, 5, 1)": [ - -2.684069086067236, - -2.466780845040611, - -1.5180741662159034 - ], - "(1, 1, 0, 0, 0)": [ - -0.024789070105125956, - -0.0075217289243905356, - -0.018209466679464048 - ], - "(2, 1, 0, 0, 0)": [ - -0.1460584377642487, - -0.14294287165799524, - -0.12318002440270179 - ], - "(5, 1, 1, 2, 1)": [ - -7.8199466469582815, - -7.824869863024521, - -7.071568144537861 - ], - "(4, 1, 1, 4, 1)": [ - -3.00812910862564, - -3.0636189202552444, - -3.26484420019774 - ], - "(4, 1, 0, 4, 1)": [ - -3.1679320972033755, - -2.940800355271365, - -3.1710797009268554 - ], - "(4, 1, 0, 0, 0)": [ - -3.205336193222848, - -2.861221920215627, - -2.9660904434374284 - ], - "(1, 0, 1, 0, 0)": [ - -0.022374116776514512, - -0.006087568760539901, - -0.022624413419781938 - ], - "(1, 1, 1, 0, 0)": [ - -0.015337551229075113, - -0.007726550110573426, - -0.028441883799041376 - ], - "(5, 1, 1, 4, 0)": [ - -6.858672234210656, - -264.9787633292171, - -9.368267733867274 - ], - "(5, 1, 0, 4, 0)": [ - -6.763832787203489, - -133.0630328217745, - -9.310800869316676 - ], - "(5, 0, 0, 4, 0)": [ - -7.737498456636583, - -8.399778242217225, - -6.565626813501766 - ], - "(5, 1, 0, 5, 0)": [ - -9.921319792574753, - -20.73049636352885, - -26.62630405121402 - ], - "(5, 0, 0, 5, 0)": [ - -31.66707527265042, - -10.516962421080692, - -17.65856833020611 - ], - "(5, 0, 1, 5, 0)": [ - -29.379059120237507, - -9.522886174494472, - -55.53399974359518 - ], - "(5, 1, 1, 5, 0)": [ - -9.843935646871683, - -117.99589328100338, - -10.295374665350472 - ], - "(1, 0, 0, 0, 0)": [ - -0.016559523734369853, - -0.008228903479180136, - -0.01954171905937028 - ], - "(6, 1, 1, 2, 0)": [ - -1116.5144126711714, - -1057.0663804285532, - -1006.4410252993137 - ], - "(6, 1, 1, 1, 0)": [ - -973.1594826274455, - -1859.9553385448164, - -1517.6529328713239 - ], - "(6, 1, 0, 1, 0)": [ - -1236.2894842908408, - -1131.906764202921, - -1505.883621644145 - ], - "(6, 0, 0, 1, 0)": [ - -1466.0721319970694, - -1544.5142229844855, - -1152.9170897944741 - ], - "(6, 0, 1, 1, 0)": [ - -1570.7635068133768, - -981.4430142694713, - -1703.5183645294412 - ], - "(6, 1, 0, 1, 1)": [ - -1155.2567011764704, - -1032.1943847007128, - -1335.5446158661819 - ], - "(6, 0, 0, 1, 1)": [ - -1100.667912897434, - -2339.538301920014, - -1609.5225264067299 - ], - "(6, 0, 1, 1, 1)": [ - -1278.4581284785775, - -1684.889589986408, - -1029.4206215136228 - ], - "(6, 1, 1, 1, 1)": [ - -1453.3435071395206, - -1975.8622519262826, - -969.7839308859689 - ], - "(6, 1, 1, 2, 1)": [ - -2025.3196391545582, - -1835.3756213702516, - -1970.9568469251994 - ], - "(6, 1, 0, 2, 1)": [ - -1808.7411976548024, - -1926.8457198677565, - -1922.154254471494 - ], - "(6, 0, 0, 2, 1)": [ - -1879.5507853739712, - -1896.5155828780667, - -1900.3847160958696 - ], - "(6, 0, 1, 2, 1)": [ - -1838.546093861708, - -1947.2731890025766, - -1953.5502392507804 - ], - "(6, 1, 1, 3, 1)": [ - -2601.963351793299, - -1520.7929543903476, - -2009.1839631971604 - ], - "(6, 1, 0, 3, 1)": [ - -2538.9830465698537, - -1470.5364589013388, - -2556.7724197874645 - ], - "(6, 0, 0, 3, 1)": [ - -2415.7430327611105, - -1480.6332741347496, - -2389.3712015666824 - ], - "(6, 0, 1, 3, 1)": [ - -1427.037154226102, - -2468.0867126015783, - -2693.097591883856 - ], - "(6, 1, 1, 4, 1)": [ - -2528.502350850205, - -1019.9324960749066, - -2399.1506249762306 - ], - "(6, 1, 0, 4, 1)": [ - -1011.0413400551581, - -2743.7810832747255, - -1972.5007198389508 - ], - "(6, 0, 0, 4, 1)": [ - -2296.5878845237426, - -1153.1131816139768, - -2287.6304479319706 - ], - "(6, 0, 1, 4, 1)": [ - -1041.4282409867158, - -2719.908177221292, - -2718.5135630922123 - ], - "(6, 1, 1, 5, 1)": [ - -294.39123552343875, - -1250.822627678743, - -2798.5589219834333 - ], - "(6, 1, 0, 5, 1)": [ - -3357.830654247613, - -294.5761052752778, - -2102.6742725104464 - ], - "(6, 0, 0, 5, 1)": [ - -300.0150698687376, - -2449.74821396103, - -1705.4349967068156 - ], - "(6, 0, 1, 5, 1)": [ - -300.12135420445907, - -2189.804585497691, - -1751.3784784308189 - ], - "(5, 1, 0, 0, 0)": [ - -8.031772491032987, - -6.795735492938614, - -7.499899268094892 - ], - "(6, 1, 0, 5, 0)": [ - -1785.8124786328717, - -1063.459164590437, - -600.1942675997082 - ], - "(6, 0, 0, 5, 0)": [ - -1060.43907183845, - -586.2639856018499, - -1130.7244425421625 - ], - "(6, 0, 1, 5, 0)": [ - -1284.8186703543374, - -1208.509487610621, - -609.6653379439501 - ], - "(6, 1, 1, 5, 0)": [ - -1192.7341066601605, - -600.924762931327, - -1785.5614365309605 - ], - "(6, 0, 0, 4, 0)": [ - -1174.0083559070758, - -2028.4199603906045, - -2156.1684423507136 - ], - "(6, 0, 1, 4, 0)": [ - -2540.949512040624, - -2233.986752517052, - -1106.9090750131995 - ], - "(6, 1, 1, 4, 0)": [ - -1743.30513025061, - -2475.314499777569, - -1085.0861281545672 - ], - "(6, 1, 0, 4, 0)": [ - -1071.798513651489, - -2240.6300952840056, - -1979.464227039147 - ], - "(6, 0, 0, 3, 0)": [ - -2280.5458022568973, - -2534.7749689606944, - -1389.9764829156918 - ], - "(6, 0, 1, 3, 0)": [ - -2255.080462459018, - -2221.34171538017, - -1368.4724537300879 - ], - "(6, 1, 1, 3, 0)": [ - -2223.4327566394413, - -1452.9122175437542, - -2363.8219199208106 - ], - "(6, 1, 0, 3, 0)": [ - -2113.4480170748416, - -2126.3965731071935, - -1422.2125476270976 - ], - "(6, 0, 1, 2, 0)": [ - -862.9705226501901, - -885.050497775557, - -946.2179144798675 - ], - "(6, 1, 0, 2, 0)": [ - -885.1094302868878, - -841.5076360251412, - -938.5948842174429 - ], - "(6, 0, 0, 2, 0)": [ - -846.2577639094857, - -1135.7882685222858, - -989.109655789047 - ] - } -} \ No newline at end of file diff --git a/models/q_anti-pendulum_2.json b/models/q_anti-pendulum_2.json new file mode 100644 index 0000000..c7c6d86 --- /dev/null +++ b/models/q_anti-pendulum_2.json @@ -0,0 +1,12227 @@ +{ + "start-training": "16.06.2026 06:27:47", + "end-training": "16.06.2026 07:08:08", + "pendulum": { + "wire-length": "10.0", + "wire-q-factor": "50.0", + "reward-factors": "(-1.0, -1.0, -0.5)", + "acceleration": "0.1", + "step-size": "1.0", + "observations-discretization": "{'angle': array([-0.55850536, -0.27925268, -0.13962634, -0.06981317, -0.03490659,\n -0.01745329, 0. , 0.01745329, 0.03490659, 0.06981317,\n 0.13962634, 0.27925268, 0.55850536]), 'speed': array([-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.]), 'c-pos': array([-2. , -1. , -0.5 , -0.25 , -0.125, 0. , 0.125, 0.25 ,\n 0.5 , 1. , 2. ]), 'c-speed': array([-2. , -1. , -0.5 , -0.25 , -0.125, 0. , 0.125, 0.25 ,\n 0.5 , 1. , 2. ]), 'avg-acc': array([-1.25, -1. , -0.75, -0.5 , -0.25, 0. , 0.25, 0.5 , 0.75,\n 1. , 1.25])}", + "reward_limit": "-0.1", + "start-load-speed": "2" + }, + "q_agent": { + "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_anti-pendulum_5_0_3.json", + "use_file": "rw", + "episodes": "30000", + "steps": "1784954", + "learning_rate": "0.1", + "discount_factor": "0.95", + "epsilon-decay": "0.0001", + "final-epsilon": "0.1", + "epsilon": "0.1", + "#terminated": 22459, + "#truncated": 7541, + "reward-trend": 14.80832404476586, + "reward-std": 12.624453126053558, + "reward-2nd": 18.94365616585871 + }, + "q_values": { + "(10, 6, 5, 5, 5)": [ + -1.6508400241838843, + -1.7619791697222538, + -1.713142534334536 + ], + "(6, 7, 5, 5, 5)": [ + -1.9485691206094637, + -1.7592887365645091, + -1.7145382277085564 + ], + "(10, 4, 4, 4, 4)": [ + -1.6079281218815331, + -1.533955644336904, + -1.2904190338413912 + ], + "(8, 3, 3, 4, 4)": [ + -1.478533197919707, + -1.5470705571268728, + -1.6507191203808493 + ], + "(9, 3, 2, 3, 4)": [ + -2.04778049681663, + -1.8296811861822335, + -1.5946699268685474 + ], + "(10, 5, 1, 2, 4)": [ + -2.479806296489871, + -2.3383750826996517, + -1.956006617898805 + ], + "(8, 6, 0, 2, 4)": [ + -2.3836916218476074, + -2.424301177607668, + -2.095255861278325 + ], + "(9, 6, 0, 2, 4)": [ + -2.46041560386199, + -2.635745185727324, + -2.0955129541087127 + ], + "(10, 4, 0, 2, 4)": [ + -2.354757040659709, + -2.578697012495351, + -2.429358096074893 + ], + "(9, 3, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 5, 5, 4)": [ + -1.5496668674867073, + -1.3922518273801279, + -1.490022616385545 + ], + "(6, 7, 5, 5, 4)": [ + -1.9355944509366718, + -1.7767530348144993, + -1.7259334747940656 + ], + "(10, 4, 5, 5, 4)": [ + -1.5007268546875638, + -1.5046541604921124, + -1.6223464614509124 + ], + "(7, 3, 6, 5, 4)": [ + -1.1202415172742186, + -1.440711764455342, + -1.5234141893451334 + ], + "(10, 3, 7, 6, 5)": [ + -2.078830981219692, + -2.295996159818653, + -2.4067555025918645 + ], + "(10, 5, 8, 5, 4)": [ + -1.664837636485749, + -1.8948874786522756, + -1.825605300411263 + ], + "(8, 6, 8, 6, 5)": [ + -1.4852007447006006, + -2.0983926703961138, + -2.2381238100751504 + ], + "(9, 6, 9, 7, 5)": [ + -2.61741962498347, + -2.5907728222338755, + -2.4584419542416804 + ], + "(10, 4, 9, 7, 5)": [ + -2.111909099455755, + -2.45796452061736, + -2.345727060942427 + ], + "(9, 3, 9, 7, 5)": [ + -2.3180142341827423, + -2.507566612958136, + -2.42978320567648 + ], + "(9, 3, 9, 6, 4)": [ + -2.358561402004231, + -2.806155068075748, + -2.162717180143657 + ], + "(10, 4, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 5, 5, 5)": [ + -1.5495247272988295, + -1.6610164968037309, + -1.747486055017792 + ], + "(10, 4, 7, 6, 5)": [ + -1.5095631701928744, + -1.795584921237861, + -1.9988872322136548 + ], + "(7, 3, 7, 5, 5)": [ + -1.2620050905092346, + -1.6461738593769784, + -1.9070536930138668 + ], + "(10, 3, 8, 6, 5)": [ + -2.0288699461232893, + -2.3195065084780597, + -2.421932822796878 + ], + "(10, 5, 8, 5, 5)": [ + -1.5738648912067625, + -1.9859091900983579, + -1.9311970538256293 + ], + "(9, 6, 9, 5, 4)": [ + -2.371098160041873, + -2.157119047533837, + -2.3712074490502744 + ], + "(10, 4, 9, 5, 4)": [ + -1.8489096040980906, + -2.280208565794354, + -2.3009859406104947 + ], + "(9, 3, 9, 5, 4)": [ + -1.923422383516403, + -2.167238571713426, + -2.578571356178268 + ], + "(8, 6, 9, 5, 5)": [ + -2.319697901182499, + -2.3678266441772213, + -2.0167144978741383 + ], + "(10, 5, 9, 5, 4)": [ + -1.8448826718429103, + -2.2580552005246757, + -2.349852942357952 + ], + "(9, 4, 9, 4, 4)": [ + -1.3322351712770537, + -1.4000727256398862, + -1.6532471481659523 + ], + "(6, 3, 8, 3, 4)": [ + -1.3420365349911796, + -1.0702050741272908, + -1.3534941771316438 + ], + "(9, 4, 8, 4, 4)": [ + -0.8895009933834647, + -0.9470593950352295, + -1.1464158302699703 + ], + "(8, 6, 8, 4, 4)": [ + -1.3960495057160047, + -1.3539547524312314, + -1.5241293563352456 + ], + "(9, 6, 8, 4, 4)": [ + -1.5301090464210274, + -1.5960274179178082, + -1.770008674707631 + ], + "(10, 4, 8, 4, 4)": [ + -1.2997496616128996, + -1.4786510953826262, + -1.743425529588889 + ], + "(8, 3, 8, 5, 5)": [ + -1.2402874555480254, + -1.428320242044711, + -1.6970359041568033 + ], + "(9, 3, 7, 4, 4)": [ + -1.2002159820127938, + -1.3288554351023398, + -1.32293753552813 + ], + "(10, 4, 7, 5, 5)": [ + -1.3744256655449107, + -1.5741166891045273, + -1.5442159795934427 + ], + "(9, 6, 8, 5, 5)": [ + -1.9164191199797591, + -1.6937939845365477, + -1.987855453638293 + ], + "(8, 6, 8, 5, 5)": [ + -1.6884477712455674, + -1.5605116652156674, + -1.75603362610475 + ], + "(9, 4, 8, 5, 4)": [ + -1.0788647813128467, + -1.2438435794715215, + -1.2528834352974758 + ], + "(6, 3, 8, 4, 4)": [ + -1.0238777686107179, + -1.2231592183100946, + -1.3067094680015345 + ], + "(9, 4, 7, 3, 4)": [ + -0.9341326600374791, + -0.6875283633357747, + -0.9435741132228885 + ], + "(9, 5, 5, 2, 4)": [ + -1.2601908302500713, + -1.13568654955533, + -0.8346359349009513 + ], + "(6, 6, 2, 2, 4)": [ + -1.749305099268079, + -1.6889652466468552, + -1.2877420522253022 + ], + "(9, 5, 1, 2, 4)": [ + -1.8423841854760241, + -1.5571930618539291, + -1.3551797229755609 + ], + "(9, 4, 0, 1, 4)": [ + -1.8487859266346618, + -3.2391232385761985, + -3.548607824101031 + ], + "(8, 3, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 6, 5, 4)": [ + -1.341949064851529, + -1.4591111646526143, + -1.6131243625890614 + ], + "(7, 3, 7, 5, 4)": [ + -1.0752877701747352, + -1.2991350403364974, + -1.8101385001333599 + ], + "(9, 3, 7, 5, 4)": [ + -1.3462161343749057, + -1.4868147265882778, + -1.5112604703169366 + ], + "(10, 5, 8, 6, 5)": [ + -1.7838797070418915, + -2.1994739942325063, + -2.2612412607437333 + ], + "(8, 6, 8, 5, 4)": [ + -1.5675103571365443, + -1.703020385370512, + -1.8173569864913222 + ], + "(9, 6, 8, 5, 4)": [ + -1.5499291636864578, + -1.727058804749009, + -1.7122544906102577 + ], + "(9, 3, 7, 3, 4)": [ + -0.9995309327144315, + -1.1527911497368262, + -1.3084206034441779 + ], + "(8, 3, 5, 2, 4)": [ + -1.4317598630090698, + -1.3150730560748545, + -1.6698035925281616 + ], + "(10, 4, 2, 2, 4)": [ + -2.199797882352851, + -2.1884378510658142, + -1.6317969976963074 + ], + "(9, 6, 1, 2, 4)": [ + -2.4731612219362327, + -2.233925609060266, + -1.8867839864485332 + ], + "(10, 5, 0, 2, 4)": [ + -2.7961789854141808, + -2.9378848559253075, + -2.5571363386078176 + ], + "(9, 3, 0, 2, 4)": [ + -2.3482484956918284, + -2.5938517243631747, + -2.476961749157783 + ], + "(7, 3, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 5, 5, 4)": [ + -1.7103963565857963, + -1.673075182220122, + -1.6698950100871022 + ], + "(10, 4, 5, 5, 5)": [ + -1.4805810742005434, + -1.3999762113054703, + -1.5534053395929288 + ], + "(7, 3, 5, 5, 4)": [ + -0.6494372093514, + -0.7929359016267745, + -0.9464465443598771 + ], + "(10, 3, 6, 5, 5)": [ + -1.4405087879890133, + -1.8711655309649498, + -1.8922413759646166 + ], + "(10, 5, 7, 6, 5)": [ + -1.417221008970588, + -1.6593571523168114, + -1.8660605389505158 + ], + "(9, 6, 8, 7, 5)": [ + -2.3386062508529557, + -2.0669683866734783, + -2.4062017314723945 + ], + "(9, 3, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 5, 5, 5)": [ + -0.6400800276543618, + -0.9218213349704187, + -1.0250737636979086 + ], + "(9, 3, 5, 5, 5)": [ + -1.1517474169694288, + -1.539699170125085, + -1.5623206337241304 + ], + "(10, 5, 5, 4, 4)": [ + -1.582689826265763, + -1.4651741327021042, + -1.192871578054045 + ], + "(8, 6, 3, 3, 4)": [ + -1.603684084273401, + -1.4388736140329543, + -1.366603917849938 + ], + "(9, 6, 2, 3, 4)": [ + -2.1429060549487757, + -1.7584321165069756, + -1.6469822299265502 + ], + "(10, 4, 1, 2, 4)": [ + -2.435258286403159, + -2.360711373712138, + -2.1602858848737725 + ], + "(9, 3, 1, 3, 4)": [ + -2.29753828191938, + -2.1157468137448983, + -1.9060669415064229 + ], + "(9, 3, 0, 3, 4)": [ + -2.6258378365652097, + -2.5178327151131663, + -2.607025321457255 + ], + "(10, 4, 0, 3, 4)": [ + -2.5710418551026857, + -2.5472839268015726, + -2.309617088236495 + ], + "(9, 6, 0, 4, 5)": [ + -2.3523699137033227, + -2.3088949618470056, + -2.1238986999494385 + ], + "(8, 6, 0, 4, 5)": [ + -2.328080974830416, + -2.1390397004970634, + -1.8775807453475457 + ], + "(10, 5, 0, 4, 5)": [ + -2.4839516636632655, + -2.5296848748095275, + -2.1444354539741166 + ], + "(9, 3, 0, 4, 5)": [ + -2.2046932393818532, + -2.416694666297741, + -2.449679882165923 + ], + "(7, 3, 0, 3, 4)": [ + -2.0586269134566733, + -2.2918992893091286, + -2.358273972923 + ], + "(10, 4, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 2, 7, 6, 5)": [ + -1.9121550442458635, + -2.2731580201726422, + -2.612402006549002 + ], + "(10, 3, 7, 5, 5)": [ + -1.4938452512178662, + -1.90946905843496, + -2.108568519243793 + ], + "(10, 5, 7, 5, 4)": [ + -1.3247621478957643, + -1.59355359689284, + -1.5189178091079985 + ], + "(8, 6, 7, 4, 4)": [ + -1.4045484432893491, + -1.2617579996108796, + -1.3808030413444514 + ], + "(10, 6, 5, 3, 4)": [ + -1.8156877895245582, + -2.2666303907037446, + -1.6098423366031867 + ], + "(10, 4, 5, 4, 4)": [ + -1.3279494297344416, + -1.1226643603534558, + -1.2968644284737136 + ], + "(8, 3, 4, 4, 4)": [ + -1.2755518379371924, + -1.3030700490616471, + -1.015752420212436 + ], + "(9, 3, 3, 4, 4)": [ + -1.6127052530955441, + -1.4262788959254733, + -1.3908977099250006 + ], + "(10, 5, 2, 4, 4)": [ + -1.7569998095053272, + -1.5904527842752763, + -1.424494838740919 + ], + "(9, 6, 2, 5, 5)": [ + -1.5486597347735898, + -1.3418112180752297, + -1.288625591325634 + ], + "(9, 6, 2, 4, 4)": [ + -1.8214266588943673, + -1.537427434206144, + -1.3345834212492256 + ], + "(10, 5, 1, 3, 4)": [ + -2.3262141548005633, + -2.384282029223163, + -1.9172969271329439 + ], + "(10, 3, 1, 3, 4)": [ + -2.472966561489204, + -2.4473848511262926, + -1.992907863065399 + ], + "(8, 3, 0, 2, 4)": [ + -2.272722708542549, + -2.037616505132451, + -2.2527721383865797 + ], + "(10, 6, 0, 2, 4)": [ + -2.592000686527249, + -3.56036179440597, + -2.7430418661860543 + ], + "(6, 6, 0, 3, 5)": [ + -4.737055877693265, + -3.0362895493347533, + -2.0533417870965365 + ], + "(10, 5, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 5, 5, 5)": [ + -1.2621577175392995, + -1.2680024077163032, + -1.5840961573687589 + ], + "(10, 3, 5, 5, 5)": [ + -1.6866533796735297, + -1.7587940374251214, + -1.714237509139747 + ], + "(8, 6, 5, 4, 4)": [ + -1.3339370531787271, + -1.1235675509921144, + -1.029968868523548 + ], + "(9, 6, 4, 4, 4)": [ + -1.544524197043112, + -1.3093058201718388, + -1.168428844779513 + ], + "(10, 4, 3, 4, 4)": [ + -1.601248691316946, + -1.606663782241888, + -1.6112716822166202 + ], + "(9, 3, 1, 2, 4)": [ + -2.5250869052843545, + -2.327666824643726, + -2.505820995853641 + ], + "(9, 6, 0, 3, 4)": [ + -2.4677262430253806, + -2.484688584369541, + -2.214285366166861 + ], + "(9, 4, 0, 4, 5)": [ + -1.888129100372227, + -1.8493796213556255, + -1.5386582237746014 + ], + "(6, 3, 0, 4, 5)": [ + -2.176102241596454, + -1.7928339157193998, + -2.26770405632958 + ], + "(10, 4, 0, 5, 5)": [ + -2.4068805002253217, + -2.297335780552213, + -1.9970001623842903 + ], + "(10, 5, 0, 6, 5)": [ + -2.2011778033830534, + -1.8481164397017644, + -1.7367905235384165 + ], + "(7, 6, 1, 6, 5)": [ + -1.5326970706570853, + -1.386671516591853, + -0.9071083229119317 + ], + "(9, 6, 1, 6, 5)": [ + -1.7412873103446362, + -1.3782809488313659, + -1.451379502358508 + ], + "(10, 4, 1, 5, 5)": [ + -1.8012594973192917, + -1.7262276097083114, + -1.6002086627062158 + ], + "(9, 3, 1, 4, 4)": [ + -1.981009096203958, + -1.9734895460825128, + -1.7685176193063288 + ], + "(9, 5, 1, 3, 4)": [ + -1.773133600429267, + -1.4105453159491281, + -1.1536735454249498 + ], + "(9, 6, 0, 4, 4)": [ + -2.58426450960246, + -2.293615805175922, + -2.026259078530942 + ], + "(8, 6, 0, 4, 4)": [ + -2.4639875364233967, + -2.1908161934204022, + -2.053533388534091 + ], + "(9, 5, 0, 4, 5)": [ + -1.8149549735650443, + -1.8285527541281654, + -1.5483564545199595 + ], + "(9, 4, 0, 5, 5)": [ + -1.8853521211601636, + -1.7843736841419005, + -1.3894381238077984 + ], + "(8, 3, 1, 6, 5)": [ + -1.3438766240942488, + -1.581391017107592, + -1.0687306282422562 + ], + "(9, 4, 1, 7, 5)": [ + -0.9454531822124415, + -0.8568107415890278, + -0.991806603525959 + ], + "(9, 5, 4, 7, 5)": [ + -0.6836037186403127, + -0.9523410694937454, + -1.151967581272173 + ], + "(6, 6, 7, 8, 5)": [ + -5.2444721084905, + -1.6814348054414407, + 0.0 + ], + "(9, 5, 8, 8, 5)": [ + -1.887984479540722, + -3.535551147540035, + -2.2762584688915144 + ], + "(9, 4, 9, 7, 5)": [ + -2.059523378581653, + -1.7650814999441407, + -2.0544801328289086 + ], + "(7, 3, 9, 7, 5)": [ + -2.1835068465765137, + -2.0111597795741423, + -2.15198189228833 + ], + "(8, 4, 9, 6, 4)": [ + -1.5410567352134643, + -2.9626244171837044, + -2.280335431446754 + ], + "(9, 5, 9, 5, 4)": [ + -1.4496808458670236, + -1.918637053281842, + -1.8767512880498014 + ], + "(8, 5, 9, 5, 4)": [ + -1.4455088265783447, + -1.5820093927138625, + -1.5866535636171848 + ], + "(8, 5, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 2, 3, 4)": [ + -1.7045855173116775, + -1.6235403772779207, + -1.580657264944569 + ], + "(9, 3, 2, 4, 4)": [ + -1.833328813189231, + -1.8761509437495751, + -1.5454272104174336 + ], + "(9, 6, 1, 4, 4)": [ + -2.10123771684109, + -1.7381742992855425, + -1.6227060936179911 + ], + "(9, 3, 1, 5, 5)": [ + -1.8573461776255715, + -1.819603011856715, + -1.7767300678271611 + ], + "(8, 6, 2, 6, 5)": [ + -1.446666148292605, + -1.051023771684711, + -1.1953727464998698 + ], + "(10, 5, 4, 6, 5)": [ + -1.1598312563096718, + -1.1951729365889077, + -1.4703296224193145 + ], + "(9, 3, 6, 7, 5)": [ + -1.4908304876508156, + -2.5295119063828913, + -2.1720968615695213 + ], + "(7, 3, 8, 7, 5)": [ + -1.4285934416443815, + -1.9415518079767893, + -2.173785394194161 + ], + "(10, 4, 8, 7, 5)": [ + -1.8689119640754621, + -2.11414678220236, + -2.339227249340776 + ], + "(10, 5, 9, 7, 5)": [ + -2.3237934771477833, + -2.466423270418072, + -2.557871153558644 + ], + "(6, 6, 9, 7, 5)": [ + -2.1835683050896346, + -2.165195909906039, + -1.9626726098058984 + ], + "(9, 5, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 4, 4, 4)": [ + -1.9107269256290753, + -1.7609338615079393, + -1.7664363045467093 + ], + "(10, 4, 4, 5, 5)": [ + -1.4218934370417264, + -1.36397392702154, + -1.3220803194474477 + ], + "(10, 3, 2, 4, 4)": [ + -2.0007632610063886, + -1.8352695354499589, + -1.8859760159225964 + ], + "(8, 6, 1, 3, 4)": [ + -1.9996296731929755, + -1.9237450364841824, + -1.7242355487011523 + ], + "(6, 3, 8, 7, 5)": [ + -1.84942531447172, + -2.2642332940261287, + -2.3727709837247173 + ], + "(10, 3, 8, 7, 5)": [ + -2.487676501094585, + -2.540002944442371, + -2.701927837170447 + ], + "(8, 6, 9, 7, 5)": [ + -2.460733952613764, + -1.8592043478915763, + -2.3921053182969683 + ], + "(9, 6, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 5, 4, 4)": [ + -1.5440855918322707, + -1.516048734948591, + -1.4813360987880702 + ], + "(9, 3, 4, 4, 4)": [ + -1.604128376204926, + -1.325285531866426, + -1.5108990915244571 + ], + "(10, 5, 4, 5, 5)": [ + -1.4835724226657065, + -1.406952931132257, + -1.190455890907384 + ], + "(9, 6, 3, 4, 4)": [ + -1.7821277801159556, + -1.4274104588482892, + -1.3372154821550635 + ], + "(8, 6, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 5, 5, 4)": [ + -1.0793904288175145, + -1.4043572791957124, + -1.3935080001781937 + ], + "(9, 3, 5, 4, 4)": [ + -1.4542017354488384, + -1.4187431150686027, + -1.5081014684943517 + ], + "(10, 5, 3, 3, 4)": [ + -1.821901945919751, + -1.5843608615198714, + -1.3647978611173162 + ], + "(8, 6, 2, 4, 4)": [ + -1.6839501311279081, + -1.4694239673148541, + -1.1356500504846174 + ], + "(10, 4, 1, 3, 4)": [ + -2.34941303415033, + -2.2070667913925166, + -1.8830435648498967 + ], + "(8, 3, 1, 3, 4)": [ + -2.031640305482058, + -1.960422170256653, + -1.6243482448063173 + ], + "(10, 4, 0, 4, 5)": [ + -2.456188628442107, + -2.407764510853866, + -1.9802669918952063 + ], + "(9, 6, 0, 5, 5)": [ + -2.3214956975742425, + -2.339089475169411, + -1.7580163929325994 + ], + "(7, 6, 0, 4, 4)": [ + -3.5407231990189603, + -2.728123240411517, + -2.029748014045707 + ], + "(10, 5, 0, 5, 5)": [ + -2.4306870310396205, + -2.200191001385884, + -1.8571033386169118 + ], + "(9, 4, 0, 4, 4)": [ + -1.9323078600919608, + -1.9536221826875715, + -1.6445616848745175 + ], + "(6, 3, 0, 5, 5)": [ + -2.0965708508890923, + -2.22414745366442, + -1.7098637228841214 + ], + "(7, 6, 0, 5, 5)": [ + -2.1772561227809555, + -1.8752793806628039, + -1.386087020195188 + ], + "(9, 3, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 9, 6, 5)": [ + -2.235377401790671, + -2.523999854409546, + -2.6091829117940075 + ], + "(9, 3, 9, 6, 5)": [ + -2.039584698383536, + -2.248777453401849, + -2.4050636679868327 + ], + "(10, 4, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 4, 5, 5)": [ + -1.1627434203683498, + -1.1992566265300504, + -1.3544522829386432 + ], + "(10, 5, 6, 6, 5)": [ + -1.2445374207491402, + -1.4607549444282286, + -1.8014173439377177 + ], + "(8, 3, 9, 6, 5)": [ + -1.8079206743949678, + -2.25342976863696, + -2.3197124979060617 + ], + "(10, 3, 2, 4, 5)": [ + -2.2658207568313355, + -2.12668741236729, + -1.7755018255735828 + ], + "(8, 6, 1, 2, 4)": [ + -2.3466329010867413, + -2.3008051917147863, + -1.68113224234201 + ], + "(7, 3, 6, 5, 5)": [ + -0.9831438034382771, + -1.414060062177982, + -1.6806593926949498 + ], + "(8, 6, 8, 7, 5)": [ + -2.297784527925798, + -2.1780125186978037, + -1.8842346682423634 + ], + "(9, 6, 9, 6, 5)": [ + -2.2359891405324164, + -2.428209390561915, + -2.55548952018463 + ], + "(8, 6, 9, 5, 4)": [ + -2.0775803598768032, + -2.238414137892225, + -2.2168491078003303 + ], + "(10, 5, 9, 5, 5)": [ + -1.9763934228476687, + -2.5616904853622744, + -2.47606221922093 + ], + "(9, 3, 9, 5, 5)": [ + -2.027798713431237, + -2.502384199973206, + -2.5697145495120637 + ], + "(7, 3, 9, 5, 4)": [ + -1.543211942771352, + -2.222296670750259, + -2.2085867259108003 + ], + "(10, 4, 9, 5, 5)": [ + -2.192455125952168, + -2.4923224655120886, + -2.5221942640005093 + ], + "(6, 6, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 6, 5, 5)": [ + -1.4619312454241118, + -1.5738457726336967, + -1.7572434842386724 + ], + "(9, 3, 6, 5, 5)": [ + -1.3602602358974842, + -1.5334214958244652, + -1.5261261540997817 + ], + "(8, 6, 4, 3, 4)": [ + -1.601147627292604, + -1.180797651355491, + -0.8917569908607721 + ], + "(10, 5, 1, 4, 4)": [ + -2.1629030516042245, + -2.0517155768066795, + -1.7227879960314423 + ], + "(9, 6, 1, 5, 5)": [ + -1.6511795645186984, + -1.6382842126965813, + -1.3651208965157997 + ], + "(7, 6, 1, 5, 5)": [ + -1.3694954179137162, + -1.2544228821873222, + -0.9791178939519373 + ], + "(10, 5, 1, 5, 4)": [ + -2.0623951754180365, + -1.622649362082762, + -2.2686367796465094 + ], + "(10, 4, 1, 4, 4)": [ + -2.023787892296082, + -1.9164525168109139, + -1.7708733105593524 + ], + "(6, 3, 1, 5, 5)": [ + -1.358646489879602, + -1.1401302371754527, + -1.337500418806914 + ], + "(10, 5, 0, 3, 4)": [ + -2.38205415727169, + -2.5951209201159804, + -2.512099155696926 + ], + "(7, 6, 0, 3, 4)": [ + -2.2920824632583354, + -2.222156585671197, + -1.7062443779937466 + ], + "(7, 3, 0, 5, 5)": [ + -2.006852523720687, + -1.9796440280644727, + -2.149199214139953 + ], + "(9, 3, 0, 5, 5)": [ + -2.279196630497656, + -2.1539374578933184, + -1.9733647053064658 + ], + "(10, 5, 8, 7, 5)": [ + -1.8154777823806338, + -2.3603824935884745, + -2.2181118277088636 + ], + "(10, 6, 4, 4, 5)": [ + -2.1163796390707184, + -2.0018390046796357, + -1.7050288006118488 + ], + "(9, 6, 1, 3, 4)": [ + -2.1838134001452554, + -2.087835307081738, + -1.698823601424445 + ], + "(8, 6, 0, 3, 4)": [ + -2.3724401655370486, + -2.476270046354999, + -2.131668063586422 + ], + "(10, 3, 0, 2, 4)": [ + -2.6564235473240574, + -2.873581991297775, + -2.7338515680838325 + ], + "(10, 5, 2, 5, 5)": [ + -1.5597189956528095, + -1.5237754263444212, + -1.3452785805038512 + ], + "(8, 2, 0, 2, 4)": [ + -3.222781209129625, + -6.807322627166469, + -6.7527404468182475 + ], + "(10, 4, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 6, 5, 5)": [ + -1.445642156751867, + -1.4118884807972987, + -1.5431933378565048 + ], + "(9, 6, 6, 5, 4)": [ + -1.3247420078377037, + -1.5272692319765433, + -1.428076314138798 + ], + "(9, 3, 7, 5, 5)": [ + -1.0711020310292447, + -1.366385125636815, + -1.6475808904657145 + ], + "(9, 6, 8, 6, 5)": [ + -1.8605068510648057, + -2.1219695304578243, + -2.225393267993709 + ], + "(7, 6, 8, 7, 5)": [ + -1.973520191287891, + -2.2332690964920223, + -2.1776074446910205 + ], + "(6, 3, 9, 7, 5)": [ + -2.0529253265564424, + -2.1739571071169204, + -2.3436340706089154 + ], + "(9, 4, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 7, 4, 4)": [ + -2.028334158766506, + -1.7149069359522906, + -2.839988416391003 + ], + "(10, 4, 7, 4, 4)": [ + -1.2828398941056725, + -1.396762914198098, + -1.41411463353194 + ], + "(9, 3, 6, 4, 4)": [ + -1.1236532204362129, + -1.226288302318796, + -1.3067228719696486 + ], + "(10, 5, 5, 3, 4)": [ + -1.6594194123621098, + -1.3555269127357092, + -1.3473592724094603 + ], + "(9, 6, 3, 3, 4)": [ + -1.6894589045333843, + -1.6153955202121717, + -1.1375211809993813 + ], + "(9, 6, 2, 2, 4)": [ + -2.220563779717446, + -2.0490680182846734, + -1.6986852190928365 + ], + "(8, 2, 0, 3, 5)": [ + 0.0, + 0.0, + -3.993713455353194 + ], + "(10, 6, 0, 4, 5)": [ + -2.464719619264282, + -2.9733765540497865, + -3.004087170044099 + ], + "(7, 7, 0, 3, 4)": [ + -6.849615136847243, + -4.579714170856572, + 0.0 + ], + "(10, 6, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 6, 5, 4)": [ + -1.344177597995127, + -1.61817965922486, + -1.6594213380682508 + ], + "(10, 5, 7, 5, 5)": [ + -1.5598811597492697, + -1.477117051226417, + -1.6312521903722363 + ], + "(8, 6, 7, 5, 5)": [ + -1.4554573283147596, + -1.3086764575102123, + -1.577722953087417 + ], + "(10, 4, 8, 6, 5)": [ + -1.8453159152819505, + -1.9417165990848835, + -1.959228732234409 + ], + "(9, 3, 8, 5, 4)": [ + -1.342273694553538, + -1.843848489051833, + -1.9450033381708327 + ], + "(7, 6, 9, 7, 5)": [ + -2.235477877659786, + -2.1530346837432153, + -1.9614305274473947 + ], + "(10, 5, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 2, 3, 4)": [ + -1.926605163380159, + -1.703370013737355, + -1.396704744016899 + ], + "(9, 3, 3, 3, 4)": [ + -1.8094128149527489, + -1.6529201399372877, + -1.548429582487335 + ], + "(10, 5, 2, 2, 4)": [ + -2.1181424747715316, + -1.943039237770002, + -1.7112048821608652 + ], + "(10, 5, 6, 4, 4)": [ + -1.1629001917747377, + -1.3099575662377902, + -1.2680907690958187 + ], + "(8, 6, 5, 3, 4)": [ + -1.5879294232395347, + -1.1861373650269584, + -0.7814928004858813 + ], + "(9, 4, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 7, 5, 4)": [ + -1.4612096637113194, + -1.3361114907186258, + -1.4594797256577023 + ], + "(9, 6, 7, 4, 4)": [ + -1.4405919098380404, + -1.3231070675304526, + -1.3901770666012985 + ], + "(10, 4, 7, 5, 4)": [ + -1.270814175531846, + -1.377974853928984, + -1.423669599326038 + ], + "(10, 5, 7, 4, 4)": [ + -1.2559201297448779, + -1.343965302881337, + -1.37355105787108 + ], + "(9, 6, 6, 4, 4)": [ + -1.3154878108890582, + -1.2840093318971155, + -1.3104540968168457 + ], + "(9, 6, 5, 4, 4)": [ + -1.5074082959581956, + -1.1479082566324936, + -1.4455316269885328 + ], + "(10, 5, 4, 3, 4)": [ + -1.7198080964829987, + -1.5213180479701212, + -1.2991801007345358 + ], + "(7, 3, 1, 2, 4)": [ + -1.9590700580057079, + -2.7167469181197244, + -2.322855038891815 + ], + "(9, 5, 0, 2, 4)": [ + -1.999062830995481, + -2.12507747549379, + -1.9600388235040747 + ], + "(6, 6, 0, 2, 4)": [ + -1.8409434573854393, + -2.161033437340907, + -1.9955768238878047 + ], + "(9, 4, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 1, 4, 4)": [ + -2.2323995156530057, + -2.4320924694789534, + -2.1028647608905766 + ], + "(10, 4, 0, 4, 4)": [ + -2.530071232937104, + -2.4755049563409486, + -2.4142470319496288 + ], + "(9, 3, 0, 4, 4)": [ + -2.2885960218771397, + -2.6073964413516344, + -2.4574586849344278 + ], + "(9, 3, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 4, 5, 4)": [ + -1.5458960831336925, + -1.6154487676818687, + -1.8458799220216955 + ], + "(9, 3, 2, 5, 4)": [ + -1.7031223332385164, + -1.6241082273102572, + -1.4543366353129774 + ], + "(8, 3, 2, 4, 4)": [ + -1.7060729888912416, + -1.8090174779491432, + -1.586132204612682 + ], + "(9, 4, 1, 3, 4)": [ + -1.5868689324670717, + -1.4695123346802, + -1.2944217128473081 + ], + "(9, 5, 0, 3, 4)": [ + -2.0221300373912703, + -1.9411703679881154, + -1.8527910547455495 + ], + "(9, 4, 0, 3, 4)": [ + -2.0616569660177153, + -2.0581041638917563, + -1.7937746264073031 + ], + "(6, 3, 0, 2, 4)": [ + -2.1368658959987767, + -2.1263111830598955, + -2.207680368395933 + ], + "(9, 4, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 5, 5, 4)": [ + -1.2291157407056992, + -0.9878425463132211, + -1.19549854677636 + ], + "(9, 6, 5, 5, 4)": [ + -1.281959076237617, + -1.3089037595426938, + -1.4525021242880738 + ], + "(10, 5, 4, 4, 4)": [ + -1.618186236566978, + -1.4635359099134009, + -1.311517744515398 + ], + "(8, 3, 1, 2, 4)": [ + -2.4228999843281627, + -2.289685102538681, + -2.0381910299346013 + ], + "(9, 4, 1, 2, 4)": [ + -1.7257357626952237, + -1.661508952475887, + -1.5888939041000791 + ], + "(7, 6, 0, 2, 4)": [ + -2.1757304074448323, + -2.108950413522206, + -2.0673851886982124 + ], + "(9, 5, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 9, 7, 5)": [ + -2.6891178918693166, + -2.5942444893310963, + -2.586318284630508 + ], + "(8, 6, 9, 8, 5)": [ + -2.2929481594094625, + -1.87794428335087, + -2.7761160500783704 + ], + "(8, 6, 5, 5, 5)": [ + -1.2696886765738986, + -0.9515493171614139, + -1.2146941063359094 + ], + "(9, 6, 6, 5, 5)": [ + -1.439836977317648, + -1.5518381560702061, + -1.57964376226052 + ], + "(9, 3, 6, 5, 4)": [ + -1.2141313907743772, + -1.4189379047343234, + -1.4890812204578618 + ], + "(7, 6, 8, 5, 4)": [ + -1.4699257618623682, + -1.7135260071324048, + -1.7980171454409246 + ], + "(9, 5, 8, 5, 5)": [ + -1.2204482488041648, + -1.2585686511614105, + -1.3111144081140835 + ], + "(9, 4, 8, 6, 5)": [ + -1.1960866070439073, + -1.4040956999499203, + -1.5221589138177671 + ], + "(7, 3, 9, 6, 5)": [ + -1.980707575378016, + -2.1502942248843055, + -2.3251626873994864 + ], + "(9, 4, 9, 6, 5)": [ + -1.7440373008943293, + -1.9260618149066908, + -2.0505490086596416 + ], + "(9, 5, 9, 6, 5)": [ + -1.6434155860094586, + -1.9464591233574433, + -1.8946970434912043 + ], + "(9, 6, 7, 5, 5)": [ + -1.3578474640942715, + -1.7374667247374722, + -1.768591457493224 + ], + "(8, 3, 7, 5, 5)": [ + -1.0725106632500894, + -1.2219998917918222, + -1.4151328036953392 + ], + "(7, 6, 5, 3, 4)": [ + -1.6041818532965286, + -1.2408453821634058, + -1.1462211317723894 + ], + "(9, 6, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 0, 5, 5)": [ + -2.357756045561149, + -1.9716274252246255, + -1.3762434772453764 + ], + "(10, 5, 0, 4, 4)": [ + -2.3659007606391493, + -2.1831475719532056, + -2.3633803437528615 + ], + "(10, 3, 0, 5, 5)": [ + -3.094902989053698, + -2.4450067956455417, + -3.0712884547308996 + ], + "(6, 6, 0, 4, 4)": [ + -2.640403025884778, + -2.7183293929066576, + -2.0729258067409817 + ], + "(10, 4, 1, 6, 5)": [ + -1.6285543872478325, + -1.7226687064083337, + -1.4737009803134598 + ], + "(9, 3, 1, 7, 5)": [ + -1.4325714034975479, + -1.391103382223188, + -1.5648136506070272 + ], + "(9, 3, 2, 6, 5)": [ + -1.2959092173294695, + -1.3826910433018758, + -1.430742607348543 + ], + "(10, 4, 3, 6, 5)": [ + -1.3874592278012774, + -1.2562533615321916, + -1.4339522973070107 + ], + "(9, 6, 5, 7, 5)": [ + -2.403812980080899, + -1.9236366339692605, + -1.7299029416930258 + ], + "(9, 5, 8, 7, 5)": [ + -1.340329554940067, + -1.7497657058541483, + -1.7984653111596711 + ], + "(9, 5, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 0, 5, 5)": [ + -2.0603270748848512, + -1.8576797287715938, + -1.8497973301940231 + ], + "(10, 5, 1, 5, 5)": [ + -1.783027904870685, + -1.5659513705969508, + -1.3627515918590436 + ], + "(10, 4, 1, 5, 4)": [ + -1.9293152879208424, + -1.6672940925757633, + -1.852114755700237 + ], + "(7, 6, 1, 4, 4)": [ + -1.6209109574184102, + -1.5489356473552423, + -1.1599953742267166 + ], + "(8, 3, 0, 4, 4)": [ + -2.1281750448029, + -2.646639034226348, + -2.3316502860409782 + ], + "(9, 5, 0, 6, 5)": [ + -1.6835115712993312, + -1.3732651701242644, + -1.0711067831192913 + ], + "(6, 6, 0, 6, 5)": [ + -3.863739912589903, + -2.1192365454769604, + -1.3662797189647196 + ], + "(6, 3, 1, 7, 5)": [ + -1.0396179529598468, + -1.3607022484630338, + -1.3171315983408767 + ], + "(9, 4, 3, 7, 5)": [ + -0.6657856431768152, + -0.934009905017706, + -1.2751089188654394 + ], + "(9, 5, 5, 7, 5)": [ + -1.0221425887923825, + -1.071162495109816, + -1.2762717564536288 + ], + "(7, 6, 7, 7, 5)": [ + -1.5204661452381099, + -1.9721561142759136, + -1.8227475079629059 + ], + "(9, 5, 8, 6, 4)": [ + -3.1507314782289653, + -1.6245134429973789, + -1.8747493195653482 + ], + "(9, 4, 8, 7, 5)": [ + -1.335480841821665, + -1.558250267907377, + -1.6822420276065924 + ], + "(8, 3, 9, 6, 4)": [ + -2.421014016799567, + -2.1427504599367357, + -2.8020110022343543 + ], + "(9, 5, 9, 7, 5)": [ + -2.017259970685351, + -2.0616970454315275, + -1.890765284672179 + ], + "(8, 6, 9, 6, 4)": [ + -2.880417784990772, + -2.2571450977093255, + -2.837114160056764 + ], + "(8, 6, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 9, 4, 4)": [ + -1.8980420551502517, + -2.281656506685831, + -2.3785673413974964 + ], + "(9, 6, 9, 3, 4)": [ + -2.0319891739454983, + -2.024568156803446, + -2.0882402009082046 + ], + "(8, 6, 9, 2, 4)": [ + -1.928300481620839, + -2.5608177531042338, + -2.8146029077677297 + ], + "(10, 5, 8, 2, 4)": [ + -1.4646795845505558, + -2.076489235263065, + -2.7522887207117375 + ], + "(10, 3, 7, 2, 4)": [ + -1.6757179229558037, + -3.8955930806480246, + -2.6962696431984976 + ], + "(7, 3, 4, 2, 4)": [ + -2.737896646611918, + -2.204212798631999, + -1.2719675983717273 + ], + "(10, 4, 0, 3, 5)": [ + -2.611889163312917, + -2.3289195899525432, + -3.0710338997158506 + ], + "(8, 3, 0, 3, 5)": [ + -2.0362866942144047, + -3.408108529823798, + -3.2421720177883375 + ], + "(10, 3, 3, 4, 4)": [ + -1.8187536481128936, + -1.7223184089286767, + -1.607047573341368 + ], + "(8, 6, 2, 3, 4)": [ + -1.9641495855857405, + -1.8014780275001385, + -1.4414363090787623 + ], + "(9, 3, 2, 5, 5)": [ + -1.636318035858868, + -1.4564444490805997, + -1.680909428667017 + ], + "(10, 4, 2, 5, 5)": [ + -1.605151261894316, + -1.528106975721366, + -1.4010209037178594 + ], + "(9, 6, 2, 5, 4)": [ + -1.9486647758021267, + -1.4078707840268447, + -1.5872627431630728 + ], + "(10, 5, 2, 5, 4)": [ + -1.8471441841092475, + -1.7963682613927516, + -1.4913610957251184 + ], + "(8, 3, 2, 5, 5)": [ + -1.4860256759829467, + -1.0616002791774994, + -1.4060704906177095 + ], + "(10, 4, 4, 6, 5)": [ + -1.2569928306451523, + -1.4416984420916947, + -1.7594146057666804 + ], + "(10, 6, 5, 6, 5)": [ + -2.8496149288127737, + -1.7126787086803104, + -2.822978976490662 + ], + "(6, 6, 7, 6, 5)": [ + -1.7281461049111906, + -1.326132249771503, + -1.6198060331511415 + ], + "(10, 6, 7, 5, 4)": [ + -2.0263111008317343, + -1.6808264587194846, + -2.8923376890642896 + ], + "(10, 4, 8, 5, 4)": [ + -1.4833865843933824, + -1.7912612006718056, + -1.773120691188339 + ], + "(7, 3, 8, 6, 5)": [ + -1.482782072095136, + -1.6507987640886017, + -2.1495708103561104 + ], + "(10, 5, 9, 6, 5)": [ + -2.291581378566602, + -2.558285242832578, + -2.467366177595472 + ], + "(9, 3, 8, 4, 4)": [ + -1.239995632359363, + -1.7570514267620778, + -1.7950821159048314 + ], + "(9, 7, 8, 3, 4)": [ + 0.0, + -2.759970455529268, + 0.0 + ], + "(10, 5, 7, 3, 4)": [ + -1.3923825915037895, + -1.201463047942627, + -1.477167634474316 + ], + "(10, 3, 6, 3, 4)": [ + -1.96426683976456, + -1.4640782126227103, + -2.613975924248084 + ], + "(10, 6, 1, 2, 4)": [ + -3.3314036406008634, + -3.383725401517387, + -2.5528172087999317 + ], + "(8, 2, 2, 4, 4)": [ + -2.363446367885195, + -2.1596425284263536, + -2.306128779625795 + ], + "(8, 3, 1, 4, 4)": [ + -1.9905370574685057, + -1.8982483676727349, + -1.4558612985104036 + ], + "(10, 6, 2, 5, 5)": [ + -1.940444155572136, + -1.5741949841168739, + -1.3316631028399544 + ], + "(6, 6, 2, 5, 5)": [ + -1.1342048740922226, + -1.011235408313261, + -0.8686164297779841 + ], + "(10, 5, 3, 6, 5)": [ + -1.2642723290237246, + -1.2855602858706714, + -1.5918802147704847 + ], + "(10, 4, 5, 6, 5)": [ + -1.2522616664196988, + -1.4367225475450915, + -1.5395115368631398 + ], + "(6, 3, 7, 7, 5)": [ + -1.2232375636604806, + -2.327650453439753, + -2.593050659172742 + ], + "(9, 6, 9, 4, 4)": [ + -1.917816394576875, + -2.1230662668655778, + -2.318659421432424 + ], + "(8, 3, 9, 5, 4)": [ + -1.7550683997671508, + -2.1414509220465083, + -2.14665802308778 + ], + "(10, 4, 8, 5, 5)": [ + -1.5101290640711749, + -1.8213878841240154, + -1.925244842089953 + ], + "(9, 3, 8, 5, 5)": [ + -1.3705688836991776, + -1.5871293040755476, + -1.726490645779535 + ], + "(9, 3, 8, 6, 5)": [ + -1.4978748422884864, + -1.8207150767997797, + -2.1082413141043865 + ], + "(9, 6, 9, 5, 5)": [ + -2.261293184533489, + -2.4346161165644933, + -2.5872605857102107 + ], + "(8, 6, 9, 6, 5)": [ + -2.45199262674004, + -2.5149905083564663, + -2.2097044960989334 + ], + "(9, 4, 9, 5, 4)": [ + -1.4214538458376977, + -1.7669416151804034, + -1.8238332800746149 + ], + "(6, 3, 9, 4, 4)": [ + -1.5052065922852096, + -2.0501747330894458, + -2.1649332214770047 + ], + "(7, 6, 9, 5, 5)": [ + -2.1993276293997996, + -2.3966333866278906, + -2.4008829878733042 + ], + "(9, 4, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 3, 4, 5)": [ + -2.2129789530961457, + -1.4295025766926572, + -2.1390242164120212 + ], + "(8, 2, 3, 5, 5)": [ + -2.0492292250487814, + -1.98677723911433, + -2.0096945924294967 + ], + "(10, 5, 2, 4, 5)": [ + -1.8727469651338506, + -1.650026892668404, + -1.3850648684681106 + ], + "(6, 3, 0, 4, 4)": [ + -1.9760627844197152, + -2.323341063067829, + -2.1739042614939406 + ], + "(9, 5, 0, 5, 5)": [ + -1.7815885454854266, + -1.5529058992855738, + -1.3225053994892457 + ], + "(9, 6, 0, 5, 4)": [ + -4.799957347683901, + -1.9401707595985627, + -4.3476466818506605 + ], + "(10, 5, 0, 5, 4)": [ + 0.0, + -2.36942783656034, + 0.0 + ], + "(9, 3, 0, 5, 4)": [ + 0.0, + 0.0, + -2.378533653663406 + ], + "(10, 5, 1, 6, 5)": [ + -1.575853743273415, + -1.4556488724021925, + -1.4146988240608813 + ], + "(9, 4, 2, 7, 5)": [ + -0.920441132352799, + -1.018499079191452, + -0.7139239218538909 + ], + "(7, 3, 5, 7, 5)": [ + -1.8469436109519546, + -1.2582643280358994, + -1.9577313672832166 + ], + "(10, 4, 8, 8, 5)": [ + -2.3619517264877476, + -2.9068291033776186, + -3.6398720812545826 + ], + "(9, 5, 9, 8, 5)": [ + -1.9038546464153734, + -1.7889048919617643, + -1.820754782032823 + ], + "(9, 4, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 6, 5, 4)": [ + -1.1952454046027363, + -0.924285911013688, + -1.2581423803836889 + ], + "(8, 6, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 6, 5, 4)": [ + -1.3808912495627035, + -1.4794119510489683, + -1.4722503334507238 + ], + "(10, 4, 3, 3, 4)": [ + -1.816055884591733, + -1.479648386546371, + -1.6356497726354755 + ], + "(10, 4, 2, 4, 4)": [ + -1.730739073293239, + -1.6944357409244952, + -1.4781976101952772 + ], + "(8, 3, 1, 5, 5)": [ + -1.6448302127836552, + -1.6716943195816227, + -1.6225944082016783 + ], + "(10, 6, 2, 5, 4)": [ + -1.8856494396747547, + 0.0, + -2.792582585308378 + ], + "(10, 5, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 2, 3, 4)": [ + -1.890584290893623, + -1.716287460243993, + -1.510585808177864 + ], + "(8, 6, 1, 4, 4)": [ + -1.8579789368725472, + -1.5124366723096259, + -1.2070543339493076 + ], + "(6, 3, 5, 7, 5)": [ + -1.1295857477312299, + -3.4727355214040783, + -2.646548460612596 + ], + "(7, 6, 8, 6, 5)": [ + -1.4720378219730912, + -1.8696453626610239, + -1.7755502909395688 + ], + "(8, 3, 9, 7, 5)": [ + -2.1826191698697257, + -1.8721610493435241, + -2.2857875197601363 + ], + "(10, 5, 9, 6, 4)": [ + -2.636963303671472, + -2.455965576752533, + -2.6453320654586525 + ], + "(8, 6, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 8, 5, 5)": [ + -1.849644868860443, + -1.939716261621982, + -2.215647229692537 + ], + "(10, 3, 2, 5, 5)": [ + -1.9325076434055752, + -1.8568316086936083, + -1.5685674112534511 + ], + "(9, 7, 2, 4, 4)": [ + -5.3447198360026, + -3.0176916405696392, + -3.7184081187610167 + ], + "(9, 3, 3, 6, 5)": [ + -1.0829687949904214, + -1.2052499534467584, + -1.4444445275596327 + ], + "(9, 3, 5, 6, 5)": [ + -1.4358294919090586, + -1.3393542665767242, + -1.6581577420693516 + ], + "(8, 3, 8, 6, 5)": [ + -1.5419617655880216, + -1.6976388883702906, + -1.8738955672885942 + ], + "(10, 3, 8, 4, 4)": [ + -1.4886942296669803, + -2.328547479558885, + -1.9421057247298124 + ], + "(6, 3, 7, 3, 4)": [ + -1.4418646614491542, + -0.7869909888881033, + -1.2504759391764255 + ], + "(10, 4, 6, 3, 4)": [ + -1.5034754401854629, + -1.2063105032012302, + -1.5026982618577172 + ], + "(7, 6, 2, 2, 4)": [ + -2.171517620703933, + -2.1586180767595415, + -1.40202030002415 + ], + "(9, 6, 0, 3, 5)": [ + -2.4161571465507303, + -2.552929781247615, + -2.6324156986811933 + ], + "(9, 3, 1, 6, 5)": [ + -1.5125722727153776, + -1.5589929887961351, + -1.5719560731711082 + ], + "(8, 6, 2, 5, 5)": [ + -1.3248988988815829, + -1.1542864836062452, + -0.8894767893650227 + ], + "(9, 4, 4, 5, 5)": [ + -0.7438731903094264, + -0.7023990522829013, + -0.5269999455544738 + ], + "(6, 3, 4, 4, 4)": [ + -0.9546156400902509, + -0.9553003644158242, + -0.770470560617024 + ], + "(9, 4, 4, 4, 4)": [ + -0.8500526752645585, + -0.761402443278049, + -0.5814627649633353 + ], + "(9, 5, 3, 4, 4)": [ + -1.074053050084472, + -0.8677936090119003, + -0.5977777957404873 + ], + "(6, 6, 3, 4, 4)": [ + -1.1032473943690162, + -1.0456479468248645, + -0.8845662284907435 + ], + "(9, 5, 2, 4, 4)": [ + -1.211703776952878, + -1.085655912762366, + -0.8745748157676706 + ], + "(9, 4, 2, 4, 4)": [ + -1.1790707360838235, + -1.1047403716965807, + -0.8954824801547889 + ], + "(8, 3, 2, 4, 5)": [ + -1.853541096853061, + -1.7600576060324196, + -1.4422705988123803 + ], + "(9, 4, 2, 4, 5)": [ + -1.3086248768642708, + -1.0490558296698542, + -0.8403857636148595 + ], + "(9, 5, 2, 4, 5)": [ + -1.1182570669183787, + -1.0139482731278247, + -0.8002760282513879 + ], + "(9, 6, 1, 4, 5)": [ + -2.1670519283642857, + -2.0088105541134005, + -1.6730604344657194 + ], + "(8, 6, 1, 5, 5)": [ + -1.557330400021279, + -1.3815801616968217, + -1.2149065883718788 + ], + "(7, 3, 2, 6, 5)": [ + -0.8438909685195464, + -1.246867840185912, + -1.256603809046345 + ], + "(9, 4, 3, 5, 5)": [ + -0.7995707709836202, + -0.6825901153386262, + -0.49264563679421725 + ], + "(9, 5, 4, 5, 5)": [ + -0.80606360505079, + -0.7578603537423892, + -0.6693447891764523 + ], + "(6, 6, 4, 5, 5)": [ + -0.7564963873008225, + -0.8659648852109679, + -0.8840065441871054 + ], + "(9, 5, 4, 4, 4)": [ + -0.7518062473693816, + -0.6964581809742945, + -0.5143232387976454 + ], + "(6, 3, 5, 5, 5)": [ + -0.5823590117135554, + -0.7461948051307419, + -1.004381035837029 + ], + "(9, 4, 7, 6, 5)": [ + -0.8840005140694576, + -1.204453682326272, + -1.453018055415068 + ], + "(10, 3, 9, 5, 4)": [ + -2.552425396563603, + -2.775429928241252, + -2.287245433420268 + ], + "(10, 5, 9, 4, 4)": [ + -1.855149458402978, + -2.1816937530274036, + -2.4538389899970774 + ], + "(6, 6, 9, 4, 4)": [ + -1.6857515502687568, + -1.9586731269898148, + -2.1055571776034814 + ], + "(8, 3, 9, 3, 4)": [ + -2.2596042705615247, + -1.6298988834053716, + -1.8124175438262053 + ], + "(9, 3, 9, 3, 4)": [ + -1.7717235954530532, + -1.8573707949413454, + -2.090198486077683 + ], + "(10, 5, 9, 3, 4)": [ + -1.7775618809294733, + -2.034973815041058, + -2.0347870142955617 + ], + "(8, 6, 8, 4, 5)": [ + -3.1375181637670266, + 0.0, + -1.6890555320311345 + ], + "(9, 5, 8, 4, 4)": [ + -0.884960626387038, + -1.01481770538696, + -1.1923675398891354 + ], + "(7, 3, 8, 4, 4)": [ + -1.335765566272856, + -1.0824468865498402, + -1.5000832962009032 + ], + "(9, 5, 7, 3, 4)": [ + -0.8379410727530197, + -0.7656320271612576, + -0.8465308764620186 + ], + "(9, 5, 3, 2, 4)": [ + -1.4426913119978741, + -1.299436852929986, + -0.8998570495081942 + ], + "(6, 3, 1, 2, 4)": [ + -2.2563954168004363, + -2.093529357866002, + -1.8350838025569454 + ], + "(9, 4, 0, 2, 4)": [ + -1.773205621540337, + -1.9138499752900648, + -2.033391638879789 + ], + "(9, 5, 0, 3, 5)": [ + -1.9132683167801545, + -1.9688879760525948, + -1.7556384456055003 + ], + "(8, 6, 0, 3, 5)": [ + -3.0118740203236047, + -2.837563994309472, + -2.0640428896456346 + ], + "(9, 5, 0, 4, 4)": [ + -2.0306240131181497, + -1.9068778406387568, + -1.67984552002607 + ], + "(6, 3, 0, 3, 4)": [ + -1.976022170954814, + -2.346188527188942, + -2.229196244659775 + ], + "(7, 6, 0, 4, 5)": [ + -2.068930169030546, + -2.179556788579592, + -1.7813412981648433 + ], + "(8, 3, 0, 4, 5)": [ + -2.2535960057884727, + -2.05748256769371, + -2.2183529782972284 + ], + "(8, 4, 0, 4, 5)": [ + -1.5555045935779481, + -1.5627910975155297, + -1.3637883747892403 + ], + "(8, 5, 0, 4, 5)": [ + -1.6422085709967815, + -1.5474692248688826, + -1.3304251179840998 + ], + "(9, 5, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 4, 3, 4)": [ + -3.7474102362743307, + -2.2801679981912844, + -4.067727657206254 + ], + "(8, 6, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 0, 5, 5)": [ + -2.003095238519991, + -1.9193407552973758, + -1.3415454440382213 + ], + "(9, 5, 1, 6, 5)": [ + -1.0181472211925198, + -0.9140246919025485, + -1.1222532040471056 + ], + "(9, 4, 1, 6, 5)": [ + -0.9543098137573415, + -0.8438790729948207, + -1.0303212184409034 + ], + "(9, 4, 1, 5, 5)": [ + -1.1393957184884471, + -1.1914428406001707, + -1.0443224979740453 + ], + "(9, 5, 2, 6, 5)": [ + -0.8644955088917631, + -0.680057439151986, + -0.8380108169281646 + ], + "(6, 6, 3, 5, 4)": [ + -1.1044085316513754, + -2.0237452130862734, + -1.4166552428406138 + ], + "(9, 5, 3, 5, 4)": [ + -1.0228504377115177, + -0.8180084597504697, + -0.5413896308340267 + ], + "(7, 3, 2, 4, 4)": [ + -1.4446769500562167, + -1.2760614915888753, + -1.283807327714919 + ], + "(9, 4, 2, 5, 4)": [ + -1.409989320391361, + -0.9786774169946206, + -0.74196159089707 + ], + "(9, 5, 2, 5, 5)": [ + -1.0327319310623309, + -0.8649606684123513, + -0.749336160496806 + ], + "(8, 6, 2, 5, 4)": [ + -2.311488821858824, + -2.1232614122637052, + -0.9254564165272484 + ], + "(9, 6, 3, 5, 5)": [ + -1.4327391697661964, + -1.3298516102873785, + -1.1751132783581912 + ], + "(8, 4, 4, 5, 4)": [ + -0.411367550703472, + -0.3873531434869068, + -0.5519568096388782 + ], + "(9, 4, 4, 5, 4)": [ + -0.6905091419546432, + -0.5767294536789904, + -0.7298475868639482 + ], + "(9, 5, 4, 5, 4)": [ + -0.6936180464568257, + -0.5843689066868187, + -0.7114299944003846 + ], + "(7, 6, 4, 4, 4)": [ + -1.1534787736174068, + -0.92645137903088, + -0.6395708417622635 + ], + "(7, 3, 2, 5, 5)": [ + -0.9211447489929296, + -1.1542258944747517, + -1.2539896487179618 + ], + "(9, 5, 1, 4, 4)": [ + -1.4568756416484605, + -1.3544749809721537, + -1.0555956991083681 + ], + "(6, 6, 1, 4, 4)": [ + -1.8021155624733032, + -1.4630394476506585, + -1.1232016485040621 + ], + "(7, 3, 0, 2, 4)": [ + -2.0339460673395187, + -2.233994960367901, + -2.3658275465895127 + ], + "(8, 4, 0, 2, 4)": [ + -1.678306880573079, + -1.8666338122245238, + -1.839994641081812 + ], + "(8, 5, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 3, 5, 5, 4)": [ + -1.408655388923413, + -1.4998793619708022, + -1.607311779189667 + ], + "(8, 6, 3, 4, 4)": [ + -1.6024406551509558, + -1.337312023282676, + -1.1088126150169892 + ], + "(8, 3, 4, 5, 4)": [ + -1.1016636249992806, + -1.4200526120622115, + -1.5959348324619524 + ], + "(10, 3, 4, 5, 4)": [ + -1.714553745515882, + -1.704507483107967, + -1.7572322844878336 + ], + "(10, 5, 4, 5, 4)": [ + -1.5550019171520355, + -1.4811416782664566, + -1.4018669608040206 + ], + "(9, 6, 3, 5, 4)": [ + -1.5952388745908803, + -1.662523574874836, + -1.2578354003012602 + ], + "(9, 3, 7, 7, 5)": [ + -1.481407362061976, + -1.9595018994432296, + -2.1841132786148703 + ], + "(7, 3, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 1, 7, 5)": [ + -1.8073611183057294, + -1.409056247585692, + -1.8083704660729376 + ], + "(10, 4, 2, 5, 4)": [ + -1.930056474312514, + -1.325139547874776, + -1.6525462130178337 + ], + "(8, 3, 3, 5, 4)": [ + -1.5499990841055689, + -0.9301692431369251, + -1.9010866611529267 + ], + "(9, 3, 4, 5, 4)": [ + -1.4668274626653781, + -1.5443132178419565, + -1.5546993312971016 + ], + "(10, 5, 5, 6, 5)": [ + -1.5513641986777844, + -1.3377678549827485, + -1.5929085101888356 + ], + "(9, 6, 7, 6, 5)": [ + -1.5866248928737365, + -1.7861756588053983, + -1.8538549215273 + ], + "(7, 6, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 9, 4, 4)": [ + -1.3937333711528175, + -2.045977828809088, + -2.246863227810381 + ], + "(10, 4, 9, 3, 4)": [ + -1.7429173438603691, + -2.4400376733054383, + -2.785950506391143 + ], + "(9, 6, 8, 2, 4)": [ + -1.4374003294515167, + -1.7817800443690222, + -1.5737231625668988 + ], + "(8, 6, 8, 3, 4)": [ + -1.3662047791588532, + -1.0803324004723056, + -1.2489902263601294 + ], + "(9, 4, 6, 3, 4)": [ + -0.999663658509288, + -0.8307347920842607, + -0.8475243349503258 + ], + "(6, 3, 5, 4, 5)": [ + -2.2877287931933985, + -0.6747951950400435, + -2.5697127916103155 + ], + "(6, 6, 3, 3, 4)": [ + -2.683563677068558, + -1.1112123141894612, + -1.0108180174352264 + ], + "(10, 6, 2, 3, 4)": [ + -2.2857861157347372, + -2.698811452693511, + -2.2676015185131493 + ], + "(10, 4, 1, 7, 5)": [ + -1.6097170608706708, + -1.5990168801612572, + -1.2647244794219406 + ], + "(9, 6, 2, 6, 5)": [ + -1.2572641929664599, + -1.3698797550884876, + -1.4046811294011103 + ], + "(10, 5, 5, 7, 5)": [ + -1.5161885037168985, + -1.8094941866267968, + -1.9467954348965342 + ], + "(10, 5, 9, 8, 5)": [ + -2.318055085455417, + -2.084385410731922, + -2.383757515187744 + ], + "(7, 6, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 8, 4, 4)": [ + -1.0160990089949282, + -1.334860979425821, + -1.4824559785631422 + ], + "(7, 6, 8, 5, 5)": [ + -1.6044097952071863, + -1.5454419858179191, + -1.559254075353481 + ], + "(9, 4, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 7, 5, 4)": [ + -2.205810087192157, + -2.302261771908304, + -3.331512323012908 + ], + "(9, 3, 5, 3, 4)": [ + -1.7563327166302771, + -1.5088867358309952, + -1.5186567757932525 + ], + "(9, 3, 3, 2, 4)": [ + -2.987175652374871, + -2.2184117717627543, + -1.6367435072406478 + ], + "(9, 6, 2, 4, 5)": [ + -1.819225129462152, + -1.6684137071797904, + -1.1885247990241508 + ], + "(7, 6, 2, 4, 5)": [ + -1.6606999766056738, + -2.3055427478108537, + -0.8388489361882528 + ], + "(10, 3, 1, 4, 5)": [ + -2.6480356136664716, + -2.342486701198499, + -2.501640296180597 + ], + "(6, 3, 1, 4, 5)": [ + -1.624096279789917, + -1.695223224189767, + -1.4339595842406534 + ], + "(10, 5, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 4, 6, 5)": [ + -1.1255134071209885, + -1.0257197698220746, + -1.301611516426564 + ], + "(6, 3, 8, 6, 5)": [ + -1.2055855973164156, + -1.4485727891382028, + -1.767022169361629 + ], + "(10, 4, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 5, 3, 4)": [ + -1.8396819537674018, + -1.3078306633919106, + -1.3660203434830736 + ], + "(9, 5, 1, 4, 5)": [ + -1.3707197822563704, + -1.3283132252012464, + -1.0353507349503395 + ], + "(6, 6, 1, 4, 5)": [ + -1.6907412916221387, + -1.5197755513071072, + -1.1336528107493318 + ], + "(8, 3, 0, 3, 4)": [ + -2.339302079189858, + -2.0539730255551807, + -2.357719469262939 + ], + "(8, 3, 7, 4, 4)": [ + -1.0210310566538294, + -1.0518507403324628, + -1.1649124995300482 + ], + "(9, 4, 6, 4, 4)": [ + -0.9037142347887224, + -0.74586025180218, + -0.8035290265356427 + ], + "(9, 5, 5, 3, 4)": [ + -0.9661318996219183, + -0.7489308031158566, + -0.49061052981935677 + ], + "(9, 4, 5, 5, 5)": [ + -0.535441180922942, + -0.6340098549476778, + -0.7328218657915837 + ], + "(7, 3, 6, 6, 5)": [ + -0.8101873921305163, + -1.6236127085109826, + -1.7604068950226905 + ], + "(9, 4, 7, 5, 5)": [ + -0.7278850889352068, + -0.9808153820292572, + -1.1276733381436788 + ], + "(9, 5, 7, 5, 5)": [ + -0.8508005597224363, + -1.1309092974918538, + -1.1032476955559387 + ], + "(6, 6, 8, 6, 5)": [ + -1.5100391384571212, + -1.8304784649478234, + -1.7073571938902796 + ], + "(9, 5, 8, 6, 5)": [ + -1.1787085851535115, + -1.362022446489874, + -1.6627520990292879 + ], + "(7, 3, 7, 6, 5)": [ + -1.4977730204459345, + -1.6024255865994044, + -1.6854151744888415 + ], + "(9, 3, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 3, 5, 5)": [ + -1.4033898711567525, + -1.3390610880722718, + -1.271139094246587 + ], + "(9, 3, 3, 5, 5)": [ + -1.4418811752821865, + -1.3325994780897037, + -1.4185948519945835 + ], + "(10, 6, 6, 5, 5)": [ + -1.4995875736884685, + -2.79412667236656, + -1.926597563344266 + ], + "(7, 6, 7, 6, 5)": [ + -1.469275344923376, + -1.8386024284285998, + -2.146598605280895 + ], + "(6, 6, 8, 4, 4)": [ + -1.2691410423411758, + -1.0574791601867515, + -1.5835622035543897 + ], + "(10, 6, 8, 3, 4)": [ + -2.1743070270497893, + -2.692494047970392, + -3.3576978630797947 + ], + "(8, 6, 3, 2, 4)": [ + -2.7331782174139883, + -2.920527967209261, + -1.268930706954957 + ], + "(9, 3, 9, 4, 4)": [ + -1.7022907849773077, + -2.122845751896925, + -2.5695149196423293 + ], + "(9, 5, 9, 5, 5)": [ + -2.014765721558755, + -1.6407848787703676, + -1.952138053649741 + ], + "(6, 6, 9, 5, 5)": [ + -1.824024386284222, + -2.3219289258072395, + -3.2522251326479394 + ], + "(10, 5, 1, 4, 5)": [ + -2.032846311119629, + -1.8943717623512206, + -1.6677556959282362 + ], + "(9, 6, 5, 5, 5)": [ + -1.4257802292429116, + -1.46962860166713, + -1.3027650904897632 + ], + "(7, 3, 2, 3, 4)": [ + -1.9186101253398449, + -1.3796706893702582, + -1.1192069421890354 + ], + "(6, 6, 1, 2, 4)": [ + -2.2236077696820655, + -1.947983728875871, + -2.0186256905495785 + ], + "(9, 3, 7, 6, 5)": [ + -1.366719582199892, + -1.6609366783951602, + -1.811351529018644 + ], + "(8, 6, 2, 4, 5)": [ + -1.7754254198962718, + -1.3457491280370204, + -1.024581430881521 + ], + "(8, 6, 2, 2, 4)": [ + -2.0419333439667517, + -1.8471624915903284, + -1.6930671310083762 + ], + "(8, 3, 0, 6, 5)": [ + -2.6639070886157725, + -2.3025728383102586, + -1.6287776330497237 + ], + "(7, 3, 0, 4, 4)": [ + -2.6859870632049008, + -2.0455251140968818, + -2.763228508450003 + ], + "(9, 5, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 2, 2, 5, 5)": [ + -3.8005342334469097, + -4.122081425718667, + -4.266241111700526 + ], + "(10, 6, 3, 6, 5)": [ + -1.5046109748837735, + -2.8903301140570767, + -2.878313871779438 + ], + "(8, 7, 4, 5, 5)": [ + -2.1265381129716565, + -3.4799651432657637, + -4.171089807277941 + ], + "(7, 2, 2, 3, 4)": [ + 0.0, + -2.9335826821824202, + 0.0 + ], + "(9, 6, 7, 5, 4)": [ + -1.3963240016288156, + -1.475531607491893, + -1.5277013825031438 + ], + "(7, 3, 5, 3, 4)": [ + -1.114756702049074, + -1.0083284546034408, + -1.1368289470494775 + ], + "(10, 4, 4, 3, 4)": [ + -1.7220996020246668, + -1.4161806887173833, + -1.3049506963632227 + ], + "(6, 6, 2, 3, 4)": [ + -1.6444742769791374, + -1.368914209490647, + -0.9758367114475595 + ], + "(10, 4, 1, 4, 5)": [ + -2.238669314237455, + -1.9413304148528792, + -1.62002085478263 + ], + "(7, 3, 1, 4, 5)": [ + -1.8068811070168844, + -1.8872175626271992, + -1.3885669513410626 + ], + "(8, 3, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 4, 5, 5)": [ + -1.3053897274437882, + -1.002193756048162, + -1.0637331518284714 + ], + "(8, 3, 8, 7, 5)": [ + -1.3860422918151891, + -2.0468317358508674, + -2.12685244093098 + ], + "(10, 6, 9, 7, 5)": [ + -2.580278215808222, + -2.9812090980920543, + -2.386160043691281 + ], + "(10, 5, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 3, 4, 5)": [ + -1.8180639865130193, + -1.027090671830868, + -1.6221220478422567 + ], + "(10, 4, 2, 7, 5)": [ + -1.4085417975081627, + -1.5602990605731053, + -1.1597867435204743 + ], + "(9, 6, 4, 7, 5)": [ + -1.463536398745501, + -2.12145875018659, + -1.6484238744547461 + ], + "(8, 6, 6, 7, 5)": [ + -1.517713970610728, + -3.6197898632716337, + -3.4398045945234648 + ], + "(9, 6, 9, 6, 4)": [ + -2.863106918072109, + -2.619498769410653, + -2.1003936593357775 + ], + "(9, 3, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 8, 5, 4)": [ + -1.7876083350858791, + -1.9083620517936812, + -1.998862328677061 + ], + "(10, 3, 3, 5, 5)": [ + -1.9654836532017348, + -1.9283690991415305, + -1.7095067649987286 + ], + "(9, 6, 4, 5, 5)": [ + -1.4585060053596883, + -1.3550144008424265, + -1.211195614999197 + ], + "(7, 3, 1, 4, 4)": [ + -1.5381119137226678, + -1.4335248909574747, + -1.5587285296121889 + ], + "(9, 4, 0, 5, 4)": [ + -2.0187798062899183, + -1.0174955930538352, + -3.418479634202521 + ], + "(8, 6, 0, 5, 4)": [ + 0.0, + -2.115229985925012, + 0.0 + ], + "(8, 7, 8, 4, 4)": [ + -4.508859690063477, + -4.543809091052032, + -3.948083760331334 + ], + "(10, 4, 7, 3, 4)": [ + -1.562986600574987, + -1.336035015913984, + -1.5533735376224644 + ], + "(6, 6, 7, 4, 4)": [ + -0.9815454207708093, + -0.9147409566784834, + -1.049029061983892 + ], + "(10, 4, 3, 2, 4)": [ + -2.3093978617335664, + -1.7249217729455837, + -2.1430259432809935 + ], + "(10, 4, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 1, 4, 4)": [ + -1.5723854180930115, + -1.30672125040995, + -1.4776089911856893 + ], + "(6, 6, 0, 3, 4)": [ + -2.535932997407433, + -2.2409105065168617, + -1.9039985786326317 + ], + "(7, 3, 0, 4, 5)": [ + -2.281589723535353, + -2.0301304376136287, + -2.0909678146978066 + ], + "(9, 3, 0, 7, 5)": [ + -3.3317207596136647, + -1.647742006036056, + -1.901767189390762 + ], + "(8, 6, 1, 5, 4)": [ + -3.8263994571987165, + -2.6097694510594374, + -1.5173936056241533 + ], + "(8, 6, 1, 6, 5)": [ + -1.604457297391049, + -1.3435913304726708, + -0.9079591972878995 + ], + "(9, 5, 2, 7, 5)": [ + -0.9232610174859253, + -0.9153378999432891, + -0.8231258787679985 + ], + "(9, 4, 4, 7, 5)": [ + -0.7952789818452083, + -1.2859077908753116, + -1.0673146775754578 + ], + "(8, 3, 5, 6, 5)": [ + -0.9058952844625693, + -1.2874078642849212, + -1.5095752327931438 + ], + "(9, 5, 7, 6, 5)": [ + -0.9427087947778616, + -1.1215770348843053, + -1.3317084417964828 + ], + "(9, 5, 8, 5, 4)": [ + -1.1631452037570502, + -1.213923230145745, + -1.529751500159508 + ], + "(9, 5, 8, 3, 4)": [ + -1.11539568300944, + -0.824648718099336, + -0.9911770576625991 + ], + "(9, 4, 7, 4, 4)": [ + -0.6893556029952635, + -0.8987706482808407, + -1.0218971172025548 + ], + "(7, 3, 7, 3, 4)": [ + -0.908274949885045, + -1.0085421060194435, + -1.6523458933955306 + ], + "(9, 4, 4, 2, 4)": [ + -1.2728564219928968, + -1.1142691791995927, + -0.9622685778462636 + ], + "(9, 5, 2, 2, 4)": [ + -1.548471438380946, + -1.3729916647458067, + -1.0470099606363252 + ], + "(8, 5, 0, 2, 4)": [ + -1.8385795278050967, + -1.5123231618324844, + -1.8205078066054758 + ], + "(9, 4, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 2, 3, 5, 4)": [ + -2.1757405411875146, + -2.124470887001219, + -2.0075357920727197 + ], + "(10, 4, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 3, 5, 4)": [ + -1.7170511541505498, + -1.5268159031712984, + -1.3920646219344246 + ], + "(7, 3, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, 4, 6, 5)": [ + -1.4796893445818224, + -1.2209125226477169, + -1.4804446832304383 + ], + "(9, 6, 6, 7, 5)": [ + -1.7173436582132309, + -2.213288415140127, + -1.9963564299367111 + ], + "(9, 3, 9, 8, 5)": [ + -2.6541193763954047, + -1.877883945476445, + -2.7216438667464358 + ], + "(7, 3, 4, 5, 5)": [ + -0.9491175841236313, + -0.6745850059195734, + -0.9390754597541623 + ], + "(10, 3, 3, 4, 5)": [ + -2.100244340131006, + -3.3649896302592164, + -3.070538550307461 + ], + "(9, 3, 0, 3, 5)": [ + -2.13453939843447, + -2.4969997969558535, + -3.023234849739432 + ], + "(9, 3, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 2, 6, 5)": [ + -1.132068968809985, + -0.8740410449616162, + -1.6293828660398733 + ], + "(6, 3, 5, 6, 5)": [ + -0.7761481432024203, + -0.8982994022004442, + -1.2056426443799257 + ], + "(10, 3, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 0, 4, 5)": [ + -6.1508574269167475, + -5.699323240932445, + -6.152405568795755 + ], + "(7, 2, 0, 4, 5)": [ + -2.917760692163506, + -5.319115319549642, + -5.785273967505749 + ], + "(10, 6, 0, 3, 4)": [ + -3.1423991112781273, + -3.030473896885382, + -3.026213076156407 + ], + "(7, 3, 4, 5, 4)": [ + -1.6064459030576126, + -0.8235404789591735, + -1.5449361738541105 + ], + "(10, 5, 3, 4, 4)": [ + -1.6806473991651243, + -1.5613328181850736, + -1.3376844886357329 + ], + "(10, 3, 2, 3, 4)": [ + -2.3611637631422253, + -2.240231570946493, + -2.348977331888554 + ], + "(9, 6, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 1, 5, 4)": [ + -2.7973187091153315, + -1.6220481294856501, + -2.286531055693224 + ], + "(6, 6, 1, 5, 5)": [ + -1.4326320949628155, + -1.285641709031906, + -0.9977266353324545 + ], + "(9, 3, 4, 5, 5)": [ + -1.305414094257248, + -1.3938572582117637, + -1.384802848289195 + ], + "(8, 3, 8, 5, 4)": [ + -1.1562218621230214, + -1.372920116856605, + -1.6456500627186372 + ], + "(9, 4, 9, 5, 5)": [ + -1.634487909323005, + -1.942576821541788, + -1.8397524448562723 + ], + "(6, 3, 9, 5, 5)": [ + -1.8803316969339643, + -3.7014780425283815, + -2.5730391877897367 + ], + "(9, 5, 9, 4, 4)": [ + -1.6015346748315642, + -1.4269824796268507, + -1.6880803649391962 + ], + "(6, 6, 9, 3, 4)": [ + -1.519652674203138, + -1.867995156565021, + -2.288832333712739 + ], + "(9, 5, 8, 2, 4)": [ + -1.015694856391026, + -0.629141897332612, + -1.01040397078078 + ], + "(10, 4, 8, 3, 4)": [ + -1.54318309927836, + -1.6306123932762366, + -1.7186172968441344 + ], + "(8, 3, 6, 2, 4)": [ + -1.219627865435457, + -1.4846050453957704, + -2.563177386883991 + ], + "(9, 4, 3, 2, 4)": [ + -2.0418638459800773, + -1.4811422655190625, + -0.9937816035709524 + ], + "(9, 5, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 5, 5, 5, 4)": [ + -0.5181979969313402, + -0.722285296081439, + -0.7213158042414823 + ], + "(6, 6, 6, 5, 5)": [ + -1.1362471715240152, + -0.9301469214975855, + -1.0666499679754335 + ], + "(9, 5, 6, 5, 4)": [ + -0.6300410764680868, + -0.8197327183429288, + -0.8793001602498787 + ], + "(9, 6, 7, 7, 5)": [ + -2.148095027545461, + -1.8663866960070772, + -2.2405632026757742 + ], + "(6, 3, 9, 6, 5)": [ + -1.7707694692662879, + -2.129612596661315, + -2.395858616895832 + ], + "(7, 6, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 4, 5, 5)": [ + -1.624573492142239, + -1.7137432015559324, + -1.7217602151424698 + ], + "(9, 6, 6, 6, 5)": [ + -1.5414362675124984, + -1.4341324350615556, + -1.660794166327725 + ], + "(9, 3, 8, 7, 5)": [ + -1.6268437079880411, + -1.990946404073169, + -2.2312788169448323 + ], + "(10, 5, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 4, 4, 4)": [ + -2.5326574826010804, + -2.380977453015375, + -1.6542065115142037 + ], + "(10, 4, 9, 8, 5)": [ + -2.2329290688900305, + -2.3163597755257714, + -2.202799414067198 + ], + "(9, 3, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 4, 4, 5)": [ + -1.6623459607768236, + -1.9443664819521742, + -1.409743290058755 + ], + "(9, 5, 1, 7, 5)": [ + -1.1285924376243173, + -1.0028712949611907, + -0.9335276658111588 + ], + "(7, 3, 3, 7, 5)": [ + -0.8612470804373957, + -4.500290130380144, + -1.329824424702656 + ], + "(10, 5, 7, 7, 5)": [ + -1.5968522056058152, + -1.9104474896133006, + -2.2027491907028978 + ], + "(9, 4, 9, 8, 5)": [ + -1.9452799397132907, + -1.7123998381139574, + -1.973763012913968 + ], + "(8, 3, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 6, 6, 5)": [ + -1.2215968369366499, + -1.460297002428379, + -1.6647381582379228 + ], + "(9, 5, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 2, 5, 5, 5)": [ + -1.7562023966423337, + -1.9331354028637777, + -2.1700676640922114 + ], + "(10, 3, 6, 6, 5)": [ + -1.6889187534337573, + -1.9907425612401142, + -2.4036403943232636 + ], + "(9, 6, 6, 3, 4)": [ + -1.5612549573361039, + -1.4580605370289548, + -1.0129102383823578 + ], + "(10, 3, 5, 4, 4)": [ + -1.511912990970176, + -1.8207014049151822, + -1.883416473971225 + ], + "(7, 3, 4, 4, 4)": [ + -1.0754760155294145, + -0.7925082491093395, + -1.0448129200622502 + ], + "(6, 6, 2, 4, 4)": [ + -1.2084277423404477, + -1.2883237185097143, + -0.7694784934193293 + ], + "(10, 6, 2, 4, 4)": [ + -2.568459460142804, + -2.323525914443227, + -1.4523225105365887 + ], + "(10, 4, 6, 7, 5)": [ + -1.6532665708874892, + -2.688755716910486, + -2.185286837232741 + ], + "(8, 3, 7, 6, 5)": [ + -1.3543836020944664, + -1.442909891428818, + -1.7062191370870698 + ], + "(8, 5, 1, 3, 4)": [ + -1.380863694617818, + -1.2353408166116184, + -0.9995495141742662 + ], + "(7, 4, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 3, 5, 4)": [ + -1.9854492784545803, + -1.80851164970648, + -1.7284400699442817 + ], + "(9, 6, 4, 5, 4)": [ + -1.549266145546797, + -1.3721191020369923, + -1.2481808457965886 + ], + "(7, 6, 2, 4, 4)": [ + -1.442839163702142, + -1.1289573797749084, + -0.8337074279767189 + ], + "(7, 4, 0, 3, 4)": [ + -1.7307163075332024, + -1.647021646188791, + -1.9658259420959023 + ], + "(8, 4, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 3, 6, 6, 5)": [ + -1.2810801763044704, + -1.5056963480933616, + -1.8536608674216344 + ], + "(10, 6, 9, 5, 4)": [ + -2.4713717988894732, + -2.9650740956902037, + -2.710499916647271 + ], + "(10, 4, 8, 2, 4)": [ + -1.6847965219907466, + -1.3811040905623666, + -2.1726079091279553 + ], + "(9, 3, 2, 2, 4)": [ + -2.050609561947509, + -2.0570747250616743, + -2.155513903673104 + ], + "(9, 3, 1, 4, 5)": [ + -2.0240489915687676, + -1.8456049087544824, + -1.650438318969856 + ], + "(10, 4, 0, 6, 5)": [ + -2.366640389710417, + -2.114776318594827, + -1.7785388599740484 + ], + "(8, 6, 7, 7, 5)": [ + -1.5493408464089198, + -2.054256288944658, + -2.100646184670561 + ], + "(8, 3, 9, 8, 5)": [ + -2.13229863591452, + -2.28513709163442, + -2.624964230092633 + ], + "(9, 7, 8, 7, 5)": [ + -4.103909557861539, + -4.913464701105452, + -5.37625323545768 + ], + "(7, 6, 4, 6, 5)": [ + -0.7979178807669244, + -1.151238042386061, + -1.1393181866833728 + ], + "(8, 6, 9, 3, 4)": [ + -1.9422553697846499, + -2.212438955272213, + -2.3138568892723335 + ], + "(8, 4, 8, 3, 4)": [ + -0.5003701316216829, + -0.7521193588635318, + -0.7049761813095403 + ], + "(8, 5, 6, 3, 4)": [ + -0.518359171331739, + -0.3490537180012312, + -0.42764253660111107 + ], + "(8, 6, 4, 2, 4)": [ + -3.3108382693426255, + -2.802666157007163, + -1.0924097873678653 + ], + "(9, 5, 2, 3, 4)": [ + -1.4945410007790425, + -1.1469926575702785, + -0.8285923614093573 + ], + "(7, 4, 1, 2, 4)": [ + -2.0597477565203297, + -1.656885802391793, + -1.2196760005841867 + ], + "(9, 4, 0, 3, 5)": [ + -2.1902545256189967, + -1.9652293933752945, + -2.107566372920828 + ], + "(6, 5, 0, 4, 5)": [ + -1.5966297398212288, + -1.6285440492015713, + -1.2683583872259863 + ], + "(10, 6, 9, 6, 5)": [ + -2.9180113984234937, + -2.6094266888829516, + -3.0581677521461565 + ], + "(8, 6, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 8, 6, 5)": [ + -4.431836560181453, + -3.948968574818548, + -5.359587961987948 + ], + "(8, 6, 6, 4, 4)": [ + -1.1671533953653328, + -1.23555663534839, + -1.301333770654706 + ], + "(9, 6, 5, 3, 4)": [ + -1.4255537799866116, + -1.2744110474401866, + -0.9756187753318176 + ], + "(6, 6, 0, 4, 5)": [ + -2.15599595420883, + -1.9520399727250475, + -1.617466823483227 + ], + "(10, 5, 0, 3, 5)": [ + -2.068641406066307, + -2.9894938696048987, + -2.825016934521113 + ], + "(8, 3, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 2, 6, 5)": [ + -1.304995017180883, + -1.1896956176700935, + -1.3483130121023381 + ], + "(10, 4, 4, 7, 5)": [ + -1.385961097819488, + -2.6058224849588854, + -1.7761969040730017 + ], + "(7, 6, 7, 5, 4)": [ + -1.1638740703404264, + -1.1656248855795381, + -1.2300204801008627 + ], + "(8, 3, 7, 5, 4)": [ + -0.9398405051449512, + -1.0365039682074908, + -1.3325963212216632 + ], + "(9, 4, 3, 3, 4)": [ + -1.3540376560081064, + -0.9330462199348192, + -1.0541832461951754 + ], + "(9, 4, 1, 4, 4)": [ + -1.2871742926377565, + -1.4235587716414762, + -1.0820010191444898 + ], + "(9, 5, 1, 5, 5)": [ + -1.2321775266072414, + -1.128279475961386, + -0.9163592045155439 + ], + "(8, 5, 1, 5, 5)": [ + -1.044645098410301, + -0.8661356990833137, + -0.6259957937513749 + ], + "(8, 4, 1, 4, 4)": [ + -1.0863509905241802, + -1.088806402310271, + -0.9309753936685841 + ], + "(8, 4, 0, 3, 4)": [ + -1.6730595678059823, + -1.7279997616401974, + -1.4993676119288164 + ], + "(7, 6, 9, 5, 4)": [ + -2.189810552772656, + -1.876729324740304, + -2.0938304784511197 + ], + "(6, 3, 9, 5, 4)": [ + -1.4782763046166314, + -1.9794364575716312, + -2.015829185169474 + ], + "(10, 3, 9, 5, 5)": [ + -3.347618226488752, + -2.6688579755068265, + -4.453460502514662 + ], + "(8, 3, 9, 5, 5)": [ + -2.081830437111808, + -2.347753259273981, + -2.6166159290453956 + ], + "(10, 6, 1, 5, 5)": [ + -1.9470118035203159, + -1.9819260408871997, + -1.596208765648639 + ], + "(6, 2, 0, 4, 5)": [ + -5.827722371865084, + -3.3546254336540535, + 0.0 + ], + "(10, 3, 0, 4, 5)": [ + -2.8822158630206443, + -2.8593562556184073, + -2.4731467368635953 + ], + "(6, 6, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, 9, 8, 5)": [ + -2.172820425112929, + -2.0957526053719717, + -1.8982045037609234 + ], + "(10, 4, 2, 6, 5)": [ + -1.3192527151173095, + -1.4918571417290443, + -1.4382305033138065 + ], + "(10, 6, 4, 7, 5)": [ + -2.410123359693631, + -3.712809435282419, + -2.1638726575460367 + ], + "(7, 6, 2, 5, 5)": [ + -1.1913931814443175, + -0.9884086569181918, + -0.9362848215216829 + ], + "(6, 3, 3, 5, 4)": [ + -1.0947544083657068, + -1.9701248833016882, + -1.6578118484146116 + ], + "(6, 3, 2, 7, 5)": [ + -1.6113879570931056, + -1.600994955910292, + -1.2967801025510193 + ], + "(10, 5, 7, 8, 5)": [ + -4.111899384600274, + -2.396093177956994, + -4.564159779749498 + ], + "(7, 6, 8, 8, 5)": [ + -4.868606468793054, + -3.666077295876341, + -4.239997021318465 + ], + "(10, 3, 4, 4, 4)": [ + -3.0071046046970946, + -1.482204189087173, + -1.802119591330969 + ], + "(7, 3, 3, 4, 4)": [ + -1.0657615424957658, + -1.1187732101586199, + -0.81407999608173 + ], + "(7, 6, 3, 5, 5)": [ + -1.0419935016096318, + -0.8622246112957417, + -0.7842967176918909 + ], + "(6, 3, 4, 3, 4)": [ + -1.9206698263280637, + -1.1579354852113135, + -1.5197442850485292 + ], + "(8, 6, 3, 5, 5)": [ + -1.2828988591117123, + -1.0741702750606617, + -1.0353407608057335 + ], + "(8, 3, 0, 5, 4)": [ + 0.0, + -2.01782660254422, + 0.0 + ], + "(10, 3, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 6, 5, 5)": [ + -0.9398896789025716, + -1.2158720942270507, + -1.3144134073474962 + ], + "(6, 6, 8, 7, 5)": [ + -1.9265940370130412, + -2.0945070997987347, + -1.7945723011964194 + ], + "(8, 3, 1, 4, 5)": [ + -1.8868038390214026, + -1.6201843585702, + -1.7804787718400932 + ], + "(6, 2, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 8, 4, 4)": [ + -1.8619377314220968, + -2.1200371612684608, + -2.4457276763735654 + ], + "(10, 6, 8, 5, 4)": [ + -1.8101588189934883, + -2.1092005213635954, + -2.5863416872871947 + ], + "(7, 6, 9, 4, 4)": [ + -1.8468932249455783, + -2.515922364409024, + -2.128664004685093 + ], + "(9, 5, 9, 3, 4)": [ + -1.5923831174987277, + -1.1951255605790982, + -1.5225007532370158 + ], + "(9, 4, 9, 3, 4)": [ + -1.468970234859533, + -1.3139893574202401, + -1.6071159847921033 + ], + "(9, 4, 8, 3, 4)": [ + -1.0631002636411835, + -0.9597610839105185, + -1.0859246784896581 + ], + "(9, 5, 8, 4, 5)": [ + -3.3645716873490414, + -2.096999101944981, + -2.9491334331890156 + ], + "(9, 4, 8, 5, 5)": [ + -1.1070126488084593, + -1.240631952947305, + -1.394970698648403 + ], + "(8, 5, 8, 5, 5)": [ + -0.8212155084591755, + -0.9777831413635599, + -1.0852068509741788 + ], + "(9, 5, 7, 4, 4)": [ + -0.7223210743457409, + -0.8610639902305072, + -0.9719225532757089 + ], + "(9, 4, 2, 2, 4)": [ + -1.4773120440945138, + -1.426253794630385, + -1.4030247929443602 + ], + "(6, 3, 1, 3, 4)": [ + -1.7258791225518852, + -1.8790960341632026, + -1.9063613909269472 + ], + "(10, 5, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 9, 4, 4)": [ + -2.0511146992894935, + -2.8765288593930296, + -3.6688639851462166 + ], + "(10, 4, 9, 2, 4)": [ + -3.766120782021166, + -4.318748216943298, + -2.4453891281461404 + ], + "(6, 6, 8, 2, 4)": [ + -1.0187875385634395, + -1.9857041818677206, + -1.9732897747172464 + ], + "(10, 5, 8, 3, 4)": [ + -1.3141461144117694, + -1.7269966590090522, + -1.6880983048366123 + ], + "(7, 3, 7, 4, 5)": [ + -1.330397560567649, + -1.8491005101404212, + 0.0 + ], + "(10, 3, 6, 4, 5)": [ + 0.0, + -1.744751520159432, + 0.0 + ], + "(10, 5, 5, 4, 5)": [ + -1.2158520937290178, + -3.390255041037595, + -2.6589434835784296 + ], + "(8, 3, 6, 4, 4)": [ + -0.9408478787486658, + -1.1082687225787708, + -1.2814074370852135 + ], + "(7, 6, 7, 5, 5)": [ + -1.108682609131431, + -1.3900189767446876, + -1.2573637501123718 + ], + "(9, 4, 5, 3, 4)": [ + -1.0133633769895072, + -0.8916270365520349, + -0.8626497660688983 + ], + "(7, 3, 2, 2, 4)": [ + -2.032962356676962, + -1.7609249658628938, + -1.897257153945268 + ], + "(8, 6, 1, 4, 5)": [ + -1.9939046129259599, + -1.580046591283773, + -1.331022286682403 + ], + "(9, 4, 2, 6, 5)": [ + -0.8522833071342603, + -0.6131936581346042, + -0.9434841342120359 + ], + "(9, 4, 6, 6, 5)": [ + -0.8513905938157754, + -0.929895064543822, + -1.2064674627146863 + ], + "(8, 6, 9, 4, 4)": [ + -2.163959498694147, + -1.7250476758971476, + -2.207752366007984 + ], + "(8, 3, 8, 3, 4)": [ + -0.8968754787922782, + -1.1763730088011293, + -1.4281128084872028 + ], + "(9, 6, 7, 3, 4)": [ + -1.6006298611977998, + -1.1717939970375555, + -1.4087073442173894 + ], + "(9, 5, 5, 4, 5)": [ + -0.6522553435627434, + -0.4816514961562464, + -0.7097173786299007 + ], + "(9, 4, 4, 4, 5)": [ + -0.5242387390271926, + -0.6315990103046127, + -0.6053932662975652 + ], + "(7, 3, 3, 4, 5)": [ + -0.9550247556193681, + -1.2988848475458754, + -1.6528287710164058 + ], + "(9, 4, 2, 3, 4)": [ + -1.3221860620211157, + -1.1650354511963907, + -0.9280591580300621 + ], + "(6, 5, 1, 4, 5)": [ + -1.469140043244736, + -0.8890940414069375, + -0.7741187893947215 + ], + "(6, 4, 2, 6, 5)": [ + -0.5248900720133415, + -0.32257084723735463, + -0.3843584232723002 + ], + "(9, 4, 3, 6, 5)": [ + -0.664292744834006, + -0.5953007544286426, + -0.8528634014659627 + ], + "(6, 4, 9, 8, 5)": [ + -2.265081488952922, + -1.355455939898461, + -3.247215132798856 + ], + "(9, 3, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 7, 5, 5, 4)": [ + -4.491276279617494, + -3.1184338471441984, + -1.872082404888378 + ], + "(9, 4, 3, 5, 4)": [ + -0.9350872905908951, + -0.785283196717704, + -0.6684273939834793 + ], + "(9, 5, 4, 6, 5)": [ + -0.664060339028607, + -0.800168178462527, + -0.8916356709616268 + ], + "(8, 3, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 2, 5, 4)": [ + -2.7353688417928175, + -2.9914281044702387, + -1.7954107893236362 + ], + "(8, 7, 9, 7, 5)": [ + -4.115640672135837, + 0.0, + -4.359934479228372 + ], + "(9, 3, 8, 3, 4)": [ + -1.3594430013841898, + -1.5475165937123154, + -1.704485265382361 + ], + "(10, 6, 0, 5, 5)": [ + -2.4883635300724274, + -3.6335755380710633, + -2.1728209811053816 + ], + "(10, 3, 0, 4, 4)": [ + -5.0932199245692615, + -3.525707522773395, + -2.448257936388219 + ], + "(7, 6, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 1, 7, 5)": [ + -1.781893094835089, + -1.844117368085606, + -1.2803433625068998 + ], + "(9, 5, 1, 5, 4)": [ + -1.4716946313746917, + -1.33007794942532, + -1.0177897554546476 + ], + "(10, 3, 1, 5, 5)": [ + -2.6909241856419706, + -2.0628172876846476, + -1.8303882415630817 + ], + "(6, 2, 1, 5, 5)": [ + -3.665528271641915, + -5.080290163641386, + 0.0 + ], + "(6, 6, 1, 3, 4)": [ + -2.11640881017806, + -1.583242546840423, + -1.401843159258767 + ], + "(9, 3, 4, 7, 5)": [ + -1.1355447756823174, + -1.5790460807720985, + -1.934108421366661 + ], + "(10, 4, 7, 7, 5)": [ + -1.8814117452071528, + -2.1640610131394507, + -2.1198041094369553 + ], + "(9, 6, 8, 8, 5)": [ + -3.7918021567919644, + -4.516781064128049, + -2.623576049065663 + ], + "(7, 6, 9, 8, 5)": [ + -4.805969809654116, + -2.5136084189158665, + -1.776387264450847 + ], + "(8, 3, 3, 3, 4)": [ + -1.5712112345413212, + -1.8085737302919296, + -1.3220379172394188 + ], + "(7, 6, 1, 3, 4)": [ + -1.9305309912056052, + -1.8419044277283425, + -1.3772155728095765 + ], + "(6, 3, 3, 4, 4)": [ + -1.1023321901558052, + -1.1513804491602797, + -1.2336980866699796 + ], + "(8, 2, 2, 4, 5)": [ + -2.2782029250088236, + -2.5140589474094712, + -2.6262545758577245 + ], + "(9, 3, 0, 6, 5)": [ + -2.2398114104147515, + -2.0314548602488287, + -1.5068880832725617 + ], + "(10, 5, 1, 7, 5)": [ + -1.5724885780297613, + -1.7225386133144116, + -1.2541672815794727 + ], + "(9, 6, 2, 7, 5)": [ + -1.422961277510121, + -1.3898417781088408, + -1.4134677074451913 + ], + "(8, 6, 4, 7, 5)": [ + -1.429317819268593, + -1.2625635525647891, + -1.4552656206476362 + ], + "(6, 6, 9, 7, 4)": [ + 0.0, + 0.0, + -3.518308854674258 + ], + "(7, 3, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 8, 5, 4)": [ + -1.0574430608750272, + -1.2251833487690682, + -1.4019750373609097 + ], + "(6, 6, 8, 5, 4)": [ + -1.2843361022808146, + -1.481941585322054, + -1.5263606767481106 + ], + "(9, 3, 4, 6, 5)": [ + -1.3130572208450129, + -1.4042616065711298, + -1.5805404581805478 + ], + "(8, 6, 7, 6, 5)": [ + -1.526824231181736, + -1.7166053386281144, + -1.6373194005331342 + ], + "(6, 3, 8, 5, 5)": [ + -1.146023231998537, + -1.38372020809429, + -1.5118317405409238 + ], + "(7, 6, 9, 6, 5)": [ + -2.1864097586956244, + -1.7761105613085268, + -2.0830591058194647 + ], + "(10, 3, 0, 3, 4)": [ + -2.8832509609826227, + -3.0484227834013384, + -3.3297821671053764 + ], + "(9, 3, 3, 7, 5)": [ + -0.9697991192688672, + -1.5800712625056732, + -1.4178724601253898 + ], + "(9, 4, 9, 6, 4)": [ + -2.000088517948155, + -2.1052586491576766, + -1.8986027225034514 + ], + "(6, 6, 9, 5, 4)": [ + -2.0147714198102764, + -2.071975417534659, + -1.9489796833262558 + ], + "(7, 3, 9, 3, 4)": [ + -2.048420470364004, + -1.6358941459934857, + -2.9772300583425557 + ], + "(8, 5, 9, 5, 5)": [ + -1.629183974921311, + -1.5894107745199157, + -1.5328599270384604 + ], + "(8, 4, 9, 5, 5)": [ + -1.4711651760689006, + -1.825601742714863, + -1.6955407094408332 + ], + "(9, 6, 5, 6, 5)": [ + -1.3690867958852346, + -1.5474740489809569, + -1.6713157000922574 + ], + "(10, 5, 8, 4, 4)": [ + -1.2424296837579722, + -1.4530252019438488, + -1.6847843822420678 + ], + "(6, 6, 8, 5, 5)": [ + -1.2390656792484134, + -1.420112035787676, + -1.494845677648061 + ], + "(8, 3, 7, 3, 4)": [ + -0.9992660870283543, + -1.2421096535193294, + -1.2717467781085987 + ], + "(9, 5, 4, 3, 4)": [ + -1.0847634950881393, + -0.8234490542503159, + -0.6170833926016575 + ], + "(10, 6, 0, 4, 4)": [ + -4.0090561072177815, + -3.4139738834662707, + -3.3837632318944726 + ], + "(10, 4, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 2, 6, 5)": [ + -1.1132569071938816, + -1.0590953760730195, + -0.8185831306385474 + ], + "(6, 3, 7, 6, 5)": [ + -0.9966689347766198, + -1.4372895290415804, + -1.445820207341861 + ], + "(9, 3, 2, 4, 5)": [ + -2.0567133109997675, + -2.0813705225646237, + -1.5070483720873997 + ], + "(6, 3, 1, 6, 5)": [ + -1.4820285881635933, + -1.849841345885421, + -0.98322818594004 + ], + "(9, 4, 2, 5, 5)": [ + -0.953540004777885, + -0.8905384185991603, + -0.6261374230956486 + ], + "(8, 6, 4, 5, 4)": [ + -1.3778925993832642, + -1.2634282911938706, + -0.868765117420515 + ], + "(7, 3, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 5, 5, 4)": [ + -1.4493745749966331, + -1.5937269801298801, + -1.6080944956057488 + ], + "(6, 3, 5, 5, 4)": [ + -0.5930694553743349, + -0.8056240613916661, + -0.9532211953878191 + ], + "(6, 3, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 3, 5, 5)": [ + -1.4503628703397766, + -1.4887904292591485, + -1.2771042447909995 + ], + "(6, 3, 2, 5, 5)": [ + -1.0062172220906038, + -1.2142569169218353, + -1.2232235538230598 + ], + "(7, 6, 2, 5, 4)": [ + -2.2524701965959117, + -1.6764687418755249, + -2.1030730012515773 + ], + "(9, 4, 0, 6, 5)": [ + -1.6141254169533226, + -1.4297403567857299, + -1.4984520779918835 + ], + "(8, 6, 5, 7, 5)": [ + -1.9975413802025648, + -1.393222333757828, + -2.6410641721765145 + ], + "(9, 5, 7, 7, 5)": [ + -1.0744534673002248, + -1.4484229568706308, + -1.377117685357778 + ], + "(9, 4, 8, 8, 5)": [ + -1.821464012468692, + -2.1900707638268693, + -4.881360244981003 + ], + "(9, 4, 9, 7, 4)": [ + -4.380433351902465, + -3.0568090844285916, + -2.2283383402518897 + ], + "(10, 4, 6, 4, 4)": [ + -1.302927957807162, + -1.303026665608987, + -1.2080294541078942 + ], + "(10, 5, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 9, 6, 4)": [ + -2.5379843487296228, + -2.4138187792702697, + -2.6432742889516114 + ], + "(9, 6, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, 3, 7, 5)": [ + -1.2639637831658546, + -3.2929704031650626, + -1.5457747518300389 + ], + "(9, 3, 8, 6, 4)": [ + -4.304682457393878, + -1.8947865521810527, + -4.044994772064026 + ], + "(7, 3, 8, 6, 4)": [ + -3.894220397013264, + -1.798209395729648, + -4.594347349109794 + ], + "(10, 4, 8, 6, 4)": [ + -3.3376757263344436, + -3.718141986967643, + -2.2667147876402014 + ], + "(9, 5, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 7, 0, 4, 4)": [ + 0.0, + -4.904454900031344, + 0.0 + ], + "(8, 3, 2, 5, 4)": [ + -2.423055829007296, + -2.5859401653361203, + -1.0729734078521267 + ], + "(9, 5, 6, 7, 5)": [ + -1.272500127996135, + -1.455058682904275, + -1.2194597521521988 + ], + "(7, 3, 9, 8, 5)": [ + -2.263065036267726, + -2.86045411220666, + -2.9906302470847455 + ], + "(9, 6, 3, 2, 4)": [ + -2.6789650120974926, + -2.2803671428676866, + -1.6317880524614323 + ], + "(7, 6, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 6, 7, 5)": [ + -1.1835487834807368, + -2.051254081686168, + -1.8882995355270955 + ], + "(10, 6, 8, 6, 5)": [ + -2.4662056655086357, + -2.1482338741098332, + -2.580723695521244 + ], + "(6, 3, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 5, 3, 4)": [ + -1.2366383204835028, + -0.9215333875503141, + -1.2934423155598698 + ], + "(8, 3, 3, 5, 5)": [ + -1.3668673759653842, + -1.3481493456175757, + -1.2144124846129094 + ], + "(9, 3, 3, 5, 4)": [ + -1.7254587270072128, + -1.3406136075701818, + -1.4841821032088722 + ], + "(8, 6, 5, 6, 5)": [ + -1.3424432976530933, + -0.9996358937666399, + -1.3515775563275003 + ], + "(6, 4, 7, 5, 4)": [ + -0.3120334075045995, + -0.598646190500675, + -0.5936713991547473 + ], + "(9, 4, 7, 5, 4)": [ + -0.9633517187701772, + -0.9164967919867432, + -0.9781658761933485 + ], + "(6, 5, 7, 5, 4)": [ + -0.5247275374576246, + -0.6021097972306124, + -0.7186259793518769 + ], + "(9, 5, 7, 5, 4)": [ + -0.8657011151386749, + -0.9250959022634725, + -1.0839712519357632 + ], + "(6, 4, 8, 6, 5)": [ + -0.8414748919772911, + -0.99632663636048, + -1.3090504640386535 + ], + "(7, 4, 9, 5, 4)": [ + -1.3698055354814742, + -1.6052566941155435, + -1.6014204624990471 + ], + "(8, 4, 9, 5, 4)": [ + -1.3524440766390775, + -1.521328257109845, + -1.6419992388221 + ], + "(8, 5, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 5, 2, 4)": [ + -2.643859540840489, + -1.6945784212999127, + -1.4775862327340756 + ], + "(10, 6, 1, 7, 5)": [ + -2.9662888130913987, + -2.3461542015470904, + -1.8476777653607377 + ], + "(6, 6, 4, 7, 5)": [ + -0.9438415652023168, + -2.0530476323703324, + -2.2066432920745056 + ], + "(6, 3, 9, 8, 5)": [ + -3.7377708241488357, + -2.878075781625844, + -2.1003725844300085 + ], + "(10, 3, 9, 8, 5)": [ + -3.3931980424166572, + -3.878380912284465, + -3.7605315288027708 + ], + "(7, 4, 1, 7, 5)": [ + -1.0506541899022444, + -0.4797949267120694, + -1.9190721105553363 + ], + "(8, 4, 2, 7, 5)": [ + -0.8450234114050426, + -0.5211130051307071, + -0.6280483403883929 + ], + "(8, 5, 7, 7, 5)": [ + -0.9311845954988477, + -1.2756884497845673, + -1.206938845541197 + ], + "(7, 5, 8, 8, 5)": [ + -3.0477768980144346, + -1.8444860066755628, + 0.0 + ], + "(8, 4, 9, 7, 5)": [ + -1.610355493030713, + -1.5929466814044775, + -1.6155252464523548 + ], + "(6, 4, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 9, 4, 4)": [ + -1.549040408759903, + -2.1414311306305565, + -2.6799005848173003 + ], + "(6, 6, 7, 2, 4)": [ + -1.7440260728198624, + -1.6146277193851466, + -0.9124394392889793 + ], + "(10, 5, 4, 2, 4)": [ + -1.686112226003699, + -2.367884086183223, + -1.9372303026155544 + ], + "(10, 5, 6, 3, 4)": [ + -1.4649622681849945, + -1.54019431918709, + -1.4006124877558612 + ], + "(8, 6, 4, 4, 4)": [ + -1.305868683415695, + -1.1366232962186054, + -0.8665021435664904 + ], + "(7, 6, 0, 3, 5)": [ + -2.023983480473907, + -3.700149940161264, + -2.9567389640774984 + ], + "(10, 5, 4, 7, 5)": [ + -1.2153347888194872, + -1.6458622871432418, + -1.6190206305265789 + ], + "(9, 4, 7, 7, 5)": [ + -1.1366117201297181, + -1.4161806302203763, + -1.427015639838335 + ], + "(10, 6, 8, 5, 5)": [ + -2.5438693361491396, + -1.9281801176012094, + -2.3928938381053713 + ], + "(8, 6, 6, 5, 5)": [ + -1.2477302033859872, + -1.1980201763056084, + -1.247470006784372 + ], + "(9, 3, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 5, 6, 5)": [ + -0.8393029455444898, + -1.1716088977915784, + -1.121060764402156 + ], + "(9, 5, 3, 6, 5)": [ + -0.7878922063834745, + -0.617997241281661, + -0.7839243302206633 + ], + "(9, 4, 5, 7, 5)": [ + -0.8573798643812924, + -1.315977834267984, + -1.2980581774868674 + ], + "(9, 6, 8, 3, 4)": [ + -1.6726990277381453, + -1.4654291104874257, + -1.7065213835467026 + ], + "(6, 3, 7, 4, 4)": [ + -0.8950908739906707, + -0.8938363834595318, + -1.0540553080153812 + ], + "(7, 6, 6, 4, 4)": [ + -0.8988483501529277, + -0.8164669848791001, + -1.0039276542521214 + ], + "(9, 5, 6, 5, 5)": [ + -0.5119402181473222, + -0.812620879212024, + -0.9073294659107451 + ], + "(9, 4, 6, 5, 5)": [ + -0.6463504471152293, + -0.8499886990856285, + -1.0729087739684844 + ], + "(9, 4, 5, 4, 4)": [ + -0.6632333425044062, + -0.5304103864536176, + -0.6705413898446595 + ], + "(8, 2, 8, 4, 4)": [ + -2.459275486314893, + 0.0, + -4.325985858578877 + ], + "(6, 7, 8, 5, 4)": [ + -4.854119879322951, + -4.3707009040982845, + -3.0105652330045314 + ], + "(10, 6, 9, 5, 5)": [ + -2.9938746013649116, + -3.475457117077017, + -4.609883521762502 + ], + "(10, 4, 7, 2, 4)": [ + -1.6845036286263584, + -1.5344043047154519, + -1.1745590276903248 + ], + "(9, 6, 5, 2, 4)": [ + -3.8531669892821307, + -1.6156449101955581, + -1.8765685842308124 + ], + "(9, 6, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 3, 5, 5)": [ + -3.4208495620280566, + -1.5552806028162476, + -1.2472403149773204 + ], + "(7, 6, 4, 5, 5)": [ + -0.8762885185184887, + -0.8059097412229346, + -0.6321565477835038 + ], + "(9, 4, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 3, 7, 5)": [ + -2.5647829252060257, + -2.556452933811996, + -1.5619784279439566 + ], + "(10, 3, 4, 3, 4)": [ + -3.5884613845922333, + -3.481138414770869, + -1.6812761107908278 + ], + "(10, 6, 4, 5, 5)": [ + -1.6117939615738766, + -1.2884784991388256, + -1.542995766044525 + ], + "(6, 6, 6, 6, 5)": [ + -1.2357288445570898, + -1.3985136460451153, + -1.7744463097538186 + ], + "(10, 6, 7, 5, 5)": [ + -3.019094008051929, + -1.6841773386038428, + -3.3075464968438797 + ], + "(10, 3, 1, 6, 5)": [ + -2.165594901609612, + -3.346100153515689, + -3.0345215768067018 + ], + "(8, 7, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 7, 3, 4)": [ + -1.5060445279034225, + -1.2622688887937061, + -1.007202309689785 + ], + "(9, 4, 5, 4, 5)": [ + -0.5874632447683842, + -0.4468271184305189, + -0.8633503925542896 + ], + "(9, 5, 3, 5, 5)": [ + -0.7980216401935658, + -0.7585427456881697, + -0.5869134127299083 + ], + "(9, 5, 5, 5, 5)": [ + -0.7295716777148284, + -0.6558146527321604, + -0.8082109882496318 + ], + "(8, 7, 6, 5, 5)": [ + -4.637552252563447, + -2.349022844984093, + 0.0 + ], + "(9, 7, 8, 5, 4)": [ + 0.0, + -3.5822878342903683, + -5.123277625480148 + ], + "(8, 2, 8, 5, 5)": [ + -4.110454950262149, + -5.456066350029089, + -6.058550864894259 + ], + "(6, 7, 9, 5, 4)": [ + -4.701723811381992, + -3.318958206543308, + -4.17212560723152 + ], + "(7, 2, 9, 5, 4)": [ + -3.1376004431511704, + -6.253866901247971, + 0.0 + ], + "(9, 3, 6, 3, 4)": [ + -1.4756137556851345, + -1.2329974542329465, + -1.5765603099201726 + ], + "(10, 4, 5, 4, 5)": [ + -2.3403948951105935, + -1.9352636819793425, + -1.5994419349710167 + ], + "(10, 6, 5, 4, 5)": [ + 0.0, + 0.0, + -2.638771865251502 + ], + "(9, 4, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 6, 6, 5)": [ + -1.3903275527461258, + -1.2594460332419608, + -1.5193339631926344 + ], + "(10, 3, 9, 6, 5)": [ + -2.771582023229827, + -2.6142594861954067, + -2.763254131287188 + ], + "(7, 3, 0, 3, 5)": [ + -2.20696950511384, + -2.850622759754418, + -2.797662416613689 + ], + "(7, 3, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 7, 6, 5, 5)": [ + -2.8297668286761795, + -4.050754026470647, + -4.376231438033596 + ], + "(7, 7, 8, 6, 5)": [ + 0.0, + -5.49481790565693, + -4.641206382334047 + ], + "(6, 6, 5, 3, 4)": [ + -1.1353240276985515, + -0.8213842242252406, + -0.7306186906429019 + ], + "(7, 3, 1, 3, 4)": [ + -1.9129022172934569, + -2.1896829338568393, + -1.6045456057386098 + ], + "(8, 5, 1, 6, 5)": [ + -0.7886566664752668, + -0.7433374525346819, + -0.5433954983035555 + ], + "(7, 3, 4, 6, 5)": [ + -0.5565746284584614, + -0.9103560864639236, + -1.2440394049008856 + ], + "(6, 4, 9, 6, 5)": [ + -1.3207301345833495, + -1.7269188096394368, + -1.8943496585770416 + ], + "(6, 5, 9, 4, 4)": [ + -1.027833448957911, + -1.464212851799792, + -2.577429940397024 + ], + "(7, 4, 9, 4, 4)": [ + -1.2899203810312752, + -1.0677425169278325, + -1.8154052726502679 + ], + "(8, 4, 9, 4, 4)": [ + -1.2044276797305735, + -1.0950252318174074, + -1.4026297340485976 + ], + "(7, 5, 9, 4, 4)": [ + -1.4135453698184635, + -1.6191634096682372, + -1.427476793998086 + ], + "(7, 5, 9, 4, 5)": [ + -1.22656890540948, + -1.6539084052111428, + 0.0 + ], + "(8, 5, 8, 4, 4)": [ + -0.699846629380974, + -0.7939281498472713, + -0.8428915179900826 + ], + "(6, 4, 8, 3, 4)": [ + -0.49922744210358305, + -1.2193834527298073, + -1.0475828002125747 + ], + "(8, 4, 7, 2, 4)": [ + -0.6260065995154623, + -0.5906772558856108, + -0.4430463428099204 + ], + "(8, 5, 4, 2, 4)": [ + -1.8283039300860613, + -0.8402762257146086, + -1.067109134922289 + ], + "(6, 5, 1, 2, 4)": [ + -1.458860862823914, + -1.4216767275440276, + -1.124323853179836 + ], + "(8, 4, 0, 1, 4)": [ + -2.0719178359539354, + -2.9072834406368493, + -3.245058625562317 + ], + "(7, 4, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 9, 6, 5)": [ + -2.382357134088868, + -2.2966790816485694, + -2.1150046074486992 + ], + "(10, 4, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 9, 6, 5)": [ + -1.3182002778758009, + -1.8964406845026796, + -1.6525971751383728 + ], + "(8, 7, 5, 4, 4)": [ + -2.4060007291384933, + -3.582226601504822, + -2.7020443493638076 + ], + "(10, 6, 3, 3, 4)": [ + -2.375330677769183, + -4.8048371652277435, + -4.609380161880662 + ], + "(9, 7, 0, 3, 4)": [ + -6.1936972270032395, + 0.0, + -6.134442501969041 + ], + "(6, 2, 0, 5, 5)": [ + -5.564600123152377, + 0.0, + -4.140512886059127 + ], + "(6, 7, 0, 4, 4)": [ + -6.94410206502224, + -4.365732978530339, + -4.907337607463253 + ], + "(10, 6, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 3, 4, 2, 4)": [ + -1.9711925137875546, + -1.7926364902442316, + -1.531063711688576 + ], + "(6, 3, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 8, 5, 4)": [ + -1.0862700975170094, + -1.2769216186566985, + -1.3870037675422537 + ], + "(9, 6, 4, 2, 4)": [ + -2.522420008726535, + -1.7107007978180022, + -1.3588364034066605 + ], + "(9, 4, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 1, 4, 4)": [ + -3.0838572353429354, + -2.594671656757135, + -1.9751497523486137 + ], + "(6, 6, 2, 5, 4)": [ + -2.179561687471328, + -1.6273285610257027, + -1.0872366705757681 + ], + "(10, 3, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 7, 4, 4)": [ + -1.0701580886626147, + -1.0180508867264886, + -1.0327646365702303 + ], + "(6, 3, 5, 4, 4)": [ + -0.8515199917085184, + -0.6896024593415202, + -0.7699671226035716 + ], + "(9, 4, 4, 3, 4)": [ + -1.1474471610189, + -0.8894310018020599, + -0.6879218340376263 + ], + "(7, 5, 3, 5, 5)": [ + -0.504785244719094, + -0.4147463599193877, + -0.2532724424974939 + ], + "(8, 5, 4, 5, 5)": [ + -0.4244098749783271, + -0.4812219311146665, + -0.34859608954919014 + ], + "(8, 4, 5, 5, 5)": [ + -0.24107392157267238, + -0.39747949906740637, + -0.5202151701093007 + ], + "(8, 4, 6, 5, 5)": [ + -0.33178643889635706, + -0.5746362718078547, + -0.7104221601104844 + ], + "(8, 5, 8, 6, 5)": [ + -0.9860706604451939, + -1.0810014289540921, + -1.3719539702712862 + ], + "(7, 5, 8, 5, 5)": [ + -0.8869513844000685, + -0.9800152701272213, + -1.1176436588867644 + ], + "(7, 4, 9, 7, 5)": [ + -1.54650000722556, + -1.7762122338288164, + -1.6374237899059352 + ], + "(8, 5, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 1, 7, 5)": [ + -1.3331024354637004, + -2.0329558946344566, + -2.175072322657318 + ], + "(10, 6, 2, 6, 5)": [ + -1.8044480945052639, + -1.621121240737707, + -1.5416028179307086 + ], + "(8, 3, 4, 6, 5)": [ + -1.0767164918576477, + -1.178165832041652, + -1.3317288573689938 + ], + "(8, 3, 6, 5, 4)": [ + -0.728107258168293, + -1.0153485639052564, + -1.041188833346126 + ], + "(6, 3, 7, 5, 4)": [ + -0.8279601944202133, + -0.9764253860362813, + -1.2141528632869683 + ], + "(9, 5, 5, 4, 4)": [ + -0.8144824169533458, + -0.7316424430368169, + -0.6464741588784136 + ], + "(7, 6, 5, 4, 4)": [ + -0.969606277345308, + -0.8256802601986017, + -0.766758359217845 + ], + "(6, 3, 2, 3, 4)": [ + -1.6691004745133255, + -1.4429052953341224, + -1.1208320400934735 + ], + "(9, 3, 4, 3, 4)": [ + -1.7339919363179481, + -1.4857749623011622, + -1.5078272144200566 + ], + "(7, 3, 2, 5, 4)": [ + -2.3272290963417923, + -2.9853081360575833, + -1.1237737209312653 + ], + "(10, 3, 6, 2, 4)": [ + -1.9906326932339808, + -1.649729933032882, + 0.0 + ], + "(6, 3, 4, 2, 4)": [ + -1.4108353975944754, + -2.876029820980472, + -2.0129902124304 + ], + "(10, 6, 6, 4, 4)": [ + -1.453584646975229, + -2.8863566358731543, + -2.1347077269835237 + ], + "(10, 6, 1, 4, 5)": [ + -2.4928565675209615, + -3.9062037459271544, + -4.9750888418186365 + ], + "(8, 7, 0, 3, 4)": [ + -4.3950575170975865, + -5.9566590272763635, + -5.6664858690133055 + ], + "(7, 2, 0, 5, 5)": [ + -3.146263100244089, + -4.992460787562199, + -5.092118718274424 + ], + "(10, 6, 1, 6, 5)": [ + -2.2336256256138807, + -2.669672901839146, + -1.5088726171911613 + ], + "(6, 7, 1, 5, 5)": [ + 0.0, + -3.0610364124157856, + 0.0 + ], + "(6, 6, 4, 6, 5)": [ + -0.8178266994068001, + -1.108098247454023, + -1.391902661471642 + ], + "(9, 3, 8, 2, 4)": [ + -1.315246800043244, + -1.7907661332711042, + -1.4762312584136847 + ], + "(6, 3, 0, 6, 5)": [ + -4.4902842446765465, + -1.9329422824073903, + -1.4559603731215596 + ], + "(9, 4, 3, 4, 4)": [ + -0.886429865668544, + -0.9841491374222687, + -0.6533796638793795 + ], + "(8, 4, 1, 3, 4)": [ + -1.3656609715549266, + -1.3240644607825625, + -0.9991239662907992 + ], + "(7, 6, 1, 4, 5)": [ + -1.7944752763873515, + -1.8305562117195133, + -1.2646104058206449 + ], + "(9, 4, 1, 4, 5)": [ + -1.4008199566044266, + -1.4244386768064785, + -1.0645873745485692 + ], + "(7, 5, 4, 7, 5)": [ + -0.45104301943107095, + -1.429813588293057, + -1.0628819428710758 + ], + "(8, 5, 5, 6, 5)": [ + -0.39233392824610586, + -0.6904694684641588, + -0.9163510761665291 + ], + "(9, 4, 6, 5, 4)": [ + -0.4458750498698816, + -0.7164387701381967, + -0.9058161102576536 + ], + "(8, 4, 7, 5, 4)": [ + -0.4161711986447142, + -0.5679717509820535, + -0.7132442149785135 + ], + "(8, 4, 7, 4, 4)": [ + -0.39828156623564137, + -0.515026323026724, + -0.7668223820546596 + ], + "(6, 5, 8, 5, 5)": [ + -0.7846451651596534, + -1.0369364375261034, + -0.993416619518195 + ], + "(7, 4, 7, 4, 4)": [ + -0.43675277965036535, + -0.49473625847855723, + -0.5362142551748781 + ], + "(7, 5, 3, 2, 4)": [ + -2.297656482086306, + -1.2450070383620337, + -0.666050584815743 + ], + "(8, 5, 2, 3, 4)": [ + -1.0789922718103926, + -0.8018030953475128, + -0.6389409251630574 + ], + "(8, 5, 0, 5, 5)": [ + -1.4931942115088426, + -1.2811120631460797, + -0.9663234842989812 + ], + "(6, 4, 0, 5, 5)": [ + -1.6050446144216166, + -1.6505898631243867, + -1.1125322275831988 + ], + "(6, 5, 0, 4, 4)": [ + -1.6760281625264277, + -2.8458159486663326, + -3.7872437703565236 + ], + "(8, 5, 0, 3, 4)": [ + -1.7238136156591453, + -1.6183409742664348, + -1.4126613276132607 + ], + "(6, 4, 0, 4, 4)": [ + -2.2905126175310673, + -1.6621611276586232, + -2.011258321896658 + ], + "(8, 4, 0, 4, 4)": [ + -1.5492402928058149, + -1.8208716064863315, + -1.6258470697640341 + ], + "(7, 5, 0, 4, 5)": [ + -1.5447906058536156, + -1.6275515128209557, + -1.3367861561214647 + ], + "(8, 5, 0, 4, 4)": [ + -1.7836509473615845, + -2.167605184469862, + -1.6378761513611078 + ], + "(8, 4, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 6, 7, 5)": [ + -4.073073926862218, + -4.777821022136648, + -1.7606033153366838 + ], + "(9, 7, 5, 5, 5)": [ + -4.140721246548284, + -3.503907072365684, + -4.418244799362714 + ], + "(7, 3, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 7, 2, 4)": [ + -1.9457096802638656, + -1.1052810506061321, + -1.3005301091217134 + ], + "(6, 6, 4, 4, 5)": [ + -1.145372943723752, + -1.2287584262308038, + -0.5576349999936907 + ], + "(7, 3, 8, 5, 5)": [ + -1.0610367297045449, + -1.4245141945792645, + -1.5964748781610765 + ], + "(8, 5, 9, 6, 5)": [ + -1.6620246026888488, + -1.7126291352250316, + -1.5914936661907906 + ], + "(8, 4, 9, 6, 5)": [ + -1.5337241804572737, + -1.777220622130126, + -1.6443000020914549 + ], + "(6, 5, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, 4, 3, 4)": [ + -1.739073636447817, + -1.4473618398639223, + -1.4245339118654334 + ], + "(7, 3, 4, 7, 5)": [ + -2.093325240722852, + -1.3713469795778224, + -1.6991735027850905 + ], + "(9, 3, 7, 8, 5)": [ + -4.5083544635270485, + -2.4835409784236684, + -4.819885916251284 + ], + "(7, 3, 3, 5, 5)": [ + -1.0297962278958521, + -1.0330595450005688, + -0.7587312167956375 + ], + "(8, 3, 6, 6, 5)": [ + -1.2088414702773291, + -1.4590046152470446, + -1.7741354742887456 + ], + "(10, 6, 8, 7, 5)": [ + -4.227285219459558, + -2.266884167399913, + -3.342407062948821 + ], + "(9, 7, 8, 6, 5)": [ + -3.6378834542662393, + -4.831931930235263, + -5.2327800251889105 + ], + "(10, 3, 8, 3, 4)": [ + -1.6827496565186713, + -3.833494241413744, + -2.1818579224121506 + ], + "(10, 6, 6, 3, 4)": [ + -4.261842398212389, + -2.929748099794126, + -1.6379229681165022 + ], + "(6, 6, 5, 4, 5)": [ + -0.6167553792887842, + -3.029491103118324, + -3.2049321394766626 + ], + "(6, 3, 6, 5, 5)": [ + -0.6657024078465228, + -0.8815996520569285, + -1.0105055126949654 + ], + "(6, 3, 5, 3, 4)": [ + -1.410667022134514, + -1.0043574506473887, + -1.0743128706101133 + ], + "(10, 6, 9, 4, 4)": [ + -3.6514205779856335, + -2.805854064144611, + -2.967916852861777 + ], + "(9, 3, 7, 2, 4)": [ + -1.7516045158890066, + -1.455068760407258, + -1.5704798296440665 + ], + "(10, 5, 6, 2, 4)": [ + -1.633324279674627, + -2.1380428741346935, + -2.1147711161342295 + ], + "(6, 3, 2, 4, 4)": [ + -1.2706218122951805, + -1.2412821724893521, + -0.9868912723358894 + ], + "(9, 6, 7, 2, 4)": [ + -1.4507077873636909, + -1.4593163664903401, + -1.1842301409961549 + ], + "(6, 3, 0, 1, 4)": [ + -3.924758076052053, + -3.2585841765308845, + -4.550686949107101 + ], + "(10, 3, 4, 2, 4)": [ + -2.2622651519160133, + -2.7577279295770785, + -1.7558765962977394 + ], + "(8, 3, 2, 2, 4)": [ + -1.8889350048212612, + -2.58853357807129, + -2.202763966673586 + ], + "(10, 6, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 4, 5, 4)": [ + -0.6888232015130332, + -0.6277736117804399, + -0.6610766098376423 + ], + "(7, 6, 1, 2, 4)": [ + -2.2002903094502795, + -1.9657647917409535, + -1.688622749505286 + ], + "(9, 5, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 2, 5, 5, 5)": [ + -3.4526607052473475, + 0.0, + 0.0 + ], + "(9, 2, 0, 2, 4)": [ + 0.0, + -4.230963708610784, + 0.0 + ], + "(8, 3, 4, 4, 5)": [ + -1.2118135903773781, + -0.7535791562234494, + -1.1460900682240116 + ], + "(10, 5, 0, 1, 4)": [ + -3.7744143060762543, + -2.7922728388475573, + -5.033438669498237 + ], + "(7, 3, 8, 3, 4)": [ + -0.9050275075494602, + -1.3936002808753012, + -1.404119944027584 + ], + "(8, 6, 6, 4, 5)": [ + -3.044857898116047, + -1.746590585047248, + -3.4199188249762305 + ], + "(9, 7, 1, 3, 4)": [ + -5.584247206638654, + -5.411430722269671, + -4.242779043870763 + ], + "(7, 7, 0, 7, 5)": [ + -3.1788668710601136, + 0.0, + 0.0 + ], + "(9, 3, 1, 5, 4)": [ + -3.2955525425414045, + -1.6582065372815413, + -3.569385380758129 + ], + "(6, 6, 3, 7, 5)": [ + -1.356199336974806, + -1.279399265964428, + -1.6647864163296282 + ], + "(10, 4, 0, 5, 4)": [ + -4.891948151696946, + -2.657986469181191, + -5.212016855860817 + ], + "(10, 6, 3, 5, 4)": [ + -2.1335576301999835, + -3.1498926962974494, + -2.4095371365324487 + ], + "(6, 3, 4, 5, 5)": [ + -0.8061842743161842, + -0.7260467139812204, + -0.8393462788240602 + ], + "(6, 3, 8, 2, 4)": [ + -0.9889926822538312, + -1.566130753174743, + -1.2214573610615804 + ], + "(10, 4, 6, 2, 4)": [ + -2.0054582845402527, + -1.5200873016180914, + -1.14453930358475 + ], + "(6, 6, 5, 5, 5)": [ + -0.909645985259155, + -0.6776841325786455, + -0.907326458791034 + ], + "(7, 4, 0, 4, 5)": [ + -1.6592892890857995, + -1.5665352552622402, + -1.2518842753880586 + ], + "(7, 6, 7, 3, 4)": [ + -1.4054700663932085, + -1.113992015468544, + -0.7966145912777907 + ], + "(10, 4, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, 0, 5, 4)": [ + -4.140444449651691, + -2.406516699155232, + -3.363356667899323 + ], + "(7, 6, 0, 5, 4)": [ + 0.0, + 0.0, + -3.3292025803673377 + ], + "(7, 5, 1, 6, 5)": [ + -0.8909685474179243, + -0.6640690211928276, + -0.774209163986184 + ], + "(8, 3, 3, 7, 5)": [ + -2.5900831608581596, + -2.498344455730712, + -1.1311328999292216 + ], + "(9, 4, 6, 7, 5)": [ + -0.9599665953570179, + -1.7532753075587753, + -2.0132712461491846 + ], + "(6, 6, 7, 5, 4)": [ + -0.932747313371144, + -1.0898685122347036, + -1.0565142932677771 + ], + "(8, 4, 2, 5, 4)": [ + -1.0186268367905413, + -0.6789477623615984, + -0.6953668095806691 + ], + "(7, 4, 3, 5, 4)": [ + -0.8354263052788269, + -0.45971432504736875, + -0.5727928542244103 + ], + "(8, 5, 4, 4, 4)": [ + -0.6721236571737651, + -0.5121106002312895, + -0.28258192031011864 + ], + "(7, 5, 3, 4, 4)": [ + -0.6312628728505876, + -0.5091574354958875, + -0.3865131220015342 + ], + "(7, 4, 1, 5, 5)": [ + -0.9490742910390368, + -0.8867521745193763, + -0.6039981615111287 + ], + "(8, 4, 1, 5, 5)": [ + -0.9180902774549096, + -0.892412019856541, + -0.717647967833513 + ], + "(8, 5, 3, 6, 5)": [ + -0.48885574129190623, + -0.4827301285446677, + -0.6683736200803153 + ], + "(9, 5, 5, 6, 5)": [ + -0.5749869465918784, + -0.842190132958493, + -1.1960529109145988 + ], + "(8, 4, 7, 7, 5)": [ + -0.8231737403638038, + -1.1307697285390208, + -1.2218361531559498 + ], + "(7, 4, 8, 6, 5)": [ + -0.7957914383705584, + -1.0745022927831929, + -1.2525841698438047 + ], + "(8, 4, 8, 4, 4)": [ + -0.5642189495021458, + -0.7860384641400058, + -0.959301181622219 + ], + "(6, 4, 8, 4, 4)": [ + -0.614904790720737, + -0.6867882239452927, + -0.8374038927444036 + ], + "(6, 5, 8, 4, 4)": [ + -0.6139286607232386, + -0.6753941852725476, + -0.7736897813225626 + ], + "(6, 5, 7, 4, 4)": [ + -0.444601972729486, + -0.545589267506078, + -0.5897264679671524 + ], + "(8, 5, 7, 4, 4)": [ + -0.4610004673429647, + -0.5081270107764987, + -0.5693570878467258 + ], + "(8, 4, 4, 2, 4)": [ + -1.039211160720304, + -0.9698702321030139, + -0.6957129699295741 + ], + "(7, 4, 2, 2, 4)": [ + -1.0413395652323585, + -2.1799728511393446, + -1.857040671293484 + ], + "(8, 4, 1, 2, 4)": [ + -1.5345334577017493, + -1.5458303803247244, + -1.3750984613454884 + ], + "(6, 5, 0, 2, 4)": [ + -1.5906861356519686, + -1.48833833658719, + -1.5969276215343409 + ], + "(8, 4, 0, 3, 5)": [ + -2.1122732736306418, + -1.6165887448532366, + -1.9044045615939684 + ], + "(6, 4, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 2, 6, 5)": [ + -1.1827339634913576, + -0.9281630376730662, + -1.5277127076988861 + ], + "(10, 4, 5, 7, 5)": [ + -2.2325414514934008, + -1.6182622863655387, + -2.209128633321452 + ], + "(8, 4, 5, 4, 5)": [ + -0.3900485308333124, + -0.42626733427586255, + -0.4387447052536916 + ], + "(7, 5, 2, 4, 5)": [ + -0.9328965285166807, + -0.7986300962343358, + -0.5193996087282658 + ], + "(6, 4, 1, 4, 4)": [ + -1.2530620270943233, + -1.1781247421520546, + -0.9070717402986281 + ], + "(7, 4, 0, 4, 4)": [ + -2.145004319710634, + -1.5165848957370687, + -3.1829610960335306 + ], + "(7, 5, 0, 4, 4)": [ + -3.0743897969661833, + -3.5314553026896895, + -1.502310017208925 + ], + "(8, 5, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 7, 0, 4, 5)": [ + -4.053852252182132, + 0.0, + -5.117725052478856 + ], + "(8, 3, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 8, 5, 5)": [ + -3.1638684296818447, + -3.0393073841969587, + -4.989384454466157 + ], + "(8, 7, 9, 6, 5)": [ + -5.9244091497806615, + -3.4049304720095206, + -5.893262858180629 + ], + "(7, 3, 9, 5, 5)": [ + -2.6223925633587983, + -2.7422619916354405, + -2.2596070588285913 + ], + "(6, 3, 8, 4, 5)": [ + -1.254922290067979, + 0.0, + 0.0 + ], + "(9, 4, 1, 3, 5)": [ + -2.4239298049988918, + -1.588410702907331, + -1.648699088585948 + ], + "(9, 5, 7, 4, 5)": [ + -0.7491030443918945, + -1.1139415458830368, + -1.8578586484899045 + ], + "(6, 6, 6, 4, 5)": [ + -1.5537951324726311, + -1.3328314248227664, + -0.922546654827749 + ], + "(7, 3, 5, 4, 4)": [ + -0.9655543181730533, + -0.6852339679586998, + -1.0911454906057996 + ], + "(8, 4, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 4, 2, 4)": [ + -2.3310099718781006, + -1.891256428718345, + -1.683487053320208 + ], + "(10, 3, 1, 2, 4)": [ + -2.7444250235651237, + -3.963689922797043, + -2.1181516539718164 + ], + "(9, 3, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 7, 5, 5)": [ + -2.424331753185488, + -3.472979679514566, + -4.280440455873643 + ], + "(7, 6, 5, 7, 5)": [ + -1.516799747719921, + -1.9589735056649118, + -2.489353847697682 + ], + "(10, 3, 7, 5, 4)": [ + -1.2381147085445865, + -1.8488384334019015, + -2.110620447549417 + ], + "(8, 3, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 8, 5, 4)": [ + -4.423535539152631, + -5.698989511557013, + -3.355979658516278 + ], + "(8, 6, 6, 2, 4)": [ + -2.0904625580651177, + -1.1346860467103792, + -1.9309338672956904 + ], + "(6, 3, 6, 5, 4)": [ + -0.8105005566961223, + -0.6644233247398458, + -0.9641216068439077 + ], + "(9, 5, 6, 4, 4)": [ + -0.8297822370229312, + -0.7717627481958684, + -0.8266920313992332 + ], + "(7, 2, 8, 3, 4)": [ + 0.0, + 0.0, + -2.830385565306424 + ], + "(7, 7, 8, 5, 5)": [ + -5.280767850190351, + -4.6595209594608455, + 0.0 + ], + "(7, 3, 1, 5, 5)": [ + -1.4231415755583476, + -1.298027973880168, + -1.4464938310230666 + ], + "(8, 3, 1, 5, 4)": [ + -2.3879539467718667, + -1.4143326442834576, + -2.663745233885946 + ], + "(9, 4, 4, 6, 5)": [ + -0.5532889776910634, + -0.6593918674143768, + -1.0295684871883637 + ], + "(6, 3, 6, 6, 5)": [ + -0.8306687493137218, + -1.3355409766914432, + -1.8410017825895846 + ], + "(6, 4, 9, 7, 5)": [ + -1.7341255134332132, + -1.5933925579997639, + -1.7210900128559667 + ], + "(8, 6, 7, 4, 5)": [ + 0.0, + 0.0, + -1.9025357661399926 + ], + "(7, 4, 5, 3, 4)": [ + -0.761413231576814, + -0.4453068639070241, + -0.3768154581557453 + ], + "(6, 5, 2, 4, 5)": [ + -1.1088902741987154, + -0.619000407233111, + -0.41663710340685084 + ], + "(7, 4, 0, 2, 4)": [ + -1.6413496783411028, + -1.7041970851929513, + -1.6609724749445387 + ], + "(8, 5, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 4, 3, 4)": [ + -1.313998483401167, + -1.280332505231936, + -0.7434731857979135 + ], + "(6, 3, 2, 2, 4)": [ + -2.1812295712004945, + -1.5690582255420016, + -3.100627600164105 + ], + "(10, 6, 7, 6, 5)": [ + -2.6242997419026386, + -3.0799150253950307, + -2.4770371167172027 + ], + "(10, 3, 9, 2, 4)": [ + 0.0, + 0.0, + -3.228475063971064 + ], + "(7, 2, 9, 3, 4)": [ + 0.0, + -3.0105647481341835, + 0.0 + ], + "(10, 5, 8, 4, 5)": [ + -2.9532672817560854, + 0.0, + -5.636371817938517 + ], + "(9, 3, 5, 7, 5)": [ + -1.3577135850471147, + -2.5710262782044326, + -2.444010294740441 + ], + "(7, 6, 8, 4, 4)": [ + -1.3579310192906051, + -1.4327024688087606, + -1.3555115818477428 + ], + "(6, 3, 6, 4, 4)": [ + -0.7170418178548607, + -0.8312467955356829, + -0.9747711572286437 + ], + "(7, 6, 5, 5, 5)": [ + -0.897626335985448, + -0.6921141245676825, + -0.9120502060080183 + ], + "(9, 4, 6, 2, 4)": [ + -0.9617915814508896, + -1.0020235508190747, + -0.5184697088485373 + ], + "(9, 5, 0, 1, 4)": [ + -3.3790850225864384, + -2.535540696198043, + -3.1195041816809934 + ], + "(9, 4, 5, 5, 4)": [ + -0.44880909703756433, + -0.6552638644986379, + -0.6971902660605612 + ], + "(7, 6, 6, 5, 5)": [ + -0.8559451295201111, + -1.113582996550139, + -1.0042416436509742 + ], + "(9, 7, 6, 7, 5)": [ + 0.0, + -4.9870747068761485, + 0.0 + ], + "(8, 2, 9, 8, 5)": [ + -6.190982205786843, + 0.0, + 0.0 + ], + "(9, 3, 6, 2, 4)": [ + -1.3895840772708181, + -2.0990902576679247, + -2.0401968745883745 + ], + "(7, 6, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 2, 3, 4)": [ + -1.7019515211933427, + -1.3142239783173881, + -0.9379037637518968 + ], + "(9, 4, 5, 6, 5)": [ + -0.6217288321660187, + -0.9388445532477545, + -1.02631125872378 + ], + "(6, 4, 0, 3, 4)": [ + -1.877265613165054, + -1.720883644665042, + -1.4398271753416398 + ], + "(10, 6, 3, 4, 4)": [ + -3.703420661874362, + -2.539659523852925, + -1.3421468555403973 + ], + "(6, 2, 1, 3, 4)": [ + -5.140204355881418, + -5.796869397603261, + 0.0 + ], + "(10, 6, 0, 3, 5)": [ + -4.578765474177263, + 0.0, + -3.473345068082128 + ], + "(10, 5, 2, 7, 5)": [ + -1.3684641509858524, + -1.456803306153484, + -1.6245634710335928 + ], + "(7, 3, 5, 6, 5)": [ + -0.6795203699930162, + -1.2613840986863942, + -1.393473614739797 + ], + "(6, 6, 2, 7, 5)": [ + -1.1403070472894539, + -1.33009707965531, + -1.8607872342775662 + ], + "(7, 6, 5, 2, 4)": [ + -3.222732356764886, + -2.4474657971077343, + -1.6225969109419012 + ], + "(10, 4, 1, 1, 4)": [ + -2.784900635835473, + 0.0, + 0.0 + ], + "(9, 3, 0, 1, 4)": [ + -3.104760038171698, + -2.773681541929657, + -4.036503797457761 + ], + "(10, 3, 9, 6, 4)": [ + -5.116295280910858, + -5.394824858783272, + -3.6946692246238877 + ], + "(9, 6, 1, 5, 4)": [ + -3.581766485092822, + -1.6525538188346443, + -2.184656582896046 + ], + "(6, 6, 1, 5, 4)": [ + -2.8165709331556386, + -2.570351650125316, + -1.54618920976066 + ], + "(8, 5, 2, 5, 5)": [ + -0.6896177050258593, + -0.566031763691572, + -0.4521616498151489 + ], + "(8, 4, 4, 5, 5)": [ + -0.48036129416890233, + -0.43148062620535005, + -0.471812555567267 + ], + "(8, 4, 5, 6, 5)": [ + -0.3514470172912859, + -0.539850831843255, + -0.8526587341096925 + ], + "(8, 5, 7, 5, 4)": [ + -0.4143365585035338, + -0.5885963983580641, + -0.6786548428095325 + ], + "(8, 5, 8, 5, 4)": [ + -0.6450481375947402, + -1.1654237319702123, + -1.178223501775398 + ], + "(10, 3, 6, 7, 5)": [ + 0.0, + -4.0786687105048305, + -4.014355585679935 + ], + "(10, 6, 9, 6, 4)": [ + -4.090392709618545, + -3.3117242833945726, + -4.999499181159705 + ], + "(8, 2, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, 8, 5, 5)": [ + -0.7422111516563957, + -0.9243362450118668, + -1.1031434364226658 + ], + "(9, 6, 1, 7, 5)": [ + -2.360053766588402, + -2.220807271163463, + -1.3425101719701917 + ], + "(10, 4, 3, 7, 5)": [ + -1.8476274746093708, + -1.6737502849382333, + -1.6396447304155313 + ], + "(9, 3, 8, 8, 5)": [ + -2.6164608530089812, + -4.340325732676855, + -6.170353963103715 + ], + "(8, 3, 8, 8, 5)": [ + -3.074726012766596, + -3.949962310815791, + -5.205116276988796 + ], + "(7, 6, 4, 5, 4)": [ + -0.9086449184252291, + -0.7624428147021953, + -0.618536555877846 + ], + "(7, 2, 5, 5, 4)": [ + -2.0312063237502462, + -3.418362063306476, + -4.539093479826011 + ], + "(8, 6, 8, 2, 4)": [ + -1.648991280019058, + -2.2844633569809636, + -1.3026827579456437 + ], + "(8, 3, 5, 4, 5)": [ + -1.3244342190514957, + -1.0464561859593575, + -1.88123286731181 + ], + "(8, 6, 3, 6, 5)": [ + -1.5918926447039, + -1.0997363818422867, + -1.253224387397429 + ], + "(8, 6, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 3, 5, 4)": [ + -1.675661603159284, + -1.3072420711565473, + -1.762649788336793 + ], + "(6, 3, 7, 5, 5)": [ + -0.8536121824910065, + -1.0966563377507392, + -1.217441227447951 + ], + "(7, 7, 9, 7, 5)": [ + 0.0, + 0.0, + -6.302977586322067 + ], + "(10, 3, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 4, 7, 5)": [ + -0.8634045254978322, + -2.435384567934566, + -1.8005088496705461 + ], + "(7, 3, 5, 2, 4)": [ + -1.4620250452523522, + -1.276674575432045, + -0.9687698015052869 + ], + "(8, 4, 2, 5, 5)": [ + -0.632358129131279, + -0.501670908532482, + -0.5641745670928351 + ], + "(8, 5, 3, 5, 4)": [ + -1.123423330620746, + -0.5917112442630788, + -0.8859069009858954 + ], + "(8, 6, 3, 5, 4)": [ + -2.166497981231683, + -1.910059406783023, + -1.0473029385030104 + ], + "(7, 4, 7, 6, 5)": [ + -0.5397267848778868, + -0.8525408659872445, + -1.0860615880945372 + ], + "(6, 6, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 2, 1, 6, 5)": [ + 0.0, + 0.0, + -3.106224894157176 + ], + "(10, 3, 1, 7, 5)": [ + -3.722581502713953, + -2.7936279974400127, + -3.7413758737171197 + ], + "(8, 7, 4, 6, 5)": [ + -3.726609189159981, + -2.643266020449881, + 0.0 + ], + "(9, 2, 8, 7, 5)": [ + -4.564275211013816, + 0.0, + -6.322453433408311 + ], + "(10, 6, 7, 3, 4)": [ + -1.712793493544656, + -2.321351861047246, + -3.292169817411052 + ], + "(7, 2, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 5, 4, 4)": [ + -0.8360613191150345, + -0.81769383987189, + -0.6668781265690609 + ], + "(9, 5, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 4, 6, 5)": [ + -0.6743879402213369, + -0.8229832289426326, + -1.2048919783807184 + ], + "(7, 6, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 7, 7, 5)": [ + -3.0641675927283414, + -5.305894648633316, + -4.215634424246896 + ], + "(10, 6, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 2, 8, 4, 4)": [ + -3.167679156393185, + 0.0, + 0.0 + ], + "(10, 6, 6, 2, 4)": [ + 0.0, + -1.9610188521677645, + 0.0 + ], + "(6, 6, 4, 2, 4)": [ + -3.5238310814945253, + -1.4833662537671943, + -2.8851650254456542 + ], + "(10, 6, 2, 2, 4)": [ + -2.9313019568196643, + -4.1736474202948175, + -4.315070677364634 + ], + "(10, 5, 6, 7, 5)": [ + -1.4345784838196085, + -2.219536799225218, + -2.847625538978597 + ], + "(8, 4, 3, 4, 4)": [ + -0.6606707782692696, + -0.6627422575335562, + -0.5660585772509327 + ], + "(8, 5, 2, 4, 4)": [ + -0.8139492708571365, + -0.6900540487635323, + -0.5533911396986005 + ], + "(7, 4, 1, 3, 4)": [ + -1.3547073569538064, + -1.450056253047823, + -1.1063544757003776 + ], + "(6, 5, 0, 5, 5)": [ + -1.9781893745107637, + -1.1410911271548052, + -1.359962658177934 + ], + "(7, 5, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 7, 5, 5)": [ + -1.001632912672253, + -1.2882337860229731, + -1.3574345273810469 + ], + "(7, 2, 8, 6, 5)": [ + -4.42519109551025, + -5.66384521170269, + -6.0050969671148735 + ], + "(6, 7, 9, 6, 5)": [ + -6.587415247530657, + 0.0, + 0.0 + ], + "(8, 2, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 5, 4, 2, 4)": [ + -1.4279996608130974, + -1.3152141350140902, + -0.9205221719550284 + ], + "(8, 3, 8, 2, 4)": [ + -1.2389087910584324, + -1.7522100806082326, + -1.527103283003333 + ], + "(6, 3, 9, 3, 4)": [ + -1.4456214857536978, + -2.7911386887440344, + -3.2915297915405324 + ], + "(10, 6, 5, 4, 4)": [ + -1.5042536111152305, + -2.1499837036429046, + -2.4167151269558333 + ], + "(8, 3, 3, 6, 5)": [ + -1.9126911519750271, + -0.8794767352094581, + -1.7291441609096523 + ], + "(10, 6, 4, 5, 4)": [ + -2.9936515729668494, + -2.8117313905117145, + -1.7020278256507502 + ], + "(7, 2, 0, 2, 4)": [ + -4.128508347841851, + -5.5553664311129705, + 0.0 + ], + "(6, 6, 3, 6, 5)": [ + -1.216851329522577, + -0.6952739038967234, + -1.2680875282949184 + ], + "(7, 3, 7, 7, 5)": [ + -2.0694192875635666, + -1.48156613553373, + -2.2426058275706016 + ], + "(7, 6, 9, 6, 4)": [ + -3.1418342771131145, + -3.5892544236234407, + -2.025492702849257 + ], + "(6, 6, 6, 4, 4)": [ + -0.8692962861472917, + -0.7980190973917428, + -0.7528362455704517 + ], + "(8, 3, 4, 3, 4)": [ + -1.4765905507985622, + -1.457061523344776, + -1.129367116289134 + ], + "(6, 2, 2, 5, 5)": [ + -4.196634969616097, + -4.247710092504365, + -2.996754562408449 + ], + "(6, 3, 3, 3, 4)": [ + -3.571616328616198, + -1.724605129620957, + -1.5744386704011555 + ], + "(7, 6, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 7, 4, 4)": [ + -1.0254401218589864, + -0.9631720844685598, + -1.1854695081027464 + ], + "(7, 2, 9, 7, 5)": [ + -3.280038269802391, + -6.144339624814081, + 0.0 + ], + "(7, 6, 3, 6, 5)": [ + -1.5211010474098685, + -1.143083101036132, + -1.100453259121509 + ], + "(10, 6, 5, 2, 4)": [ + -3.948006967263145, + -4.042190783416416, + -3.11024253384044 + ], + "(6, 2, 0, 2, 4)": [ + -3.990002675638423, + -5.560745479341126, + -5.253253248536189 + ], + "(7, 3, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 5, 6, 2, 4)": [ + -1.2007549661202832, + -1.0010766427112754, + -0.6338834008014996 + ], + "(7, 3, 3, 3, 4)": [ + -1.7126236851804322, + -2.603632471670023, + -1.3445553886731563 + ], + "(10, 4, 2, 4, 5)": [ + -1.9698320983008317, + -1.912643390468109, + -1.6828145256024083 + ], + "(9, 3, 2, 7, 5)": [ + -1.9943407242108677, + -1.3252656491209338, + -1.6499189789468969 + ], + "(10, 3, 6, 4, 4)": [ + -1.2840043477438003, + -2.360636336973037, + -1.986458459387412 + ], + "(9, 3, 4, 4, 5)": [ + -1.77013305861645, + -1.3054993854736117, + -1.641310767660177 + ], + "(10, 5, 4, 4, 5)": [ + -2.331113781340328, + -1.0739775076730285, + -1.9893772142274853 + ], + "(9, 6, 3, 4, 5)": [ + -1.4328351009215756, + -2.8127413678332767, + -2.903530512618394 + ], + "(6, 6, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 4, 3, 4)": [ + -1.4631072517880535, + -1.4680724547820225, + -0.7295240695929207 + ], + "(7, 6, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 5, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 3, 6, 5)": [ + -0.6814826734612912, + -1.9064014642928921, + -1.658176665118171 + ], + "(9, 5, 3, 3, 4)": [ + -1.230619031444196, + -1.0492214399212403, + -0.7979653948957849 + ], + "(8, 3, 4, 2, 4)": [ + -1.1451110994593594, + -1.6893163349219156, + -1.9859706515831586 + ], + "(6, 6, 2, 4, 5)": [ + -1.7111875659174944, + -0.9779802603539047, + -1.4412559616246488 + ], + "(10, 6, 9, 3, 4)": [ + -2.7860147679468317, + -4.075164417715054, + -4.8235530073982975 + ], + "(6, 7, 8, 2, 4)": [ + 0.0, + 0.0, + -3.83467226003115 + ], + "(7, 3, 6, 3, 4)": [ + -1.508560287286318, + -0.7565877170609046, + -1.0820131323313467 + ], + "(10, 3, 5, 4, 5)": [ + 0.0, + -2.0980303075346383, + 0.0 + ], + "(8, 6, 4, 4, 5)": [ + -1.3159242794775452, + -1.4643069621448361, + -0.6834459620052973 + ], + "(8, 3, 6, 3, 4)": [ + -0.9213351998985269, + -1.4811984120536623, + -1.3231132636179883 + ], + "(8, 6, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 2, 3, 5, 5)": [ + -4.004761735999673, + 0.0, + -3.9872431063867593 + ], + "(10, 6, 7, 7, 5)": [ + -2.2959019048621507, + -3.4391691806928772, + -2.976565848059743 + ], + "(7, 7, 8, 7, 5)": [ + -6.162856468029872, + 0.0, + 0.0 + ], + "(7, 2, 9, 6, 4)": [ + -6.141183180486175, + 0.0, + 0.0 + ], + "(7, 3, 7, 2, 4)": [ + -1.0865484647179615, + -2.158834499104576, + -2.7993685760959415 + ], + "(8, 6, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 6, 0, 7, 5)": [ + -3.4312890844231503, + -1.8582460676791195, + -2.7928819029089085 + ], + "(8, 6, 1, 7, 5)": [ + -1.79967855060245, + -1.182974558780482, + -1.4413298832651373 + ], + "(7, 3, 6, 7, 5)": [ + -1.9956277371754099, + -1.4926349974975706, + -1.9640547060675204 + ], + "(6, 6, 8, 3, 4)": [ + -0.915569205616532, + -1.2819472790888153, + -1.6500597987727674 + ], + "(7, 3, 4, 3, 4)": [ + -1.5271568419022383, + -1.4387850572889962, + -1.1404406702089405 + ], + "(7, 6, 8, 6, 4)": [ + -4.559921262016509, + -3.537137652131965, + 0.0 + ], + "(8, 2, 9, 6, 5)": [ + -6.035703220232156, + -5.973884001337183, + 0.0 + ], + "(6, 3, 0, 3, 5)": [ + -4.693205798667159, + -2.3263011779675447, + -3.342566249634832 + ], + "(6, 6, 5, 5, 4)": [ + -0.8721179905640857, + -0.6488272064384721, + -0.8455233563610707 + ], + "(9, 4, 1, 5, 4)": [ + -1.9532997203048819, + -1.2146282317409132, + -1.3821120762888692 + ], + "(8, 4, 3, 2, 4)": [ + -1.1307864088903536, + -0.9996224995151566, + -1.1157228276276978 + ], + "(7, 5, 0, 2, 4)": [ + -1.7311272872172931, + -1.6985450372719757, + -1.571116217813544 + ], + "(7, 4, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 4, 5, 4)": [ + -0.7881668798272974, + -0.9440694859168861, + -0.7425811894463705 + ], + "(7, 6, 5, 5, 4)": [ + -1.1730039334132276, + -0.7043712619188999, + -1.1310532676502234 + ], + "(8, 3, 5, 7, 5)": [ + -1.1338033013880455, + -2.3767217505811455, + -2.5627932673550724 + ], + "(9, 6, 3, 6, 5)": [ + -1.3776784880560105, + -1.3081221532363738, + -1.4303826466361913 + ], + "(8, 7, 0, 4, 4)": [ + -5.8876585978127025, + 0.0, + -4.580130012980003 + ], + "(7, 5, 2, 6, 5)": [ + -0.6261496222178444, + -0.5597408377028783, + -0.4655273437610883 + ], + "(8, 4, 5, 7, 5)": [ + -1.2257726093873083, + -1.6587228663547933, + -1.0728511432483216 + ], + "(7, 5, 9, 5, 4)": [ + -1.2828438881551933, + -1.4597805125791654, + -1.5081237247057322 + ], + "(8, 6, 0, 1, 4)": [ + -3.588830590388253, + -4.392642161525232, + -2.423926522758759 + ], + "(7, 3, 0, 6, 5)": [ + -2.74032125448475, + -2.315871584657873, + -1.5661275041227856 + ], + "(7, 7, 9, 6, 5)": [ + -6.13520160159486, + 0.0, + -3.9791627837250534 + ], + "(8, 3, 2, 7, 5)": [ + -0.912983607953353, + -1.4365445189913408, + -1.5318004805896432 + ], + "(8, 6, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 9, 3, 4)": [ + -2.344739151781049, + -4.04819500904111, + -3.6297381466613206 + ], + "(10, 3, 5, 2, 4)": [ + -2.1070447048376857, + -3.794238664541237, + -1.9701499840120498 + ], + "(7, 6, 0, 1, 4)": [ + -4.392453441482817, + 0.0, + 0.0 + ], + "(10, 6, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 1, 1, 4)": [ + -3.036169895494412, + 0.0, + -4.54153766953793 + ], + "(9, 6, 0, 6, 5)": [ + -2.8227931910520616, + -1.9935079831069336, + -1.800763703439078 + ], + "(8, 6, 0, 6, 5)": [ + -3.6858049665320105, + -2.559067295557584, + -1.4554203286658745 + ], + "(7, 3, 1, 6, 5)": [ + -2.409736867192505, + -2.0725951720833424, + -0.9476857424955312 + ], + "(6, 6, 5, 7, 5)": [ + -1.5167649416849354, + -1.6465573081510239, + -2.1986105121773236 + ], + "(9, 6, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 7, 4, 5)": [ + -2.645330818696066, + -1.3847680267079063, + -1.332300697041429 + ], + "(7, 3, 6, 4, 5)": [ + -0.7940350461459494, + -1.273427696703459, + -1.990917884160293 + ], + "(10, 3, 2, 2, 4)": [ + -3.9183228632121336, + -2.950458453269989, + -4.317988421500603 + ], + "(10, 4, 1, 3, 5)": [ + -4.848751393023199, + -5.030001893628943, + -3.566328894857991 + ], + "(10, 3, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 2, 8, 6, 5)": [ + 0.0, + 0.0, + -5.338473573840837 + ], + "(6, 7, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 6, 7, 5)": [ + -4.501810550522907, + -2.737879163555053, + -1.8162336412288553 + ], + "(7, 6, 0, 6, 5)": [ + -3.6585845150691405, + -2.5273479607493368, + -1.495513971037956 + ], + "(8, 3, 4, 7, 5)": [ + -2.3249118397197206, + -3.0808931237323938, + -1.5103040834975527 + ], + "(10, 5, 8, 8, 5)": [ + -3.6846762184014437, + -4.30561285462322, + -4.724276744479867 + ], + "(9, 5, 6, 6, 5)": [ + -0.6845948271093055, + -1.0836581607818574, + -1.3052363424877809 + ], + "(6, 4, 4, 4, 4)": [ + -0.5554830120562484, + -0.44406996974889656, + -0.45970199907411 + ], + "(7, 5, 0, 3, 4)": [ + -2.537787359557523, + -1.641327914017335, + -2.3018916188794605 + ], + "(6, 2, 7, 5, 5)": [ + -4.25759777210781, + -4.969033547054608, + 0.0 + ], + "(8, 4, 8, 5, 4)": [ + -0.7248676962100775, + -0.8866390075458566, + -1.0554768017726979 + ], + "(7, 5, 7, 3, 4)": [ + -0.5294136858646334, + -0.3727923833156124, + -0.5025221394575384 + ], + "(8, 5, 6, 4, 4)": [ + -0.4340941961717362, + -0.4251532907665245, + -0.43933180006787487 + ], + "(7, 4, 7, 5, 5)": [ + -0.45344893666687697, + -0.5965891613704203, + -0.8277800134196238 + ], + "(8, 4, 7, 5, 5)": [ + -0.4118135143316769, + -0.6052284452309447, + -0.8196209032312831 + ], + "(8, 4, 5, 3, 4)": [ + -0.7364145323081085, + -0.5717070986107373, + -0.369148629607118 + ], + "(7, 4, 4, 3, 4)": [ + -0.8077510303829863, + -0.6252328549582007, + -0.4707259902798493 + ], + "(6, 4, 2, 5, 5)": [ + -0.6825834652210286, + -0.5816861016964716, + -0.422151558019997 + ], + "(7, 4, 7, 7, 5)": [ + -0.8647380844838467, + -1.3904583839416402, + -2.2043916151386442 + ], + "(8, 4, 8, 6, 5)": [ + -0.8995047916280021, + -1.1206091691787994, + -1.3313239056247617 + ], + "(7, 5, 8, 6, 5)": [ + -1.0727380485858653, + -1.2342113444249323, + -1.2517940501378781 + ], + "(9, 7, 0, 4, 5)": [ + 0.0, + 0.0, + -5.60422180802755 + ], + "(8, 2, 0, 4, 5)": [ + -4.742890385826431, + -5.965189815486799, + 0.0 + ], + "(6, 6, 9, 8, 5)": [ + -2.953482627713697, + -1.58150230787989, + -3.026090193332557 + ], + "(8, 2, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 0, 3, 4)": [ + -1.9750059816148113, + -1.7881444026005704, + -1.3824106040642847 + ], + "(9, 5, 9, 2, 4)": [ + -1.690493951197124, + -1.4081607913393455, + -1.521560299994678 + ], + "(7, 6, 8, 3, 4)": [ + -1.119352200206788, + -1.5790748778386932, + -1.8522921904669443 + ], + "(8, 3, 3, 2, 4)": [ + -2.7949194452418853, + -2.7166826822984795, + -1.513104602808842 + ], + "(9, 5, 3, 4, 5)": [ + -0.8519714326974286, + -0.8163100969124414, + -0.4985448926377864 + ], + "(6, 3, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 7, 3, 4)": [ + -1.1061128921755694, + -1.2167491390146719, + -0.8298048401286763 + ], + "(9, 2, 0, 3, 4)": [ + -5.953448428571852, + -6.88445442055262, + -6.259992942283328 + ], + "(8, 7, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 7, 2, 4)": [ + -2.253545669777914, + -1.47630248550753, + -1.6134670738754562 + ], + "(8, 6, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 8, 8, 5)": [ + -4.23187013271731, + -3.460589990985105, + -3.825585697673811 + ], + "(7, 3, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 1, 7, 5)": [ + -1.891819972923408, + -1.210352872336555, + -1.4963778235794272 + ], + "(9, 4, 7, 2, 4)": [ + -0.8290463787877814, + -0.8360481623759566, + -0.5585963625186974 + ], + "(6, 4, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 7, 1, 4, 4)": [ + -3.5066087574796088, + -3.0214088266046213, + -4.4119839021283935 + ], + "(10, 6, 1, 3, 4)": [ + -3.1964710880874745, + -2.9914089778897375, + -2.4490547278173747 + ], + "(7, 5, 7, 7, 5)": [ + -1.591697376828341, + -1.0197546848917933, + -1.567178182555102 + ], + "(9, 4, 8, 6, 4)": [ + -2.257185204839773, + -1.7136518594339532, + -2.4723961961900103 + ], + "(7, 4, 8, 5, 4)": [ + -0.7111451367447611, + -0.8486850344051244, + -0.9092944808252329 + ], + "(6, 5, 9, 6, 5)": [ + -1.4331468630612996, + -1.559994463523513, + -2.0224433829839676 + ], + "(8, 4, 9, 3, 4)": [ + -0.9195778622405111, + -1.4025365585080392, + -1.645372055496433 + ], + "(7, 4, 9, 2, 4)": [ + -0.7222499871140337, + -0.9515389467403834, + -1.3378052934587281 + ], + "(8, 4, 8, 2, 4)": [ + -0.545672860586043, + -1.1142690361592784, + -0.7881299075688316 + ], + "(8, 5, 7, 2, 4)": [ + -0.7036190732445496, + -0.4464637558355298, + -0.6048345296060914 + ], + "(6, 4, 0, 2, 4)": [ + -1.3235575987973067, + -1.6794395891170888, + -1.695246552309708 + ], + "(10, 3, 7, 4, 4)": [ + -1.900983280415028, + -2.8092195784849006, + -1.6375201766114629 + ], + "(6, 2, 7, 5, 4)": [ + -3.0881228789092776, + -3.9150410957025974, + -4.502123467772618 + ], + "(6, 6, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 2, 7, 5)": [ + -1.4895705937934907, + -1.2978988591194003, + -2.708352467308581 + ], + "(9, 5, 2, 5, 4)": [ + -1.5108954879458065, + -1.049199167087104, + -0.8009677247559278 + ], + "(10, 6, 6, 7, 5)": [ + -3.993439695764847, + -3.885772825475327, + 0.0 + ], + "(8, 4, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 5, 9, 6, 4)": [ + -1.9358820816340385, + -2.116083525922222, + -1.795896648320272 + ], + "(9, 4, 8, 2, 4)": [ + -0.7958213653749002, + -1.1347424211856179, + -1.096726220668213 + ], + "(9, 5, 1, 3, 5)": [ + -3.254024162601569, + -2.7366064218041783, + -1.4347422323707697 + ], + "(8, 4, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 3, 2, 4)": [ + -3.0176738747922736, + -2.350976826701516, + -1.5367436865767883 + ], + "(10, 3, 3, 2, 4)": [ + -4.029945240404142, + -3.165250170989633, + -3.880496456304871 + ], + "(10, 4, 0, 1, 4)": [ + -2.48239672151776, + -3.498026741368839, + -2.917554564218507 + ], + "(9, 6, 4, 4, 5)": [ + -1.3875445337579035, + -0.8699401467792444, + -2.082169631054561 + ], + "(6, 3, 2, 6, 5)": [ + -1.3469506702435268, + -1.1754602418433506, + -0.8725142087109579 + ], + "(6, 6, 1, 6, 5)": [ + -2.254735788494902, + -1.7416269161101818, + -0.8521654256633995 + ], + "(6, 5, 6, 5, 4)": [ + -0.4016148906557095, + -0.48186147593174405, + -0.5685751469727559 + ], + "(8, 5, 6, 5, 4)": [ + -0.34825176455451945, + -0.467491648166765, + -0.5962388701102256 + ], + "(7, 4, 5, 5, 4)": [ + -0.31644435775147334, + -0.2529355701081657, + -0.4015199565689965 + ], + "(7, 5, 9, 7, 5)": [ + -1.6192628199950556, + -1.6819051037987949, + -1.6133544856804798 + ], + "(9, 4, 0, 7, 5)": [ + -2.979739857015137, + -1.2695310270962785, + -2.1873903840459596 + ], + "(7, 6, 6, 5, 4)": [ + -1.062543087177841, + -0.8220357360512331, + -0.9790168212596253 + ], + "(8, 4, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 2, 7, 5)": [ + -3.0180971313909235, + -3.2467499022438835, + -3.4934647763559026 + ], + "(9, 6, 0, 1, 4)": [ + -2.571614614477704, + -3.4101297783508966, + -2.8691750659793662 + ], + "(9, 2, 4, 5, 5)": [ + -4.156777059521339, + -3.268554608740121, + -4.144330446989023 + ], + "(8, 7, 5, 5, 4)": [ + -3.0878413215278773, + -1.939255738704861, + -3.5735277434186106 + ], + "(6, 7, 4, 5, 5)": [ + -3.9564795729643247, + -3.714861823304522, + -4.057875830886147 + ], + "(10, 5, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 2, 6, 5)": [ + -3.346538574743338, + -3.4637263557600146, + -1.8744429342458564 + ], + "(6, 7, 8, 7, 5)": [ + -3.22583050333195, + -5.424062765232924, + -5.528048723949904 + ], + "(8, 2, 9, 7, 5)": [ + 0.0, + -6.508774166691554, + 0.0 + ], + "(8, 7, 6, 5, 4)": [ + -3.803807726957932, + -4.976999573033628, + -3.9771813367623965 + ], + "(8, 5, 4, 5, 4)": [ + -0.4404549764490954, + -0.3910535172534898, + -0.3589492029814555 + ], + "(8, 5, 5, 5, 5)": [ + -0.4989048122598263, + -0.41892773829117047, + -0.5378039485966732 + ], + "(7, 5, 9, 5, 5)": [ + -2.263312873757117, + -1.2760681313267532, + -2.194690906152641 + ], + "(7, 4, 9, 5, 5)": [ + -1.8217763550423671, + -1.119863365082894, + -2.082886597844992 + ], + "(8, 5, 9, 7, 5)": [ + -1.5995373378639368, + -1.7440571280382344, + -1.7654146016676908 + ], + "(7, 5, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 1, 5, 5)": [ + -5.110322195273952, + -4.1173961620868385, + -2.6321912670766876 + ], + "(6, 3, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, 7, 8, 5)": [ + -3.9644671044088646, + -4.17103470176931, + -3.8417339176303726 + ], + "(7, 6, 6, 6, 5)": [ + -1.2777544547688078, + -1.5598433559052536, + -2.5242827186156287 + ], + "(6, 6, 6, 3, 4)": [ + -1.838536790081135, + -1.0566640197243982, + -0.6941008314209396 + ], + "(7, 4, 2, 3, 4)": [ + -1.0166737844557805, + -0.8362739738057133, + -0.7277887095994916 + ], + "(8, 4, 1, 6, 5)": [ + -0.7082214094287196, + -0.5647360025501424, + -0.6178353945488344 + ], + "(8, 5, 3, 7, 5)": [ + -0.4626512474967253, + -1.1599924285331027, + -0.7077649339365611 + ], + "(7, 5, 5, 6, 5)": [ + -0.487299191848677, + -0.6298915552818162, + -0.802237375390431 + ], + "(9, 4, 9, 2, 4)": [ + -1.3993076679559069, + -2.7008992575238127, + -2.7308278891192206 + ], + "(8, 6, 5, 4, 5)": [ + -3.550839488316147, + -2.18090402452923, + -0.7739836138458389 + ], + "(8, 5, 5, 4, 5)": [ + -0.46322050122401026, + -0.4373919559815469, + -0.5747209479757067 + ], + "(8, 5, 5, 4, 4)": [ + -0.544766481262293, + -0.3957466202816899, + -0.32249116187505794 + ], + "(9, 7, 2, 5, 5)": [ + -4.19354227696083, + -4.158048853372638, + -3.760324143609986 + ], + "(7, 2, 7, 4, 4)": [ + -3.441728753992199, + -4.055720629705896, + -4.618965334673888 + ], + "(6, 7, 3, 2, 4)": [ + 0.0, + -2.9685937840381493, + 0.0 + ], + "(6, 6, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 9, 8, 5)": [ + -4.3937117488823, + -2.852368162404309, + -3.521680287524961 + ], + "(10, 6, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 6, 4, 4)": [ + -0.7458661478338232, + -0.9629439995463089, + -1.093509586279703 + ], + "(8, 7, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 8, 2, 4)": [ + -1.6650842045040182, + -1.5755202226188005, + -1.3433550873767397 + ], + "(9, 6, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 7, 0, 2, 4)": [ + -5.255581464571982, + -4.126074845512491, + -5.480073943023226 + ], + "(8, 6, 3, 4, 5)": [ + -2.2347463249329107, + -1.7168296038059263, + -0.7728729582304072 + ], + "(8, 7, 9, 5, 4)": [ + -5.460951723553183, + -5.802801255378004, + -5.466482153305046 + ], + "(6, 2, 9, 5, 4)": [ + -4.927105424457754, + -4.71773799896304, + 0.0 + ], + "(8, 6, 1, 1, 4)": [ + 0.0, + -2.544332094807739, + 0.0 + ], + "(8, 6, 5, 2, 4)": [ + -3.8040142915055135, + -2.784319916016901, + -1.1650075215874394 + ], + "(8, 5, 5, 3, 4)": [ + -0.7644709106857405, + -0.4647716086431914, + -0.5993744196930593 + ], + "(9, 4, 5, 2, 4)": [ + -1.2319660360611053, + -1.1929303053904177, + -0.7573909671720618 + ], + "(6, 3, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 5, 6, 5)": [ + -0.9637631285616302, + -1.2593238907488864, + -1.3798107148057586 + ], + "(9, 3, 3, 4, 5)": [ + -2.3330666951355377, + -2.747623384383655, + -1.3193467814738817 + ], + "(10, 6, 4, 2, 4)": [ + -5.018300904271049, + -4.147181691945994, + -2.975730299311293 + ], + "(7, 6, 3, 5, 4)": [ + -3.019572225007949, + -1.6807191375684323, + -0.654708762347403 + ], + "(8, 2, 9, 5, 5)": [ + 0.0, + -6.928647786878733, + -6.050663550234178 + ], + "(6, 7, 9, 7, 5)": [ + -4.223414176061923, + 0.0, + 0.0 + ], + "(10, 6, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 9, 6, 4)": [ + -3.7797633871517142, + -4.965797945048626, + -2.270956333043142 + ], + "(10, 6, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 2, 5, 5, 5)": [ + 0.0, + -4.095967402220744, + -4.939816412579294 + ], + "(7, 7, 7, 5, 5)": [ + -2.523418696380133, + 0.0, + 0.0 + ], + "(8, 2, 7, 5, 4)": [ + -3.4202094167556654, + 0.0, + -4.560106161525326 + ], + "(8, 2, 2, 2, 4)": [ + 0.0, + -4.853177030427377, + 0.0 + ], + "(7, 7, 0, 2, 4)": [ + 0.0, + -6.558844755714518, + 0.0 + ], + "(8, 5, 0, 3, 5)": [ + -2.21147958697262, + -1.59706111902538, + -1.9872221827088823 + ], + "(6, 6, 3, 5, 5)": [ + -0.9570159630846647, + -0.7994013773766695, + -0.7833507830223425 + ], + "(8, 7, 5, 3, 4)": [ + -4.436078101105599, + -3.7771863289265526, + 0.0 + ], + "(7, 2, 2, 4, 4)": [ + -4.961772142381504, + -3.385770100755864, + -4.719615166865032 + ], + "(7, 5, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 7, 2, 4)": [ + -2.2440646100914634, + -2.2257498637104978, + -0.9377469469479108 + ], + "(8, 6, 2, 7, 5)": [ + -1.3420058522058278, + -1.1509816006482394, + -1.1199366662915495 + ], + "(8, 4, 7, 8, 5)": [ + -1.3721406970294672, + -1.2932961521673996, + -4.04929939216157 + ], + "(8, 4, 8, 7, 5)": [ + -1.1029371300561135, + -1.477815056652224, + -1.5739253184796793 + ], + "(6, 2, 9, 5, 5)": [ + -5.805201450138445, + 0.0, + 0.0 + ], + "(7, 7, 9, 5, 4)": [ + -3.6046693944682335, + 0.0, + 0.0 + ], + "(9, 2, 9, 4, 4)": [ + 0.0, + 0.0, + -6.054634940643886 + ], + "(6, 6, 6, 5, 4)": [ + -0.7874572657768083, + -0.9677813854960459, + -0.9823258287901381 + ], + "(9, 3, 8, 4, 5)": [ + 0.0, + 0.0, + -4.010736660133464 + ], + "(9, 5, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 2, 5, 4)": [ + -1.7332054207638008, + -1.8049649624328548, + -1.3198121964203957 + ], + "(7, 4, 8, 4, 4)": [ + -0.5692208728933166, + -0.7429439630095706, + -0.8726574362241228 + ], + "(9, 4, 7, 4, 5)": [ + -2.4019180051882385, + -1.7703903311371727, + -1.1096071815274668 + ], + "(7, 5, 9, 6, 5)": [ + -1.4905452729210351, + -1.865076425600138, + -2.040145630459072 + ], + "(8, 5, 9, 4, 4)": [ + -1.0814219329160384, + -1.3079883069787455, + -1.4589408478152979 + ], + "(6, 6, 5, 2, 4)": [ + -2.6137140468194184, + -1.2555411561903407, + -3.151167437462864 + ], + "(6, 7, 6, 5, 4)": [ + -5.670180083812658, + -3.532436212429249, + 0.0 + ], + "(7, 2, 5, 4, 4)": [ + -3.6038724177062766, + -3.2502269110829873, + -3.9713388252023187 + ], + "(9, 5, 7, 2, 4)": [ + -0.8790008030418789, + -1.0353714115787542, + -0.7165067459711998 + ], + "(8, 6, 3, 7, 5)": [ + -1.4219886166112823, + -2.3192677585221784, + -2.5388084247586624 + ], + "(6, 6, 9, 6, 4)": [ + -3.5142850279587683, + -3.3220013789960845, + -2.0322361709509944 + ], + "(7, 3, 3, 2, 4)": [ + -3.1317523913504663, + -2.6374057268096016, + -1.486919059650212 + ], + "(8, 5, 0, 7, 5)": [ + -2.2305985109230884, + -1.176314924895343, + -1.7042969297103907 + ], + "(9, 5, 6, 6, 4)": [ + -2.7947233913136644, + -1.1819759809703978, + 0.0 + ], + "(7, 2, 9, 5, 5)": [ + -5.811630812103966, + 0.0, + 0.0 + ], + "(10, 4, 5, 2, 4)": [ + -2.1478845366834443, + -1.6214535695034447, + -1.1994639897414738 + ], + "(10, 3, 0, 1, 4)": [ + -4.5638844039977755, + 0.0, + 0.0 + ], + "(7, 2, 8, 4, 4)": [ + -3.445844170602691, + 0.0, + 0.0 + ], + "(6, 7, 5, 3, 4)": [ + 0.0, + -1.9634565479499637, + 0.0 + ], + "(6, 6, 4, 4, 4)": [ + -1.0201306057119734, + -0.7199215635456736, + -0.8291056855196537 + ], + "(8, 2, 5, 5, 5)": [ + -3.565997257050092, + -3.5884352776854587, + -4.079049419204133 + ], + "(6, 7, 3, 4, 4)": [ + -4.828499717747565, + -2.6018870154305827, + -3.606921919157028 + ], + "(7, 2, 2, 5, 5)": [ + -2.7985560903215725, + -3.6999996360523495, + -4.256864474307351 + ], + "(8, 3, 7, 7, 5)": [ + -1.3168497822078389, + -1.8846304289632392, + -1.8047802302087699 + ], + "(9, 2, 7, 5, 5)": [ + 0.0, + -5.1256543468203155, + -4.372506637428738 + ], + "(9, 7, 8, 5, 5)": [ + -4.92811577087793, + -5.0686229607265, + 0.0 + ], + "(7, 2, 8, 5, 4)": [ + -4.710217428603408, + 0.0, + -4.588526429161218 + ], + "(8, 2, 8, 5, 4)": [ + -3.9521951853811705, + 0.0, + -5.135185771608157 + ], + "(7, 5, 1, 5, 5)": [ + -0.9933003269010945, + -0.7944999333747358, + -0.6338450150769096 + ], + "(6, 5, 3, 5, 5)": [ + -0.5602593906094503, + -0.3818740051845129, + -0.3004843896275839 + ], + "(6, 4, 7, 6, 5)": [ + -0.6456215896755804, + -0.8964104481203689, + -1.132879043066782 + ], + "(8, 2, 4, 5, 5)": [ + -3.9780622259631837, + -3.6697936864703156, + -3.651927644236781 + ], + "(10, 3, 3, 6, 5)": [ + -2.9417122657630776, + -1.6257363869364727, + -3.5970248093522876 + ], + "(8, 2, 7, 5, 5)": [ + -4.558987851822911, + 0.0, + -4.85030069682208 + ], + "(10, 3, 8, 2, 4)": [ + -1.6858933336812028, + -1.9756596801189517, + -2.4333927685072845 + ], + "(6, 3, 6, 2, 4)": [ + -2.0544839203287566, + -1.2135192126369956, + -3.3612504908729046 + ], + "(7, 6, 8, 4, 5)": [ + 0.0, + 0.0, + -1.949793570517234 + ], + "(8, 3, 8, 4, 5)": [ + -2.927568334612669, + 0.0, + 0.0 + ], + "(8, 6, 6, 3, 4)": [ + -1.4379213296656925, + -1.063170561439127, + -0.8581662705740972 + ], + "(6, 6, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 7, 6, 4)": [ + -3.5247263253999357, + -2.2150167252150683, + -3.906672512284231 + ], + "(8, 2, 0, 3, 4)": [ + -5.363420670311555, + -5.912914862794418, + 0.0 + ], + "(7, 6, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 9, 6, 4)": [ + -2.2706504436165544, + -4.342932116980771, + -4.622793850811331 + ], + "(9, 5, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 3, 2, 4)": [ + -2.6272082961054006, + -2.2885242054741357, + -1.223449210485355 + ], + "(7, 3, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 3, 4, 5)": [ + -2.4485333860843177, + -1.9316965050903634, + -0.6476139988637633 + ], + "(8, 5, 1, 4, 5)": [ + -1.1133230670094367, + -0.9807320231636779, + -0.8147576328775181 + ], + "(7, 4, 1, 4, 4)": [ + -1.1286426423051026, + -1.0514527825841133, + -0.8023993668736772 + ], + "(7, 5, 1, 3, 4)": [ + -1.3764567209138807, + -1.1984504756237917, + -1.0174086520584338 + ], + "(6, 6, 9, 2, 4)": [ + 0.0, + -2.026784759264419, + -3.036788868499685 + ], + "(7, 2, 3, 6, 5)": [ + -4.013754410099324, + 0.0, + 0.0 + ], + "(8, 3, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, 5, 7, 5)": [ + -1.67135446173317, + -1.9522614635134163, + -0.8129548112279387 + ], + "(7, 5, 0, 3, 5)": [ + -4.006679354913346, + -2.7079459940910198, + -1.5225409465524458 + ], + "(8, 5, 0, 6, 5)": [ + -1.146847730236356, + -1.398764185137915, + -1.323301380096683 + ], + "(8, 4, 1, 7, 5)": [ + -0.8577740078979974, + -0.5240937856650478, + -1.0179288351247884 + ], + "(6, 4, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 3, 7, 5)": [ + -3.1871281963623277, + -1.3412552449889157, + -3.0187841764815073 + ], + "(8, 4, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 7, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 5, 0, 7, 5)": [ + -1.3931234599161033, + -2.0091440835608676, + -2.188520125004599 + ], + "(9, 3, 4, 8, 5)": [ + -3.2155835158921153, + -1.988083496359196, + -5.131025108952082 + ], + "(9, 3, 9, 7, 4)": [ + 0.0, + 0.0, + -3.404928767416022 + ], + "(6, 3, 0, 7, 5)": [ + -2.92098893289438, + -2.2914516164028456, + -2.6301397880113733 + ], + "(6, 5, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 5, 7, 5)": [ + -2.193718887072428, + -3.217026956325824, + -4.007241893084856 + ], + "(10, 3, 4, 6, 5)": [ + -2.2914419161287807, + -2.424088268432529, + -1.669667270722329 + ], + "(6, 3, 6, 7, 5)": [ + -1.2399455204125849, + -3.880491282106103, + -3.100196571610466 + ], + "(6, 6, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 7, 6, 5)": [ + 0.0, + -4.910985506730549, + 0.0 + ], + "(6, 7, 7, 3, 4)": [ + -5.731304775483458, + -3.8994708506606255, + -3.538932950037709 + ], + "(10, 3, 5, 3, 4)": [ + -3.148317856537124, + -2.0313218677722347, + -1.3963258258063056 + ], + "(8, 2, 4, 4, 4)": [ + -4.332839303282847, + -4.046278165651349, + -3.9310842161595376 + ], + "(10, 6, 2, 4, 5)": [ + -2.4401736652341572, + -3.0103340227309925, + -2.5913018031440007 + ], + "(8, 4, 6, 5, 4)": [ + -0.3089162882386224, + -0.4512487664744723, + -0.6128604496158231 + ], + "(8, 4, 4, 7, 5)": [ + -0.4317236435859281, + -1.0828804174824112, + -2.60253071147989 + ], + "(7, 4, 5, 6, 5)": [ + -0.3520638214985964, + -0.5109486626461083, + -0.7355198891808843 + ], + "(9, 5, 3, 7, 5)": [ + -0.7647233571715809, + -1.0540980969393736, + -1.0834825378887423 + ], + "(7, 6, 9, 2, 4)": [ + -2.1192866707531723, + -2.6380579467562013, + -4.359283702215143 + ], + "(9, 3, 2, 1, 4)": [ + -5.827408415693402, + 0.0, + 0.0 + ], + "(8, 2, 6, 5, 5)": [ + -4.151270209253633, + -4.1596603428889125, + 0.0 + ], + "(6, 7, 8, 6, 5)": [ + -4.638292392812417, + 0.0, + -2.7810319084163595 + ], + "(10, 6, 4, 6, 5)": [ + -3.6790788895329314, + -1.5239442142434643, + -2.1638908828826624 + ], + "(7, 4, 8, 7, 5)": [ + -1.3554532283485203, + -1.2276310396985708, + -1.5300422413946688 + ], + "(6, 5, 7, 3, 4)": [ + -0.5621862429615373, + -0.42194079959379555, + -0.6632455223538863 + ], + "(8, 5, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 7, 8, 3, 4)": [ + -2.538966961522396, + 0.0, + 0.0 + ], + "(10, 6, 7, 2, 4)": [ + -1.7612166321922864, + -2.2294056209907898, + -2.2501494159374826 + ], + "(8, 2, 3, 3, 4)": [ + 0.0, + -4.850703677050309, + -4.127793027491765 + ], + "(9, 6, 6, 4, 5)": [ + -2.460360466725592, + -1.1107158124191538, + 0.0 + ], + "(10, 4, 6, 4, 5)": [ + -2.181342466803796, + 0.0, + -2.7957076378599917 + ], + "(9, 5, 6, 3, 4)": [ + -0.7790966796577203, + -0.7260048182156165, + -0.5693137274236936 + ], + "(6, 7, 7, 7, 5)": [ + -5.356068470139473, + 0.0, + 0.0 + ], + "(7, 3, 0, 1, 4)": [ + -3.64592891022444, + -4.126172505935965, + -3.6258726291544914 + ], + "(8, 7, 3, 4, 4)": [ + -3.8661625065966105, + -4.6411039840865485, + -3.3201859017400484 + ], + "(6, 2, 1, 4, 4)": [ + -4.5218536460605945, + -5.818405950701024, + 0.0 + ], + "(7, 3, 3, 5, 4)": [ + -3.150401987946438, + -2.707473300996315, + -1.0065378803390683 + ], + "(6, 2, 8, 5, 5)": [ + -4.486013310585304, + -4.595446451181454, + -4.618913789526263 + ], + "(7, 6, 3, 4, 4)": [ + -1.3887323562847733, + -1.0283123573002686, + -0.7251467772564247 + ], + "(8, 3, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 4, 8, 4, 5)": [ + -2.658396534054063, + -0.9012511346161242, + -3.752095814311759 + ], + "(10, 6, 1, 5, 4)": [ + -5.032866354650568, + 0.0, + 0.0 + ], + "(6, 2, 8, 5, 4)": [ + -3.841576418166767, + -4.376686200545364, + -4.66180990866201 + ], + "(10, 3, 0, 3, 5)": [ + -5.225120895562872, + -6.115096230788973, + -4.737840617632477 + ], + "(7, 2, 7, 3, 4)": [ + -3.6139833006442665, + 0.0, + -2.459658043668941 + ], + "(8, 3, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, 6, 7, 5)": [ + -0.7802671825181566, + -2.0196243919698085, + -1.9010852016753186 + ], + "(7, 7, 3, 5, 5)": [ + -4.083752579264173, + -4.06252573950156, + 0.0 + ], + "(9, 3, 5, 2, 4)": [ + -1.8093874670301515, + -1.676964697419396, + -1.7252609065886118 + ], + "(10, 3, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 7, 2, 5, 4)": [ + -4.647349795297198, + -4.337255730501738, + -4.356444158917318 + ], + "(9, 2, 1, 5, 5)": [ + 0.0, + -4.237344657288092, + -5.314478325122976 + ], + "(7, 7, 2, 5, 5)": [ + 0.0, + 0.0, + -2.3712641773435603 + ], + "(10, 3, 3, 3, 4)": [ + -4.520379229386007, + -1.878065090876885, + -2.482925004701452 + ], + "(9, 4, 3, 4, 5)": [ + -0.8956274707920772, + -0.5793009652135814, + -0.7485155244750729 + ], + "(9, 7, 8, 4, 4)": [ + 0.0, + -4.182338152688198, + 0.0 + ], + "(6, 7, 6, 4, 4)": [ + -5.5805549842822515, + -5.208477312445788, + -4.167301845927698 + ], + "(8, 2, 1, 5, 5)": [ + -4.4901489359718525, + -4.378427462735078, + -4.799730067974977 + ], + "(6, 6, 7, 7, 5)": [ + -2.4531115973073687, + -1.469215991876022, + -3.173603327796872 + ], + "(7, 3, 8, 2, 4)": [ + -2.5851833404556754, + -2.5431776783001343, + -1.4863889007206987 + ], + "(10, 6, 0, 1, 4)": [ + -3.856103893734218, + -4.370187185460048, + 0.0 + ], + "(7, 5, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, 8, 3, 4)": [ + -0.7772701128990129, + -0.5849136710784627, + -0.7369537218290777 + ], + "(8, 4, 6, 4, 5)": [ + -0.3141604937051357, + -0.5811433800384911, + -1.0056449688126905 + ], + "(8, 5, 4, 3, 4)": [ + -0.8640588003451314, + -0.49435238247234103, + -0.36122951354091176 + ], + "(8, 5, 3, 4, 5)": [ + -0.6923515934091866, + -0.5241198103545401, + -0.3231983301802833 + ], + "(6, 4, 1, 2, 4)": [ + -1.6649251335960495, + -1.2360205443648142, + -1.6145707459447758 + ], + "(6, 5, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 4, 5, 4)": [ + -3.7498199963359924, + 0.0, + -3.2517094009599345 + ], + "(10, 5, 3, 2, 4)": [ + -2.6521344273917515, + -2.5350277450819148, + -1.6456191884270974 + ], + "(9, 3, 5, 4, 5)": [ + -2.56447241311537, + -1.0041656665676513, + -2.350587010429858 + ], + "(10, 3, 5, 6, 5)": [ + -1.4669042491021114, + -2.9054754658274344, + -2.7733638198951582 + ], + "(8, 7, 1, 2, 4)": [ + -5.364797667351278, + -5.113306838442348, + -5.4215724740652815 + ], + "(6, 7, 0, 3, 4)": [ + -6.8480177178042085, + -4.8080827662021735, + 0.0 + ], + "(8, 5, 1, 4, 4)": [ + -1.2200525995433698, + -0.9538572377408042, + -0.7288283364058108 + ], + "(7, 3, 6, 2, 4)": [ + -3.937697799415193, + -0.9983647228850644, + -1.6659624271015738 + ], + "(6, 7, 0, 2, 4)": [ + -4.884491883302623, + -6.2508133971605195, + -6.2488868519673515 + ], + "(9, 3, 6, 4, 5)": [ + -3.0274998752289983, + -1.1986211779287177, + -2.412402217614111 + ], + "(6, 3, 3, 5, 5)": [ + -1.0347680869727764, + -0.8130163934355304, + -0.9004008143117043 + ], + "(8, 5, 7, 5, 5)": [ + -0.6236069359939693, + -0.6680531516340795, + -0.8571494117471269 + ], + "(7, 4, 0, 5, 5)": [ + -1.5244799146212755, + -1.5245725744025933, + -1.0025987029714987 + ], + "(8, 5, 2, 6, 5)": [ + -0.6026971147684888, + -0.4426371520315801, + -0.5223163090188226 + ], + "(8, 4, 7, 6, 5)": [ + -0.5998128798617702, + -0.8021792868864734, + -1.0875850920088903 + ], + "(7, 4, 7, 5, 4)": [ + -0.43232024165228233, + -0.5483992479710288, + -0.6842375472620078 + ], + "(7, 5, 6, 4, 4)": [ + -0.3054130717390084, + -0.39673747207840016, + -0.4086895179493968 + ], + "(9, 4, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 5, 7, 5)": [ + -3.9047159959013635, + -3.8131821426641994, + 0.0 + ], + "(9, 5, 6, 4, 5)": [ + -1.5850389029740006, + -0.6105967013388234, + -2.080471671389075 + ], + "(6, 4, 4, 3, 4)": [ + -0.7999852732836239, + -0.5094283589250181, + -0.3706145131869425 + ], + "(8, 4, 1, 4, 5)": [ + -1.0845916417764716, + -1.0619524176811, + -0.8640161474958219 + ], + "(10, 6, 3, 7, 5)": [ + -1.7371491864524378, + -4.74410918785203, + -2.133088073575835 + ], + "(10, 6, 6, 6, 5)": [ + -1.7871757709998994, + -4.567414046713443, + -4.0085326848542575 + ], + "(10, 3, 7, 3, 4)": [ + -2.8297137992562087, + -1.470598345853256, + -2.0701652875760157 + ], + "(7, 6, 1, 5, 4)": [ + -3.4832978997250104, + -2.563789650725881, + -1.578869281871055 + ], + "(8, 4, 0, 5, 5)": [ + -1.7650990698794848, + -1.1329159640592081, + -1.3706312313090916 + ], + "(6, 5, 0, 7, 5)": [ + -1.3639457535228623, + -2.0841049970113783, + -0.9177090581556042 + ], + "(7, 4, 2, 6, 5)": [ + -0.38388798684457703, + -0.3363730134691099, + -0.5345726397788121 + ], + "(8, 5, 2, 5, 4)": [ + -0.8671131393475693, + -0.6370132575245694, + -0.43305387683688434 + ], + "(7, 5, 3, 5, 4)": [ + -0.6213635298576738, + -1.0292527999303966, + -0.823213148330354 + ], + "(7, 4, 2, 5, 4)": [ + -0.6054768826800758, + -0.5670695605962, + -0.8913907095508923 + ], + "(8, 4, 2, 4, 4)": [ + -0.7814995865876662, + -0.767895778847946, + -0.6283646048388936 + ], + "(6, 5, 2, 4, 4)": [ + -0.9259670040026766, + -0.615712549162567, + -0.4943943222144208 + ], + "(6, 4, 1, 5, 5)": [ + -1.035031578064432, + -0.883911418384316, + -0.7165746105143226 + ], + "(6, 5, 2, 5, 5)": [ + -0.6495245192299951, + -0.5040908152162213, + -0.3645526039425208 + ], + "(6, 4, 6, 6, 5)": [ + -0.48106675189575754, + -0.7764118876960519, + -1.2254092540388568 + ], + "(7, 5, 8, 5, 4)": [ + -0.9118732334023006, + -0.7643633304998878, + -1.0424720568168826 + ], + "(8, 3, 9, 2, 4)": [ + -2.6671438464778863, + -1.559607073280423, + -3.0605093301295603 + ], + "(8, 5, 8, 4, 5)": [ + -1.058021927444253, + -0.8130308016567973, + -1.9173510425721567 + ], + "(7, 5, 8, 4, 4)": [ + -0.7060639456915208, + -0.7200612703357708, + -0.7893387480688554 + ], + "(6, 4, 4, 2, 4)": [ + -1.9522182048478038, + -1.3868157416087525, + -0.6082402712927695 + ], + "(8, 4, 6, 6, 5)": [ + -0.5398135673830826, + -0.6379665973870257, + -1.0212223299273533 + ], + "(10, 3, 4, 7, 5)": [ + -2.6534012132036455, + -1.9965793896316744, + -3.902602128020387 + ], + "(8, 7, 5, 5, 5)": [ + -2.6334683131028016, + -3.3653154864482095, + -3.068937263208707 + ], + "(6, 2, 5, 4, 4)": [ + -3.4996556101932956, + -2.1396906500767217, + -3.658475173881461 + ], + "(8, 5, 9, 6, 4)": [ + -2.401296184634439, + -1.5272251031999895, + -2.664712950421137 + ], + "(6, 6, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 2, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 7, 5, 5)": [ + -0.5141181242669723, + -0.7084034590641355, + -0.8275908320047431 + ], + "(7, 4, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 9, 3, 4)": [ + -1.8420713815362113, + -2.8012019158211556, + -2.83936858192219 + ], + "(8, 4, 3, 5, 5)": [ + -0.5605719935633823, + -0.51812480043399, + -0.3886497297222744 + ], + "(7, 4, 3, 5, 5)": [ + -0.5285812772103357, + -0.44282385406337355, + -0.3371160862153288 + ], + "(8, 5, 1, 2, 4)": [ + -1.536221775743702, + -1.3837215514100696, + -1.1839101271392678 + ], + "(9, 2, 8, 6, 5)": [ + 0.0, + 0.0, + -5.970954357664475 + ], + "(8, 7, 9, 8, 5)": [ + -4.7593707466658195, + 0.0, + 0.0 + ], + "(6, 7, 1, 5, 4)": [ + -5.677718938988102, + 0.0, + 0.0 + ], + "(9, 7, 1, 5, 4)": [ + -5.129957346890178, + 0.0, + 0.0 + ], + "(8, 7, 2, 5, 4)": [ + -5.32515863912038, + 0.0, + 0.0 + ], + "(9, 5, 4, 4, 5)": [ + -0.5741275230226562, + -0.5696565008361757, + -0.41062816976538147 + ], + "(8, 4, 8, 4, 5)": [ + -0.960301855269784, + -1.2294251428530718, + -3.085722108517512 + ], + "(8, 6, 0, 7, 5)": [ + -4.299234409762102, + -4.280077627221225, + -1.9478952676330419 + ], + "(7, 6, 4, 7, 5)": [ + -1.8748986126719722, + -1.2493745583431486, + -2.2645906394186737 + ], + "(6, 6, 8, 8, 5)": [ + -3.2379133396079753, + -4.259536090321494, + -4.5858501953579935 + ], + "(9, 2, 5, 4, 4)": [ + -4.144690919631099, + 0.0, + -4.69411143607017 + ], + "(7, 3, 3, 6, 5)": [ + -1.0510278146177632, + -0.7395642980899716, + -1.3937508901426634 + ], + "(7, 5, 5, 4, 4)": [ + -0.4760751810629734, + -0.3604705315528691, + -0.3205720698365244 + ], + "(6, 4, 2, 3, 4)": [ + -1.082121822524754, + -0.8973745290302768, + -0.6682035206036578 + ], + "(6, 4, 8, 5, 5)": [ + -0.7209444834931693, + -0.7877238658204575, + -1.107322271069267 + ], + "(6, 5, 8, 5, 4)": [ + -0.7810165372682778, + -0.9337315353915175, + -1.0582099845801456 + ], + "(6, 4, 8, 5, 4)": [ + -0.674817790596052, + -0.8049530863089523, + -0.8926415320821092 + ], + "(7, 4, 7, 3, 4)": [ + -0.5422261837270892, + -0.5324388996877827, + -0.6813271701400008 + ], + "(7, 5, 2, 2, 4)": [ + -1.249880175939187, + -0.9853332740789897, + -1.2730490708953714 + ], + "(7, 5, 1, 2, 4)": [ + -1.5200454216710826, + -1.3398335688641216, + -1.0983746346794727 + ], + "(7, 4, 0, 3, 5)": [ + -2.704473213472514, + -1.5491186093226477, + -2.49125849829587 + ], + "(8, 5, 2, 4, 5)": [ + -0.8103625220963423, + -0.685881302909956, + -0.5259329122639128 + ], + "(6, 5, 8, 7, 5)": [ + -1.9373530220847275, + -1.4042905428925785, + -1.4732640976634543 + ], + "(7, 5, 6, 3, 4)": [ + -0.5543675683484339, + -0.32586297952402704, + -0.29180374589315927 + ], + "(7, 3, 0, 7, 5)": [ + -4.140402382781571, + -2.1419877064409505, + 0.0 + ], + "(6, 3, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 9, 2, 4)": [ + -3.1238119248827023, + -3.06990408067458, + -2.829014116705416 + ], + "(6, 3, 7, 2, 4)": [ + -1.7280567372532682, + -0.9950238713876199, + -1.7282217341092398 + ], + "(7, 3, 0, 2, 5)": [ + -3.572512535356161, + 0.0, + 0.0 + ], + "(8, 4, 6, 4, 4)": [ + -0.3691329698113358, + -0.39909832594568445, + -0.4780621906644978 + ], + "(6, 4, 6, 4, 4)": [ + -0.20448817930086083, + -0.34792245516808334, + -0.40258571830351675 + ], + "(6, 5, 5, 4, 4)": [ + -0.35665686862082585, + -0.34895949953977157, + -0.28784559623454165 + ], + "(6, 4, 2, 4, 4)": [ + -0.9276127325542252, + -0.7172361461100909, + -0.6187174440030293 + ], + "(7, 5, 7, 5, 5)": [ + -0.5273637500782232, + -0.7086866076355542, + -0.8317556896206434 + ], + "(8, 4, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, 9, 8, 5)": [ + -2.3116971131254767, + -2.3782991356967598, + -1.6026417532221382 + ], + "(7, 6, 3, 3, 4)": [ + -1.829921387374455, + -1.1611276821137042, + -0.9906839653853748 + ], + "(7, 5, 7, 6, 5)": [ + -0.6814180725639892, + -0.8515282839909578, + -1.0411208846076079 + ], + "(7, 4, 8, 3, 4)": [ + -0.4862579521572027, + -0.688440840129535, + -0.7439519462859552 + ], + "(7, 4, 5, 5, 5)": [ + -0.25722458561015776, + -0.41002219000920703, + -0.5958755097655385 + ], + "(8, 5, 8, 7, 5)": [ + -1.2911379461935275, + -1.463247905965449, + -1.393175742836283 + ], + "(10, 6, 0, 5, 4)": [ + -5.4346196154190896, + 0.0, + 0.0 + ], + "(8, 4, 2, 6, 5)": [ + -0.5470229323273643, + -0.3576671696786421, + -0.5752880153062282 + ], + "(8, 5, 4, 6, 5)": [ + -0.32738856682147266, + -0.5486852813868455, + -0.7301203216680313 + ], + "(6, 4, 1, 5, 4)": [ + -2.4353427014136195, + -1.3545451847535386, + -1.948164307391012 + ], + "(6, 5, 4, 6, 5)": [ + -0.4521453138590785, + -0.4976243305840292, + -0.6498618488245235 + ], + "(8, 5, 6, 7, 5)": [ + -0.7091037674985243, + -1.8174857687122647, + -1.6419527943883612 + ], + "(9, 5, 2, 3, 5)": [ + -3.3493862338794393, + -1.3695918700708098, + -2.143359518256237 + ], + "(8, 6, 2, 3, 5)": [ + -4.051119802330442, + -3.976657064532982, + 0.0 + ], + "(6, 5, 2, 3, 4)": [ + -1.1509896033336824, + -0.7967156156034451, + -0.584245768582621 + ], + "(7, 2, 9, 6, 5)": [ + -5.50144571361057, + -6.0630841068662225, + 0.0 + ], + "(6, 7, 3, 5, 5)": [ + -4.136247362122223, + -3.710811678038685, + 0.0 + ], + "(6, 2, 5, 6, 5)": [ + 0.0, + -4.520633036426611, + 0.0 + ], + "(8, 3, 4, 8, 5)": [ + -2.4743507918689804, + -1.3007689009222756, + 0.0 + ], + "(8, 3, 0, 1, 4)": [ + -2.840689632757839, + -3.9138939698218214, + -5.671614809317772 + ], + "(6, 6, 0, 7, 5)": [ + -2.7710624195965816, + -2.612474252085557, + -2.9187771594508054 + ], + "(9, 4, 3, 8, 5)": [ + -1.265523634437205, + 0.0, + 0.0 + ], + "(8, 6, 9, 7, 4)": [ + -5.047538829576736, + -2.8484635179368656, + 0.0 + ], + "(9, 6, 9, 7, 4)": [ + -3.076739407952142, + -3.1052780572121934, + -3.4705355623845326 + ], + "(8, 6, 1, 3, 5)": [ + -2.1113070492000006, + -3.9270975356131386, + -4.219235208548968 + ], + "(7, 3, 7, 8, 5)": [ + -3.0732782317930036, + -3.941676341112263, + -5.000393892802884 + ], + "(10, 5, 3, 4, 5)": [ + -2.1166419441778, + -1.480452660143724, + -1.8457383082084917 + ], + "(8, 6, 6, 8, 5)": [ + 0.0, + 0.0, + -2.409672244449126 + ], + "(10, 6, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, 1, 4, 5)": [ + -1.2678319390076438, + -1.0125682911321132, + -0.834971203139819 + ], + "(7, 4, 4, 6, 5)": [ + -0.2683824264217627, + -0.4125645699398046, + -0.6945065241470519 + ], + "(7, 5, 4, 4, 4)": [ + -0.5482542713960638, + -0.4481193147136303, + -0.291082250641645 + ], + "(6, 5, 9, 5, 4)": [ + -1.1758216458362774, + -1.4823721276813422, + -1.4828710642105545 + ], + "(8, 4, 6, 3, 4)": [ + -0.6605012567004881, + -0.42566536207736977, + -0.46713738026613477 + ], + "(8, 4, 8, 6, 4)": [ + -1.237859806895681, + -2.909671961388738, + -3.353872243254511 + ], + "(6, 3, 1, 5, 4)": [ + -2.2256149382135466, + -2.3131030785374813, + -2.3913909911236773 + ], + "(6, 4, 9, 6, 4)": [ + -3.5555367771678523, + -2.821132335461176, + -1.624886612625296 + ], + "(6, 7, 4, 5, 4)": [ + -2.4177071753703023, + 0.0, + 0.0 + ], + "(10, 6, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 9, 7, 5)": [ + -1.769038759621842, + -1.753525001876005, + -1.4007192475905166 + ], + "(8, 2, 5, 6, 5)": [ + 0.0, + -4.274629354206613, + 0.0 + ], + "(10, 4, 7, 8, 5)": [ + -3.9206112368015607, + -6.920521192408477, + -4.023964102685184 + ], + "(8, 4, 2, 3, 4)": [ + -1.0919957440676544, + -0.8763898305635155, + -0.9546727363768797 + ], + "(6, 3, 7, 8, 5)": [ + -3.3648111266915994, + 0.0, + 0.0 + ], + "(7, 7, 1, 5, 5)": [ + -5.833542002956703, + -4.01923341394221, + -3.2725090593844177 + ], + "(7, 5, 3, 6, 5)": [ + -0.3878080858209765, + -0.4586127234386136, + -0.5874096601021213 + ], + "(6, 5, 5, 2, 4)": [ + -0.8400139973841689, + -1.9092635632661725, + -0.4872854780626123 + ], + "(8, 5, 2, 2, 4)": [ + -1.2054290629994515, + -1.0911104571301757, + -0.9405162123159121 + ], + "(7, 4, 5, 4, 4)": [ + -0.5130765653706311, + -0.3039837547383201, + -0.4078969968367359 + ], + "(6, 5, 1, 3, 4)": [ + -1.370598307088275, + -1.2140001036758652, + -0.9655178275278078 + ], + "(7, 7, 9, 5, 5)": [ + -6.3947783878056175, + 0.0, + 0.0 + ], + "(10, 3, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 3, 5, 2, 4)": [ + -2.1927851867859522, + -1.2788252044238424, + -2.1258171714340586 + ], + "(8, 4, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, 7, 3, 4)": [ + -0.4964459106389402, + -0.4704536480126022, + -0.5852632963543993 + ], + "(8, 5, 5, 2, 4)": [ + -0.9299480363073029, + -0.7633475296968253, + -0.9710512223810525 + ], + "(6, 5, 2, 2, 4)": [ + -1.5716385235785173, + -1.1071260533875635, + -1.660249276594277 + ], + "(6, 4, 0, 1, 4)": [ + -2.7788685361432557, + -2.541468781431365, + -1.9299380491320564 + ], + "(10, 3, 0, 7, 5)": [ + -3.9830938342855595, + 0.0, + 0.0 + ], + "(8, 4, 5, 5, 4)": [ + -0.30754170959792176, + -0.3867360447643776, + -0.398154762384204 + ], + "(8, 4, 4, 4, 4)": [ + -0.6655843968345045, + -0.4532648861241537, + -0.5346114178517192 + ], + "(6, 2, 2, 3, 4)": [ + -4.446230795193292, + -5.020752340317076, + 0.0 + ], + "(6, 7, 1, 4, 4)": [ + -5.387311485879728, + -4.95703206448197, + -3.8531567015686354 + ], + "(8, 4, 5, 4, 4)": [ + -0.48636571992322414, + -0.33821466164699615, + -0.4178560095113114 + ], + "(8, 7, 2, 6, 5)": [ + -3.888269902330781, + 0.0, + 0.0 + ], + "(10, 3, 8, 6, 4)": [ + -3.266039984141646, + -4.9275553553023155, + -4.201494366001483 + ], + "(7, 5, 4, 5, 4)": [ + -0.3681146564911571, + -0.3150552819982043, + -0.37216625432454825 + ], + "(6, 5, 4, 5, 5)": [ + -0.447275317716057, + -0.390317535489762, + -0.2861731789613945 + ], + "(6, 4, 6, 5, 5)": [ + -0.31176643454913733, + -0.4984201267642071, + -0.6464580261098049 + ], + "(7, 5, 7, 5, 4)": [ + -0.454600388046398, + -0.6004819885579047, + -0.6361956236056506 + ], + "(6, 4, 6, 5, 4)": [ + -0.2466109074596947, + -0.42276237498074165, + -0.5273895807151746 + ], + "(9, 3, 9, 2, 4)": [ + -3.0507748487583912, + -3.4026154404075397, + -2.9550159381854457 + ], + "(9, 6, 2, 1, 4)": [ + -2.8266665980659553, + -5.637464407716637, + 0.0 + ], + "(8, 5, 1, 5, 4)": [ + -1.935150621774292, + -0.758186084724044, + -1.0214016741545284 + ], + "(7, 4, 8, 5, 5)": [ + -0.734654496916978, + -0.9231771548960922, + -0.9840007346366821 + ], + "(6, 3, 8, 6, 4)": [ + -2.9224528979379065, + -3.9535724216691177, + -2.946075985698053 + ], + "(6, 4, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, 2, 2, 4)": [ + -1.2856400797983305, + -1.479220190157514, + -1.0325555429925368 + ], + "(8, 4, 1, 5, 4)": [ + -1.9101259341705332, + -0.965959472035866, + -1.8373918508573637 + ], + "(6, 5, 1, 4, 4)": [ + -1.2196431993101575, + -1.193654633755977, + -0.7147946215160037 + ], + "(9, 4, 2, 3, 5)": [ + -3.0690434775928437, + -1.39231452272767, + 0.0 + ], + "(9, 6, 1, 3, 5)": [ + 0.0, + -1.5569230378637906, + -3.5085698846009286 + ], + "(7, 5, 9, 8, 5)": [ + -2.5177808974991382, + -1.5012227037587977, + -3.0666989899562753 + ], + "(7, 6, 6, 3, 4)": [ + -2.0073654861109773, + -0.6155068823334594, + -2.133698268878138 + ], + "(7, 6, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, 3, 7, 5)": [ + -0.29916593038258893, + -0.586154732545138, + -1.0733756552041176 + ], + "(7, 4, 5, 7, 5)": [ + -0.5888208829011281, + -1.1666451100147974, + -2.1779679880182536 + ], + "(9, 7, 4, 5, 5)": [ + -3.984104253401126, + 0.0, + 0.0 + ], + "(9, 5, 7, 6, 4)": [ + -1.7495334241420952, + -1.1225708426746337, + 0.0 + ], + "(8, 4, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 4, 5, 5)": [ + -0.4626047859591918, + -0.3714016163489118, + -0.41017673004807076 + ], + "(6, 5, 6, 5, 5)": [ + -0.47770258923857406, + -0.5732055128931859, + -0.6463060611900402 + ], + "(6, 2, 2, 4, 5)": [ + -4.550741391713991, + 0.0, + -4.8063054719716325 + ], + "(8, 7, 1, 3, 4)": [ + -6.451058733981794, + -5.421730890444, + -3.0802530961847614 + ], + "(8, 2, 1, 4, 5)": [ + 0.0, + -5.042281899161744, + 0.0 + ], + "(9, 7, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 6, 4, 2, 4)": [ + -2.4928966801508405, + -2.810543194549947, + -1.2714969490230283 + ], + "(7, 5, 2, 5, 5)": [ + -0.7008440315062118, + -0.5701961609205455, + -0.4579198561297383 + ], + "(8, 5, 3, 5, 5)": [ + -0.5145525168579437, + -0.444026631164466, + -0.3615749721595373 + ], + "(8, 5, 5, 5, 4)": [ + -0.4093471335376443, + -0.3292512994400742, + -0.4102282257334068 + ], + "(6, 3, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, 6, 5, 5)": [ + -0.4533482546858755, + -0.5712557286031982, + -0.6757529844941651 + ], + "(6, 4, 9, 5, 4)": [ + -1.316700229028476, + -1.4884160397785586, + -1.5502764251365981 + ], + "(8, 4, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 9, 5, 5)": [ + -1.782478909930903, + -1.409421627337474, + -1.9933337481865128 + ], + "(7, 6, 4, 4, 5)": [ + -0.9944857562999074, + -0.5408567392294312, + -1.1680823577032833 + ], + "(6, 3, 4, 4, 5)": [ + -1.1670029134861601, + -0.6093731689910574, + -1.0929033687702663 + ], + "(9, 4, 4, 8, 5)": [ + -2.6610232379248817, + -1.488461844485218, + -3.1606122189864343 + ], + "(6, 3, 1, 3, 5)": [ + -4.740036335138818, + -2.993931168948099, + -3.454442617012681 + ], + "(9, 4, 6, 4, 5)": [ + -1.6675289350318232, + -0.6450101125448736, + -2.3482391593374574 + ], + "(8, 4, 3, 3, 4)": [ + -0.9128416398780432, + -0.7489079260560576, + -0.5662453334935705 + ], + "(8, 4, 0, 6, 5)": [ + -1.3874225467135213, + -0.9529945662980273, + -1.877853330477647 + ], + "(7, 5, 0, 6, 5)": [ + -1.9931441080797678, + -2.281263639773196, + -0.8948564760380643 + ], + "(7, 5, 1, 4, 4)": [ + -1.093500694988908, + -0.9291000927886625, + -0.7844427837242549 + ], + "(8, 7, 1, 4, 4)": [ + -5.120517064286651, + -3.436243025813392, + -4.559092451485444 + ], + "(7, 2, 0, 4, 4)": [ + 0.0, + 0.0, + -6.144424818436434 + ], + "(6, 5, 4, 4, 4)": [ + -0.6225891315427314, + -0.38464778326757626, + -0.2839971823884083 + ], + "(8, 5, 3, 4, 4)": [ + -0.6482979365022216, + -0.5828303953616082, + -0.3856993134664908 + ], + "(7, 4, 2, 4, 4)": [ + -0.8583786638893751, + -0.7479417839894089, + -0.5881438371124572 + ], + "(6, 5, 0, 5, 4)": [ + -3.2291973450286986, + -1.5551133391876313, + -2.460397686763689 + ], + "(6, 4, 0, 5, 4)": [ + -3.085076849981748, + -2.738679367208903, + 0.0 + ], + "(7, 5, 0, 5, 5)": [ + -1.512200798699327, + -1.4093933606266067, + -1.0252091883389471 + ], + "(7, 4, 0, 5, 4)": [ + -2.884689754230073, + 0.0, + -2.7488593031078414 + ], + "(6, 5, 1, 6, 5)": [ + -0.7237335231735986, + -0.9018967110042502, + -0.5131921928465015 + ], + "(6, 4, 3, 6, 5)": [ + -0.3815974042776076, + -0.4222403451046005, + -0.7771436331245472 + ], + "(6, 5, 7, 6, 5)": [ + -0.6432030241942758, + -0.922371259322543, + -1.0483136059348146 + ], + "(10, 3, 0, 6, 5)": [ + -5.12603012553085, + 0.0, + 0.0 + ], + "(7, 3, 2, 7, 5)": [ + -1.066738013274202, + -1.6001564112929407, + -1.8212708093660348 + ], + "(9, 2, 6, 6, 5)": [ + -4.151233474274159, + 0.0, + 0.0 + ], + "(9, 6, 8, 6, 4)": [ + -3.3002383914186155, + -2.2265504562649054, + -3.9620525567997498 + ], + "(6, 4, 1, 3, 4)": [ + -1.354713167192363, + -1.4354754945914612, + -1.1066791001035485 + ], + "(6, 5, 1, 5, 5)": [ + -1.0827642996882185, + -0.8197208033285199, + -0.6492291784198896 + ], + "(7, 4, 4, 5, 4)": [ + -0.3606071966198418, + -0.2859756313114396, + -0.40752086454611824 + ], + "(6, 5, 4, 5, 4)": [ + -0.46917493117667736, + -0.36599881550163427, + -0.25956719712573845 + ], + "(7, 6, 6, 2, 4)": [ + -1.923068033344768, + -1.755813069552518, + -1.1035689762301575 + ], + "(9, 3, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 4, 8, 5)": [ + -3.6615507538813192, + 0.0, + 0.0 + ], + "(6, 3, 3, 4, 5)": [ + -2.3217660832581797, + -0.8679465366402657, + -3.5016302068316016 + ], + "(6, 4, 7, 7, 5)": [ + -0.8227194114685685, + -1.5969761355512992, + -1.3632406212957013 + ], + "(6, 5, 9, 6, 4)": [ + -3.5668000423694712, + -2.8866953479302087, + -1.4506747038546748 + ], + "(7, 4, 9, 6, 4)": [ + -3.3554918261665767, + -1.605360810287816, + -2.3578279504212314 + ], + "(6, 5, 2, 6, 5)": [ + -0.5266248531206632, + -0.5324176908016665, + -0.41963578815395486 + ], + "(8, 4, 4, 6, 5)": [ + -0.3472648724674687, + -0.4200528142066677, + -0.7570186496244898 + ], + "(6, 4, 7, 4, 4)": [ + -0.3741514595947692, + -0.4659709754196883, + -0.5658408826878201 + ], + "(7, 5, 7, 4, 4)": [ + -0.43403517326054175, + -0.4980873070324715, + -0.5147602297384081 + ], + "(7, 4, 6, 5, 5)": [ + -0.3145025725695736, + -0.4631453604511366, + -0.6647471051866961 + ], + "(7, 5, 7, 4, 5)": [ + -0.6084309593723302, + -1.5174775751022254, + -0.9800442110351134 + ], + "(6, 3, 7, 4, 5)": [ + -3.1703669912383523, + 0.0, + -2.04027119059125 + ], + "(7, 4, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, 1, 7, 5)": [ + -1.0647641825004313, + -1.0921243050043292, + -0.4657212620385327 + ], + "(8, 4, 2, 4, 5)": [ + -0.7950406730964719, + -0.8018030698422377, + -0.5782133403332528 + ], + "(6, 4, 0, 4, 5)": [ + -1.5645293279372186, + -1.6648387528219897, + -1.223506873185267 + ], + "(6, 5, 1, 7, 5)": [ + -1.381653296094578, + -0.8352645808906201, + -0.46414425810607257 + ], + "(6, 5, 4, 7, 5)": [ + -0.462379425682101, + -0.5854226900818923, + -1.2743997557944744 + ], + "(7, 5, 6, 7, 5)": [ + -0.6735393959299825, + -2.4157507659962105, + -2.4914273439881134 + ], + "(6, 4, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 6, 5, 4)": [ + -1.5880366608549212, + -3.2740698303177984, + -2.8396381394416546 + ], + "(7, 4, 2, 5, 5)": [ + -0.6353586112647391, + -0.5302428002626568, + -0.44243848368300775 + ], + "(6, 3, 6, 3, 4)": [ + -1.2510911553905513, + -0.7552055664393408, + -1.5152683734344319 + ], + "(8, 5, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 4, 1, 4, 5)": [ + -1.3919142180374184, + -1.1715234963118053, + -1.0218011769087343 + ], + "(7, 4, 1, 4, 5)": [ + -1.1918141962676867, + -0.994451109593106, + -0.9336451571503914 + ], + "(8, 5, 6, 2, 4)": [ + -0.7549840545808645, + -1.2392861237214343, + -0.3432965886521838 + ], + "(8, 5, 3, 2, 4)": [ + -1.147991381418069, + -1.301110236601709, + -1.3254307022150118 + ], + "(8, 5, 7, 3, 4)": [ + -0.49101002255351106, + -0.38351427544222855, + -0.5415367470660053 + ], + "(6, 4, 2, 2, 4)": [ + -1.96919381581496, + -1.688683536880107, + -0.9063028420452924 + ], + "(8, 4, 1, 3, 5)": [ + -3.0164604451018096, + -1.4200739715847828, + -2.753545375607497 + ], + "(8, 7, 2, 3, 4)": [ + -5.5763189596995275, + 0.0, + 0.0 + ], + "(9, 5, 6, 8, 5)": [ + -3.5048602458115887, + -1.4303275806396811, + -2.7652509333460458 + ], + "(7, 3, 9, 7, 4)": [ + -2.8319977310729323, + 0.0, + 0.0 + ], + "(8, 5, 3, 3, 4)": [ + -0.9374950808176497, + -0.6714729310952562, + -0.5320697688068436 + ], + "(6, 4, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 4, 1, 7, 5)": [ + -0.6588170348175634, + -1.3661988011841253, + -1.2965111848893172 + ], + "(6, 4, 8, 7, 5)": [ + -1.0647646393577341, + -1.9524639210332522, + -1.4575208798075778 + ], + "(6, 5, 8, 6, 5)": [ + -1.3247904653073772, + -1.1210564680581971, + -1.6339006272750187 + ], + "(7, 7, 0, 4, 5)": [ + -6.893610226952205, + -6.445269504680617, + 0.0 + ], + "(10, 4, 8, 4, 5)": [ + -2.8933442199576573, + 0.0, + 0.0 + ], + "(7, 2, 4, 5, 4)": [ + -3.7761755934546053, + -3.805913090552805, + 0.0 + ], + "(6, 7, 1, 2, 4)": [ + -6.208948033111199, + 0.0, + -4.801526525945103 + ], + "(9, 3, 1, 3, 5)": [ + -4.234432999131217, + -5.455395484951198, + -3.7963869577410176 + ], + "(8, 5, 6, 4, 5)": [ + -1.5479902264054763, + -0.4757581441668356, + -0.8881555879837068 + ], + "(8, 5, 6, 6, 5)": [ + -0.7269159161106478, + -0.6900120521107376, + -0.9527306022393088 + ], + "(6, 5, 3, 3, 4)": [ + -1.4246593407205543, + -0.8237825896518363, + -0.5235241843705813 + ], + "(9, 2, 4, 4, 4)": [ + -4.481121860605591, + -4.410902232653495, + -2.7122259321163646 + ], + "(9, 7, 1, 2, 4)": [ + 0.0, + -6.121495449723124, + 0.0 + ], + "(7, 2, 0, 3, 5)": [ + 0.0, + 0.0, + -6.418088506406021 + ], + "(8, 5, 9, 8, 5)": [ + -2.171031208619606, + -1.4989159159953014, + -3.277528619378447 + ], + "(6, 5, 4, 2, 4)": [ + -1.8277915420166566, + -1.8095932672312804, + -0.5594751604641426 + ], + "(10, 5, 0, 2, 5)": [ + -5.535614543799714, + 0.0, + 0.0 + ], + "(8, 5, 5, 7, 5)": [ + -0.5411903971518827, + -0.9441066761828912, + -1.3337538080299502 + ], + "(8, 7, 2, 4, 4)": [ + -5.468044394328787, + -4.502522125384203, + -3.6174115959208444 + ], + "(7, 7, 2, 5, 4)": [ + 0.0, + -2.5718105510452745, + 0.0 + ], + "(8, 6, 7, 8, 5)": [ + -5.059838602852459, + 0.0, + 0.0 + ], + "(10, 5, 0, 7, 5)": [ + -2.4294158627659055, + -3.068978065422872, + -3.2529038611403687 + ], + "(8, 3, 8, 6, 4)": [ + -1.8009304766158645, + -3.463643362023747, + -4.60628797677415 + ], + "(7, 5, 1, 5, 4)": [ + -2.341723570608802, + -2.242075915736689, + -1.195980007339309 + ], + "(6, 7, 4, 3, 4)": [ + 0.0, + 0.0, + -2.617632497607631 + ], + "(7, 4, 6, 4, 4)": [ + -0.21542236578237117, + -0.4321103919496318, + -0.44442879437020855 + ], + "(8, 4, 4, 3, 4)": [ + -0.7724255501119279, + -0.5638935406802222, + -0.4462537138333659 + ], + "(7, 5, 4, 5, 5)": [ + -0.44710335328286877, + -0.4658235162170544, + -0.24585279357047476 + ], + "(6, 4, 4, 5, 5)": [ + -0.4679674924900871, + -0.3540689192053305, + -0.43175992491472204 + ], + "(7, 5, 8, 7, 5)": [ + -1.0258869333861123, + -1.3861192345376079, + -1.3648866293005544 + ], + "(8, 4, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 3, 6, 5)": [ + -0.7707243939448936, + -0.3646766045710678, + -0.5020128113070418 + ], + "(8, 4, 5, 2, 4)": [ + -1.0587441583331103, + -0.8443001284586453, + -0.5949321585162347 + ], + "(9, 4, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 7, 3, 4, 4)": [ + 0.0, + -4.352919161279122, + 0.0 + ], + "(7, 7, 4, 5, 5)": [ + -4.478464015454725, + -3.9938363273602584, + -2.932251623633859 + ], + "(7, 2, 4, 4, 4)": [ + 0.0, + -3.6887752836738485, + -3.7476291702353755 + ], + "(8, 2, 3, 4, 4)": [ + -4.588784491349645, + -4.267766526994009, + 0.0 + ], + "(7, 5, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 6, 3, 8, 5)": [ + 0.0, + -1.382916786052191, + -4.97056906556776 + ], + "(9, 6, 7, 8, 5)": [ + -3.4722342604761427, + -2.577726445500671, + 0.0 + ], + "(7, 4, 3, 6, 5)": [ + -0.47611593045904865, + -0.3252125216537785, + -0.6256167287652019 + ], + "(6, 4, 0, 6, 5)": [ + -1.159009460172267, + -2.8033263246630207, + -1.826055556089759 + ], + "(7, 4, 1, 5, 4)": [ + -0.9561376415397117, + -2.2925726985810417, + -1.3005550169525575 + ], + "(6, 4, 5, 5, 4)": [ + -0.1526305235950865, + -0.35737930082565356, + -0.39359536042339066 + ], + "(8, 3, 6, 6, 4)": [ + 0.0, + -1.4363932540769164, + 0.0 + ], + "(9, 3, 7, 6, 4)": [ + 0.0, + -1.634774334362393, + -3.8282780395694997 + ], + "(10, 5, 8, 6, 4)": [ + -2.873859323197756, + -5.321859017847994, + -3.7865152443100127 + ], + "(8, 7, -1, 6, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 4, 5, 2, 4)": [ + -0.7839193312333221, + -0.6778177854556279, + -0.7505166477610222 + ], + "(6, 5, 0, 1, 4)": [ + -2.6624048261500395, + -2.8665420729304993, + -2.53733404643167 + ], + "(6, 4, 9, 3, 4)": [ + -1.0158634721257633, + -1.3014139086662553, + -2.2616993580262186 + ], + "(6, 5, 8, 2, 4)": [ + -0.5109692079641885, + -0.9082552409936293, + -0.8791089210836223 + ], + "(7, 5, 6, 6, 5)": [ + -0.5464191658637974, + -0.7064677886967481, + -0.9852042374382068 + ], + "(7, 4, 6, 3, 4)": [ + -0.7267381303128148, + -0.236469309867893, + -0.446486913196588 + ], + "(9, 3, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 2, 7, 5)": [ + -1.9764494431995787, + -4.346578329702385, + -3.2055545654643236 + ], + "(6, 7, 4, 6, 5)": [ + -4.269383692454124, + 0.0, + 0.0 + ], + "(8, 3, 7, 4, 5)": [ + -0.9728365786004243, + -1.342399233139995, + 0.0 + ], + "(9, 3, 7, 4, 5)": [ + -1.8881592592355472, + -2.2106190865952153, + -4.45540081310957 + ], + "(10, 6, 8, 2, 4)": [ + 0.0, + -3.5342859910042215, + 0.0 + ], + "(9, 4, 7, 8, 5)": [ + -3.913943822287324, + -3.792178404354206, + -2.7648297268451962 + ], + "(6, 3, 2, 4, 5)": [ + -2.9104151935301905, + -1.9396199298123393, + -1.095467729841176 + ], + "(6, 6, 6, 2, 4)": [ + -1.9834112290527384, + -1.9125061853962373, + -1.2875979675462597 + ], + "(7, 4, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 3, 2, 4)": [ + -4.682682946882823, + -4.361588996792365, + 0.0 + ], + "(6, 4, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 3, 2, 3, 5)": [ + -3.6813163531617823, + -2.147200587857438, + 0.0 + ], + "(9, 6, 6, 2, 4)": [ + -3.723222589504002, + -1.4579029835370276, + -2.472667039525456 + ], + "(6, 3, 8, 8, 5)": [ + -3.381956196255139, + 0.0, + -3.115545103735576 + ], + "(7, 4, 2, 4, 5)": [ + -0.9772811209040594, + -0.8208173214506809, + -0.6132435936054171 + ], + "(7, 4, 8, 8, 5)": [ + -1.5029039907216006, + -3.141474888639839, + -3.4538730622130602 + ], + "(6, 3, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 9, 6, 4)": [ + 0.0, + 0.0, + -6.225436083736974 + ], + "(7, 3, 2, 4, 5)": [ + -1.9982235145183231, + -2.4166646099823286, + -1.2983822272619543 + ], + "(7, 5, 2, 3, 4)": [ + -1.059281484980069, + -0.7902100154805696, + -0.5741275573060399 + ], + "(10, 3, 3, 7, 5)": [ + 0.0, + -4.867519569388259, + 0.0 + ], + "(8, 5, 9, 3, 4)": [ + -1.282273022990957, + -1.1428977266081548, + -2.1494027067083317 + ], + "(9, 5, 9, 7, 4)": [ + 0.0, + 0.0, + -4.870007184559206 + ], + "(8, 7, 1, 6, 5)": [ + 0.0, + -3.726944275189253, + 0.0 + ], + "(7, 7, 5, 4, 4)": [ + 0.0, + -4.665116512195205, + 0.0 + ], + "(7, 5, 2, 4, 4)": [ + -0.9834862183900334, + -0.6462226371050894, + -0.5102075661887296 + ], + "(6, 4, 5, 7, 5)": [ + -0.5820292591429463, + -1.2607561702431433, + -2.117455749409945 + ], + "(6, 3, 6, 4, 5)": [ + -1.320494761426922, + -1.1627017647633706, + -1.7500025680473523 + ], + "(7, 4, 1, 6, 5)": [ + -0.7731554112484759, + -0.6964090153463358, + -0.6077063110066775 + ], + "(6, 5, 6, 7, 5)": [ + -0.7377917937217445, + -1.9706370129276927, + -2.3245234585293426 + ], + "(6, 5, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 2, 1, 4, 5)": [ + -5.299094891728014, + -5.640179550255415, + 0.0 + ], + "(6, 5, 9, 3, 4)": [ + -0.8552798918303244, + -2.3328801462740167, + -2.0071411840135793 + ], + "(6, 4, 8, 4, 5)": [ + -1.682708876911542, + 0.0, + -2.7433116773438293 + ], + "(6, 3, 6, 6, 4)": [ + 0.0, + 0.0, + -2.8358457157074923 + ], + "(8, 5, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, 4, 6, 5)": [ + -0.2551808510718083, + -0.47710161723165956, + -0.7299267927687543 + ], + "(6, 4, 3, 5, 4)": [ + -1.4307413300889908, + -0.42664214108369575, + -1.1644569873875845 + ], + "(8, 4, 3, 5, 4)": [ + -1.9195402369136323, + -1.4491798358458565, + -0.37575198923010344 + ], + "(7, 6, 2, 3, 5)": [ + 0.0, + -1.756656953170658, + 0.0 + ], + "(7, 4, 9, 3, 4)": [ + -0.9326320584632831, + -2.6902327150778835, + -2.3636186897212794 + ], + "(8, 5, 8, 2, 4)": [ + -0.7504353575962355, + -0.5697259140306975, + -0.9820435092026917 + ], + "(7, 5, 7, 2, 4)": [ + -1.4759282772889104, + -1.8242619510146312, + -0.27799668512579667 + ], + "(8, 4, 4, 4, 5)": [ + -0.45177106654844645, + -0.40285617139691043, + -0.44719881056990496 + ], + "(8, 5, 4, 4, 5)": [ + -0.4345198655554468, + -0.35753008433777145, + -0.3113066129140938 + ], + "(6, 4, 2, 4, 5)": [ + -1.2342765313654616, + -0.8551151627417237, + -0.5905118600947946 + ], + "(9, 2, 1, 2, 4)": [ + -5.559305646175361, + 0.0, + 0.0 + ], + "(8, 7, 0, 2, 4)": [ + -3.6123832477810516, + -6.444651608494905, + -6.370141242830223 + ], + "(10, 3, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 1, 4, 5)": [ + -4.72981627363705, + 0.0, + 0.0 + ], + "(7, 2, 1, 5, 5)": [ + -4.629665111731167, + -4.025165209863383, + -4.8303079879615805 + ], + "(6, 7, 2, 4, 4)": [ + -5.69379270524788, + -4.594747382914454, + 0.0 + ], + "(8, 2, 2, 5, 5)": [ + -4.719888530276169, + -3.7926765034914722, + -4.030626358497102 + ], + "(8, 2, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 6, 7, 5)": [ + -0.7122274130682187, + -1.664130717682861, + -1.081351665652332 + ], + "(6, 5, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 2, 2, 4, 4)": [ + -4.640603657406386, + -4.379862823493726, + -4.599636818483048 + ], + "(6, 5, 6, 2, 4)": [ + -2.2585972232869103, + -0.5037713584532345, + -0.1490071918272887 + ], + "(7, 7, 3, 4, 4)": [ + -4.176348076396744, + -3.6352977683758096, + -3.5879625474788783 + ], + "(6, 4, 5, 4, 4)": [ + -0.4388461387351386, + -0.2400196798469931, + -0.34550014930601686 + ], + "(6, 4, 5, 6, 5)": [ + -0.37512776030582506, + -0.5477022667561647, + -0.764420095708173 + ], + "(7, 6, 7, 2, 4)": [ + -3.53920453502954, + -2.0813946523027407, + -1.2946331401996374 + ], + "(6, 4, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 4, 5, 3, 4)": [ + -0.671688131079808, + -0.4463394405986544, + -0.4219775916609288 + ], + "(7, 5, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 2, 3, 5)": [ + -3.968643848860194, + -2.599576225770483, + 0.0 + ], + "(8, 3, 2, 3, 5)": [ + 0.0, + 0.0, + -4.9843069644443325 + ], + "(7, 7, 5, 6, 5)": [ + -2.6203006855969737, + -4.121769978792607, + -4.458989227715207 + ], + "(9, 7, 9, 6, 5)": [ + 0.0, + 0.0, + -5.753179590650419 + ], + "(6, 4, 9, 5, 5)": [ + -2.7719087292595237, + -1.1422364664101479, + -1.6993335194381696 + ], + "(7, 6, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 7, 0, 5, 5)": [ + 0.0, + -5.622965529961963, + 0.0 + ], + "(7, 4, 4, 4, 5)": [ + -0.40699614823818686, + -0.4059976083639969, + -0.4153784383724976 + ], + "(10, 3, 1, 5, 4)": [ + -4.500044804372572, + -4.518870641732099, + -3.6952336204525267 + ], + "(8, 4, 6, 2, 4)": [ + -0.7523078220149986, + -1.1553217526123585, + -0.9075508841454618 + ], + "(6, 4, 9, 4, 4)": [ + -1.5458519966343072, + -1.0771444357440654, + -1.7667351782436602 + ], + "(8, 5, 7, 6, 5)": [ + -0.7387842373750014, + -0.9144669647738428, + -1.0503779540499227 + ], + "(6, 2, 4, 5, 5)": [ + -3.808744505056247, + -3.228192406720702, + -4.043411450374058 + ], + "(8, 4, 9, 2, 4)": [ + -1.509822769932097, + -1.0854977764151754, + -1.8984931351546894 + ], + "(7, 5, 8, 3, 4)": [ + -0.5079362565368283, + -0.8295321888627009, + -0.8748344859259447 + ], + "(6, 4, 1, 6, 5)": [ + -0.8983302598801508, + -1.3503879246249038, + -0.6256976205891901 + ], + "(6, 4, 4, 5, 4)": [ + -0.4097399623679524, + -0.3318515793604131, + -0.4023190193018788 + ], + "(6, 5, 8, 3, 4)": [ + -0.5317265849795176, + -0.793037123993033, + -0.7926080077198747 + ], + "(7, 5, 0, 2, 5)": [ + 0.0, + -2.335048985256879, + 0.0 + ], + "(9, 5, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 4, 3, 4)": [ + -0.8614662746072379, + -0.540020106448509, + -0.3032464088016415 + ], + "(6, 5, 2, 5, 4)": [ + -1.0712515838324228, + -0.5713865782879306, + -1.2920974439706867 + ], + "(6, 4, 2, 5, 4)": [ + -1.3487809778825515, + -1.0406240525006911, + -0.6287382782113125 + ], + "(7, 4, 5, 2, 4)": [ + -0.7455920362720149, + -1.724747214269474, + -0.5327945941368071 + ], + "(6, 4, 4, 7, 5)": [ + -1.1394496973207466, + -1.4042111145269953, + -0.8640242840037754 + ], + "(7, 7, 2, 3, 4)": [ + 0.0, + -4.380494998573698, + 0.0 + ], + "(6, 6, 0, 1, 4)": [ + -4.23101025273018, + 0.0, + -3.297785892769372 + ], + "(7, 4, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 7, 1, 6, 5)": [ + -4.417380812557946, + -4.240222782215105, + 0.0 + ], + "(7, 6, 1, 3, 5)": [ + -4.704949528952992, + -4.804535828618695, + -3.304802663588096 + ], + "(8, 6, 8, 6, 4)": [ + -4.479846969619388, + -4.615301863417093, + -2.9893511053809854 + ], + "(7, 4, 0, 2, 5)": [ + -2.7126606653870975, + -2.6245753228402036, + 0.0 + ], + "(7, 3, 1, 1, 4)": [ + -5.028179024306291, + 0.0, + -4.7359430742511615 + ], + "(6, 4, 6, 7, 5)": [ + -0.6819443318409962, + -1.8469216387957959, + -1.953871945790551 + ], + "(6, 6, 7, 4, 5)": [ + -2.205406773225686, + 0.0, + 0.0 + ], + "(10, 6, 8, 6, 4)": [ + 0.0, + -4.813251700992445, + 0.0 + ], + "(7, 5, 2, 5, 4)": [ + -1.1306897483767062, + -1.03356450244442, + -0.4430832702749741 + ], + "(9, 5, 0, 5, 4)": [ + 0.0, + -1.527073982655104, + 0.0 + ], + "(7, 5, 0, 5, 4)": [ + -3.733811251925025, + 0.0, + 0.0 + ], + "(8, 5, 8, 6, 4)": [ + -2.290233896983363, + -3.176375008878763, + -1.6159296291959684 + ], + "(7, 7, 8, 5, 4)": [ + 0.0, + -4.423647168439987, + 0.0 + ], + "(8, 7, 6, 3, 4)": [ + -2.4869829100830625, + -3.6454284624848095, + 0.0 + ], + "(6, 5, 4, 4, 5)": [ + -0.4121673478562442, + -0.29338814725483786, + -0.18613164017733885 + ], + "(6, 5, 3, 4, 4)": [ + -0.8153984437299968, + -0.5717995032161232, + -0.3520611505403654 + ], + "(7, 4, 4, 4, 4)": [ + -0.5991737757853159, + -0.4571855141591353, + -0.3941334205112823 + ], + "(6, 5, 3, 4, 5)": [ + -0.7009983485122736, + -0.4302733657455326, + -0.24900211610838888 + ], + "(8, 5, 0, 1, 4)": [ + -2.812517475320817, + -2.108582474501437, + -2.832142334101324 + ], + "(6, 5, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 2, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 2, 8, 5, 4)": [ + -4.485679967242559, + -4.931578155178177, + 0.0 + ], + "(7, 7, 1, 3, 4)": [ + 0.0, + 0.0, + -5.832624676319342 + ], + "(8, 2, 0, 5, 5)": [ + -4.263019689424227, + -5.678033454635811, + -5.080936669739382 + ], + "(7, 2, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 4, 4, 5)": [ + -0.6551761587369267, + -0.9798471567868238, + -1.1806694945302703 + ], + "(7, 3, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 6, 2, 3, 5)": [ + -3.771693570662011, + 0.0, + 0.0 + ], + "(7, 7, 5, 5, 5)": [ + -4.03085474792233, + -3.744151587507237, + -3.500447784600957 + ], + "(9, 7, 2, 3, 4)": [ + -6.067370945781883, + 0.0, + 0.0 + ], + "(6, 4, 7, 5, 5)": [ + -0.47669954643764534, + -0.6590192882145788, + -0.9085257704644276 + ], + "(6, 5, 3, 2, 4)": [ + -2.0693999006912724, + -1.7325952979284207, + -0.5929510114365978 + ], + "(8, 5, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 5, 5, 4)": [ + -0.40833219521329556, + -0.43490765691775524, + -0.34640257425472265 + ], + "(6, 5, 2, 7, 5)": [ + -0.9999608121492451, + -1.2537285160183722, + -0.3973000876368242 + ], + "(7, 5, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, 5, 5, 4)": [ + -0.4128395826687489, + -0.2739182219898195, + -0.3655574982378953 + ], + "(7, 5, 5, 5, 5)": [ + -0.4553240595978428, + -0.41300868511054095, + -0.5099599722324786 + ], + "(8, 2, 5, 4, 4)": [ + -4.263440901134105, + 0.0, + -3.8339710712975013 + ], + "(6, 5, 6, 6, 5)": [ + -0.624321956460258, + -0.7028487038655549, + -0.8963746221644561 + ], + "(7, 5, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, 3, 3, 4)": [ + -1.1856606432947008, + -0.7616244206349875, + -0.47669679458377323 + ], + "(6, 6, 1, 3, 5)": [ + -3.289024359093437, + -2.8471794045476253, + -2.5229295087364703 + ], + "(8, 5, 2, 7, 5)": [ + -0.8845307959556978, + -0.4426922562471348, + -0.942701855355822 + ], + "(9, 5, 7, 8, 5)": [ + -3.3027801799037473, + -5.845493464986976, + -4.215576645212333 + ], + "(7, 5, 3, 4, 5)": [ + -0.7075144044903141, + -0.7524559210888914, + -0.26912210362902844 + ], + "(6, 7, 4, 4, 4)": [ + -5.0177089041944285, + -3.859023471728246, + 0.0 + ], + "(8, 2, 1, 2, 4)": [ + 0.0, + -5.716506367127536, + 0.0 + ], + "(7, 4, 3, 3, 4)": [ + -0.962764338556492, + -0.6583646448898235, + -0.5879820105509002 + ], + "(7, 5, 9, 3, 4)": [ + -1.0138576452521673, + -2.4680815142925066, + -2.2196299815204754 + ], + "(7, 5, 8, 2, 4)": [ + -1.5386495331372472, + -0.5765068842581458, + -1.3430811599532522 + ], + "(6, 4, 7, 2, 4)": [ + -0.404801525765961, + -0.6542858158619858, + -0.7900509091212393 + ], + "(7, 5, 5, 2, 4)": [ + -0.8916498892585398, + -1.4976814621118586, + -0.5716643825316591 + ], + "(6, 5, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 6, 8, 8, 5)": [ + 0.0, + 0.0, + -5.449228028655794 + ], + "(8, 7, 4, 3, 4)": [ + 0.0, + -3.9375568666562937, + 0.0 + ], + "(7, 5, 1, 7, 5)": [ + -1.3567148201862151, + -1.5425148901675532, + -0.4500759079062684 + ], + "(8, 4, 3, 6, 5)": [ + -0.38003853059898485, + -0.29420108880839313, + -0.5044138825216045 + ], + "(6, 5, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 5, 8, 5)": [ + -3.8476677635579666, + -4.887872956896447, + -5.407145998657056 + ], + "(7, 2, 7, 5, 5)": [ + -4.152600678055785, + 0.0, + 0.0 + ], + "(7, 3, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 4, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 4, 7, 5)": [ + -1.0308832592562833, + -0.587873646829472, + -1.2325354753070743 + ], + "(9, 5, 1, 1, 4)": [ + -2.009525533657715, + -5.085794239370401, + 0.0 + ], + "(7, 5, 0, 1, 4)": [ + -2.5961345512989644, + -2.807971650082459, + -1.6377048542758539 + ], + "(7, 6, 3, 2, 4)": [ + -3.162947144466131, + -2.824235322859782, + -1.3137303090590606 + ], + "(6, 2, 0, 3, 4)": [ + -6.0703472434325185, + -6.218454932562372, + -5.915138650713899 + ], + "(8, 5, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 2, 3, 3, 4)": [ + -4.79862913875685, + 0.0, + 0.0 + ], + "(7, 4, 3, 7, 5)": [ + -0.6015707127828566, + -0.6836438786145231, + -0.5817004377008699 + ], + "(6, 2, 8, 6, 5)": [ + -4.525860217234323, + -4.56539118881757, + 0.0 + ], + "(10, 3, 1, 3, 5)": [ + 0.0, + 0.0, + -5.110794376686026 + ], + "(8, 5, 0, 5, 4)": [ + -3.4992696728789108, + -1.3669182308044507, + -2.824833469499583 + ], + "(6, 4, 3, 5, 5)": [ + -0.5072497243691478, + -0.43185942212329026, + -0.43042939997655116 + ], + "(6, 7, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 9, 2, 4)": [ + 0.0, + -0.9521653043432495, + 0.0 + ], + "(6, 4, 7, 3, 4)": [ + -0.49944361113512453, + -0.45573638136228606, + -0.5720795702077089 + ], + "(7, 5, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 7, 4, 5, 4)": [ + -3.769063995322386, + 0.0, + 0.0 + ], + "(6, 2, 9, 7, 5)": [ + -4.16839589214231, + 0.0, + 0.0 + ], + "(10, 3, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, 5, 3, 4)": [ + -0.7476064033924197, + -0.4390060573622721, + -0.25755407518247686 + ], + "(7, 5, 4, 2, 4)": [ + -1.6912879691761236, + -2.0605493980456204, + -0.5174808023550468 + ], + "(6, 5, 7, 7, 5)": [ + -0.9974637186060361, + -1.3603585821775275, + -1.6422234911859426 + ], + "(7, 4, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, 1, 3, 5)": [ + -2.6648476855287613, + -3.6704718622678496, + -1.2053480240243983 + ], + "(6, 4, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 4, 4, 4, 5)": [ + -0.4062293572433995, + -0.39369488177825807, + -0.39045789971661715 + ], + "(6, 4, 3, 3, 4)": [ + -1.3523432857563007, + -0.7251353985811135, + -0.6157208827346129 + ], + "(6, 4, 3, 4, 4)": [ + -0.7163003902215275, + -0.5764822393732215, + -0.5201095883000635 + ], + "(6, 4, 5, 5, 5)": [ + -0.3769304927399701, + -0.3868703356117487, + -0.596949186301133 + ], + "(7, 5, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 0, 6, 5)": [ + -1.6951995585697366, + -1.56928111532462, + -1.12561665465322 + ], + "(8, 2, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 5, 7, 5)": [ + -0.6739652312987425, + -1.7088634700176821, + -1.2954606093712244 + ], + "(7, 4, 8, 6, 4)": [ + -2.957084033625649, + -1.4624979030488208, + -3.175061049398609 + ], + "(6, 4, 0, 3, 5)": [ + -2.2748460877701158, + -1.5236825374217866, + -2.8925827872183647 + ], + "(9, 6, 4, 8, 5)": [ + -3.6754809528890315, + -4.2361575180450455, + 0.0 + ], + "(6, 5, 0, 6, 5)": [ + -2.641879818072755, + -2.4739643834342564, + -0.8801851771689632 + ], + "(9, 4, 1, 1, 4)": [ + 0.0, + 0.0, + -4.4277999052645445 + ], + "(10, 5, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 7, 2, 4)": [ + -0.8967620041695028, + -0.4197284796496947, + -0.6322683844668149 + ], + "(7, 5, 6, 5, 5)": [ + -0.4575239274125074, + -0.5490106775107645, + -0.641831915427453 + ], + "(7, 4, 7, 4, 5)": [ + -1.1670853297823718, + -0.5511625994592307, + -1.0233220770919953 + ], + "(8, 4, 7, 4, 5)": [ + -0.5195352158999548, + -0.9618080154269768, + -1.7063810427298924 + ], + "(6, 4, 1, 3, 5)": [ + -2.8264523772680943, + -2.661812411283803, + -1.7701504765600522 + ], + "(7, 3, 1, 3, 5)": [ + -2.753307879654897, + -3.812376492991956, + -4.608578067506732 + ], + "(10, 6, 0, 7, 5)": [ + -4.210482784895945, + 0.0, + 0.0 + ], + "(6, 5, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 2, 1, 4, 4)": [ + -5.873892739473932, + 0.0, + 0.0 + ], + "(10, 3, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 3, 4, 4, 5)": [ + -3.3324204270483, + 0.0, + -3.0462523023198855 + ], + "(7, 5, 4, 4, 5)": [ + -0.3445644559362584, + -0.3424308099100322, + -0.22797857018467707 + ], + "(6, 5, 9, 8, 5)": [ + -2.269454681691996, + -1.8422589947681214, + -1.3430483336883028 + ], + "(8, 5, 8, 8, 5)": [ + -3.717077389430573, + -3.683710163997671, + -1.7212420571407154 + ], + "(6, 3, 3, 7, 5)": [ + -0.997080170019071, + -1.679268254339781, + -2.8220361316773657 + ], + "(10, 6, 0, 6, 5)": [ + -4.31571095881986, + 0.0, + 0.0 + ], + "(6, 4, 4, 6, 5)": [ + -0.30296521517339037, + -0.429392735837018, + -0.6596295234394969 + ], + "(7, 4, 3, 4, 4)": [ + -0.7047510002326519, + -0.6486962204896242, + -0.48629422682471923 + ], + "(6, 5, 5, 6, 5)": [ + -0.5001294446398128, + -0.6082273549101218, + -0.7469977127889744 + ], + "(6, 2, 5, 5, 4)": [ + -3.3351446482920037, + -3.3365424622909505, + 0.0 + ], + "(10, 4, 0, 7, 5)": [ + -3.840904678741285, + -3.511740031391822, + -3.749489804665892 + ], + "(7, 3, 6, 6, 4)": [ + -2.3179630968699665, + 0.0, + 0.0 + ], + "(10, 4, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, 4, 3, 4)": [ + -0.8814106826850823, + -0.5171423979695972, + -0.37634702609790416 + ], + "(8, 4, 3, 4, 5)": [ + -0.6144319785303959, + -0.5665324579255488, + -0.4433298364360545 + ], + "(6, 4, 3, 4, 5)": [ + -0.7111272219554912, + -0.5710117482460073, + -0.3437990453125625 + ], + "(6, 5, 6, 4, 4)": [ + -0.3222843301272937, + -0.44189307176926235, + -0.42472744479895796 + ], + "(6, 4, 5, 4, 5)": [ + -0.33654305105920834, + -0.3157503596802641, + -0.679687965852438 + ], + "(6, 5, 6, 3, 4)": [ + -0.5827970591754603, + -0.6536469308377892, + -0.3053333383998751 + ], + "(6, 5, 5, 4, 5)": [ + -0.35361644411720017, + -0.4204316371149369, + -0.4437593747949486 + ], + "(8, 6, 5, 8, 5)": [ + -3.8270446391030175, + 0.0, + 0.0 + ], + "(7, 4, 6, 2, 4)": [ + -0.6453577302023811, + -0.9569420320061319, + -0.4169895535802429 + ], + "(7, 4, 3, 2, 4)": [ + -1.7902024941478007, + -0.8723713031936412, + -1.4511564416528797 + ], + "(7, 5, 2, 7, 5)": [ + -0.3810006060740663, + -1.2257790021617352, + -0.811382467130608 + ], + "(8, 4, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 4, 0, 7, 5)": [ + -1.1399973693849355, + -1.6603986893115494, + -1.7037779141348226 + ], + "(7, 5, 6, 5, 4)": [ + -0.3005289816695888, + -0.528886376957064, + -0.48268997603145125 + ], + "(7, 7, 2, 6, 5)": [ + -3.7857601475360223, + 0.0, + 0.0 + ], + "(7, 4, 9, 8, 5)": [ + -1.496829805009024, + -2.3990713951473266, + -2.298718690461978 + ], + "(6, 7, 1, 3, 4)": [ + 0.0, + -5.779002394864055, + 0.0 + ], + "(6, 5, 5, 5, 5)": [ + -0.37755628687631737, + -0.45836972838771733, + -0.5834800401220008 + ], + "(6, 7, 2, 4, 5)": [ + -4.862072148857919, + 0.0, + 0.0 + ], + "(7, 2, -1, 7, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 2, 1, 4, 5)": [ + -3.5687827936638534, + -4.906785625217264, + -4.9488142556384105 + ], + "(7, 6, 7, 4, 5)": [ + 0.0, + -1.754408525499818, + 0.0 + ], + "(7, 4, 6, 4, 5)": [ + -0.39833759295929017, + -1.156509406466447, + -1.0219529186080378 + ], + "(8, 2, 4, 6, 5)": [ + -3.3601990125973025, + -3.8482196460020086, + -2.810104803432087 + ], + "(6, 2, 7, 7, 5)": [ + -4.362724773319966, + 0.0, + 0.0 + ], + "(6, 2, 3, 4, 4)": [ + -3.5219535441312564, + 0.0, + -4.421938074443505 + ], + "(8, 3, 1, 3, 5)": [ + -4.27556165286596, + -4.577994011615113, + -2.7890504214918392 + ], + "(7, 6, 3, 4, 5)": [ + -1.641316110035963, + -2.672860464909251, + -0.7303192135361307 + ], + "(7, 5, 9, 2, 4)": [ + -2.005421969254476, + -1.2925672642121577, + -1.7764223616814383 + ], + "(9, 6, 5, 4, 5)": [ + -2.1172037257044067, + -1.0314117274891328, + -1.8177844862970125 + ], + "(9, 6, 9, 2, 4)": [ + -3.713262697867929, + -2.6302772038125766, + -4.206598242419714 + ], + "(6, 5, 5, 3, 4)": [ + -0.70710566412956, + -0.3655201210593841, + -0.23155662662377513 + ], + "(8, 7, 2, 7, 5)": [ + 0.0, + -3.936996245710164, + 0.0 + ], + "(7, 4, 6, 5, 4)": [ + -0.33051844670537134, + -0.42872274833565954, + -0.5200148814851359 + ], + "(6, 4, 2, 7, 5)": [ + -0.25907123132937887, + -0.6939424883914834, + -0.5601164236248583 + ], + "(6, 2, 8, 7, 5)": [ + -3.0761489827481507, + 0.0, + -5.578915824059289 + ], + "(8, 5, 4, 7, 5)": [ + -0.5594485268486677, + -1.088202827800619, + -1.0190025047264204 + ], + "(6, 4, 7, 4, 5)": [ + -0.9314105459906215, + -0.6124402988807214, + -0.9299914956648713 + ], + "(8, 7, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, -1, 3, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 3, 2, 3, 5)": [ + -3.0188140768323866, + -2.773632639037632, + 0.0 + ], + "(10, 5, 1, 3, 5)": [ + -4.534522524162071, + -4.930931162005484, + -4.251850261866908 + ], + "(9, 2, 6, 5, 5)": [ + -3.6928657730449888, + -4.103234515435284, + 0.0 + ], + "(6, 3, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 3, 0, 2, 5)": [ + -3.206629695104597, + 0.0, + 0.0 + ], + "(7, 4, 2, 7, 5)": [ + -0.9565352391097293, + -0.44596404379507215, + -1.3498266571978115 + ], + "(7, 5, 6, 2, 4)": [ + -2.752971271557098, + -0.9494298582274501, + -0.21741969042729187 + ], + "(6, 5, 1, 5, 4)": [ + -2.259924439377102, + -1.2149024006293239, + -1.3590557750925183 + ], + "(6, 5, 0, 2, 5)": [ + -2.8258185114815917, + -2.4400902734138556, + 0.0 + ], + "(7, 7, 7, 4, 4)": [ + -2.581862876246603, + 0.0, + 0.0 + ], + "(9, 2, 2, 3, 4)": [ + -5.156140325272892, + 0.0, + 0.0 + ], + "(6, 4, 8, 2, 4)": [ + -0.44455603119146136, + -1.095050238111251, + -2.138275141750756 + ], + "(7, 4, 8, 4, 5)": [ + 0.0, + -0.7618892894324275, + 0.0 + ], + "(6, 6, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 3, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 2, 4, 5, 5)": [ + -3.3219105246970964, + -3.8072017567729732, + -3.958362412919363 + ], + "(6, 5, 3, 7, 5)": [ + -1.3578512615323712, + -0.5067090904930067, + -1.3862005152691357 + ], + "(7, 2, 3, 4, 4)": [ + -4.5037255305644806, + -4.09273314294408, + 0.0 + ], + "(7, 3, 8, 8, 5)": [ + -4.62055119742465, + 0.0, + -5.22765177920509 + ], + "(6, 4, 6, 2, 4)": [ + -1.208092549033361, + -0.5295285507184327, + -0.8395832490467349 + ], + "(6, 4, 8, 8, 5)": [ + -1.640513149044167, + -3.566565382284528, + -3.6443678315390593 + ], + "(7, 4, 3, 4, 5)": [ + -0.7365157445308328, + -0.508109562749683, + -0.3725569289946017 + ], + "(6, 2, 6, 3, 4)": [ + 0.0, + -4.838873374438915, + 0.0 + ], + "(8, 7, 3, 4, 5)": [ + 0.0, + -5.123936776182038, + 0.0 + ], + "(9, 2, 1, 4, 5)": [ + -4.89708155151526, + 0.0, + -5.13702924466105 + ], + "(8, 2, 7, 7, 5)": [ + -4.630027270243657, + 0.0, + 0.0 + ], + "(6, 5, 4, 8, 5)": [ + -1.8595621293470233, + 0.0, + 0.0 + ], + "(8, 4, 8, 8, 5)": [ + -1.759241484076681, + -2.5832542586089113, + -3.1392833831765152 + ], + "(6, 7, 5, 4, 4)": [ + -2.735954097574186, + 0.0, + 0.0 + ], + "(8, 2, 1, 3, 4)": [ + -5.711143157894318, + -5.76850786517112, + 0.0 + ], + "(7, 4, 6, 6, 5)": [ + -0.48667111997655843, + -0.6846661619153722, + -1.073877792325081 + ], + "(9, 4, 0, 2, 5)": [ + -3.3398220105910084, + -2.8845669540326986, + 0.0 + ], + "(6, 7, 2, 5, 4)": [ + 0.0, + 0.0, + -3.7055963478087035 + ], + "(6, 4, 6, 3, 4)": [ + -0.6112758935171383, + -0.27818279251919503, + -0.41918544419212844 + ], + "(6, 7, 9, 4, 4)": [ + -5.294862755058235, + 0.0, + 0.0 + ], + "(6, 5, 7, 4, 5)": [ + -1.1823795936171964, + -0.3871157733444171, + -0.8200011022701574 + ], + "(6, 5, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, 4, 8, 5)": [ + -2.5239992718907045, + -1.8029669304164935, + -3.0545446969818273 + ], + "(7, 6, 5, 4, 5)": [ + -1.6603354898445843, + -1.4625362861067353, + -0.7991093253476244 + ], + "(7, 4, -1, 6, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 7, 4, 2, 4)": [ + 0.0, + 0.0, + -2.753406004779453 + ], + "(8, 7, 2, 4, 5)": [ + -5.07005180021481, + 0.0, + 0.0 + ], + "(9, 3, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 5, 9, 6, 4)": [ + -3.367569374229565, + -1.583151206227692, + -3.3190609820610812 + ], + "(10, 5, 6, 4, 5)": [ + -2.64624865739977, + -1.1609886687304147, + -2.636665387211548 + ], + "(8, 4, 2, 3, 5)": [ + -2.0617915314567825, + -2.6771366211668672, + -1.417697472417855 + ], + "(7, 4, 4, 2, 4)": [ + -1.6420722561146002, + -0.8131037907738122, + -1.7663337740960925 + ], + "(9, 4, 6, 8, 5)": [ + -3.587460981043919, + -3.6245371639989337, + 0.0 + ], + "(6, 6, -1, 3, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 5, 5, 8, 5)": [ + -2.3205673438715664, + 0.0, + 0.0 + ], + "(6, 2, 3, 5, 5)": [ + -3.724364602469199, + -3.2017924598129026, + -3.6986650784639936 + ], + "(7, 2, 3, 5, 5)": [ + -3.9742113797440823, + -3.7895492034038045, + 0.0 + ], + "(9, 2, 3, 4, 4)": [ + 0.0, + 0.0, + -4.0738777129122585 + ], + "(6, 2, 6, 5, 5)": [ + 0.0, + -4.179288814061305, + 0.0 + ], + "(7, 7, 7, 5, 4)": [ + -4.15488063987864, + -4.735688950462531, + 0.0 + ], + "(6, 7, 7, 6, 5)": [ + 0.0, + -4.711282198636397, + 0.0 + ], + "(6, 6, 7, 6, 4)": [ + -2.2912400098553993, + -3.4677453236493356, + 0.0 + ], + "(8, 2, 9, 5, 4)": [ + -5.250894279658423, + 0.0, + 0.0 + ], + "(6, 5, 6, 4, 5)": [ + -0.6697692329338125, + -0.4610040766918517, + -1.5772475832282233 + ], + "(8, 3, 0, 7, 5)": [ + -3.7315758422680814, + -2.573433787944514, + -1.8662288528666535 + ], + "(6, 2, 4, 4, 4)": [ + -3.31004341417909, + -3.7821447107299946, + -3.9861467730484037 + ], + "(8, 4, 9, 4, 5)": [ + -2.8575649403357075, + -1.5767011546884724, + 0.0 + ], + "(6, 4, 9, 4, 5)": [ + -1.7273080641194551, + -1.575303346191725, + 0.0 + ], + "(6, 5, 7, 2, 4)": [ + -0.7575242560859798, + -1.168083456802882, + -0.266075296839871 + ], + "(8, 5, 0, 2, 5)": [ + -2.530339646915817, + -2.1187216147020287, + -3.6842419525111922 + ], + "(8, 5, 7, 6, 4)": [ + -1.6862200816467496, + -0.7310815084871917, + -2.157881976055283 + ], + "(7, 5, 6, 4, 5)": [ + -0.4014562996559327, + -0.816876012319621, + -0.873989759203885 + ], + "(7, 3, 4, 8, 5)": [ + -3.6569988005069627, + 0.0, + 0.0 + ], + "(7, 5, 3, 7, 5)": [ + -0.31202947981499074, + -1.0073580223053495, + -1.1946955606754857 + ], + "(8, 5, 5, 8, 5)": [ + -2.8173842516813856, + -3.4213159180668775, + -2.4810256992393662 + ], + "(6, 4, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, -1, 5, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 7, 8, 4, 4)": [ + -4.489195519569574, + -4.569301168185141, + -3.9016700171963703 + ], + "(8, 2, 4, 3, 4)": [ + -6.037137537053521, + 0.0, + 0.0 + ], + "(10, 6, 7, 8, 5)": [ + -4.24755968557563, + 0.0, + 0.0 + ], + "(7, 4, 8, 2, 4)": [ + -1.3979602709162273, + -1.288800637398774, + -0.6548600831379449 + ], + "(8, 4, 0, 2, 5)": [ + -2.4101456758068442, + -2.2816357253742616, + -2.0133856884764842 + ], + "(6, 2, -1, 4, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 7, 9, 5, 4)": [ + 0.0, + -5.69582159471589, + 0.0 + ], + "(6, 7, 5, 2, 4)": [ + -2.585652900269159, + 0.0, + 0.0 + ], + "(6, 2, 1, 3, 5)": [ + 0.0, + -8.17294063823083, + 0.0 + ], + "(6, 5, 0, 3, 5)": [ + -3.0248199421598896, + -3.225398472524988, + -1.3527391325719993 + ], + "(6, 5, 3, 5, 4)": [ + -1.0144788587153604, + -1.49098220266283, + -0.33104730659997994 + ], + "(7, 5, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 2, 3, 5)": [ + -2.4532375896870895, + 0.0, + 0.0 + ], + "(9, 2, 1, 3, 4)": [ + -5.5866448302455005, + -5.311001268984983, + -5.2260490079404756 + ], + "(7, 5, 5, 4, 5)": [ + -0.754578961092299, + -0.4507247043193938, + -0.3860693850369459 + ], + "(6, 4, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 7, 3, 6, 5)": [ + -3.8976356089829673, + 0.0, + 0.0 + ], + "(8, 2, 6, 6, 5)": [ + -3.9879756395466806, + 0.0, + 0.0 + ], + "(6, 3, 9, 2, 4)": [ + -2.4782193583707173, + 0.0, + -2.6180740958483195 + ], + "(10, 4, 4, 6, 4)": [ + -2.3892404180400657, + 0.0, + 0.0 + ], + "(6, 7, 7, 4, 4)": [ + 0.0, + -3.9671435187343227, + 0.0 + ], + "(7, 4, 5, 4, 5)": [ + -0.22860351381123267, + -0.33317822224702454, + -0.622416814334214 + ], + "(8, 7, 5, 6, 5)": [ + -4.049129514199788, + -4.06145313092303, + 0.0 + ], + "(6, 4, 0, 7, 5)": [ + -0.9437933531405645, + -1.7389176308048144, + 0.0 + ], + "(9, 6, 7, 4, 5)": [ + -1.4209320244060266, + 0.0, + 0.0 + ], + "(8, 7, 7, 3, 4)": [ + -4.2273509694207485, + 0.0, + 0.0 + ], + "(6, 2, 1, 2, 4)": [ + 0.0, + -5.771414244299033, + 0.0 + ], + "(7, 7, -1, 1, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, 9, 2, 4)": [ + -0.9969660935390836, + -1.3643218774041574, + -2.0842214528643175 + ], + "(8, 5, 7, 8, 5)": [ + -2.888680477512107, + 0.0, + -3.73229105577726 + ], + "(6, 4, 9, 2, 4)": [ + -1.757637448554227, + -1.1782743909296371, + -2.4351425532865094 + ], + "(7, 3, 7, 6, 4)": [ + -4.000733804732523, + -2.657992031386372, + 0.0 + ], + "(7, 5, 8, 4, 5)": [ + -1.5736615534689946, + 0.0, + 0.0 + ], + "(7, 4, 1, 3, 5)": [ + -2.875438670595531, + -3.431268104348905, + -1.4856609005313968 + ], + "(6, 4, 3, 2, 4)": [ + -2.3134278416797107, + -2.012276685388386, + -0.7620118118496846 + ], + "(7, 4, 0, 1, 4)": [ + -2.9958613453087986, + -2.9449683475749597, + -2.5225493071145113 + ], + "(9, 7, 0, 4, 4)": [ + -6.324222002401578, + -5.739124812146802, + 0.0 + ], + "(7, 5, 0, 7, 5)": [ + -1.9604809868801023, + -0.8596689673262474, + -1.8116491451494214 + ], + "(8, 5, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 7, 7, 5, 5)": [ + -4.753815807805813, + -4.5167952778874465, + -4.172655170308648 + ], + "(8, 2, 5, 3, 4)": [ + 0.0, + 0.0, + -3.997793313169848 + ], + "(7, 5, 1, 3, 5)": [ + -3.173761310814962, + -2.3519119939716338, + -1.2642853899914306 + ], + "(7, 7, 2, 2, 4)": [ + -5.008135938638624, + 0.0, + 0.0 + ], + "(7, 3, 5, 4, 5)": [ + -1.005096395065568, + -0.601773643251813, + -1.4355746567286878 + ], + "(7, 4, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, 1, 1, 4)": [ + 0.0, + -4.280137155076374, + 0.0 + ], + "(7, 2, 1, 3, 4)": [ + -4.911507411619095, + -5.764110623104191, + 0.0 + ], + "(6, 7, 8, 5, 5)": [ + -4.574445703545292, + 0.0, + 0.0 + ], + "(9, 4, 2, 1, 4)": [ + -1.9516261662157373, + 0.0, + 0.0 + ], + "(6, 6, 6, 8, 5)": [ + -3.126415953132205, + 0.0, + -3.9782359636583697 + ], + "(9, 4, 3, 3, 5)": [ + -2.9037474665100937, + -0.9716360011867957, + 0.0 + ], + "(7, 2, 6, 3, 4)": [ + -3.6607245920465132, + 0.0, + 0.0 + ], + "(7, 3, 9, 2, 4)": [ + 0.0, + 0.0, + -3.3583701519774802 + ], + "(10, 5, 6, 8, 5)": [ + -4.054698124117863, + 0.0, + 0.0 + ], + "(6, 5, -1, 4, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 1, 1, 4)": [ + -6.196349772016223, + 0.0, + 0.0 + ], + "(7, 3, 8, 4, 5)": [ + -2.211948082277804, + 0.0, + 0.0 + ], + "(6, 4, 7, 6, 4)": [ + -0.7721473484899926, + 0.0, + 0.0 + ], + "(6, 4, 8, 6, 4)": [ + -2.0254007169228374, + -1.0892048873032487, + -2.7685204927774283 + ], + "(9, 6, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 5, 7, 4, 5)": [ + -3.2092158592677347, + 0.0, + 0.0 + ], + "(9, 4, 7, 6, 4)": [ + -1.112688171988907, + 0.0, + 0.0 + ], + "(8, 7, 2, 5, 5)": [ + -4.055168203938682, + 0.0, + 0.0 + ], + "(7, 6, 0, 2, 5)": [ + -4.688539741920743, + 0.0, + 0.0 + ], + "(7, 5, 8, 6, 4)": [ + -3.4144911733820438, + -1.7074878320251698, + -2.675765359400308 + ], + "(6, 4, 6, 4, 5)": [ + -0.3916630968611017, + -0.8737290398216547, + -0.905587624556835 + ], + "(8, 5, 6, 6, 4)": [ + -1.3006217183197268, + 0.0, + 0.0 + ], + "(9, 3, 3, 3, 5)": [ + -3.041146930440907, + 0.0, + 0.0 + ], + "(6, 4, 2, 1, 4)": [ + 0.0, + -3.7443309970680962, + 0.0 + ], + "(6, 7, 1, 7, 5)": [ + -4.191639721957941, + 0.0, + 0.0 + ], + "(8, 2, 4, 5, 4)": [ + -3.515451513610259, + 0.0, + 0.0 + ], + "(6, 3, 0, 2, 5)": [ + 0.0, + 0.0, + -3.1568499776090846 + ], + "(6, 4, 3, 7, 5)": [ + -0.6059217251538439, + -1.2059490681220493, + -0.9093350456814306 + ], + "(6, 5, 7, 6, 4)": [ + -1.564623053928424, + -0.5923743943969543, + 0.0 + ], + "(7, 2, 5, 3, 4)": [ + -5.167509870658314, + 0.0, + 0.0 + ], + "(8, 3, 3, 3, 5)": [ + -2.736011096091425, + 0.0, + 0.0 + ], + "(6, 5, -1, 5, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(9, 7, 2, 2, 4)": [ + -5.407422104961205, + 0.0, + 0.0 + ], + "(7, 7, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(10, 4, 6, 6, 4)": [ + -2.557393228947671, + 0.0, + 0.0 + ], + "(6, 5, 1, 3, 5)": [ + -2.9186939831807974, + -3.0872649162160806, + -1.475816723346956 + ], + "(8, 3, 6, 8, 5)": [ + -3.2081008311916035, + -4.625455456635738, + 0.0 + ], + "(6, 4, 5, 8, 5)": [ + -1.8144725850640797, + -2.813103461165628, + 0.0 + ], + "(7, 4, 0, 7, 5)": [ + -1.3158115516035611, + -2.7048857434623805, + -2.5927062835451693 + ], + "(9, 5, 2, 8, 5)": [ + -1.718075315640972, + 0.0, + -2.035461853393519 + ], + "(8, 4, 7, 6, 4)": [ + -1.3465878904219037, + -0.7800514166460646, + -2.84491271897027 + ], + "(8, 2, 5, 5, 4)": [ + -3.3088397020577247, + 0.0, + 0.0 + ], + "(7, 6, 7, 8, 5)": [ + 0.0, + -3.7067095047277596, + 0.0 + ], + "(8, 5, 4, 6, 4)": [ + -0.6816536062741939, + 0.0, + 0.0 + ], + "(8, 7, 3, 5, 5)": [ + -4.342728089677641, + 0.0, + 0.0 + ], + "(8, 2, 4, 7, 5)": [ + -4.137508126232268, + 0.0, + 0.0 + ], + "(8, 6, 7, 6, 4)": [ + -2.1505795296181467, + -3.933583839507012, + 0.0 + ], + "(8, 5, 7, 4, 5)": [ + -0.8085116243586326, + -0.7118278537066919, + -0.8777764752478592 + ], + "(7, 4, 4, 3, 5)": [ + -1.7428535142070851, + 0.0, + 0.0 + ], + "(9, 6, 6, 8, 5)": [ + -3.7511988096261897, + 0.0, + 0.0 + ], + "(6, 5, 5, 8, 5)": [ + -2.0006509615334918, + 0.0, + 0.0 + ], + "(7, 4, 4, 8, 5)": [ + -1.3844910595260926, + 0.0, + 0.0 + ], + "(7, 6, 6, 4, 5)": [ + -1.398198739055339, + -1.382112610526236, + -1.6316163001261028 + ], + "(6, 5, 2, 8, 5)": [ + 0.0, + 0.0, + -0.43565814205819114 + ], + "(7, 5, 6, 8, 5)": [ + 0.0, + -3.3831015263280246, + 0.0 + ], + "(6, 5, 8, 6, 4)": [ + -1.3331039583777324, + -2.9896092479827763, + -2.598930671280353 + ], + "(6, 5, 8, 4, 5)": [ + -2.289219011611318, + 0.0, + 0.0 + ], + "(6, 5, 9, 7, 4)": [ + -3.6420002090489096, + -2.0844544009131165, + 0.0 + ], + "(6, 7, 1, 6, 5)": [ + -4.3432934189895125, + 0.0, + 0.0 + ], + "(7, 2, 5, 7, 5)": [ + 0.0, + -6.1190640492944475, + 0.0 + ], + "(10, 6, 3, 4, 5)": [ + 0.0, + -3.634112799664692, + 0.0 + ], + "(8, 7, 8, 3, 4)": [ + 0.0, + -4.5364013817165105, + 0.0 + ], + "(6, 5, 2, 1, 4)": [ + -3.3924712694361587, + 0.0, + 0.0 + ], + "(6, 5, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 5, 9, 4, 5)": [ + -2.906235552171986, + 0.0, + 0.0 + ], + "(7, 4, 9, 4, 5)": [ + -2.68044297244605, + 0.0, + 0.0 + ], + "(7, 2, 7, 5, 4)": [ + -3.7225484301814387, + 0.0, + 0.0 + ], + "(7, 7, 8, 4, 4)": [ + -4.0108273117073825, + 0.0, + 0.0 + ], + "(6, 7, 2, 5, 5)": [ + -4.10847173030507, + 0.0, + 0.0 + ], + "(8, 2, 6, 4, 4)": [ + -3.9870435443972108, + 0.0, + 0.0 + ], + "(8, 7, 6, 4, 4)": [ + -3.6939544719995743, + 0.0, + 0.0 + ], + "(6, 2, -1, 2, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(6, 4, 6, 8, 5)": [ + -1.998482678857973, + 0.0, + 0.0 + ], + "(6, 2, 4, 3, 4)": [ + -4.540922572900308, + 0.0, + 0.0 + ], + "(7, 5, 7, 6, 4)": [ + -1.0405662305526906, + 0.0, + 0.0 + ], + "(6, 4, 7, 8, 5)": [ + -1.838856350345945, + -2.7371981711584796, + -3.2533670538996535 + ], + "(7, 7, 4, 4, 4)": [ + -4.744866365001842, + -3.5079125080208726, + -3.369463045380982 + ], + "(6, 4, 2, 3, 5)": [ + -2.136187999389911, + 0.0, + 0.0 + ], + "(7, 2, 1, 2, 4)": [ + -5.857387137244897, + 0.0, + 0.0 + ], + "(7, 7, 5, 3, 4)": [ + -5.631516032608987, + 0.0, + 0.0 + ], + "(8, 5, 2, 3, 5)": [ + -2.9200629483707763, + -2.229717471849605, + -1.266604920974991 + ], + "(8, 7, 3, 3, 4)": [ + -4.745191209688192, + 0.0, + 0.0 + ], + "(6, 6, 8, 6, 4)": [ + -2.235151566896168, + 0.0, + 0.0 + ], + "(7, 4, 7, 8, 5)": [ + -2.082979992077216, + -3.3408512440796994, + -2.706190392295233 + ], + "(8, 5, 9, 7, 4)": [ + -2.3682083466303006, + 0.0, + 0.0 + ], + "(8, 4, 1, 1, 4)": [ + -3.717450130798851, + 0.0, + 0.0 + ], + "(8, 6, 3, 3, 5)": [ + -2.942974578094382, + 0.0, + 0.0 + ], + "(6, 4, 4, 8, 5)": [ + -1.184901438099007, + -0.5310242041991893, + -2.2206964613496964 + ], + "(8, 6, 6, 6, 4)": [ + -2.716523180770821, + 0.0, + 0.0 + ], + "(9, 6, 2, 3, 5)": [ + -3.270628260713784, + 0.0, + 0.0 + ], + "(7, 7, 7, 6, 5)": [ + -4.014210663915246, + 0.0, + 0.0 + ], + "(7, 5, -1, 2, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 3, 1, 4)": [ + 0.0, + 0.0, + -2.0099277161803686 + ], + "(9, 7, 5, 4, 4)": [ + -3.988578141315127, + 0.0, + 0.0 + ], + "(6, 2, 2, 6, 5)": [ + -4.006740431816333, + 0.0, + 0.0 + ], + "(7, 4, 5, 6, 4)": [ + -0.7339019241026125, + 0.0, + 0.0 + ], + "(9, 4, 5, 8, 5)": [ + -1.578981091130795, + 0.0, + 0.0 + ], + "(9, 5, 0, 2, 5)": [ + -3.0179359160119796, + 0.0, + 0.0 + ], + "(8, 4, 6, 6, 4)": [ + -1.4543581598999331, + 0.0, + 0.0 + ], + "(7, 2, 8, 7, 5)": [ + -5.492341255119033, + 0.0, + 0.0 + ], + "(7, 5, 9, 7, 4)": [ + -2.2040222730102395, + 0.0, + 0.0 + ], + "(7, 7, 6, 6, 5)": [ + -3.8964337908686772, + 0.0, + 0.0 + ], + "(6, 6, 5, 8, 5)": [ + -2.835676755244798, + 0.0, + -3.6540428778263694 + ], + "(8, 4, 4, 8, 5)": [ + -1.5563447049712058, + 0.0, + 0.0 + ], + "(7, 2, 6, 7, 5)": [ + -3.7972674118532423, + 0.0, + 0.0 + ], + "(7, 7, 5, 5, 4)": [ + 0.0, + -3.6748955140188615, + 0.0 + ], + "(7, 2, 8, 5, 5)": [ + -4.136966760291107, + 0.0, + 0.0 + ], + "(6, 3, 6, 8, 5)": [ + -2.4743557035313497, + 0.0, + 0.0 + ], + "(7, 2, 6, 5, 4)": [ + -3.3649850235426424, + 0.0, + 0.0 + ], + "(6, 7, 3, 3, 4)": [ + -5.807372100659935, + 0.0, + 0.0 + ], + "(6, 2, 6, 4, 4)": [ + -2.9764444638745067, + 0.0, + 0.0 + ], + "(9, 5, 4, 8, 5)": [ + -3.136154706213425, + 0.0, + 0.0 + ], + "(7, 6, 4, 8, 5)": [ + -3.6845376174867663, + 0.0, + 0.0 + ], + "(6, 2, -1, 8, 5)": [ + 0.0, + 0.0, + 0.0 + ], + "(7, 4, 6, 8, 5)": [ + -1.8398309557203925, + 0.0, + 0.0 + ], + "(6, 5, -1, 7, 4)": [ + 0.0, + 0.0, + 0.0 + ], + "(8, 5, 6, 8, 5)": [ + -3.260697475801561, + 0.0, + 0.0 + ], + "(9, 2, 5, 5, 4)": [ + -3.5631651150817296, + 0.0, + 0.0 + ] + } +} \ No newline at end of file diff --git a/models/q_trained.json b/models/q_trained.json deleted file mode 100644 index e5468f5..0000000 --- a/models/q_trained.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "date": "29.04.2026 06:53:49", - "pendulum": { - "start_speed": "1.0", - "render_mode": "none", - "reward_limit": "0.0" - }, - "q_agent": { - "use_trained": "True", - "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_trained.json", - "episodes": "6000", - "steps": "30006000", - "learning_rate": "0.1", - "discount_factor": "0.95" - }, - "q_values": { - "(0, 0, 0, 1, 1)": [ - -0.7127999098776818, - -0.7204031480080048, - -0.7412199306092444 - ], - "(0, 0, 0, 0, 0)": [ - -0.39882058710042717, - -0.43180066871885253, - -0.36789168710316733 - ], - "(0, 0, 0, 1, 0)": [ - -0.49644387699601483, - -0.476832491697103, - -0.4808429865234992 - ], - "(0, 0, 1, 1, 0)": [ - -0.3645407668594485, - -0.34941296493381946, - -0.19816466371287308 - ], - "(0, 1, 1, 1, 0)": [ - -0.27335521972045285, - -0.31790379183091966, - -0.2034872242749172 - ], - "(0, 1, 0, 1, 0)": [ - -0.6087312502217588, - -0.6754940805998394, - -0.6535399837815964 - ], - "(0, 1, 0, 2, 0)": [ - -0.3949208069494323, - -0.4631147311708943, - -0.4776412098931605 - ], - "(0, 0, 0, 2, 0)": [ - -0.2712981364627587, - -0.17654049561221843, - -0.2508326205458066 - ], - "(0, 0, 1, 2, 0)": [ - -0.48498802268403846, - -0.4395215670942963, - -0.4722944229115358 - ], - "(0, 1, 1, 2, 0)": [ - -0.4990197857734165, - -0.5327879501542365, - -0.4941112778002146 - ], - "(0, 0, 0, 3, 0)": [ - -0.5387880192090378, - -0.4784712525147248, - -0.517952873228921 - ], - "(0, 0, 1, 3, 0)": [ - -0.9096919737168466, - -0.9127452620968198, - -0.9420045562304813 - ], - "(0, 1, 1, 3, 0)": [ - -0.8667830882886871, - -0.8757935260356404, - -0.8758730446292982 - ], - "(0, 1, 0, 3, 0)": [ - -0.43694463364384284, - -0.32317351557573637, - -0.37671045435695716 - ], - "(0, 0, 1, 4, 0)": [ - -0.9306066987431686, - -0.9344436974699757, - -0.9655748330701439 - ], - "(0, 1, 1, 4, 0)": [ - -1.009825188680733, - -1.016868953064729, - -0.9957558578136729 - ], - "(0, 1, 0, 4, 0)": [ - -1.0369014461449961, - -1.0197443807886495, - -0.9976879186706535 - ], - "(0, 0, 0, 4, 0)": [ - -0.8997996021390884, - -0.8913054855090478, - -0.8905808268698551 - ], - "(0, 1, 0, 5, 0)": [ - -1.5826848759769268, - -2.7445575744690793, - -2.418367271258592 - ], - "(0, 0, 0, 5, 0)": [ - -1.6683128963172371, - -2.251311793007559, - -2.3851805260338708 - ], - "(0, 0, 1, 5, 0)": [ - -2.2373735329153392, - -1.540495957571949, - -2.76737403946213 - ], - "(0, 1, 1, 5, 0)": [ - -2.3314084980057013, - -1.5138347954693265, - -3.01917937692279 - ], - "(0, 1, 0, 1, 1)": [ - -0.261055476317184, - -0.27846357082465933, - -0.2774020188584469 - ], - "(0, 0, 1, 1, 1)": [ - -0.1342852547795026, - -0.2470169520959763, - -0.2126480225045462 - ], - "(0, 1, 1, 1, 1)": [ - -0.2797380701937499, - -0.2945979948624919, - -0.24076792235861236 - ], - "(0, 1, 1, 2, 1)": [ - -0.2728844361768713, - -0.13972184601087123, - -0.3275551939924255 - ], - "(0, 1, 0, 2, 1)": [ - -0.455039876626072, - -0.43296129057936117, - -0.4316836608934558 - ], - "(0, 0, 0, 2, 1)": [ - -0.5686315534261919, - -0.5538077807341172, - -0.5496103554748915 - ], - "(0, 0, 0, 3, 1)": [ - -0.3966116309786595, - -0.3317568230750391, - -0.30858102473455185 - ], - "(0, 0, 1, 3, 1)": [ - -0.8315655206780324, - -0.8333814435452305, - -0.7756715486070018 - ], - "(0, 1, 1, 3, 1)": [ - -0.9831842749294987, - -0.9782200055298229, - -0.9930127344944251 - ], - "(0, 1, 0, 3, 1)": [ - -0.6539627507980373, - -0.5852573030361744, - -0.6763166111516389 - ], - "(0, 1, 0, 4, 1)": [ - -0.9026947631459618, - -0.9407969095587947, - -0.965156293555089 - ], - "(0, 0, 0, 4, 1)": [ - -1.0295607537932239, - -1.0110078430982656, - -1.0217477290303583 - ], - "(0, 0, 1, 4, 1)": [ - -1.0198724273521527, - -1.0273376264121616, - -1.0372176976745933 - ], - "(0, 1, 1, 4, 1)": [ - -0.8367514960793316, - -0.8072150440466215, - -0.7999324124740165 - ], - "(0, 0, 1, 5, 1)": [ - -2.826052632887979, - -2.8216800501972115, - -2.8339346737355218 - ], - "(0, 1, 1, 5, 1)": [ - -2.769926115050464, - -2.7896094930838444, - -2.784544336312168 - ], - "(0, 1, 0, 5, 1)": [ - -2.7928766121585795, - -2.7887103458307694, - -2.7938313222414037 - ], - "(0, 0, 0, 5, 1)": [ - -2.8104767031828572, - -2.8062208641671322, - -2.8101316497840574 - ], - "(0, 0, 1, 2, 1)": [ - -0.5213427535062244, - -0.5910962186115551, - -0.47068284911064734 - ], - "(0, 0, 1, 0, 0)": [ - -0.41286468970384216, - -0.42684989269569895, - -169.29165129913554 - ], - "(0, 1, 0, 0, 0)": [ - -0.11933872055277986, - -0.1195010821067479, - -0.1499420269134481 - ], - "(0, 1, 1, 0, 0)": [ - -0.20624980702980253, - -0.22645535674627537, - -0.18943028486599597 - ] - } -} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 57cf45d..e5e293a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,11 +72,12 @@ dependencies = [ "scipy>=1.17.1", "pandas>=3.0", "gymnasium>=1.2.3", - "pygame-ce>=2.5", # replacement for pygame (transitive dependency of gymnasium) - "stable-baselines3[extra]>=2.8", # does not support Python 3.14 (By the time of writing, 2026-04-22) + "pygame-ce>=2.5", # replacement for pygame (transitive dependency of gymnasium) + "stable-baselines3[extra]>=2.8", # does not support Python 3.14 (By the time of writing, 2026-04-22) "matplotlib>=3.10", "seaborn>=0.13.2", "tqdm>=4.67", + "pyment>=0.3.3", ] [project.urls] diff --git a/scripts/analyse_q.py b/scripts/analyse_q.py index 56dd6b9..96a0547 100644 --- a/scripts/analyse_q.py +++ b/scripts/analyse_q.py @@ -36,7 +36,7 @@ def _build_dummy_env() -> AntiPendulumEnv: AntiPendulumEnv Environment with discrete observation space. """ - return AntiPendulumEnv(build_crane, discrete=QLearningAgent.DEFAULT_DISCRETE.copy()) + return AntiPendulumEnv(build_crane, discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy()) def main() -> None: diff --git a/scripts/play_q.py b/scripts/play_q.py index d24bb80..1f7f322 100644 --- a/scripts/play_q.py +++ b/scripts/play_q.py @@ -33,7 +33,7 @@ def main() -> None: build_crane, start_speed=args.v0, render_mode=args.render_mode, - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), + discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), ) agent = QLearningAgent(env, trained=(args.model_path, True)) diff --git a/scripts/train_q.py b/scripts/train_q.py index baf6dcd..0c0814d 100644 --- a/scripts/train_q.py +++ b/scripts/train_q.py @@ -58,7 +58,7 @@ def main() -> None: start_speed=args.v0, render_mode="plot" if args.dry_run else "none", reward_limit=args.reward_limit, - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), + discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), ) if args.dry_run: diff --git a/scripts/use_q_ide.py b/scripts/use_q_ide.py index f3532a4..ef555c9 100644 --- a/scripts/use_q_ide.py +++ b/scripts/use_q_ide.py @@ -11,83 +11,102 @@ from crane_controller.crane_factory import build_crane from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv +from crane_controller.envs.simple_test_env import SimpleTestEnv from crane_controller.q_agent import QLearningAgent +from crane_controller.experiment_config import RewardConfig + logging.basicConfig(level=logging.INFO, format="%(message)s") LOGGER = logging.getLogger(__name__) +MODELS = Path(__file__).parent.resolve().parent / "models" + -def do_use(kwargs: dict[str, Any]) -> None: +def do_use( v0 : float = 1.0, + render : str = 'none', + file : str|None = None, + use_file : str = "r", + episodes : int = 10000, + steps : int = 5000, + rc : RewardConfig = None, + reward : float|None = None, + disc : float = 0.8, + lr : float = 0.1, + seed : int = 1, + s : int = 0 + ) -> None: """Perform training on the (Anti-)Pendulum environment using q-learning. Args: - dry_run (bool)=False: True: perform only a short run with plotting v0 (float)=1.0: start speed of load in x-direction. 0: Pendulum mode, >/< 0 same/random start at every episode render (str)='none': render mode of environment - reward (float)=-0.1: reward limit at which episode is terminated file (str): Optional definition of model-save file use_file (str): How 'file' is used (if exists): 'r', 'w', 'rw' episodes (int)=10000: nnumber of episodes run in the training steps (int)=5000: number of steps per episodes (if not terminated or truncated) - t_fac (float)=0.001 + fac (tuple[float,...])=(0.01,0.01), + reward (float): optional reward limit + disc (float) = 0.8: discount rate of acceleration history to include in observation + lr (float) = 0.1: optionally change the learning rate + seed (int) = 1: optionally change the start seed """ - if "dry-train" in kwargs: # Check training setup (over-write some parameters) - kwargs.update({"render": "plot", "file": None, "use_file": "r", "episodes": 10, "steps": 1000}) - elif "dry_do" in kwargs: # Run a few episodes on trained data (file can be set by caller) - kwargs.update({"render": "plot", "use_file": "r", "episodes": 10, "steps": 1000}) env = AntiPendulumEnv( build_crane, - seed=1, - dt=0.1, - start_speed=kwargs.get("v0", 1.0), - render_mode=kwargs.get("render", "none"), - reward_limit=kwargs.get("reward", 0.0), - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), - reward_fac=(1.0, 0.0015, kwargs.get("t_fac", 0.0)), + seed=seed, + dt=1.0, + start_speed=v0, + render_mode=render, + discrete=AntiPendulumEnv.DEFAULT_DISCRETE if s!=2 else AntiPendulumEnv.DISCRETE2, + reward_fac = rc, + reward_limit = reward, + discount = disc, ) - filename = kwargs.get("file") + filename = file if filename is not None: Path(filename).parent.mkdir(parents=True, exist_ok=True) - use_file = kwargs.get("use_file", "r") - agent = QLearningAgent(env, filename=filename, use_file=use_file) - agent.do_episodes(n_episodes=kwargs.get("episodes", 100), max_steps=kwargs.get("steps", 5000)) - if filename is not None and 'w' in agent.use_file: + agent = QLearningAgent(env, + filename=filename, + use_file=use_file, + learning_rate=lr, + strategy = s) + print("DISCRETE", agent.env.discrete) + agent.do_episodes(n_episodes=episodes, max_steps=steps, show=0) + if filename is not None and "w" in agent.use_file: LOGGER.info(f"Model saved to {filename}") + #print("REVISED", agent.q_revised) +def simple_env( episodes:int, render:str, file:str, use:str, r_limit:float|None, steps:int): + env = SimpleTestEnv( + acc = 1.0, + pos_range = (-100,100), + speed_range = (-10,10), + reward_fac = (1.0, 1.0), + reward_limit = r_limit, + dt = 1.0, + pos0 = 0.0, + speed0 = -5.0, + pos1 = 10.0, + speed1 = 0.0, + render_mode = render + ) + agent = QLearningAgent(env, filename=file, use_file=use) + agent.do_episodes(n_episodes=episodes, max_steps=steps) -if __name__ == "__main__": - def _args(base: dict[str, Any], upd: dict[str, Any]) -> dict[str, Any]: - base.update(upd) - return base +if __name__ == "__main__": - models = Path(__file__).parent.resolve().parent / "models" - anti = { # anti-pendulum settings - "v0": -5.0, - "render": "none", - "reward": 0.0, - "file": models / "q_anti-pendulum.json", - "use_file": "rw", - "episodes": 1000, - "steps": 2000, - "t_fac": 0.0, - } - pend = { # start pendulum settings - "v0": 0.0, - "render": "none", - "reward": 200.0, - "file": models / "q_pendulum.json", - "use_file": "rw", - "episodes": 1000, - "steps": 2000, - "t_fac": 0.0, - } # ruff: disable[ERA001] ## we intentionally work with commenting out lines here - #args = _args(anti, {"episodes": 10000}) # anti-pendulum (additional) training - #args = _args(pend, {'episodes':1000}) # pendulum training - args = _args( anti, {"episodes": 10, "render": "plot","use_file":'r'}) # show anti-pendulum results - # args = _args( pend, {"episodes": 10, "render": "plot", "use_file":'r'}) # show start pendulum results + # do_use( v0, render, file, use_file, episodes, steps, rc, reward, s, seed, ) + ## Anti-pendulum training and results: + rc = RewardConfig(energy=1.0,positional=1.0,crane_velocity=0.5) + do_use( 2, 'data', MODELS / "q_anti-pendulum_2.json", 'rw', 30000, 1000, rc, reward=-0.1, s=2, seed=43) + #do_use( 2, 'plot', MODELS / "q_anti-pendulum_2.json", 'r', 10, 1000, rc, reward=-0.001, s=2) + ## Pendulum training and results: + # args = _args(pend, {'episodes':1000}) # pendulum training + #args = _args( pend, {"episodes": 10, "render": "plot", "use_file":'r'}) # show start pendulum results # args = args.update(_args(anti, {'dry-train':True,})) # check the setup before a long training + #simple_env(episodes=50000, render="none", file=models/"q_simple.json", use="w", r_limit=29.4, steps=200) + #simple_env(episodes=10, render="plot", file=models/"q_simple.json", use="r", r_limit=29.7, steps=20) # ruff: enable[ERA001] - do_use(args) + diff --git a/src/crane_controller/algorithm.py b/src/crane_controller/algorithm.py index 37839dd..52cbd44 100644 --- a/src/crane_controller/algorithm.py +++ b/src/crane_controller/algorithm.py @@ -32,31 +32,24 @@ def _get_moving_avgs( ) -> np.ndarray: """Compute moving averages to smooth noisy data. - Parameters - ---------- - values : Sequence[float] | np.ndarray - Raw data series to smooth. - window : int - Number of elements in the averaging window. - convolution_mode : {"valid", "same"} - Convolution mode passed to `numpy.convolve`. + Args: + values(Sequence[float] | np.ndarray): Raw data series to smooth. + window(int): Number of elements in the averaging window. + convolution_mode({"valid", "same"}): Convolution mode passed to `numpy.convolve`. + values: Sequence[float] | np.ndarray: + window: int: + convolution_mode: Literal["valid": + "same"]: Returns ------- - np.ndarray - Smoothed data series. + Moving average as np array """ return np.convolve(np.asarray(values, dtype=float).flatten(), np.ones(window), mode=convolution_mode) / window class AlgorithmAgent: - """Agent for algorithmic control of a simple environment. - - Parameters - ---------- - env : AntiPendulumEnv - The environment to be controlled. Must provide `.reset()` and `.step()` methods. - """ + """Agent for algorithmic control of a simple environment.""" envs = ("AntiPendulumEnv",) @@ -66,10 +59,8 @@ def __init__( ) -> None: """Initialize the algorithmic agent. - Parameters - ---------- - env : AntiPendulumEnv - The environment to be controlled. + Args: + env (AntiPendulumEnv): The environment to be controlled. """ self.env = env assert type(self.env).__name__ in AlgorithmAgent.envs, f"Environment {type(self.env).__name__} not listed." @@ -83,20 +74,14 @@ def get_action(self, obs: AntiPendulumObs) -> int: The algorithmic strategy is coded as ``self.strategy`` and the observation slots 0, 3, 4 are ignored. - Parameters - ---------- - obs : AntiPendulumObs - Current observation from the environment. + Args: + obs(AntiPendulumObs): Current observation from the environment. Returns ------- - int - An allowed action from the action space. + int: An allowed action from the action space. + - Raises - ------ - ValueError - If `obs` contains an unexpected combination of position and speed. """ if obs == START_MODE_OBSERVATION: # in start mode. Random push to get started. return int(self.env.np_random.choice((0, 2))) @@ -125,10 +110,8 @@ def do_strategies(self, max_steps: int = 5000) -> None: where ``pos = obs[1]`` and ``speed = obs[2]``. Observations 0, 3 and 4 are ignored. - Parameters - ---------- - max_steps : int, optional - Maximum number of steps per episode before truncation (default 5000). + Args: + max_steps (int)=5000: Maximum steps per episodes """ rewards: list[float] = [] for self.strategy in product(range(3), range(3), range(3), range(3)): @@ -150,15 +133,10 @@ def do_strategies(self, max_steps: int = 5000) -> None: def do_episodes(self, n_episodes: int = 1000, show: int = 0, max_steps: int = 1000) -> None: """Run training episodes. - Parameters - ---------- - n_episodes : int, optional - Number of episodes to run (default 1000). - show : int, optional - Visualization mode - 0 for none, 1 for training summary, 2 for - per-episode analysis (default 0). - max_steps : int, optional - Maximum steps per episode before truncation (default 1000). + Args: + n_episodes (int)=1000: Number of episodes to run + show (int)=0: Show mode (default: no show) + max_steps (int)=1000: max steps per episodes """ for _episode in tqdm(range(n_episodes)): # Start a new episode @@ -185,10 +163,8 @@ def do_episodes(self, n_episodes: int = 1000, show: int = 0, max_steps: int = 10 def analyse_training(self, window: int = 500) -> None: """Plot moving averages of episode rewards, lengths, and training error. - Parameters - ---------- - window : int, optional - Number of episodes used for the smoothing window (default 500). + Args: + window (int)=500: Moving average window """ # Smooth over the given episode window _, axs = plt.subplots(ncols=3, figsize=(12, 5)) @@ -223,10 +199,8 @@ def analyse_training(self, window: int = 500) -> None: def analyse_episode(self, window: int = 100) -> None: """Plot moving averages of rewards and training error for one episode. - Parameters - ---------- - window : int, optional - Number of steps used for the smoothing window (default 100). + Args: + window (int)=500: Moving average window """ # Smooth over the given episode window _, axs = plt.subplots(ncols=2, figsize=(12, 5)) @@ -251,15 +225,12 @@ def analyse_episode(self, window: int = 100) -> None: def test_agent(self, num_episodes: int = 1000) -> str: """Test agent performance without learning or exploration. - Parameters - ---------- - num_episodes : int, optional - Number of evaluation episodes (default 1000). + Args: + num_episodes(int, optional): Number of evaluation episodes (default 1000). Returns ------- - str - Formatted summary of win rate, average reward, and standard deviation. + (str) message """ total_rewards: list[float] = [] diff --git a/src/crane_controller/envs/controlled_crane_pendulum.py b/src/crane_controller/envs/controlled_crane_pendulum.py index 8a5a795..faac490 100644 --- a/src/crane_controller/envs/controlled_crane_pendulum.py +++ b/src/crane_controller/envs/controlled_crane_pendulum.py @@ -237,8 +237,11 @@ def init_discrete( def energy_max(self): try: return self.discrete['energy'][-1] - except KeyError as err: - logger.error(f"'energy' not part of discretization, such that maximum value is not defined: {err}") + except KeyError as err1: + try: + return 0.5*self.discrete['speed'][-1]**2 + except KeyError as err2: + logger.error(f"'energy' or 'speedæ not part of discretization, => maximum value not defined: {err2}") @property def distance_max(self): @@ -301,7 +304,7 @@ def show_plot(self, episode: int, save_path: str | None = None) -> None: """ if not self.traces["l_v"]: return - fig, (ax1, ax2, ax3, ax4, ax5, ax6) = plt.subplots(6, 1, figsize=(16, 18), sharex=True) + fig, (ax1, ax2, ax3, ax4, ax5, ax6) = plt.subplots(6, 1, figsize=(16, 10), sharex=True) times = self.dt * np.arange(len(self.traces["c_x"])) damping = self.traces["l_v"][0] * np.exp(-times / self.wire.damping_time) ax1.plot(times, self.traces["l_x"], label="load angle", color="blue") @@ -421,22 +424,12 @@ def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], floa theta_dot = (self.wire.cm_v[0] - self.wire.origin_v[0]) / self.wire.length # pyright: ignore[reportUnknownMemberType] theta_ddot = (theta_dot - self._prev_theta_dot) / self.dt if self._prev_theta_dot is not None else 0.0 self._prev_theta_dot = theta_dot - self.reward += ( # pyright: ignore[reportUnknownMemberType] - rc.angle * (-(theta**2)) - + rc.angular_velocity * (-(theta_dot**2)) - + rc.crane_velocity * (-(self.crane.velocity[0] ** 2)) - + rc.crane_acceleration * (-(acc**2)) - + rc.angular_acceleration * (-(theta_ddot**2)) - + rc.t_min_crane * (-self._t_min_crane()) - ) if len(self.discrete): - self.obs, truncate = self._get_discrete_obs(_r[0], acc) + self.obs, truncate = self._get_discrete_obs(energy, acc) else: self.obs, truncate = self._get_continuous_obs() - self.reward = sum( f*x for f,x in zip(self.reward_fac, _r, strict=True)) - if self.render_mode == "plot": self.traces["c_x"].append(self.crane.position[0]) self.traces["c_v"].append(self.crane.velocity[0]) diff --git a/src/crane_controller/envs/simple_test_env.py b/src/crane_controller/envs/simple_test_env.py new file mode 100644 index 0000000..c8c129c --- /dev/null +++ b/src/crane_controller/envs/simple_test_env.py @@ -0,0 +1,217 @@ +from typing import Any +import gymnasium as gym +from gymnasium import spaces +import matplotlib.pyplot as plt +import numpy as np + +class SimpleTestEnv(gym.Env[tuple[int, ...], int]): + """A simple test environment for testing the Q-learning agent. + + Actions: + Fixed acceleration (-,0,+)* acc + Observations: + Position, quantified as int in range pos_range + Speed, quantified as int in range speed_range + + Starting from initial position and speed, the goal is to arrive at final position and speed as quick as possible. + + Args: + acc (float)=1.0: The fixed acceleration (-acc, 0.0, +acc) + pos_range (tuple[int,int])=(-100,100): The range of positions (quantified as int) + speed_range (tuple[int,int])=(-10,10): The range of speeds (quantified as int) + reward_fac (tuple[float,float])=(1.0,1.0): the reward factors on positional and speed-related observations + reward_limit (float)=None: The reward at which the episode is terminated (success) + dt (float)=1.0: + pos0 (float)=0.0: initial position. Can be changed by initialize() + speed0 (float)=0.0: initial speed. Can be changed by initialize() + pos1 (float)=10.0: position goal. Can be changed by initialize() + speed (float)=0.0: speed goal. Can be changed by initialize() + seed (int): random seed value + render_mode (str): render mode: 'none', 'plot' + """ + def __init__(self, + acc:float=1.0, + pos_range:tuple[int,int]=(100,100), + speed_range:tuple[int,int]=(10,10), + reward_fac:tuple[float,float] = (1.0, 1.0), + reward_limit: float|None = None, + dt:float = 1.0, + pos0: float = 0.0, + speed0: float = 0.0, + pos1: float = 10.0, + speed1: float = 0.0, + seed: int = 1, + render_mode:str = 'none' + ): + _ = super().reset(seed=seed) + self.acc = acc + self.pos_range = pos_range + self.speed_range = speed_range + self.reward_fac = reward_fac + self.observation_space = spaces.MultiDiscrete( + nvec = np.array([len(self.pos_range)+1, len(self.speed_range)+1],np.int16), + dtype = np.int16, + start = np.array( [-self.pos_range[0], -self.speed_range[0]], np.int16)) + self.action_space = spaces.Discrete( n=3, start=0, dtype=np.uint16) + self.render_mode = render_mode + self.steps = 0 + self.time = 0.0 + self.dt =dt # time step setting + self.pos = self.pos0 = pos0 # initial position + self.speed = self.speed0 = speed0 # initial speed + self.pos1 = pos1 # goal position + self.speed1 = speed1 # goal speed + self.reward_limit = reward_limit if reward_limit is not None else self.calc_reward(self.pos1,self.speed1) + print("LIMIT", self.reward_limit) + self.rewards : list[float] = [] + self.traces: dict[str, list[float]] = {} + self.nresets: int = 0 + self.nsuccess: int = 0 + + + def initialize(self, + pos1: float, + speed1: float, + pos0: float=0.0, + speed0: float=0.0,)->None: + """Initialize the environment before a run (positions and speeds). + + Args: + pos1 (int): Goal position as int + speed1 (int): Goal speed as int + pos0 (int)=0.0: Start position as int + speed0 (int)=0.0: start speed as int + """ + self.pos = self.pos0 = pos0 + self.speed = self.speed0 = speed0 + self.pos1 = pos1 + self.speed1 = speed1 + + def calc_reward(self, pos:float, speed:float): + """Calculate the reward based on internal information, position and speed.""" + reward = (self.reward_fac[0]* (2*abs(self.pos1-self.pos0) - abs(self.pos1 - pos)) + + self.reward_fac[1]* (2*abs(self.speed1-self.speed0) - abs(self.speed1 - speed))) + return reward + + def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], float, int]: + """Compute the current observation, the reward and truncation flag. + + The observations are current position and speed. + + Args: + acc (float): Acceleration (for use in traces) + + Returns: + tuple[np.ndarray | tuple[int, ...], float, int]: ``(observation, reward, truncate_flag)``. + """ + obs = (int(round(self.pos, 0)), int(round(self.speed, 0))) + reward = self.calc_reward( self.pos, self.speed) + truncate = not ((self.pos_range[0] < self.pos < self.pos_range[-1]) and + (self.speed_range[0] < self.speed < self.speed_range[-1]) and + reward > 0) + return (obs,reward,truncate) + + def _get_info(self, reward: float, steps: int) -> dict[str, float | int]: + return {"steps": steps, "reward": reward} + + + def reset( + self, + *, + seed: int | None = None, + options: dict[str, object] | None = None, + ) -> tuple[tuple[int, ...] | np.ndarray, dict[str, float | int]]: + """Reset the environment for a new episode. + + Args: + seed (int): Optional random seed (default None). + options (dict[str, object]): Optional additional arguments to super().reset(). Default None. + + Returns: + tuple[tuple[int, ...] | np.ndarray, dict[str, float | int]]: Initial observation and info dict. + """ + if self.nresets > 0: + if self.render_mode == 'plot': + self.show_plot( self.nresets) + self.nresets += 1 + self.pos = self.pos0 + self.speed = self.speed0 + _ = super().reset(seed=seed, options=options) + obs, self.reward, _ = self._get_obs() + if self.render_mode != 'none': + self.rewards.append(self.reward) + self.steps = 0 + self.time = 0.0 + info = self._get_info(self.reward, self.steps) + if self.render_mode == 'plot': + self.traces = {'t':[0.0], 'x': [self.pos], 'v': [self.speed], 'a': [0.0]} + return obs, info + + def step(self, action: int) -> tuple[tuple[int, ...] | np.ndarray, float, bool, bool, dict[str, float | int]]: + """Advance the environment by one time step. + + Args: + action (int): Action index [0,2], selecting the crane acceleration. + + Returns: + tuple[tuple[int, ...] | np.ndarray, float, bool, bool, dict[str, float | int]]: + (observation, reward, terminated, truncated, info) + """ + acc = -self.acc if action==0 else (0.0 if action==1 else self.acc) + self.steps += 1 + self.pos += self.speed*self.dt + 0.5*acc*self.dt*self.dt + self.speed += acc* self.dt + self.time += self.dt + if self.render_mode == 'plot': + self.traces['t'].append(self.time) + self.traces['x'].append(self.pos) + self.traces['v'].append(self.speed) + self.traces['a'].append(acc) + + obs, self.reward, truncated = self._get_obs(acc) + if self.render_mode != "none": + self.rewards.append(self.reward) + + terminated = self.reward > self.reward_limit + if terminated: + self.nsuccess += 1 + info = self._get_info(self.reward, self.steps) + return obs, self.reward, terminated, (truncated > 0), info + + + def show_plot(self, episode: int) -> None: + """Plot detailed traces for a single episode. + + Args: + episode (int): Episode number used in the plot title. + """ + _, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(15, 8)) + times = self.traces["t"] + ax1.plot(times, self.traces["x"], label="position", color="blue") + ax1y2 = ax1.twinx() + ax1y2.plot(times, self.traces["v"], label="speed", color="red") + ax2.plot(times, self.traces["a"], label="x-acceleration", color="green") + ax3.plot(times, self.rewards, label="rewards") + lines1, labels1 = ax1.get_legend_handles_labels() + lines2, labels2 = ax1y2.get_legend_handles_labels() + ax1.legend(lines1 + lines2, labels1 + labels2) + _ = ax2.legend() + _ = ax3.legend() + _ = plt.suptitle(f"Detailed plot of episode {episode}, reward:{self.reward}") + plt.show() + for key in self.traces: + self.traces[key] = [] + self.rewards = [] + + def get_parameters(self) -> dict[str, Any]: + """Return the environment parameter settings as dict.""" + return { + "min_pos": self.pos_range[0], + "max_pos": self.pos_range[1], + "min_speed": self.speed_range[0], + "max_speed": self.speed_range[1], + "reward-factors": self.reward_fac, + "acceleration": self.acc, + "step-size": self.dt, + "reward_limit": self.reward_limit, + } diff --git a/src/crane_controller/q_agent.py b/src/crane_controller/q_agent.py index 2b824d1..9de3f96 100644 --- a/src/crane_controller/q_agent.py +++ b/src/crane_controller/q_agent.py @@ -8,7 +8,7 @@ from ast import literal_eval from collections import defaultdict from pathlib import Path -from typing import TYPE_CHECKING, ClassVar, Literal +from typing import TYPE_CHECKING, Literal import numpy as np from matplotlib import pyplot as plt @@ -32,19 +32,14 @@ def _get_moving_avgs( ) -> np.ndarray: """Compute moving averages to smooth noisy data. - Parameters - ---------- - values : Sequence[float] | np.ndarray - Raw data series to smooth. - window : int - Number of elements in the averaging window. - convolution_mode : {"valid", "same"} - Convolution mode passed to `numpy.convolve`. + Args: + values(Sequence[float] | np.ndarray): Raw data series to smooth. + window(int): Number of elements in the averaging window. + convolution_mode(valid", "same"}): Convolution mode passed to `numpy.convolve`. Returns ------- - np.ndarray - Smoothed data series. + Moving average as np array """ return np.convolve(np.asarray(values, dtype=float).flatten(), np.ones(window), mode=convolution_mode) / window @@ -52,30 +47,19 @@ def _get_moving_avgs( class QLearningAgent: """Agent for training a controller via Q-learning. - Parameters - ---------- - env : AntiPendulumEnv - The environment to be trained. Must provide `.reset()` and `.step()` methods. - learning_rate : float, optional - How quickly to update Q-values, in the range (0, 1] (default 0.1). - initial_epsilon : float, optional - Starting exploration rate (default 1.0). - final_epsilon : float, optional - Minimum exploration rate (default 0.1). - discount_factor : float, optional - How much to value future rewards, in the range [0, 1] (default 0.95). - filename (Path): Optional path to filename for pre-trained data and saving of results - use_file (str) = 'r': How to use filename. 'r', 'w', 'rw'. File is not read when not found! + Args: + env (AntiPendulumEnv): The environment instance to use + learning_rate (float)=0.1: learning rate + epsilon_decay (float)=1e-4: epsilon decay + discount_factor (float)=0.95: Q-learning discound factor + filename (Path): Optional file name (json file) to use as basis / save results + use_file (str)='r': How to use the file (if provided). 'r', 'w' or 'rw' + strategy (int)=0: Strategy to use: + 0: base strategy taken from gymnasium + 1: use current Q-values as histogram when choosing next action (not max and no learning rate) + 2: alternative discrete space in environment: phase angle and moving average of acceleration """ - DEFAULT_DISCRETE: ClassVar[dict[str, tuple[float | int, ...]]] = { - "angles": (0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 90.0), - "pos": (0, 1), - "speed": (0, 1), - "distance": (0.0, 1.0, 2.0, 5.0, 10.0, 20.0), - "sector": (0, 1), - } - def __init__( self, env: AntiPendulumEnv, @@ -85,6 +69,7 @@ def __init__( discount_factor: float = 0.95, filename: Path | None = None, use_file: str = "r", + strategy: int = 0, ) -> None: """Initialize the Q-learning agent. @@ -106,6 +91,8 @@ def __init__( # Track learning progress self.training_error: list[float] = [] self.previous_steps = 0 + self.strategy = strategy + #self.q_revised = defaultdict(lambda: np.array((0,) * self.env.action_space.n, int)) def analyse_q(self, obs: tuple[int, ...]) -> None: """Log Q-table entries matching an observation pattern. @@ -113,10 +100,8 @@ def analyse_q(self, obs: tuple[int, ...]) -> None: Uses ``-1`` as a wildcard in the observation tuple to match any value in that dimension. - Parameters - ---------- - obs : tuple[int, ...] - Observation filter pattern. Dimensions set to ``-1`` match all. + Args: + obs: tuple[int,...]: Observation tuple """ for comb, q in self.q_values.items(): include = not any(o >= 0 and o != c for c, o in zip(comb, obs, strict=True)) @@ -126,20 +111,36 @@ def analyse_q(self, obs: tuple[int, ...]) -> None: def get_action(self, obs: tuple[int, ...]) -> int: """Choose an action using epsilon-greedy strategy. - Parameters - ---------- - obs : tuple[int, ...] - Current discretised observation. + Args: + obs(tuple[int, ...]): Current discretised observation. Returns ------- - int - Selected action index. + (int): action """ - if self.env.np_random.random() < self.epsilon: - return int(self.env.action_space.sample()) - # With probability (1-epsilon): exploit (best known action) - return int(np.argmax(self.q_values[obs])) + if self.strategy != 1: + if self.env.np_random.random() < self.epsilon: + self.num_rnd += 1 + return self.env.action_space.sample() + # With probability (1-epsilon): exploit (best known action) + return np.argmax(self.q_values[obs]) + elif self.strategy == 1: + _sum = 0.0 + for i,q in enumerate(self.q_values[obs]): + if q == 0: # never calculated. We want all possibilities tried out + return i + else: + _sum += q + cum = [] + sum = 0.0 + for q in self.q_values[obs]: + sum += q + cum.append(sum) + rnd = self.env.np_random.random()* _sum + for i,c in enumerate(cum): + if rnd <= c: + return i + return len(cum)-1 def update_q( self, @@ -149,60 +150,37 @@ def update_q( *, terminated: bool, next_obs: tuple[int, ...], - ) -> None: + prev_reward: float + ) -> bool: """Update Q-value based on experience. - This is the heart of Q-learning: learn from - (state, action, reward, next_state). - - See Also - -------- - `Q-learning `_ - - Parameters - ---------- - obs : tuple[int, ...] - Previous observed state. - action : int - Action performed in state `obs`. - reward : float - Reward received after taking `action`. - terminated : bool - Whether the episode ended after `action`. - next_obs : tuple[int, ...] - New observed state after `action`. + This is the heart of Q-learning: learn from (state, action, reward, next_state). + + Args: + obs (tuple[int,...]): the previoous observation + action (int): the current action performed on obs + reward (float): the reward from action, based on previous state (obs) + terminated (bool): termination status after action + next_obs (tuple[int,...]: Observation tuple after action """ # What's the best we could do from the next state? Zero if episode terminated. future_q_value = (not terminated) * np.max(self.q_values[next_obs]) - # What should the Q-value be? (Bellman equation) target = reward + self.discount_factor * future_q_value - # How wrong was our current estimate? temporal_difference = target - self.q_values[obs][action] - # Update our estimate in the direction of the error. Learning rate controls how big steps we take - self.q_values[obs][action] = (1 - self.lr) * self.q_values[obs][action] + self.lr * temporal_difference - + prev = self.q_values[obs].copy() + lr = 1 if self.q_values[obs][action]==0.0 else self.lr # when no previous knowledge, avoid slow learning + self.q_values[obs][action] = (1 - lr) * self.q_values[obs][action] + lr * temporal_difference + + #print(f"ACTION act:{action}: {prev} -> {self.q_values[obs]}") # Track learning progress (useful for debugging) self.training_error.append(temporal_difference) + return np.argmax(self.q_values[obs]) - def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = 0) -> None: - """Run training or evaluation episodes. - - Uses pre-trained Q-values when available, otherwise starts a new - training sequence. - - Parameters - ---------- - n_episodes : int, optional - Number of episodes to run (default 1000). - max_steps : int, optional - Maximum steps per episode before truncation (default 5000). - show : int, optional - Visualization mode - 0 for none, 1 for training summary, 2 for - per-episode analysis (default 0). - """ + def episodes_init(self, n_episodes:int=1)-> tuple(int,int,int): + """Perform initialization of episode.""" if "r" in self.use_file and self.filename is not None and self.filename.exists(): self.q_values = self.read_dumped(self.filename) logger.info("Starting %s episodes, using pre-trained values from %s", n_episodes, self.filename) @@ -210,46 +188,89 @@ def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = self.q_values = defaultdict(lambda: np.array((0.0,) * self.env.action_space.n, float)) # type: ignore[attr-defined,type-var] logger.info("Starting new training with %s episodes.", n_episodes) start_time = dt.datetime.now(dt.UTC) - total_steps = 0 + return (0,0,0) + + + def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = 0) -> None: + """Run training or evaluation episodes. + + Uses pre-trained Q-values when available, otherwise starts a new + training sequence. + + Args: + n_episodes (int)=1000: Number of episodes to run + max_steps (int)=5000: maximum number of steps before truncation + show (int)=0: show mode (default no show) + """ + start_time = dt.datetime.now(dt.timezone.utc) + total_steps, num_terminated, num_truncated = self.episodes_init(n_episodes) + rewards = [[], []] + tau = [] + self.num_rnd = 0 + err_act = 0 for _episode in tqdm(range(n_episodes)): # Start a new episode - obs, _ = self.env.reset() + obs, _ = self.env.reset() # first reward is also available as self.env.reward assert isinstance(obs, tuple) - nsteps = 0 - terminated, truncated = (False, False) + num_failed, nsteps, terminated, truncated = (0, 0, False, False) - while not terminated and not truncated: + #print(f"Episode {_episode}. Eps:{self.epsilon}, Q({obs}):{self.q_values[obs]}") + while not terminated and not truncated and nsteps max_steps + if show == SHOW_EPISODE_ANALYSIS: + self.analyse_episode() + num_terminated += int(terminated) + num_truncated += int(truncated) + if _episode >= n_episodes-100: + log_r0 = np.log(-self.env.rewards[0]) + tau.append( np.average(np.array([-i*self.env.dt / (np.log(-r) -log_r0) for i,r in enumerate( self.env.rewards[1:])], float))) + rewards[0].extend(list(range(len(self.env.rewards)))) + rewards[1].extend([np.log(-x)-log_r0 for x in self.env.rewards]) total_steps += nsteps # Reduce exploration rate (agent becomes less random over time): self.epsilon = max(self.final_epsilon, self.epsilon - self.epsilon_decay) if show == SHOW_TRAINING_SUMMARY: self.analyse_training() if self.filename and "w" in self.use_file: - self.dump_results(episodes=n_episodes, steps=total_steps, start_time=start_time) + self.dump_results(self.filename, n_episodes, total_steps, start_time, num_terminated, num_truncated) + logger.info(f"Episodes:{n_episodes}, terminated:{num_terminated}, truncated:{num_truncated}") + print(f"Steps:{total_steps}, revised actions:{err_act}, random actions:{self.num_rnd}") + print(f"Term:{num_terminated}, trunc:{num_truncated}, tau:{np.average(tau)} +/-{np.std(tau)}") + + _,ax = plt.subplots(1,1) + ax.plot( rewards[0], rewards[1], '.') + plt.show() def dump_results( - self, filename: str | Path = "", episodes: int = -1, steps: int = -1, start_time: dt.datetime | None = None + self, + filename: str | Path = "", + episodes: int = -1, + steps: int = -1, + start_time: dt.datetime | None = None, + n_terminated: int = -1, + n_truncated: int = -1, ) -> None: """Dump the Q-values to a JSON file. Args: - filename (str|Path): Optional target file path. - When empty, the filename provided at construction time is used (default ""). - episodes (int): the number of episodes which have been run - steps (int): the limiting number of steps per episode - start_time (dt.datetime): clock-time when the training started + filename(str|Path): Optional target file path. + When empty, the filename provided at construction time is used (default ""). + episodes(int)=-1: the number of episodes which have been run + steps(int)=-1: the limiting number of steps per episode + start_time(dt.datetime)=None: clock-time when the training started """ + print("FILE", filename) if not filename: # automatic file name if self.filename is None: logger.warning("No base file name provided. Aborting dump to file.") @@ -276,6 +297,11 @@ def dump_results( "epsilon-decay": str(self.epsilon_decay), "final-epsilon": str(self.final_epsilon), "epsilon": str(self.epsilon), + "#terminated": n_terminated, + "#truncated": n_truncated, + "reward-trend": float(np.average(self.env.reward_stats[-100:][1])), + "reward-std": float(np.average(self.env.reward_stats[-100:][2])), + "reward-2nd": float(np.average(self.env.reward_stats[-100:][3])), }, "q_values": converted, } @@ -286,15 +312,12 @@ def dump_results( def read_dumped(self, filename: str | Path | None = None) -> defaultdict[tuple[int, ...], np.ndarray]: """Read a Q-values dict from a JSON file. - Parameters - ---------- - filename : str or Path - Path to the JSON file containing saved Q-values. + Args: + filename(str or Path): Path to the JSON file containing saved Q-values. Returns ------- - defaultdict[tuple[int, ...], np.ndarray] - Loaded Q-values mapping observation tuples to action-value arrays. + q_values dict """ q_values: defaultdict[tuple[int, ...], np.ndarray] = defaultdict( lambda: np.array((0.0,) * self.env.action_space.n, float) # type: ignore[attr-defined,type-var] @@ -317,13 +340,12 @@ def read_dumped(self, filename: str | Path | None = None) -> defaultdict[tuple[i q_values.update({literal_eval(k): np.array(v) if isinstance(v, list) else v}) return q_values - def analyse_training(self, window: int = 500) -> None: + def analyse_training(self, window: int = 10) -> None: """Plot moving averages of episode rewards, lengths, and training error. - Parameters - ---------- - window : int, optional - Number of episodes used for the smoothing window (default 500). + Args: + window (int)=500: Moving average window size + """ # Smooth over the given episode window _, axs = plt.subplots(ncols=3, figsize=(12, 5)) @@ -355,36 +377,36 @@ def analyse_training(self, window: int = 500) -> None: plt.tight_layout() plt.show() - def analyse_episode(self, window: int = 100) -> None: + def analyse_episode(self, window: int = 50) -> None: """Plot moving averages of rewards and training error for one episode. - Parameters - ---------- - window : int, optional - Number of steps used for the smoothing window (default 100). + Args: + window (int)=100: Moving average window size """ # Smooth over the given episode window _, axs = plt.subplots(ncols=2, figsize=(12, 5)) - # Episode rewards (win/loss performance) + rewards = _get_moving_avgs(self.env.rewards, window, "same") axs[0].set_title("Episode rewards") - reward_moving_average = _get_moving_avgs(self.env.rewards, window, "valid") - axs[0].plot(range(len(reward_moving_average)), reward_moving_average) - axs[0].set_ylabel("Average Reward") + axs[0].plot(range(len(rewards)), rewards) + axs[0].set_ylabel("rewards") axs[0].set_xlabel("Episode") - # Training error (how much we're still learning) axs[1].set_title("Training Error") - training_error_moving_average = _get_moving_avgs(self.training_error, window, "same") - axs[1].plot(range(len(training_error_moving_average)), training_error_moving_average) + training_error_mov_avg = _get_moving_avgs(self.training_error, window, "same") + axs[1].plot(range(len(training_error_mov_avg)), training_error_mov_avg) axs[1].set_ylabel("Temporal Difference Error") axs[1].set_xlabel("Step") plt.tight_layout() plt.show() - def test_agent(self, num_episodes: int = 1000) -> str: - """Test agent performance without learning or exploration.""" + def test_agent(self, num_episodes: int = 10) -> str: + """Test agent performance without learning or exploration. + + Args: + num_episodes (int) = 10: number of episodes to run. + """ total_rewards: list[float] = [] # Temporarily disable exploration for testing diff --git a/tests/test_simple_q_env.py b/tests/test_simple_q_env.py new file mode 100644 index 0000000..69cc84f --- /dev/null +++ b/tests/test_simple_q_env.py @@ -0,0 +1,93 @@ +import logging +import shutil +from collections.abc import Callable +from pathlib import Path + +import numpy as np + +from crane_controller.envs.simple_test_env import SimpleTestEnv +from crane_controller.q_agent import QLearningAgent + +logger = logging.getLogger(__name__) + + +def test_env(): + env = SimpleTestEnv( + acc = 1.0, + pos_range = (100,100), + speed_range = (10,10), + reward_fac = (1.0, 1.0), + reward_limit = 1000, + dt = 1.0, + pos0 = 0.0, + speed0 = 0.0, + pos1 = 10.0, + speed1 = 0.0, + seed = 1 + ) + assert env.action_space.n == 3 + assert env.action_space.sample() == 1, "Pseudo random" + assert list(env.observation_space.sample()) == [-98,-10] + pos = env.pos + speed = env.speed + dt = env.dt + stats = [0,0,0] + for i in range(1000): + i_acc = env.action_space.sample() + stats[i_acc+1] += 1 + a = i_acc* env.acc + obs, reward, term, trunc, _ = env.step(i_acc) + pos += speed*dt + 0.5*a*dt*dt + speed += a*dt + assert pos == env.pos and round(pos) == obs[0] + assert speed == env.speed and round(speed) == obs[1] + assert abs(stats[0]-stats[1])/stats[2] < 0.05, f"stats: {stats}" + +def test_smoke(*, show: bool) -> None: + env = SimpleTestEnv( + acc = 1.0, + pos_range = (-100,100), + speed_range = (-10,10), + reward_fac = (1.0, 1.0), + reward_limit = None, + dt = 1.0, + pos0 = 0.0, + speed0 = 0.0, + pos1 = 10.0, + speed1 = 0.0, + render_mode = 'plot' + ) + agent = QLearningAgent(env, filename=None) + agent.do_episodes(n_episodes=5, max_steps=200) + + +def test_q_analyse(env, *, show: bool) -> None: + agent = QLearningAgent(env, filename=Path("q_trained.json"), use_file="r") + agent.q_values = agent.read_dumped() + for k, v in agent.q_values.items(): + assert len(k) == 5, len(v) == 3 + for pos in (0, 1): + for speed in (0, 1): + res = {k: v for k, v in agent.q_values.items() if k[1] == pos and k[2] == speed} + logger.info(f"pos:{pos}, speed:{speed}") + acc: list[np.floating] = [] + for i in range(3): + col = [x[i] for x in res.values()] + acc.append(np.average(col)) + logger.info(f"averages: {acc}") + + +if __name__ == "__main__": + import os + from pathlib import Path + + import pytest + + retcode = 0#pytest.main(["-rP -s -v", __file__]) + assert retcode == 0, f"Return code {retcode}" + os.chdir(Path(__file__).parent.absolute() / "test_working_directory") + + #test_env() + test_smoke(show=True) + env = SimpleTestEnv(1.0, (100,100), (10,10), (1.0, 1.0), None, 1.0) + #test_q_analyse(env, show=True) From a17ecf9377833da491865d11f51322906f945b8e Mon Sep 17 00:00:00 2001 From: Eisinger Date: Thu, 18 Jun 2026 00:47:26 +0200 Subject: [PATCH 08/11] Many updates and changes due to ruff, mypy and pyright challenges. Many tests are still deactivated. --- CHANGELOG.md | 2 + models/q_anti-pendulum_2.json | 5611 +++++++++-------- ruff.toml | 2 +- scripts/analyse_q.py | 4 +- scripts/play_ppo.py | 2 +- scripts/play_q.py | 2 +- scripts/plot_sweep.py | 2 +- scripts/plot_training.py | 2 +- scripts/train_ppo.py | 2 +- scripts/train_q.py | 2 +- scripts/use_q_ide.py | 166 +- src/crane_controller/algorithm.py | 49 +- src/crane_controller/callbacks.py | 23 +- src/crane_controller/crane_factory.py | 2 +- .../envs/controlled_crane_pendulum.py | 505 +- .../envs/controlled_mobile_crane.py | 6 +- src/crane_controller/envs/simple_test_env.py | 201 +- src/crane_controller/experiment_config.py | 36 +- src/crane_controller/ppo_agent.py | 8 +- src/crane_controller/q_agent.py | 226 +- src/crane_controller/wrappers/clip_reward.py | 2 +- .../wrappers/discrete_actions.py | 2 +- .../wrappers/reacher_weighted_reward.py | 2 +- .../wrappers/relative_position.py | 2 +- tests/test_algorithm.py | 28 +- tests/test_environment.py | 90 +- tests/test_ppo.py | 7 + tests/test_q.py | 355 +- tests/test_simple_q_env.py | 99 +- 29 files changed, 3804 insertions(+), 3636 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abf2e38..eb66121 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,8 @@ The changelog format is based on [Keep a Changelog](https://keepachangelog.com/e vs training step as a PNG alongside the model after each training run. ### Changed +* Set many tests to 'skip'. These need to be updated (or deleted if not relevant any more) as soon as possible +* configuration of environments and agents moved to dataclass objects, to avoid lengthy argument lists. Related changes. * Removed unused reward factors in reward calculation * Adapted the y-size of plots, such that it fits also smaler screens without scrolling * `AntiPendulumEnv` parameter `size` renamed to `rail_limit`; `TrainingConfig.size` renamed to diff --git a/models/q_anti-pendulum_2.json b/models/q_anti-pendulum_2.json index c7c6d86..ccfe11b 100644 --- a/models/q_anti-pendulum_2.json +++ b/models/q_anti-pendulum_2.json @@ -1,77 +1,77 @@ { - "start-training": "16.06.2026 06:27:47", - "end-training": "16.06.2026 07:08:08", + "start-training": "17.06.2026 08:14:01", + "end-training": "17.06.2026 08:23:57", "pendulum": { "wire-length": "10.0", "wire-q-factor": "50.0", - "reward-factors": "(-1.0, -1.0, -0.5)", + "reward-factors": "RewardConfig(energy=1.0, positional=1.0, time=0.0, position=0.005, acceleration=0.01, terminal_penalty=0.0, angle=0.0, angular_velocity=0.0, crane_velocity=0.5, crane_acceleration=0.0, angular_acceleration=0.0, t_min_crane=0.0)", "acceleration": "0.1", "step-size": "1.0", "observations-discretization": "{'angle': array([-0.55850536, -0.27925268, -0.13962634, -0.06981317, -0.03490659,\n -0.01745329, 0. , 0.01745329, 0.03490659, 0.06981317,\n 0.13962634, 0.27925268, 0.55850536]), 'speed': array([-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.]), 'c-pos': array([-2. , -1. , -0.5 , -0.25 , -0.125, 0. , 0.125, 0.25 ,\n 0.5 , 1. , 2. ]), 'c-speed': array([-2. , -1. , -0.5 , -0.25 , -0.125, 0. , 0.125, 0.25 ,\n 0.5 , 1. , 2. ]), 'avg-acc': array([-1.25, -1. , -0.75, -0.5 , -0.25, 0. , 0.25, 0.5 , 0.75,\n 1. , 1.25])}", "reward_limit": "-0.1", - "start-load-speed": "2" + "start-load-speed": "2.0" }, "q_agent": { - "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_anti-pendulum_5_0_3.json", + "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_anti-pendulum_2.json", "use_file": "rw", - "episodes": "30000", - "steps": "1784954", + "episodes": "3000", + "steps": "2215964", "learning_rate": "0.1", "discount_factor": "0.95", - "epsilon-decay": "0.0001", + "epsilon-decay": "0.1", "final-epsilon": "0.1", "epsilon": "0.1", - "#terminated": 22459, - "#truncated": 7541, - "reward-trend": 14.80832404476586, - "reward-std": 12.624453126053558, - "reward-2nd": 18.94365616585871 + "#terminated": 2829, + "#truncated": 171, + "reward-trend": 52.9567536083828, + "reward-std": 69.45177150542287, + "reward-2nd": 32.96346129012453 }, "q_values": { "(10, 6, 5, 5, 5)": [ - -1.6508400241838843, - -1.7619791697222538, - -1.713142534334536 + -2.632007542809087, + -2.0214664883387274, + -2.917823933402013 ], "(6, 7, 5, 5, 5)": [ - -1.9485691206094637, - -1.7592887365645091, - -1.7145382277085564 + -2.8479992913345273, + -1.9269953948377063, + -2.7543490757838023 ], "(10, 4, 4, 4, 4)": [ - -1.6079281218815331, - -1.533955644336904, - -1.2904190338413912 + -5.908372225369476, + -2.7213277729315677, + -1.2075641677756759 ], "(8, 3, 3, 4, 4)": [ - -1.478533197919707, - -1.5470705571268728, - -1.6507191203808493 + -4.8728692638119275, + -2.6360556837852065, + -1.0717580618789515 ], "(9, 3, 2, 3, 4)": [ - -2.04778049681663, - -1.8296811861822335, - -1.5946699268685474 + -6.611053173515565, + -4.102097553032359, + -3.8521101267049147 ], "(10, 5, 1, 2, 4)": [ - -2.479806296489871, - -2.3383750826996517, - -1.956006617898805 + -7.421019987141716, + -8.102674673629034, + -6.877703526789081 ], "(8, 6, 0, 2, 4)": [ - -2.3836916218476074, - -2.424301177607668, - -2.095255861278325 + -5.803842107063767, + -8.117006076139576, + -6.104670033126191 ], "(9, 6, 0, 2, 4)": [ - -2.46041560386199, - -2.635745185727324, - -2.0955129541087127 + -11.650537669510177, + -11.360980563745938, + -11.10401560757478 ], "(10, 4, 0, 2, 4)": [ - -2.354757040659709, - -2.578697012495351, - -2.429358096074893 + -8.119151455128105, + -8.147427784967306, + -9.590824561826162 ], "(9, 3, -1, 1, 4)": [ 0.0, @@ -79,59 +79,59 @@ 0.0 ], "(10, 5, 5, 5, 4)": [ - -1.5496668674867073, - -1.3922518273801279, - -1.490022616385545 + -2.105075093157409, + -1.2285198211286308, + -2.4392167479319413 ], "(6, 7, 5, 5, 4)": [ - -1.9355944509366718, - -1.7767530348144993, - -1.7259334747940656 + -2.8474891016579904, + -1.7195038738343058, + -2.838393921114026 ], "(10, 4, 5, 5, 4)": [ - -1.5007268546875638, - -1.5046541604921124, - -1.6223464614509124 + -2.0026032415526887, + -1.2833291375104836, + -2.5573605076205084 ], "(7, 3, 6, 5, 4)": [ - -1.1202415172742186, - -1.440711764455342, - -1.5234141893451334 + -1.1484329972247773, + -1.4264848986313508, + -2.4484334860252335 ], "(10, 3, 7, 6, 5)": [ - -2.078830981219692, - -2.295996159818653, - -2.4067555025918645 + -3.3767528351801768, + -4.12104943490832, + -3.8353695950249898 ], "(10, 5, 8, 5, 4)": [ - -1.664837636485749, - -1.8948874786522756, - -1.825605300411263 + -1.5932545383365395, + -2.52602577110367, + -2.5038348167111577 ], "(8, 6, 8, 6, 5)": [ - -1.4852007447006006, - -2.0983926703961138, - -2.2381238100751504 + -4.341731291124657, + -4.58895905698088, + -6.167351181524543 ], "(9, 6, 9, 7, 5)": [ - -2.61741962498347, - -2.5907728222338755, - -2.4584419542416804 + -9.888526445969617, + -10.764484720509742, + -10.477430314459898 ], "(10, 4, 9, 7, 5)": [ - -2.111909099455755, - -2.45796452061736, - -2.345727060942427 + -13.399268377742501, + -13.32939016374008, + -12.707734629200694 ], "(9, 3, 9, 7, 5)": [ - -2.3180142341827423, - -2.507566612958136, - -2.42978320567648 + -8.752604025953552, + -8.532102432867259, + -9.153408361900832 ], "(9, 3, 9, 6, 4)": [ -2.358561402004231, -2.806155068075748, - -2.162717180143657 + -4.7711820326602465 ], "(10, 4, -1, 6, 4)": [ 0.0, @@ -139,139 +139,139 @@ 0.0 ], "(10, 5, 5, 5, 5)": [ - -1.5495247272988295, - -1.6610164968037309, - -1.747486055017792 + -1.3806313139014046, + -2.3085670280828623, + -4.105134725769116 ], "(10, 4, 7, 6, 5)": [ - -1.5095631701928744, - -1.795584921237861, - -1.9988872322136548 + -3.7225457875344397, + -3.908795158345952, + -5.241147206376933 ], "(7, 3, 7, 5, 5)": [ - -1.2620050905092346, - -1.6461738593769784, - -1.9070536930138668 + -0.9456399564863692, + -2.3225325650416964, + -3.78114730408869 ], "(10, 3, 8, 6, 5)": [ - -2.0288699461232893, - -2.3195065084780597, - -2.421932822796878 + -3.3885443133254927, + -4.5229955974513505, + -4.227632488297406 ], "(10, 5, 8, 5, 5)": [ - -1.5738648912067625, - -1.9859091900983579, - -1.9311970538256293 + -1.7312851368416262, + -3.1514322133485733, + -2.877138032370345 ], "(9, 6, 9, 5, 4)": [ - -2.371098160041873, - -2.157119047533837, - -2.3712074490502744 + -5.107582480279477, + -4.385663396272323, + -4.554799019093133 ], "(10, 4, 9, 5, 4)": [ - -1.8489096040980906, - -2.280208565794354, - -2.3009859406104947 + -4.83516583130331, + -4.780349796119902, + -6.260052520559164 ], "(9, 3, 9, 5, 4)": [ - -1.923422383516403, - -2.167238571713426, - -2.578571356178268 + -5.146244317679018, + -5.258017261162145, + -7.456971506379567 ], "(8, 6, 9, 5, 5)": [ -2.319697901182499, -2.3678266441772213, - -2.0167144978741383 + -3.944098949920966 ], "(10, 5, 9, 5, 4)": [ - -1.8448826718429103, - -2.2580552005246757, - -2.349852942357952 + -5.3146063394915, + -4.924748158678892, + -5.1994541543916455 ], "(9, 4, 9, 4, 4)": [ - -1.3322351712770537, + -0.8174326009699021, -1.4000727256398862, -1.6532471481659523 ], "(6, 3, 8, 3, 4)": [ - -1.3420365349911796, - -1.0702050741272908, + -1.1782509619081862, + -1.1858350470177017, -1.3534941771316438 ], "(9, 4, 8, 4, 4)": [ - -0.8895009933834647, + -0.5790242094392521, -0.9470593950352295, -1.1464158302699703 ], "(8, 6, 8, 4, 4)": [ -1.3960495057160047, - -1.3539547524312314, + -1.2367572268616056, -1.5241293563352456 ], "(9, 6, 8, 4, 4)": [ - -1.5301090464210274, + -1.3492796772862927, -1.5960274179178082, -1.770008674707631 ], "(10, 4, 8, 4, 4)": [ - -1.2997496616128996, + -1.2977202738740523, -1.4786510953826262, - -1.743425529588889 + -1.7632884290838717 ], "(8, 3, 8, 5, 5)": [ - -1.2402874555480254, + -1.127906437873804, -1.428320242044711, -1.6970359041568033 ], "(9, 3, 7, 4, 4)": [ - -1.2002159820127938, + -1.2667385833150135, -1.3288554351023398, - -1.32293753552813 + -1.3234956236104274 ], "(10, 4, 7, 5, 5)": [ - -1.3744256655449107, - -1.5741166891045273, - -1.5442159795934427 + -1.273424430013734, + -1.9678689272773662, + -2.6721850882495666 ], "(9, 6, 8, 5, 5)": [ - -1.9164191199797591, - -1.6937939845365477, - -1.987855453638293 + -1.5850801904119995, + -2.3241354935559837, + -3.157377869385671 ], "(8, 6, 8, 5, 5)": [ - -1.6884477712455674, - -1.5605116652156674, + -1.37208595832043, + -2.813614719685554, -1.75603362610475 ], "(9, 4, 8, 5, 4)": [ - -1.0788647813128467, - -1.2438435794715215, - -1.2528834352974758 + -0.5909807022768508, + -2.5047525530382773, + -3.39707083932502 ], "(6, 3, 8, 4, 4)": [ - -1.0238777686107179, + -0.9380443360608979, -1.2231592183100946, -1.3067094680015345 ], "(9, 4, 7, 3, 4)": [ -0.9341326600374791, - -0.6875283633357747, + -0.7070386542047838, -0.9435741132228885 ], "(9, 5, 5, 2, 4)": [ -1.2601908302500713, - -1.13568654955533, - -0.8346359349009513 + -2.9935058401990684, + -2.135323734457905 ], "(6, 6, 2, 2, 4)": [ -1.749305099268079, - -1.6889652466468552, - -1.2877420522253022 + -3.700835737357031, + -3.355092512043974 ], "(9, 5, 1, 2, 4)": [ - -1.8423841854760241, - -1.5571930618539291, - -1.3551797229755609 + -10.653462598743236, + -8.981933238320316, + -8.66615039388449 ], "(9, 4, 0, 1, 4)": [ -1.8487859266346618, @@ -284,39 +284,39 @@ 0.0 ], "(10, 4, 6, 5, 4)": [ - -1.341949064851529, - -1.4591111646526143, - -1.6131243625890614 + -1.408160475680994, + -1.4492768426884417, + -3.205414741429922 ], "(7, 3, 7, 5, 4)": [ - -1.0752877701747352, + -1.0116372533574032, -1.2991350403364974, - -1.8101385001333599 + -2.766159247032766 ], "(9, 3, 7, 5, 4)": [ - -1.3462161343749057, - -1.4868147265882778, + -1.5672377403346773, + -1.3289121574876877, -1.5112604703169366 ], "(10, 5, 8, 6, 5)": [ - -1.7838797070418915, - -2.1994739942325063, - -2.2612412607437333 + -5.260998667691759, + -5.62567232846291, + -6.897878938658396 ], "(8, 6, 8, 5, 4)": [ - -1.5675103571365443, - -1.703020385370512, - -1.8173569864913222 + -2.033751430795758, + -3.136388078111998, + -2.9208360910243267 ], "(9, 6, 8, 5, 4)": [ - -1.5499291636864578, + -1.4334700286743347, -1.727058804749009, - -1.7122544906102577 + -2.36355610854931 ], "(9, 3, 7, 3, 4)": [ - -0.9995309327144315, - -1.1527911497368262, - -1.3084206034441779 + -1.888136413046244, + -1.3625082733647744, + -1.364025033526931 ], "(8, 3, 5, 2, 4)": [ -1.4317598630090698, @@ -324,24 +324,24 @@ -1.6698035925281616 ], "(10, 4, 2, 2, 4)": [ - -2.199797882352851, - -2.1884378510658142, - -1.6317969976963074 + -4.756564147396647, + -3.8279711818247657, + -2.898385861557715 ], "(9, 6, 1, 2, 4)": [ - -2.4731612219362327, - -2.233925609060266, - -1.8867839864485332 + -7.372434226879543, + -6.642105484202213, + -7.648205846357259 ], "(10, 5, 0, 2, 4)": [ - -2.7961789854141808, - -2.9378848559253075, - -2.5571363386078176 + -10.551337351931377, + -11.131445725066454, + -10.917301992972337 ], "(9, 3, 0, 2, 4)": [ - -2.3482484956918284, - -2.5938517243631747, - -2.476961749157783 + -10.798223678159868, + -10.596420735131943, + -10.399583694203645 ], "(7, 3, -1, 2, 4)": [ 0.0, @@ -349,34 +349,34 @@ 0.0 ], "(10, 6, 5, 5, 4)": [ - -1.7103963565857963, - -1.673075182220122, - -1.6698950100871022 + -2.509380822544043, + -1.5517080541416468, + -2.8608234667275965 ], "(10, 4, 5, 5, 5)": [ - -1.4805810742005434, - -1.3999762113054703, - -1.5534053395929288 + -2.315550230314296, + -2.0315400945416013, + -4.2895032916772 ], "(7, 3, 5, 5, 4)": [ - -0.6494372093514, - -0.7929359016267745, - -0.9464465443598771 + -1.55485480638771, + -0.7577095375839094, + -2.5046008310602295 ], "(10, 3, 6, 5, 5)": [ - -1.4405087879890133, - -1.8711655309649498, + -1.502958895749929, + -2.1309076693701896, -1.8922413759646166 ], "(10, 5, 7, 6, 5)": [ - -1.417221008970588, - -1.6593571523168114, - -1.8660605389505158 + -3.9638141969552585, + -4.244180372708575, + -4.679558973128723 ], "(9, 6, 8, 7, 5)": [ - -2.3386062508529557, - -2.0669683866734783, - -2.4062017314723945 + -4.526827307872658, + -6.072912730668634, + -6.195203176634541 ], "(9, 3, -1, 7, 5)": [ 0.0, @@ -384,74 +384,74 @@ 0.0 ], "(7, 3, 5, 5, 5)": [ - -0.6400800276543618, - -0.9218213349704187, - -1.0250737636979086 + -1.0684032498752725, + -1.9450153272953936, + -4.065653544398974 ], "(9, 3, 5, 5, 5)": [ - -1.1517474169694288, - -1.539699170125085, - -1.5623206337241304 + -1.1597690778582892, + -2.3223473616834394, + -4.820940292680582 ], "(10, 5, 5, 4, 4)": [ - -1.582689826265763, - -1.4651741327021042, - -1.192871578054045 + -4.010564915769731, + -1.9246848931405394, + -1.491331127577201 ], "(8, 6, 3, 3, 4)": [ - -1.603684084273401, - -1.4388736140329543, - -1.366603917849938 + -3.1598038392045282, + -2.3589653288473826, + -2.067105762139561 ], "(9, 6, 2, 3, 4)": [ - -2.1429060549487757, - -1.7584321165069756, - -1.6469822299265502 + -6.011083290545521, + -4.798754989068876, + -4.26505603962243 ], "(10, 4, 1, 2, 4)": [ - -2.435258286403159, - -2.360711373712138, - -2.1602858848737725 + -7.612286826389106, + -8.01497030716295, + -7.864043121222553 ], "(9, 3, 1, 3, 4)": [ - -2.29753828191938, - -2.1157468137448983, - -1.9060669415064229 + -5.8973213702989415, + -5.371774848287884, + -4.950132034515406 ], "(9, 3, 0, 3, 4)": [ - -2.6258378365652097, - -2.5178327151131663, - -2.607025321457255 + -7.767961840148363, + -5.614345806377486, + -5.249782256284581 ], "(10, 4, 0, 3, 4)": [ - -2.5710418551026857, - -2.5472839268015726, - -2.309617088236495 + -5.365090267998313, + -5.965700234171315, + -6.46931605112976 ], "(9, 6, 0, 4, 5)": [ - -2.3523699137033227, - -2.3088949618470056, - -2.1238986999494385 + -6.196908578990987, + -5.317471462814654, + -5.564212005034019 ], "(8, 6, 0, 4, 5)": [ - -2.328080974830416, - -2.1390397004970634, - -1.8775807453475457 + -3.9027134710933673, + -4.5257012330316915, + -3.957726526899658 ], "(10, 5, 0, 4, 5)": [ - -2.4839516636632655, - -2.5296848748095275, - -2.1444354539741166 + -5.750225026508197, + -5.802907763894433, + -3.3622862450771627 ], "(9, 3, 0, 4, 5)": [ - -2.2046932393818532, - -2.416694666297741, - -2.449679882165923 + -4.538541053821306, + -5.236039760293135, + -3.1315449790052 ], "(7, 3, 0, 3, 4)": [ - -2.0586269134566733, - -2.2918992893091286, - -2.358273972923 + -5.629145863166038, + -4.445333778849641, + -4.143271464866555 ], "(10, 4, -1, 4, 5)": [ 0.0, @@ -459,79 +459,79 @@ 0.0 ], "(7, 2, 7, 6, 5)": [ - -1.9121550442458635, - -2.2731580201726422, - -2.612402006549002 + -3.377332752142872, + -3.8826355731110884, + -4.050587727946551 ], "(10, 3, 7, 5, 5)": [ - -1.4938452512178662, + -1.4129613329098485, -1.90946905843496, - -2.108568519243793 + -3.3666178895774723 ], "(10, 5, 7, 5, 4)": [ - -1.3247621478957643, - -1.59355359689284, - -1.5189178091079985 + -1.1976106391781762, + -1.4660916840643843, + -2.3181308821160864 ], "(8, 6, 7, 4, 4)": [ - -1.4045484432893491, - -1.2617579996108796, - -1.3808030413444514 + -1.2688145669398343, + -1.3668511385246322, + -1.6588315713052437 ], "(10, 6, 5, 3, 4)": [ -1.8156877895245582, -2.2666303907037446, - -1.6098423366031867 + -1.6337902403060414 ], "(10, 4, 5, 4, 4)": [ - -1.3279494297344416, - -1.1226643603534558, - -1.2968644284737136 + -4.556508160932954, + -1.8471821267529434, + -1.5299543150611206 ], "(8, 3, 4, 4, 4)": [ - -1.2755518379371924, - -1.3030700490616471, - -1.015752420212436 + -5.8623618735642085, + -2.8291509086442064, + -1.5340908444416985 ], "(9, 3, 3, 4, 4)": [ - -1.6127052530955441, - -1.4262788959254733, - -1.3908977099250006 + -4.743041650864922, + -2.911276741662927, + -1.2816818473505065 ], "(10, 5, 2, 4, 4)": [ - -1.7569998095053272, - -1.5904527842752763, - -1.424494838740919 + -4.377929056107803, + -2.307248627283049, + -1.1974144416168973 ], "(9, 6, 2, 5, 5)": [ - -1.5486597347735898, - -1.3418112180752297, - -1.288625591325634 + -2.2271716992031045, + -1.1794134995270538, + -1.2868694532072065 ], "(9, 6, 2, 4, 4)": [ - -1.8214266588943673, - -1.537427434206144, - -1.3345834212492256 + -2.8925903296509956, + -2.704109813045996, + -1.1040066682923195 ], "(10, 5, 1, 3, 4)": [ - -2.3262141548005633, - -2.384282029223163, - -1.9172969271329439 + -6.555277437267026, + -4.3762547807902665, + -4.806937521172905 ], "(10, 3, 1, 3, 4)": [ -2.472966561489204, - -2.4473848511262926, - -1.992907863065399 + -3.759210698740552, + -2.800571663412028 ], "(8, 3, 0, 2, 4)": [ - -2.272722708542549, - -2.037616505132451, - -2.2527721383865797 + -6.749446531520208, + -4.397410416939408, + -5.99653832045162 ], "(10, 6, 0, 2, 4)": [ - -2.592000686527249, + -7.279194774935087, -3.56036179440597, - -2.7430418661860543 + -4.627990199532812 ], "(6, 6, 0, 3, 5)": [ -4.737055877693265, @@ -544,64 +544,64 @@ 0.0 ], "(8, 3, 5, 5, 5)": [ - -1.2621577175392995, - -1.2680024077163032, - -1.5840961573687589 + -1.8315364750370071, + -2.076830783607212, + -3.7147883602273635 ], "(10, 3, 5, 5, 5)": [ - -1.6866533796735297, - -1.7587940374251214, - -1.714237509139747 + -2.225692512354282, + -2.3406119472572287, + -4.557221323472359 ], "(8, 6, 5, 4, 4)": [ - -1.3339370531787271, - -1.1235675509921144, - -1.029968868523548 + -4.396029215901631, + -1.9483318126193772, + -0.8185521213521807 ], "(9, 6, 4, 4, 4)": [ - -1.544524197043112, - -1.3093058201718388, - -1.168428844779513 + -5.63295784271134, + -2.716312375184136, + -1.1988776903281928 ], "(10, 4, 3, 4, 4)": [ - -1.601248691316946, - -1.606663782241888, - -1.6112716822166202 + -4.85336703963774, + -2.41716199298838, + -1.0797616714470168 ], "(9, 3, 1, 2, 4)": [ - -2.5250869052843545, - -2.327666824643726, - -2.505820995853641 + -5.34109282610514, + -5.367938412000203, + -5.748713313591898 ], "(9, 6, 0, 3, 4)": [ - -2.4677262430253806, - -2.484688584369541, - -2.214285366166861 + -4.98480315063017, + -6.674968798990913, + -5.46035924074763 ], "(9, 4, 0, 4, 5)": [ - -1.888129100372227, - -1.8493796213556255, - -1.5386582237746014 + -7.755456405108513, + -7.713699012778027, + -5.958789969328362 ], "(6, 3, 0, 4, 5)": [ - -2.176102241596454, - -1.7928339157193998, - -2.26770405632958 + -3.716308989673652, + -4.341948647269996, + -3.188493112408014 ], "(10, 4, 0, 5, 5)": [ -2.4068805002253217, -2.297335780552213, - -1.9970001623842903 + -1.743080436603022 ], "(10, 5, 0, 6, 5)": [ -2.2011778033830534, -1.8481164397017644, - -1.7367905235384165 + -1.614819325333296 ], "(7, 6, 1, 6, 5)": [ - -1.5326970706570853, + -1.3618033154137008, -1.386671516591853, - -0.9071083229119317 + -0.8977487059864832 ], "(9, 6, 1, 6, 5)": [ -1.7412873103446362, @@ -611,17 +611,17 @@ "(10, 4, 1, 5, 5)": [ -1.8012594973192917, -1.7262276097083114, - -1.6002086627062158 + -1.379608829274271 ], "(9, 3, 1, 4, 4)": [ -1.981009096203958, -1.9734895460825128, - -1.7685176193063288 + -1.6749380235910698 ], "(9, 5, 1, 3, 4)": [ - -1.773133600429267, - -1.4105453159491281, - -1.1536735454249498 + -6.680740441787145, + -6.419154224716454, + -5.158357381606699 ], "(9, 6, 0, 4, 4)": [ -2.58426450960246, @@ -630,68 +630,68 @@ ], "(8, 6, 0, 4, 4)": [ -2.4639875364233967, - -2.1908161934204022, - -2.053533388534091 + -3.2697000933503038, + -3.146451426194237 ], "(9, 5, 0, 4, 5)": [ - -1.8149549735650443, - -1.8285527541281654, - -1.5483564545199595 + -7.749975877682519, + -7.774607119203132, + -6.187247656164513 ], "(9, 4, 0, 5, 5)": [ -1.8853521211601636, -1.7843736841419005, - -1.3894381238077984 + -0.8498348028290891 ], "(8, 3, 1, 6, 5)": [ -1.3438766240942488, -1.581391017107592, - -1.0687306282422562 + -1.057504995730754 ], "(9, 4, 1, 7, 5)": [ -0.9454531822124415, - -0.8568107415890278, + -0.6834479307933491, -0.991806603525959 ], "(9, 5, 4, 7, 5)": [ - -0.6836037186403127, - -0.9523410694937454, - -1.151967581272173 + -1.2345297336069891, + -2.9043773743302106, + -3.2615675761817062 ], "(6, 6, 7, 8, 5)": [ -5.2444721084905, -1.6814348054414407, - 0.0 + -49.61188729321907 ], "(9, 5, 8, 8, 5)": [ - -1.887984479540722, + -5.446268294724987, -3.535551147540035, -2.2762584688915144 ], "(9, 4, 9, 7, 5)": [ - -2.059523378581653, - -1.7650814999441407, - -2.0544801328289086 + -11.769726880293646, + -12.599574527008803, + -11.941217810538493 ], "(7, 3, 9, 7, 5)": [ - -2.1835068465765137, - -2.0111597795741423, - -2.15198189228833 + -4.35117350659863, + -4.9702862293402275, + -5.475890000572086 ], "(8, 4, 9, 6, 4)": [ - -1.5410567352134643, - -2.9626244171837044, - -2.280335431446754 + -2.95455182319695, + -4.291892020181804, + -4.978059130171141 ], "(9, 5, 9, 5, 4)": [ - -1.4496808458670236, - -1.918637053281842, - -1.8767512880498014 + -4.339982382331366, + -7.405791352445816, + -6.352454241067857 ], "(8, 5, 9, 5, 4)": [ - -1.4455088265783447, - -1.5820093927138625, - -1.5866535636171848 + -2.722385746254849, + -6.099439205660735, + -5.933006372339563 ], "(8, 5, -1, 5, 4)": [ 0.0, @@ -699,59 +699,59 @@ 0.0 ], "(8, 3, 2, 3, 4)": [ - -1.7045855173116775, - -1.6235403772779207, - -1.580657264944569 + -4.8174313523024095, + -4.850374174691581, + -4.031339268942425 ], "(9, 3, 2, 4, 4)": [ - -1.833328813189231, - -1.8761509437495751, - -1.5454272104174336 + -3.158593473053144, + -2.5407155236836236, + -1.3141684622933312 ], "(9, 6, 1, 4, 4)": [ -2.10123771684109, -1.7381742992855425, - -1.6227060936179911 + -1.4162212502001963 ], "(9, 3, 1, 5, 5)": [ -1.8573461776255715, -1.819603011856715, - -1.7767300678271611 + -1.3213225069774777 ], "(8, 6, 2, 6, 5)": [ -1.446666148292605, - -1.051023771684711, + -1.067322795333012, -1.1953727464998698 ], "(10, 5, 4, 6, 5)": [ - -1.1598312563096718, - -1.1951729365889077, - -1.4703296224193145 + -1.5171230969227927, + -1.7781270128653877, + -2.6518327658202203 ], "(9, 3, 6, 7, 5)": [ - -1.4908304876508156, + -2.202285424400583, -2.5295119063828913, - -2.1720968615695213 + -4.392590578183739 ], "(7, 3, 8, 7, 5)": [ - -1.4285934416443815, - -1.9415518079767893, - -2.173785394194161 + -6.779129660570644, + -7.421262350086439, + -7.269456564318205 ], "(10, 4, 8, 7, 5)": [ - -1.8689119640754621, - -2.11414678220236, - -2.339227249340776 + -7.646404986228402, + -7.4463535449521725, + -7.685309116314988 ], "(10, 5, 9, 7, 5)": [ - -2.3237934771477833, - -2.466423270418072, - -2.557871153558644 + -8.988985385778253, + -7.836825559700578, + -10.145273107967476 ], "(6, 6, 9, 7, 5)": [ - -2.1835683050896346, - -2.165195909906039, - -1.9626726098058984 + -6.862773392080721, + -5.510343570454328, + -6.426247622639524 ], "(9, 5, -1, 7, 5)": [ 0.0, @@ -759,39 +759,39 @@ 0.0 ], "(10, 6, 4, 4, 4)": [ - -1.9107269256290753, - -1.7609338615079393, - -1.7664363045467093 + -4.125170540878443, + -2.837736979419161, + -1.6438809696656167 ], "(10, 4, 4, 5, 5)": [ - -1.4218934370417264, - -1.36397392702154, - -1.3220803194474477 + -2.736038206254613, + -1.2163410608402043, + -1.5461700249774208 ], "(10, 3, 2, 4, 4)": [ -2.0007632610063886, - -1.8352695354499589, - -1.8859760159225964 + -2.535475756607943, + -1.784831390004887 ], "(8, 6, 1, 3, 4)": [ - -1.9996296731929755, - -1.9237450364841824, - -1.7242355487011523 + -3.980579861697458, + -4.272536715355627, + -3.94167853993325 ], "(6, 3, 8, 7, 5)": [ - -1.84942531447172, - -2.2642332940261287, - -2.3727709837247173 + -4.550055462957892, + -3.9662102394998886, + -5.575372474705458 ], "(10, 3, 8, 7, 5)": [ - -2.487676501094585, - -2.540002944442371, + -3.525795210628811, + -4.519736108316531, -2.701927837170447 ], "(8, 6, 9, 7, 5)": [ - -2.460733952613764, - -1.8592043478915763, - -2.3921053182969683 + -7.427437367724631, + -7.511707245996769, + -9.133758662099222 ], "(9, 6, -1, 7, 5)": [ 0.0, @@ -799,24 +799,24 @@ 0.0 ], "(8, 3, 5, 4, 4)": [ - -1.5440855918322707, - -1.516048734948591, - -1.4813360987880702 + -3.9386088154972745, + -1.6170251859292597, + -1.268117718212041 ], "(9, 3, 4, 4, 4)": [ - -1.604128376204926, - -1.325285531866426, - -1.5108990915244571 + -6.014155068997134, + -2.8070797358976285, + -1.4249531068715673 ], "(10, 5, 4, 5, 5)": [ - -1.4835724226657065, - -1.406952931132257, - -1.190455890907384 + -2.706226649266084, + -1.1669341958530122, + -1.522262844848659 ], "(9, 6, 3, 4, 4)": [ - -1.7821277801159556, - -1.4274104588482892, - -1.3372154821550635 + -4.737428782572441, + -3.0433579102805055, + -1.2342851556688563 ], "(8, 6, -1, 2, 4)": [ 0.0, @@ -824,44 +824,44 @@ 0.0 ], "(8, 3, 5, 5, 4)": [ - -1.0793904288175145, - -1.4043572791957124, - -1.3935080001781937 + -1.6724569132405827, + -0.9356261409286505, + -2.421295803727491 ], "(9, 3, 5, 4, 4)": [ - -1.4542017354488384, - -1.4187431150686027, - -1.5081014684943517 + -3.9785017513915877, + -1.730214457501373, + -1.447385700319796 ], "(10, 5, 3, 3, 4)": [ - -1.821901945919751, - -1.5843608615198714, - -1.3647978611173162 + -3.133341415402972, + -3.218319857183115, + -3.212478371532395 ], "(8, 6, 2, 4, 4)": [ - -1.6839501311279081, - -1.4694239673148541, - -1.1356500504846174 + -4.079736671993373, + -2.4253382212791545, + -1.0693843833766403 ], "(10, 4, 1, 3, 4)": [ - -2.34941303415033, - -2.2070667913925166, - -1.8830435648498967 + -4.554003400719355, + -5.347209486230039, + -5.184457681365425 ], "(8, 3, 1, 3, 4)": [ - -2.031640305482058, - -1.960422170256653, - -1.6243482448063173 + -5.065673839253316, + -3.4615777244591253, + -3.6176585946325917 ], "(10, 4, 0, 4, 5)": [ - -2.456188628442107, - -2.407764510853866, - -1.9802669918952063 + -6.51192154394882, + -5.90681769325787, + -6.070519535186834 ], "(9, 6, 0, 5, 5)": [ -2.3214956975742425, -2.339089475169411, - -1.7580163929325994 + -1.7303328456728622 ], "(7, 6, 0, 4, 4)": [ -3.5407231990189603, @@ -871,17 +871,17 @@ "(10, 5, 0, 5, 5)": [ -2.4306870310396205, -2.200191001385884, - -1.8571033386169118 + -1.7912500562785265 ], "(9, 4, 0, 4, 4)": [ -1.9323078600919608, -1.9536221826875715, - -1.6445616848745175 + -2.851740181252242 ], "(6, 3, 0, 5, 5)": [ -2.0965708508890923, -2.22414745366442, - -1.7098637228841214 + -1.583399788212311 ], "(7, 6, 0, 5, 5)": [ -2.1772561227809555, @@ -894,14 +894,14 @@ 0.0 ], "(10, 4, 9, 6, 5)": [ - -2.235377401790671, - -2.523999854409546, - -2.6091829117940075 + -6.716171261985787, + -5.9226629080927, + -7.186263179146455 ], "(9, 3, 9, 6, 5)": [ - -2.039584698383536, - -2.248777453401849, - -2.4050636679868327 + -5.467295050517265, + -4.215588156090729, + -4.777359560169478 ], "(10, 4, -1, 7, 5)": [ 0.0, @@ -909,19 +909,19 @@ 0.0 ], "(8, 3, 4, 5, 5)": [ - -1.1627434203683498, - -1.1992566265300504, - -1.3544522829386432 + -2.438286017345627, + -0.9449013054995461, + -1.4500612504475303 ], "(10, 5, 6, 6, 5)": [ - -1.2445374207491402, - -1.4607549444282286, - -1.8014173439377177 + -2.8524608551855457, + -3.5835830921988294, + -3.1278545246776273 ], "(8, 3, 9, 6, 5)": [ - -1.8079206743949678, - -2.25342976863696, - -2.3197124979060617 + -4.343253588442089, + -4.012587033972392, + -4.860768155069628 ], "(10, 3, 2, 4, 5)": [ -2.2658207568313355, @@ -929,29 +929,29 @@ -1.7755018255735828 ], "(8, 6, 1, 2, 4)": [ - -2.3466329010867413, - -2.3008051917147863, - -1.68113224234201 + -6.709913134404983, + -10.361667905743792, + -6.391585885362556 ], "(7, 3, 6, 5, 5)": [ - -0.9831438034382771, - -1.414060062177982, - -1.6806593926949498 + -1.0536666512793542, + -2.5915419922025467, + -3.328637658999082 ], "(8, 6, 8, 7, 5)": [ - -2.297784527925798, - -2.1780125186978037, - -1.8842346682423634 + -4.714907196003065, + -4.096365946571882, + -4.3210479144269645 ], "(9, 6, 9, 6, 5)": [ - -2.2359891405324164, - -2.428209390561915, - -2.55548952018463 + -6.384389125131318, + -5.99249493186673, + -7.741984040152239 ], "(8, 6, 9, 5, 4)": [ - -2.0775803598768032, - -2.238414137892225, - -2.2168491078003303 + -5.046174052769744, + -5.61397972506236, + -5.285466567523209 ], "(10, 5, 9, 5, 5)": [ -1.9763934228476687, @@ -964,9 +964,9 @@ -2.5697145495120637 ], "(7, 3, 9, 5, 4)": [ - -1.543211942771352, - -2.222296670750259, - -2.2085867259108003 + -2.422377911358688, + -3.629829472569193, + -3.9349768485163925 ], "(10, 4, 9, 5, 5)": [ -2.192455125952168, @@ -979,34 +979,34 @@ 0.0 ], "(10, 4, 6, 5, 5)": [ - -1.4619312454241118, - -1.5738457726336967, - -1.7572434842386724 + -1.2568552581065735, + -3.048316690437553, + -5.256746917369807 ], "(9, 3, 6, 5, 5)": [ - -1.3602602358974842, - -1.5334214958244652, - -1.5261261540997817 + -1.0278363412100195, + -2.91287083233598, + -5.636341263371625 ], "(8, 6, 4, 3, 4)": [ - -1.601147627292604, - -1.180797651355491, - -0.8917569908607721 + -2.9665278191918008, + -2.0392011559103858, + -2.0079394323796995 ], "(10, 5, 1, 4, 4)": [ - -2.1629030516042245, + -3.554848296474994, -2.0517155768066795, - -1.7227879960314423 + -1.5555065831587802 ], "(9, 6, 1, 5, 5)": [ -1.6511795645186984, -1.6382842126965813, - -1.3651208965157997 + -1.330234845193613 ], "(7, 6, 1, 5, 5)": [ -1.3694954179137162, -1.2544228821873222, - -0.9791178939519373 + -0.846257865138037 ], "(10, 5, 1, 5, 4)": [ -2.0623951754180365, @@ -1016,52 +1016,52 @@ "(10, 4, 1, 4, 4)": [ -2.023787892296082, -1.9164525168109139, - -1.7708733105593524 + -1.5950411086894516 ], "(6, 3, 1, 5, 5)": [ -1.358646489879602, - -1.1401302371754527, + -0.964013318266434, -1.337500418806914 ], "(10, 5, 0, 3, 4)": [ - -2.38205415727169, - -2.5951209201159804, - -2.512099155696926 + -5.103689460128486, + -4.5894261504380465, + -4.5021994424318965 ], "(7, 6, 0, 3, 4)": [ - -2.2920824632583354, - -2.222156585671197, - -1.7062443779937466 + -5.523596438111925, + -6.544566350454667, + -5.000588915256827 ], "(7, 3, 0, 5, 5)": [ -2.006852523720687, - -1.9796440280644727, + -1.7852644758100715, -2.149199214139953 ], "(9, 3, 0, 5, 5)": [ -2.279196630497656, - -2.1539374578933184, - -1.9733647053064658 + -2.063799006008279, + -1.6428151067630865 ], "(10, 5, 8, 7, 5)": [ - -1.8154777823806338, - -2.3603824935884745, - -2.2181118277088636 + -6.867167104655708, + -7.14722232176141, + -7.4414723537838725 ], "(10, 6, 4, 4, 5)": [ -2.1163796390707184, -2.0018390046796357, - -1.7050288006118488 + -1.670870850794803 ], "(9, 6, 1, 3, 4)": [ - -2.1838134001452554, - -2.087835307081738, - -1.698823601424445 + -7.576779495717769, + -4.20919340789009, + -4.608373986016081 ], "(8, 6, 0, 3, 4)": [ - -2.3724401655370486, - -2.476270046354999, - -2.131668063586422 + -5.452814016964135, + -4.535323366718301, + -3.697484886063575 ], "(10, 3, 0, 2, 4)": [ -2.6564235473240574, @@ -1069,9 +1069,9 @@ -2.7338515680838325 ], "(10, 5, 2, 5, 5)": [ - -1.5597189956528095, - -1.5237754263444212, - -1.3452785805038512 + -3.0055377293137573, + -1.175190857296252, + -1.2556285445137745 ], "(8, 2, 0, 2, 4)": [ -3.222781209129625, @@ -1089,32 +1089,32 @@ 0.0 ], "(10, 5, 6, 5, 5)": [ - -1.445642156751867, - -1.4118884807972987, - -1.5431933378565048 + -1.2394691482588835, + -2.8396577346804666, + -5.860849809903282 ], "(9, 6, 6, 5, 4)": [ - -1.3247420078377037, - -1.5272692319765433, - -1.428076314138798 + -1.4859834460457064, + -1.1401392026309056, + -2.8886529608171623 ], "(9, 3, 7, 5, 5)": [ - -1.0711020310292447, - -1.366385125636815, + -1.1382692944055035, + -2.5677718745202434, -1.6475808904657145 ], "(9, 6, 8, 6, 5)": [ - -1.8605068510648057, - -2.1219695304578243, - -2.225393267993709 + -5.022038411988602, + -5.125213141853264, + -5.404303743549354 ], "(7, 6, 8, 7, 5)": [ - -1.973520191287891, + -3.3747952641358205, -2.2332690964920223, -2.1776074446910205 ], "(6, 3, 9, 7, 5)": [ - -2.0529253265564424, + -4.185312916697555, -2.1739571071169204, -2.3436340706089154 ], @@ -1125,33 +1125,33 @@ ], "(10, 6, 7, 4, 4)": [ -2.028334158766506, - -1.7149069359522906, + -1.66354591519673, -2.839988416391003 ], "(10, 4, 7, 4, 4)": [ - -1.2828398941056725, - -1.396762914198098, + -1.4071126101264748, + -1.1577718542976385, -1.41411463353194 ], "(9, 3, 6, 4, 4)": [ - -1.1236532204362129, - -1.226288302318796, - -1.3067228719696486 + -1.6860222214751757, + -1.2754131943665716, + -1.5913463933848444 ], "(10, 5, 5, 3, 4)": [ -1.6594194123621098, - -1.3555269127357092, - -1.3473592724094603 + -2.37983663782663, + -1.3081227063662397 ], "(9, 6, 3, 3, 4)": [ - -1.6894589045333843, - -1.6153955202121717, - -1.1375211809993813 + -3.1186722309395627, + -3.337310133102796, + -2.602561369611734 ], "(9, 6, 2, 2, 4)": [ - -2.220563779717446, - -2.0490680182846734, - -1.6986852190928365 + -4.603436505570761, + -4.8891628287658975, + -4.264622142314476 ], "(8, 2, 0, 3, 5)": [ 0.0, @@ -1174,34 +1174,34 @@ 0.0 ], "(10, 3, 6, 5, 4)": [ - -1.344177597995127, - -1.61817965922486, + -1.5359232113178023, + -1.3570255093593901, -1.6594213380682508 ], "(10, 5, 7, 5, 5)": [ - -1.5598811597492697, - -1.477117051226417, + -1.103484981804523, + -1.9157366148736623, -1.6312521903722363 ], "(8, 6, 7, 5, 5)": [ - -1.4554573283147596, - -1.3086764575102123, - -1.577722953087417 + -1.0515173309428565, + -1.7836730762724797, + -3.619424302946562 ], "(10, 4, 8, 6, 5)": [ - -1.8453159152819505, - -1.9417165990848835, - -1.959228732234409 + -3.8594259504553916, + -4.3177665591987475, + -3.885431658435408 ], "(9, 3, 8, 5, 4)": [ - -1.342273694553538, - -1.843848489051833, - -1.9450033381708327 + -1.468260436377325, + -2.1876520919046554, + -2.8274174192490964 ], "(7, 6, 9, 7, 5)": [ - -2.235477877659786, + -3.9312384097866913, -2.1530346837432153, - -1.9614305274473947 + -6.537593818094239 ], "(10, 5, -1, 7, 5)": [ 0.0, @@ -1209,29 +1209,29 @@ 0.0 ], "(10, 4, 2, 3, 4)": [ - -1.926605163380159, - -1.703370013737355, - -1.396704744016899 + -4.6955368000603475, + -4.352492198330841, + -4.2122174828935135 ], "(9, 3, 3, 3, 4)": [ - -1.8094128149527489, - -1.6529201399372877, - -1.548429582487335 + -3.127925593705629, + -2.6571073787288846, + -2.4160383944042945 ], "(10, 5, 2, 2, 4)": [ -2.1181424747715316, -1.943039237770002, - -1.7112048821608652 + -2.783315052390049 ], "(10, 5, 6, 4, 4)": [ - -1.1629001917747377, - -1.3099575662377902, - -1.2680907690958187 + -1.9344724687978592, + -1.4000070141461567, + -1.519298543242901 ], "(8, 6, 5, 3, 4)": [ -1.5879294232395347, -1.1861373650269584, - -0.7814928004858813 + -1.109671484082074 ], "(9, 4, -1, 3, 4)": [ 0.0, @@ -1239,54 +1239,54 @@ 0.0 ], "(8, 6, 7, 5, 4)": [ - -1.4612096637113194, - -1.3361114907186258, - -1.4594797256577023 + -1.1961749219676239, + -1.6102066406427993, + -2.2024370552775836 ], "(9, 6, 7, 4, 4)": [ -1.4405919098380404, - -1.3231070675304526, - -1.3901770666012985 + -1.3496546983930524, + -1.3768208885304092 ], "(10, 4, 7, 5, 4)": [ - -1.270814175531846, + -1.488072508725612, -1.377974853928984, - -1.423669599326038 + -1.8654583937334053 ], "(10, 5, 7, 4, 4)": [ - -1.2559201297448779, - -1.343965302881337, - -1.37355105787108 + -1.3787953821840422, + -1.3021540052511034, + -1.3505288330252767 ], "(9, 6, 6, 4, 4)": [ - -1.3154878108890582, - -1.2840093318971155, - -1.3104540968168457 + -1.3941183795761884, + -1.3077259233317053, + -1.2419287978107407 ], "(9, 6, 5, 4, 4)": [ - -1.5074082959581956, - -1.1479082566324936, - -1.4455316269885328 + -4.10035749181689, + -1.7506099254025795, + -1.5382951508946672 ], "(10, 5, 4, 3, 4)": [ - -1.7198080964829987, - -1.5213180479701212, - -1.2991801007345358 + -3.030039462263667, + -2.9342027211690382, + -1.841762086595486 ], "(7, 3, 1, 2, 4)": [ - -1.9590700580057079, - -2.7167469181197244, - -2.322855038891815 + -4.509059317452168, + -4.514568470448699, + -3.734945759404731 ], "(9, 5, 0, 2, 4)": [ - -1.999062830995481, - -2.12507747549379, - -1.9600388235040747 + -15.557681133940505, + -15.62659144370489, + -15.311807197208957 ], "(6, 6, 0, 2, 4)": [ - -1.8409434573854393, + -5.433647735109968, -2.161033437340907, - -1.9955768238878047 + -5.020630095885847 ], "(9, 4, -1, 3, 5)": [ 0.0, @@ -1296,7 +1296,7 @@ "(10, 3, 1, 4, 4)": [ -2.2323995156530057, -2.4320924694789534, - -2.1028647608905766 + -1.944194422691477 ], "(10, 4, 0, 4, 4)": [ -2.530071232937104, @@ -1304,7 +1304,7 @@ -2.4142470319496288 ], "(9, 3, 0, 4, 4)": [ - -2.2885960218771397, + -4.199347607046121, -2.6073964413516344, -2.4574586849344278 ], @@ -1314,9 +1314,9 @@ 0.0 ], "(10, 4, 4, 5, 4)": [ - -1.5458960831336925, - -1.6154487676818687, - -1.8458799220216955 + -2.403454946198631, + -1.5097121590832665, + -1.7876950462586798 ], "(9, 3, 2, 5, 4)": [ -1.7031223332385164, @@ -1325,28 +1325,28 @@ ], "(8, 3, 2, 4, 4)": [ -1.7060729888912416, - -1.8090174779491432, - -1.586132204612682 + -2.155265376572182, + -1.2204469929749018 ], "(9, 4, 1, 3, 4)": [ - -1.5868689324670717, - -1.4695123346802, - -1.2944217128473081 + -5.416061050313795, + -5.843318444320732, + -4.980612637210869 ], "(9, 5, 0, 3, 4)": [ - -2.0221300373912703, - -1.9411703679881154, - -1.8527910547455495 + -9.44348917399383, + -8.363932738973874, + -8.404809867214045 ], "(9, 4, 0, 3, 4)": [ - -2.0616569660177153, - -2.0581041638917563, - -1.7937746264073031 + -9.894422067116011, + -9.217368479443227, + -7.967604237332951 ], "(6, 3, 0, 2, 4)": [ - -2.1368658959987767, - -2.1263111830598955, - -2.207680368395933 + -5.663643103922464, + -5.5477837402757935, + -6.002950461244319 ], "(9, 4, -1, 2, 4)": [ 0.0, @@ -1354,34 +1354,34 @@ 0.0 ], "(8, 6, 5, 5, 4)": [ - -1.2291157407056992, - -0.9878425463132211, - -1.19549854677636 + -1.8519732872626018, + -0.8234011454881351, + -2.284302120907544 ], "(9, 6, 5, 5, 4)": [ - -1.281959076237617, - -1.3089037595426938, - -1.4525021242880738 + -2.0000655460394223, + -1.047441893220196, + -2.6486167714663305 ], "(10, 5, 4, 4, 4)": [ - -1.618186236566978, - -1.4635359099134009, - -1.311517744515398 + -5.634090389467417, + -2.544858772915048, + -1.2400796077082832 ], "(8, 3, 1, 2, 4)": [ - -2.4228999843281627, - -2.289685102538681, - -2.0381910299346013 + -5.205866180931347, + -4.71187334805316, + -4.9871908203066795 ], "(9, 4, 1, 2, 4)": [ - -1.7257357626952237, - -1.661508952475887, - -1.5888939041000791 + -11.308716093783042, + -9.946257424496531, + -9.462305326365652 ], "(7, 6, 0, 2, 4)": [ - -2.1757304074448323, - -2.108950413522206, - -2.0673851886982124 + -6.938352844947784, + -5.020541415226626, + -5.866456360472358 ], "(9, 5, -1, 2, 4)": [ 0.0, @@ -1399,34 +1399,34 @@ -2.7761160500783704 ], "(8, 6, 5, 5, 5)": [ - -1.2696886765738986, - -0.9515493171614139, - -1.2146941063359094 + -1.7139692230632704, + -1.9182318033459431, + -2.8777401311581516 ], "(9, 6, 6, 5, 5)": [ - -1.439836977317648, - -1.5518381560702061, - -1.57964376226052 + -1.2854370150676286, + -2.720378833093753, + -5.039003878246013 ], "(9, 3, 6, 5, 4)": [ - -1.2141313907743772, - -1.4189379047343234, - -1.4890812204578618 + -1.3895251309182002, + -1.0445884428792467, + -2.937604701046961 ], "(7, 6, 8, 5, 4)": [ - -1.4699257618623682, - -1.7135260071324048, - -1.7980171454409246 + -1.9885226299914602, + -1.582953337930083, + -3.539190234187694 ], "(9, 5, 8, 5, 5)": [ - -1.2204482488041648, - -1.2585686511614105, - -1.3111144081140835 + -1.044725564916521, + -2.358933905762971, + -2.611368574795093 ], "(9, 4, 8, 6, 5)": [ - -1.1960866070439073, - -1.4040956999499203, - -1.5221589138177671 + -4.740134101481274, + -5.484743887057454, + -5.72775697990325 ], "(7, 3, 9, 6, 5)": [ -1.980707575378016, @@ -1434,29 +1434,29 @@ -2.3251626873994864 ], "(9, 4, 9, 6, 5)": [ - -1.7440373008943293, - -1.9260618149066908, - -2.0505490086596416 + -6.721667998293001, + -6.887278676960925, + -7.169387164634857 ], "(9, 5, 9, 6, 5)": [ - -1.6434155860094586, - -1.9464591233574433, - -1.8946970434912043 + -7.248291518189655, + -8.12510605469429, + -8.396291857797372 ], "(9, 6, 7, 5, 5)": [ - -1.3578474640942715, - -1.7374667247374722, - -1.768591457493224 + -1.4655818542849284, + -2.6620052680868147, + -2.9108165017692063 ], "(8, 3, 7, 5, 5)": [ - -1.0725106632500894, - -1.2219998917918222, + -0.9123773964462272, + -1.6138383802487064, -1.4151328036953392 ], "(7, 6, 5, 3, 4)": [ -1.6041818532965286, - -1.2408453821634058, - -1.1462211317723894 + -1.9282492937336912, + -1.2358554942112012 ], "(9, 6, -1, 2, 4)": [ 0.0, @@ -1466,11 +1466,11 @@ "(8, 6, 0, 5, 5)": [ -2.357756045561149, -1.9716274252246255, - -1.3762434772453764 + -1.371486973983361 ], "(10, 5, 0, 4, 4)": [ -2.3659007606391493, - -2.1831475719532056, + -3.371142695921706, -2.3633803437528615 ], "(10, 3, 0, 5, 5)": [ @@ -1486,21 +1486,21 @@ "(10, 4, 1, 6, 5)": [ -1.6285543872478325, -1.7226687064083337, - -1.4737009803134598 + -1.4617000007204763 ], "(9, 3, 1, 7, 5)": [ -1.4325714034975479, - -1.391103382223188, + -1.4083559727015662, -1.5648136506070272 ], "(9, 3, 2, 6, 5)": [ - -1.2959092173294695, + -1.256075662725314, -1.3826910433018758, -1.430742607348543 ], "(10, 4, 3, 6, 5)": [ -1.3874592278012774, - -1.2562533615321916, + -1.2816665402723935, -1.4339522973070107 ], "(9, 6, 5, 7, 5)": [ @@ -1509,9 +1509,9 @@ -1.7299029416930258 ], "(9, 5, 8, 7, 5)": [ - -1.340329554940067, - -1.7497657058541483, - -1.7984653111596711 + -7.705130301498018, + -7.671753627426517, + -8.859421762292332 ], "(9, 5, -1, 7, 4)": [ 0.0, @@ -1521,12 +1521,12 @@ "(8, 3, 0, 5, 5)": [ -2.0603270748848512, -1.8576797287715938, - -1.8497973301940231 + -1.7924654486447915 ], "(10, 5, 1, 5, 5)": [ - -1.783027904870685, + -2.522481088576628, -1.5659513705969508, - -1.3627515918590436 + -1.2420121803038253 ], "(10, 4, 1, 5, 4)": [ -1.9293152879208424, @@ -1536,7 +1536,7 @@ "(7, 6, 1, 4, 4)": [ -1.6209109574184102, -1.5489356473552423, - -1.1599953742267166 + -0.8963136356945983 ], "(8, 3, 0, 4, 4)": [ -2.1281750448029, @@ -1544,14 +1544,14 @@ -2.3316502860409782 ], "(9, 5, 0, 6, 5)": [ - -1.6835115712993312, + -1.5178446350755994, -1.3732651701242644, - -1.0711067831192913 + -0.8771563192072138 ], "(6, 6, 0, 6, 5)": [ -3.863739912589903, -2.1192365454769604, - -1.3662797189647196 + -1.2921190709830541 ], "(6, 3, 1, 7, 5)": [ -1.0396179529598468, @@ -1559,43 +1559,43 @@ -1.3171315983408767 ], "(9, 4, 3, 7, 5)": [ - -0.6657856431768152, + -1.7018089850197002, -0.934009905017706, -1.2751089188654394 ], "(9, 5, 5, 7, 5)": [ - -1.0221425887923825, - -1.071162495109816, - -1.2762717564536288 + -1.594220647293045, + -3.004396084315293, + -3.4908686155415456 ], "(7, 6, 7, 7, 5)": [ - -1.5204661452381099, + -3.469440245032046, -1.9721561142759136, -1.8227475079629059 ], "(9, 5, 8, 6, 4)": [ -3.1507314782289653, - -1.6245134429973789, - -1.8747493195653482 + -2.7667684288149035, + -3.909604566613158 ], "(9, 4, 8, 7, 5)": [ - -1.335480841821665, - -1.558250267907377, - -1.6822420276065924 + -9.543646265448931, + -10.041699277683671, + -10.242822986311223 ], "(8, 3, 9, 6, 4)": [ -2.421014016799567, - -2.1427504599367357, + -4.239246654023329, -2.8020110022343543 ], "(9, 5, 9, 7, 5)": [ - -2.017259970685351, - -2.0616970454315275, - -1.890765284672179 + -12.519896205207203, + -13.171415705556718, + -13.4622090662464 ], "(8, 6, 9, 6, 4)": [ -2.880417784990772, - -2.2571450977093255, + -4.364937188674848, -2.837114160056764 ], "(8, 6, -1, 6, 4)": [ @@ -1604,22 +1604,22 @@ 0.0 ], "(10, 4, 9, 4, 4)": [ - -1.8980420551502517, + -1.8651868132144374, -2.281656506685831, -2.3785673413974964 ], "(9, 6, 9, 3, 4)": [ -2.0319891739454983, - -2.024568156803446, + -1.8898962102154913, -2.0882402009082046 ], "(8, 6, 9, 2, 4)": [ - -1.928300481620839, + -1.783599106958593, -2.5608177531042338, -2.8146029077677297 ], "(10, 5, 8, 2, 4)": [ - -1.4646795845505558, + -1.5169151154919343, -2.076489235263065, -2.7522887207117375 ], @@ -1634,34 +1634,34 @@ -1.2719675983717273 ], "(10, 4, 0, 3, 5)": [ - -2.611889163312917, - -2.3289195899525432, + -5.232908930404152, + -4.463115487276285, -3.0710338997158506 ], "(8, 3, 0, 3, 5)": [ - -2.0362866942144047, + -5.1612318275490985, -3.408108529823798, - -3.2421720177883375 + -5.014805417356687 ], "(10, 3, 3, 4, 4)": [ - -1.8187536481128936, + -2.603353542214241, -1.7223184089286767, - -1.607047573341368 + -1.3649479812793681 ], "(8, 6, 2, 3, 4)": [ - -1.9641495855857405, - -1.8014780275001385, - -1.4414363090787623 + -4.5896895642017475, + -5.307507780952646, + -3.843299894261976 ], "(9, 3, 2, 5, 5)": [ - -1.636318035858868, - -1.4564444490805997, - -1.680909428667017 + -2.8095326840500876, + -1.1148906089988957, + -1.4107128812998886 ], "(10, 4, 2, 5, 5)": [ - -1.605151261894316, - -1.528106975721366, - -1.4010209037178594 + -3.485062110457985, + -1.3232435499674677, + -1.2498132021205723 ], "(9, 6, 2, 5, 4)": [ -1.9486647758021267, @@ -1674,14 +1674,14 @@ -1.4913610957251184 ], "(8, 3, 2, 5, 5)": [ - -1.4860256759829467, - -1.0616002791774994, - -1.4060704906177095 + -2.1485557526986754, + -1.1385356476119959, + -1.2277120370187273 ], "(10, 4, 4, 6, 5)": [ - -1.2569928306451523, - -1.4416984420916947, - -1.7594146057666804 + -1.9945892829712037, + -2.5618928542479615, + -3.0015906702850743 ], "(10, 6, 5, 6, 5)": [ -2.8496149288127737, @@ -1689,33 +1689,33 @@ -2.822978976490662 ], "(6, 6, 7, 6, 5)": [ - -1.7281461049111906, - -1.326132249771503, - -1.6198060331511415 + -2.8504721878549173, + -3.28725067249615, + -3.0483762702813757 ], "(10, 6, 7, 5, 4)": [ -2.0263111008317343, - -1.6808264587194846, + -1.5310119089163157, -2.8923376890642896 ], "(10, 4, 8, 5, 4)": [ - -1.4833865843933824, - -1.7912612006718056, - -1.773120691188339 + -1.402254358179028, + -2.2529466380470424, + -2.352394089428107 ], "(7, 3, 8, 6, 5)": [ - -1.482782072095136, - -1.6507987640886017, - -2.1495708103561104 + -4.117944184258818, + -4.235947529519835, + -3.9412374900185423 ], "(10, 5, 9, 6, 5)": [ - -2.291581378566602, - -2.558285242832578, - -2.467366177595472 + -3.5667806174142367, + -4.669529667293248, + -5.238274535605051 ], "(9, 3, 8, 4, 4)": [ - -1.239995632359363, - -1.7570514267620778, + -1.185826410050541, + -1.6835046568858227, -1.7950821159048314 ], "(9, 7, 8, 3, 4)": [ @@ -1725,7 +1725,7 @@ ], "(10, 5, 7, 3, 4)": [ -1.3923825915037895, - -1.201463047942627, + -1.2325362485912066, -1.477167634474316 ], "(10, 3, 6, 3, 4)": [ @@ -1740,36 +1740,36 @@ ], "(8, 2, 2, 4, 4)": [ -2.363446367885195, - -2.1596425284263536, + -2.7147379728316365, -2.306128779625795 ], "(8, 3, 1, 4, 4)": [ -1.9905370574685057, -1.8982483676727349, - -1.4558612985104036 + -1.29554580444732 ], "(10, 6, 2, 5, 5)": [ -1.940444155572136, -1.5741949841168739, - -1.3316631028399544 + -1.3754060995642476 ], "(6, 6, 2, 5, 5)": [ - -1.1342048740922226, - -1.011235408313261, - -0.8686164297779841 + -1.6410344000986212, + -0.9627061654937623, + -0.7710971263573206 ], "(10, 5, 3, 6, 5)": [ - -1.2642723290237246, + -1.2861174647450704, -1.2855602858706714, -1.5918802147704847 ], "(10, 4, 5, 6, 5)": [ - -1.2522616664196988, - -1.4367225475450915, - -1.5395115368631398 + -2.57963604885433, + -2.6721176001406937, + -2.828425143627749 ], "(6, 3, 7, 7, 5)": [ - -1.2232375636604806, + -2.5645400294564977, -2.327650453439753, -2.593050659172742 ], @@ -1779,24 +1779,24 @@ -2.318659421432424 ], "(8, 3, 9, 5, 4)": [ - -1.7550683997671508, + -1.385871508528546, -2.1414509220465083, -2.14665802308778 ], "(10, 4, 8, 5, 5)": [ - -1.5101290640711749, + -1.2664931113441151, -1.8213878841240154, - -1.925244842089953 + -3.1814153794879707 ], "(9, 3, 8, 5, 5)": [ - -1.3705688836991776, + -1.4047517706796209, -1.5871293040755476, -1.726490645779535 ], "(9, 3, 8, 6, 5)": [ - -1.4978748422884864, - -1.8207150767997797, - -2.1082413141043865 + -4.00706382987763, + -4.043407827499212, + -5.8247906615699065 ], "(9, 6, 9, 5, 5)": [ -2.261293184533489, @@ -1804,19 +1804,19 @@ -2.5872605857102107 ], "(8, 6, 9, 6, 5)": [ - -2.45199262674004, - -2.5149905083564663, - -2.2097044960989334 + -3.6371732738852383, + -4.108976682123693, + -4.454290289295314 ], "(9, 4, 9, 5, 4)": [ - -1.4214538458376977, - -1.7669416151804034, - -1.8238332800746149 + -2.8717794284521703, + -5.75926451676572, + -6.196862734877766 ], "(6, 3, 9, 4, 4)": [ - -1.5052065922852096, + -1.26764965515349, -2.0501747330894458, - -2.1649332214770047 + -3.288193701373077 ], "(7, 6, 9, 5, 5)": [ -2.1993276293997996, @@ -1840,23 +1840,23 @@ ], "(8, 2, 3, 5, 5)": [ -2.0492292250487814, - -1.98677723911433, + -1.8725933293087622, -2.0096945924294967 ], "(10, 5, 2, 4, 5)": [ -1.8727469651338506, -1.650026892668404, - -1.3850648684681106 + -1.3330821106302828 ], "(6, 3, 0, 4, 4)": [ - -1.9760627844197152, + -4.147880155648765, -2.323341063067829, -2.1739042614939406 ], "(9, 5, 0, 5, 5)": [ -1.7815885454854266, -1.5529058992855738, - -1.3225053994892457 + -0.8172593880248411 ], "(9, 6, 0, 5, 4)": [ -4.799957347683901, @@ -1876,12 +1876,12 @@ "(10, 5, 1, 6, 5)": [ -1.575853743273415, -1.4556488724021925, - -1.4146988240608813 + -1.4269379187151667 ], "(9, 4, 2, 7, 5)": [ - -0.920441132352799, - -1.018499079191452, - -0.7139239218538909 + -0.7829686438087086, + -0.9907505428705811, + -2.3654206009080676 ], "(7, 3, 5, 7, 5)": [ -1.8469436109519546, @@ -1904,9 +1904,9 @@ 0.0 ], "(8, 6, 6, 5, 4)": [ - -1.1952454046027363, - -0.924285911013688, - -1.2581423803836889 + -1.2201501888012252, + -1.212937477308011, + -3.059609769351121 ], "(8, 6, -1, 8, 5)": [ 0.0, @@ -1914,24 +1914,24 @@ 0.0 ], "(10, 5, 6, 5, 4)": [ - -1.3808912495627035, - -1.4794119510489683, - -1.4722503334507238 + -1.34075319401532, + -1.3025453828178335, + -2.892496418417621 ], "(10, 4, 3, 3, 4)": [ - -1.816055884591733, - -1.479648386546371, - -1.6356497726354755 + -4.3202193935873625, + -2.424067811948685, + -2.5078715025989657 ], "(10, 4, 2, 4, 4)": [ - -1.730739073293239, - -1.6944357409244952, - -1.4781976101952772 + -5.130136633120818, + -2.6223179411419935, + -1.28583302668981 ], "(8, 3, 1, 5, 5)": [ -1.6448302127836552, -1.6716943195816227, - -1.6225944082016783 + -1.2224998926631767 ], "(10, 6, 2, 5, 4)": [ -1.8856494396747547, @@ -1944,14 +1944,14 @@ 0.0 ], "(10, 5, 2, 3, 4)": [ - -1.890584290893623, - -1.716287460243993, - -1.510585808177864 + -6.771000931356231, + -5.221328649973838, + -3.821161275592118 ], "(8, 6, 1, 4, 4)": [ -1.8579789368725472, -1.5124366723096259, - -1.2070543339493076 + -1.1345696471318516 ], "(6, 3, 5, 7, 5)": [ -1.1295857477312299, @@ -1959,18 +1959,18 @@ -2.646548460612596 ], "(7, 6, 8, 6, 5)": [ - -1.4720378219730912, - -1.8696453626610239, - -1.7755502909395688 + -2.436956455470286, + -3.3053421580225795, + -3.9062201514564996 ], "(8, 3, 9, 7, 5)": [ - -2.1826191698697257, - -1.8721610493435241, - -2.2857875197601363 + -7.776271536326027, + -9.877425539314988, + -9.304527339598938 ], "(10, 5, 9, 6, 4)": [ -2.636963303671472, - -2.455965576752533, + -4.488715598066502, -2.6453320654586525 ], "(8, 6, -1, 5, 4)": [ @@ -1986,7 +1986,7 @@ "(10, 3, 2, 5, 5)": [ -1.9325076434055752, -1.8568316086936083, - -1.5685674112534511 + -1.5253931145097612 ], "(9, 7, 2, 4, 4)": [ -5.3447198360026, @@ -1994,34 +1994,34 @@ -3.7184081187610167 ], "(9, 3, 3, 6, 5)": [ - -1.0829687949904214, + -1.0171175811598794, -1.2052499534467584, -1.4444445275596327 ], "(9, 3, 5, 6, 5)": [ - -1.4358294919090586, - -1.3393542665767242, - -1.6581577420693516 + -2.1309650490646455, + -2.7625366355071357, + -2.875518408025232 ], "(8, 3, 8, 6, 5)": [ - -1.5419617655880216, - -1.6976388883702906, - -1.8738955672885942 + -2.18968321934241, + -4.401780036408487, + -4.129533615127108 ], "(10, 3, 8, 4, 4)": [ - -1.4886942296669803, + -1.4903176622440517, -2.328547479558885, -1.9421057247298124 ], "(6, 3, 7, 3, 4)": [ - -1.4418646614491542, - -0.7869909888881033, + -2.2083776924661005, + -0.9950354699631416, -1.2504759391764255 ], "(10, 4, 6, 3, 4)": [ -1.5034754401854629, - -1.2063105032012302, - -1.5026982618577172 + -1.6870206950807218, + -1.430050773173796 ], "(7, 6, 2, 2, 4)": [ -2.171517620703933, @@ -2034,49 +2034,49 @@ -2.6324156986811933 ], "(9, 3, 1, 6, 5)": [ - -1.5125722727153776, + -1.2878777531270444, -1.5589929887961351, -1.5719560731711082 ], "(8, 6, 2, 5, 5)": [ - -1.3248988988815829, - -1.1542864836062452, - -0.8894767893650227 + -2.7137849712537334, + -1.094757084762737, + -0.9066131440309754 ], "(9, 4, 4, 5, 5)": [ - -0.7438731903094264, - -0.7023990522829013, - -0.5269999455544738 + -1.8380805276446044, + -0.5442725037893826, + -1.0004374892485615 ], "(6, 3, 4, 4, 4)": [ - -0.9546156400902509, - -0.9553003644158242, - -0.770470560617024 + -3.19552358172627, + -1.7738294488479351, + -0.8334716743609168 ], "(9, 4, 4, 4, 4)": [ - -0.8500526752645585, - -0.761402443278049, - -0.5814627649633353 + -5.145975902094742, + -1.8403062567036996, + -0.66559291386528 ], "(9, 5, 3, 4, 4)": [ - -1.074053050084472, - -0.8677936090119003, - -0.5977777957404873 + -5.830891247406586, + -2.6892096494719095, + -0.45789117291146647 ], "(6, 6, 3, 4, 4)": [ - -1.1032473943690162, - -1.0456479468248645, - -0.8845662284907435 + -2.857763948992205, + -1.856953283746502, + -0.7236736841536432 ], "(9, 5, 2, 4, 4)": [ - -1.211703776952878, - -1.085655912762366, - -0.8745748157676706 + -3.1116627151452576, + -2.9810952411373495, + -0.3654289660660289 ], "(9, 4, 2, 4, 4)": [ - -1.1790707360838235, - -1.1047403716965807, - -0.8954824801547889 + -5.295994554553318, + -2.383151725425204, + -0.4622974970521909 ], "(8, 3, 2, 4, 5)": [ -1.853541096853061, @@ -2086,85 +2086,85 @@ "(9, 4, 2, 4, 5)": [ -1.3086248768642708, -1.0490558296698542, - -0.8403857636148595 + -0.823490464564339 ], "(9, 5, 2, 4, 5)": [ -1.1182570669183787, -1.0139482731278247, - -0.8002760282513879 + -0.6603819492187143 ], "(9, 6, 1, 4, 5)": [ - -2.1670519283642857, - -2.0088105541134005, - -1.6730604344657194 + -3.151708917697222, + -2.500695315896193, + -2.2599739165619606 ], "(8, 6, 1, 5, 5)": [ -1.557330400021279, -1.3815801616968217, - -1.2149065883718788 + -1.0200812650840891 ], "(7, 3, 2, 6, 5)": [ - -0.8438909685195464, + -0.7664857807821728, -1.246867840185912, -1.256603809046345 ], "(9, 4, 3, 5, 5)": [ - -0.7995707709836202, - -0.6825901153386262, - -0.49264563679421725 + -2.534182288624826, + -0.2960685388075988, + -0.5971647948006795 ], "(9, 5, 4, 5, 5)": [ - -0.80606360505079, - -0.7578603537423892, - -0.6693447891764523 + -1.8415621834998759, + -0.5512088066468556, + -1.1640832478188508 ], "(6, 6, 4, 5, 5)": [ - -0.7564963873008225, - -0.8659648852109679, - -0.8840065441871054 + -2.3448969685434506, + -0.7566844604346726, + -1.1294643823126382 ], "(9, 5, 4, 4, 4)": [ - -0.7518062473693816, - -0.6964581809742945, - -0.5143232387976454 + -5.417904698257837, + -2.124956458563256, + -0.3942071109235869 ], "(6, 3, 5, 5, 5)": [ - -0.5823590117135554, - -0.7461948051307419, - -1.004381035837029 + -0.9812706642054315, + -1.5407329089635606, + -3.1733132384686007 ], "(9, 4, 7, 6, 5)": [ - -0.8840005140694576, - -1.204453682326272, - -1.453018055415068 + -3.221449218580045, + -5.263807504325631, + -6.7776674514809185 ], "(10, 3, 9, 5, 4)": [ -2.552425396563603, -2.775429928241252, - -2.287245433420268 + -3.9351155343235424 ], "(10, 5, 9, 4, 4)": [ - -1.855149458402978, + -1.7129514132572894, -2.1816937530274036, -2.4538389899970774 ], "(6, 6, 9, 4, 4)": [ - -1.6857515502687568, + -1.48240001175667, -1.9586731269898148, -2.1055571776034814 ], "(8, 3, 9, 3, 4)": [ -2.2596042705615247, - -1.6298988834053716, + -1.1860800105621707, -1.8124175438262053 ], "(9, 3, 9, 3, 4)": [ - -1.7717235954530532, + -1.5773341946632764, -1.8573707949413454, -2.090198486077683 ], "(10, 5, 9, 3, 4)": [ - -1.7775618809294733, + -1.6765376232281033, -2.034973815041058, -2.0347870142955617 ], @@ -2174,39 +2174,39 @@ -1.6890555320311345 ], "(9, 5, 8, 4, 4)": [ - -0.884960626387038, + -0.6047554985587844, -1.01481770538696, -1.1923675398891354 ], "(7, 3, 8, 4, 4)": [ -1.335765566272856, - -1.0824468865498402, + -1.0403154804711088, -1.5000832962009032 ], "(9, 5, 7, 3, 4)": [ -0.8379410727530197, - -0.7656320271612576, + -0.7764602683054478, -0.8465308764620186 ], "(9, 5, 3, 2, 4)": [ -1.4426913119978741, -1.299436852929986, - -0.8998570495081942 + -1.8007815453713527 ], "(6, 3, 1, 2, 4)": [ -2.2563954168004363, -2.093529357866002, - -1.8350838025569454 + -4.123551248112744 ], "(9, 4, 0, 2, 4)": [ - -1.773205621540337, - -1.9138499752900648, - -2.033391638879789 + -14.81772226675954, + -14.207188657904315, + -14.739219585535226 ], "(9, 5, 0, 3, 5)": [ - -1.9132683167801545, + -4.715069035743243, -1.9688879760525948, - -1.7556384456055003 + -3.94251126149918 ], "(8, 6, 0, 3, 5)": [ -3.0118740203236047, @@ -2214,34 +2214,34 @@ -2.0640428896456346 ], "(9, 5, 0, 4, 4)": [ - -2.0306240131181497, + -3.425401194235297, -1.9068778406387568, -1.67984552002607 ], "(6, 3, 0, 3, 4)": [ - -1.976022170954814, + -4.684537132645761, -2.346188527188942, - -2.229196244659775 + -4.080000210388694 ], "(7, 6, 0, 4, 5)": [ -2.068930169030546, -2.179556788579592, - -1.7813412981648433 + -1.5566875233907262 ], "(8, 3, 0, 4, 5)": [ - -2.2535960057884727, - -2.05748256769371, - -2.2183529782972284 + -4.576277447731696, + -3.703417111643043, + -4.939764927704818 ], "(8, 4, 0, 4, 5)": [ - -1.5555045935779481, - -1.5627910975155297, - -1.3637883747892403 + -6.777646084330977, + -4.269140823025644, + -2.7624105889747352 ], "(8, 5, 0, 4, 5)": [ - -1.6422085709967815, - -1.5474692248688826, - -1.3304251179840998 + -4.502820836922405, + -4.346361119260969, + -4.348922115102404 ], "(9, 5, -1, 3, 4)": [ 0.0, @@ -2250,7 +2250,7 @@ ], "(10, 6, 4, 3, 4)": [ -3.7474102362743307, - -2.2801679981912844, + -3.1052472820456876, -4.067727657206254 ], "(8, 6, -1, 3, 4)": [ @@ -2261,26 +2261,26 @@ "(6, 6, 0, 5, 5)": [ -2.003095238519991, -1.9193407552973758, - -1.3415454440382213 + -1.0382009783159973 ], "(9, 5, 1, 6, 5)": [ - -1.0181472211925198, - -0.9140246919025485, + -0.9270905196955518, + -0.5871261003673495, -1.1222532040471056 ], "(9, 4, 1, 6, 5)": [ -0.9543098137573415, - -0.8438790729948207, + -0.5834633322733667, -1.0303212184409034 ], "(9, 4, 1, 5, 5)": [ - -1.1393957184884471, + -1.8414121297078712, -1.1914428406001707, - -1.0443224979740453 + -0.6821667251148497 ], "(9, 5, 2, 6, 5)": [ - -0.8644955088917631, - -0.680057439151986, + -0.7757948496083137, + -0.7784245165318134, -0.8380108169281646 ], "(6, 6, 3, 5, 4)": [ @@ -2291,22 +2291,22 @@ "(9, 5, 3, 5, 4)": [ -1.0228504377115177, -0.8180084597504697, - -0.5413896308340267 + -0.5427101644670569 ], "(7, 3, 2, 4, 4)": [ - -1.4446769500562167, - -1.2760614915888753, - -1.283807327714919 + -2.5104153916814984, + -2.3287161310747875, + -0.7141335257721018 ], "(9, 4, 2, 5, 4)": [ -1.409989320391361, -0.9786774169946206, - -0.74196159089707 + -0.7428344983276203 ], "(9, 5, 2, 5, 5)": [ - -1.0327319310623309, - -0.8649606684123513, - -0.749336160496806 + -2.8257858912300122, + -0.7187417736671715, + -0.38994721805610266 ], "(8, 6, 2, 5, 4)": [ -2.311488821858824, @@ -2314,54 +2314,54 @@ -0.9254564165272484 ], "(9, 6, 3, 5, 5)": [ - -1.4327391697661964, - -1.3298516102873785, - -1.1751132783581912 + -3.117428928741692, + -1.1629790396716155, + -1.3223477567957436 ], "(8, 4, 4, 5, 4)": [ - -0.411367550703472, - -0.3873531434869068, - -0.5519568096388782 + -1.2946850393014993, + -0.17821644867022682, + -0.81735069870673 ], "(9, 4, 4, 5, 4)": [ - -0.6905091419546432, - -0.5767294536789904, - -0.7298475868639482 + -1.870907781288291, + -0.6507346986956815, + -1.0856225056985553 ], "(9, 5, 4, 5, 4)": [ - -0.6936180464568257, - -0.5843689066868187, - -0.7114299944003846 + -1.8042098499061012, + -0.5866588842244822, + -1.1206368814828513 ], "(7, 6, 4, 4, 4)": [ - -1.1534787736174068, - -0.92645137903088, - -0.6395708417622635 + -4.391906765942956, + -1.8388579301838799, + -0.6103131230565556 ], "(7, 3, 2, 5, 5)": [ - -0.9211447489929296, - -1.1542258944747517, + -1.9774064221042007, + -1.0116411266721197, -1.2539896487179618 ], "(9, 5, 1, 4, 4)": [ - -1.4568756416484605, - -1.3544749809721537, - -1.0555956991083681 + -3.011386526153308, + -2.0913530437726995, + -0.8512209292797224 ], "(6, 6, 1, 4, 4)": [ -1.8021155624733032, -1.4630394476506585, - -1.1232016485040621 + -0.9997721909754763 ], "(7, 3, 0, 2, 4)": [ - -2.0339460673395187, - -2.233994960367901, + -5.8990252090044955, + -4.970540432631293, -2.3658275465895127 ], "(8, 4, 0, 2, 4)": [ - -1.678306880573079, - -1.8666338122245238, - -1.839994641081812 + -14.649523076406783, + -15.552702559614623, + -14.370975317698836 ], "(8, 5, -1, 2, 4)": [ 0.0, @@ -2369,39 +2369,39 @@ 0.0 ], "(9, 3, 5, 5, 4)": [ - -1.408655388923413, - -1.4998793619708022, - -1.607311779189667 + -1.6677518416870871, + -1.14431806873809, + -2.5451198338687986 ], "(8, 6, 3, 4, 4)": [ - -1.6024406551509558, - -1.337312023282676, - -1.1088126150169892 + -5.406498240537504, + -2.5636704275014024, + -0.7951471452638623 ], "(8, 3, 4, 5, 4)": [ - -1.1016636249992806, - -1.4200526120622115, - -1.5959348324619524 + -2.160183941782161, + -0.933864168702228, + -1.636616085775181 ], "(10, 3, 4, 5, 4)": [ -1.714553745515882, - -1.704507483107967, + -1.5889447986051817, -1.7572322844878336 ], "(10, 5, 4, 5, 4)": [ - -1.5550019171520355, - -1.4811416782664566, - -1.4018669608040206 + -2.486128822436345, + -1.3272563523814658, + -1.6042960773198054 ], "(9, 6, 3, 5, 4)": [ -1.5952388745908803, -1.662523574874836, - -1.2578354003012602 + -1.1461508266711307 ], "(9, 3, 7, 7, 5)": [ - -1.481407362061976, - -1.9595018994432296, - -2.1841132786148703 + -3.479322010281522, + -3.6026382650782267, + -4.651142358422471 ], "(7, 3, -1, 6, 4)": [ 0.0, @@ -2410,7 +2410,7 @@ ], "(6, 6, 1, 7, 5)": [ -1.8073611183057294, - -1.409056247585692, + -1.2847418297577788, -1.8083704660729376 ], "(10, 4, 2, 5, 4)": [ @@ -2424,19 +2424,19 @@ -1.9010866611529267 ], "(9, 3, 4, 5, 4)": [ - -1.4668274626653781, - -1.5443132178419565, - -1.5546993312971016 + -2.1950266679979573, + -1.4146032967397575, + -1.5564532734538492 ], "(10, 5, 5, 6, 5)": [ - -1.5513641986777844, - -1.3377678549827485, - -1.5929085101888356 + -2.586809294414247, + -2.8185952214023615, + -2.818585008291409 ], "(9, 6, 7, 6, 5)": [ - -1.5866248928737365, - -1.7861756588053983, - -1.8538549215273 + -3.9597822171337502, + -4.373701318241281, + -4.923953042275949 ], "(7, 6, -1, 7, 5)": [ 0.0, @@ -2444,7 +2444,7 @@ 0.0 ], "(8, 3, 9, 4, 4)": [ - -1.3937333711528175, + -1.2698337118411516, -2.045977828809088, -2.246863227810381 ], @@ -2454,54 +2454,54 @@ -2.785950506391143 ], "(9, 6, 8, 2, 4)": [ - -1.4374003294515167, + -1.3577031552185879, -1.7817800443690222, -1.5737231625668988 ], "(8, 6, 8, 3, 4)": [ -1.3662047791588532, - -1.0803324004723056, + -1.0089823694799671, -1.2489902263601294 ], "(9, 4, 6, 3, 4)": [ - -0.999663658509288, - -0.8307347920842607, - -0.8475243349503258 + -1.9030194901066881, + -1.02264513618822, + -0.754419435779519 ], "(6, 3, 5, 4, 5)": [ -2.2877287931933985, - -0.6747951950400435, + -0.7548869227515235, -2.5697127916103155 ], "(6, 6, 3, 3, 4)": [ -2.683563677068558, - -1.1112123141894612, - -1.0108180174352264 + -2.867117487891041, + -2.310472816931666 ], "(10, 6, 2, 3, 4)": [ - -2.2857861157347372, + -4.283599505299113, -2.698811452693511, - -2.2676015185131493 + -2.597000658507854 ], "(10, 4, 1, 7, 5)": [ -1.6097170608706708, -1.5990168801612572, - -1.2647244794219406 + -1.2532690656522538 ], "(9, 6, 2, 6, 5)": [ - -1.2572641929664599, + -1.2115970630324293, -1.3698797550884876, -1.4046811294011103 ], "(10, 5, 5, 7, 5)": [ - -1.5161885037168985, + -2.420016629827503, -1.8094941866267968, -1.9467954348965342 ], "(10, 5, 9, 8, 5)": [ - -2.318055085455417, - -2.084385410731922, - -2.383757515187744 + -6.324922268571669, + -6.3862301730423745, + -8.803913430293285 ], "(7, 6, -1, 8, 5)": [ 0.0, @@ -2509,14 +2509,14 @@ 0.0 ], "(8, 3, 8, 4, 4)": [ - -1.0160990089949282, + -0.8763981437608115, -1.334860979425821, -1.4824559785631422 ], "(7, 6, 8, 5, 5)": [ - -1.6044097952071863, - -1.5454419858179191, - -1.559254075353481 + -1.4780937945067298, + -2.125104756785761, + -2.7701966667453988 ], "(9, 4, -1, 7, 5)": [ 0.0, @@ -2524,24 +2524,24 @@ 0.0 ], "(8, 7, 7, 5, 4)": [ - -2.205810087192157, - -2.302261771908304, + -2.1606978329191944, + -2.208146299528277, -3.331512323012908 ], "(9, 3, 5, 3, 4)": [ - -1.7563327166302771, - -1.5088867358309952, - -1.5186567757932525 + -2.873832025485161, + -1.9778267480803131, + -1.625229832444189 ], "(9, 3, 3, 2, 4)": [ -2.987175652374871, -2.2184117717627543, - -1.6367435072406478 + -2.3722954639360014 ], "(9, 6, 2, 4, 5)": [ -1.819225129462152, -1.6684137071797904, - -1.1885247990241508 + -1.1036960848640274 ], "(7, 6, 2, 4, 5)": [ -1.6606999766056738, @@ -2556,7 +2556,7 @@ "(6, 3, 1, 4, 5)": [ -1.624096279789917, -1.695223224189767, - -1.4339595842406534 + -1.9868315753199077 ], "(10, 5, -1, 3, 4)": [ 0.0, @@ -2564,14 +2564,14 @@ 0.0 ], "(8, 6, 4, 6, 5)": [ - -1.1255134071209885, - -1.0257197698220746, - -1.301611516426564 + -1.693329175323458, + -2.1813076684941257, + -3.300062151192738 ], "(6, 3, 8, 6, 5)": [ - -1.2055855973164156, - -1.4485727891382028, - -1.767022169361629 + -3.1989443700362736, + -2.8850443596393394, + -4.497935614573833 ], "(10, 4, -1, 6, 5)": [ 0.0, @@ -2579,59 +2579,59 @@ 0.0 ], "(10, 4, 5, 3, 4)": [ - -1.8396819537674018, - -1.3078306633919106, - -1.3660203434830736 + -3.1708822172296998, + -2.014001177753066, + -1.9065658403659351 ], "(9, 5, 1, 4, 5)": [ - -1.3707197822563704, - -1.3283132252012464, - -1.0353507349503395 + -3.0473209112999577, + -4.350356302663027, + -2.1070575919871075 ], "(6, 6, 1, 4, 5)": [ -1.6907412916221387, -1.5197755513071072, - -1.1336528107493318 + -1.9825520611652772 ], "(8, 3, 0, 3, 4)": [ - -2.339302079189858, - -2.0539730255551807, - -2.357719469262939 + -5.335988606406942, + -5.34008399396817, + -6.364603455352571 ], "(8, 3, 7, 4, 4)": [ - -1.0210310566538294, - -1.0518507403324628, - -1.1649124995300482 + -1.1111671322629872, + -1.1028597177629709, + -1.1495157981211612 ], "(9, 4, 6, 4, 4)": [ - -0.9037142347887224, - -0.74586025180218, - -0.8035290265356427 + -1.0578961164585776, + -0.6563610614533401, + -1.4489583911318396 ], "(9, 5, 5, 3, 4)": [ - -0.9661318996219183, - -0.7489308031158566, - -0.49061052981935677 + -3.656027625330532, + -1.7367164596537705, + -0.9160978238252685 ], "(9, 4, 5, 5, 5)": [ - -0.535441180922942, - -0.6340098549476778, - -0.7328218657915837 + -0.5838646192757103, + -1.5844098169636374, + -3.7843962872479926 ], "(7, 3, 6, 6, 5)": [ - -0.8101873921305163, - -1.6236127085109826, - -1.7604068950226905 + -2.4835956220171025, + -2.5675979050884337, + -3.3417009751986977 ], "(9, 4, 7, 5, 5)": [ - -0.7278850889352068, - -0.9808153820292572, - -1.1276733381436788 + -0.6055423812084391, + -1.3402682016296412, + -3.7229040362710535 ], "(9, 5, 7, 5, 5)": [ - -0.8508005597224363, - -1.1309092974918538, - -1.1032476955559387 + -0.7393273722540332, + -2.5388052671571377, + -2.7586382888329304 ], "(6, 6, 8, 6, 5)": [ -1.5100391384571212, @@ -2639,14 +2639,14 @@ -1.7073571938902796 ], "(9, 5, 8, 6, 5)": [ - -1.1787085851535115, - -1.362022446489874, - -1.6627520990292879 + -4.889569571816052, + -4.961949939798098, + -5.727361457869628 ], "(7, 3, 7, 6, 5)": [ - -1.4977730204459345, - -1.6024255865994044, - -1.6854151744888415 + -2.9727408641645283, + -3.5842298876074574, + -3.190595444877026 ], "(9, 3, -1, 4, 5)": [ 0.0, @@ -2654,28 +2654,28 @@ 0.0 ], "(10, 5, 3, 5, 5)": [ - -1.4033898711567525, - -1.3390610880722718, - -1.271139094246587 + -2.8957817164707786, + -1.1024848508601353, + -1.3004518261348672 ], "(9, 3, 3, 5, 5)": [ - -1.4418811752821865, - -1.3325994780897037, - -1.4185948519945835 + -2.9314155258520076, + -1.2413765367723286, + -1.4688141225368057 ], "(10, 6, 6, 5, 5)": [ - -1.4995875736884685, + -1.380771146568243, -2.79412667236656, -1.926597563344266 ], "(7, 6, 7, 6, 5)": [ - -1.469275344923376, - -1.8386024284285998, - -2.146598605280895 + -3.7338323543600356, + -4.499694665303727, + -5.289102293018309 ], "(6, 6, 8, 4, 4)": [ -1.2691410423411758, - -1.0574791601867515, + -0.8776711680105919, -1.5835622035543897 ], "(10, 6, 8, 3, 4)": [ @@ -2689,13 +2689,13 @@ -1.268930706954957 ], "(9, 3, 9, 4, 4)": [ - -1.7022907849773077, + -1.545876017497464, -2.122845751896925, -2.5695149196423293 ], "(9, 5, 9, 5, 5)": [ -2.014765721558755, - -1.6407848787703676, + -2.8906165306140092, -1.952138053649741 ], "(6, 6, 9, 5, 5)": [ @@ -2706,37 +2706,37 @@ "(10, 5, 1, 4, 5)": [ -2.032846311119629, -1.8943717623512206, - -1.6677556959282362 + -2.53971316228321 ], "(9, 6, 5, 5, 5)": [ - -1.4257802292429116, - -1.46962860166713, - -1.3027650904897632 + -1.7161543270899098, + -2.299589855973756, + -3.8455410578042986 ], "(7, 3, 2, 3, 4)": [ - -1.9186101253398449, - -1.3796706893702582, - -1.1192069421890354 + -4.043140702067095, + -2.498618399653889, + -2.0955767901191082 ], "(6, 6, 1, 2, 4)": [ -2.2236077696820655, - -1.947983728875871, - -2.0186256905495785 + -5.417797540340037, + -3.377352478356173 ], "(9, 3, 7, 6, 5)": [ - -1.366719582199892, - -1.6609366783951602, - -1.811351529018644 + -3.9604663948948766, + -5.090125545061872, + -5.953589169164861 ], "(8, 6, 2, 4, 5)": [ -1.7754254198962718, -1.3457491280370204, - -1.024581430881521 + -1.1956283000447498 ], "(8, 6, 2, 2, 4)": [ - -2.0419333439667517, - -1.8471624915903284, - -1.6930671310083762 + -4.312833842118741, + -5.943785251632324, + -3.7506525175949346 ], "(8, 3, 0, 6, 5)": [ -2.6639070886157725, @@ -2759,12 +2759,12 @@ -4.266241111700526 ], "(10, 6, 3, 6, 5)": [ - -1.5046109748837735, + -1.6714090978209857, -2.8903301140570767, -2.878313871779438 ], "(8, 7, 4, 5, 5)": [ - -2.1265381129716565, + -2.2776612688692732, -3.4799651432657637, -4.171089807277941 ], @@ -2774,29 +2774,29 @@ 0.0 ], "(9, 6, 7, 5, 4)": [ - -1.3963240016288156, - -1.475531607491893, + -1.4118393743263615, + -1.3964154443374612, -1.5277013825031438 ], "(7, 3, 5, 3, 4)": [ - -1.114756702049074, - -1.0083284546034408, - -1.1368289470494775 + -2.2461619897170904, + -1.4616245368054805, + -1.0013238076277806 ], "(10, 4, 4, 3, 4)": [ - -1.7220996020246668, - -1.4161806887173833, - -1.3049506963632227 + -2.9250901594273513, + -2.2078722335052414, + -2.0329874389463245 ], "(6, 6, 2, 3, 4)": [ - -1.6444742769791374, - -1.368914209490647, - -0.9758367114475595 + -3.279709260737877, + -4.146108093194814, + -3.1962021791032273 ], "(10, 4, 1, 4, 5)": [ -2.238669314237455, - -1.9413304148528792, - -1.62002085478263 + -2.781998379749411, + -2.946785550875598 ], "(7, 3, 1, 4, 5)": [ -1.8068811070168844, @@ -2809,19 +2809,19 @@ 0.0 ], "(8, 6, 4, 5, 5)": [ - -1.3053897274437882, - -1.002193756048162, - -1.0637331518284714 + -2.571644029744597, + -1.07369303036061, + -1.2650071761839405 ], "(8, 3, 8, 7, 5)": [ - -1.3860422918151891, - -2.0468317358508674, - -2.12685244093098 + -6.575272872259482, + -7.422261149365571, + -8.202598387557444 ], "(10, 6, 9, 7, 5)": [ -2.580278215808222, -2.9812090980920543, - -2.386160043691281 + -5.620782133759888 ], "(10, 5, -1, 8, 5)": [ 0.0, @@ -2841,7 +2841,7 @@ "(10, 4, 2, 7, 5)": [ -1.4085417975081627, -1.5602990605731053, - -1.1597867435204743 + -1.3019980715622825 ], "(9, 6, 4, 7, 5)": [ -1.463536398745501, @@ -2856,7 +2856,7 @@ "(9, 6, 9, 6, 4)": [ -2.863106918072109, -2.619498769410653, - -2.1003936593357775 + -4.899518740716241 ], "(9, 3, -1, 5, 4)": [ 0.0, @@ -2864,23 +2864,23 @@ 0.0 ], "(10, 3, 8, 5, 4)": [ - -1.7876083350858791, + -1.6663863472782512, -1.9083620517936812, -1.998862328677061 ], "(10, 3, 3, 5, 5)": [ - -1.9654836532017348, - -1.9283690991415305, - -1.7095067649987286 + -2.1015207818418022, + -1.787837305226717, + -1.4255173061439854 ], "(9, 6, 4, 5, 5)": [ - -1.4585060053596883, - -1.3550144008424265, - -1.211195614999197 + -2.6875718705832985, + -1.3086471910868964, + -2.228095038864032 ], "(7, 3, 1, 4, 4)": [ -1.5381119137226678, - -1.4335248909574747, + -2.316096344468675, -1.5587285296121889 ], "(9, 4, 0, 5, 4)": [ @@ -2900,12 +2900,12 @@ ], "(10, 4, 7, 3, 4)": [ -1.562986600574987, - -1.336035015913984, + -1.3889005301635724, -1.5533735376224644 ], "(6, 6, 7, 4, 4)": [ -0.9815454207708093, - -0.9147409566784834, + -0.852273082203898, -1.049029061983892 ], "(10, 4, 3, 2, 4)": [ @@ -2920,22 +2920,22 @@ ], "(6, 3, 1, 4, 4)": [ -1.5723854180930115, - -1.30672125040995, + -2.855494656779492, -1.4776089911856893 ], "(6, 6, 0, 3, 4)": [ - -2.535932997407433, - -2.2409105065168617, - -1.9039985786326317 + -5.489322117383479, + -4.0651716778987925, + -4.922821638792515 ], "(7, 3, 0, 4, 5)": [ -2.281589723535353, - -2.0301304376136287, - -2.0909678146978066 + -3.905559820623051, + -1.9686241109551696 ], "(9, 3, 0, 7, 5)": [ -3.3317207596136647, - -1.647742006036056, + -1.5222623354525595, -1.901767189390762 ], "(8, 6, 1, 5, 4)": [ @@ -2944,64 +2944,64 @@ -1.5173936056241533 ], "(8, 6, 1, 6, 5)": [ - -1.604457297391049, + -1.5649614909484693, -1.3435913304726708, - -0.9079591972878995 + -1.1196635212761565 ], "(9, 5, 2, 7, 5)": [ -0.9232610174859253, -0.9153378999432891, - -0.8231258787679985 + -2.495099032753797 ], "(9, 4, 4, 7, 5)": [ - -0.7952789818452083, + -1.3767565980897394, -1.2859077908753116, - -1.0673146775754578 + -4.128937160090614 ], "(8, 3, 5, 6, 5)": [ - -0.9058952844625693, - -1.2874078642849212, - -1.5095752327931438 + -2.083150435330551, + -2.7399508552990106, + -2.7208868088154174 ], "(9, 5, 7, 6, 5)": [ - -0.9427087947778616, - -1.1215770348843053, - -1.3317084417964828 + -3.6099906750367996, + -3.849455289221623, + -6.3254347517439165 ], "(9, 5, 8, 5, 4)": [ - -1.1631452037570502, - -1.213923230145745, - -1.529751500159508 + -1.6041570765832385, + -2.517219419634034, + -3.668176097788744 ], "(9, 5, 8, 3, 4)": [ -1.11539568300944, - -0.824648718099336, - -0.9911770576625991 + -0.898773149198516, + -0.6914485131827053 ], "(9, 4, 7, 4, 4)": [ - -0.6893556029952635, - -0.8987706482808407, - -1.0218971172025548 + -0.6504082359037978, + -0.8404119855065452, + -1.2655130414460776 ], "(7, 3, 7, 3, 4)": [ - -0.908274949885045, + -1.904526778516793, -1.0085421060194435, -1.6523458933955306 ], "(9, 4, 4, 2, 4)": [ - -1.2728564219928968, - -1.1142691791995927, - -0.9622685778462636 + -3.23741662184142, + -2.2873538088771017, + -2.5125924230674728 ], "(9, 5, 2, 2, 4)": [ - -1.548471438380946, - -1.3729916647458067, - -1.0470099606363252 + -4.04724980693018, + -4.871798377886586, + -3.2450070810931666 ], "(8, 5, 0, 2, 4)": [ - -1.8385795278050967, - -1.5123231618324844, - -1.8205078066054758 + -11.640076806110695, + -12.523610790188293, + -10.258112792624129 ], "(9, 4, -1, 1, 4)": [ 0.0, @@ -3021,7 +3021,7 @@ "(10, 5, 3, 5, 4)": [ -1.7170511541505498, -1.5268159031712984, - -1.3920646219344246 + -1.3931143283539944 ], "(7, 3, -1, 3, 4)": [ 0.0, @@ -3029,24 +3029,24 @@ 0.0 ], "(9, 6, 4, 6, 5)": [ - -1.4796893445818224, - -1.2209125226477169, - -1.4804446832304383 + -2.064013467114035, + -3.0316710588331226, + -2.47212339356739 ], "(9, 6, 6, 7, 5)": [ - -1.7173436582132309, + -3.1074358942700044, -2.213288415140127, - -1.9963564299367111 + -5.27866472442748 ], "(9, 3, 9, 8, 5)": [ - -2.6541193763954047, - -1.877883945476445, + -5.6427127981423535, + -6.584460333164491, -2.7216438667464358 ], "(7, 3, 4, 5, 5)": [ - -0.9491175841236313, - -0.6745850059195734, - -0.9390754597541623 + -2.280102074949495, + -0.9439255319941583, + -1.34900795021733 ], "(10, 3, 3, 4, 5)": [ -2.100244340131006, @@ -3054,7 +3054,7 @@ -3.070538550307461 ], "(9, 3, 0, 3, 5)": [ - -2.13453939843447, + -4.445212850794832, -2.4969997969558535, -3.023234849739432 ], @@ -3064,13 +3064,13 @@ 0.0 ], "(7, 6, 2, 6, 5)": [ - -1.132068968809985, - -0.8740410449616162, + -1.0410873851863627, + -0.9146959968856069, -1.6293828660398733 ], "(6, 3, 5, 6, 5)": [ - -0.7761481432024203, - -0.8982994022004442, + -1.2906835011172848, + -1.8320683524702155, -1.2056426443799257 ], "(10, 3, -1, 6, 5)": [ @@ -3094,18 +3094,18 @@ -3.026213076156407 ], "(7, 3, 4, 5, 4)": [ - -1.6064459030576126, - -0.8235404789591735, - -1.5449361738541105 + -1.7019359723597995, + -1.3582528816912336, + -1.5860787744163054 ], "(10, 5, 3, 4, 4)": [ - -1.6806473991651243, - -1.5613328181850736, - -1.3376844886357329 + -5.009090437984562, + -2.9847309946920983, + -1.2879189286594965 ], "(10, 3, 2, 3, 4)": [ -2.3611637631422253, - -2.240231570946493, + -3.2441506974052405, -2.348977331888554 ], "(9, 6, -1, 3, 4)": [ @@ -3121,22 +3121,22 @@ "(6, 6, 1, 5, 5)": [ -1.4326320949628155, -1.285641709031906, - -0.9977266353324545 + -0.9193180724082716 ], "(9, 3, 4, 5, 5)": [ - -1.305414094257248, - -1.3938572582117637, - -1.384802848289195 + -2.623678182572855, + -1.2048487560901904, + -2.072963180151134 ], "(8, 3, 8, 5, 4)": [ - -1.1562218621230214, - -1.372920116856605, - -1.6456500627186372 + -1.33022870142419, + -2.738037646040686, + -2.59964359480466 ], "(9, 4, 9, 5, 5)": [ - -1.634487909323005, + -2.5074293110882824, -1.942576821541788, - -1.8397524448562723 + -3.6889148582139977 ], "(6, 3, 9, 5, 5)": [ -1.8803316969339643, @@ -3144,8 +3144,8 @@ -2.5730391877897367 ], "(9, 5, 9, 4, 4)": [ - -1.6015346748315642, - -1.4269824796268507, + -1.4386169221859484, + -0.8687788448760919, -1.6880803649391962 ], "(6, 6, 9, 3, 4)": [ @@ -3155,11 +3155,11 @@ ], "(9, 5, 8, 2, 4)": [ -1.015694856391026, - -0.629141897332612, - -1.01040397078078 + -0.6860469291995889, + -1.0151729948533053 ], "(10, 4, 8, 3, 4)": [ - -1.54318309927836, + -1.5077470974941256, -1.6306123932762366, -1.7186172968441344 ], @@ -3169,9 +3169,9 @@ -2.563177386883991 ], "(9, 4, 3, 2, 4)": [ - -2.0418638459800773, - -1.4811422655190625, - -0.9937816035709524 + -4.390223605734295, + -4.13137681498827, + -2.6391647082062755 ], "(9, 5, -1, 1, 4)": [ 0.0, @@ -3179,19 +3179,19 @@ 0.0 ], "(9, 5, 5, 5, 4)": [ - -0.5181979969313402, - -0.722285296081439, - -0.7213158042414823 + -0.9941911591303557, + -0.3759954153363338, + -1.9549411764898967 ], "(6, 6, 6, 5, 5)": [ - -1.1362471715240152, - -0.9301469214975855, - -1.0666499679754335 + -1.1786073598275415, + -2.0922125237168565, + -2.759206535966676 ], "(9, 5, 6, 5, 4)": [ - -0.6300410764680868, - -0.8197327183429288, - -0.8793001602498787 + -0.7322524976307804, + -0.6177381222925731, + -2.614578469970663 ], "(9, 6, 7, 7, 5)": [ -2.148095027545461, @@ -3199,9 +3199,9 @@ -2.2405632026757742 ], "(6, 3, 9, 6, 5)": [ - -1.7707694692662879, - -2.129612596661315, - -2.395858616895832 + -4.767481790581113, + -3.984641632524027, + -5.3151276072249924 ], "(7, 6, -1, 6, 4)": [ 0.0, @@ -3209,19 +3209,19 @@ 0.0 ], "(10, 3, 4, 5, 5)": [ - -1.624573492142239, - -1.7137432015559324, - -1.7217602151424698 + -2.7833070125564947, + -1.4228432657936079, + -1.5706458687946727 ], "(9, 6, 6, 6, 5)": [ - -1.5414362675124984, - -1.4341324350615556, - -1.660794166327725 + -3.144470679078127, + -4.249942998731776, + -3.1979362613588727 ], "(9, 3, 8, 7, 5)": [ - -1.6268437079880411, - -1.990946404073169, - -2.2312788169448323 + -5.7087695103959115, + -5.304142279871512, + -8.322230290485834 ], "(10, 5, -1, 5, 4)": [ 0.0, @@ -3246,12 +3246,12 @@ "(10, 4, 4, 4, 5)": [ -1.6623459607768236, -1.9443664819521742, - -1.409743290058755 + -1.60335695780953 ], "(9, 5, 1, 7, 5)": [ -1.1285924376243173, -1.0028712949611907, - -0.9335276658111588 + -0.864052057893314 ], "(7, 3, 3, 7, 5)": [ -0.8612470804373957, @@ -3259,13 +3259,13 @@ -1.329824424702656 ], "(10, 5, 7, 7, 5)": [ - -1.5968522056058152, - -1.9104474896133006, - -2.2027491907028978 + -4.392458493067382, + -3.456015465235968, + -4.39253170416854 ], "(9, 4, 9, 8, 5)": [ -1.9452799397132907, - -1.7123998381139574, + -8.799610628869551, -1.973763012913968 ], "(8, 3, -1, 8, 5)": [ @@ -3274,9 +3274,9 @@ 0.0 ], "(10, 4, 6, 6, 5)": [ - -1.2215968369366499, - -1.460297002428379, - -1.6647381582379228 + -2.9998464218762764, + -3.0487774661178912, + -3.063477532612448 ], "(9, 5, -1, 6, 5)": [ 0.0, @@ -3284,7 +3284,7 @@ 0.0 ], "(7, 2, 5, 5, 5)": [ - -1.7562023966423337, + -1.7425491099551311, -1.9331354028637777, -2.1700676640922114 ], @@ -3295,28 +3295,28 @@ ], "(9, 6, 6, 3, 4)": [ -1.5612549573361039, - -1.4580605370289548, - -1.0129102383823578 + -1.4024341745544282, + -1.0468252260955841 ], "(10, 3, 5, 4, 4)": [ - -1.511912990970176, - -1.8207014049151822, - -1.883416473971225 + -2.5061208627820672, + -1.619339634912605, + -1.7611292533674436 ], "(7, 3, 4, 4, 4)": [ - -1.0754760155294145, - -0.7925082491093395, - -1.0448129200622502 + -3.7701055382546036, + -1.9431419465441888, + -0.762814890706769 ], "(6, 6, 2, 4, 4)": [ - -1.2084277423404477, + -2.289207245678963, -1.2883237185097143, - -0.7694784934193293 + -0.6542671429572866 ], "(10, 6, 2, 4, 4)": [ -2.568459460142804, -2.323525914443227, - -1.4523225105365887 + -1.4433034865469947 ], "(10, 4, 6, 7, 5)": [ -1.6532665708874892, @@ -3324,14 +3324,14 @@ -2.185286837232741 ], "(8, 3, 7, 6, 5)": [ - -1.3543836020944664, - -1.442909891428818, - -1.7062191370870698 + -3.4635588267323207, + -4.226322276556013, + -4.83361488197997 ], "(8, 5, 1, 3, 4)": [ - -1.380863694617818, - -1.2353408166116184, - -0.9995495141742662 + -5.364703625553259, + -5.213374051392397, + -5.12312469299059 ], "(7, 4, -1, 2, 4)": [ 0.0, @@ -3341,22 +3341,22 @@ "(10, 3, 3, 5, 4)": [ -1.9854492784545803, -1.80851164970648, - -1.7284400699442817 + -1.7020024905072557 ], "(9, 6, 4, 5, 4)": [ - -1.549266145546797, - -1.3721191020369923, - -1.2481808457965886 + -1.8668165519625708, + -1.4789767521978958, + -1.6894164347964882 ], "(7, 6, 2, 4, 4)": [ - -1.442839163702142, - -1.1289573797749084, - -0.8337074279767189 + -2.5878372903024935, + -1.6366109672298879, + -0.6382644894119199 ], "(7, 4, 0, 3, 4)": [ - -1.7307163075332024, - -1.647021646188791, - -1.9658259420959023 + -4.442860264768975, + -5.465799698453724, + -4.522977116078612 ], "(8, 4, -1, 3, 4)": [ 0.0, @@ -3364,9 +3364,9 @@ 0.0 ], "(9, 3, 6, 6, 5)": [ - -1.2810801763044704, - -1.5056963480933616, - -1.8536608674216344 + -3.011631215305804, + -3.223266098653828, + -3.6446579016724665 ], "(10, 6, 9, 5, 4)": [ -2.4713717988894732, @@ -3379,14 +3379,14 @@ -2.1726079091279553 ], "(9, 3, 2, 2, 4)": [ - -2.050609561947509, - -2.0570747250616743, - -2.155513903673104 + -4.515026857319819, + -3.5915426070152052, + -4.2330028598691545 ], "(9, 3, 1, 4, 5)": [ - -2.0240489915687676, - -1.8456049087544824, - -1.650438318969856 + -4.7955401696182, + -4.058462659034587, + -3.9168647732601247 ], "(10, 4, 0, 6, 5)": [ -2.366640389710417, @@ -3394,8 +3394,8 @@ -1.7785388599740484 ], "(8, 6, 7, 7, 5)": [ - -1.5493408464089198, - -2.054256288944658, + -2.523579576862695, + -3.693288545155051, -2.100646184670561 ], "(8, 3, 9, 8, 5)": [ @@ -3409,24 +3409,24 @@ -5.37625323545768 ], "(7, 6, 4, 6, 5)": [ - -0.7979178807669244, - -1.151238042386061, - -1.1393181866833728 + -1.2724267188414573, + -1.6219264586481072, + -3.381617389180609 ], "(8, 6, 9, 3, 4)": [ - -1.9422553697846499, + -1.7079633201681286, -2.212438955272213, -2.3138568892723335 ], "(8, 4, 8, 3, 4)": [ - -0.5003701316216829, + -0.44748684225610436, -0.7521193588635318, -0.7049761813095403 ], "(8, 5, 6, 3, 4)": [ -0.518359171331739, - -0.3490537180012312, - -0.42764253660111107 + -0.7894903909471498, + -0.32941477588355117 ], "(8, 6, 4, 2, 4)": [ -3.3108382693426255, @@ -3434,28 +3434,28 @@ -1.0924097873678653 ], "(9, 5, 2, 3, 4)": [ - -1.4945410007790425, - -1.1469926575702785, - -0.8285923614093573 + -6.471819711939139, + -4.995063344144459, + -3.506208410923877 ], "(7, 4, 1, 2, 4)": [ -2.0597477565203297, - -1.656885802391793, - -1.2196760005841867 + -5.645306236497399, + -3.309124893826471 ], "(9, 4, 0, 3, 5)": [ - -2.1902545256189967, - -1.9652293933752945, - -2.107566372920828 + -6.991988411817734, + -8.493625664194385, + -7.746962881381365 ], "(6, 5, 0, 4, 5)": [ - -1.5966297398212288, - -1.6285440492015713, - -1.2683583872259863 + -5.707718565370751, + -5.018110036557067, + -5.174697792340245 ], "(10, 6, 9, 6, 5)": [ - -2.9180113984234937, - -2.6094266888829516, + -4.022898481389679, + -4.034133775607738, -3.0581677521461565 ], "(8, 6, -1, 6, 5)": [ @@ -3469,23 +3469,23 @@ -5.359587961987948 ], "(8, 6, 6, 4, 4)": [ - -1.1671533953653328, - -1.23555663534839, - -1.301333770654706 + -1.3220232076232488, + -1.0498074606518586, + -1.2701958390031398 ], "(9, 6, 5, 3, 4)": [ - -1.4255537799866116, - -1.2744110474401866, - -0.9756187753318176 + -2.710850436863759, + -1.7143836329981834, + -1.587157785003117 ], "(6, 6, 0, 4, 5)": [ - -2.15599595420883, - -1.9520399727250475, - -1.617466823483227 + -5.445280555243709, + -6.232204274393204, + -6.2372260982206384 ], "(10, 5, 0, 3, 5)": [ - -2.068641406066307, - -2.9894938696048987, + -4.500735953004192, + -5.060752574885578, -2.825016934521113 ], "(8, 3, -1, 4, 5)": [ @@ -3495,8 +3495,8 @@ ], "(10, 5, 2, 6, 5)": [ -1.304995017180883, - -1.1896956176700935, - -1.3483130121023381 + -1.229604113288497, + -1.29741678181625 ], "(10, 4, 4, 7, 5)": [ -1.385961097819488, @@ -3504,52 +3504,52 @@ -1.7761969040730017 ], "(7, 6, 7, 5, 4)": [ - -1.1638740703404264, - -1.1656248855795381, + -1.120287062532807, + -0.8727208451695524, -1.2300204801008627 ], "(8, 3, 7, 5, 4)": [ - -0.9398405051449512, - -1.0365039682074908, + -0.6938153190718225, + -1.5954555845987293, -1.3325963212216632 ], "(9, 4, 3, 3, 4)": [ - -1.3540376560081064, - -0.9330462199348192, - -1.0541832461951754 + -5.6310382227274065, + -3.6284672579084525, + -2.5180360312171333 ], "(9, 4, 1, 4, 4)": [ - -1.2871742926377565, - -1.4235587716414762, - -1.0820010191444898 + -2.567544591979234, + -3.480041202539126, + -0.932734153127806 ], "(9, 5, 1, 5, 5)": [ - -1.2321775266072414, + -1.1551405968997386, -1.128279475961386, - -0.9163592045155439 + -0.5926091581228315 ], "(8, 5, 1, 5, 5)": [ -1.044645098410301, -0.8661356990833137, - -0.6259957937513749 + -0.3675122811874737 ], "(8, 4, 1, 4, 4)": [ - -1.0863509905241802, - -1.088806402310271, - -0.9309753936685841 + -4.039212535904919, + -2.501063688176089, + -0.5110851670038931 ], "(8, 4, 0, 3, 4)": [ - -1.6730595678059823, - -1.7279997616401974, - -1.4993676119288164 + -4.218429273021347, + -3.852381915525707, + -6.39544907143584 ], "(7, 6, 9, 5, 4)": [ - -2.189810552772656, - -1.876729324740304, - -2.0938304784511197 + -4.143675593565464, + -4.6585392201616305, + -4.226450265316667 ], "(6, 3, 9, 5, 4)": [ - -1.4782763046166314, + -2.840088954162222, -1.9794364575716312, -2.015829185169474 ], @@ -3566,7 +3566,7 @@ "(10, 6, 1, 5, 5)": [ -1.9470118035203159, -1.9819260408871997, - -1.596208765648639 + -1.546070583321722 ], "(6, 2, 0, 4, 5)": [ -5.827722371865084, @@ -3576,7 +3576,7 @@ "(10, 3, 0, 4, 5)": [ -2.8822158630206443, -2.8593562556184073, - -2.4731467368635953 + -4.260216771142213 ], "(6, 6, -1, 7, 5)": [ 0.0, @@ -3591,25 +3591,25 @@ "(9, 6, 9, 8, 5)": [ -2.172820425112929, -2.0957526053719717, - -1.8982045037609234 + -7.738294741130072 ], "(10, 4, 2, 6, 5)": [ - -1.3192527151173095, + -1.3314244420915615, -1.4918571417290443, -1.4382305033138065 ], "(10, 6, 4, 7, 5)": [ -2.410123359693631, -3.712809435282419, - -2.1638726575460367 + -4.778640419002308 ], "(7, 6, 2, 5, 5)": [ - -1.1913931814443175, - -0.9884086569181918, - -0.9362848215216829 + -1.600716091799978, + -1.0089960718379256, + -0.7905744039424022 ], "(6, 3, 3, 5, 4)": [ - -1.0947544083657068, + -1.4646584479192741, -1.9701248833016882, -1.6578118484146116 ], @@ -3625,33 +3625,33 @@ ], "(7, 6, 8, 8, 5)": [ -4.868606468793054, - -3.666077295876341, + -6.985079124227722, -4.239997021318465 ], "(10, 3, 4, 4, 4)": [ - -3.0071046046970946, - -1.482204189087173, - -1.802119591330969 + -3.931109461325614, + -2.3770226264326606, + -1.2540780605999509 ], "(7, 3, 3, 4, 4)": [ - -1.0657615424957658, - -1.1187732101586199, - -0.81407999608173 + -3.282074374609575, + -1.5491993954799321, + -0.8595008745749819 ], "(7, 6, 3, 5, 5)": [ - -1.0419935016096318, - -0.8622246112957417, - -0.7842967176918909 + -2.1730454412172473, + -0.9105572681252568, + -0.8545254505722912 ], "(6, 3, 4, 3, 4)": [ -1.9206698263280637, - -1.1579354852113135, - -1.5197442850485292 + -2.01181361251075, + -1.8227771804726178 ], "(8, 6, 3, 5, 5)": [ - -1.2828988591117123, - -1.0741702750606617, - -1.0353407608057335 + -2.699779425914043, + -1.1399286017828678, + -1.0520016798542984 ], "(8, 3, 0, 5, 4)": [ 0.0, @@ -3664,19 +3664,19 @@ 0.0 ], "(8, 3, 6, 5, 5)": [ - -0.9398896789025716, - -1.2158720942270507, - -1.3144134073474962 + -0.827240911623736, + -2.2035793612154064, + -3.0348100071763384 ], "(6, 6, 8, 7, 5)": [ -1.9265940370130412, -2.0945070997987347, - -1.7945723011964194 + -5.403924824360708 ], "(8, 3, 1, 4, 5)": [ - -1.8868038390214026, - -1.6201843585702, - -1.7804787718400932 + -3.743009516661462, + -2.3438545272465605, + -1.9821303704756088 ], "(6, 2, -1, 3, 4)": [ 0.0, @@ -3689,7 +3689,7 @@ -2.4457276763735654 ], "(10, 6, 8, 5, 4)": [ - -1.8101588189934883, + -1.7572893906641807, -2.1092005213635954, -2.5863416872871947 ], @@ -3699,19 +3699,19 @@ -2.128664004685093 ], "(9, 5, 9, 3, 4)": [ - -1.5923831174987277, - -1.1951255605790982, + -1.402000758287144, + -0.977861547478602, -1.5225007532370158 ], "(9, 4, 9, 3, 4)": [ - -1.468970234859533, - -1.3139893574202401, + -1.29864857167226, + -0.9270710771166837, -1.6071159847921033 ], "(9, 4, 8, 3, 4)": [ -1.0631002636411835, - -0.9597610839105185, - -1.0859246784896581 + -0.7211908330408274, + -0.9116660428166028 ], "(9, 5, 8, 4, 5)": [ -3.3645716873490414, @@ -3719,29 +3719,29 @@ -2.9491334331890156 ], "(9, 4, 8, 5, 5)": [ - -1.1070126488084593, - -1.240631952947305, - -1.394970698648403 + -0.7091280377469178, + -1.8749817268315885, + -2.4530342669548997 ], "(8, 5, 8, 5, 5)": [ - -0.8212155084591755, - -0.9777831413635599, - -1.0852068509741788 + -0.59385683602468, + -2.0623207105588044, + -2.625177303867744 ], "(9, 5, 7, 4, 4)": [ - -0.7223210743457409, - -0.8610639902305072, - -0.9719225532757089 + -0.8222814719142937, + -0.525034541598235, + -0.8607749021726684 ], "(9, 4, 2, 2, 4)": [ - -1.4773120440945138, - -1.426253794630385, - -1.4030247929443602 + -5.859210555564671, + -5.657652655155479, + -5.859241547547517 ], "(6, 3, 1, 3, 4)": [ - -1.7258791225518852, - -1.8790960341632026, - -1.9063613909269472 + -3.7738536027147807, + -4.167865687521205, + -3.3327111627750963 ], "(10, 5, -1, 6, 5)": [ 0.0, @@ -3749,7 +3749,7 @@ 0.0 ], "(10, 3, 9, 4, 4)": [ - -2.0511146992894935, + -1.8706777365967602, -2.8765288593930296, -3.6688639851462166 ], @@ -3764,7 +3764,7 @@ -1.9732897747172464 ], "(10, 5, 8, 3, 4)": [ - -1.3141461144117694, + -1.2855531401314713, -1.7269966590090522, -1.6880983048366123 ], @@ -3784,64 +3784,64 @@ -2.6589434835784296 ], "(8, 3, 6, 4, 4)": [ - -0.9408478787486658, - -1.1082687225787708, - -1.2814074370852135 + -1.6407141361468613, + -1.1209554502344097, + -1.3049018293743555 ], "(7, 6, 7, 5, 5)": [ - -1.108682609131431, + -1.2442473462476529, -1.3900189767446876, -1.2573637501123718 ], "(9, 4, 5, 3, 4)": [ - -1.0133633769895072, - -0.8916270365520349, - -0.8626497660688983 + -2.1227662508726777, + -2.1414201183922246, + -1.0423977563318867 ], "(7, 3, 2, 2, 4)": [ -2.032962356676962, - -1.7609249658628938, + -3.5076247267726424, -1.897257153945268 ], "(8, 6, 1, 4, 5)": [ -1.9939046129259599, -1.580046591283773, - -1.331022286682403 + -1.0778183299734507 ], "(9, 4, 2, 6, 5)": [ -0.8522833071342603, - -0.6131936581346042, + -0.6902985811842144, -0.9434841342120359 ], "(9, 4, 6, 6, 5)": [ - -0.8513905938157754, - -0.929895064543822, - -1.2064674627146863 + -2.476320883289992, + -4.397146564412061, + -5.322545327717682 ], "(8, 6, 9, 4, 4)": [ -2.163959498694147, - -1.7250476758971476, + -1.6021562611318263, -2.207752366007984 ], "(8, 3, 8, 3, 4)": [ - -0.8968754787922782, + -0.8172238246737744, -1.1763730088011293, -1.4281128084872028 ], "(9, 6, 7, 3, 4)": [ -1.6006298611977998, - -1.1717939970375555, + -1.188482940110184, -1.4087073442173894 ], "(9, 5, 5, 4, 5)": [ - -0.6522553435627434, - -0.4816514961562464, - -0.7097173786299007 + -0.8130342630033536, + -0.5857242242677371, + -1.158082558761726 ], "(9, 4, 4, 4, 5)": [ - -0.5242387390271926, - -0.6315990103046127, - -0.6053932662975652 + -2.103273628688702, + -0.9518733794897262, + -1.1586716741904435 ], "(7, 3, 3, 4, 5)": [ -0.9550247556193681, @@ -3849,28 +3849,28 @@ -1.6528287710164058 ], "(9, 4, 2, 3, 4)": [ - -1.3221860620211157, - -1.1650354511963907, - -0.9280591580300621 + -4.910109290907684, + -6.6651903213308294, + -3.2440119217602836 ], "(6, 5, 1, 4, 5)": [ -1.469140043244736, - -0.8890940414069375, - -0.7741187893947215 + -1.838921736615443, + -1.447731081805519 ], "(6, 4, 2, 6, 5)": [ -0.5248900720133415, - -0.32257084723735463, + -0.4153881678250936, -0.3843584232723002 ], "(9, 4, 3, 6, 5)": [ - -0.664292744834006, - -0.5953007544286426, + -0.5918069821845053, + -0.7584654392044092, -0.8528634014659627 ], "(6, 4, 9, 8, 5)": [ -2.265081488952922, - -1.355455939898461, + -5.9137922252780175, -3.247215132798856 ], "(9, 3, -1, 3, 5)": [ @@ -3886,12 +3886,12 @@ "(9, 4, 3, 5, 4)": [ -0.9350872905908951, -0.785283196717704, - -0.6684273939834793 + -0.6489275941585577 ], "(9, 5, 4, 6, 5)": [ - -0.664060339028607, - -0.800168178462527, - -0.8916356709616268 + -1.764148997578403, + -2.9250160145421567, + -4.445860362853562 ], "(8, 3, -1, 7, 5)": [ 0.0, @@ -3914,7 +3914,7 @@ -4.359934479228372 ], "(9, 3, 8, 3, 4)": [ - -1.3594430013841898, + -1.285210876025713, -1.5475165937123154, -1.704485265382361 ], @@ -3955,16 +3955,16 @@ ], "(6, 6, 1, 3, 4)": [ -2.11640881017806, - -1.583242546840423, - -1.401843159258767 + -2.96036382618593, + -2.153643469210075 ], "(9, 3, 4, 7, 5)": [ - -1.1355447756823174, + -2.300056630501427, -1.5790460807720985, -1.934108421366661 ], "(10, 4, 7, 7, 5)": [ - -1.8814117452071528, + -2.6622501210254335, -2.1640610131394507, -2.1198041094369553 ], @@ -3975,48 +3975,48 @@ ], "(7, 6, 9, 8, 5)": [ -4.805969809654116, - -2.5136084189158665, - -1.776387264450847 + -7.048247292925188, + -7.211798686861191 ], "(8, 3, 3, 3, 4)": [ - -1.5712112345413212, - -1.8085737302919296, - -1.3220379172394188 + -4.181145860929073, + -2.598595251656906, + -2.150814438585765 ], "(7, 6, 1, 3, 4)": [ -1.9305309912056052, -1.8419044277283425, - -1.3772155728095765 + -2.3295362707684624 ], "(6, 3, 3, 4, 4)": [ - -1.1023321901558052, - -1.1513804491602797, - -1.2336980866699796 + -3.325093567748496, + -2.1038310717185373, + -0.9674776548462869 ], "(8, 2, 2, 4, 5)": [ - -2.2782029250088236, + -3.2541449080004416, -2.5140589474094712, -2.6262545758577245 ], "(9, 3, 0, 6, 5)": [ -2.2398114104147515, -2.0314548602488287, - -1.5068880832725617 + -1.6896948346380707 ], "(10, 5, 1, 7, 5)": [ -1.5724885780297613, -1.7225386133144116, - -1.2541672815794727 + -1.2424062821148723 ], "(9, 6, 2, 7, 5)": [ -1.422961277510121, - -1.3898417781088408, + -1.3899314013261919, -1.4134677074451913 ], "(8, 6, 4, 7, 5)": [ -1.429317819268593, -1.2625635525647891, - -1.4552656206476362 + -3.5679269483946605 ], "(6, 6, 9, 7, 4)": [ 0.0, @@ -4029,34 +4029,34 @@ 0.0 ], "(7, 3, 8, 5, 4)": [ - -1.0574430608750272, + -0.8630642674508313, -1.2251833487690682, -1.4019750373609097 ], "(6, 6, 8, 5, 4)": [ - -1.2843361022808146, - -1.481941585322054, - -1.5263606767481106 + -1.8863940459686668, + -2.272777327884355, + -2.3477733003669203 ], "(9, 3, 4, 6, 5)": [ - -1.3130572208450129, - -1.4042616065711298, - -1.5805404581805478 + -1.9348897457066108, + -1.9607256199281409, + -2.7932366654354954 ], "(8, 6, 7, 6, 5)": [ - -1.526824231181736, - -1.7166053386281144, - -1.6373194005331342 + -3.3265839168194047, + -3.6848206971380657, + -3.265048915927165 ], "(6, 3, 8, 5, 5)": [ - -1.146023231998537, - -1.38372020809429, + -1.038076559503422, + -1.971692434424206, -1.5118317405409238 ], "(7, 6, 9, 6, 5)": [ - -2.1864097586956244, - -1.7761105613085268, - -2.0830591058194647 + -4.869644415021577, + -6.883849223668559, + -4.7759660984182535 ], "(10, 3, 0, 3, 4)": [ -2.8832509609826227, @@ -4069,9 +4069,9 @@ -1.4178724601253898 ], "(9, 4, 9, 6, 4)": [ - -2.000088517948155, - -2.1052586491576766, - -1.8986027225034514 + -5.866868966940686, + -5.368796327985448, + -6.418702699085324 ], "(6, 6, 9, 5, 4)": [ -2.0147714198102764, @@ -4085,38 +4085,38 @@ ], "(8, 5, 9, 5, 5)": [ -1.629183974921311, - -1.5894107745199157, - -1.5328599270384604 + -3.0648359360196036, + -3.506834556410726 ], "(8, 4, 9, 5, 5)": [ - -1.4711651760689006, + -2.631904483227297, -1.825601742714863, -1.6955407094408332 ], "(9, 6, 5, 6, 5)": [ - -1.3690867958852346, - -1.5474740489809569, - -1.6713157000922574 + -2.2181633797730833, + -2.8122854915896482, + -2.8386197099050268 ], "(10, 5, 8, 4, 4)": [ - -1.2424296837579722, + -1.2595997230509381, -1.4530252019438488, -1.6847843822420678 ], "(6, 6, 8, 5, 5)": [ - -1.2390656792484134, + -1.1651367094370577, -1.420112035787676, -1.494845677648061 ], "(8, 3, 7, 3, 4)": [ - -0.9992660870283543, - -1.2421096535193294, + -1.9947246968114676, + -1.1554424171192195, -1.2717467781085987 ], "(9, 5, 4, 3, 4)": [ - -1.0847634950881393, - -0.8234490542503159, - -0.6170833926016575 + -2.3123067473466836, + -3.481923511673639, + -2.1565220789682074 ], "(10, 6, 0, 4, 4)": [ -4.0090561072177815, @@ -4131,12 +4131,12 @@ "(6, 6, 2, 6, 5)": [ -1.1132569071938816, -1.0590953760730195, - -0.8185831306385474 + -0.7846691089963143 ], "(6, 3, 7, 6, 5)": [ - -0.9966689347766198, - -1.4372895290415804, - -1.445820207341861 + -2.832569767485528, + -3.6552332594241967, + -3.524981672255626 ], "(9, 3, 2, 4, 5)": [ -2.0567133109997675, @@ -4146,17 +4146,17 @@ "(6, 3, 1, 6, 5)": [ -1.4820285881635933, -1.849841345885421, - -0.98322818594004 + -0.9431966521817555 ], "(9, 4, 2, 5, 5)": [ - -0.953540004777885, - -0.8905384185991603, - -0.6261374230956486 + -2.7817925864498716, + -0.3816591062134885, + -0.7739511847435496 ], "(8, 6, 4, 5, 4)": [ - -1.3778925993832642, - -1.2634282911938706, - -0.868765117420515 + -1.89248771911886, + -1.3315332542959475, + -1.2157015367881243 ], "(7, 3, -1, 7, 5)": [ 0.0, @@ -4164,14 +4164,14 @@ 0.0 ], "(10, 3, 5, 5, 4)": [ - -1.4493745749966331, - -1.5937269801298801, - -1.6080944956057488 + -2.4321427382591345, + -1.4705927550496707, + -2.7162615250787576 ], "(6, 3, 5, 5, 4)": [ - -0.5930694553743349, - -0.8056240613916661, - -0.9532211953878191 + -1.5883890157769867, + -0.6440765906922782, + -2.0590302444646245 ], "(6, 3, -1, 6, 5)": [ 0.0, @@ -4179,14 +4179,14 @@ 0.0 ], "(10, 4, 3, 5, 5)": [ - -1.4503628703397766, - -1.4887904292591485, - -1.2771042447909995 + -3.2733904649576187, + -1.1983318731098331, + -1.3746125002604306 ], "(6, 3, 2, 5, 5)": [ - -1.0062172220906038, - -1.2142569169218353, - -1.2232235538230598 + -2.110191101227058, + -1.0835100233352442, + -0.6677172501797779 ], "(7, 6, 2, 5, 4)": [ -2.2524701965959117, @@ -4195,21 +4195,21 @@ ], "(9, 4, 0, 6, 5)": [ -1.6141254169533226, - -1.4297403567857299, + -1.1894445091918857, -1.4984520779918835 ], "(8, 6, 5, 7, 5)": [ -1.9975413802025648, - -1.393222333757828, + -2.6899527131163374, -2.6410641721765145 ], "(9, 5, 7, 7, 5)": [ - -1.0744534673002248, - -1.4484229568706308, - -1.377117685357778 + -5.690287899389542, + -5.071853820371254, + -6.235032004427648 ], "(9, 4, 8, 8, 5)": [ - -1.821464012468692, + -4.3984798797287565, -2.1900707638268693, -4.881360244981003 ], @@ -4219,9 +4219,9 @@ -2.2283383402518897 ], "(10, 4, 6, 4, 4)": [ - -1.302927957807162, - -1.303026665608987, - -1.2080294541078942 + -1.4017493982006268, + -1.2101805508020513, + -1.542507139492052 ], "(10, 5, -1, 6, 4)": [ 0.0, @@ -4229,9 +4229,9 @@ 0.0 ], "(10, 4, 9, 6, 4)": [ - -2.5379843487296228, - -2.4138187792702697, - -2.6432742889516114 + -4.523416221704119, + -4.462774069796852, + -5.234073914114665 ], "(9, 6, -1, 5, 4)": [ 0.0, @@ -4274,9 +4274,9 @@ -1.0729734078521267 ], "(9, 5, 6, 7, 5)": [ - -1.272500127996135, - -1.455058682904275, - -1.2194597521521988 + -2.117479106150577, + -3.026760639714492, + -3.361406499097313 ], "(7, 3, 9, 8, 5)": [ -2.263065036267726, @@ -4294,9 +4294,9 @@ 0.0 ], "(8, 3, 6, 7, 5)": [ - -1.1835487834807368, + -1.9872539539213054, -2.051254081686168, - -1.8882995355270955 + -4.032594600891073 ], "(10, 6, 8, 6, 5)": [ -2.4662056655086357, @@ -4309,59 +4309,59 @@ 0.0 ], "(8, 3, 5, 3, 4)": [ - -1.2366383204835028, - -0.9215333875503141, - -1.2934423155598698 + -2.3383428419493897, + -2.3264952531870007, + -1.2497508741618855 ], "(8, 3, 3, 5, 5)": [ - -1.3668673759653842, - -1.3481493456175757, - -1.2144124846129094 + -2.7628449590079476, + -0.9656119995000185, + -1.1737370161609215 ], "(9, 3, 3, 5, 4)": [ -1.7254587270072128, - -1.3406136075701818, + -1.2962561395121377, -1.4841821032088722 ], "(8, 6, 5, 6, 5)": [ - -1.3424432976530933, - -0.9996358937666399, + -1.4835980798580135, + -1.835513133735845, -1.3515775563275003 ], "(6, 4, 7, 5, 4)": [ - -0.3120334075045995, - -0.598646190500675, + -0.15748472659704948, + -0.4552064867532457, -0.5936713991547473 ], "(9, 4, 7, 5, 4)": [ - -0.9633517187701772, - -0.9164967919867432, - -0.9781658761933485 + -0.6876870816682442, + -0.9087470238971554, + -2.4255664515016138 ], "(6, 5, 7, 5, 4)": [ - -0.5247275374576246, + -0.4100907188288217, -0.6021097972306124, - -0.7186259793518769 + -1.587365345036494 ], "(9, 5, 7, 5, 4)": [ - -0.8657011151386749, - -0.9250959022634725, - -1.0839712519357632 + -0.6619021329693596, + -0.9350296322519075, + -2.6812759102805637 ], "(6, 4, 8, 6, 5)": [ - -0.8414748919772911, - -0.99632663636048, - -1.3090504640386535 + -3.7719890218799033, + -3.386770259188525, + -3.411674825482816 ], "(7, 4, 9, 5, 4)": [ - -1.3698055354814742, - -1.6052566941155435, - -1.6014204624990471 + -3.238729408151138, + -3.9204358714679177, + -4.221664591240163 ], "(8, 4, 9, 5, 4)": [ - -1.3524440766390775, - -1.521328257109845, - -1.6419992388221 + -6.371418452038448, + -5.452865980312102, + -6.26690071335547 ], "(8, 5, -1, 6, 5)": [ 0.0, @@ -4371,7 +4371,7 @@ "(10, 5, 5, 2, 4)": [ -2.643859540840489, -1.6945784212999127, - -1.4775862327340756 + -2.054512752523377 ], "(10, 6, 1, 7, 5)": [ -2.9662888130913987, @@ -4379,7 +4379,7 @@ -1.8476777653607377 ], "(6, 6, 4, 7, 5)": [ - -0.9438415652023168, + -1.583171339727349, -2.0530476323703324, -2.2066432920745056 ], @@ -4400,13 +4400,13 @@ ], "(8, 4, 2, 7, 5)": [ -0.8450234114050426, - -0.5211130051307071, + -0.48908793304243303, -0.6280483403883929 ], "(8, 5, 7, 7, 5)": [ - -0.9311845954988477, - -1.2756884497845673, - -1.206938845541197 + -3.007226412202309, + -5.512434801088341, + -3.7637666465171886 ], "(7, 5, 8, 8, 5)": [ -3.0477768980144346, @@ -4414,9 +4414,9 @@ 0.0 ], "(8, 4, 9, 7, 5)": [ - -1.610355493030713, - -1.5929466814044775, - -1.6155252464523548 + -11.53824038237133, + -13.77948528080071, + -12.906034458109168 ], "(6, 4, -1, 8, 5)": [ 0.0, @@ -4424,7 +4424,7 @@ 0.0 ], "(7, 3, 9, 4, 4)": [ - -1.549040408759903, + -1.2396961513691198, -2.1414311306305565, -2.6799005848173003 ], @@ -4434,33 +4434,33 @@ -0.9124394392889793 ], "(10, 5, 4, 2, 4)": [ - -1.686112226003699, + -3.891646477835586, -2.367884086183223, -1.9372303026155544 ], "(10, 5, 6, 3, 4)": [ -1.4649622681849945, -1.54019431918709, - -1.4006124877558612 + -1.352308281860488 ], "(8, 6, 4, 4, 4)": [ - -1.305868683415695, - -1.1366232962186054, - -0.8665021435664904 + -6.278151811004147, + -2.8819004539534787, + -1.0051908476385147 ], "(7, 6, 0, 3, 5)": [ - -2.023983480473907, + -5.372193472447435, -3.700149940161264, -2.9567389640774984 ], "(10, 5, 4, 7, 5)": [ - -1.2153347888194872, - -1.6458622871432418, + -1.8386510568428864, + -3.476550567957455, -1.6190206305265789 ], "(9, 4, 7, 7, 5)": [ - -1.1366117201297181, - -1.4161806302203763, + -2.200513701441639, + -6.150401497264642, -1.427015639838335 ], "(10, 6, 8, 5, 5)": [ @@ -4469,9 +4469,9 @@ -2.3928938381053713 ], "(8, 6, 6, 5, 5)": [ - -1.2477302033859872, - -1.1980201763056084, - -1.247470006784372 + -1.0943888562885076, + -2.478931044887728, + -4.779561957970051 ], "(9, 3, -1, 6, 5)": [ 0.0, @@ -4484,49 +4484,49 @@ 0.0 ], "(6, 6, 5, 6, 5)": [ - -0.8393029455444898, + -1.230586411175313, -1.1716088977915784, - -1.121060764402156 + -2.5918978599612745 ], "(9, 5, 3, 6, 5)": [ - -0.7878922063834745, - -0.617997241281661, - -0.7839243302206633 + -0.5743090366340482, + -0.7999592809522458, + -1.8449457890628844 ], "(9, 4, 5, 7, 5)": [ - -0.8573798643812924, - -1.315977834267984, - -1.2980581774868674 + -1.448529706510019, + -2.5888642357585336, + -3.6894922561916976 ], "(9, 6, 8, 3, 4)": [ -1.6726990277381453, - -1.4654291104874257, + -1.1566555671698329, -1.7065213835467026 ], "(6, 3, 7, 4, 4)": [ - -0.8950908739906707, - -0.8938363834595318, + -0.996966677421178, + -0.9497905534892036, -1.0540553080153812 ], "(7, 6, 6, 4, 4)": [ - -0.8988483501529277, - -0.8164669848791001, - -1.0039276542521214 + -1.2901203259394824, + -0.7798612079435918, + -1.1605108762588354 ], "(9, 5, 6, 5, 5)": [ - -0.5119402181473222, - -0.812620879212024, - -0.9073294659107451 + -0.456790422226262, + -2.1294919923257414, + -5.673491057840661 ], "(9, 4, 6, 5, 5)": [ - -0.6463504471152293, - -0.8499886990856285, - -1.0729087739684844 + -0.6702591080212624, + -2.5983689121596583, + -5.606790843055611 ], "(9, 4, 5, 4, 4)": [ - -0.6632333425044062, - -0.5304103864536176, - -0.6705413898446595 + -4.178038885660339, + -1.1771587456894794, + -0.6789242884297908 ], "(8, 2, 8, 4, 4)": [ -2.459275486314893, @@ -4546,12 +4546,12 @@ "(10, 4, 7, 2, 4)": [ -1.6845036286263584, -1.5344043047154519, - -1.1745590276903248 + -1.2670421762215855 ], "(9, 6, 5, 2, 4)": [ -3.8531669892821307, - -1.6156449101955581, - -1.8765685842308124 + -3.546263950465522, + -2.4420175402558395 ], "(9, 6, -1, 1, 4)": [ 0.0, @@ -4566,12 +4566,12 @@ "(10, 6, 3, 5, 5)": [ -3.4208495620280566, -1.5552806028162476, - -1.2472403149773204 + -1.3891695590112565 ], "(7, 6, 4, 5, 5)": [ - -0.8762885185184887, - -0.8059097412229346, - -0.6321565477835038 + -2.319478102656211, + -0.9210262946500241, + -1.4849859694436534 ], "(9, 4, -1, 5, 5)": [ 0.0, @@ -4580,8 +4580,8 @@ ], "(10, 5, 3, 7, 5)": [ -2.5647829252060257, - -2.556452933811996, - -1.5619784279439566 + -4.160895064654392, + -3.338957575255131 ], "(10, 3, 4, 3, 4)": [ -3.5884613845922333, @@ -4589,18 +4589,18 @@ -1.6812761107908278 ], "(10, 6, 4, 5, 5)": [ - -1.6117939615738766, - -1.2884784991388256, - -1.542995766044525 + -1.8816052863468895, + -1.7022432720760017, + -3.070048352699442 ], "(6, 6, 6, 6, 5)": [ - -1.2357288445570898, - -1.3985136460451153, + -1.7542987165780615, + -2.280993537023323, -1.7744463097538186 ], "(10, 6, 7, 5, 5)": [ -3.019094008051929, - -1.6841773386038428, + -2.776653797770519, -3.3075464968438797 ], "(10, 3, 1, 6, 5)": [ @@ -4616,22 +4616,22 @@ "(8, 6, 7, 3, 4)": [ -1.5060445279034225, -1.2622688887937061, - -1.007202309689785 + -0.9203629137377426 ], "(9, 4, 5, 4, 5)": [ - -0.5874632447683842, - -0.4468271184305189, + -0.7294471823279055, + -0.5433538749850368, -0.8633503925542896 ], "(9, 5, 3, 5, 5)": [ - -0.7980216401935658, - -0.7585427456881697, - -0.5869134127299083 + -2.576183269831688, + -0.2916247037352895, + -0.7784072911450814 ], "(9, 5, 5, 5, 5)": [ - -0.7295716777148284, - -0.6558146527321604, - -0.8082109882496318 + -1.1922812038692956, + -1.5251143653302495, + -3.2756985348274537 ], "(8, 7, 6, 5, 5)": [ -4.637552252563447, @@ -4659,14 +4659,14 @@ 0.0 ], "(9, 3, 6, 3, 4)": [ - -1.4756137556851345, - -1.2329974542329465, - -1.5765603099201726 + -2.440744484214011, + -1.7255175916094916, + -1.638597099646821 ], "(10, 4, 5, 4, 5)": [ -2.3403948951105935, -1.9352636819793425, - -1.5994419349710167 + -1.9309751175110215 ], "(10, 6, 5, 4, 5)": [ 0.0, @@ -4679,9 +4679,9 @@ 0.0 ], "(8, 6, 6, 6, 5)": [ - -1.3903275527461258, - -1.2594460332419608, - -1.5193339631926344 + -2.0319091959813433, + -2.6889943953442774, + -3.321099568834717 ], "(10, 3, 9, 6, 5)": [ -2.771582023229827, @@ -4689,9 +4689,9 @@ -2.763254131287188 ], "(7, 3, 0, 3, 5)": [ - -2.20696950511384, + -4.916991306086713, -2.850622759754418, - -2.797662416613689 + -4.886581335572043 ], "(7, 3, -1, 6, 5)": [ 0.0, @@ -4711,46 +4711,46 @@ "(6, 6, 5, 3, 4)": [ -1.1353240276985515, -0.8213842242252406, - -0.7306186906429019 + -0.9057745976242072 ], "(7, 3, 1, 3, 4)": [ - -1.9129022172934569, + -4.08193934540612, -2.1896829338568393, - -1.6045456057386098 + -2.3555952925670063 ], "(8, 5, 1, 6, 5)": [ -0.7886566664752668, -0.7433374525346819, - -0.5433954983035555 + -0.48972961190973985 ], "(7, 3, 4, 6, 5)": [ - -0.5565746284584614, - -0.9103560864639236, - -1.2440394049008856 + -1.4939420316969139, + -2.085156997091517, + -2.4984666680115826 ], "(6, 4, 9, 6, 5)": [ - -1.3207301345833495, - -1.7269188096394368, - -1.8943496585770416 + -4.514113485530271, + -5.610523866987463, + -7.098691296558635 ], "(6, 5, 9, 4, 4)": [ - -1.027833448957911, + -0.7980180012556622, -1.464212851799792, -2.577429940397024 ], "(7, 4, 9, 4, 4)": [ -1.2899203810312752, - -1.0677425169278325, + -0.9841626318658062, -1.8154052726502679 ], "(8, 4, 9, 4, 4)": [ -1.2044276797305735, - -1.0950252318174074, + -0.6289677557451465, -1.4026297340485976 ], "(7, 5, 9, 4, 4)": [ - -1.4135453698184635, - -1.6191634096682372, + -0.8991285945163956, + -1.3653294267807632, -1.427476793998086 ], "(7, 5, 9, 4, 5)": [ @@ -4759,19 +4759,19 @@ 0.0 ], "(8, 5, 8, 4, 4)": [ - -0.699846629380974, + -0.42003006465656584, -0.7939281498472713, -0.8428915179900826 ], "(6, 4, 8, 3, 4)": [ - -0.49922744210358305, + -0.42263399968155874, -1.2193834527298073, -1.0475828002125747 ], "(8, 4, 7, 2, 4)": [ -0.6260065995154623, -0.5906772558856108, - -0.4430463428099204 + -0.4805843763230956 ], "(8, 5, 4, 2, 4)": [ -1.8283039300860613, @@ -4779,9 +4779,9 @@ -1.067109134922289 ], "(6, 5, 1, 2, 4)": [ - -1.458860862823914, - -1.4216767275440276, - -1.124323853179836 + -4.599690693867195, + -4.077937440358136, + -5.425458023069426 ], "(8, 4, 0, 1, 4)": [ -2.0719178359539354, @@ -4794,9 +4794,9 @@ 0.0 ], "(6, 6, 9, 6, 5)": [ - -2.382357134088868, - -2.2966790816485694, - -2.1150046074486992 + -4.4136846622322246, + -4.594578095077331, + -4.445003837861357 ], "(10, 4, -1, 5, 4)": [ 0.0, @@ -4804,12 +4804,12 @@ 0.0 ], "(7, 4, 9, 6, 5)": [ - -1.3182002778758009, - -1.8964406845026796, - -1.6525971751383728 + -3.1583440528917563, + -3.9401080753011124, + -4.266158462739829 ], "(8, 7, 5, 4, 4)": [ - -2.4060007291384933, + -3.048360088573865, -3.582226601504822, -2.7020443493638076 ], @@ -4841,7 +4841,7 @@ "(9, 3, 4, 2, 4)": [ -1.9711925137875546, -1.7926364902442316, - -1.531063711688576 + -2.1478389563615754 ], "(6, 3, -1, 2, 4)": [ 0.0, @@ -4849,7 +4849,7 @@ 0.0 ], "(6, 3, 8, 5, 4)": [ - -1.0862700975170094, + -0.8548417882324675, -1.2769216186566985, -1.3870037675422537 ], @@ -4884,54 +4884,54 @@ 0.0 ], "(7, 6, 7, 4, 4)": [ - -1.0701580886626147, - -1.0180508867264886, - -1.0327646365702303 + -1.1013601785434304, + -0.8292361752777216, + -1.371582473252285 ], "(6, 3, 5, 4, 4)": [ - -0.8515199917085184, - -0.6896024593415202, - -0.7699671226035716 + -3.4793253111496, + -1.3845314516481262, + -0.9814851688123837 ], "(9, 4, 4, 3, 4)": [ - -1.1474471610189, - -0.8894310018020599, - -0.6879218340376263 + -3.5034762492724782, + -2.725562009830182, + -1.8883956831613964 ], "(7, 5, 3, 5, 5)": [ - -0.504785244719094, - -0.4147463599193877, - -0.2532724424974939 + -2.111879099005913, + -0.2002403751770545, + -0.6300287128601043 ], "(8, 5, 4, 5, 5)": [ - -0.4244098749783271, - -0.4812219311146665, - -0.34859608954919014 + -1.6193728179424782, + -0.46521721990719583, + -0.9127620427451568 ], "(8, 4, 5, 5, 5)": [ - -0.24107392157267238, - -0.39747949906740637, - -0.5202151701093007 + -0.47182855005200613, + -1.4551807364681313, + -2.604858164956106 ], "(8, 4, 6, 5, 5)": [ - -0.33178643889635706, - -0.5746362718078547, - -0.7104221601104844 + -0.2966814474436582, + -2.189252144513418, + -5.504857183039991 ], "(8, 5, 8, 6, 5)": [ - -0.9860706604451939, - -1.0810014289540921, - -1.3719539702712862 + -5.13761260812767, + -6.096998949686395, + -5.19124534419843 ], "(7, 5, 8, 5, 5)": [ - -0.8869513844000685, + -0.744568748398918, -0.9800152701272213, -1.1176436588867644 ], "(7, 4, 9, 7, 5)": [ - -1.54650000722556, - -1.7762122338288164, - -1.6374237899059352 + -9.063387534066997, + -9.14795563341487, + -8.600635899780928 ], "(8, 5, -1, 7, 5)": [ 0.0, @@ -4946,42 +4946,42 @@ "(10, 6, 2, 6, 5)": [ -1.8044480945052639, -1.621121240737707, - -1.5416028179307086 + -2.4611554478842517 ], "(8, 3, 4, 6, 5)": [ - -1.0767164918576477, + -1.2209872530989243, -1.178165832041652, -1.3317288573689938 ], "(8, 3, 6, 5, 4)": [ - -0.728107258168293, - -1.0153485639052564, - -1.041188833346126 + -1.1468771752961588, + -0.7858770773151172, + -1.6999229503824906 ], "(6, 3, 7, 5, 4)": [ - -0.8279601944202133, + -0.6928179633207334, -0.9764253860362813, -1.2141528632869683 ], "(9, 5, 5, 4, 4)": [ - -0.8144824169533458, - -0.7316424430368169, - -0.6464741588784136 + -4.12036670028926, + -1.658794258476289, + -0.5949304215005085 ], "(7, 6, 5, 4, 4)": [ - -0.969606277345308, - -0.8256802601986017, - -0.766758359217845 + -3.6512038012109405, + -1.3562638882276086, + -0.9403296272764741 ], "(6, 3, 2, 3, 4)": [ - -1.6691004745133255, - -1.4429052953341224, - -1.1208320400934735 + -3.407940369717579, + -3.2500395035586847, + -3.147262713029108 ], "(9, 3, 4, 3, 4)": [ - -1.7339919363179481, - -1.4857749623011622, - -1.5078272144200566 + -2.9300351451722513, + -2.8951732648392587, + -2.5348760296173207 ], "(7, 3, 2, 5, 4)": [ -2.3272290963417923, @@ -4999,12 +4999,12 @@ -2.0129902124304 ], "(10, 6, 6, 4, 4)": [ - -1.453584646975229, + -1.5072275615434072, -2.8863566358731543, -2.1347077269835237 ], "(10, 6, 1, 4, 5)": [ - -2.4928565675209615, + -3.4953970118864865, -3.9062037459271544, -4.9750888418186365 ], @@ -5029,9 +5029,9 @@ 0.0 ], "(6, 6, 4, 6, 5)": [ - -0.8178266994068001, - -1.108098247454023, - -1.391902661471642 + -1.5187673987784653, + -2.101740009018891, + -2.5669400410195227 ], "(9, 3, 8, 2, 4)": [ -1.315246800043244, @@ -5041,82 +5041,82 @@ "(6, 3, 0, 6, 5)": [ -4.4902842446765465, -1.9329422824073903, - -1.4559603731215596 + -1.141414976208336 ], "(9, 4, 3, 4, 4)": [ - -0.886429865668544, - -0.9841491374222687, - -0.6533796638793795 + -5.541672797307325, + -2.685639315301305, + -0.5345794928568391 ], "(8, 4, 1, 3, 4)": [ - -1.3656609715549266, - -1.3240644607825625, - -0.9991239662907992 + -4.689411275893333, + -4.770874900976558, + -3.9620347814398986 ], "(7, 6, 1, 4, 5)": [ -1.7944752763873515, -1.8305562117195133, - -1.2646104058206449 + -1.0089812876503037 ], "(9, 4, 1, 4, 5)": [ - -1.4008199566044266, - -1.4244386768064785, - -1.0645873745485692 + -2.764756860962592, + -2.536849098946001, + -1.9113432366496899 ], "(7, 5, 4, 7, 5)": [ - -0.45104301943107095, + -1.6391587594854418, -1.429813588293057, -1.0628819428710758 ], "(8, 5, 5, 6, 5)": [ - -0.39233392824610586, - -0.6904694684641588, - -0.9163510761665291 + -1.9312181091632352, + -2.538029025794076, + -3.2820213842223485 ], "(9, 4, 6, 5, 4)": [ - -0.4458750498698816, - -0.7164387701381967, - -0.9058161102576536 + -0.83820730309884, + -0.6256600119563034, + -2.7174933595466317 ], "(8, 4, 7, 5, 4)": [ - -0.4161711986447142, - -0.5679717509820535, - -0.7132442149785135 + -0.2855524220192286, + -0.4980562081755034, + -2.514421780151014 ], "(8, 4, 7, 4, 4)": [ - -0.39828156623564137, - -0.515026323026724, - -0.7668223820546596 + -0.4531248189169357, + -0.4669666909663858, + -1.2087899952864665 ], "(6, 5, 8, 5, 5)": [ - -0.7846451651596534, - -1.0369364375261034, + -0.703550968110725, + -1.6287228156511286, -0.993416619518195 ], "(7, 4, 7, 4, 4)": [ - -0.43675277965036535, - -0.49473625847855723, + -0.3466671584873737, + -0.39188350646444753, -0.5362142551748781 ], "(7, 5, 3, 2, 4)": [ -2.297656482086306, -1.2450070383620337, - -0.666050584815743 + -1.4763473353570884 ], "(8, 5, 2, 3, 4)": [ - -1.0789922718103926, - -0.8018030953475128, - -0.6389409251630574 + -3.7530898748670043, + -5.060816543686599, + -2.871624037273409 ], "(8, 5, 0, 5, 5)": [ -1.4931942115088426, -1.2811120631460797, - -0.9663234842989812 + -0.5902146161570426 ], "(6, 4, 0, 5, 5)": [ -1.6050446144216166, -1.6505898631243867, - -1.1125322275831988 + -0.888529687836456 ], "(6, 5, 0, 4, 4)": [ -1.6760281625264277, @@ -5124,9 +5124,9 @@ -3.7872437703565236 ], "(8, 5, 0, 3, 4)": [ - -1.7238136156591453, - -1.6183409742664348, - -1.4126613276132607 + -9.746711150391025, + -7.466480774101576, + -6.430420307794578 ], "(6, 4, 0, 4, 4)": [ -2.2905126175310673, @@ -5134,14 +5134,14 @@ -2.011258321896658 ], "(8, 4, 0, 4, 4)": [ - -1.5492402928058149, + -2.9973527488041505, -1.8208716064863315, - -1.6258470697640341 + -3.164985063820195 ], "(7, 5, 0, 4, 5)": [ - -1.5447906058536156, - -1.6275515128209557, - -1.3367861561214647 + -4.683321211594319, + -3.0356995119833314, + -1.8400502278517694 ], "(8, 5, 0, 4, 4)": [ -1.7836509473615845, @@ -5179,19 +5179,19 @@ -0.5576349999936907 ], "(7, 3, 8, 5, 5)": [ - -1.0610367297045449, + -1.0267294622610756, -1.4245141945792645, -1.5964748781610765 ], "(8, 5, 9, 6, 5)": [ - -1.6620246026888488, - -1.7126291352250316, - -1.5914936661907906 + -6.50968031440351, + -7.686336506371806, + -7.504353777557036 ], "(8, 4, 9, 6, 5)": [ - -1.5337241804572737, - -1.777220622130126, - -1.6443000020914549 + -7.470951721913542, + -7.747857571262666, + -8.72927117048911 ], "(6, 5, -1, 6, 5)": [ 0.0, @@ -5199,9 +5199,9 @@ 0.0 ], "(9, 6, 4, 3, 4)": [ - -1.739073636447817, - -1.4473618398639223, - -1.4245339118654334 + -4.078311286681119, + -2.357401092842143, + -2.3942340188433007 ], "(7, 3, 4, 7, 5)": [ -2.093325240722852, @@ -5210,18 +5210,18 @@ ], "(9, 3, 7, 8, 5)": [ -4.5083544635270485, - -2.4835409784236684, + -5.856070586657998, -4.819885916251284 ], "(7, 3, 3, 5, 5)": [ - -1.0297962278958521, - -1.0330595450005688, - -0.7587312167956375 + -2.777867955810341, + -0.7697649364909417, + -1.2020185808590576 ], "(8, 3, 6, 6, 5)": [ - -1.2088414702773291, - -1.4590046152470446, - -1.7741354742887456 + -2.87223334174377, + -3.7740395455984315, + -4.740444411316715 ], "(10, 6, 8, 7, 5)": [ -4.227285219459558, @@ -5244,19 +5244,19 @@ -1.6379229681165022 ], "(6, 6, 5, 4, 5)": [ - -0.6167553792887842, - -3.029491103118324, + -1.118422747867699, + -2.5342834788692916, -3.2049321394766626 ], "(6, 3, 6, 5, 5)": [ - -0.6657024078465228, - -0.8815996520569285, - -1.0105055126949654 + -0.7813542677936288, + -1.5228997148220593, + -3.966844718832399 ], "(6, 3, 5, 3, 4)": [ - -1.410667022134514, - -1.0043574506473887, - -1.0743128706101133 + -2.811177032620455, + -2.1202020418361682, + -1.2607750757174783 ], "(10, 6, 9, 4, 4)": [ -3.6514205779856335, @@ -5265,22 +5265,22 @@ ], "(9, 3, 7, 2, 4)": [ -1.7516045158890066, - -1.455068760407258, + -1.4062966091999707, -1.5704798296440665 ], "(10, 5, 6, 2, 4)": [ - -1.633324279674627, + -3.6702021764944055, -2.1380428741346935, -2.1147711161342295 ], "(6, 3, 2, 4, 4)": [ - -1.2706218122951805, - -1.2412821724893521, - -0.9868912723358894 + -4.399263166780537, + -1.8834578089722025, + -0.7169681998103036 ], "(9, 6, 7, 2, 4)": [ -1.4507077873636909, - -1.4593163664903401, + -1.4626845176167664, -1.1842301409961549 ], "(6, 3, 0, 1, 4)": [ @@ -5294,9 +5294,9 @@ -1.7558765962977394 ], "(8, 3, 2, 2, 4)": [ - -1.8889350048212612, - -2.58853357807129, - -2.202763966673586 + -4.459927876877293, + -4.639784125575028, + -3.9814767273244516 ], "(10, 6, -1, 2, 4)": [ 0.0, @@ -5309,14 +5309,14 @@ 0.0 ], "(6, 6, 4, 5, 4)": [ - -0.6888232015130332, - -0.6277736117804399, - -0.6610766098376423 + -1.3549392052978275, + -0.7994213543226191, + -1.225688417032065 ], "(7, 6, 1, 2, 4)": [ - -2.2002903094502795, - -1.9657647917409535, - -1.688622749505286 + -8.80049001940839, + -4.889463898754521, + -5.283729672299927 ], "(9, 5, -1, 4, 5)": [ 0.0, @@ -5334,9 +5334,9 @@ 0.0 ], "(8, 3, 4, 4, 5)": [ - -1.2118135903773781, - -0.7535791562234494, - -1.1460900682240116 + -2.154606268139351, + -1.5595997459432986, + -1.3249712228291646 ], "(10, 5, 0, 1, 4)": [ -3.7744143060762543, @@ -5344,8 +5344,8 @@ -5.033438669498237 ], "(7, 3, 8, 3, 4)": [ - -0.9050275075494602, - -1.3936002808753012, + -0.8289778678278629, + -1.2751930922698123, -1.404119944027584 ], "(8, 6, 6, 4, 5)": [ @@ -5384,9 +5384,9 @@ -2.4095371365324487 ], "(6, 3, 4, 5, 5)": [ - -0.8061842743161842, - -0.7260467139812204, - -0.8393462788240602 + -2.3335440961369938, + -1.0161158318522896, + -1.1281911681298675 ], "(6, 3, 8, 2, 4)": [ -0.9889926822538312, @@ -5395,23 +5395,23 @@ ], "(10, 4, 6, 2, 4)": [ -2.0054582845402527, - -1.5200873016180914, + -3.304428917711739, -1.14453930358475 ], "(6, 6, 5, 5, 5)": [ - -0.909645985259155, - -0.6776841325786455, - -0.907326458791034 + -1.3880873179140383, + -1.8227935907703467, + -3.7276442689881124 ], "(7, 4, 0, 4, 5)": [ - -1.6592892890857995, + -3.1133488108385725, -1.5665352552622402, - -1.2518842753880586 + -0.9329078935161331 ], "(7, 6, 7, 3, 4)": [ -1.4054700663932085, -1.113992015468544, - -0.7966145912777907 + -0.7645407308101378 ], "(10, 4, -1, 5, 5)": [ 0.0, @@ -5430,7 +5430,7 @@ ], "(7, 5, 1, 6, 5)": [ -0.8909685474179243, - -0.6640690211928276, + -0.5086391929900057, -0.774209163986184 ], "(8, 3, 3, 7, 5)": [ @@ -5439,14 +5439,14 @@ -1.1311328999292216 ], "(9, 4, 6, 7, 5)": [ - -0.9599665953570179, - -1.7532753075587753, + -1.8563280025892275, + -4.144493078700934, -2.0132712461491846 ], "(6, 6, 7, 5, 4)": [ - -0.932747313371144, - -1.0898685122347036, - -1.0565142932677771 + -0.9677323075090759, + -1.1119039107822306, + -1.4664748562947274 ], "(8, 4, 2, 5, 4)": [ -1.0186268367905413, @@ -5455,93 +5455,93 @@ ], "(7, 4, 3, 5, 4)": [ -0.8354263052788269, - -0.45971432504736875, + -0.4821284725093205, -0.5727928542244103 ], "(8, 5, 4, 4, 4)": [ - -0.6721236571737651, - -0.5121106002312895, - -0.28258192031011864 + -4.930468850797985, + -1.6565592114302519, + -0.3077966902397186 ], "(7, 5, 3, 4, 4)": [ - -0.6312628728505876, - -0.5091574354958875, - -0.3865131220015342 + -3.02443408134556, + -1.9046030554884548, + -0.21844073525262436 ], "(7, 4, 1, 5, 5)": [ -0.9490742910390368, -0.8867521745193763, - -0.6039981615111287 + -0.4664889280004908 ], "(8, 4, 1, 5, 5)": [ - -0.9180902774549096, + -1.6151549129266318, -0.892412019856541, - -0.717647967833513 + -0.39769387207128004 ], "(8, 5, 3, 6, 5)": [ - -0.48885574129190623, - -0.4827301285446677, + -0.4125370110255056, + -0.6399341141592944, -0.6683736200803153 ], "(9, 5, 5, 6, 5)": [ - -0.5749869465918784, - -0.842190132958493, - -1.1960529109145988 + -2.2848145898361842, + -2.7002622282802418, + -2.3913437804926687 ], "(8, 4, 7, 7, 5)": [ - -0.8231737403638038, - -1.1307697285390208, - -1.2218361531559498 + -5.314783663213998, + -4.975450716465078, + -6.517123573072855 ], "(7, 4, 8, 6, 5)": [ - -0.7957914383705584, - -1.0745022927831929, - -1.2525841698438047 + -3.7366675103451166, + -4.492510909809241, + -5.169748838976846 ], "(8, 4, 8, 4, 4)": [ - -0.5642189495021458, - -0.7860384641400058, + -0.3702867641116391, + -0.7092413935749257, -0.959301181622219 ], "(6, 4, 8, 4, 4)": [ - -0.614904790720737, + -0.43286108921057814, -0.6867882239452927, -0.8374038927444036 ], "(6, 5, 8, 4, 4)": [ - -0.6139286607232386, + -0.5282657546136933, -0.6753941852725476, - -0.7736897813225626 + -1.3814504830169003 ], "(6, 5, 7, 4, 4)": [ - -0.444601972729486, - -0.545589267506078, + -0.40841016698548505, + -0.4799527249023664, -0.5897264679671524 ], "(8, 5, 7, 4, 4)": [ - -0.4610004673429647, - -0.5081270107764987, - -0.5693570878467258 + -0.4755576788069825, + -0.35768073778687653, + -0.5386349714534933 ], "(8, 4, 4, 2, 4)": [ -1.039211160720304, - -0.9698702321030139, - -0.6957129699295741 + -3.3125467316924366, + -1.4453994056319217 ], "(7, 4, 2, 2, 4)": [ - -1.0413395652323585, - -2.1799728511393446, - -1.857040671293484 + -3.5338729052411257, + -4.2571757926287175, + -2.872764224066887 ], "(8, 4, 1, 2, 4)": [ - -1.5345334577017493, - -1.5458303803247244, - -1.3750984613454884 + -8.406731488627074, + -7.925658134533682, + -5.55305580955268 ], "(6, 5, 0, 2, 4)": [ - -1.5906861356519686, - -1.48833833658719, - -1.5969276215343409 + -7.8216079020057485, + -6.039556816430026, + -5.013867487278287 ], "(8, 4, 0, 3, 5)": [ -2.1122732736306418, @@ -5555,7 +5555,7 @@ ], "(8, 3, 2, 6, 5)": [ -1.1827339634913576, - -0.9281630376730662, + -0.8574900171174515, -1.5277127076988861 ], "(10, 4, 5, 7, 5)": [ @@ -5564,19 +5564,19 @@ -2.209128633321452 ], "(8, 4, 5, 4, 5)": [ - -0.3900485308333124, - -0.42626733427586255, - -0.4387447052536916 + -0.547059055481111, + -0.18217364841489936, + -1.2188345933322817 ], "(7, 5, 2, 4, 5)": [ -0.9328965285166807, -0.7986300962343358, - -0.5193996087282658 + -0.37842961347066717 ], "(6, 4, 1, 4, 4)": [ -1.2530620270943233, -1.1781247421520546, - -0.9070717402986281 + -0.5704378480062826 ], "(7, 4, 0, 4, 4)": [ -2.145004319710634, @@ -5605,7 +5605,7 @@ ], "(8, 7, 8, 5, 5)": [ -3.1638684296818447, - -3.0393073841969587, + -3.5992408605671407, -4.989384454466157 ], "(8, 7, 9, 6, 5)": [ @@ -5616,7 +5616,7 @@ "(7, 3, 9, 5, 5)": [ -2.6223925633587983, -2.7422619916354405, - -2.2596070588285913 + -4.335805292384901 ], "(6, 3, 8, 4, 5)": [ -1.254922290067979, @@ -5639,9 +5639,9 @@ -0.922546654827749 ], "(7, 3, 5, 4, 4)": [ - -0.9655543181730533, - -0.6852339679586998, - -1.0911454906057996 + -3.0027878086633466, + -1.6303254187219065, + -1.043010352310109 ], "(8, 4, -1, 7, 5)": [ 0.0, @@ -5650,13 +5650,13 @@ ], "(10, 4, 4, 2, 4)": [ -2.3310099718781006, - -1.891256428718345, - -1.683487053320208 + -3.0203454469721613, + -2.5511247622322286 ], "(10, 3, 1, 2, 4)": [ -2.7444250235651237, -3.963689922797043, - -2.1181516539718164 + -3.245414305970294 ], "(9, 3, -1, 5, 5)": [ 0.0, @@ -5674,7 +5674,7 @@ -2.489353847697682 ], "(10, 3, 7, 5, 4)": [ - -1.2381147085445865, + -1.2036276990640007, -1.8488384334019015, -2.110620447549417 ], @@ -5694,14 +5694,14 @@ -1.9309338672956904 ], "(6, 3, 6, 5, 4)": [ - -0.8105005566961223, - -0.6644233247398458, - -0.9641216068439077 + -0.8328879595958648, + -1.0805803600005979, + -2.1164244662911247 ], "(9, 5, 6, 4, 4)": [ - -0.8297822370229312, - -0.7717627481958684, - -0.8266920313992332 + -0.9088587704924744, + -0.6397385189060334, + -1.380946184639156 ], "(7, 2, 8, 3, 4)": [ 0.0, @@ -5715,7 +5715,7 @@ ], "(7, 3, 1, 5, 5)": [ -1.4231415755583476, - -1.298027973880168, + -1.0137419340740246, -1.4464938310230666 ], "(8, 3, 1, 5, 4)": [ @@ -5724,19 +5724,19 @@ -2.663745233885946 ], "(9, 4, 4, 6, 5)": [ - -0.5532889776910634, - -0.6593918674143768, - -1.0295684871883637 + -1.185059788872821, + -2.5670311357093922, + -3.1129687961230914 ], "(6, 3, 6, 6, 5)": [ - -0.8306687493137218, - -1.3355409766914432, - -1.8410017825895846 + -2.2522928647886977, + -2.2520905998597893, + -3.8516742068375587 ], "(6, 4, 9, 7, 5)": [ - -1.7341255134332132, - -1.5933925579997639, - -1.7210900128559667 + -6.078297171198451, + -6.6053492109003535, + -7.780623622624877 ], "(8, 6, 7, 4, 5)": [ 0.0, @@ -5745,18 +5745,18 @@ ], "(7, 4, 5, 3, 4)": [ -0.761413231576814, - -0.4453068639070241, - -0.3768154581557453 + -0.9492148405577823, + -0.5310280459581616 ], "(6, 5, 2, 4, 5)": [ -1.1088902741987154, -0.619000407233111, - -0.41663710340685084 + -0.36677596587483596 ], "(7, 4, 0, 2, 4)": [ - -1.6413496783411028, - -1.7041970851929513, - -1.6609724749445387 + -12.08451173658076, + -11.2145987363425, + -11.171365571923458 ], "(8, 5, -1, 3, 5)": [ 0.0, @@ -5766,7 +5766,7 @@ "(6, 6, 4, 3, 4)": [ -1.313998483401167, -1.280332505231936, - -0.7434731857979135 + -1.4514125234953288 ], "(6, 3, 2, 2, 4)": [ -2.1812295712004945, @@ -5776,7 +5776,7 @@ "(10, 6, 7, 6, 5)": [ -2.6242997419026386, -3.0799150253950307, - -2.4770371167172027 + -4.475703098418804 ], "(10, 3, 9, 2, 4)": [ 0.0, @@ -5799,24 +5799,24 @@ -2.444010294740441 ], "(7, 6, 8, 4, 4)": [ - -1.3579310192906051, + -1.2241992400880497, -1.4327024688087606, - -1.3555115818477428 + -2.2589254097484397 ], "(6, 3, 6, 4, 4)": [ - -0.7170418178548607, - -0.8312467955356829, - -0.9747711572286437 + -1.3616021105820986, + -0.9212099491584461, + -1.2959986766678302 ], "(7, 6, 5, 5, 5)": [ - -0.897626335985448, - -0.6921141245676825, - -0.9120502060080183 + -0.9844960350688059, + -1.7499388740984727, + -3.5737261712917374 ], "(9, 4, 6, 2, 4)": [ -0.9617915814508896, -1.0020235508190747, - -0.5184697088485373 + -0.534217983718305 ], "(9, 5, 0, 1, 4)": [ -3.3790850225864384, @@ -5824,14 +5824,14 @@ -3.1195041816809934 ], "(9, 4, 5, 5, 4)": [ - -0.44880909703756433, - -0.6552638644986379, - -0.6971902660605612 + -1.171586380171178, + -0.43371094166218216, + -2.0275538404596785 ], "(7, 6, 6, 5, 5)": [ - -0.8559451295201111, - -1.113582996550139, - -1.0042416436509742 + -0.902483967841953, + -1.7452333197617875, + -3.45815794801949 ], "(9, 7, 6, 7, 5)": [ 0.0, @@ -5859,24 +5859,24 @@ 0.0 ], "(7, 6, 2, 3, 4)": [ - -1.7019515211933427, - -1.3142239783173881, - -0.9379037637518968 + -3.51820111789581, + -4.162994154756631, + -2.654445511162349 ], "(9, 4, 5, 6, 5)": [ - -0.6217288321660187, - -0.9388445532477545, - -1.02631125872378 + -2.1690201627740278, + -2.8641105329467016, + -5.791427902045155 ], "(6, 4, 0, 3, 4)": [ - -1.877265613165054, - -1.720883644665042, - -1.4398271753416398 + -5.146664728642337, + -3.56706224167561, + -4.492750883316136 ], "(10, 6, 3, 4, 4)": [ -3.703420661874362, -2.539659523852925, - -1.3421468555403973 + -1.3403111275095683 ], "(6, 2, 1, 3, 4)": [ -5.140204355881418, @@ -5889,12 +5889,12 @@ -3.473345068082128 ], "(10, 5, 2, 7, 5)": [ - -1.3684641509858524, + -1.5496829291312844, -1.456803306153484, -1.6245634710335928 ], "(7, 3, 5, 6, 5)": [ - -0.6795203699930162, + -1.4284401671907694, -1.2613840986863942, -1.393473614739797 ], @@ -5934,29 +5934,29 @@ -1.54618920976066 ], "(8, 5, 2, 5, 5)": [ - -0.6896177050258593, - -0.566031763691572, - -0.4521616498151489 + -2.9130498862398984, + -0.18706863737726337, + -0.421418748067159 ], "(8, 4, 4, 5, 5)": [ - -0.48036129416890233, - -0.43148062620535005, - -0.471812555567267 + -1.546589960573464, + -0.30010646357898485, + -0.8785643303622657 ], "(8, 4, 5, 6, 5)": [ - -0.3514470172912859, - -0.539850831843255, - -0.8526587341096925 + -1.7024848946387785, + -2.8167969891678384, + -2.1440326913153305 ], "(8, 5, 7, 5, 4)": [ - -0.4143365585035338, - -0.5885963983580641, - -0.6786548428095325 + -0.34362897012487115, + -0.6204898388268996, + -1.4862612449510435 ], "(8, 5, 8, 5, 4)": [ - -0.6450481375947402, - -1.1654237319702123, - -1.178223501775398 + -1.049829228346915, + -2.219899462888101, + -4.032344145139421 ], "(10, 3, 6, 7, 5)": [ 0.0, @@ -5979,19 +5979,19 @@ 0.0 ], "(8, 4, 8, 5, 5)": [ - -0.7422111516563957, - -0.9243362450118668, + -0.42425253485254755, + -1.9928173559250908, -1.1031434364226658 ], "(9, 6, 1, 7, 5)": [ -2.360053766588402, - -2.220807271163463, - -1.3425101719701917 + -2.0234710544984353, + -1.3240385545131295 ], "(10, 4, 3, 7, 5)": [ -1.8476274746093708, -1.6737502849382333, - -1.6396447304155313 + -3.4555963495427955 ], "(9, 3, 8, 8, 5)": [ -2.6164608530089812, @@ -6004,12 +6004,12 @@ -5.205116276988796 ], "(7, 6, 4, 5, 4)": [ - -0.9086449184252291, - -0.7624428147021953, - -0.618536555877846 + -1.2707615984435279, + -0.6837711057702484, + -1.1701481357508432 ], "(7, 2, 5, 5, 4)": [ - -2.0312063237502462, + -1.9446361735042585, -3.418362063306476, -4.539093479826011 ], @@ -6020,13 +6020,13 @@ ], "(8, 3, 5, 4, 5)": [ -1.3244342190514957, - -1.0464561859593575, + -1.2327715133467627, -1.88123286731181 ], "(8, 6, 3, 6, 5)": [ -1.5918926447039, - -1.0997363818422867, - -1.253224387397429 + -1.4547304372667194, + -2.2125655444511305 ], "(8, 6, -1, 4, 4)": [ 0.0, @@ -6035,13 +6035,13 @@ ], "(10, 4, 3, 5, 4)": [ -1.675661603159284, - -1.3072420711565473, + -1.287814232296761, -1.762649788336793 ], "(6, 3, 7, 5, 5)": [ - -0.8536121824910065, + -0.7356762083194938, -1.0966563377507392, - -1.217441227447951 + -3.4945121664977745 ], "(7, 7, 9, 7, 5)": [ 0.0, @@ -6054,7 +6054,7 @@ 0.0 ], "(6, 3, 4, 7, 5)": [ - -0.8634045254978322, + -1.6902373877322487, -2.435384567934566, -1.8005088496705461 ], @@ -6064,24 +6064,24 @@ -0.9687698015052869 ], "(8, 4, 2, 5, 5)": [ - -0.632358129131279, - -0.501670908532482, - -0.5641745670928351 + -3.0064426331565963, + -0.20491947730378313, + -0.4362390849049754 ], "(8, 5, 3, 5, 4)": [ -1.123423330620746, - -0.5917112442630788, + -0.5216649348129239, -0.8859069009858954 ], "(8, 6, 3, 5, 4)": [ -2.166497981231683, -1.910059406783023, - -1.0473029385030104 + -1.0837738925311493 ], "(7, 4, 7, 6, 5)": [ - -0.5397267848778868, - -0.8525408659872445, - -1.0860615880945372 + -3.0085528881491053, + -3.717951847841876, + -4.194827509311433 ], "(6, 6, -1, 6, 4)": [ 0.0, @@ -6119,9 +6119,9 @@ 0.0 ], "(6, 6, 5, 4, 4)": [ - -0.8360613191150345, - -0.81769383987189, - -0.6668781265690609 + -4.052384295623588, + -1.4794887166478672, + -0.8768874744882441 ], "(9, 5, -1, 3, 5)": [ 0.0, @@ -6129,8 +6129,8 @@ 0.0 ], "(6, 3, 4, 6, 5)": [ - -0.6743879402213369, - -0.8229832289426326, + -1.0301419756560457, + -1.3620827695936144, -1.2048919783807184 ], "(7, 6, -1, 5, 4)": [ @@ -6169,28 +6169,28 @@ -4.315070677364634 ], "(10, 5, 6, 7, 5)": [ - -1.4345784838196085, - -2.219536799225218, + -2.3794113802120807, + -3.948744655527342, -2.847625538978597 ], "(8, 4, 3, 4, 4)": [ - -0.6606707782692696, - -0.6627422575335562, - -0.5660585772509327 + -5.316776823280621, + -2.2258996734515635, + -0.271030815602162 ], "(8, 5, 2, 4, 4)": [ - -0.8139492708571365, - -0.6900540487635323, - -0.5533911396986005 + -5.6422820318033615, + -2.0700483973750385, + -0.21232920467999755 ], "(7, 4, 1, 3, 4)": [ - -1.3547073569538064, - -1.450056253047823, - -1.1063544757003776 + -2.9485861095407753, + -2.5339596116894443, + -2.2398639868848704 ], "(6, 5, 0, 5, 5)": [ -1.9781893745107637, - -1.1410911271548052, + -0.9053607244263709, -1.359962658177934 ], "(7, 5, -1, 4, 5)": [ @@ -6199,8 +6199,8 @@ 0.0 ], "(6, 6, 7, 5, 5)": [ - -1.001632912672253, - -1.2882337860229731, + -0.7407992877790273, + -1.666271667231954, -1.3574345273810469 ], "(7, 2, 8, 6, 5)": [ @@ -6221,7 +6221,7 @@ "(9, 5, 4, 2, 4)": [ -1.4279996608130974, -1.3152141350140902, - -0.9205221719550284 + -1.721424910152401 ], "(8, 3, 8, 2, 4)": [ -1.2389087910584324, @@ -6234,19 +6234,19 @@ -3.2915297915405324 ], "(10, 6, 5, 4, 4)": [ - -1.5042536111152305, - -2.1499837036429046, + -2.862133299745385, + -2.044748952365467, -2.4167151269558333 ], "(8, 3, 3, 6, 5)": [ -1.9126911519750271, - -0.8794767352094581, + -0.8886713901880016, -1.7291441609096523 ], "(10, 6, 4, 5, 4)": [ -2.9936515729668494, - -2.8117313905117145, - -1.7020278256507502 + -2.459579347349148, + -1.7534192453475925 ], "(7, 2, 0, 2, 4)": [ -4.128508347841851, @@ -6255,28 +6255,28 @@ ], "(6, 6, 3, 6, 5)": [ -1.216851329522577, - -0.6952739038967234, + -1.2435748674266505, -1.2680875282949184 ], "(7, 3, 7, 7, 5)": [ -2.0694192875635666, - -1.48156613553373, + -3.668160894505138, -2.2426058275706016 ], "(7, 6, 9, 6, 4)": [ - -3.1418342771131145, + -4.385897366254592, -3.5892544236234407, - -2.025492702849257 + -4.570699326631123 ], "(6, 6, 6, 4, 4)": [ - -0.8692962861472917, - -0.7980190973917428, - -0.7528362455704517 + -1.396527251230266, + -0.8819869946581829, + -1.18302654820947 ], "(8, 3, 4, 3, 4)": [ -1.4765905507985622, - -1.457061523344776, - -1.129367116289134 + -2.996191481857415, + -1.4798619873256 ], "(6, 2, 2, 5, 5)": [ -4.196634969616097, @@ -6284,9 +6284,9 @@ -2.996754562408449 ], "(6, 3, 3, 3, 4)": [ - -3.571616328616198, - -1.724605129620957, - -1.5744386704011555 + -4.607701232895646, + -2.5847666590139156, + -1.8007222488572547 ], "(7, 6, -1, 4, 5)": [ 0.0, @@ -6300,7 +6300,7 @@ ], "(7, 3, 7, 4, 4)": [ -1.0254401218589864, - -0.9631720844685598, + -0.8486899181543885, -1.1854695081027464 ], "(7, 2, 9, 7, 5)": [ @@ -6310,8 +6310,8 @@ ], "(7, 6, 3, 6, 5)": [ -1.5211010474098685, - -1.143083101036132, - -1.100453259121509 + -1.6025317858569925, + -1.9741962061639788 ], "(10, 6, 5, 2, 4)": [ -3.948006967263145, @@ -6331,12 +6331,12 @@ "(9, 5, 6, 2, 4)": [ -1.2007549661202832, -1.0010766427112754, - -0.6338834008014996 + -0.6408045953158409 ], "(7, 3, 3, 3, 4)": [ - -1.7126236851804322, + -2.95750856220853, -2.603632471670023, - -1.3445553886731563 + -1.8505543826930069 ], "(10, 4, 2, 4, 5)": [ -1.9698320983008317, @@ -6345,26 +6345,26 @@ ], "(9, 3, 2, 7, 5)": [ -1.9943407242108677, - -1.3252656491209338, + -1.37854076428893, -1.6499189789468969 ], "(10, 3, 6, 4, 4)": [ - -1.2840043477438003, + -1.39580450582627, -2.360636336973037, -1.986458459387412 ], "(9, 3, 4, 4, 5)": [ -1.77013305861645, - -1.3054993854736117, + -1.282713567833341, -1.641310767660177 ], "(10, 5, 4, 4, 5)": [ -2.331113781340328, - -1.0739775076730285, + -1.5125376316572672, -1.9893772142274853 ], "(9, 6, 3, 4, 5)": [ - -1.4328351009215756, + -2.415766256322518, -2.8127413678332767, -2.903530512618394 ], @@ -6389,29 +6389,29 @@ 0.0 ], "(6, 3, 3, 6, 5)": [ - -0.6814826734612912, + -0.6770554915318401, -1.9064014642928921, -1.658176665118171 ], "(9, 5, 3, 3, 4)": [ - -1.230619031444196, - -1.0492214399212403, - -0.7979653948957849 + -4.08761630412152, + -3.2009553519200016, + -2.5599013443291665 ], "(8, 3, 4, 2, 4)": [ - -1.1451110994593594, + -3.1233242684217304, -1.6893163349219156, -1.9859706515831586 ], "(6, 6, 2, 4, 5)": [ -1.7111875659174944, - -0.9779802603539047, - -1.4412559616246488 + -1.783895637893441, + -1.130370431413035 ], "(10, 6, 9, 3, 4)": [ -2.7860147679468317, -4.075164417715054, - -4.8235530073982975 + -4.253231557302674 ], "(6, 7, 8, 2, 4)": [ 0.0, @@ -6419,7 +6419,7 @@ -3.83467226003115 ], "(7, 3, 6, 3, 4)": [ - -1.508560287286318, + -2.440852506052527, -0.7565877170609046, -1.0820131323313467 ], @@ -6431,12 +6431,12 @@ "(8, 6, 4, 4, 5)": [ -1.3159242794775452, -1.4643069621448361, - -0.6834459620052973 + -1.2109703555958666 ], "(8, 3, 6, 3, 4)": [ - -0.9213351998985269, - -1.4811984120536623, - -1.3231132636179883 + -2.0505723005877785, + -1.3844318926925288, + -1.269489234332475 ], "(8, 6, -1, 4, 5)": [ 0.0, @@ -6485,7 +6485,7 @@ ], "(8, 6, 1, 7, 5)": [ -1.79967855060245, - -1.182974558780482, + -1.099181784238297, -1.4413298832651373 ], "(7, 3, 6, 7, 5)": [ @@ -6499,9 +6499,9 @@ -1.6500597987727674 ], "(7, 3, 4, 3, 4)": [ - -1.5271568419022383, - -1.4387850572889962, - -1.1404406702089405 + -3.050488648618875, + -2.209776494911118, + -1.5541716976819828 ], "(7, 6, 8, 6, 4)": [ -4.559921262016509, @@ -6515,13 +6515,13 @@ ], "(6, 3, 0, 3, 5)": [ -4.693205798667159, - -2.3263011779675447, + -5.013444674629943, -3.342566249634832 ], "(6, 6, 5, 5, 4)": [ - -0.8721179905640857, - -0.6488272064384721, - -0.8455233563610707 + -1.5820429821383992, + -0.6896632044699733, + -1.8546209905401154 ], "(9, 4, 1, 5, 4)": [ -1.9532997203048819, @@ -6530,13 +6530,13 @@ ], "(8, 4, 3, 2, 4)": [ -1.1307864088903536, - -0.9996224995151566, - -1.1157228276276978 + -2.4418113465471225, + -1.9881116948212951 ], "(7, 5, 0, 2, 4)": [ - -1.7311272872172931, - -1.6985450372719757, - -1.571116217813544 + -5.419320151060044, + -4.214269130545722, + -4.494958839439441 ], "(7, 4, -1, 4, 5)": [ 0.0, @@ -6549,24 +6549,24 @@ 0.0 ], "(6, 3, 4, 5, 4)": [ - -0.7881668798272974, - -0.9440694859168861, - -0.7425811894463705 + -1.283046163058264, + -0.704766211201567, + -1.2660066308626394 ], "(7, 6, 5, 5, 4)": [ - -1.1730039334132276, - -0.7043712619188999, - -1.1310532676502234 + -1.671994607007255, + -0.6522124782685874, + -1.9258505799934118 ], "(8, 3, 5, 7, 5)": [ - -1.1338033013880455, + -1.6679289582689494, -2.3767217505811455, -2.5627932673550724 ], "(9, 6, 3, 6, 5)": [ -1.3776784880560105, - -1.3081221532363738, - -1.4303826466361913 + -1.4027092026839425, + -2.456940412597273 ], "(8, 7, 0, 4, 4)": [ -5.8876585978127025, @@ -6575,18 +6575,18 @@ ], "(7, 5, 2, 6, 5)": [ -0.6261496222178444, - -0.5597408377028783, - -0.4655273437610883 + -0.4353756376132266, + -1.4013431790571511 ], "(8, 4, 5, 7, 5)": [ - -1.2257726093873083, - -1.6587228663547933, - -1.0728511432483216 + -2.7755163401089256, + -2.671171740642994, + -4.124558567238714 ], "(7, 5, 9, 5, 4)": [ - -1.2828438881551933, - -1.4597805125791654, - -1.5081237247057322 + -3.6198092418753736, + -3.9598854416509273, + -3.6941205589767265 ], "(8, 6, 0, 1, 4)": [ -3.588830590388253, @@ -6596,7 +6596,7 @@ "(7, 3, 0, 6, 5)": [ -2.74032125448475, -2.315871584657873, - -1.5661275041227856 + -1.4590937801054138 ], "(7, 7, 9, 6, 5)": [ -6.13520160159486, @@ -6639,9 +6639,9 @@ -4.54153766953793 ], "(9, 6, 0, 6, 5)": [ - -2.8227931910520616, + -2.6112096340390103, -1.9935079831069336, - -1.800763703439078 + -1.8237839339348585 ], "(8, 6, 0, 6, 5)": [ -3.6858049665320105, @@ -6651,7 +6651,7 @@ "(7, 3, 1, 6, 5)": [ -2.409736867192505, -2.0725951720833424, - -0.9476857424955312 + -0.99004949999896 ], "(6, 6, 5, 7, 5)": [ -1.5167649416849354, @@ -6701,7 +6701,7 @@ "(6, 6, 6, 7, 5)": [ -4.501810550522907, -2.737879163555053, - -1.8162336412288553 + -4.959386160999432 ], "(7, 6, 0, 6, 5)": [ -3.6585845150691405, @@ -6714,24 +6714,24 @@ -1.5103040834975527 ], "(10, 5, 8, 8, 5)": [ - -3.6846762184014437, + -6.409292334060293, -4.30561285462322, -4.724276744479867 ], "(9, 5, 6, 6, 5)": [ - -0.6845948271093055, - -1.0836581607818574, - -1.3052363424877809 + -2.7259277504328576, + -3.6867149355254014, + -4.159784091272304 ], "(6, 4, 4, 4, 4)": [ - -0.5554830120562484, - -0.44406996974889656, - -0.45970199907411 + -4.772910850155993, + -1.6531810427003895, + -0.3613379511089619 ], "(7, 5, 0, 3, 4)": [ -2.537787359557523, - -1.641327914017335, - -2.3018916188794605 + -3.3212463787110593, + -4.023031676604511 ], "(6, 2, 7, 5, 5)": [ -4.25759777210781, @@ -6739,59 +6739,59 @@ 0.0 ], "(8, 4, 8, 5, 4)": [ - -0.7248676962100775, - -0.8866390075458566, - -1.0554768017726979 + -1.0251221257295546, + -1.9406962153044187, + -2.5648550583167964 ], "(7, 5, 7, 3, 4)": [ -0.5294136858646334, - -0.3727923833156124, + -0.41691434258471016, -0.5025221394575384 ], "(8, 5, 6, 4, 4)": [ - -0.4340941961717362, - -0.4251532907665245, - -0.43933180006787487 + -0.4152082680479465, + -0.4209999139966998, + -1.686316147824228 ], "(7, 4, 7, 5, 5)": [ - -0.45344893666687697, - -0.5965891613704203, - -0.8277800134196238 + -0.2708852233688345, + -2.0631510926258887, + -2.9006056461956895 ], "(8, 4, 7, 5, 5)": [ - -0.4118135143316769, - -0.6052284452309447, - -0.8196209032312831 + -0.29328140385391455, + -1.4005973818897397, + -3.391886394303757 ], "(8, 4, 5, 3, 4)": [ - -0.7364145323081085, - -0.5717070986107373, - -0.369148629607118 + -1.8216218214475124, + -1.6494631884456872, + -0.7040456341989527 ], "(7, 4, 4, 3, 4)": [ - -0.8077510303829863, - -0.6252328549582007, - -0.4707259902798493 + -2.2573484461590976, + -1.9730005565937592, + -1.6237979997716072 ], "(6, 4, 2, 5, 5)": [ - -0.6825834652210286, - -0.5816861016964716, - -0.422151558019997 + -2.4448283004731244, + -0.2479891129806254, + -0.38299562061890496 ], "(7, 4, 7, 7, 5)": [ - -0.8647380844838467, - -1.3904583839416402, + -2.877543143090265, + -2.9083170892071735, -2.2043916151386442 ], "(8, 4, 8, 6, 5)": [ - -0.8995047916280021, - -1.1206091691787994, - -1.3313239056247617 + -5.130583326989902, + -6.03551963944544, + -6.909116658156915 ], "(7, 5, 8, 6, 5)": [ - -1.0727380485858653, - -1.2342113444249323, - -1.2517940501378781 + -3.3049823134919794, + -3.531916766839351, + -4.340085206595427 ], "(9, 7, 0, 4, 5)": [ 0.0, @@ -6814,29 +6814,29 @@ 0.0 ], "(6, 5, 0, 3, 4)": [ - -1.9750059816148113, - -1.7881444026005704, - -1.3824106040642847 + -6.412058759285898, + -8.045447683720186, + -3.8890837481141896 ], "(9, 5, 9, 2, 4)": [ -1.690493951197124, - -1.4081607913393455, + -1.2417915046834886, -1.521560299994678 ], "(7, 6, 8, 3, 4)": [ - -1.119352200206788, + -1.1045378017936196, -1.5790748778386932, -1.8522921904669443 ], "(8, 3, 3, 2, 4)": [ -2.7949194452418853, -2.7166826822984795, - -1.513104602808842 + -2.96405597823272 ], "(9, 5, 3, 4, 5)": [ -0.8519714326974286, - -0.8163100969124414, - -0.4985448926377864 + -1.2535445821154139, + -0.8450931524024591 ], "(6, 3, -1, 3, 5)": [ 0.0, @@ -6846,7 +6846,7 @@ "(6, 6, 7, 3, 4)": [ -1.1061128921755694, -1.2167491390146719, - -0.8298048401286763 + -0.7318288285166392 ], "(9, 2, 0, 3, 4)": [ -5.953448428571852, @@ -6860,7 +6860,7 @@ ], "(10, 5, 7, 2, 4)": [ -2.253545669777914, - -1.47630248550753, + -1.4278308394428643, -1.6134670738754562 ], "(8, 6, -1, 3, 5)": [ @@ -6880,13 +6880,13 @@ ], "(8, 3, 1, 7, 5)": [ -1.891819972923408, - -1.210352872336555, + -1.2426980832906813, -1.4963778235794272 ], "(9, 4, 7, 2, 4)": [ - -0.8290463787877814, + -0.8272580074095985, -0.8360481623759566, - -0.5585963625186974 + -0.6480798243163792 ], "(6, 4, -1, 3, 5)": [ 0.0, @@ -6901,30 +6901,30 @@ "(10, 6, 1, 3, 4)": [ -3.1964710880874745, -2.9914089778897375, - -2.4490547278173747 + -3.621256772235335 ], "(7, 5, 7, 7, 5)": [ - -1.591697376828341, - -1.0197546848917933, - -1.567178182555102 + -3.1757085228056665, + -2.7312302621647553, + -3.787793973777173 ], "(9, 4, 8, 6, 4)": [ -2.257185204839773, - -1.7136518594339532, + -3.1503909227980023, -2.4723961961900103 ], "(7, 4, 8, 5, 4)": [ - -0.7111451367447611, - -0.8486850344051244, - -0.9092944808252329 + -1.7972027450778878, + -1.542601062626367, + -2.673453475165905 ], "(6, 5, 9, 6, 5)": [ - -1.4331468630612996, - -1.559994463523513, - -2.0224433829839676 + -3.7516749200969866, + -5.226992622933324, + -4.476523029328528 ], "(8, 4, 9, 3, 4)": [ - -0.9195778622405111, + -0.8090593485952958, -1.4025365585080392, -1.645372055496433 ], @@ -6934,19 +6934,19 @@ -1.3378052934587281 ], "(8, 4, 8, 2, 4)": [ - -0.545672860586043, + -0.44234256278533585, -1.1142690361592784, -0.7881299075688316 ], "(8, 5, 7, 2, 4)": [ -0.7036190732445496, - -0.4464637558355298, - -0.6048345296060914 + -1.310307246408589, + -0.5925549950561241 ], "(6, 4, 0, 2, 4)": [ - -1.3235575987973067, - -1.6794395891170888, - -1.695246552309708 + -11.592878220968242, + -9.719979647933137, + -8.3759835487989 ], "(10, 3, 7, 4, 4)": [ -1.900983280415028, @@ -6964,14 +6964,14 @@ 0.0 ], "(7, 6, 2, 7, 5)": [ - -1.4895705937934907, + -1.4444886924866371, -1.2978988591194003, -2.708352467308581 ], "(9, 5, 2, 5, 4)": [ -1.5108954879458065, -1.049199167087104, - -0.8009677247559278 + -0.7568830548533695 ], "(10, 6, 6, 7, 5)": [ -3.993439695764847, @@ -6984,12 +6984,12 @@ 0.0 ], "(9, 5, 9, 6, 4)": [ - -1.9358820816340385, - -2.116083525922222, - -1.795896648320272 + -4.487414959862184, + -5.729656724746939, + -4.479112929889009 ], "(9, 4, 8, 2, 4)": [ - -0.7958213653749002, + -0.7721774137062072, -1.1347424211856179, -1.096726220668213 ], @@ -7011,11 +7011,11 @@ "(6, 3, 3, 2, 4)": [ -3.0176738747922736, -2.350976826701516, - -1.5367436865767883 + -2.3980521648779902 ], "(10, 3, 3, 2, 4)": [ -4.029945240404142, - -3.165250170989633, + -4.985782088835901, -3.880496456304871 ], "(10, 4, 0, 1, 4)": [ @@ -7031,7 +7031,7 @@ "(6, 3, 2, 6, 5)": [ -1.3469506702435268, -1.1754602418433506, - -0.8725142087109579 + -1.8285599492962978 ], "(6, 6, 1, 6, 5)": [ -2.254735788494902, @@ -7039,34 +7039,34 @@ -0.8521654256633995 ], "(6, 5, 6, 5, 4)": [ - -0.4016148906557095, - -0.48186147593174405, - -0.5685751469727559 + -0.5143600037558513, + -0.36345869908245015, + -2.1609791923587522 ], "(8, 5, 6, 5, 4)": [ - -0.34825176455451945, - -0.467491648166765, - -0.5962388701102256 + -0.5347578977603966, + -0.3977115238808173, + -2.3364740929557457 ], "(7, 4, 5, 5, 4)": [ - -0.31644435775147334, - -0.2529355701081657, - -0.4015199565689965 + -0.9575943506116965, + -0.31533292006499913, + -1.5999951348683394 ], "(7, 5, 9, 7, 5)": [ - -1.6192628199950556, - -1.6819051037987949, - -1.6133544856804798 + -8.43637575421616, + -8.806159890434644, + -10.383732407637169 ], "(9, 4, 0, 7, 5)": [ - -2.979739857015137, - -1.2695310270962785, + -2.567909345438357, + -1.1633288107697164, -2.1873903840459596 ], "(7, 6, 6, 5, 4)": [ - -1.062543087177841, - -0.8220357360512331, - -0.9790168212596253 + -1.2461336144131876, + -0.7774180797587318, + -2.155651799208372 ], "(8, 4, -1, 4, 5)": [ 0.0, @@ -7090,7 +7090,7 @@ ], "(8, 7, 5, 5, 4)": [ -3.0878413215278773, - -1.939255738704861, + -1.8049085892725538, -3.5735277434186106 ], "(6, 7, 4, 5, 5)": [ @@ -7106,7 +7106,7 @@ "(10, 3, 2, 6, 5)": [ -3.346538574743338, -3.4637263557600146, - -1.8744429342458564 + -1.7480282973885264 ], "(6, 7, 8, 7, 5)": [ -3.22583050333195, @@ -7119,24 +7119,24 @@ 0.0 ], "(8, 7, 6, 5, 4)": [ - -3.803807726957932, + -3.4602306368850533, -4.976999573033628, -3.9771813367623965 ], "(8, 5, 4, 5, 4)": [ - -0.4404549764490954, - -0.3910535172534898, - -0.3589492029814555 + -1.4889784469794214, + -0.1849896824656474, + -0.7534433488256692 ], "(8, 5, 5, 5, 5)": [ - -0.4989048122598263, - -0.41892773829117047, - -0.5378039485966732 + -0.5926058557318226, + -1.3362168519406332, + -3.6674669647121503 ], "(7, 5, 9, 5, 5)": [ -2.263312873757117, - -1.2760681313267532, - -2.194690906152641 + -2.5154422199175936, + -4.832683019336258 ], "(7, 4, 9, 5, 5)": [ -1.8217763550423671, @@ -7144,9 +7144,9 @@ -2.082886597844992 ], "(8, 5, 9, 7, 5)": [ - -1.5995373378639368, - -1.7440571280382344, - -1.7654146016676908 + -10.988801240074912, + -12.291545841527281, + -10.658863416672334 ], "(7, 5, -1, 6, 5)": [ 0.0, @@ -7169,39 +7169,39 @@ 0.0 ], "(8, 3, 7, 8, 5)": [ - -3.9644671044088646, + -6.2871252838523, -4.17103470176931, -3.8417339176303726 ], "(7, 6, 6, 6, 5)": [ - -1.2777544547688078, - -1.5598433559052536, + -1.60341940444343, + -2.459261334855504, -2.5242827186156287 ], "(6, 6, 6, 3, 4)": [ -1.838536790081135, -1.0566640197243982, - -0.6941008314209396 + -0.7426555718036083 ], "(7, 4, 2, 3, 4)": [ - -1.0166737844557805, - -0.8362739738057133, - -0.7277887095994916 + -4.148069109133865, + -3.965679072841454, + -2.8854257835390253 ], "(8, 4, 1, 6, 5)": [ -0.7082214094287196, - -0.5647360025501424, + -0.5013507417413617, -0.6178353945488344 ], "(8, 5, 3, 7, 5)": [ -0.4626512474967253, - -1.1599924285331027, + -2.0173076807131705, -0.7077649339365611 ], "(7, 5, 5, 6, 5)": [ - -0.487299191848677, - -0.6298915552818162, - -0.802237375390431 + -1.5359045973682859, + -2.6276901091032823, + -4.089028100893777 ], "(9, 4, 9, 2, 4)": [ -1.3993076679559069, @@ -7211,17 +7211,17 @@ "(8, 6, 5, 4, 5)": [ -3.550839488316147, -2.18090402452923, - -0.7739836138458389 + -1.2247382594665426 ], "(8, 5, 5, 4, 5)": [ - -0.46322050122401026, - -0.4373919559815469, - -0.5747209479757067 + -1.0953842511365801, + -0.18615029453663554, + -1.2686787824739474 ], "(8, 5, 5, 4, 4)": [ - -0.544766481262293, - -0.3957466202816899, - -0.32249116187505794 + -3.780532130350498, + -1.0050454809301739, + -0.3819390776002057 ], "(9, 7, 2, 5, 5)": [ -4.19354227696083, @@ -7254,8 +7254,8 @@ 0.0 ], "(7, 3, 6, 4, 4)": [ - -0.7458661478338232, - -0.9629439995463089, + -1.3182068013341859, + -0.8532003931479175, -1.093509586279703 ], "(8, 7, -1, 7, 5)": [ @@ -7266,7 +7266,7 @@ "(7, 6, 8, 2, 4)": [ -1.6650842045040182, -1.5755202226188005, - -1.3433550873767397 + -1.265346287628992 ], "(9, 6, -1, 3, 5)": [ 0.0, @@ -7305,13 +7305,13 @@ ], "(8, 5, 5, 3, 4)": [ -0.7644709106857405, - -0.4647716086431914, - -0.5993744196930593 + -1.3264691545769902, + -0.6128757968112621 ], "(9, 4, 5, 2, 4)": [ - -1.2319660360611053, - -1.1929303053904177, - -0.7573909671720618 + -3.2910699760799664, + -2.2228602749184114, + -1.2449665690902458 ], "(6, 3, -1, 1, 4)": [ 0.0, @@ -7319,14 +7319,14 @@ 0.0 ], "(7, 6, 5, 6, 5)": [ - -0.9637631285616302, - -1.2593238907488864, - -1.3798107148057586 + -1.6449361201172166, + -2.653971283890388, + -2.76236568365164 ], "(9, 3, 3, 4, 5)": [ -2.3330666951355377, -2.747623384383655, - -1.3193467814738817 + -1.3619021871828296 ], "(10, 6, 4, 2, 4)": [ -5.018300904271049, @@ -7364,7 +7364,7 @@ 0.0 ], "(6, 2, 5, 5, 5)": [ - 0.0, + -3.200194212020799, -4.095967402220744, -4.939816412579294 ], @@ -7394,14 +7394,14 @@ -1.9872221827088823 ], "(6, 6, 3, 5, 5)": [ - -0.9570159630846647, - -0.7994013773766695, - -0.7833507830223425 + -2.7662494528046304, + -0.8203191772119922, + -0.659755929734553 ], "(8, 7, 5, 3, 4)": [ -4.436078101105599, -3.7771863289265526, - 0.0 + -5.331927043077729 ], "(7, 2, 2, 4, 4)": [ -4.961772142381504, @@ -7420,7 +7420,7 @@ ], "(8, 6, 2, 7, 5)": [ -1.3420058522058278, - -1.1509816006482394, + -1.0445256891443104, -1.1199366662915495 ], "(8, 4, 7, 8, 5)": [ @@ -7429,9 +7429,9 @@ -4.04929939216157 ], "(8, 4, 8, 7, 5)": [ - -1.1029371300561135, - -1.477815056652224, - -1.5739253184796793 + -8.129201051805353, + -8.63044552361779, + -10.049022611246873 ], "(6, 2, 9, 5, 5)": [ -5.805201450138445, @@ -7449,9 +7449,9 @@ -6.054634940643886 ], "(6, 6, 6, 5, 4)": [ - -0.7874572657768083, - -0.9677813854960459, - -0.9823258287901381 + -1.2537928944905674, + -0.8979343304889816, + -2.387617267949642 ], "(9, 3, 8, 4, 5)": [ 0.0, @@ -7469,7 +7469,7 @@ -1.3198121964203957 ], "(7, 4, 8, 4, 4)": [ - -0.5692208728933166, + -0.3774468537225397, -0.7429439630095706, -0.8726574362241228 ], @@ -7479,24 +7479,24 @@ -1.1096071815274668 ], "(7, 5, 9, 6, 5)": [ - -1.4905452729210351, - -1.865076425600138, - -2.040145630459072 + -5.9807577732753705, + -7.014605787267807, + -9.304714277660544 ], "(8, 5, 9, 4, 4)": [ - -1.0814219329160384, - -1.3079883069787455, - -1.4589408478152979 + -0.8435551031270374, + -1.0324722718439765, + -2.4944082365876588 ], "(6, 6, 5, 2, 4)": [ -2.6137140468194184, - -1.2555411561903407, + -2.429540021718208, -3.151167437462864 ], "(6, 7, 6, 5, 4)": [ -5.670180083812658, -3.532436212429249, - 0.0 + -7.830372858617641 ], "(7, 2, 5, 4, 4)": [ -3.6038724177062766, @@ -7506,7 +7506,7 @@ "(9, 5, 7, 2, 4)": [ -0.8790008030418789, -1.0353714115787542, - -0.7165067459711998 + -0.5451470114897281 ], "(8, 6, 3, 7, 5)": [ -1.4219886166112823, @@ -7515,8 +7515,8 @@ ], "(6, 6, 9, 6, 4)": [ -3.5142850279587683, - -3.3220013789960845, - -2.0322361709509944 + -5.044611797533574, + -4.578014474062977 ], "(7, 3, 3, 2, 4)": [ -3.1317523913504663, @@ -7525,7 +7525,7 @@ ], "(8, 5, 0, 7, 5)": [ -2.2305985109230884, - -1.176314924895343, + -1.0500414283863881, -1.7042969297103907 ], "(9, 5, 6, 6, 4)": [ @@ -7559,12 +7559,12 @@ 0.0 ], "(6, 6, 4, 4, 4)": [ - -1.0201306057119734, - -0.7199215635456736, - -0.8291056855196537 + -4.929688478162635, + -1.5715369218223298, + -0.7919823700621602 ], "(8, 2, 5, 5, 5)": [ - -3.565997257050092, + -3.1814941640583965, -3.5884352776854587, -4.079049419204133 ], @@ -7574,14 +7574,14 @@ -3.606921919157028 ], "(7, 2, 2, 5, 5)": [ - -2.7985560903215725, + -3.4832001779343154, -3.6999996360523495, -4.256864474307351 ], "(8, 3, 7, 7, 5)": [ - -1.3168497822078389, + -2.3527970725808824, -1.8846304289632392, - -1.8047802302087699 + -4.410333397416178 ], "(9, 2, 7, 5, 5)": [ 0.0, @@ -7606,22 +7606,22 @@ "(7, 5, 1, 5, 5)": [ -0.9933003269010945, -0.7944999333747358, - -0.6338450150769096 + -0.43760543913957944 ], "(6, 5, 3, 5, 5)": [ - -0.5602593906094503, - -0.3818740051845129, - -0.3004843896275839 + -2.298476995433404, + -0.20418306419651922, + -0.35237149393330125 ], "(6, 4, 7, 6, 5)": [ - -0.6456215896755804, - -0.8964104481203689, - -1.132879043066782 + -3.004631797622028, + -3.7157543381515934, + -4.616224567882703 ], "(8, 2, 4, 5, 5)": [ -3.9780622259631837, -3.6697936864703156, - -3.651927644236781 + -3.4292166632353633 ], "(10, 3, 3, 6, 5)": [ -2.9417122657630776, @@ -7640,7 +7640,7 @@ ], "(6, 3, 6, 2, 4)": [ -2.0544839203287566, - -1.2135192126369956, + -2.988424063122432, -3.3612504908729046 ], "(7, 6, 8, 4, 5)": [ @@ -7654,9 +7654,9 @@ 0.0 ], "(8, 6, 6, 3, 4)": [ - -1.4379213296656925, + -2.3256519933165167, -1.063170561439127, - -0.8581662705740972 + -0.7364334375508473 ], "(6, 6, -1, 1, 4)": [ 0.0, @@ -7701,22 +7701,22 @@ "(6, 6, 3, 4, 5)": [ -2.4485333860843177, -1.9316965050903634, - -0.6476139988637633 + -0.6133163228524862 ], "(8, 5, 1, 4, 5)": [ - -1.1133230670094367, - -0.9807320231636779, - -0.8147576328775181 + -2.481311300726116, + -2.9657677519155223, + -2.4739599149450973 ], "(7, 4, 1, 4, 4)": [ -1.1286426423051026, -1.0514527825841133, - -0.8023993668736772 + -0.5918042304904962 ], "(7, 5, 1, 3, 4)": [ - -1.3764567209138807, - -1.1984504756237917, - -1.0174086520584338 + -5.934871272328747, + -4.270147666404235, + -4.095294378891792 ], "(6, 6, 9, 2, 4)": [ 0.0, @@ -7741,16 +7741,16 @@ "(7, 5, 0, 3, 5)": [ -4.006679354913346, -2.7079459940910198, - -1.5225409465524458 + -3.658092588320688 ], "(8, 5, 0, 6, 5)": [ - -1.146847730236356, - -1.398764185137915, - -1.323301380096683 + -0.873185774126338, + -1.1807729662523663, + -1.1107167326007128 ], "(8, 4, 1, 7, 5)": [ -0.8577740078979974, - -0.5240937856650478, + -0.5136156516095509, -1.0179288351247884 ], "(6, 4, -1, 7, 5)": [ @@ -7784,7 +7784,7 @@ 0.0 ], "(9, 5, 0, 7, 5)": [ - -1.3931234599161033, + -1.1806118338941682, -2.0091440835608676, -2.188520125004599 ], @@ -7814,12 +7814,12 @@ -4.007241893084856 ], "(10, 3, 4, 6, 5)": [ - -2.2914419161287807, - -2.424088268432529, - -1.669667270722329 + -2.296347637351453, + -2.8116185982363455, + -2.7438380129197544 ], "(6, 3, 6, 7, 5)": [ - -1.2399455204125849, + -2.153805552661783, -3.880491282106103, -3.100196571610466 ], @@ -7854,24 +7854,24 @@ -2.5913018031440007 ], "(8, 4, 6, 5, 4)": [ - -0.3089162882386224, - -0.4512487664744723, - -0.6128604496158231 + -0.32900941547275286, + -0.4340047499241087, + -2.3099646598839323 ], "(8, 4, 4, 7, 5)": [ -0.4317236435859281, - -1.0828804174824112, + -2.235103211153323, -2.60253071147989 ], "(7, 4, 5, 6, 5)": [ - -0.3520638214985964, - -0.5109486626461083, - -0.7355198891808843 + -1.5665651726266796, + -1.8690725396106291, + -1.8885889583530915 ], "(9, 5, 3, 7, 5)": [ - -0.7647233571715809, - -1.0540980969393736, - -1.0834825378887423 + -1.7504833741404724, + -2.833238838597471, + -2.927834734664856 ], "(7, 6, 9, 2, 4)": [ -2.1192866707531723, @@ -7895,17 +7895,17 @@ ], "(10, 6, 4, 6, 5)": [ -3.6790788895329314, - -1.5239442142434643, + -2.1270774254838267, -2.1638908828826624 ], "(7, 4, 8, 7, 5)": [ - -1.3554532283485203, - -1.2276310396985708, - -1.5300422413946688 + -6.163148356893544, + -7.536641022079133, + -7.362656815072585 ], "(6, 5, 7, 3, 4)": [ -0.5621862429615373, - -0.42194079959379555, + -0.4098039590231807, -0.6632455223538863 ], "(8, 5, -1, 1, 4)": [ @@ -7931,7 +7931,7 @@ "(9, 6, 6, 4, 5)": [ -2.460360466725592, -1.1107158124191538, - 0.0 + -5.923266286516414 ], "(10, 4, 6, 4, 5)": [ -2.181342466803796, @@ -7939,9 +7939,9 @@ -2.7957076378599917 ], "(9, 5, 6, 3, 4)": [ - -0.7790966796577203, - -0.7260048182156165, - -0.5693137274236936 + -1.7853105868930663, + -0.7339116058414638, + -0.5950658668404996 ], "(6, 7, 7, 7, 5)": [ -5.356068470139473, @@ -7966,7 +7966,7 @@ "(7, 3, 3, 5, 4)": [ -3.150401987946438, -2.707473300996315, - -1.0065378803390683 + -1.0713927090866189 ], "(6, 2, 8, 5, 5)": [ -4.486013310585304, @@ -7974,9 +7974,9 @@ -4.618913789526263 ], "(7, 6, 3, 4, 4)": [ - -1.3887323562847733, - -1.0283123573002686, - -0.7251467772564247 + -2.326531544364922, + -1.6759457804097504, + -0.5902169929896756 ], "(8, 3, -1, 3, 5)": [ 0.0, @@ -8014,9 +8014,9 @@ 0.0 ], "(8, 4, 6, 7, 5)": [ - -0.7802671825181566, - -2.0196243919698085, - -1.9010852016753186 + -3.216468457224388, + -3.6275861779340364, + -4.326150596323837 ], "(7, 7, 3, 5, 5)": [ -4.083752579264173, @@ -8025,7 +8025,7 @@ ], "(9, 3, 5, 2, 4)": [ -1.8093874670301515, - -1.676964697419396, + -3.6642739028145694, -1.7252609065886118 ], "(10, 3, -1, 4, 4)": [ @@ -8055,8 +8055,8 @@ ], "(9, 4, 3, 4, 5)": [ -0.8956274707920772, - -0.5793009652135814, - -0.7485155244750729 + -0.7621798151223504, + -0.6717652906721848 ], "(9, 7, 8, 4, 4)": [ 0.0, @@ -8075,7 +8075,7 @@ ], "(6, 6, 7, 7, 5)": [ -2.4531115973073687, - -1.469215991876022, + -3.9748571139236546, -3.173603327796872 ], "(7, 3, 8, 2, 4)": [ @@ -8095,7 +8095,7 @@ ], "(8, 5, 8, 3, 4)": [ -0.7772701128990129, - -0.5849136710784627, + -0.48327026481561747, -0.7369537218290777 ], "(8, 4, 6, 4, 5)": [ @@ -8104,19 +8104,19 @@ -1.0056449688126905 ], "(8, 5, 4, 3, 4)": [ - -0.8640588003451314, - -0.49435238247234103, - -0.36122951354091176 + -3.302829719533316, + -2.6660757305820897, + -1.6759022597564792 ], "(8, 5, 3, 4, 5)": [ -0.6923515934091866, -0.5241198103545401, - -0.3231983301802833 + -0.2770866175544995 ], "(6, 4, 1, 2, 4)": [ - -1.6649251335960495, - -1.2360205443648142, - -1.6145707459447758 + -4.817896491490884, + -2.9489547109895726, + -2.6625108026420055 ], "(6, 5, -1, 2, 4)": [ 0.0, @@ -8135,7 +8135,7 @@ ], "(9, 3, 5, 4, 5)": [ -2.56447241311537, - -1.0041656665676513, + -1.2322973244830817, -2.350587010429858 ], "(10, 3, 5, 6, 5)": [ @@ -8154,9 +8154,9 @@ 0.0 ], "(8, 5, 1, 4, 4)": [ - -1.2200525995433698, - -0.9538572377408042, - -0.7288283364058108 + -2.93199375263593, + -1.6784292857122722, + -0.5392836058955929 ], "(7, 3, 6, 2, 4)": [ -3.937697799415193, @@ -8164,49 +8164,49 @@ -1.6659624271015738 ], "(6, 7, 0, 2, 4)": [ - -4.884491883302623, + -10.365635267866804, -6.2508133971605195, -6.2488868519673515 ], "(9, 3, 6, 4, 5)": [ -3.0274998752289983, - -1.1986211779287177, + -1.165947730905168, -2.412402217614111 ], "(6, 3, 3, 5, 5)": [ - -1.0347680869727764, - -0.8130163934355304, - -0.9004008143117043 + -2.3393958431336737, + -0.8064638728819488, + -0.9962756414891117 ], "(8, 5, 7, 5, 5)": [ - -0.6236069359939693, - -0.6680531516340795, - -0.8571494117471269 + -0.32244225564525336, + -2.3406875168297407, + -5.066910731539632 ], "(7, 4, 0, 5, 5)": [ -1.5244799146212755, -1.5245725744025933, - -1.0025987029714987 + -0.9109342387940891 ], "(8, 5, 2, 6, 5)": [ - -0.6026971147684888, - -0.4426371520315801, + -0.5481849384135055, + -0.4338978447312237, -0.5223163090188226 ], "(8, 4, 7, 6, 5)": [ - -0.5998128798617702, - -0.8021792868864734, - -1.0875850920088903 + -3.146631654612498, + -5.328081992830381, + -7.038301344167646 ], "(7, 4, 7, 5, 4)": [ - -0.43232024165228233, - -0.5483992479710288, + -0.33198334037280897, + -0.3993318211828615, -0.6842375472620078 ], "(7, 5, 6, 4, 4)": [ - -0.3054130717390084, - -0.39673747207840016, - -0.4086895179493968 + -0.5339972988010081, + -0.39302563918000777, + -1.5184935608776784 ], "(9, 4, -1, 4, 4)": [ 0.0, @@ -8220,18 +8220,18 @@ ], "(9, 5, 6, 4, 5)": [ -1.5850389029740006, - -0.6105967013388234, + -0.5337882333945253, -2.080471671389075 ], "(6, 4, 4, 3, 4)": [ - -0.7999852732836239, - -0.5094283589250181, - -0.3706145131869425 + -2.052902579825733, + -1.966120199262496, + -1.2762384135676335 ], "(8, 4, 1, 4, 5)": [ - -1.0845916417764716, - -1.0619524176811, - -0.8640161474958219 + -2.1673753027068074, + -1.6772211137564539, + -1.1146388720894913 ], "(10, 6, 3, 7, 5)": [ -1.7371491864524378, @@ -8245,7 +8245,7 @@ ], "(10, 3, 7, 3, 4)": [ -2.8297137992562087, - -1.470598345853256, + -1.4423914424023612, -2.0701652875760157 ], "(7, 6, 1, 5, 4)": [ @@ -8255,7 +8255,7 @@ ], "(8, 4, 0, 5, 5)": [ -1.7650990698794848, - -1.1329159640592081, + -0.7858063096301766, -1.3706312313090916 ], "(6, 5, 0, 7, 5)": [ @@ -8264,17 +8264,17 @@ -0.9177090581556042 ], "(7, 4, 2, 6, 5)": [ - -0.38388798684457703, - -0.3363730134691099, + -0.40523092638039104, + -0.33608887915345875, -0.5345726397788121 ], "(8, 5, 2, 5, 4)": [ -0.8671131393475693, -0.6370132575245694, - -0.43305387683688434 + -0.4316101775765965 ], "(7, 5, 3, 5, 4)": [ - -0.6213635298576738, + -0.9448582073156935, -1.0292527999303966, -0.823213148330354 ], @@ -8284,34 +8284,34 @@ -0.8913907095508923 ], "(8, 4, 2, 4, 4)": [ - -0.7814995865876662, - -0.767895778847946, - -0.6283646048388936 + -3.532969422433624, + -2.4680822604245294, + -0.23589682026890263 ], "(6, 5, 2, 4, 4)": [ - -0.9259670040026766, - -0.615712549162567, - -0.4943943222144208 + -3.0130096423655894, + -1.0609188978708555, + -0.21384767653375428 ], "(6, 4, 1, 5, 5)": [ -1.035031578064432, -0.883911418384316, - -0.7165746105143226 + -0.44759524431285574 ], "(6, 5, 2, 5, 5)": [ - -0.6495245192299951, - -0.5040908152162213, - -0.3645526039425208 + -2.2012067407649165, + -0.2090764888779016, + -0.3232799087633254 ], "(6, 4, 6, 6, 5)": [ - -0.48106675189575754, - -0.7764118876960519, - -1.2254092540388568 + -2.1683854357229233, + -2.967591875474652, + -3.028807851028598 ], "(7, 5, 8, 5, 4)": [ - -0.9118732334023006, - -0.7643633304998878, - -1.0424720568168826 + -0.7955949055789452, + -2.1152621089565686, + -2.7358560985678024 ], "(8, 3, 9, 2, 4)": [ -2.6671438464778863, @@ -8324,27 +8324,27 @@ -1.9173510425721567 ], "(7, 5, 8, 4, 4)": [ - -0.7060639456915208, + -0.5854919617700042, -0.7200612703357708, -0.7893387480688554 ], "(6, 4, 4, 2, 4)": [ - -1.9522182048478038, + -3.9048250551278354, -1.3868157416087525, -0.6082402712927695 ], "(8, 4, 6, 6, 5)": [ - -0.5398135673830826, - -0.6379665973870257, - -1.0212223299273533 + -2.284374776164117, + -3.9308851643957783, + -2.586917005831721 ], "(10, 3, 4, 7, 5)": [ -2.6534012132036455, - -1.9965793896316744, + -3.013754905311546, -3.902602128020387 ], "(8, 7, 5, 5, 5)": [ - -2.6334683131028016, + -2.2391449366849034, -3.3653154864482095, -3.068937263208707 ], @@ -8354,9 +8354,9 @@ -3.658475173881461 ], "(8, 5, 9, 6, 4)": [ - -2.401296184634439, - -1.5272251031999895, - -2.664712950421137 + -3.832824060610651, + -5.922384305104743, + -5.366272681461257 ], "(6, 6, -1, 5, 5)": [ 0.0, @@ -8369,9 +8369,9 @@ 0.0 ], "(6, 5, 7, 5, 5)": [ - -0.5141181242669723, - -0.7084034590641355, - -0.8275908320047431 + -0.39843628561625866, + -1.5279275809836401, + -3.4011891790567415 ], "(7, 4, -1, 6, 5)": [ 0.0, @@ -8384,19 +8384,19 @@ -2.83936858192219 ], "(8, 4, 3, 5, 5)": [ - -0.5605719935633823, - -0.51812480043399, - -0.3886497297222744 + -2.2236741205227912, + -0.20223894514839125, + -0.380947679423687 ], "(7, 4, 3, 5, 5)": [ - -0.5285812772103357, - -0.44282385406337355, - -0.3371160862153288 + -2.2408568106581144, + -0.22591783826153655, + -0.47684138284412686 ], "(8, 5, 1, 2, 4)": [ - -1.536221775743702, - -1.3837215514100696, - -1.1839101271392678 + -12.152259031714808, + -9.468498552786961, + -7.11757143601006 ], "(9, 2, 8, 6, 5)": [ 0.0, @@ -8424,9 +8424,9 @@ 0.0 ], "(9, 5, 4, 4, 5)": [ - -0.5741275230226562, - -0.5696565008361757, - -0.41062816976538147 + -1.2916812713158905, + -1.2940836369779294, + -1.2951138455212476 ], "(8, 4, 8, 4, 5)": [ -0.960301855269784, @@ -8436,11 +8436,11 @@ "(8, 6, 0, 7, 5)": [ -4.299234409762102, -4.280077627221225, - -1.9478952676330419 + -1.5826157901498519 ], "(7, 6, 4, 7, 5)": [ -1.8748986126719722, - -1.2493745583431486, + -3.4249871142703787, -2.2645906394186737 ], "(6, 6, 8, 8, 5)": [ @@ -8450,7 +8450,7 @@ ], "(9, 2, 5, 4, 4)": [ -4.144690919631099, - 0.0, + -5.362510792884657, -4.69411143607017 ], "(7, 3, 3, 6, 5)": [ @@ -8459,64 +8459,64 @@ -1.3937508901426634 ], "(7, 5, 5, 4, 4)": [ - -0.4760751810629734, - -0.3604705315528691, - -0.3205720698365244 + -3.196126954991858, + -0.8087607428583425, + -0.4862424412628845 ], "(6, 4, 2, 3, 4)": [ - -1.082121822524754, - -0.8973745290302768, - -0.6682035206036578 + -4.0980717962686946, + -3.578047332634398, + -3.040622741138325 ], "(6, 4, 8, 5, 5)": [ - -0.7209444834931693, + -0.3582785606759986, -0.7877238658204575, -1.107322271069267 ], "(6, 5, 8, 5, 4)": [ - -0.7810165372682778, - -0.9337315353915175, - -1.0582099845801456 + -0.5548213044901197, + -1.7999951132694951, + -1.947665700435297 ], "(6, 4, 8, 5, 4)": [ - -0.674817790596052, - -0.8049530863089523, - -0.8926415320821092 + -0.7158061018393017, + -1.2959650239253855, + -3.3881905540141446 ], "(7, 4, 7, 3, 4)": [ -0.5422261837270892, - -0.5324388996877827, + -0.5010900905165709, -0.6813271701400008 ], "(7, 5, 2, 2, 4)": [ - -1.249880175939187, - -0.9853332740789897, - -1.2730490708953714 + -3.9879940050961555, + -3.167983621633682, + -2.898714458390953 ], "(7, 5, 1, 2, 4)": [ - -1.5200454216710826, - -1.3398335688641216, - -1.0983746346794727 + -4.279389546907784, + -6.648202664130434, + -5.1398156340317485 ], "(7, 4, 0, 3, 5)": [ - -2.704473213472514, - -1.5491186093226477, - -2.49125849829587 + -5.0448799054330316, + -3.800137576701813, + -4.209551698945608 ], "(8, 5, 2, 4, 5)": [ -0.8103625220963423, -0.685881302909956, - -0.5259329122639128 + -0.46715681280430166 ], "(6, 5, 8, 7, 5)": [ - -1.9373530220847275, - -1.4042905428925785, - -1.4732640976634543 + -3.5350926041128483, + -5.374955013330473, + -7.181356421241762 ], "(7, 5, 6, 3, 4)": [ -0.5543675683484339, -0.32586297952402704, - -0.29180374589315927 + -0.3052053980437187 ], "(7, 3, 0, 7, 5)": [ -4.140402382781571, @@ -8544,28 +8544,28 @@ 0.0 ], "(8, 4, 6, 4, 4)": [ - -0.3691329698113358, - -0.39909832594568445, - -0.4780621906644978 + -0.5267203946486205, + -0.3642870332906376, + -1.7569599096604807 ], "(6, 4, 6, 4, 4)": [ - -0.20448817930086083, - -0.34792245516808334, - -0.40258571830351675 + -1.0963299036909926, + -0.3322765220799379, + -0.764174916538696 ], "(6, 5, 5, 4, 4)": [ - -0.35665686862082585, - -0.34895949953977157, - -0.28784559623454165 + -3.2823919894021154, + -0.916860473877394, + -0.37903376633592895 ], "(6, 4, 2, 4, 4)": [ -0.9276127325542252, - -0.7172361461100909, - -0.6187174440030293 + -1.1137428876438902, + -0.2598763541927744 ], "(7, 5, 7, 5, 5)": [ - -0.5273637500782232, - -0.7086866076355542, + -0.4416751866126852, + -1.8329715652694867, -0.8317556896206434 ], "(8, 4, -1, 5, 4)": [ @@ -8579,34 +8579,34 @@ 0.0 ], "(8, 4, 9, 8, 5)": [ - -2.3116971131254767, - -2.3782991356967598, - -1.6026417532221382 + -5.665299391135683, + -6.623274815897201, + -7.434597571381991 ], "(7, 6, 3, 3, 4)": [ - -1.829921387374455, - -1.1611276821137042, - -0.9906839653853748 + -3.167711250402066, + -2.893045460981173, + -2.091278615908446 ], "(7, 5, 7, 6, 5)": [ - -0.6814180725639892, - -0.8515282839909578, - -1.0411208846076079 + -2.824510285977077, + -4.2031803146777875, + -3.892347922975955 ], "(7, 4, 8, 3, 4)": [ - -0.4862579521572027, - -0.688440840129535, + -0.4591366255057997, + -0.6308216983444578, -0.7439519462859552 ], "(7, 4, 5, 5, 5)": [ - -0.25722458561015776, - -0.41002219000920703, - -0.5958755097655385 + -0.3414698173138231, + -1.3384871741170465, + -3.479086643079421 ], "(8, 5, 8, 7, 5)": [ - -1.2911379461935275, - -1.463247905965449, - -1.393175742836283 + -9.100081210602372, + -9.66704198103878, + -9.251731479180599 ], "(10, 6, 0, 5, 4)": [ -5.4346196154190896, @@ -8615,13 +8615,13 @@ ], "(8, 4, 2, 6, 5)": [ -0.5470229323273643, - -0.3576671696786421, + -0.5433572445297814, -0.5752880153062282 ], "(8, 5, 4, 6, 5)": [ - -0.32738856682147266, - -0.5486852813868455, - -0.7301203216680313 + -0.9063339035502268, + -2.215524486073863, + -4.8094965873331095 ], "(6, 4, 1, 5, 4)": [ -2.4353427014136195, @@ -8629,13 +8629,13 @@ -1.948164307391012 ], "(6, 5, 4, 6, 5)": [ - -0.4521453138590785, - -0.4976243305840292, - -0.6498618488245235 + -0.7667912925065499, + -1.0525739987034286, + -1.705435303483482 ], "(8, 5, 6, 7, 5)": [ -0.7091037674985243, - -1.8174857687122647, + -3.4505451035569816, -1.6419527943883612 ], "(9, 5, 2, 3, 5)": [ @@ -8649,9 +8649,9 @@ 0.0 ], "(6, 5, 2, 3, 4)": [ - -1.1509896033336824, - -0.7967156156034451, - -0.584245768582621 + -5.359527680205604, + -3.6946911639949125, + -2.8656839217727854 ], "(7, 2, 9, 6, 5)": [ -5.50144571361057, @@ -8680,21 +8680,21 @@ ], "(6, 6, 0, 7, 5)": [ -2.7710624195965816, - -2.612474252085557, + -2.2862505086438114, -2.9187771594508054 ], "(9, 4, 3, 8, 5)": [ -1.265523634437205, - 0.0, + -32.446154998957624, 0.0 ], "(8, 6, 9, 7, 4)": [ -5.047538829576736, -2.8484635179368656, - 0.0 + -41.14619197112617 ], "(9, 6, 9, 7, 4)": [ - -3.076739407952142, + -5.047615655652249, -3.1052780572121934, -3.4705355623845326 ], @@ -8704,7 +8704,7 @@ -4.219235208548968 ], "(7, 3, 7, 8, 5)": [ - -3.0732782317930036, + -5.723388569652775, -3.941676341112263, -5.000393892802884 ], @@ -8730,31 +8730,31 @@ ], "(7, 5, 1, 4, 5)": [ -1.2678319390076438, - -1.0125682911321132, - -0.834971203139819 + -1.7152516660450114, + -1.332980230222269 ], "(7, 4, 4, 6, 5)": [ - -0.2683824264217627, - -0.4125645699398046, - -0.6945065241470519 + -1.153605965216121, + -1.9182835905796327, + -1.896277461088431 ], "(7, 5, 4, 4, 4)": [ - -0.5482542713960638, - -0.4481193147136303, - -0.291082250641645 + -4.66566765894732, + -1.619220016496627, + -0.22114333767813166 ], "(6, 5, 9, 5, 4)": [ - -1.1758216458362774, - -1.4823721276813422, - -1.4828710642105545 + -2.350146713773727, + -3.0153140999964485, + -3.469920683414512 ], "(8, 4, 6, 3, 4)": [ - -0.6605012567004881, - -0.42566536207736977, - -0.46713738026613477 + -1.6303584586837996, + -0.47756128523955194, + -0.446363691764821 ], "(8, 4, 8, 6, 4)": [ - -1.237859806895681, + -2.640229625559451, -2.909671961388738, -3.353872243254511 ], @@ -8770,7 +8770,7 @@ ], "(6, 7, 4, 5, 4)": [ -2.4177071753703023, - 0.0, + -3.6944840200675895, 0.0 ], "(10, 6, -1, 4, 5)": [ @@ -8779,9 +8779,9 @@ 0.0 ], "(6, 5, 9, 7, 5)": [ - -1.769038759621842, - -1.753525001876005, - -1.4007192475905166 + -6.76264019981415, + -6.883972108712774, + -8.685710145678922 ], "(8, 2, 5, 6, 5)": [ 0.0, @@ -8794,9 +8794,9 @@ -4.023964102685184 ], "(8, 4, 2, 3, 4)": [ - -1.0919957440676544, - -0.8763898305635155, - -0.9546727363768797 + -5.050470303683081, + -4.195550219832693, + -3.1482966546991125 ], "(6, 3, 7, 8, 5)": [ -3.3648111266915994, @@ -8809,29 +8809,29 @@ -3.2725090593844177 ], "(7, 5, 3, 6, 5)": [ - -0.3878080858209765, - -0.4586127234386136, + -0.367423982516233, + -0.5744358427315345, -0.5874096601021213 ], "(6, 5, 5, 2, 4)": [ -0.8400139973841689, - -1.9092635632661725, - -0.4872854780626123 + -2.838383411448646, + -1.5628716772333902 ], "(8, 5, 2, 2, 4)": [ - -1.2054290629994515, - -1.0911104571301757, - -0.9405162123159121 + -9.337326426984394, + -5.821457112693258, + -5.796813209323581 ], "(7, 4, 5, 4, 4)": [ - -0.5130765653706311, - -0.3039837547383201, - -0.4078969968367359 + -3.8575152189362876, + -0.6801179435427456, + -0.3888821981686692 ], "(6, 5, 1, 3, 4)": [ - -1.370598307088275, - -1.2140001036758652, - -0.9655178275278078 + -3.5275550331657204, + -4.4531311584069435, + -3.5690274440768794 ], "(7, 7, 9, 5, 5)": [ -6.3947783878056175, @@ -8855,18 +8855,18 @@ ], "(8, 4, 7, 3, 4)": [ -0.4964459106389402, - -0.4704536480126022, + -0.3994595547814366, -0.5852632963543993 ], "(8, 5, 5, 2, 4)": [ -0.9299480363073029, - -0.7633475296968253, + -2.74761535043039, -0.9710512223810525 ], "(6, 5, 2, 2, 4)": [ -1.5716385235785173, - -1.1071260533875635, - -1.660249276594277 + -3.18877765910758, + -4.088306431196624 ], "(6, 4, 0, 1, 4)": [ -2.7788685361432557, @@ -8879,14 +8879,14 @@ 0.0 ], "(8, 4, 5, 5, 4)": [ - -0.30754170959792176, - -0.3867360447643776, - -0.398154762384204 + -0.9645399814125466, + -0.17974530483665407, + -1.8889436541092954 ], "(8, 4, 4, 4, 4)": [ - -0.6655843968345045, - -0.4532648861241537, - -0.5346114178517192 + -4.865109987538098, + -1.7989983294341934, + -0.3953774147179688 ], "(6, 2, 2, 3, 4)": [ -4.446230795193292, @@ -8899,9 +8899,9 @@ -3.8531567015686354 ], "(8, 4, 5, 4, 4)": [ - -0.48636571992322414, - -0.33821466164699615, - -0.4178560095113114 + -3.7599505131042648, + -1.2414543542329552, + -0.48582325804268567 ], "(8, 7, 2, 6, 5)": [ -3.888269902330781, @@ -8914,29 +8914,29 @@ -4.201494366001483 ], "(7, 5, 4, 5, 4)": [ - -0.3681146564911571, - -0.3150552819982043, - -0.37216625432454825 + -1.3430459483917732, + -0.19608520111281713, + -0.575468121168431 ], "(6, 5, 4, 5, 5)": [ - -0.447275317716057, - -0.390317535489762, - -0.2861731789613945 + -1.7165478520390702, + -0.25170708534777503, + -0.5706680133949792 ], "(6, 4, 6, 5, 5)": [ - -0.31176643454913733, - -0.4984201267642071, - -0.6464580261098049 + -0.33288821310260835, + -1.471832687245593, + -3.969704186642365 ], "(7, 5, 7, 5, 4)": [ - -0.454600388046398, - -0.6004819885579047, + -0.3936972313631971, + -0.5373093662164184, -0.6361956236056506 ], "(6, 4, 6, 5, 4)": [ - -0.2466109074596947, - -0.42276237498074165, - -0.5273895807151746 + -0.3747490080025255, + -0.43750875639559345, + -1.6870584864079075 ], "(9, 3, 9, 2, 4)": [ -3.0507748487583912, @@ -8954,12 +8954,12 @@ -1.0214016741545284 ], "(7, 4, 8, 5, 5)": [ - -0.734654496916978, + -0.37608494783741575, -0.9231771548960922, - -0.9840007346366821 + -3.869721849681699 ], "(6, 3, 8, 6, 4)": [ - -2.9224528979379065, + -3.9778099026106473, -3.9535724216691177, -2.946075985698053 ], @@ -8969,9 +8969,9 @@ 0.0 ], "(8, 4, 2, 2, 4)": [ - -1.2856400797983305, - -1.479220190157514, - -1.0325555429925368 + -4.041087382623538, + -3.7375737020821145, + -2.222864542954968 ], "(8, 4, 1, 5, 4)": [ -1.9101259341705332, @@ -8981,7 +8981,7 @@ "(6, 5, 1, 4, 4)": [ -1.2196431993101575, -1.193654633755977, - -0.7147946215160037 + -0.7603616039761102 ], "(9, 4, 2, 3, 5)": [ -3.0690434775928437, @@ -8989,18 +8989,18 @@ 0.0 ], "(9, 6, 1, 3, 5)": [ - 0.0, + -26.625614156316313, -1.5569230378637906, -3.5085698846009286 ], "(7, 5, 9, 8, 5)": [ -2.5177808974991382, - -1.5012227037587977, + -5.717134959363947, -3.0666989899562753 ], "(7, 6, 6, 3, 4)": [ -2.0073654861109773, - -0.6155068823334594, + -0.7651113016644836, -2.133698268878138 ], "(7, 6, -1, 1, 4)": [ @@ -9009,12 +9009,12 @@ 0.0 ], "(8, 4, 3, 7, 5)": [ - -0.29916593038258893, + -0.8604276471943189, -0.586154732545138, -1.0733756552041176 ], "(7, 4, 5, 7, 5)": [ - -0.5888208829011281, + -1.8789939142010539, -1.1666451100147974, -2.1779679880182536 ], @@ -9034,14 +9034,14 @@ 0.0 ], "(7, 4, 4, 5, 5)": [ - -0.4626047859591918, - -0.3714016163489118, - -0.41017673004807076 + -1.536604322609909, + -0.4061452550658356, + -0.8934990131523274 ], "(6, 5, 6, 5, 5)": [ - -0.47770258923857406, - -0.5732055128931859, - -0.6463060611900402 + -0.29107505478688256, + -1.1797394198125464, + -4.259421878789851 ], "(6, 2, 2, 4, 5)": [ -4.550741391713991, @@ -9069,19 +9069,19 @@ -1.2714969490230283 ], "(7, 5, 2, 5, 5)": [ - -0.7008440315062118, - -0.5701961609205455, - -0.4579198561297383 + -2.1642952126467607, + -0.42951085653741694, + -0.19321806284698126 ], "(8, 5, 3, 5, 5)": [ - -0.5145525168579437, - -0.444026631164466, - -0.3615749721595373 + -2.2550963525201126, + -0.189608790335923, + -0.3721246685812578 ], "(8, 5, 5, 5, 4)": [ - -0.4093471335376443, - -0.3292512994400742, - -0.4102282257334068 + -0.93359848246984, + -0.20671225382374014, + -1.6521951744339218 ], "(6, 3, -1, 4, 5)": [ 0.0, @@ -9089,14 +9089,14 @@ 0.0 ], "(8, 5, 6, 5, 5)": [ - -0.4533482546858755, - -0.5712557286031982, - -0.6757529844941651 + -0.3419938560744145, + -2.1439544840356177, + -5.013885809946922 ], "(6, 4, 9, 5, 4)": [ - -1.316700229028476, - -1.4884160397785586, - -1.5502764251365981 + -3.6241680117325377, + -3.760314173521068, + -2.9509668312498603 ], "(8, 4, -1, 5, 5)": [ 0.0, @@ -9104,9 +9104,9 @@ 0.0 ], "(6, 5, 9, 5, 5)": [ - -1.782478909930903, - -1.409421627337474, - -1.9933337481865128 + -3.3964520164936736, + -2.7473378766624634, + -3.5810615591081936 ], "(7, 6, 4, 4, 5)": [ -0.9944857562999074, @@ -9115,7 +9115,7 @@ ], "(6, 3, 4, 4, 5)": [ -1.1670029134861601, - -0.6093731689910574, + -0.7415292693553001, -1.0929033687702663 ], "(9, 4, 4, 8, 5)": [ @@ -9130,28 +9130,28 @@ ], "(9, 4, 6, 4, 5)": [ -1.6675289350318232, - -0.6450101125448736, + -0.4898427177868034, -2.3482391593374574 ], "(8, 4, 3, 3, 4)": [ - -0.9128416398780432, - -0.7489079260560576, - -0.5662453334935705 + -3.368928141717163, + -2.366909970485576, + -2.2501523176581237 ], "(8, 4, 0, 6, 5)": [ -1.3874225467135213, - -0.9529945662980273, + -0.6459921876204688, -1.877853330477647 ], "(7, 5, 0, 6, 5)": [ -1.9931441080797678, -2.281263639773196, - -0.8948564760380643 + -0.8674216522705702 ], "(7, 5, 1, 4, 4)": [ -1.093500694988908, -0.9291000927886625, - -0.7844427837242549 + -0.4263080810292057 ], "(8, 7, 1, 4, 4)": [ -5.120517064286651, @@ -9164,19 +9164,19 @@ -6.144424818436434 ], "(6, 5, 4, 4, 4)": [ - -0.6225891315427314, - -0.38464778326757626, - -0.2839971823884083 + -4.840294239857077, + -1.529072499781333, + -0.26109334048628047 ], "(8, 5, 3, 4, 4)": [ - -0.6482979365022216, - -0.5828303953616082, - -0.3856993134664908 + -5.491663771310076, + -2.294281456462722, + -0.23369449910465537 ], "(7, 4, 2, 4, 4)": [ - -0.8583786638893751, - -0.7479417839894089, - -0.5881438371124572 + -3.009237079898783, + -1.7063456167905109, + -0.31180889282248136 ], "(6, 5, 0, 5, 4)": [ -3.2291973450286986, @@ -9190,8 +9190,8 @@ ], "(7, 5, 0, 5, 5)": [ -1.512200798699327, - -1.4093933606266067, - -1.0252091883389471 + -1.225825549792921, + -0.8900500386178715 ], "(7, 4, 0, 5, 4)": [ -2.884689754230073, @@ -9201,17 +9201,17 @@ "(6, 5, 1, 6, 5)": [ -0.7237335231735986, -0.9018967110042502, - -0.5131921928465015 + -0.5127839074345947 ], "(6, 4, 3, 6, 5)": [ - -0.3815974042776076, + -0.3394113605773802, -0.4222403451046005, -0.7771436331245472 ], "(6, 5, 7, 6, 5)": [ - -0.6432030241942758, - -0.922371259322543, - -1.0483136059348146 + -2.8625602484951487, + -2.7780401196862003, + -5.866806580062586 ], "(10, 3, 0, 6, 5)": [ -5.12603012553085, @@ -9220,7 +9220,7 @@ ], "(7, 3, 2, 7, 5)": [ -1.066738013274202, - -1.6001564112929407, + -1.6500286246553788, -1.8212708093660348 ], "(9, 2, 6, 6, 5)": [ @@ -9234,24 +9234,24 @@ -3.9620525567997498 ], "(6, 4, 1, 3, 4)": [ - -1.354713167192363, - -1.4354754945914612, - -1.1066791001035485 + -3.036975527526712, + -2.507347328306106, + -2.4329167491327564 ], "(6, 5, 1, 5, 5)": [ -1.0827642996882185, -0.8197208033285199, - -0.6492291784198896 + -0.5002503033525098 ], "(7, 4, 4, 5, 4)": [ - -0.3606071966198418, - -0.2859756313114396, - -0.40752086454611824 + -0.7112781421936885, + -0.19611459771208933, + -0.7499309416538278 ], "(6, 5, 4, 5, 4)": [ - -0.46917493117667736, - -0.36599881550163427, - -0.25956719712573845 + -0.7312374884544374, + -0.20446195442042078, + -0.6523767229255765 ], "(7, 6, 6, 2, 4)": [ -1.923068033344768, @@ -9274,44 +9274,44 @@ -3.5016302068316016 ], "(6, 4, 7, 7, 5)": [ - -0.8227194114685685, + -1.9623516176608322, -1.5969761355512992, -1.3632406212957013 ], "(6, 5, 9, 6, 4)": [ -3.5668000423694712, -2.8866953479302087, - -1.4506747038546748 + -5.2245051780285205 ], "(7, 4, 9, 6, 4)": [ -3.3554918261665767, - -1.605360810287816, + -3.8505570988272644, -2.3578279504212314 ], "(6, 5, 2, 6, 5)": [ - -0.5266248531206632, + -0.3948304063206872, -0.5324176908016665, - -0.41963578815395486 + -1.3738277757578152 ], "(8, 4, 4, 6, 5)": [ - -0.3472648724674687, - -0.4200528142066677, - -0.7570186496244898 + -0.7596646270574015, + -1.9785828703685642, + -2.9270109425440527 ], "(6, 4, 7, 4, 4)": [ - -0.3741514595947692, - -0.4659709754196883, + -0.48406342114864165, + -0.2869092643595085, -0.5658408826878201 ], "(7, 5, 7, 4, 4)": [ - -0.43403517326054175, - -0.4980873070324715, - -0.5147602297384081 + -0.4350872401579182, + -0.5174407599928597, + -0.7612732282548618 ], "(7, 4, 6, 5, 5)": [ - -0.3145025725695736, - -0.4631453604511366, - -0.6647471051866961 + -0.21225465647618524, + -1.4213363434514807, + -2.3867482320964495 ], "(7, 5, 7, 4, 5)": [ -0.6084309593723302, @@ -9336,17 +9336,17 @@ "(8, 5, 1, 7, 5)": [ -1.0647641825004313, -1.0921243050043292, - -0.4657212620385327 + -0.4856751687060571 ], "(8, 4, 2, 4, 5)": [ - -0.7950406730964719, + -2.9689920905916094, -0.8018030698422377, - -0.5782133403332528 + -0.933070611240976 ], "(6, 4, 0, 4, 5)": [ - -1.5645293279372186, - -1.6648387528219897, - -1.223506873185267 + -5.145324376886607, + -3.4938703094787895, + -2.080002598817215 ], "(6, 5, 1, 7, 5)": [ -1.381653296094578, @@ -9369,18 +9369,18 @@ 0.0 ], "(10, 6, 6, 5, 4)": [ - -1.5880366608549212, - -3.2740698303177984, + -1.535637605288093, + -2.3340087946229517, -2.8396381394416546 ], "(7, 4, 2, 5, 5)": [ - -0.6353586112647391, - -0.5302428002626568, - -0.44243848368300775 + -2.3866193474541717, + -0.22675501258502312, + -0.3092698148854101 ], "(6, 3, 6, 3, 4)": [ -1.2510911553905513, - -0.7552055664393408, + -0.8566389555214057, -1.5152683734344319 ], "(8, 5, -1, 8, 5)": [ @@ -9390,37 +9390,37 @@ ], "(6, 4, 1, 4, 5)": [ -1.3919142180374184, - -1.1715234963118053, - -1.0218011769087343 + -2.1778443024438627, + -1.4194787547883951 ], "(7, 4, 1, 4, 5)": [ -1.1918141962676867, -0.994451109593106, - -0.9336451571503914 + -0.7665807019224323 ], "(8, 5, 6, 2, 4)": [ - -0.7549840545808645, + -3.5403947199529036, -1.2392861237214343, - -0.3432965886521838 + -1.136175338488463 ], "(8, 5, 3, 2, 4)": [ - -1.147991381418069, + -3.252079514526211, -1.301110236601709, -1.3254307022150118 ], "(8, 5, 7, 3, 4)": [ -0.49101002255351106, - -0.38351427544222855, + -0.40633955136565875, -0.5415367470660053 ], "(6, 4, 2, 2, 4)": [ -1.96919381581496, - -1.688683536880107, - -0.9063028420452924 + -3.391329335683719, + -2.9691601773476854 ], "(8, 4, 1, 3, 5)": [ -3.0164604451018096, - -1.4200739715847828, + -2.901536667526897, -2.753545375607497 ], "(8, 7, 2, 3, 4)": [ @@ -9439,9 +9439,9 @@ 0.0 ], "(8, 5, 3, 3, 4)": [ - -0.9374950808176497, - -0.6714729310952562, - -0.5320697688068436 + -6.468450099308578, + -3.0590461365589228, + -2.2677767517600373 ], "(6, 4, -1, 6, 5)": [ 0.0, @@ -9454,14 +9454,14 @@ -1.2965111848893172 ], "(6, 4, 8, 7, 5)": [ - -1.0647646393577341, - -1.9524639210332522, - -1.4575208798075778 + -6.78379200110043, + -6.656074647785161, + -6.428268461419947 ], "(6, 5, 8, 6, 5)": [ - -1.3247904653073772, - -1.1210564680581971, - -1.6339006272750187 + -4.05632894495108, + -3.37390421813891, + -3.360011299134616 ], "(7, 7, 0, 4, 5)": [ -6.893610226952205, @@ -9486,22 +9486,22 @@ "(9, 3, 1, 3, 5)": [ -4.234432999131217, -5.455395484951198, - -3.7963869577410176 + -4.495804693882836 ], "(8, 5, 6, 4, 5)": [ -1.5479902264054763, - -0.4757581441668356, + -0.45636910845109424, -0.8881555879837068 ], "(8, 5, 6, 6, 5)": [ - -0.7269159161106478, - -0.6900120521107376, - -0.9527306022393088 + -2.3585526198138203, + -3.1917927476273285, + -2.431271902986628 ], "(6, 5, 3, 3, 4)": [ - -1.4246593407205543, - -0.8237825896518363, - -0.5235241843705813 + -2.8157717977483956, + -2.4552808407022773, + -2.1667667423604833 ], "(9, 2, 4, 4, 4)": [ -4.481121860605591, @@ -9519,14 +9519,14 @@ -6.418088506406021 ], "(8, 5, 9, 8, 5)": [ - -2.171031208619606, - -1.4989159159953014, + -5.462942771015645, + -5.737669950067878, -3.277528619378447 ], "(6, 5, 4, 2, 4)": [ -1.8277915420166566, -1.8095932672312804, - -0.5594751604641426 + -1.2141335605383043 ], "(10, 5, 0, 2, 5)": [ -5.535614543799714, @@ -9534,9 +9534,9 @@ 0.0 ], "(8, 5, 5, 7, 5)": [ - -0.5411903971518827, - -0.9441066761828912, - -1.3337538080299502 + -1.3348505795257757, + -2.107039319423715, + -6.139829524230725 ], "(8, 7, 2, 4, 4)": [ -5.468044394328787, @@ -9574,29 +9574,29 @@ -2.617632497607631 ], "(7, 4, 6, 4, 4)": [ - -0.21542236578237117, - -0.4321103919496318, - -0.44442879437020855 + -0.6445406487071049, + -0.3403840466501001, + -1.4074166368596845 ], "(8, 4, 4, 3, 4)": [ - -0.7724255501119279, - -0.5638935406802222, - -0.4462537138333659 + -1.9995990567398683, + -2.011984195896363, + -1.7246974471920713 ], "(7, 5, 4, 5, 5)": [ - -0.44710335328286877, - -0.4658235162170544, - -0.24585279357047476 + -1.8452393290064866, + -0.23064017478293117, + -0.590735941990361 ], "(6, 4, 4, 5, 5)": [ - -0.4679674924900871, - -0.3540689192053305, - -0.43175992491472204 + -1.639548483410937, + -0.2928089721254685, + -0.7025746515393824 ], "(7, 5, 8, 7, 5)": [ - -1.0258869333861123, - -1.3861192345376079, - -1.3648866293005544 + -3.6095564729223826, + -5.502020466605097, + -5.053101842447141 ], "(8, 4, -1, 6, 4)": [ 0.0, @@ -9605,13 +9605,13 @@ ], "(6, 5, 3, 6, 5)": [ -0.7707243939448936, - -0.3646766045710678, - -0.5020128113070418 + -0.6586919226675974, + -1.505374155169667 ], "(8, 4, 5, 2, 4)": [ - -1.0587441583331103, - -0.8443001284586453, - -0.5949321585162347 + -3.2841587597649804, + -2.0194192174639505, + -1.2103333801199612 ], "(9, 4, -1, 2, 5)": [ 0.0, @@ -9626,7 +9626,7 @@ "(7, 7, 4, 5, 5)": [ -4.478464015454725, -3.9938363273602584, - -2.932251623633859 + -2.851676625497164 ], "(7, 2, 4, 4, 4)": [ 0.0, @@ -9636,7 +9636,7 @@ "(8, 2, 3, 4, 4)": [ -4.588784491349645, -4.267766526994009, - 0.0 + -3.897008034350584 ], "(7, 5, -1, 7, 4)": [ 0.0, @@ -9655,11 +9655,11 @@ ], "(7, 4, 3, 6, 5)": [ -0.47611593045904865, - -0.3252125216537785, + -0.5225954861315537, -0.6256167287652019 ], "(6, 4, 0, 6, 5)": [ - -1.159009460172267, + -0.9294762100099588, -2.8033263246630207, -1.826055556089759 ], @@ -9669,9 +9669,9 @@ -1.3005550169525575 ], "(6, 4, 5, 5, 4)": [ - -0.1526305235950865, - -0.35737930082565356, - -0.39359536042339066 + -0.8275860676037003, + -0.2507005057303294, + -1.6991634389735997 ], "(8, 3, 6, 6, 4)": [ 0.0, @@ -9704,7 +9704,7 @@ -2.53733404643167 ], "(6, 4, 9, 3, 4)": [ - -1.0158634721257633, + -0.8875753724823289, -1.3014139086662553, -2.2616993580262186 ], @@ -9714,14 +9714,14 @@ -0.8791089210836223 ], "(7, 5, 6, 6, 5)": [ - -0.5464191658637974, - -0.7064677886967481, - -0.9852042374382068 + -1.7114653761486962, + -2.324221544643331, + -2.8666251604848707 ], "(7, 4, 6, 3, 4)": [ -0.7267381303128148, - -0.236469309867893, - -0.446486913196588 + -0.4432709802830289, + -0.49067565657029755 ], "(9, 3, -1, 7, 4)": [ 0.0, @@ -9804,7 +9804,7 @@ -0.6132435936054171 ], "(7, 4, 8, 8, 5)": [ - -1.5029039907216006, + -3.964827846182194, -3.141474888639839, -3.4538730622130602 ], @@ -9824,9 +9824,9 @@ -1.2983822272619543 ], "(7, 5, 2, 3, 4)": [ - -1.059281484980069, - -0.7902100154805696, - -0.5741275573060399 + -4.511526213433707, + -3.976546740309056, + -2.849199415127887 ], "(10, 3, 3, 7, 5)": [ 0.0, @@ -9835,7 +9835,7 @@ ], "(8, 5, 9, 3, 4)": [ -1.282273022990957, - -1.1428977266081548, + -0.7268942111700607, -2.1494027067083317 ], "(9, 5, 9, 7, 4)": [ @@ -9854,9 +9854,9 @@ 0.0 ], "(7, 5, 2, 4, 4)": [ - -0.9834862183900334, - -0.6462226371050894, - -0.5102075661887296 + -4.359996439010838, + -1.9650567611905674, + -0.1681424659935371 ], "(6, 4, 5, 7, 5)": [ -0.5820292591429463, @@ -9871,10 +9871,10 @@ "(7, 4, 1, 6, 5)": [ -0.7731554112484759, -0.6964090153463358, - -0.6077063110066775 + -0.5318426174980558 ], "(6, 5, 6, 7, 5)": [ - -0.7377917937217445, + -1.6733660066290046, -1.9706370129276927, -2.3245234585293426 ], @@ -9885,7 +9885,7 @@ ], "(7, 2, 1, 4, 5)": [ -5.299094891728014, - -5.640179550255415, + -6.128144753762163, 0.0 ], "(6, 5, 9, 3, 4)": [ @@ -9909,9 +9909,9 @@ 0.0 ], "(7, 5, 4, 6, 5)": [ - -0.2551808510718083, - -0.47710161723165956, - -0.7299267927687543 + -0.652519325894918, + -2.071632138720883, + -1.7634405170812117 ], "(6, 4, 3, 5, 4)": [ -1.4307413300889908, @@ -9929,14 +9929,14 @@ 0.0 ], "(7, 4, 9, 3, 4)": [ - -0.9326320584632831, + -0.8100010651918083, -2.6902327150778835, -2.3636186897212794 ], "(8, 5, 8, 2, 4)": [ -0.7504353575962355, - -0.5697259140306975, - -0.9820435092026917 + -0.44928234923638444, + -0.823123371444928 ], "(7, 5, 7, 2, 4)": [ -1.4759282772889104, @@ -9944,19 +9944,19 @@ -0.27799668512579667 ], "(8, 4, 4, 4, 5)": [ - -0.45177106654844645, - -0.40285617139691043, - -0.44719881056990496 + -1.1348758420335037, + -0.5792979927806455, + -0.9212006005184475 ], "(8, 5, 4, 4, 5)": [ - -0.4345198655554468, - -0.35753008433777145, - -0.3113066129140938 + -1.3193505754939188, + -0.7648263871067016, + -0.8669770643586285 ], "(6, 4, 2, 4, 5)": [ -1.2342765313654616, -0.8551151627417237, - -0.5905118600947946 + -1.0204051148869078 ], "(9, 2, 1, 2, 4)": [ -5.559305646175361, @@ -9999,7 +9999,7 @@ 0.0 ], "(7, 4, 6, 7, 5)": [ - -0.7122274130682187, + -1.4621731605866706, -1.664130717682861, -1.081351665652332 ], @@ -10016,7 +10016,7 @@ "(6, 5, 6, 2, 4)": [ -2.2585972232869103, -0.5037713584532345, - -0.1490071918272887 + -0.1984311265342351 ], "(7, 7, 3, 4, 4)": [ -4.176348076396744, @@ -10024,19 +10024,19 @@ -3.5879625474788783 ], "(6, 4, 5, 4, 4)": [ - -0.4388461387351386, - -0.2400196798469931, - -0.34550014930601686 + -3.659029839057404, + -0.9428244016639902, + -0.388643538516253 ], "(6, 4, 5, 6, 5)": [ - -0.37512776030582506, - -0.5477022667561647, - -0.764420095708173 + -1.0415985325098291, + -1.430491969742993, + -2.0843606591890307 ], "(7, 6, 7, 2, 4)": [ -3.53920453502954, -2.0813946523027407, - -1.2946331401996374 + -1.1273342142588407 ], "(6, 4, -1, 2, 5)": [ 0.0, @@ -10044,9 +10044,9 @@ 0.0 ], "(6, 4, 5, 3, 4)": [ - -0.671688131079808, - -0.4463394405986544, - -0.4219775916609288 + -1.7555528368581257, + -1.033899457866239, + -0.7416448752803144 ], "(7, 5, -1, 3, 5)": [ 0.0, @@ -10099,9 +10099,9 @@ 0.0 ], "(7, 4, 4, 4, 5)": [ - -0.40699614823818686, - -0.4059976083639969, - -0.4153784383724976 + -0.7810265151900951, + -0.653864035919619, + -0.8007047351811316 ], "(10, 3, 1, 5, 4)": [ -4.500044804372572, @@ -10110,22 +10110,22 @@ ], "(8, 4, 6, 2, 4)": [ -0.7523078220149986, - -1.1553217526123585, + -2.0572908173299984, -0.9075508841454618 ], "(6, 4, 9, 4, 4)": [ - -1.5458519966343072, - -1.0771444357440654, + -1.3398374189425404, + -0.713909410989552, -1.7667351782436602 ], "(8, 5, 7, 6, 5)": [ - -0.7387842373750014, - -0.9144669647738428, - -1.0503779540499227 + -3.0412349062386967, + -3.640411640730727, + -5.062842631859432 ], "(6, 2, 4, 5, 5)": [ -3.808744505056247, - -3.228192406720702, + -2.9480503470644837, -4.043411450374058 ], "(8, 4, 9, 2, 4)": [ @@ -10134,7 +10134,7 @@ -1.8984931351546894 ], "(7, 5, 8, 3, 4)": [ - -0.5079362565368283, + -0.5257483366502942, -0.8295321888627009, -0.8748344859259447 ], @@ -10144,13 +10144,13 @@ -0.6256976205891901 ], "(6, 4, 4, 5, 4)": [ - -0.4097399623679524, - -0.3318515793604131, - -0.4023190193018788 + -1.130830725697518, + -0.20815737147594388, + -0.5955278967086062 ], "(6, 5, 8, 3, 4)": [ - -0.5317265849795176, - -0.793037123993033, + -0.5215068537738266, + -0.6673606136174425, -0.7926080077198747 ], "(7, 5, 0, 2, 5)": [ @@ -10165,8 +10165,8 @@ ], "(6, 5, 4, 3, 4)": [ -0.8614662746072379, - -0.540020106448509, - -0.3032464088016415 + -2.050458334609305, + -0.9545952609157429 ], "(6, 5, 2, 5, 4)": [ -1.0712515838324228, @@ -10274,24 +10274,24 @@ 0.0 ], "(6, 5, 4, 4, 5)": [ - -0.4121673478562442, - -0.29338814725483786, - -0.18613164017733885 + -1.0286733131490922, + -0.6858567954092292, + -0.8190578615382518 ], "(6, 5, 3, 4, 4)": [ - -0.8153984437299968, - -0.5717995032161232, - -0.3520611505403654 + -3.1564750043422465, + -1.5559907457273745, + -0.33306502656321174 ], "(7, 4, 4, 4, 4)": [ - -0.5991737757853159, - -0.4571855141591353, - -0.3941334205112823 + -4.5498644301911115, + -1.553145046884208, + -0.3053001432983703 ], "(6, 5, 3, 4, 5)": [ -0.7009983485122736, - -0.4302733657455326, - -0.24900211610838888 + -0.62637976234799, + -0.4269738041253248 ], "(8, 5, 0, 1, 4)": [ -2.812517475320817, @@ -10329,9 +10329,9 @@ 0.0 ], "(7, 3, 4, 4, 5)": [ - -0.6551761587369267, - -0.9798471567868238, - -1.1806694945302703 + -0.9863690744861066, + -0.9521043291152196, + -1.4998668626165554 ], "(7, 3, -1, 5, 4)": [ 0.0, @@ -10354,7 +10354,7 @@ 0.0 ], "(6, 4, 7, 5, 5)": [ - -0.47669954643764534, + -0.14550785200050087, -0.6590192882145788, -0.9085257704644276 ], @@ -10369,14 +10369,14 @@ 0.0 ], "(6, 5, 5, 5, 4)": [ - -0.40833219521329556, - -0.43490765691775524, - -0.34640257425472265 + -1.1124533142420867, + -0.22400656249308637, + -1.6346394640169115 ], "(6, 5, 2, 7, 5)": [ -0.9999608121492451, -1.2537285160183722, - -0.3973000876368242 + -2.051393824315678 ], "(7, 5, -1, 8, 5)": [ 0.0, @@ -10384,14 +10384,14 @@ 0.0 ], "(7, 5, 5, 5, 4)": [ - -0.4128395826687489, - -0.2739182219898195, - -0.3655574982378953 + -0.8960966867047157, + -0.20412424389194528, + -1.7104366219554712 ], "(7, 5, 5, 5, 5)": [ - -0.4553240595978428, - -0.41300868511054095, - -0.5099599722324786 + -0.8386306116494593, + -1.1637628416536092, + -4.136826568174027 ], "(8, 2, 5, 4, 4)": [ -4.263440901134105, @@ -10399,9 +10399,9 @@ -3.8339710712975013 ], "(6, 5, 6, 6, 5)": [ - -0.624321956460258, - -0.7028487038655549, - -0.8963746221644561 + -2.2305168969479032, + -2.867237580902403, + -2.2682751033284747 ], "(7, 5, -1, 3, 4)": [ 0.0, @@ -10409,9 +10409,9 @@ 0.0 ], "(7, 5, 3, 3, 4)": [ - -1.1856606432947008, - -0.7616244206349875, - -0.47669679458377323 + -2.4863233175979693, + -2.410606443298882, + -1.9144994768774675 ], "(6, 6, 1, 3, 5)": [ -3.289024359093437, @@ -10419,8 +10419,8 @@ -2.5229295087364703 ], "(8, 5, 2, 7, 5)": [ - -0.8845307959556978, - -0.4426922562471348, + -0.7517365476802902, + -2.1764731277552247, -0.942701855355822 ], "(9, 5, 7, 8, 5)": [ @@ -10431,7 +10431,7 @@ "(7, 5, 3, 4, 5)": [ -0.7075144044903141, -0.7524559210888914, - -0.26912210362902844 + -0.30389948574751546 ], "(6, 7, 4, 4, 4)": [ -5.0177089041944285, @@ -10439,14 +10439,14 @@ 0.0 ], "(8, 2, 1, 2, 4)": [ - 0.0, + -42.29361686413166, -5.716506367127536, 0.0 ], "(7, 4, 3, 3, 4)": [ - -0.962764338556492, - -0.6583646448898235, - -0.5879820105509002 + -2.5368272925230344, + -1.588177414485933, + -1.5596630950600234 ], "(7, 5, 9, 3, 4)": [ -1.0138576452521673, @@ -10459,7 +10459,7 @@ -1.3430811599532522 ], "(6, 4, 7, 2, 4)": [ - -0.404801525765961, + -2.136823669925725, -0.6542858158619858, -0.7900509091212393 ], @@ -10486,11 +10486,11 @@ "(7, 5, 1, 7, 5)": [ -1.3567148201862151, -1.5425148901675532, - -0.4500759079062684 + -0.35955344197665967 ], "(8, 4, 3, 6, 5)": [ - -0.38003853059898485, - -0.29420108880839313, + -0.24189039899223422, + -0.4396877441558607, -0.5044138825216045 ], "(6, 5, -1, 7, 5)": [ @@ -10520,7 +10520,7 @@ ], "(7, 4, 4, 7, 5)": [ -1.0308832592562833, - -0.587873646829472, + -2.6366393781872715, -1.2325354753070743 ], "(9, 5, 1, 1, 4)": [ @@ -10574,9 +10574,9 @@ -2.824833469499583 ], "(6, 4, 3, 5, 5)": [ - -0.5072497243691478, - -0.43185942212329026, - -0.43042939997655116 + -1.9479783705714615, + -0.2039151017954483, + -0.3163560802453325 ], "(6, 7, -1, 2, 4)": [ 0.0, @@ -10594,8 +10594,8 @@ 0.0 ], "(6, 4, 7, 3, 4)": [ - -0.49944361113512453, - -0.45573638136228606, + -0.5135946067132986, + -0.5306805194631279, -0.5720795702077089 ], "(7, 5, -1, 1, 4)": [ @@ -10620,17 +10620,17 @@ ], "(7, 5, 5, 3, 4)": [ -0.7476064033924197, - -0.4390060573622721, - -0.25755407518247686 + -0.9174256994633103, + -0.35529017229132787 ], "(7, 5, 4, 2, 4)": [ -1.6912879691761236, -2.0605493980456204, - -0.5174808023550468 + -1.1582191617889002 ], "(6, 5, 7, 7, 5)": [ - -0.9974637186060361, - -1.3603585821775275, + -2.0975900153841502, + -3.129879935400661, -1.6422234911859426 ], "(7, 4, -1, 2, 5)": [ @@ -10654,24 +10654,24 @@ 0.0 ], "(6, 4, 4, 4, 5)": [ - -0.4062293572433995, - -0.39369488177825807, - -0.39045789971661715 + -1.5313823639337991, + -0.5957261125732759, + -0.7502819712506515 ], "(6, 4, 3, 3, 4)": [ - -1.3523432857563007, - -0.7251353985811135, - -0.6157208827346129 + -2.8950137694590743, + -1.7026760046350893, + -1.7809132140961106 ], "(6, 4, 3, 4, 4)": [ - -0.7163003902215275, - -0.5764822393732215, - -0.5201095883000635 + -3.5384238887396258, + -2.110558927958395, + -0.28467146830487 ], "(6, 4, 5, 5, 5)": [ - -0.3769304927399701, - -0.3868703356117487, - -0.596949186301133 + -0.5850315153225077, + -1.4124289591237653, + -3.440914042300255 ], "(7, 5, -1, 5, 4)": [ 0.0, @@ -10694,7 +10694,7 @@ 0.0 ], "(6, 5, 5, 7, 5)": [ - -0.6739652312987425, + -1.5168573685756752, -1.7088634700176821, -1.2954606093712244 ], @@ -10705,7 +10705,7 @@ ], "(6, 4, 0, 3, 5)": [ -2.2748460877701158, - -1.5236825374217866, + -3.761634989962551, -2.8925827872183647 ], "(9, 6, 4, 8, 5)": [ @@ -10716,7 +10716,7 @@ "(6, 5, 0, 6, 5)": [ -2.641879818072755, -2.4739643834342564, - -0.8801851771689632 + -0.766873458478282 ], "(9, 4, 1, 1, 4)": [ 0.0, @@ -10729,14 +10729,14 @@ 0.0 ], "(7, 4, 7, 2, 4)": [ - -0.8967620041695028, - -0.4197284796496947, + -0.8062748014631934, + -0.48902459946322346, -0.6322683844668149 ], "(7, 5, 6, 5, 5)": [ - -0.4575239274125074, - -0.5490106775107645, - -0.641831915427453 + -0.29400862345275275, + -1.1631238317410384, + -3.745732500051796 ], "(7, 4, 7, 4, 5)": [ -1.1670853297823718, @@ -10784,9 +10784,9 @@ -3.0462523023198855 ], "(7, 5, 4, 4, 5)": [ - -0.3445644559362584, - -0.3424308099100322, - -0.22797857018467707 + -0.8478901626435664, + -0.7050721725812907, + -0.567979506090972 ], "(6, 5, 9, 8, 5)": [ -2.269454681691996, @@ -10809,28 +10809,28 @@ 0.0 ], "(6, 4, 4, 6, 5)": [ - -0.30296521517339037, - -0.429392735837018, - -0.6596295234394969 + -0.9743239858011559, + -1.6684536428312364, + -1.8292134423043898 ], "(7, 4, 3, 4, 4)": [ - -0.7047510002326519, - -0.6486962204896242, - -0.48629422682471923 + -4.474024754230083, + -1.8388078423007674, + -0.19493911917779655 ], "(6, 5, 5, 6, 5)": [ - -0.5001294446398128, - -0.6082273549101218, - -0.7469977127889744 + -1.7457431311400122, + -1.893804811658218, + -2.00112787854433 ], "(6, 2, 5, 5, 4)": [ -3.3351446482920037, -3.3365424622909505, - 0.0 + -6.518189896252242 ], "(10, 4, 0, 7, 5)": [ -3.840904678741285, - -3.511740031391822, + -2.7686761430841074, -3.749489804665892 ], "(7, 3, 6, 6, 4)": [ @@ -10844,39 +10844,39 @@ 0.0 ], "(7, 5, 4, 3, 4)": [ - -0.8814106826850823, - -0.5171423979695972, - -0.37634702609790416 + -2.545914235443161, + -1.3022193940085782, + -1.1131488896704276 ], "(8, 4, 3, 4, 5)": [ -0.6144319785303959, -0.5665324579255488, - -0.4433298364360545 + -0.31309535031957936 ], "(6, 4, 3, 4, 5)": [ -0.7111272219554912, -0.5710117482460073, - -0.3437990453125625 + -0.5498994245587852 ], "(6, 5, 6, 4, 4)": [ - -0.3222843301272937, - -0.44189307176926235, - -0.42472744479895796 + -0.6774296155472055, + -0.40493656427681024, + -1.0895882636668244 ], "(6, 4, 5, 4, 5)": [ - -0.33654305105920834, - -0.3157503596802641, + -0.6188663135882434, + -0.17900610592379207, -0.679687965852438 ], "(6, 5, 6, 3, 4)": [ -0.5827970591754603, -0.6536469308377892, - -0.3053333383998751 + -0.36214442118045176 ], "(6, 5, 5, 4, 5)": [ - -0.35361644411720017, - -0.4204316371149369, - -0.4437593747949486 + -0.6069317834382322, + -0.1897926028666227, + -0.7268983529681928 ], "(8, 6, 5, 8, 5)": [ -3.8270446391030175, @@ -10886,7 +10886,7 @@ "(7, 4, 6, 2, 4)": [ -0.6453577302023811, -0.9569420320061319, - -0.4169895535802429 + -0.4453455821750595 ], "(7, 4, 3, 2, 4)": [ -1.7902024941478007, @@ -10894,7 +10894,7 @@ -1.4511564416528797 ], "(7, 5, 2, 7, 5)": [ - -0.3810006060740663, + -0.39799595809122806, -1.2257790021617352, -0.811382467130608 ], @@ -10914,9 +10914,9 @@ -1.7037779141348226 ], "(7, 5, 6, 5, 4)": [ - -0.3005289816695888, - -0.528886376957064, - -0.48268997603145125 + -0.399136097367952, + -0.524495905565155, + -1.919608130306074 ], "(7, 7, 2, 6, 5)": [ -3.7857601475360223, @@ -10929,14 +10929,14 @@ -2.298718690461978 ], "(6, 7, 1, 3, 4)": [ - 0.0, + -25.77258699019652, -5.779002394864055, 0.0 ], "(6, 5, 5, 5, 5)": [ - -0.37755628687631737, - -0.45836972838771733, - -0.5834800401220008 + -0.6908153052548254, + -1.1261265420951303, + -3.4432617995932038 ], "(6, 7, 2, 4, 5)": [ -4.862072148857919, @@ -10986,7 +10986,7 @@ "(7, 6, 3, 4, 5)": [ -1.641316110035963, -2.672860464909251, - -0.7303192135361307 + -0.6842237192148782 ], "(7, 5, 9, 2, 4)": [ -2.005421969254476, @@ -10995,7 +10995,7 @@ ], "(9, 6, 5, 4, 5)": [ -2.1172037257044067, - -1.0314117274891328, + -1.108147951513644, -1.8177844862970125 ], "(9, 6, 9, 2, 4)": [ @@ -11005,8 +11005,8 @@ ], "(6, 5, 5, 3, 4)": [ -0.70710566412956, - -0.3655201210593841, - -0.23155662662377513 + -0.8470928994604985, + -0.5875112961720869 ], "(8, 7, 2, 7, 5)": [ 0.0, @@ -11014,9 +11014,9 @@ 0.0 ], "(7, 4, 6, 5, 4)": [ - -0.33051844670537134, - -0.42872274833565954, - -0.5200148814851359 + -0.3133390653617847, + -0.454956574710282, + -1.9335124871506693 ], "(6, 4, 2, 7, 5)": [ -0.25907123132937887, @@ -11031,7 +11031,7 @@ "(8, 5, 4, 7, 5)": [ -0.5594485268486677, -1.088202827800619, - -1.0190025047264204 + -3.012607273290274 ], "(6, 4, 7, 4, 5)": [ -0.9314105459906215, @@ -11075,7 +11075,7 @@ ], "(7, 4, 2, 7, 5)": [ -0.9565352391097293, - -0.44596404379507215, + -0.41565725940528014, -1.3498266571978115 ], "(7, 5, 6, 2, 4)": [ @@ -11124,7 +11124,7 @@ 0.0 ], "(7, 2, 4, 5, 5)": [ - -3.3219105246970964, + -2.7355067519946235, -3.8072017567729732, -3.958362412919363 ], @@ -11145,18 +11145,18 @@ ], "(6, 4, 6, 2, 4)": [ -1.208092549033361, - -0.5295285507184327, + -1.5024433293480428, -0.8395832490467349 ], "(6, 4, 8, 8, 5)": [ - -1.640513149044167, + -4.582447475275782, -3.566565382284528, -3.6443678315390593 ], "(7, 4, 3, 4, 5)": [ -0.7365157445308328, -0.508109562749683, - -0.3725569289946017 + -0.4048296507727537 ], "(6, 2, 6, 3, 4)": [ 0.0, @@ -11199,9 +11199,9 @@ 0.0 ], "(7, 4, 6, 6, 5)": [ - -0.48667111997655843, - -0.6846661619153722, - -1.073877792325081 + -1.9208449780114425, + -2.469755316656073, + -3.012955022817735 ], "(9, 4, 0, 2, 5)": [ -3.3398220105910084, @@ -11215,8 +11215,8 @@ ], "(6, 4, 6, 3, 4)": [ -0.6112758935171383, - -0.27818279251919503, - -0.41918544419212844 + -0.40584060147402273, + -0.40046971378929586 ], "(6, 7, 9, 4, 4)": [ -5.294862755058235, @@ -11264,23 +11264,23 @@ 0.0 ], "(7, 5, 9, 6, 4)": [ - -3.367569374229565, - -1.583151206227692, - -3.3190609820610812 + -4.530078983467353, + -3.711195454049766, + -6.16925096798991 ], "(10, 5, 6, 4, 5)": [ -2.64624865739977, - -1.1609886687304147, + -1.0228269147832594, -2.636665387211548 ], "(8, 4, 2, 3, 5)": [ -2.0617915314567825, -2.6771366211668672, - -1.417697472417855 + -1.7968325830828866 ], "(7, 4, 4, 2, 4)": [ -1.6420722561146002, - -0.8131037907738122, + -2.097227432187253, -1.7663337740960925 ], "(9, 4, 6, 8, 5)": [ @@ -11340,7 +11340,7 @@ ], "(6, 5, 6, 4, 5)": [ -0.6697692329338125, - -0.4610040766918517, + -0.4519120232705631, -1.5772475832282233 ], "(8, 3, 0, 7, 5)": [ @@ -11366,7 +11366,7 @@ "(6, 5, 7, 2, 4)": [ -0.7575242560859798, -1.168083456802882, - -0.266075296839871 + -0.22194825595004014 ], "(8, 5, 0, 2, 5)": [ -2.530339646915817, @@ -11385,7 +11385,7 @@ ], "(7, 3, 4, 8, 5)": [ -3.6569988005069627, - 0.0, + -32.55080911278994, 0.0 ], "(7, 5, 3, 7, 5)": [ @@ -11426,12 +11426,12 @@ "(7, 4, 8, 2, 4)": [ -1.3979602709162273, -1.288800637398774, - -0.6548600831379449 + -0.5839436700739244 ], "(8, 4, 0, 2, 5)": [ -2.4101456758068442, -2.2816357253742616, - -2.0133856884764842 + -4.150783290234917 ], "(6, 2, -1, 4, 5)": [ 0.0, @@ -11461,7 +11461,7 @@ "(6, 5, 3, 5, 4)": [ -1.0144788587153604, -1.49098220266283, - -0.33104730659997994 + -0.29747445798424993 ], "(7, 5, -1, 5, 5)": [ 0.0, @@ -11479,9 +11479,9 @@ -5.2260490079404756 ], "(7, 5, 5, 4, 5)": [ - -0.754578961092299, - -0.4507247043193938, - -0.3860693850369459 + -0.7625280725185393, + -0.25276561704979306, + -0.8901379699159899 ], "(6, 4, -1, 4, 4)": [ 0.0, @@ -11514,9 +11514,9 @@ 0.0 ], "(7, 4, 5, 4, 5)": [ - -0.22860351381123267, - -0.33317822224702454, - -0.622416814334214 + -0.6289064090460972, + -0.21235535042210302, + -1.2830813291594674 ], "(8, 7, 5, 6, 5)": [ -4.049129514199788, @@ -11566,7 +11566,7 @@ "(7, 3, 7, 6, 4)": [ -4.000733804732523, -2.657992031386372, - 0.0 + -23.830842471022358 ], "(7, 5, 8, 4, 5)": [ -1.5736615534689946, @@ -11625,7 +11625,7 @@ ], "(7, 3, 5, 4, 5)": [ -1.005096395065568, - -0.601773643251813, + -0.7867020274521568, -1.4355746567286878 ], "(7, 4, -1, 5, 5)": [ @@ -11715,7 +11715,7 @@ ], "(9, 4, 7, 6, 4)": [ -1.112688171988907, - 0.0, + -11.392200524074118, 0.0 ], "(8, 7, 2, 5, 5)": [ @@ -11734,7 +11734,7 @@ -2.675765359400308 ], "(6, 4, 6, 4, 5)": [ - -0.3916630968611017, + -0.38384908631951764, -0.8737290398216547, -0.905587624556835 ], @@ -12016,7 +12016,7 @@ "(7, 7, 4, 4, 4)": [ -4.744866365001842, -3.5079125080208726, - -3.369463045380982 + -2.734410181484318 ], "(6, 4, 2, 3, 5)": [ -2.136187999389911, @@ -12045,7 +12045,7 @@ ], "(6, 6, 8, 6, 4)": [ -2.235151566896168, - 0.0, + -18.49410398082036, 0.0 ], "(7, 4, 7, 8, 5)": [ @@ -12159,7 +12159,7 @@ 0.0 ], "(7, 7, 5, 5, 4)": [ - 0.0, + -5.624055451937241, -3.6748955140188615, 0.0 ], @@ -12220,8 +12220,33 @@ ], "(9, 2, 5, 5, 4)": [ -3.5631651150817296, + -3.462937740523019, + 0.0 + ], + "(9, 7, 7, 3, 4)": [ + -4.302888618954546, + 0.0, + 0.0 + ], + "(6, 7, 7, 5, 4)": [ + -3.5790002210700838, + 0.0, + 0.0 + ], + "(6, 2, 9, 6, 5)": [ + -21.821999947291896, + 0.0, + 0.0 + ], + "(6, 2, 4, 5, 4)": [ + -6.475365757505777, 0.0, 0.0 + ], + "(6, 7, 6, 5, 5)": [ + 0.0, + 0.0, + -12.335488389099684 ] } } \ No newline at end of file diff --git a/ruff.toml b/ruff.toml index 1ffd546..edaaf2d 100644 --- a/ruff.toml +++ b/ruff.toml @@ -186,7 +186,7 @@ raises-require-match-for = [ ] [lint.pydocstyle] -convention = "numpy" +convention = "google" [format] docstring-code-format = true diff --git a/scripts/analyse_q.py b/scripts/analyse_q.py index 96a0547..c44fedb 100644 --- a/scripts/analyse_q.py +++ b/scripts/analyse_q.py @@ -7,7 +7,7 @@ [energy, pos, speed, distance, sector] -Examples +Examples: -------- .. code-block:: bash @@ -31,7 +31,7 @@ def _build_dummy_env() -> AntiPendulumEnv: """Build a minimal env to satisfy the ``QLearningAgent`` constructor. - Returns + Returns: ------- AntiPendulumEnv Environment with discrete observation space. diff --git a/scripts/play_ppo.py b/scripts/play_ppo.py index f2ad02f..6b81824 100644 --- a/scripts/play_ppo.py +++ b/scripts/play_ppo.py @@ -1,6 +1,6 @@ """Run a trained PPO agent on the AntiPendulumEnv. -Examples +Examples: -------- .. code-block:: bash diff --git a/scripts/play_q.py b/scripts/play_q.py index 1f7f322..0f5ced3 100644 --- a/scripts/play_q.py +++ b/scripts/play_q.py @@ -1,6 +1,6 @@ """Run a trained Q-learning agent on the AntiPendulumEnv. -Examples +Examples: -------- .. code-block:: bash diff --git a/scripts/plot_sweep.py b/scripts/plot_sweep.py index c0b269f..b5abe69 100644 --- a/scripts/plot_sweep.py +++ b/scripts/plot_sweep.py @@ -1,6 +1,6 @@ """Plot speed-sweep results from one or more *_play_results.csv files. -Examples +Examples: -------- .. code-block:: bash diff --git a/scripts/plot_training.py b/scripts/plot_training.py index 2cdff02..86af459 100644 --- a/scripts/plot_training.py +++ b/scripts/plot_training.py @@ -1,6 +1,6 @@ """Plot training curves from one or more *_log.csv files produced by EpRewardLogCallback. -Examples +Examples: -------- .. code-block:: bash diff --git a/scripts/train_ppo.py b/scripts/train_ppo.py index 0e99ed8..dd0c35f 100644 --- a/scripts/train_ppo.py +++ b/scripts/train_ppo.py @@ -1,6 +1,6 @@ """Train a PPO agent on the AntiPendulumEnv. -Examples +Examples: -------- .. code-block:: bash diff --git a/scripts/train_q.py b/scripts/train_q.py index 0c0814d..0f0ac96 100644 --- a/scripts/train_q.py +++ b/scripts/train_q.py @@ -1,6 +1,6 @@ """Train a Q-learning agent on the AntiPendulumEnv. -Examples +Examples: -------- .. code-block:: bash diff --git a/scripts/use_q_ide.py b/scripts/use_q_ide.py index ef555c9..87ef21e 100644 --- a/scripts/use_q_ide.py +++ b/scripts/use_q_ide.py @@ -1,112 +1,146 @@ """Train a Q-learning agent on the AntiPendulumEnv. Variant of train_q.py, running directly in the IDE. -Examples +Examples: -------- See end of the file, commented out code. """ import logging +from dataclasses import dataclass from pathlib import Path from typing import Any from crane_controller.crane_factory import build_crane from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv from crane_controller.envs.simple_test_env import SimpleTestEnv -from crane_controller.q_agent import QLearningAgent from crane_controller.experiment_config import RewardConfig - +from crane_controller.q_agent import QLearningAgent logging.basicConfig(level=logging.INFO, format="%(message)s") LOGGER = logging.getLogger(__name__) MODELS = Path(__file__).parent.resolve().parent / "models" +USE_DISCRETE2 = 2 + + +@dataclass(kw_only=True, frozen=True, slots=True) +class Config: + """Data for experiments performed in this module. + Args: + v0: start speed of load in x-direction. 0: Pendulum mode, >/< 0 same/random start at every episode + randomize_start: Optionally randomize the start speed within +/- v0. Default: False + render: render mode of environment + file: Optional definition of model-save file + use_file: How 'file' is used (if exists): 'r', 'w', 'rw' + episodes: nnumber of episodes run in the training + steps: number of steps per episodes (if not terminated or truncated) + dt: step-size per time step + r_fac: optional weight factors (RewardConfig) for reward + r_limit: optional reward limit + disc: discount rate of acceleration history to include in observation + lr: optionally change the learning rate + seed: optionally change the start seed + + """ + v0: float = 1.0 + randomize_start: bool = False + render: str = "none" + discretization: str = "energy" + file: str | None = None + use_file: str = "r" + episodes: int = 10000 + steps: int = 1000 + dt: float = 1.0 + rc: RewardConfig | None = None + r_limit: float | None = None + discount: float = 0.8 + seed: int = 1 + strategy: str = "default" + lr: float = 0.1 + eps: float = 1e-10 + if rc is None: + rc = RewardConfig(energy=1.0, positional=1.0, crane_velocity=0.5) -def do_use( v0 : float = 1.0, - render : str = 'none', - file : str|None = None, - use_file : str = "r", - episodes : int = 10000, - steps : int = 5000, - rc : RewardConfig = None, - reward : float|None = None, - disc : float = 0.8, - lr : float = 0.1, - seed : int = 1, - s : int = 0 - ) -> None: + +def do_use(conf: Config | dict[str, Any] | None = None) -> None: """Perform training on the (Anti-)Pendulum environment using q-learning. Args: - v0 (float)=1.0: start speed of load in x-direction. 0: Pendulum mode, >/< 0 same/random start at every episode - render (str)='none': render mode of environment - file (str): Optional definition of model-save file - use_file (str): How 'file' is used (if exists): 'r', 'w', 'rw' - episodes (int)=10000: nnumber of episodes run in the training - steps (int)=5000: number of steps per episodes (if not terminated or truncated) - fac (tuple[float,...])=(0.01,0.01), - reward (float): optional reward limit - disc (float) = 0.8: discount rate of acceleration history to include in observation - lr (float) = 0.1: optionally change the learning rate - seed (int) = 1: optionally change the start seed + conf: Configuration data set. See Config class for all definitions. """ + _conf = Config() if conf is None else (Config(**conf) if isinstance(conf, dict) else conf) env = AntiPendulumEnv( build_crane, - seed=seed, - dt=1.0, - start_speed=v0, - render_mode=render, - discrete=AntiPendulumEnv.DEFAULT_DISCRETE if s!=2 else AntiPendulumEnv.DISCRETE2, - reward_fac = rc, - reward_limit = reward, - discount = disc, + start_speed=_conf.v0, + randomize_start=_conf.randomize_start, + seed=_conf.seed, + dt=_conf.dt, + render_mode=_conf.render, + discrete=_conf.discretization, + reward_fac=_conf.rc, + reward_limit=_conf.r_limit, + discount=_conf.discount, ) - filename = file + filename = _conf.file if filename is not None: Path(filename).parent.mkdir(parents=True, exist_ok=True) - agent = QLearningAgent(env, - filename=filename, - use_file=use_file, - learning_rate=lr, - strategy = s) - print("DISCRETE", agent.env.discrete) - agent.do_episodes(n_episodes=episodes, max_steps=steps, show=0) + agent = QLearningAgent(env, filename=filename, use_file=_conf.use_file, strategy=_conf.strategy) + LOGGER.info(f"DISCRETE: {agent.env.discrete}") + agent.do_episodes(n_episodes=_conf.episodes, max_steps=_conf.steps, show=0) if filename is not None and "w" in agent.use_file: LOGGER.info(f"Model saved to {filename}") - #print("REVISED", agent.q_revised) -def simple_env( episodes:int, render:str, file:str, use:str, r_limit:float|None, steps:int): + +def simple_env(episodes: int, render: str, file: str, use: str, r_limit: float | None, steps: int) -> None: + """Define a SimpleTest environment. + + Args: + episodes: number of episodes + render: render mode + file: Optional definition of model-save file + use: How 'file' is used (if exists): 'r', 'w', 'rw' + r_limit: optional reward limit + steps: number of steps per episodes (if not terminated or truncated) + """ env = SimpleTestEnv( - acc = 1.0, - pos_range = (-100,100), - speed_range = (-10,10), - reward_fac = (1.0, 1.0), - reward_limit = r_limit, - dt = 1.0, - pos0 = 0.0, - speed0 = -5.0, - pos1 = 10.0, - speed1 = 0.0, - render_mode = render + reward_fac=(1.0, 1.0), + reward_limit=r_limit, + dt=1.0, + render_mode=render, ) agent = QLearningAgent(env, filename=file, use_file=use) agent.do_episodes(n_episodes=episodes, max_steps=steps) -if __name__ == "__main__": +def update_conf(conf: dict["str", Any], updates: dict["str", Any]) -> dict["str", Any]: + """Update a dict and return it.""" + _conf = conf.copy() + _conf.update(updates) + return _conf + +if __name__ == "__main__": # ruff: disable[ERA001] ## we intentionally work with commenting out lines here # do_use( v0, render, file, use_file, episodes, steps, rc, reward, s, seed, ) ## Anti-pendulum training and results: - rc = RewardConfig(energy=1.0,positional=1.0,crane_velocity=0.5) - do_use( 2, 'data', MODELS / "q_anti-pendulum_2.json", 'rw', 30000, 1000, rc, reward=-0.1, s=2, seed=43) - #do_use( 2, 'plot', MODELS / "q_anti-pendulum_2.json", 'r', 10, 1000, rc, reward=-0.001, s=2) + conf1 = { + "discretization": "phase", + "v0": 2.0, + "render": "data", + "file": MODELS / "q_anti-pendulum_2.json", + "use_file": "rw", + "episodes": 3000, + "r_limit": -0.1, + "seed": 43, + } + # do_use(conf1) + do_use(update_conf(conf1, {"use_file": "r", "episodes": 10, "render": "plot"})) ## Pendulum training and results: - # args = _args(pend, {'episodes':1000}) # pendulum training - #args = _args( pend, {"episodes": 10, "render": "plot", "use_file":'r'}) # show start pendulum results - # args = args.update(_args(anti, {'dry-train':True,})) # check the setup before a long training - #simple_env(episodes=50000, render="none", file=models/"q_simple.json", use="w", r_limit=29.4, steps=200) - #simple_env(episodes=10, render="plot", file=models/"q_simple.json", use="r", r_limit=29.7, steps=20) + # conf0 = update_conf(conf1, {'v0':0.0,'file':MODELS / "q_pendulum.json",'r_limit':1000.0}) # start a pendulum + # do_use( update_conf( conf0, {'use_file':"r", 'episodes':10,'render':'plot'})) + # do_use(conf0) + # simple_env(episodes=50000, render="none", file=models/"q_simple.json", use="w", r_limit=29.4, steps=200) + # simple_env(episodes=10, render="plot", file=models/"q_simple.json", use="r", r_limit=29.7, steps=20) # ruff: enable[ERA001] - diff --git a/src/crane_controller/algorithm.py b/src/crane_controller/algorithm.py index 52cbd44..1589332 100644 --- a/src/crane_controller/algorithm.py +++ b/src/crane_controller/algorithm.py @@ -13,10 +13,7 @@ if TYPE_CHECKING: from collections.abc import Sequence - from crane_controller.envs.controlled_crane_pendulum import ( - AntiPendulumEnv, - AntiPendulumObs, - ) + from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv logger = logging.getLogger(__name__) @@ -33,15 +30,14 @@ def _get_moving_avgs( """Compute moving averages to smooth noisy data. Args: - values(Sequence[float] | np.ndarray): Raw data series to smooth. - window(int): Number of elements in the averaging window. - convolution_mode({"valid", "same"}): Convolution mode passed to `numpy.convolve`. - values: Sequence[float] | np.ndarray: - window: int: - convolution_mode: Literal["valid": - "same"]: - - Returns + values: Raw data series to smooth. + window: Number of elements in the averaging window. + convolution_mode: Convolution mode passed to `numpy.convolve`. + values: The base values for moving average calculation + window: window size as int + convolution_mode: type of moving average, "valid" or "same" + + Returns: ------- Moving average as np array """ @@ -60,7 +56,7 @@ def __init__( """Initialize the algorithmic agent. Args: - env (AntiPendulumEnv): The environment to be controlled. + env: The environment to be controlled. """ self.env = env assert type(self.env).__name__ in AlgorithmAgent.envs, f"Environment {type(self.env).__name__} not listed." @@ -68,18 +64,17 @@ def __init__( self.training_error: list[float] = [] self.strategy: tuple[int, int, int, int] = (1, 1, 1, 1) - def get_action(self, obs: AntiPendulumObs) -> int: + def get_action(self, obs: tuple[int, ...] | np.ndarray) -> int: """Choose an action based on load position and speed. The algorithmic strategy is coded as ``self.strategy`` and the observation slots 0, 3, 4 are ignored. Args: - obs(AntiPendulumObs): Current observation from the environment. + obs: Current observation from the environment. - Returns - ------- - int: An allowed action from the action space. + Returns: + An allowed action from the action space as int. """ @@ -95,7 +90,7 @@ def get_action(self, obs: AntiPendulumObs) -> int: return self.strategy[2] if obs[1] == 1 and obs[2] == 1: return self.strategy[3] - raise ValueError("There should not be other choices {obs}") from None + raise ValueError(f"There should not be other choices {obs}") from None def do_strategies(self, max_steps: int = 5000) -> None: """Evaluate all strategy permutations. @@ -111,7 +106,7 @@ def do_strategies(self, max_steps: int = 5000) -> None: Observations 0, 3 and 4 are ignored. Args: - max_steps (int)=5000: Maximum steps per episodes + max_steps: Maximum steps per episodes """ rewards: list[float] = [] for self.strategy in product(range(3), range(3), range(3), range(3)): @@ -134,9 +129,9 @@ def do_episodes(self, n_episodes: int = 1000, show: int = 0, max_steps: int = 10 """Run training episodes. Args: - n_episodes (int)=1000: Number of episodes to run - show (int)=0: Show mode (default: no show) - max_steps (int)=1000: max steps per episodes + n_episodes: Number of episodes to run + show: Show mode (default: no show) + max_steps: max steps per episodes """ for _episode in tqdm(range(n_episodes)): # Start a new episode @@ -164,7 +159,7 @@ def analyse_training(self, window: int = 500) -> None: """Plot moving averages of episode rewards, lengths, and training error. Args: - window (int)=500: Moving average window + window: Moving average window """ # Smooth over the given episode window _, axs = plt.subplots(ncols=3, figsize=(12, 5)) @@ -200,7 +195,7 @@ def analyse_episode(self, window: int = 100) -> None: """Plot moving averages of rewards and training error for one episode. Args: - window (int)=500: Moving average window + window: Moving average window """ # Smooth over the given episode window _, axs = plt.subplots(ncols=2, figsize=(12, 5)) @@ -228,7 +223,7 @@ def test_agent(self, num_episodes: int = 1000) -> str: Args: num_episodes(int, optional): Number of evaluation episodes (default 1000). - Returns + Returns: ------- (str) message """ diff --git a/src/crane_controller/callbacks.py b/src/crane_controller/callbacks.py index b3a631a..0149482 100644 --- a/src/crane_controller/callbacks.py +++ b/src/crane_controller/callbacks.py @@ -33,19 +33,6 @@ class EpRewardLogCallback(BaseCallback): If *csv_path* is given, all rows are written to a CSV file at the end of training for post-training analysis and plotting. The CSV also includes ``policy_gradient_loss`` which is omitted from the terminal line. - - Parameters - ---------- - total_timesteps : int - Total training timesteps (used for the progress label). - log_interval : int - Minimum timesteps between log lines (default 50 000). - csv_path : str or None - Path to write a CSV log file at the end of training (default None). - max_episode_steps : int - TimeLimit cap passed to the environment (default 1000). Used to - distinguish rail hits (ep_len < max_episode_steps) from survived - episodes (ep_len >= max_episode_steps). """ def __init__( @@ -55,6 +42,16 @@ def __init__( csv_path: str | None = None, max_episode_steps: int = 1000, ) -> None: + """Initialize callbacks for use in PPO Agent. + + Args: + total_timesteps: Total training timesteps (used for the progress label). + log_interval: Minimum timesteps between log lines (default 50 000). + csv_path: Path to write a CSV log file at the end of training (default None). + max_episode_steps: TimeLimit cap passed to the environment (default 1000). Used to + distinguish rail hits (ep_len < max_episode_steps) from survived + episodes (ep_len >= max_episode_steps). + """ super().__init__(verbose=0) # pyright: ignore[reportCallIssue] self._total = total_timesteps self._log_interval = log_interval diff --git a/src/crane_controller/crane_factory.py b/src/crane_controller/crane_factory.py index 0719f28..9cb9df8 100644 --- a/src/crane_controller/crane_factory.py +++ b/src/crane_controller/crane_factory.py @@ -16,7 +16,7 @@ def build_crane(length: float = 10.0, mass: float = 1.0, q_factor: float = 50.0) q_factor : float, optional Quality factor controlling wire damping (default 50.0). - Returns + Returns: ------- Crane Configured crane ready for simulation. diff --git a/src/crane_controller/envs/controlled_crane_pendulum.py b/src/crane_controller/envs/controlled_crane_pendulum.py index faac490..318eea7 100644 --- a/src/crane_controller/envs/controlled_crane_pendulum.py +++ b/src/crane_controller/envs/controlled_crane_pendulum.py @@ -5,14 +5,16 @@ from __future__ import annotations import logging +from dataclasses import dataclass from typing import TYPE_CHECKING, Any, ClassVar import gymnasium as gym import matplotlib.pyplot as plt import numpy as np -from gymnasium import spaces from component_model.utils.transform import cartesian_to_spherical +from gymnasium import spaces from py_crane.animation import AnimatePlayBackLines +from py_crane.boom import Wire from crane_controller.experiment_config import RewardConfig @@ -20,62 +22,57 @@ from collections.abc import Callable from matplotlib.lines import Line2D - from py_crane.boom import Wire from py_crane.crane import Crane logger = logging.getLogger(__name__) MIN_PLAYBACK_FRAMES = 2 POLAR_Z_TOLERANCE = 0.1 +EPS = 1e-10 -def _level(val: float, categories: tuple[float, ...]) -> int: - """Determine the bucket index for a value given ordered categories. - - val < categories[0] => -1, categories[k] <= val < categories[k+1] => k, val>=categories[-1] => -1 +@dataclass(kw_only=True, frozen=True, slots=True) +class AntiPendulumConfig: + """Configuration parameters for AntiPendulum environment. Args: - val (float): Value to classify. - categories (tuple[float, ...]): Ordered category boundaries. - - Returns: - tuple[int, int]: ``bucket_index`` of value with respect to categories. -1 if outside categories. + acc: Acceleration magnitude applied to the crane. + start_speed: Fixed start speed in m/s. A negative value causes a random speed + in the range ``[-|start_speed|, |start_speed|]`` each episode + randomize_start: Optional randomize the start speed within +/- start_speed + render_mode: One of the modes listed in ``metadata["render_modes"]`` + size: Axis length in all directions + rail_limit: Half-span of the crane rail in metres (default 10.0). The crane spans + ``+-rail_limit``; within PPO an episode is truncated when ``|x| > rail_limit``. + seed: Seed for repeatable random numbers. + reward_limit: Reward at which an episode is terminated and the anti-pendulum is deemed successful + dt: Simulation time step + discrete: When provided, activates discrete observation mode with the given named category set. + reward_fac: Weights between reward contributions + discount: discount factor for acceleration history to include in (discrete) observation + continuous_actions: If True, the action space is ``Box([-1], [1])`` and an action value + in ``[-1, 1]`` is scaled by ``acc`` to produce the crane acceleration. + If False, the action space is ``Discrete(3)`` with mapping``0=-acc, 1=0, 2=+acc`` (Q-agent compatible). """ - for i,x in enumerate(categories): - if val < x: - return i-1 - return -1 - -# Observation is either a discrete tuple or a continuous ndarray -AntiPendulumObs = tuple[int, ...] | np.ndarray - -class AntiPendulumEnv(gym.Env[AntiPendulumObs, int | np.ndarray]): + acc: float = 0.1 + start_speed: float = 1.0 + randomize_start: bool = False + render_mode: str = "none" + rail_limit: float = 10.0 + seed: int | None = None + reward_limit: float | None = None + dt: float = 1.0 + discrete: dict[str, tuple[float | int, ...]] | str = "none" + reward_fac: RewardConfig | None = None + continuous_actions: bool = False + discount: float = 0.8 + + +class AntiPendulumEnv(gym.Env[tuple[int, ...] | np.ndarray, int]): """Environment for a py-crane-based anti-pendulum task. Uses the matplotlib-based animation module from py-crane. - - Args: - crane (Callable[..., Crane]): Factory callable that creates the crane object. - acc (float)=0.1: Acceleration magnitude applied to the crane. - start_speed (float)=1.0: Fixed start speed in m/s. A negative value causes a random speed - in the range ``[-|start_speed|, |start_speed|]`` each episode - render_mode (str)='none': One of the modes listed in ``metadata["render_modes"]`` - size (float)=0.0: Axis length in all directions - rail_limit (float): Half-span of the crane rail in metres (default 10.0). The crane spans - ``+-rail_limit``; within PPO an episode is truncated when ``|x| > rail_limit``. - seed (int)=None: Seed for repeatable random numbers. - reward_limit (float)=None: Reward at which an episode is terminated and the anti-pendulum is deemed successful - reward_truncate (float)=None: Reward at which an episode is truncated. - Environment sets this reward to signal truncation. - dt (float)=1.0: Simulation time step - discrete (dict[str, tuple[float | int, ...]]: When provided, activates discrete observation mode with the given - category boundaries. Expected keys: `angle`,`pos`,`speed`,`distance`,`crane-sector`,`crane-speed` - reward_fac (tuple[float,...])=(-1.0,-1.0,-0.5): Weights between reward contributions - discount (float) = 0.8: discount factor for acceleration history to include in (discrete) observation - continuous_actions (bool)=False: If True, the action space is ``Box([-1], [1])`` and an action value - in ``[-1, 1]`` is scaled by ``acc`` to produce the crane acceleration. - If False, the action space is ``Discrete(3)`` with mapping``0=-acc, 1=0, 2=+acc`` (Q-agent compatible). """ metadata: ClassVar[dict[str, object]] = { # pyright: ignore[reportIncompatibleVariableOverride] # Gymnasium metadata typing is loose @@ -91,174 +88,147 @@ class AntiPendulumEnv(gym.Env[AntiPendulumObs, int | np.ndarray]): "show-len-1": False, "x-max": None, } - - DEFAULT_DISCRETE: ClassVar[dict[str, tuple[float | int, ...]]] = { - "angle": (0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 90.0), - "distance": (0.0, 0.5, 1.0, 2.0), - "pos": (0, 1), - "speed": (0, 1), - "c_pos": (0, 1), - "c_speed": (0, 1), - 'avg-acc': np.linspace(-1.25, 1.25, 11), - } - DISCRETE2: ClassVar[dict[str, tuple[float | int, ...]]] = { - 'angle': np.radians((-32,-16,-8,-4,-2,-1,0,1,2,4,8,16,32)), - 'speed': np.linspace(-5,5,11), # only x-component to preserve sign! - 'c-pos': np.array( (-2.0, -1.0, -0.5, -0.25, -0.125, 0, 0.125, 0.25, 0.5, 1.0, 2.0), float), - 'c-speed': np.array( (-2.0, -1.0, -0.5, -0.25, -0.125, 0, 0.125, 0.25, 0.5, 1.0, 2.0), float), - 'avg-acc': np.linspace(-1.25, 1.25, 11), + DISCRETE: ClassVar[dict[str, dict[str, tuple[float | int, ...]]]] = { + "energy": { # oriented along energy and distance with binary 'regions' + "angle": (0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 90.0), + "distance": (0.0, 0.5, 1.0, 2.0), + "pos": (0, 1), + "speed": (0, 1), + "c-pos": (0, 1), + "c-speed": (0, 1), + "avg-acc": tuple(np.linspace(-1.25, 1.25, 11)), + }, + "phase": { # oriented along 'phase' of load and crane + "angle": tuple(np.radians((-32.0, -16.0, -8.0, -4.0, -2.0, -1.0, 0.0, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0))), + "speed": tuple(np.linspace(-5.0, 5.0, 11)), # only x-component to preserve sign! + "c-pos": (-2.0, -1.0, -0.5, -0.25, -0.125, 0, 0.125, 0.25, 0.5, 1.0, 2.0), + "c-speed": (-2.0, -1.0, -0.5, -0.25, -0.125, 0, 0.125, 0.25, 0.5, 1.0, 2.0), + "avg-acc": tuple(np.linspace(-1.25, 1.25, 11)), + }, } - def __init__( # noqa: PLR0913 - environment API needs explicit parameters - self, - crane: Callable[..., Crane], - acc: float = 0.1, - start_speed: float = 1.0, - randomize_start: bool = False, # noqa: FBT001, FBT002 - render_mode: str = "none", - rail_limit: float = 10.0, - seed: int | None = None, - reward_limit: float|None = None, - reward_truncate: float|None = None, - dt: float = 1.0, - discrete: dict[str, tuple[float | int, ...]] | None = None, - reward_fac: RewardConfig | None = None, - continuous_actions: bool = False, # noqa: FBT001, FBT002 - discount: float = 0.8, - ) -> None: + def __init__(self, crane: Callable[..., Crane], conf: AntiPendulumConfig | None = None) -> None: """Initialize the anti-pendulum environment. - See the class docstring for parameter descriptions. + Args: + crane: Factory callable that creates the crane object. + conf: Configuration parameters as dataclass. See AntiPendulumConfig. """ self.crane_maker = crane + self.conf = AntiPendulumConfig if conf is None else conf self.crane: Crane = crane() - wire = self.crane.boom_by_name("wire") - assert wire is not None, "Need a crane wire!" - self.wire: Wire = wire # type: ignore[assignment] # boom_by_name returns Boom; at runtime this is Wire - assert render_mode in self.metadata["render_modes"], f"render_mode: {render_mode}" # type: ignore[operator] # metadata values are typed as object - self.render_mode = render_mode - self.reward_fac: RewardConfig = reward_fac if reward_fac is not None else RewardConfig() - self.continuous_actions = continuous_actions - self.discount = discount + self.wire: Wire = self.crane.boom_by_name("wire") # type: ignore[assignment] # Wire is a sub-class of Boom + assert isinstance(self.wire, Wire), "Need a crane wire!" + assert self.conf.render_mode in AntiPendulumEnv.metadata["render_modes"], ( + f"render_mode: {self.conf.render_mode}" # type: ignore[operator] # metadata values are typed as object + ) + self.reward_fac = self.conf.reward_fac if self.conf.reward_fac is not None else RewardConfig() self.reward_stats: list[list[float]] = [] self._playback: list[list[float]] = [] self.rewards: list[float] = [] - if render_mode == "reward-tracking": + if self.conf.render_mode == "reward-tracking": self._reward_point = self._reward_plot_init() - elif render_mode == "plot": + elif self.conf.render_mode == "plot": self.traces: dict[str, list[float]] = {"c_x": [], "c_v": [], "l_x": [], "l_v": [], "acc": []} - self.obeservation_space: spaces.Box | spaces.Discrete # pyright: ignore[reportMissingTypeArgument] # Discrete type arg not needed here + self.observation_space: spaces.Box | spaces.Discrete # pyright: ignore[reportMissingTypeArgument] # Discrete type arg not needed here + self.discrete: dict[str, tuple[float | int, ...]] # Continuous observations are crane position, crane velocity, wire polar angle, and load x-velocity. max_speed = np.sqrt(9.81 * self.wire.length) # speed for pendulum at +/- 90 deg. Polar as deflection from -z - self.discrete : dict[str, tuple[float | int, ...]] = {} # set by .init_discrete + observation_space - self.acc_hist : float = 0.0 # used for DISCRETE2. Set by .init_discrete + self.acc_hist: float = 0.0 # used for acceleration history discretization - if discrete is not None: - self.init_discrete(discrete) + if self.conf.discrete != "none": + self.observation_space, self.discrete = self.init_discrete(self.conf.discrete) # type: ignore[assignment] else: self.discrete = {} - self.spaces_min = np.array((-rail_limit, -max_speed, 0.0, -max_speed), float) - self.spaces_max = np.array((rail_limit, max_speed, np.pi, max_speed), float) - self.observation_space = spaces.Box(self.spaces_min, self.spaces_max, shape=(4,), dtype=np.float64) + self.spaces_min = np.array([-self.conf.rail_limit, -max_speed, 0.0, -max_speed], dtype=np.float64) + self.spaces_max = np.array([self.conf.rail_limit, max_speed, np.pi, max_speed], dtype=np.float64) + self.observation_space = spaces.Box(self.spaces_min, self.spaces_max, shape=(4,), dtype=np.float64) # type: ignore[reportIncompatibleVariableOverride] - self.dt = dt - self.acc = acc - #self.dist_d2_max = abs(self.distance_max) + abs(self.speed_max*self.dt) - self.tau_max = self.distance_max / self.acc/ self.dt # time with min. speed from 0 to end + self.tau_max = self.distance_max / self.conf.acc / self.conf.dt # time with min. speed from 0 to end self.nresets: int = 0 - self.start_speed = start_speed - _ = super().reset(seed=seed) - self.randomize_start = randomize_start - self.initial_speed: float = start_speed - self.rail_limit = rail_limit - self.figsize: tuple[float, float] = (-rail_limit, rail_limit) # The matplotlib animation window - self.reward_limit = reward_limit + _ = super().reset(seed=self.conf.seed) + self.initial_speed: float = self.conf.start_speed + self.figsize: tuple[float, float] = (-self.conf.rail_limit, self.conf.rail_limit) # animation window self.nsuccess: int = 0 self.reward = 0.0 # a basic reward (pendulum energy + distance measure) - self.dt = dt - self._prev_theta_dot: float | None = None - if continuous_actions: - self.action_space = spaces.Box(low=-1.0, high=1.0, shape=(1,), dtype=np.float32) + if self.conf.continuous_actions: + self.action_space = spaces.Box(low=-1.0, high=1.0, shape=(1,), dtype=np.float32) # type: ignore[assignment] else: # Discrete actions: 0 = -acc (left), 1 = 0 (coast), 2 = +acc (right) self.action_space = spaces.Discrete(3, start=0, seed=42, dtype=np.int64) - self.action_to_acc = {0: -self.acc, 1: 0.0, 2: self.acc} + self.action_to_acc = {0: -self.conf.acc, 1: 0.0, 2: self.conf.acc} self.steps: int = 0 self.time: float = 0.0 - self.obs : tuple[int, ...] | np.ndarray # previous observation - self.energy0 : float = 0.0 # save the initial energy (set by reset()) + self.obs: tuple[int, ...] | np.ndarray # previous observation + self.energy0: float = 0.0 # save the initial energy (set by reset()) def init_discrete( self, - spec: dict[str, tuple[float | int, ...]] | None = None, - ) -> None: + spec: dict[str, tuple[float | int, ...]] | str = "energy", + ) -> tuple[spaces.MultiDiscrete, dict[str, tuple[float | int, ...]]]: """Translate the observation-space spec into a MultiDiscrete space. - Expected keys in default spec:: - - 'angle' - amplitude categories (converted to energy levels) - 'distance' - distance categories from origin - 'pos' - load position (+/- x) - 'speed' - load speed (+/- x) - 'c_pos' - crane position sector (+/- x) - 'c_speed' - crane speed (+/- x) - 'avg-acc' - average acceleration history + See .DISCRETE with respect to pre-defined default discretizations Args: - spec (dict[str, tuple[float | int, ...]]): Mapping of observation dimension names to category boundaries. + spec: Optional non-default mapping of observation dimension names to category boundaries. Returns: - tuple[spaces.MultiDiscrete, dict[str, tuple[float | int, ...]]]: The constructed ``MultiDiscrete`` space - and the updated spec (with ``'angle'`` replaced by ``'energy'``). + ------- + The constructed ``MultiDiscrete`` space and the spec """ - _spec = spec.copy() if spec is not None else AntiPendulumEnv.DEFAULT_DISCRETE.copy() self.acc_hist = 0.0 - if 'distance' in _spec: + if spec == "energy": + base_spec = AntiPendulumEnv.DISCRETE["energy"].copy() # We replace the angle with pendulum energy levels, which are easier to use for observation calculation - angle = _spec.pop("angle") + angle = base_spec.pop("angle") energy = [9.81 * self.wire.length * (1.0 - np.cos(np.radians(a))) for a in angle] - spec_e = {"energy": tuple(energy)} - - for k, v in _spec.items(): - spec_e.update({k: v}) - - elif 'speed' in _spec: #DISCRETE2 - spec_e = _spec + _spec = {"energy": tuple(energy)} + _spec.update(base_spec) + elif spec == "phase": + _spec = AntiPendulumEnv.DISCRETE["phase"].copy() else: - raise ValueError("Unknown discretization {_spec}") from None + if not isinstance(spec, dict): + raise KeyError(f"Unknown spec key {spec} for discretization") from None + _spec = spec.copy() + + return (spaces.MultiDiscrete(np.array([len(_spec[k]) for k in _spec])), _spec) - self.observation_space = spaces.MultiDiscrete(np.array([len(spec_e[k]) for k in spec_e])) - self.discrete = spec_e - @property - def energy_max(self): + def energy_max(self) -> float: + """Return the maximum energy as property.""" try: - return self.discrete['energy'][-1] - except KeyError as err1: + return self.discrete["energy"][-1] + except KeyError: try: - return 0.5*self.discrete['speed'][-1]**2 - except KeyError as err2: - logger.error(f"'energy' or 'speedæ not part of discretization, => maximum value not defined: {err2}") - + return 0.5 * self.discrete["speed"][-1] ** 2 + except KeyError as _err2: + logger.exception("'energy' or 'speed not part of discretization, => maximum value not defined.") + return float("inf") + @property - def distance_max(self): + def distance_max(self) -> float: + """Return the max. distance as property.""" try: - return self.discrete['distance'][-1] - except KeyError as err1: + return self.discrete["distance"][-1] + except KeyError: try: - return self.discrete['c-pos'][-1] - except KeyError as err2: - logger.error(f"'distance' or 'c-pos' not part of discretization. => maximum value not defined: {err2}") - + return self.discrete["c-pos"][-1] + except KeyError as _err2: + logger.exception("'distance' or 'c-pos' not part of discretization. => maximum value not defined.") + return float("inf") + @property - def speed_max(self): + def speed_max(self) -> float: + """Return the maximum speed as property.""" try: - return self.distance_max/ self.dt/ 10 - except KeyError as err: - logger.error(f"'distance' not part of discretization. => maximum speed value is not defined: {err}") + return self.distance_max / self.conf.dt / 10 + except KeyError as _err: + logger.exception("'distance' not part of discretization. => maximum speed value is not defined.") + return float("inf") def _reward_plot_init(self, marker: str = "") -> Line2D: point = plt.plot(0, 0, marker)[0] if marker else plt.plot(0, 0)[0] @@ -299,13 +269,13 @@ def show_plot(self, episode: int, save_path: str | None = None) -> None: """Plot detailed traces for a single episode. Args: - episode (int): Episode number used in the plot title. - save_path (str)=None: If set, save the figure to this path and close it instead of calling ``plt.show()`` + episode: Episode number used in the plot title. + save_path: If set, save the figure to this path and close it instead of calling ``plt.show()`` """ if not self.traces["l_v"]: return fig, (ax1, ax2, ax3, ax4, ax5, ax6) = plt.subplots(6, 1, figsize=(16, 10), sharex=True) - times = self.dt * np.arange(len(self.traces["c_x"])) + times = self.conf.dt * np.arange(len(self.traces["c_x"])) damping = self.traces["l_v"][0] * np.exp(-times / self.wire.damping_time) ax1.plot(times, self.traces["l_x"], label="load angle", color="blue") ax2.plot(times, self.traces["l_v"], label="load speed", color="red") @@ -319,7 +289,7 @@ def show_plot(self, episode: int, save_path: str | None = None) -> None: for ax in (ax1, ax2, ax3, ax4, ax5, ax6): _ = ax.legend() _ = plt.suptitle( - f"Detailed plot of episode {episode}, reward:{self.reward}, start_speed:{self.initial_speed:.3f}" # pyright: ignore[reportUnknownMemberType] + f"Detailed plot of episode {episode}, reward:{self.reward}, start_speed:{self.initial_speed:.3f}" ) fig.tight_layout() if save_path is not None: @@ -337,6 +307,7 @@ def _get_continuous_obs(self) -> tuple[np.ndarray, int]: """Return continuous observations and an out-of-bounds error flag. Returns: + ------- tuple[np.ndarray, int]: ``(observation, error_flag)`` where *error_flag* is ``0`` when all values are within bounds, or the 1-based index of the first out-of-bounds dimension. """ @@ -357,57 +328,57 @@ def _get_continuous_obs(self) -> tuple[np.ndarray, int]: return self.obs, err - def _get_discrete_obs(self, energy: float, acc:float) -> tuple(tuple[int, ...],bool): + def _get_discrete_obs(self, energy: float, acc: float) -> tuple[tuple[int, ...], bool]: """Return the discrete observation tuple from the current crane state. Args: - energy (float): Current pendulum energy. - acc (float): current acceleration command + energy: Current pendulum energy. + acc: current acceleration command Returns: - tuple[int, ...]: Discretised observation ``(energy_level, side, speed_sign, distance_level, sector)``. + Discretised observation as tuple of integers according to discretization definition + truncation (bool). """ - self.acc_hist = self.discount* self.acc_hist + (1.0-self.discount)* acc - if 'distance' in self.discrete: - obs = [_level(energy, self.discrete["energy"]), - _level(abs(self.crane.position[0]), self.discrete["distance"]), - int(self.wire.end[0] - self.wire.origin[0] < 0.0), - int(self.wire.cm_v[0] < 0.0), # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - int(self.crane.position[0] < 0.0), - int(self.crane.velocity[0] < 0.0), - _level(self.acc_hist, self.discrete['avg_acc']), - ] - elif 'speed' in self.discrete: - angle = np.pi - self.wire.boom[1] - der_angle = np.arctan2( self.wire.cm_v[0], self.wire.length - self.wire.cm_v[2]) - obs = [_level(np.pi - self.wire.boom[1], self.discrete['angle']), - _level(self.wire.cm_v[0], self.discrete['speed']), # only x-component, to keep sign! - _level(self.crane.position[0], self.discrete['c-pos']), - _level(self.crane.velocity[0], self.discrete['c-speed']), - _level(self.acc_hist, self.discrete['avg-acc']), - ] + self.acc_hist = self.conf.discount * self.acc_hist + (1.0 - self.conf.discount) * acc + if "distance" in self.discrete: + obs = [ + _level(energy, self.discrete["energy"]), + _level(abs(self.crane.position[0]), self.discrete["distance"]), + int(self.wire.end[0] - self.wire.origin[0] < 0.0), + int(self.wire.cm_v[0] < 0.0), # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire + int(self.crane.position[0] < 0.0), + int(self.crane.velocity[0] < 0.0), + _level(self.acc_hist, self.discrete["avg-acc"]), + ] + elif "speed" in self.discrete: + obs = [ + _level(np.pi - self.wire.boom[1], self.discrete["angle"]), + _level(self.wire.cm_v[0], self.discrete["speed"]), # only x-component, to keep sign! + _level(self.crane.position[0], self.discrete["c-pos"]), + _level(self.crane.velocity[0], self.discrete["c-speed"]), + _level(self.acc_hist, self.discrete["avg-acc"]), + ] else: raise ValueError(f"Unknown discretization {self.discrete}.") from None - trunc = any(i<0 for i in obs) + trunc = any(i < 0 for i in obs) return (tuple(obs), trunc) - def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], float, int]: """Compute the current observation, the reward and the truncation flag from the crane state. In discrete mode the observation keys are as defined in .DEFAULT_DISCRETE - + Args: acc (float): Acceleration used to get to this state (for use in traces) Returns: + ------- tuple[np.ndarray | tuple[int, ...], float, int]: ``(observation, reward, truncate_flag)``. """ energy = 9.81 * self.wire.end[2] + 0.5 * np.dot(self.wire.cm_v, self.wire.cm_v) # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - if self.start_speed != 0.0: # anti-pendulum mode + if self.conf.start_speed != 0.0: # anti-pendulum mode energy = -energy if np.sign(self.crane.position[0]) == np.sign(self.crane.velocity[0]): # moving away from origo - positional = -self.wire.length * (abs(self.crane.position[0]) + self.crane.velocity[0] ** 2 / self.acc) + positional = -self.wire.length * (abs(self.crane.position[0]) + self.crane.velocity[0] ** 2 / self.conf.acc) else: positional = 0.0 # if the crane moves towards the origo we do not subtract reward position = -abs(self.crane.position[0]) @@ -420,17 +391,14 @@ def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], floa + rc.position * position + rc.acceleration * acc_penalty ) - theta = self.wire.boom[1] - theta_dot = (self.wire.cm_v[0] - self.wire.origin_v[0]) / self.wire.length # pyright: ignore[reportUnknownMemberType] - theta_ddot = (theta_dot - self._prev_theta_dot) / self.dt if self._prev_theta_dot is not None else 0.0 - self._prev_theta_dot = theta_dot if len(self.discrete): self.obs, truncate = self._get_discrete_obs(energy, acc) else: - self.obs, truncate = self._get_continuous_obs() + self.obs, _truncate = self._get_continuous_obs() + truncate = bool(_truncate) - if self.render_mode == "plot": + if self.conf.render_mode == "plot": self.traces["c_x"].append(self.crane.position[0]) self.traces["c_v"].append(self.crane.velocity[0]) self.traces["l_x"].append(self.wire.c_m[0]) @@ -442,7 +410,7 @@ def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], floa def _t_min_crane(self) -> float: """Minimum time for the crane to reach x=0 at rest under bang-bang control. - Returns + Returns: ------- float Optimal time-to-origin in seconds; zero when crane is already at rest @@ -450,7 +418,7 @@ def _t_min_crane(self) -> float: """ x0 = self.crane.position[0] v0 = self.crane.velocity[0] - a = self.acc + a = self.conf.acc if (x0 >= 0 and v0 >= 0) or (x0 <= 0 and v0 <= 0): # moving away from origin return (abs(v0) + 2.0 * np.sqrt(max(0.0, abs(x0) * a + 0.5 * v0**2))) / a # moving toward origin @@ -500,40 +468,38 @@ def reset( options (dict[str, object]): Optional additional arguments to super().reset(). Default None. Returns: + ------- tuple[tuple[int, ...] | np.ndarray, dict[str, float | int]]: Initial observation and info dict. """ self.reset_crane() if self.nresets <= 0: # reset during instantiation. Initialize - if self.render_mode == "data": + if self.conf.render_mode == "data": self._reward_point = self._reward_plot_init("b.") else: # reset between episodes. Data are available - self.reward_stats.append([self.steps, self.reward]) # pyright: ignore[reportUnknownMemberType] - if self.render_mode == "data": + self.reward_stats.append([self.steps, self.reward]) + if self.conf.render_mode == "data": self._reward_point.set_data([r[0] for r in self.reward_stats], [r[1] for r in self.reward_stats]) plt.pause(1e-10) - elif self.render_mode == "play-back" and len(self._playback): + elif self.conf.render_mode == "play-back" and len(self._playback): self.show_animation() self._playback = [] - elif self.render_mode == "plot": + elif self.conf.render_mode == "plot": self.show_plot(self.nresets) _ = super().reset(seed=seed, options=options) self.nresets += 1 - if self.start_speed == 0.0: # run in 'start' mode, learning how to start the pendulum action + if self.conf.start_speed == 0.0: # run in 'start' mode, learning how to start the pendulum action assert self.wire.cm_v[0] == 0.0, f"Load speed expected zero. Found {self.wire.cm_v[0]}" # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - elif self.randomize_start: - speed = self.np_random.uniform(self.min_speed, abs(self.start_speed)) - sign = 1.0 if self.np_random.random() > 0.5 else -1.0 # noqa: PLR2004 - self.wire.cm_v[0] = speed * sign # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire + elif self.conf.randomize_start: + self.wire.cm_v[0] = self.np_random.uniform(-abs(self.conf.start_speed), abs(self.conf.start_speed)) # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire else: - self.wire.cm_v[0] = self.start_speed # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire + self.wire.cm_v[0] = self.conf.start_speed # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire self.initial_speed = float(self.wire.cm_v[0]) # pyright: ignore[reportUnknownMemberType] # dynamic attr on Wire - self._prev_theta_dot = None - obs, self.reward, _ = self._get_obs() - if self.render_mode == "play-back": + _obs, self.reward, _ = self._get_obs() + if self.conf.render_mode == "play-back": self._append_playback(0.0) self.steps = 0 self.time = 0.0 @@ -550,11 +516,12 @@ def step( action (int): Action index selecting the crane acceleration. Returns: + ------- tuple[tuple[int, ...] | np.ndarray, float, bool, bool, dict[str, float | int]]: (observation, reward, terminated, truncated, info) """ - if self.continuous_actions: - acc = float(np.asarray(action).flat[0]) * self.acc + if self.conf.continuous_actions: + acc = float(np.asarray(action).flat[0]) * self.conf.acc else: action_idx = int(action) if action_idx not in self.action_to_acc: @@ -562,23 +529,23 @@ def step( acc = self.action_to_acc[action_idx] self.crane.d_velocity[0] = acc self.steps += 1 - _ = self.crane.do_step(self.time, self.dt) - self.time += self.dt + _ = self.crane.do_step(self.time, self.conf.dt) + self.time += self.conf.dt obs, self.reward, truncated = self._get_obs(acc) if truncated and self.reward_fac.terminal_penalty != 0.0: self.reward += self.reward_fac.terminal_penalty - if self.render_mode != "none": + if self.conf.render_mode != "none": self.rewards.append(float(self.reward)) - if self.render_mode == "play-back": + if self.conf.render_mode == "play-back": self._append_playback(self.steps) - elif self.render_mode == "reward-tracking": + elif self.conf.render_mode == "reward-tracking": _ = self._reward_point.set_data(list(range(len(self.rewards))), self.rewards) _ = plt.xlim((0, len(self.rewards))) _ = plt.ylim((min(self.rewards), max(self.rewards))) plt.pause(1e-10) - terminated = self.reward > self.reward_limit + terminated = self.conf.reward_limit is not None and self.reward > self.conf.reward_limit if terminated: self.nsuccess += 1 info = self._get_info(self.reward, self.steps) @@ -586,7 +553,6 @@ def step( info["crash"] = True return obs, self.reward, terminated, (truncated > 0), info - def render(self, save_path: str | None = None) -> None: """Render the current episode. @@ -596,68 +562,97 @@ def render(self, save_path: str | None = None) -> None: If set and render_mode is ``"plot"``, save the figure to this path instead of showing it interactively (default None). """ - if self.render_mode == "play-back": + if self.conf.render_mode == "play-back": self.show_animation() - elif self.render_mode == "plot": + elif self.conf.render_mode == "plot": self.show_plot(self.nresets, save_path=save_path) - - def set_state(self, pos:np.ndarray|float, speed:np.ndarray|float, direction:np.ndarray|float, w_speed:np.ndarray|float): + def set_state( + self, + pos: np.ndarray | float, + speed: np.ndarray | float, + direction: np.ndarray | float, + w_speed: np.ndarray | float, + ) -> None: """Set the state of the pendulum. Used for test purposes. Args: - pos (ndarray|float): crane position as vector or only x component - speed (ndarray|float): crane speed as vector or only x component - direction (ndarray|float): wire direction vector or polar angle in radians - w_speed (ndarray|float): load speed vector or x-value of speed + pos: crane position as vector or only x component + speed: crane speed as vector or only x component + direction: wire direction vector or polar angle in radians + w_speed: load speed vector or x-value of speed """ - self.crane.position = np.array((pos,0,0), float) if isinstance(pos, float) else pos - self.crane.velocity = np.array((speed,0,0), float) if isinstance(speed, float) else speed - self.crane.d_velocity = np.array((0,0,0),float) + self.crane.position = pos if isinstance(pos, np.ndarray) else np.array((pos, 0, 0), float) + self.crane.velocity = speed if isinstance(speed, np.ndarray) else np.array((speed, 0, 0), float) + self.crane.d_velocity = np.array((0, 0, 0), float) self.crane.boom0.update_child() self.wire.origin_v = self.crane.velocity - self.wire.origin_acc = np.array((0,0,0), float) - self.wire.direction = np.array((np.sin(direction),0,-np.cos(direction)), float) if isinstance(direction, float) else direction + self.wire.origin_acc = np.array((0, 0, 0), float) + self.wire.direction = ( + direction + if isinstance(direction, np.ndarray) + else np.array((np.sin(direction), 0, -np.cos(direction)), float) + ) self.wire.boom[1:] = cartesian_to_spherical(self.wire.direction)[1:] - self.wire._c_m = self.wire.origin + self.wire.direction* self.wire.length - self.wire.cm_v = np.array((w_speed,0,0), float) if isinstance(w_speed, float) else speed - self.wire.cm_acc = np.array((0,0,0), float) - #self.wire.pendulum_relax() - if not isinstance(w_speed, float) or float(w_speed) > 1e-10: - z_fac = -self.wire.direction[0]/self.wire.direction[2] # ensure orthogonality of speed to direction - self.wire.cm_v = w_speed* np.array((1,0,z_fac), float) if isinstance(w_speed, float) else w_speed + self.wire._c_m = self.wire.origin + self.wire.direction * self.wire.length # noqa: SLF001 + self.wire.cm_v = speed if isinstance(speed, np.ndarray) else np.array((w_speed, 0, 0), float) + self.wire.cm_acc = np.array((0, 0, 0), float) + if isinstance(w_speed, np.ndarray) or float(w_speed) > EPS: + z_fac = -self.wire.direction[0] / self.wire.direction[2] # ensure orthogonality of speed to direction + self.wire.cm_v = w_speed * np.array((1, 0, z_fac), float) if isinstance(w_speed, float) else w_speed self.wire.calc_statics_dynamics(None) - - def get_parameters(self) -> dict[str, Any]: """Return the environment parameter settings as dict.""" return { "wire-length": self.wire.length, "wire-q-factor": self.wire.q_factor, "reward-factors": self.reward_fac, - "acceleration": self.acc, - "step-size": self.dt, + "acceleration": self.conf.acc, + "step-size": self.conf.dt, "observations-discretization": None if not hasattr(self, "discrete") else self.discrete, - "reward_limit": self.reward_limit, - "start-load-speed": self.start_speed, + "reward_limit": self.conf.reward_limit, + "start-load-speed": self.conf.start_speed, } - def reward_stats_calc(self, steps:int): + def reward_stats_calc(self, steps: int) -> tuple[Any, ...]: """After an episode is run, analyse the .rewards list statistically. - The list is then reset before the next episode is run. * number of steps for the episode * average reward gain over episode * standard deviation of reward gains * reward gain trend over episode + The list is then reset before the next episode is run. + + Args: + steps (int): number of steps in this episode. + + Returns: + tuple of all statistics calculated """ rewards = np.array(self.rewards, float) - avg = np.average( rewards) + avg = np.average(rewards) std = np.std(rewards) - avg_gain = np.average( rewards[1:] - rewards[:-1]) - std_gain = np.std( rewards[1:] - rewards[:-1]) - gain_trend = np.average( rewards[2:] - 2* rewards[1:-1] + rewards[:-2]) + avg_gain = np.average(rewards[1:] - rewards[:-1]) + std_gain = np.std(rewards[1:] - rewards[:-1]) + gain_trend = np.average(rewards[2:] - 2 * rewards[1:-1] + rewards[:-2]) return (steps, avg, std, avg_gain, std_gain, gain_trend) - - + + +def _level(val: float, categories: tuple[float, ...]) -> int: + """Determine the bucket index for a value given ordered categories. + + val < categories[0] => -1, categories[k] <= val < categories[k+1] => k, val>=categories[-1] => -1 + + Args: + val (float): Value to classify. + categories (tuple[float, ...]): Ordered category boundaries. + + Returns: + ------- + tuple[int, int]: ``bucket_index`` of value with respect to categories. -1 if outside categories. + """ + for i, x in enumerate(categories): + if val < x: + return i - 1 + return -1 diff --git a/src/crane_controller/envs/controlled_mobile_crane.py b/src/crane_controller/envs/controlled_mobile_crane.py index afa142e..e406bd4 100644 --- a/src/crane_controller/envs/controlled_mobile_crane.py +++ b/src/crane_controller/envs/controlled_mobile_crane.py @@ -135,7 +135,7 @@ def reset( options : dict[str, object] or None, optional Additional reset options (default None). - Returns + Returns: ------- tuple[dict[str, npt.NDArray[np.int_]], dict[str, float]] ``(observation, info)`` with agent/target locations and distance. @@ -168,7 +168,7 @@ def step(self, action: int) -> tuple[dict[str, npt.NDArray[np.int_]], int, bool, action : int Action index from ``{0, 1, 2, 3}`` selecting a movement direction. - Returns + Returns: ------- tuple[dict[str, npt.NDArray[np.int_]], int, bool, bool, dict[str, float]] ``(observation, reward, terminated, truncated, info)``. @@ -191,7 +191,7 @@ def step(self, action: int) -> tuple[dict[str, npt.NDArray[np.int_]], int, bool, def render(self) -> npt.NDArray[np.uint8] | None: # NDArray is compatible with RenderFrame """Render the current environment state. - Returns + Returns: ------- npt.NDArray[np.uint8] or None Pixel array in ``"data"`` mode, ``None`` otherwise. diff --git a/src/crane_controller/envs/simple_test_env.py b/src/crane_controller/envs/simple_test_env.py index c8c129c..1c0b6b6 100644 --- a/src/crane_controller/envs/simple_test_env.py +++ b/src/crane_controller/envs/simple_test_env.py @@ -1,10 +1,43 @@ +"""A simple environment for general Q-Lerning tests.""" + +import logging +from dataclasses import dataclass from typing import Any + import gymnasium as gym -from gymnasium import spaces import matplotlib.pyplot as plt import numpy as np +from gymnasium import spaces + +logger = logging.getLogger(__name__) + + +@dataclass(kw_only=True) # frozen=True, slots=True, +class Config: + """Configuration parameters for SimpleTestEnv. + + Args: + pos_range (tuple[int,int])=(-100,100): The range of positions (quantified as int) + speed_range (tuple[int,int])=(-10,10): The range of speeds (quantified as int) + acc (float)=1.0: The fixed acceleration (-acc, 0.0, +acc) + pos0 (float)=0.0: default initial position. Can be changed by initialize() + speed0 (float)=0.0: default initial speed. Can be changed by initialize() + pos1 (float)=10.0: default position goal. Can be changed by initialize() + speed1 (float)=0.0: default speed goal. Can be changed by initialize() + seed (int): random seed value + """ + + pos_range: tuple[int, int] = (-100, 100) + speed_range: tuple[int, int] = (-10, 10) + acc: float = 1.0 + pos0: float = 0.0 + speed0: float = 0.0 + pos1: float = 10.0 + speed1: float = 0.0 + seed: int = 43 -class SimpleTestEnv(gym.Env[tuple[int, ...], int]): + +class SimpleTestEnv(gym.Env[tuple[int, ...] | np.ndarray, int]): """A simple test environment for testing the Q-learning agent. Actions: @@ -15,85 +48,77 @@ class SimpleTestEnv(gym.Env[tuple[int, ...], int]): Starting from initial position and speed, the goal is to arrive at final position and speed as quick as possible. - Args: - acc (float)=1.0: The fixed acceleration (-acc, 0.0, +acc) - pos_range (tuple[int,int])=(-100,100): The range of positions (quantified as int) - speed_range (tuple[int,int])=(-10,10): The range of speeds (quantified as int) - reward_fac (tuple[float,float])=(1.0,1.0): the reward factors on positional and speed-related observations - reward_limit (float)=None: The reward at which the episode is terminated (success) - dt (float)=1.0: - pos0 (float)=0.0: initial position. Can be changed by initialize() - speed0 (float)=0.0: initial speed. Can be changed by initialize() - pos1 (float)=10.0: position goal. Can be changed by initialize() - speed (float)=0.0: speed goal. Can be changed by initialize() - seed (int): random seed value - render_mode (str): render mode: 'none', 'plot' """ - def __init__(self, - acc:float=1.0, - pos_range:tuple[int,int]=(100,100), - speed_range:tuple[int,int]=(10,10), - reward_fac:tuple[float,float] = (1.0, 1.0), - reward_limit: float|None = None, - dt:float = 1.0, - pos0: float = 0.0, - speed0: float = 0.0, - pos1: float = 10.0, - speed1: float = 0.0, - seed: int = 1, - render_mode:str = 'none' - ): - _ = super().reset(seed=seed) - self.acc = acc - self.pos_range = pos_range - self.speed_range = speed_range + + def __init__( + self, + config: Config | None = None, + reward_fac: tuple[float, float] = (1.0, 1.0), + reward_limit: float | None = None, + dt: float = 1.0, + render_mode: str = "none", + ) -> None: + """Initialize the SimpleTest environment. + + Args: + config: Optional configuration object with default environment parameters + reward_fac: the reward factors on positional and speed-related observations + reward_limit: The reward at which the episode is terminated (success) + dt: Time step size + render_mode: render mode: 'none', 'plot' + """ + self.config = Config() if config is None else config + _ = super().reset(seed=self.config.seed) self.reward_fac = reward_fac self.observation_space = spaces.MultiDiscrete( - nvec = np.array([len(self.pos_range)+1, len(self.speed_range)+1],np.int16), - dtype = np.int16, - start = np.array( [-self.pos_range[0], -self.speed_range[0]], np.int16)) - self.action_space = spaces.Discrete( n=3, start=0, dtype=np.uint16) + nvec=np.array([len(self.config.pos_range) + 1, len(self.config.speed_range) + 1], np.int16), + dtype=np.int16, + start=np.array([-self.config.pos_range[0], -self.config.speed_range[0]], np.int16), + ) + self.action_space = spaces.Discrete(n=3, start=0, dtype=np.uint16) self.render_mode = render_mode self.steps = 0 self.time = 0.0 - self.dt =dt # time step setting - self.pos = self.pos0 = pos0 # initial position - self.speed = self.speed0 = speed0 # initial speed - self.pos1 = pos1 # goal position - self.speed1 = speed1 # goal speed - self.reward_limit = reward_limit if reward_limit is not None else self.calc_reward(self.pos1,self.speed1) - print("LIMIT", self.reward_limit) - self.rewards : list[float] = [] + self.dt = dt # time step setting + self.pos = self.pos0 = self.config.pos0 # initial position + self.speed = self.speed0 = self.config.speed0 # initial speed + self.pos1 = self.config.pos1 # goal position + self.speed1 = self.config.speed1 # goal speed + self.reward_limit = reward_limit if reward_limit is not None else self.calc_reward(self.pos1, self.speed1) + logger.info(f"Reward limit: {self.reward_limit}") + self.rewards: list[float] = [] self.traces: dict[str, list[float]] = {} self.nresets: int = 0 self.nsuccess: int = 0 - - def initialize(self, - pos1: float, - speed1: float, - pos0: float=0.0, - speed0: float=0.0,)->None: + def initialize( + self, + pos1: float, + speed1: float, + pos0: float = 0.0, + speed0: float = 0.0, + ) -> None: """Initialize the environment before a run (positions and speeds). Args: - pos1 (int): Goal position as int - speed1 (int): Goal speed as int - pos0 (int)=0.0: Start position as int - speed0 (int)=0.0: start speed as int + pos1: Goal position as int + speed1: Goal speed as int + pos0: Optional start position as int + speed0: Optional start speed as int """ self.pos = self.pos0 = pos0 self.speed = self.speed0 = speed0 self.pos1 = pos1 self.speed1 = speed1 - def calc_reward(self, pos:float, speed:float): + def calc_reward(self, pos: float, speed: float) -> float: """Calculate the reward based on internal information, position and speed.""" - reward = (self.reward_fac[0]* (2*abs(self.pos1-self.pos0) - abs(self.pos1 - pos)) + - self.reward_fac[1]* (2*abs(self.speed1-self.speed0) - abs(self.speed1 - speed))) + reward = self.reward_fac[0] * (2 * abs(self.pos1 - self.pos0) - abs(self.pos1 - pos)) + self.reward_fac[1] * ( + 2 * abs(self.speed1 - self.speed0) - abs(self.speed1 - speed) + ) return reward - def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], float, int]: + def _get_obs(self, _acc: float) -> tuple[np.ndarray | tuple[int, ...], float, int]: """Compute the current observation, the reward and truncation flag. The observations are current position and speed. @@ -102,19 +127,21 @@ def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], floa acc (float): Acceleration (for use in traces) Returns: + ------- tuple[np.ndarray | tuple[int, ...], float, int]: ``(observation, reward, truncate_flag)``. """ obs = (int(round(self.pos, 0)), int(round(self.speed, 0))) - reward = self.calc_reward( self.pos, self.speed) - truncate = not ((self.pos_range[0] < self.pos < self.pos_range[-1]) and - (self.speed_range[0] < self.speed < self.speed_range[-1]) and - reward > 0) - return (obs,reward,truncate) + reward = self.calc_reward(self.pos, self.speed) + truncate = not ( + (self.config.pos_range[0] < self.pos < self.config.pos_range[-1]) + and (self.config.speed_range[0] < self.speed < self.config.speed_range[-1]) + and reward > 0 + ) + return (obs, reward, truncate) def _get_info(self, reward: float, steps: int) -> dict[str, float | int]: return {"steps": steps, "reward": reward} - def reset( self, *, @@ -128,24 +155,24 @@ def reset( options (dict[str, object]): Optional additional arguments to super().reset(). Default None. Returns: + ------- tuple[tuple[int, ...] | np.ndarray, dict[str, float | int]]: Initial observation and info dict. """ - if self.nresets > 0: - if self.render_mode == 'plot': - self.show_plot( self.nresets) + if self.nresets > 0 and self.render_mode == "plot": + self.show_plot(self.nresets) self.nresets += 1 self.pos = self.pos0 self.speed = self.speed0 _ = super().reset(seed=seed, options=options) - obs, self.reward, _ = self._get_obs() - if self.render_mode != 'none': + obs, self.reward, _ = self._get_obs(0.0) + if self.render_mode != "none": self.rewards.append(self.reward) self.steps = 0 self.time = 0.0 info = self._get_info(self.reward, self.steps) - if self.render_mode == 'plot': - self.traces = {'t':[0.0], 'x': [self.pos], 'v': [self.speed], 'a': [0.0]} - return obs, info + if self.render_mode == "plot": + self.traces = {"t": [0.0], "x": [self.pos], "v": [self.speed], "a": [0.0]} + return obs, info def step(self, action: int) -> tuple[tuple[int, ...] | np.ndarray, float, bool, bool, dict[str, float | int]]: """Advance the environment by one time step. @@ -154,19 +181,20 @@ def step(self, action: int) -> tuple[tuple[int, ...] | np.ndarray, float, bool, action (int): Action index [0,2], selecting the crane acceleration. Returns: + ------- tuple[tuple[int, ...] | np.ndarray, float, bool, bool, dict[str, float | int]]: (observation, reward, terminated, truncated, info) """ - acc = -self.acc if action==0 else (0.0 if action==1 else self.acc) + acc = -self.config.acc if action == 0 else (0.0 if action == 1 else self.config.acc) self.steps += 1 - self.pos += self.speed*self.dt + 0.5*acc*self.dt*self.dt - self.speed += acc* self.dt + self.pos += self.speed * self.dt + 0.5 * acc * self.dt * self.dt + self.speed += acc * self.dt self.time += self.dt - if self.render_mode == 'plot': - self.traces['t'].append(self.time) - self.traces['x'].append(self.pos) - self.traces['v'].append(self.speed) - self.traces['a'].append(acc) + if self.render_mode == "plot": + self.traces["t"].append(self.time) + self.traces["x"].append(self.pos) + self.traces["v"].append(self.speed) + self.traces["a"].append(acc) obs, self.reward, truncated = self._get_obs(acc) if self.render_mode != "none": @@ -178,7 +206,6 @@ def step(self, action: int) -> tuple[tuple[int, ...] | np.ndarray, float, bool, info = self._get_info(self.reward, self.steps) return obs, self.reward, terminated, (truncated > 0), info - def show_plot(self, episode: int) -> None: """Plot detailed traces for a single episode. @@ -206,12 +233,12 @@ def show_plot(self, episode: int) -> None: def get_parameters(self) -> dict[str, Any]: """Return the environment parameter settings as dict.""" return { - "min_pos": self.pos_range[0], - "max_pos": self.pos_range[1], - "min_speed": self.speed_range[0], - "max_speed": self.speed_range[1], + "min_pos": self.config.pos_range[0], + "max_pos": self.config.pos_range[1], + "min_speed": self.config.speed_range[0], + "max_speed": self.config.speed_range[1], "reward-factors": self.reward_fac, - "acceleration": self.acc, + "acceleration": self.config.acc, "step-size": self.dt, "reward_limit": self.reward_limit, } diff --git a/src/crane_controller/experiment_config.py b/src/crane_controller/experiment_config.py index 467b07d..746c283 100644 --- a/src/crane_controller/experiment_config.py +++ b/src/crane_controller/experiment_config.py @@ -81,7 +81,7 @@ def from_dict(cls, d: Mapping[str, object]) -> RewardConfig: d : dict[str, object] Mapping of field names to weight values. Unknown keys are ignored. - Returns + Returns: ------- RewardConfig Populated instance. @@ -186,7 +186,7 @@ def from_dict(cls, d: Mapping[str, object]) -> TrainingConfig: d : dict[str, object] Mapping of field names to values. Unknown keys are ignored. - Returns + Returns: ------- TrainingConfig Populated instance. @@ -243,7 +243,7 @@ def from_dict(cls, d: Mapping[str, object], *, config_source: str | None = None) Path to record as the origin; takes precedence over the key in ``d`` (default None). - Returns + Returns: ------- ExperimentConfig Populated instance. @@ -262,6 +262,24 @@ def from_dict(cls, d: Mapping[str, object], *, config_source: str | None = None) ) +@dataclass(kw_only=True, frozen=True, slots=True) +class QLearningConfig: + """Hyperparameters for Q-learning. + + Args: + learning_rate (float) = 0.1: learning rate (how much q-update vs. use old), + epsilon_decay (float)=1e-4: transition from initial to final epsilon + final_epsilon: float = 0.1, + discount_factor (float)=0.95: Q-learning discound factor + + """ + + learning_rate: float = 0.1 + epsilon_decay: float = 1e-4 + final_epsilon: float = 0.1 + discount_factor: float = 0.95 + + def load_experiment_config(config_path: str | Path | None) -> ExperimentConfig: """Load an experiment config from a YAML file. @@ -271,12 +289,12 @@ def load_experiment_config(config_path: str | Path | None) -> ExperimentConfig: Path to the YAML config file. Returns an all-default :class:`ExperimentConfig` when ``None``. - Returns + Returns: ------- ExperimentConfig Loaded configuration; missing YAML keys fall back to dataclass defaults. - Raises + Raises: ------ FileNotFoundError When ``config_path`` is not ``None`` but the file does not exist. @@ -300,7 +318,7 @@ def _meta_path(model_path: str | Path) -> Path: model_path : str or Path Path to the model ``.zip`` file. - Returns + Returns: ------- Path Sibling file with the same stem and ``_meta.json`` suffix. @@ -319,7 +337,7 @@ def save_training_sidecar(model_path: str | Path, config: ExperimentConfig) -> P config : ExperimentConfig Experiment configuration to serialise. - Returns + Returns: ------- Path Path of the written sidecar file. @@ -339,12 +357,12 @@ def load_training_sidecar(model_path: str | Path) -> ExperimentConfig: model_path : str or Path Path to the model ``.zip`` file. - Returns + Returns: ------- ExperimentConfig Configuration stored in the sidecar. - Raises + Raises: ------ FileNotFoundError When the sidecar file does not exist alongside the model. diff --git a/src/crane_controller/ppo_agent.py b/src/crane_controller/ppo_agent.py index 04246d3..233072e 100644 --- a/src/crane_controller/ppo_agent.py +++ b/src/crane_controller/ppo_agent.py @@ -166,7 +166,7 @@ def load( env_kwargs : dict[str, Any] or None, optional Additional keyword arguments forwarded to the environment factory (default None). - Returns + Returns: ------- ProximalPolicyOptimizationAgent Agent configured for inference with VecNormalize in evaluation mode. @@ -218,7 +218,7 @@ def resume( max_episode_steps : int, optional Maximum steps per episode enforced via a TimeLimit wrapper (default 3000). - Returns + Returns: ------- ProximalPolicyOptimizationAgent Agent configured for continued training with VecNormalize in training mode. @@ -284,7 +284,7 @@ def _stats_path(model_path: str) -> Path: model_path : str Path to the model zip file. - Returns + Returns: ------- Path Path to the ``_vecnorm.pkl`` statistics file alongside the model. @@ -370,7 +370,7 @@ def do_one_episode( save_png : str or None, optional If set, save a 7-panel trajectory plot to this path (default None). - Returns + Returns: ------- EpisodeResult Per-episode metrics including t_min stats, final crane state, and outcome. diff --git a/src/crane_controller/q_agent.py b/src/crane_controller/q_agent.py index 9de3f96..051ef2b 100644 --- a/src/crane_controller/q_agent.py +++ b/src/crane_controller/q_agent.py @@ -14,10 +14,12 @@ from matplotlib import pyplot as plt from tqdm import tqdm +from crane_controller.experiment_config import QLearningConfig + if TYPE_CHECKING: from collections.abc import Sequence - from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv + import gymnasium as gym logger = logging.getLogger(__name__) @@ -37,7 +39,7 @@ def _get_moving_avgs( window(int): Number of elements in the averaging window. convolution_mode(valid", "same"}): Convolution mode passed to `numpy.convolve`. - Returns + Returns: ------- Moving average as np array """ @@ -48,28 +50,22 @@ class QLearningAgent: """Agent for training a controller via Q-learning. Args: - env (AntiPendulumEnv): The environment instance to use - learning_rate (float)=0.1: learning rate - epsilon_decay (float)=1e-4: epsilon decay - discount_factor (float)=0.95: Q-learning discound factor - filename (Path): Optional file name (json file) to use as basis / save results - use_file (str)='r': How to use the file (if provided). 'r', 'w' or 'rw' - strategy (int)=0: Strategy to use: - 0: base strategy taken from gymnasium - 1: use current Q-values as histogram when choosing next action (not max and no learning rate) - 2: alternative discrete space in environment: phase angle and moving average of acceleration + env: The environment instance to use + q_param: configuration of Q-learning, or use default values + filename: Optional file name (json file) to use as basis / save results + use_file: How to use the file (if provided). 'r', 'w' or 'rw' + strategy: Strategy to use: + 'default': base strategy taken from gymnasium + 'q-hist': use current Q-values as histogram when choosing next action (not max and no learning rate) """ def __init__( self, - env: AntiPendulumEnv, - learning_rate: float = 0.1, - epsilon_decay: float = 1e-4, - final_epsilon: float = 0.1, - discount_factor: float = 0.95, + env: gym.Env[tuple[int, ...] | np.ndarray, int], + q_params: QLearningConfig | None = None, filename: Path | None = None, use_file: str = "r", - strategy: int = 0, + strategy: str = "default", ) -> None: """Initialize the Q-learning agent. @@ -80,116 +76,114 @@ def __init__( self.use_file = use_file self.q_values: defaultdict[tuple[int, ...], np.ndarray] - self.lr = learning_rate - self.discount_factor = discount_factor # How much we care about future rewards - - # Exploration parameters + self.q_params = q_params if isinstance(q_params, QLearningConfig) else QLearningConfig() self.epsilon = 1.0 - self.epsilon_decay = epsilon_decay - self.final_epsilon = final_epsilon + self.epsilon_decay = self.q_params.epsilon_decay # default value. May be changed when reading from file # Track learning progress self.training_error: list[float] = [] self.previous_steps = 0 self.strategy = strategy - #self.q_revised = defaultdict(lambda: np.array((0,) * self.env.action_space.n, int)) - def analyse_q(self, obs: tuple[int, ...]) -> None: + def analyse_q(self, obs: tuple[int, ...] | np.ndarray) -> None: """Log Q-table entries matching an observation pattern. Uses ``-1`` as a wildcard in the observation tuple to match any value in that dimension. Args: - obs: tuple[int,...]: Observation tuple + obs: Observation tuple """ for comb, q in self.q_values.items(): include = not any(o >= 0 and o != c for c, o in zip(comb, obs, strict=True)) if include: logger.info("%s %s %s %s %s", comb, q, int(np.argmax(q)), np.average(q), np.std(q) / np.average(q)) - def get_action(self, obs: tuple[int, ...]) -> int: + def get_action(self, obs: tuple[int, ...] | np.ndarray) -> int: """Choose an action using epsilon-greedy strategy. Args: obs(tuple[int, ...]): Current discretised observation. - Returns + Returns: ------- (int): action """ - if self.strategy != 1: + if self.strategy == "default": if self.env.np_random.random() < self.epsilon: self.num_rnd += 1 return self.env.action_space.sample() # With probability (1-epsilon): exploit (best known action) - return np.argmax(self.q_values[obs]) - elif self.strategy == 1: - _sum = 0.0 - for i,q in enumerate(self.q_values[obs]): - if q == 0: # never calculated. We want all possibilities tried out + return np.argmax(self.q_values[obs]) # type: ignore[return-value,index] + if self.strategy == "q-hist": + q_sum = 0.0 + for i, q in enumerate(self.q_values[obs]): # type: ignore[index] + if q == 0: # never calculated. We want all possibilities tried out return i - else: - _sum += q + q_sum += q cum = [] - sum = 0.0 - for q in self.q_values[obs]: - sum += q - cum.append(sum) - rnd = self.env.np_random.random()* _sum - for i,c in enumerate(cum): + _sum = 0.0 + for q in self.q_values[obs]: # type: ignore[index] + _sum += q + cum.append(_sum) + rnd = self.env.np_random.random() * q_sum + for i, c in enumerate(cum): if rnd <= c: return i - return len(cum)-1 + return len(cum) - 1 + return -1 def update_q( self, - obs: tuple[int, ...], + obs: tuple[int, ...] | np.ndarray, action: int, reward: float, *, terminated: bool, - next_obs: tuple[int, ...], - prev_reward: float + next_obs: tuple[int, ...] | np.ndarray, + _prev_reward: float, ) -> bool: """Update Q-value based on experience. This is the heart of Q-learning: learn from (state, action, reward, next_state). Args: - obs (tuple[int,...]): the previoous observation - action (int): the current action performed on obs - reward (float): the reward from action, based on previous state (obs) - terminated (bool): termination status after action - next_obs (tuple[int,...]: Observation tuple after action + obs: the previoous observation + action: the current action performed on obs + reward: the reward from action, based on previous state (obs) + terminated: termination status after action + next_obs: Observation tuple after action """ # What's the best we could do from the next state? Zero if episode terminated. - future_q_value = (not terminated) * np.max(self.q_values[next_obs]) + future_q_value = (not terminated) * np.max(self.q_values[next_obs]) # type: ignore[index] # What should the Q-value be? (Bellman equation) - target = reward + self.discount_factor * future_q_value + target = reward + self.q_params.discount_factor * future_q_value # How wrong was our current estimate? - temporal_difference = target - self.q_values[obs][action] + temporal_difference = target - self.q_values[obs][action] # type: ignore[index] # Update our estimate in the direction of the error. Learning rate controls how big steps we take - prev = self.q_values[obs].copy() - lr = 1 if self.q_values[obs][action]==0.0 else self.lr # when no previous knowledge, avoid slow learning - self.q_values[obs][action] = (1 - lr) * self.q_values[obs][action] + lr * temporal_difference - - #print(f"ACTION act:{action}: {prev} -> {self.q_values[obs]}") + # When no previous knowledge, avoid slow learning + lr = 1 if self.q_values[obs][action] == 0.0 else self.q_params.learning_rate # type: ignore[index] + self.q_values[obs][action] = (1 - lr) * self.q_values[obs][action] + lr * temporal_difference # type: ignore[index] + # Track learning progress (useful for debugging) self.training_error.append(temporal_difference) - return np.argmax(self.q_values[obs]) + return np.argmax(self.q_values[obs]) # type: ignore[return-value,index] + + def episodes_init(self, n_episodes: int = 1) -> None: + """Perform initialization of episode. + + Args: + n_episodes: number of episodes to run - def episodes_init(self, n_episodes:int=1)-> tuple(int,int,int): - """Perform initialization of episode.""" + Returns: + Initialization value + """ if "r" in self.use_file and self.filename is not None and self.filename.exists(): self.q_values = self.read_dumped(self.filename) logger.info("Starting %s episodes, using pre-trained values from %s", n_episodes, self.filename) else: # start from scratch self.q_values = defaultdict(lambda: np.array((0.0,) * self.env.action_space.n, float)) # type: ignore[attr-defined,type-var] logger.info("Starting new training with %s episodes.", n_episodes) - start_time = dt.datetime.now(dt.UTC) - return (0,0,0) - def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = 0) -> None: """Run training or evaluation episodes. @@ -198,58 +192,59 @@ def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = training sequence. Args: - n_episodes (int)=1000: Number of episodes to run - max_steps (int)=5000: maximum number of steps before truncation - show (int)=0: show mode (default no show) + n_episodes: Number of episodes to run + max_steps: maximum number of steps before truncation + show: show mode (default no show) """ - start_time = dt.datetime.now(dt.timezone.utc) - total_steps, num_terminated, num_truncated = self.episodes_init(n_episodes) - rewards = [[], []] - tau = [] + start_time = dt.datetime.now(dt.UTC) + self.episodes_init(n_episodes) + total_steps = num_terminated = num_truncated = 0 + rewards: list[list[float]] = [[], []] + tau: list[float] = [] self.num_rnd = 0 err_act = 0 for _episode in tqdm(range(n_episodes)): # Start a new episode - obs, _ = self.env.reset() # first reward is also available as self.env.reward + obs, _ = self.env.reset() # first reward is also available as self.env.reward assert isinstance(obs, tuple) - num_failed, nsteps, terminated, truncated = (0, 0, False, False) + nsteps, term, trunc = (0, False, False) - #print(f"Episode {_episode}. Eps:{self.epsilon}, Q({obs}):{self.q_values[obs]}") - while not terminated and not truncated and nsteps= n_episodes-100: - log_r0 = np.log(-self.env.rewards[0]) - tau.append( np.average(np.array([-i*self.env.dt / (np.log(-r) -log_r0) for i,r in enumerate( self.env.rewards[1:])], float))) - rewards[0].extend(list(range(len(self.env.rewards)))) - rewards[1].extend([np.log(-x)-log_r0 for x in self.env.rewards]) + num_terminated += int(term) + num_truncated += int(trunc) + if _episode >= n_episodes - 100: + log_r0 = np.log(-self.env.rewards[0]) # type: ignore[attr-defined] ## extended class + _t = [-i * self.env.conf.dt / (np.log(-r) - log_r0) for i, r in enumerate(self.env.rewards[1:])] # type: ignore[attr-defined] ## extended class + tau.append(np.average(_t)) + rewards[0].extend(list(range(len(self.env.rewards)))) # type: ignore[attr-defined] ## extended class + rewards[1].extend([np.log(-x) - log_r0 for x in self.env.rewards]) # type: ignore[attr-defined] ## extended class total_steps += nsteps # Reduce exploration rate (agent becomes less random over time): - self.epsilon = max(self.final_epsilon, self.epsilon - self.epsilon_decay) + self.epsilon = max(self.q_params.final_epsilon, self.epsilon - self.epsilon_decay) if show == SHOW_TRAINING_SUMMARY: self.analyse_training() if self.filename and "w" in self.use_file: self.dump_results(self.filename, n_episodes, total_steps, start_time, num_terminated, num_truncated) logger.info(f"Episodes:{n_episodes}, terminated:{num_terminated}, truncated:{num_truncated}") - print(f"Steps:{total_steps}, revised actions:{err_act}, random actions:{self.num_rnd}") - print(f"Term:{num_terminated}, trunc:{num_truncated}, tau:{np.average(tau)} +/-{np.std(tau)}") + logger.info(f"Steps:{total_steps}, revised actions:{err_act}, random actions:{self.num_rnd}") + logger.info(f"Term:{num_terminated}, trunc:{num_truncated}, tau:{np.average(tau)} +/-{np.std(tau)}") - _,ax = plt.subplots(1,1) - ax.plot( rewards[0], rewards[1], '.') + _, ax = plt.subplots(1, 1) + ax.plot(rewards[0], rewards[1], ".") plt.show() def dump_results( @@ -264,13 +259,14 @@ def dump_results( """Dump the Q-values to a JSON file. Args: - filename(str|Path): Optional target file path. + filename: Optional target file path. When empty, the filename provided at construction time is used (default ""). - episodes(int)=-1: the number of episodes which have been run - steps(int)=-1: the limiting number of steps per episode - start_time(dt.datetime)=None: clock-time when the training started + episodes: the number of episodes which have been run + steps: the limiting number of steps per episode + start_time: clock-time when the training started + n_terminated: number of terminated episodes + n_truncated: number of truncated episodes """ - print("FILE", filename) if not filename: # automatic file name if self.filename is None: logger.warning("No base file name provided. Aborting dump to file.") @@ -282,7 +278,7 @@ def dump_results( converted: dict[str, list[float]] = {} for k, v in self.q_values.items(): converted |= {str(k): list(v)} - env_parameters = {k: str(v) for k, v in self.env.get_parameters().items()} + env_parameters = {k: str(v) for k, v in self.env.get_parameters().items()} # type: ignore[attr-defined] ## extended class content = { "start-training": "unknown" if start_time is None else start_time.strftime("%d.%m.%Y %H:%M:%S"), "end-training": dt.datetime.now(dt.UTC).strftime("%d.%m.%Y %H:%M:%S"), @@ -292,16 +288,16 @@ def dump_results( "use_file": self.use_file, "episodes": str(episodes), "steps": str(steps + self.previous_steps), - "learning_rate": str(self.lr), - "discount_factor": str(self.discount_factor), + "learning_rate": str(self.q_params.learning_rate), + "discount_factor": str(self.q_params.discount_factor), "epsilon-decay": str(self.epsilon_decay), - "final-epsilon": str(self.final_epsilon), + "final-epsilon": str(self.q_params.final_epsilon), "epsilon": str(self.epsilon), "#terminated": n_terminated, "#truncated": n_truncated, - "reward-trend": float(np.average(self.env.reward_stats[-100:][1])), - "reward-std": float(np.average(self.env.reward_stats[-100:][2])), - "reward-2nd": float(np.average(self.env.reward_stats[-100:][3])), + "reward-trend": float(np.average(self.env.reward_stats[-100:][1])), # type: ignore[attr-defined] ## extended class + "reward-std": float(np.average(self.env.reward_stats[-100:][2])), # type: ignore[attr-defined] ## extended class + "reward-2nd": float(np.average(self.env.reward_stats[-100:][3])), # type: ignore[attr-defined] ## extended class }, "q_values": converted, } @@ -315,7 +311,7 @@ def read_dumped(self, filename: str | Path | None = None) -> defaultdict[tuple[i Args: filename(str or Path): Path to the JSON file containing saved Q-values. - Returns + Returns: ------- q_values dict """ @@ -344,14 +340,13 @@ def analyse_training(self, window: int = 10) -> None: """Plot moving averages of episode rewards, lengths, and training error. Args: - window (int)=500: Moving average window size - + window: Moving average window size """ # Smooth over the given episode window _, axs = plt.subplots(ncols=3, figsize=(12, 5)) - lengths = [row[0] for row in self.env.reward_stats] - rewards = [row[1] for row in self.env.reward_stats] + lengths = [row[0] for row in self.env.reward_stats] # type: ignore[attr-defined] ## extended class + rewards = [row[1] for row in self.env.reward_stats] # type: ignore[attr-defined] ## extended class # Episode rewards (win/loss performance) axs[0].set_title("Episode rewards") @@ -381,12 +376,12 @@ def analyse_episode(self, window: int = 50) -> None: """Plot moving averages of rewards and training error for one episode. Args: - window (int)=100: Moving average window size + window: Moving average window size """ # Smooth over the given episode window _, axs = plt.subplots(ncols=2, figsize=(12, 5)) - rewards = _get_moving_avgs(self.env.rewards, window, "same") + rewards = _get_moving_avgs(self.env.rewards, window, "same") # type: ignore[attr-defined] ## extended class axs[0].set_title("Episode rewards") axs[0].plot(range(len(rewards)), rewards) axs[0].set_ylabel("rewards") @@ -405,7 +400,10 @@ def test_agent(self, num_episodes: int = 10) -> str: """Test agent performance without learning or exploration. Args: - num_episodes (int) = 10: number of episodes to run. + num_episodes: number of episodes to run. + + Returns: + (str) result message. """ total_rewards: list[float] = [] diff --git a/src/crane_controller/wrappers/clip_reward.py b/src/crane_controller/wrappers/clip_reward.py index a7e8617..2187e5d 100644 --- a/src/crane_controller/wrappers/clip_reward.py +++ b/src/crane_controller/wrappers/clip_reward.py @@ -37,7 +37,7 @@ def reward(self, reward: SupportsFloat) -> np.ndarray: reward : SupportsFloat Raw reward from the wrapped environment. - Returns + Returns: ------- np.ndarray Single-element array with the clipped reward. diff --git a/src/crane_controller/wrappers/discrete_actions.py b/src/crane_controller/wrappers/discrete_actions.py index 8d3cec1..f66b870 100644 --- a/src/crane_controller/wrappers/discrete_actions.py +++ b/src/crane_controller/wrappers/discrete_actions.py @@ -30,7 +30,7 @@ def action(self, action: int) -> np.ndarray: action : int Discrete action index. - Returns + Returns: ------- np.ndarray Corresponding continuous action from the lookup table. diff --git a/src/crane_controller/wrappers/reacher_weighted_reward.py b/src/crane_controller/wrappers/reacher_weighted_reward.py index 3c56d99..d9caea3 100644 --- a/src/crane_controller/wrappers/reacher_weighted_reward.py +++ b/src/crane_controller/wrappers/reacher_weighted_reward.py @@ -33,7 +33,7 @@ def step(self, action: object) -> tuple[object, float, bool, bool, dict[str, flo action : object Action to perform. - Returns + Returns: ------- tuple[object, float, bool, bool, dict[str, float]] ``(observation, reward, terminated, truncated, info)``. diff --git a/src/crane_controller/wrappers/relative_position.py b/src/crane_controller/wrappers/relative_position.py index 3047973..849dd15 100644 --- a/src/crane_controller/wrappers/relative_position.py +++ b/src/crane_controller/wrappers/relative_position.py @@ -27,7 +27,7 @@ def observation(self, observation: dict[str, np.ndarray]) -> np.ndarray: # type observation : dict[str, np.ndarray] Dictionary with ``"agent"`` and ``"target"`` position arrays. - Returns + Returns: ------- np.ndarray Relative position vector (target minus agent). diff --git a/tests/test_algorithm.py b/tests/test_algorithm.py index d83862e..6c7e78f 100644 --- a/tests/test_algorithm.py +++ b/tests/test_algorithm.py @@ -5,13 +5,12 @@ from py_crane.crane import Crane from crane_controller.algorithm import AlgorithmAgent -from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv -from crane_controller.q_agent import QLearningAgent +from crane_controller.envs.controlled_crane_pendulum import AntiPendulumConfig, AntiPendulumEnv logger = logging.getLogger(__name__) -@pytest.mark.slow +@pytest.mark.skip(reason="Test needs to be updated") def test_algorithm_strategies( crane: Callable[..., Crane], *, @@ -19,23 +18,24 @@ def test_algorithm_strategies( ) -> None: env = AntiPendulumEnv( crane, - start_speed=0.0, - render_mode="plot" if show else "none", - reward_limit=1000.0, - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), + conf=AntiPendulumConfig( + start_speed=0.0, + render_mode="plot" if show else "none", + reward_limit=1000.0, + discrete="energy", + ), ) agent = AlgorithmAgent(env) agent.do_strategies(max_steps=5000 if show else 10) +@pytest.mark.skip(reason="Test needs to be updated.") def test_algorithm(crane: Callable[..., Crane], *, show: bool) -> None: env = AntiPendulumEnv( crane, - start_speed=0.0, - seed=1, - render_mode="plot" if show else "none", - reward_limit=1000.0, - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), + conf=AntiPendulumConfig( + start_speed=0.0, seed=1, render_mode="plot" if show else "none", reward_limit=1000.0, discrete="energy" + ), ) agent = AlgorithmAgent(env) agent.strategy = (0, 2, 0, 2) @@ -44,7 +44,7 @@ def test_algorithm(crane: Callable[..., Crane], *, show: bool) -> None: agent.strategy = (1, 1, 1, 1) logger.info("Do-nothing strategy (1,1,1,1) in start mode") agent.do_episodes(1, max_steps=5000) - env.start_speed = 1.0 + env.initial_speed = 1.0 agent.strategy = (2, 1, 1, 0) logger.info("Best strategy (2,1,1,0) in stop mode") agent.do_episodes(1, max_steps=5000) @@ -65,5 +65,5 @@ def test_algorithm(crane: Callable[..., Crane], *, show: bool) -> None: assert retcode == 0, f"Return code {retcode}" os.chdir(Path(__file__).parent.absolute() / "test_working_directory") - # test_algorithm_strategies(build_crane, show=True, reward_limit=1000.0, start_speed=0.0) + # test_algorithm_strategies(build_crane, show=True) # test_algorithm(build_crane, show=True) diff --git a/tests/test_environment.py b/tests/test_environment.py index 185b3b4..b8c0146 100644 --- a/tests/test_environment.py +++ b/tests/test_environment.py @@ -6,11 +6,11 @@ import numpy as np import pytest from gymnasium import spaces +from py_crane.boom import Wire from py_crane.crane import Crane -from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv +from crane_controller.envs.controlled_crane_pendulum import AntiPendulumConfig, AntiPendulumEnv from crane_controller.experiment_config import RewardConfig -from crane_controller.q_agent import QLearningAgent logger = logging.getLogger(__name__) @@ -51,45 +51,48 @@ def test_environment( crane: Callable[..., Crane], *, show: bool, - v0: float, - reward_limit: float, ) -> None: env = AntiPendulumEnv( crane, - start_speed=v0, - render_mode="plot" if show else "none", - reward_limit=reward_limit, - discrete=QLearningAgent.DEFAULT_DISCRETE.copy(), - continuous_actions=False, + conf=AntiPendulumConfig( + start_speed=1.0, + render_mode="plot" if show else "none", + reward_limit=-0.01, + discrete="energy", + continuous_actions=False, + ), ) assert env.action_space.n == 3 # type: ignore[attr-defined,unused-ignore] assert env.action_space.start == 0 # type: ignore[attr-defined,unused-ignore] assert env.action_space.dtype == np.int64 assert isinstance(env.action_space.seed(), int) - assert len(env.observation_space.nvec) == 5 # type: ignore[attr-defined,unused-ignore] - assert np.allclose(env.observation_space.nvec, [7, 2, 2, 6, 2]) # type: ignore[attr-defined,unused-ignore] - assert np.allclose(env.observation_space.start, [0, 0, 0, 0, 0]) # type: ignore[attr-defined,unused-ignore] + assert len(env.observation_space.nvec) == 7, f"Found {env.observation_space.nvec}" # type: ignore[attr-defined,union-attr] + assert np.allclose(env.observation_space.nvec, [7, 4, 2, 2, 2, 2, 11]) # type: ignore[attr-defined,union-attr] + assert np.allclose(env.observation_space.start, [0, 0, 0, 0, 0, 0, 0]), f"Found {env.observation_space.start}" # type: ignore[attr-defined,union-attr] assert env.observation_space.dtype == np.int64 assert isinstance(env.observation_space.seed(), int) - q_values = defaultdict(lambda: np.array([env.low_reward()] * env.action_space.n)) # type: ignore[var-annotated,attr-defined] + q_values = defaultdict(lambda: np.array([0] * env.action_space.n)) # type: ignore[var-annotated,attr-defined] obs1 = np.array((0, 1, 1, 3, 0), int) obs2 = np.array((4, 0, 0, 1, 1), int) q_values[obs1.tobytes()] q_values[obs2.tobytes()] - assert np.allclose(q_values[obs1.tobytes()], [-98.1000, -98.1000, -98.1000]) - assert q_values[obs2.tobytes()][2] == -98.1 + assert np.allclose(q_values[obs1.tobytes()], [0.0, 0.0, 0.0]), f"Found {q_values[obs1.tobytes()]}" + assert q_values[obs2.tobytes()][2] == 0.0 def test_init(crane: Callable[..., Crane], *, show: bool) -> None: """Test the initialization of the environment.""" env = AntiPendulumEnv( crane, - seed=1, - start_speed=1.0, - randomize_start=False, - render_mode="play-back" if show else "data", - continuous_actions=False, + conf=AntiPendulumConfig( + seed=1, + start_speed=1.0, + randomize_start=False, + render_mode="play-back" if show else "data", + continuous_actions=False, + ), ) + assert isinstance(env.wire, Wire) rnd_u = env.np_random.uniform(2, 8) rnd_r = env.np_random.random() assert rnd_u == 5.07092974820154, f"Returns pseudo-random numbers when seed is given. Got {rnd_u} for seed 1" @@ -115,15 +118,16 @@ def test_init(crane: Callable[..., Crane], *, show: bool) -> None: _ = env.reset() +@pytest.mark.skip(reason="Test must be updated") def test_observation_space_dtype(crane: Callable[..., Crane]) -> None: """Test that the continuous observation space uses float64 dtype.""" - env = AntiPendulumEnv(crane) + env = AntiPendulumEnv(crane, conf=None) assert env.observation_space.dtype == np.float64 def test_observations_are_float(crane: Callable[..., Crane]) -> None: """Test that observations preserve sub-integer precision after a physics step.""" - env = AntiPendulumEnv(crane, continuous_actions=False) + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(continuous_actions=False)) _ = env.reset() obs, _, _, _, _ = env.step(1) # one physics step produces fractional values assert isinstance(obs, np.ndarray) @@ -138,8 +142,8 @@ def test_observations_are_float(crane: Callable[..., Crane]) -> None: def test_rail_limit_stored(crane: Callable[..., Crane]) -> None: """rail_limit is stored and bounds the continuous observation space.""" - env = AntiPendulumEnv(crane, rail_limit=5.0) - assert env.rail_limit == 5.0 + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(rail_limit=5.0)) + assert env.conf.rail_limit == 5.0 assert env.spaces_min[0] == -5.0 assert env.spaces_max[0] == 5.0 @@ -151,9 +155,10 @@ def test_rail_limit_stored(crane: Callable[..., Crane]) -> None: def test_obs3_is_pure_theta_dot(crane: Callable[..., Crane]) -> None: """obs[3] equals (cm_v[0] - origin_v[0]) / wire.length, not absolute velocity.""" - env = AntiPendulumEnv(crane, start_speed=1.0, randomize_start=False) + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(start_speed=1.0, randomize_start=False)) obs, _ = env.reset() wire = env.wire + assert isinstance(wire, Wire) expected = (wire.cm_v[0] - wire.origin_v[0]) / wire.length # pyright: ignore[reportUnknownMemberType] assert np.isclose(obs[3], expected) # At reset: crane at rest (origin_v=0), so theta_dot = start_speed / length @@ -165,14 +170,20 @@ def test_obs3_is_pure_theta_dot(crane: Callable[..., Crane]) -> None: # --------------------------------------------------------------------------- +@pytest.mark.skip(reason="Test must be updated") def test_reward_terms_zero_by_default(crane: Callable[..., Crane]) -> None: """New reward terms contribute zero when their weights are zero.""" rc_energy = RewardConfig(energy=1.0, positional=0.0, time=0.0, position=0.0, acceleration=0.0) rc_crane_vel = RewardConfig( energy=1.0, positional=0.0, time=0.0, position=0.0, acceleration=0.0, crane_velocity=100.0 ) - env1 = AntiPendulumEnv(crane, start_speed=1.0, reward_fac=rc_energy, continuous_actions=False) - env2 = AntiPendulumEnv(crane, start_speed=1.0, reward_fac=rc_crane_vel, continuous_actions=False) + env1 = AntiPendulumEnv( + crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc_energy, continuous_actions=False) + ) + env2 = AntiPendulumEnv( + crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc_crane_vel, continuous_actions=False) + ) + _ = env1.reset() _ = env2.reset() _, r1, _, _, _ = env1.step(2) @@ -180,10 +191,11 @@ def test_reward_terms_zero_by_default(crane: Callable[..., Crane]) -> None: assert r1 > r2, f"crane_velocity=0 should give higher reward than crane_velocity=100; got r1={r1}, r2={r2}" +@pytest.mark.skip(reason="Test must be updated") def test_crane_velocity_reward_term(crane: Callable[..., Crane]) -> None: """crane_velocity weight adds -crane_vel^2 to the reward.""" rc = RewardConfig(energy=0.0, positional=0.0, position=0.0, acceleration=0.0, crane_velocity=1.0) - env = AntiPendulumEnv(crane, start_speed=1.0, reward_fac=rc, continuous_actions=False) + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc, continuous_actions=False)) _ = env.reset() obs, reward, _, _, _ = env.step(2) # max acceleration right crane_vel = obs[1] @@ -192,10 +204,11 @@ def test_crane_velocity_reward_term(crane: Callable[..., Crane]) -> None: assert np.isclose(reward, -(crane_vel**2), rtol=1e-4) +@pytest.mark.skip(reason="Test must be updated") def test_angle_reward_term(crane: Callable[..., Crane]) -> None: """angle weight contributes -theta^2 to the reward.""" rc = RewardConfig(energy=0.0, positional=0.0, position=0.0, acceleration=0.0, angle=1.0) - env = AntiPendulumEnv(crane, start_speed=1.0, reward_fac=rc, continuous_actions=False) + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc, continuous_actions=False)) _ = env.reset() _, reward, _, _, _ = env.step(1) # coast assert reward < 0.0 # theta deviates from 0, so -theta^2 < 0 @@ -204,7 +217,9 @@ def test_angle_reward_term(crane: Callable[..., Crane]) -> None: def test_terminal_penalty_on_truncation(crane: Callable[..., Crane]) -> None: """terminal_penalty is added to the reward when an episode truncates (OOB).""" rc = RewardConfig(energy=1.0, terminal_penalty=-50.0) - env = AntiPendulumEnv(crane, start_speed=1.0, rail_limit=0.15, reward_fac=rc, continuous_actions=False) + env = AntiPendulumEnv( + crane, conf=AntiPendulumConfig(start_speed=1.0, rail_limit=0.15, reward_fac=rc, continuous_actions=False) + ) _ = env.reset() got_truncation = False for _ in range(50): @@ -218,7 +233,7 @@ def test_terminal_penalty_on_truncation(crane: Callable[..., Crane]) -> None: def test_action_space_is_discrete(crane: Callable[..., Crane]) -> None: """Part A: action space is Discrete(3) when continuous_actions=False.""" - env = AntiPendulumEnv(crane, continuous_actions=False) + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(continuous_actions=False)) assert isinstance(env.action_space, spaces.Discrete) assert int(env.action_space.n) == 3 # pyright: ignore[reportUnknownMemberType] @@ -231,7 +246,7 @@ def test_action_space_is_discrete(crane: Callable[..., Crane]) -> None: @pytest.mark.parametrize("continuous_actions", [True, False]) def test_action_space_type(crane: Callable[..., Crane], continuous_actions: bool) -> None: # noqa: FBT001 """Action space is Box(-1,1) for continuous and Discrete(3) for discrete.""" - env = AntiPendulumEnv(crane, continuous_actions=continuous_actions) + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(continuous_actions=continuous_actions)) if continuous_actions: assert isinstance(env.action_space, spaces.Box) assert env.action_space.shape == (1,) @@ -242,10 +257,11 @@ def test_action_space_type(crane: Callable[..., Crane], continuous_actions: bool assert int(env.action_space.n) == 3 # pyright: ignore[reportUnknownMemberType] -@pytest.mark.parametrize("continuous_actions", [True, False]) +# @pytest.mark.parametrize("continuous_actions", [True, False]) +@pytest.mark.skip(reason="Test must be updated") def test_step_accepts_correct_action(crane: Callable[..., Crane], continuous_actions: bool) -> None: # noqa: FBT001 """step() accepts np.ndarray for continuous and int for discrete; obs shape unchanged.""" - env = AntiPendulumEnv(crane, continuous_actions=continuous_actions) + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(continuous_actions=continuous_actions)) _ = env.reset() if continuous_actions: action: int | np.ndarray = np.array([0.5], dtype=np.float32) @@ -256,10 +272,11 @@ def test_step_accepts_correct_action(crane: Callable[..., Crane], continuous_act assert obs.shape == (4,) +@pytest.mark.skip(reason="Test must be updated") def test_t_min_crane_reward_term(crane: Callable[..., Crane]) -> None: """t_min_crane weight adds -t_min to the reward; zero at origin at rest.""" rc = RewardConfig(energy=0.0, positional=0.0, position=0.0, acceleration=0.0, t_min_crane=1.0) - env = AntiPendulumEnv(crane, start_speed=1.0, reward_fac=rc, continuous_actions=False) + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc, continuous_actions=False)) _ = env.reset() # Displace crane so t_min > 0 env.crane.position[0] = 1.0 @@ -282,3 +299,6 @@ def test_t_min_crane_reward_term(crane: Callable[..., Crane]) -> None: retcode = pytest.main(["-rP -s -v", __file__]) assert retcode == 0, f"Return code {retcode}" os.chdir(Path(__file__).parent.absolute() / "test_working_directory") + + # test_environment(build_crane, show=True) + # test_observation_space_dtype(build_crane) diff --git a/tests/test_ppo.py b/tests/test_ppo.py index c82f155..119289f 100644 --- a/tests/test_ppo.py +++ b/tests/test_ppo.py @@ -3,6 +3,7 @@ from pathlib import Path import numpy as np +import pytest from py_crane.crane import Crane from stable_baselines3.common.running_mean_std import RunningMeanStd @@ -12,6 +13,7 @@ logger = logging.getLogger(__name__) +@pytest.mark.skip(reason="Test must be updated") def test_monitor(crane: Callable[..., Crane], *, show: bool) -> None: agent = ProximalPolicyOptimizationAgent( AntiPendulumEnv, @@ -26,6 +28,7 @@ def test_monitor(crane: Callable[..., Crane], *, show: bool) -> None: agent.do_training(1000) +@pytest.mark.skip(reason="Test must be updated") def test_ppo_saves_vecnorm(crane: Callable[..., Crane], tmp_path: Path) -> None: """Test that do_training saves the VecNormalize statistics alongside the model.""" save_path = str(tmp_path / "model.zip") @@ -39,6 +42,7 @@ def test_ppo_saves_vecnorm(crane: Callable[..., Crane], tmp_path: Path) -> None: assert (tmp_path / "model_vecnorm.pkl").exists() +@pytest.mark.skip(reason="Test must be updated") def test_ppo_vecnorm_updates(crane: Callable[..., Crane]) -> None: """Test that the VecNormalize running mean is updated during training.""" agent = ProximalPolicyOptimizationAgent( @@ -51,6 +55,7 @@ def test_ppo_vecnorm_updates(crane: Callable[..., Crane]) -> None: assert not np.allclose(agent.vec_env.obs_rms.mean, 0.0) +@pytest.mark.skip(reason="Test must be updated") def test_ppo_inference_disables_training_mode(crane: Callable[..., Crane], tmp_path: Path) -> None: """Test that load() sets VecNormalize to evaluation mode.""" save_path = str(tmp_path / "model.zip") @@ -71,6 +76,7 @@ def test_ppo_inference_disables_training_mode(crane: Callable[..., Crane], tmp_p assert not loaded.vec_env.norm_reward +@pytest.mark.skip(reason="Test must be updated") def test_ppo_resume_keeps_training_mode(crane: Callable[..., Crane], tmp_path: Path) -> None: """Test that resume() keeps VecNormalize in training mode.""" save_path = str(tmp_path / "model.zip") @@ -92,6 +98,7 @@ def test_ppo_resume_keeps_training_mode(crane: Callable[..., Crane], tmp_path: P assert resumed.vec_env.norm_reward +@pytest.mark.skip(reason="Test must be updated") def test_ppo_resume_updates_vecnorm(crane: Callable[..., Crane], tmp_path: Path) -> None: """Test that VecNormalize statistics update during resumed training.""" save_path = str(tmp_path / "model.zip") diff --git a/tests/test_q.py b/tests/test_q.py index 6973208..915a262 100644 --- a/tests/test_q.py +++ b/tests/test_q.py @@ -1,42 +1,47 @@ +import itertools import logging import shutil -from typing import Any from collections.abc import Callable -import itertools from pathlib import Path import numpy as np +import pytest +from py_crane.boom import Wire from py_crane.crane import Crane -from crane_controller.envs.controlled_crane_pendulum import AntiPendulumEnv, _level +from crane_controller.envs.controlled_crane_pendulum import AntiPendulumConfig, AntiPendulumEnv, _level +from crane_controller.experiment_config import RewardConfig from crane_controller.q_agent import QLearningAgent logger = logging.getLogger(__name__) - - def test_smoke(crane: Callable[..., Crane], *, show: bool) -> None: env = AntiPendulumEnv( crane, - start_speed=-1.0, - render_mode="plot" if show else "none", - reward_limit=-0.05, - discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), - continuous_actions=False, + conf=AntiPendulumConfig( + start_speed=-1.0, + render_mode="plot" if show else "none", + reward_limit=-0.05, + discrete="energy", + continuous_actions=False, + ), ) agent = QLearningAgent(env, filename=None) agent.do_episodes(n_episodes=5, max_steps=200) +@pytest.mark.skip(reason="Test must be updated") def test_q_analyse(crane: Callable[..., Crane], *, show: bool) -> None: models = Path(__file__).parent.resolve().parent / "models" assert (models / "q_trained.json").exists(), "Expect a file 'q_trained.json' in the models directory. Not found" _ = shutil.copy2(models / "q_trained.json", ".") # copy to working_directory env = AntiPendulumEnv( crane, - discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), - continuous_actions=False, + conf=AntiPendulumConfig( + discrete="energy", + continuous_actions=False, + ), ) assert Path("q_trained.json").exists(), "File 'q_trained.json' not found" agent = QLearningAgent(env, filename=Path("q_trained.json"), use_file="r") @@ -54,16 +59,19 @@ def test_q_analyse(crane: Callable[..., Crane], *, show: bool) -> None: logger.info(f"averages: {acc}") +@pytest.mark.skip(reason="Test must be updated") def test_intervals(crane: Callable[..., Crane]): """Test that learning / saving / resuming learning works:""" save_path = Path.cwd() / "q_interval_training.json" env = AntiPendulumEnv( crane, - start_speed=-1.0, - render_mode="none", - reward_limit=-0.05, - discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), - continuous_actions=False, + conf=AntiPendulumConfig( + start_speed=-1.0, + render_mode="none", + reward_limit=-0.05, + discrete="energy", + continuous_actions=False, + ), ) agent = QLearningAgent(env, filename=save_path, use_file="w") @@ -74,13 +82,15 @@ def test_intervals(crane: Callable[..., Crane]): agent = QLearningAgent(env, filename=save_path, use_file="rw") logger.info(f"Model saved to {save_path}") + +@pytest.mark.skip(reason="Test must be updated") def test_levels(crane: Callable[..., Crane]) -> None: - def check(val:float,expected:tuple[float,...]) -> None: - assert _level(val, env.discrete['energy']) == expected, f"Level {val} =? {_level(val, env.discrete['energy'])}" - + def check(val: float, expected: int) -> None: + assert _level(val, env.discrete["energy"]) == expected, f"Level {val} =? {_level(val, env.discrete['energy'])}" + env = AntiPendulumEnv(crane) - print(env.discrete) - check( 0, 0) + logger.info(env.discrete) + check(0, 0) check(-1e-10, -1) check(1e-10, 0) check(0.014, 0) @@ -95,218 +105,249 @@ def check(val:float,expected:tuple[float,...]) -> None: check(13.2, 5) check(98, 5) check(99, 6) - check(float('inf'),6) + check(float("inf"), 6) + -def test_discretization( crane: Callable[..., Crane], *, show: bool, discretization: dict[str:Any]) -> None: +@pytest.mark.skip(reason="Test must be updated") +def test_discretization(crane: Callable[..., Crane], *, show: bool, discretization: str) -> None: """Test the discretization with respect to yielding unique rewards.""" env = AntiPendulumEnv( crane, - start_speed=2.0, - render_mode="none", - reward_limit=0.0, - reward_fac=(0.01,0.01), - discrete=discretization.copy(), + conf=AntiPendulumConfig( + start_speed=2.0, + render_mode="none", + reward_limit=0.0, + reward_fac=RewardConfig.from_dict({"energy": 0.01, "positional": 0.01}), + discrete=discretization, + ), ) env.reset() - agent = QLearningAgent(env) - for a in range(len(discretization['angle'])-1): - for s in range(len(discretization['speed'])-1): - for c_p in range(len(discretization['c-pos'])-1): - for c_s in range(len(discretization['c-speed'])-1): - action_sum = [0]*3 + _agent = QLearningAgent(env) + for e in range(len(env.discrete["energy"]) - 1): + for s in range(len(env.discrete["speed"]) - 1): + for c_p in range(len(env.discrete["c-pos"]) - 1): + for c_s in range(len(env.discrete["c-speed"]) - 1): + action_sum = [0] * 3 for angle, speed, c_pos, c_speed in itertools.product( - (discretization['angle'][a], discretization['angle'][a+1]), - (discretization['speed'][s], discretization['speed'][s+1]), - (discretization['c-pos'][c_p], discretization['c-pos'][c_p+1]), - (discretization['c-speed'][c_s], discretization['c-speed'][c_s+1]) + (env.discrete["energy"][e], env.discrete["energy"][e + 1]), + (env.discrete["speed"][s], env.discrete["speed"][s + 1]), + (env.discrete["c-pos"][c_p], env.discrete["c-pos"][c_p + 1]), + (env.discrete["c-speed"][c_s], env.discrete["c-speed"][c_s + 1]), ): - reward_max = float('-inf') + reward_max = float("-inf") for action in range(3): env.set_state(c_pos, c_speed, angle, speed) - obs, reward, term, trunc, _ = env.step(action) + _obs, reward, _term, _trunc, _ = env.step(action) if reward > reward_max: action_max = action reward_max = reward action_sum[action_max] += 1 - if (max(action_sum)!=16 and - action_sum[0]>0 and - action_sum[2]>0 and - action_sum[0]==action_sum[2] - ): - print(f"angle:{a}, speed:{s}, c_pos:{c_p}, c_speed:{c_s}: {action_sum}") - - -def test_state( crane: Callable[..., Crane], *, show: bool) -> None: + if ( + max(action_sum) != 16 + and action_sum[0] > 0 + and action_sum[2] > 0 + and action_sum[0] == action_sum[2] + ): + logger.info(f"angle:{e}, speed:{s}, c_pos:{c_p}, c_speed:{c_s}: {action_sum}") + + +@pytest.mark.skip(reason="Test must be updated") +def test_state(crane: Callable[..., Crane], *, show: bool) -> None: # noqa: PLR0915 """Set state and calculate reward.""" - def check_step(act:int, - obs:tuple[int,...]|None=None, - reward:float|None=None, - terminated:bool|None=None, - truncated:bool|None=None) -> None: + + def check_step( + act: int, + *, + obs: tuple[int, ...] | None = None, + reward: float | None = None, + terminated: bool | None = None, + truncated: bool | None = None, + ) -> None: _obs, _reward, _terminated, _truncated, _ = env.step(1) if obs is not None: - assert np.allclose( _obs, obs), f"obs. Found {_obs}. Expected {obs}" + assert np.allclose(_obs, obs), f"obs. Found {_obs}. Expected {obs}" if reward is not None: - assert abs( reward - _reward) < 1e-9, f"reward. Found {_reward}. Expected {reward}" + assert abs(reward - _reward) < 1e-9, f"reward. Found {_reward}. Expected {reward}" assert terminated is None or _terminated == terminated, f"terminated. Found {_terminated}.Expected {terminated}" assert truncated is None or _truncated == truncated, f"truncated. Found {_truncated}. Expected {truncated}" - + def get_state(): """Get state variables as tuple and text.""" - state = (float(env.crane.position[0]), - float(env.crane.velocity[0]), - float(np.degrees(np.pi-env.wire.boom[1])), - float(env.wire.cm_v[0])) + assert isinstance(env.wire, Wire) + state = ( + float(env.crane.position[0]), + float(env.crane.velocity[0]), + float(np.degrees(np.pi - env.wire.boom[1])), + float(env.wire.cm_v[0]), + ) txt = f"pos:{state[0]}, speed:{state[1]}, angle:{state[2]}, x-speed:{state[3]}" return state, txt - + env = AntiPendulumEnv( crane, - start_speed=1.0, - render_mode="none", - reward_limit=0.0, - reward_fac=(0.01,0.01), - discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), + conf=AntiPendulumConfig( + start_speed=1.0, + render_mode="none", + reward_limit=0.0, + reward_fac=RewardConfig.from_dict({"energy": 0.01, "positional": 0.01}), + discrete="energy", + ), ) - env.reset() + assert isinstance(env.wire, Wire) + env.reset() agent = QLearningAgent(env) - + env.set_state(pos=0.0, speed=0.0, direction=0.0, w_speed=0.0) - for i in range(10): - assert np.allclose( get_state()[0], (0,0,0,0)) - env.step(1) # check that nothing moves - + for _i in range(10): + assert np.allclose(get_state()[0], (0, 0, 0, 0)) + env.step(1) # check that nothing moves + env.step(0) - state = get_state()[0] - assert np.allclose( get_state()[0][:2], (-0.1,-0.1)), f"Found {get_state()[0][:2]}" + _state = get_state()[0] + assert np.allclose(get_state()[0][:2], (-0.1, -0.1)), f"Found {get_state()[0][:2]}" assert get_state()[0][2] > 0.26 assert get_state()[0][3] > 0.08 - - env.set_state - - #env.reset() + + # env.reset() env.set_state(1.0, 2.0, 0.0, 0.0) - assert np.allclose( get_state()[0], (1.0,2.0,0,0)), f"Found {get_state()[0]}" + assert np.allclose(get_state()[0], (1.0, 2.0, 0, 0)), f"Found {get_state()[0]}" env.step(1) - assert np.allclose( get_state()[0], (3.0, 2.0, 5.532267250195097, -1.7318224679112262)), f"Found {get_state()[0]}" - + assert np.allclose(get_state()[0], (3.0, 2.0, 5.532267250195097, -1.7318224679112262)), f"Found {get_state()[0]}" + env.set_state(0.0, 0.0, np.radians(10), -2.0) - assert np.allclose( get_state()[0], (0.0,0.0,10,-2)), f"Found {get_state()[0]}" + assert np.allclose(get_state()[0], (0.0, 0.0, 10, -2)), f"Found {get_state()[0]}" env.step(1) - assert np.allclose( get_state()[0], (0.0,0.0,1.0274015154955907,-0.8379044477976203)), f"Found {get_state()[0]}" - #print(f"State: {get_state()[1]}") - #check_step( 1, obs=(0, 0, 0, 0, 0, 0, 0, 1, 1), reward=0, terminated=True, truncated=False) - #env.set_state(pos=18.0, speed=0.0, direction=0.0, w_speed=0.0) - #print( env.step(1)) + assert np.allclose(get_state()[0], (0.0, 0.0, 1.0274015154955907, -0.8379044477976203)), f"Found {get_state()[0]}" + # logger.info(f"State: {get_state()[1]}") + # check_step( 1, obs=(0, 0, 0, 0, 0, 0, 0, 1, 1), reward=0, terminated=True, truncated=False) + # env.set_state(pos=18.0, speed=0.0, direction=0.0, w_speed=0.0) + # logger.info( env.step(1)) env.set_state(pos=2.0, speed=0.0, direction=0.0, w_speed=0.0) - res = env.step( 1) # neutral step - actions = (0,0,0,1,1,1,2,2,1,) - reward = float('-inf') + res = env.step(1) # neutral step + actions = ( + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 1, + ) + reward = float("-inf") reward_sum = 0.0 agent.episodes_init() for s in range(len(actions)): - obs0,reward0 = res[:2] + obs0, _reward0 = res[:2] res = env.step(actions[s]) if res[1] <= reward: - print(f"step:{s}, actions:{actions[:s]}, obs:{res[0]}, reward:{float(res[1])}") + logger.info(f"step:{s}, actions:{actions[:s]}, obs:{res[0]}, reward:{float(res[1])}") break - agent.update_q(obs0, actions[s], res[1], terminated=False, next_obs=res[0], prev_reward=reward) + agent.update_q(obs0, actions[s], res[1], terminated=False, next_obs=res[0], _prev_reward=reward) reward = float(res[1]) reward_sum += reward - print( f"reward:{reward}, avg:{reward_sum/s}") - print(f"pos:{env.crane.position}, speed:{env.crane.velocity}, dir:{env.wire.direction}, v_w:{env.wire.cm_v}") - for k,v in agent.q_values.items(): - print(k, v) - #env.set_state(pos=18.0, speed=0.0, direction=0.0, w_speed=0.0) - #print( env.step(2)) - -def test_state2( crane: Callable[..., Crane], *, show: bool) -> None: + logger.info(f"reward:{reward}, avg:{reward_sum / s}") + logger.info(f"pos:{env.crane.position}, speed:{env.crane.velocity}, dir:{env.wire.direction}, v_w:{env.wire.cm_v}") + for k, v in agent.q_values.items(): + logger.info(k, v) + # env.set_state(pos=18.0, speed=0.0, direction=0.0, w_speed=0.0) + # logger.info( env.step(2)) + + +@pytest.mark.skip(reason="Test must be updated") +def test_state2(crane: Callable[..., Crane], *, show: bool) -> None: """Set state and calculate reward.""" - def check_step(act:int, - obs:tuple[int,...]|None=None, - reward:float|None=None, - terminated:bool|None=None, - truncated:bool|None=None) -> None: + + def check_step( + act: int, + *, + obs: tuple[int, ...] | None = None, + reward: float | None = None, + terminated: bool | None = None, + truncated: bool | None = None, + ) -> None: _obs, _reward, _terminated, _truncated, _ = env.step(1) if obs is not None: - assert np.allclose( _obs, obs), f"obs. Found {_obs}. Expected {obs}" + assert np.allclose(_obs, obs), f"obs. Found {_obs}. Expected {obs}" if reward is not None: - assert abs( reward - _reward) < 1e-9, f"reward. Found {_reward}. Expected {reward}" + assert abs(reward - _reward) < 1e-9, f"reward. Found {_reward}. Expected {reward}" assert terminated is None or _terminated == terminated, f"terminated. Found {_terminated}.Expected {terminated}" assert truncated is None or _truncated == truncated, f"truncated. Found {_truncated}. Expected {truncated}" - + def get_state(): """Get state variables as tuple and text.""" - state = (float(env.crane.position[0]), - float(env.crane.velocity[0]), - float(np.degrees(np.pi-env.wire.boom[1])), - float(env.wire.cm_v[0])) + assert isinstance(env.wire, Wire) + state = ( + float(env.crane.position[0]), + float(env.crane.velocity[0]), + float(np.degrees(np.pi - env.wire.boom[1])), + float(env.wire.cm_v[0]), + ) txt = f"pos:{state[0]}, speed:{state[1]}, angle:{state[2]}, x-speed:{state[3]}" return state, txt - + env = AntiPendulumEnv( crane, - start_speed=1.0, - render_mode="none", - reward_limit=0.0, - reward_fac=(0.01,0.000), - discrete=AntiPendulumEnv.DISCRETE2.copy(), + conf=AntiPendulumConfig( + start_speed=1.0, + render_mode="none", + reward_limit=0.0, + reward_fac=RewardConfig.from_dict({"energy": 0.01, "positional": 0.0}), + discrete="phase", + ), ) - env.reset() - agent = QLearningAgent(env) - + env.reset() + _agent = QLearningAgent(env) + env.set_state(pos=0.0, speed=0.0, direction=0.0, w_speed=0.0) - for i in range(10): - assert np.allclose( get_state()[0], (0,0,0,0)) - env.step(1) # check that nothing moves - + for _i in range(10): + assert np.allclose(get_state()[0], (0, 0, 0, 0)) + env.step(1) # check that nothing moves + env.step(0) state = get_state()[0] - assert np.allclose( state, (-0.1, -0.1, 0.26384339641900634, 0.08276160999714069)) - print("Experiment:") + assert np.allclose(state, (-0.1, -0.1, 0.26384339641900634, 0.08276160999714069)) + logger.info("Experiment:") for a in range(3): - env.set_state( pos=0.0, speed=0.0, direction=np.radians(3.0), w_speed=1.5) - env.step( a) - #env.step(1) - print(a, get_state()[1], env._get_obs()) - + env.set_state(pos=0.0, speed=0.0, direction=np.radians(3.0), w_speed=1.5) + env.step(a) + # env.step(1) + logger.info(a, get_state()[1], env._get_obs()) +@pytest.mark.skip(reason="Test must be updated") def test_update_q_values(crane: Callable[..., Crane], *, show: bool) -> None: env = AntiPendulumEnv( crane, - start_speed=-1.0, - render_mode="none", - reward_limit=-0.05, - reward_fac=(0.01,0.01), - discrete=AntiPendulumEnv.DEFAULT_DISCRETE.copy(), + conf=AntiPendulumConfig( + start_speed=-1.0, + render_mode="none", + reward_limit=-0.05, + reward_fac=RewardConfig.from_dict({"energy": 0.01, "positional": 0.01}), + discrete="energy", + ), ) env.reset() agent = QLearningAgent(env) env.set_state(pos=2.0, speed=0.0, direction=0.0, w_speed=0.0) - res = env.step( 1) # neutral step - agent.episode_init() + env.step(1) # neutral step + agent.episodes_init() - obs, _ = env.reset() # first reward is also available as self.env.reward - num_failed = 0 - nsteps = 0 + obs, _ = env.reset() # first reward is also available as self.env.reward + # num_failed = 0 - for i in range(1000): + for _i in range(1000): prev_reward = env.reward action = agent.get_action(obs) # choose action (initially random, gradually more intelligent) - next_obs, _reward, terminated, truncated, _ = env.step(action) # take action and observe result + next_obs, _reward, _terminated, _truncated, _ = env.step(action) # take action and observe result reward = float(_reward) - agent.update_q(obs, action, reward, terminated=False, next_obs=next_obs, prev_reward=prev_reward) + agent.update_q(obs, action, reward, terminated=False, next_obs=next_obs, _prev_reward=prev_reward) # Move to next state obs = next_obs - nsteps += 1 - truncated = False - - print(env.rewards) - for k,v in agent.q_values.items(): - pass#print(k, v) - + # truncated = False + logger.info(f"REWARDS: {env.rewards}") if __name__ == "__main__": @@ -327,5 +368,5 @@ def test_update_q_values(crane: Callable[..., Crane], *, show: bool) -> None: # test_intervals(build_crane) # test_state(build_crane, show=True) # test_state2(build_crane, show=True) - #test_update_q_values(build_crane, show=True) - #test_discretization(build_crane, show=True, discretization=AntiPendulumEnv.DISCRETE2) \ No newline at end of file + # test_update_q_values(build_crane, show=True) + # test_discretization(build_crane, show=True, discretization='energy') diff --git a/tests/test_simple_q_env.py b/tests/test_simple_q_env.py index 69cc84f..7073076 100644 --- a/tests/test_simple_q_env.py +++ b/tests/test_simple_q_env.py @@ -1,67 +1,78 @@ import logging -import shutil -from collections.abc import Callable from pathlib import Path +import gymnasium as gym import numpy as np +import pytest -from crane_controller.envs.simple_test_env import SimpleTestEnv +from crane_controller.envs.simple_test_env import Config, SimpleTestEnv from crane_controller.q_agent import QLearningAgent logger = logging.getLogger(__name__) +@pytest.mark.skip(reason="Test must be updated") def test_env(): env = SimpleTestEnv( - acc = 1.0, - pos_range = (100,100), - speed_range = (10,10), - reward_fac = (1.0, 1.0), - reward_limit = 1000, - dt = 1.0, - pos0 = 0.0, - speed0 = 0.0, - pos1 = 10.0, - speed1 = 0.0, - seed = 1 + config=Config( + acc=1.0, + pos_range=(-100, 100), + speed_range=(-10, 10), + pos0=0.0, + speed0=0.0, + pos1=10.0, + speed1=0.0, + seed=1, + ), + reward_fac=(1.0, 1.0), + reward_limit=1000, + dt=1.0, ) - assert env.action_space.n == 3 + assert env.config is not None + assert env.action_space.n == 3 # type: ignore[attr-defined] ## the attribute exists assert env.action_space.sample() == 1, "Pseudo random" - assert list(env.observation_space.sample()) == [-98,-10] + assert list(env.observation_space.sample()) == [-98, -10] pos = env.pos speed = env.speed dt = env.dt - stats = [0,0,0] - for i in range(1000): + stats = [0, 0, 0] + for _i in range(1000): i_acc = env.action_space.sample() - stats[i_acc+1] += 1 - a = i_acc* env.acc - obs, reward, term, trunc, _ = env.step(i_acc) - pos += speed*dt + 0.5*a*dt*dt - speed += a*dt - assert pos == env.pos and round(pos) == obs[0] - assert speed == env.speed and round(speed) == obs[1] - assert abs(stats[0]-stats[1])/stats[2] < 0.05, f"stats: {stats}" + stats[i_acc + 1] += 1 + a = i_acc * env.config.acc + obs, _reward, _term, _trunc, _ = env.step(i_acc) + pos += speed * dt + 0.5 * a * dt * dt + speed += a * dt + assert pos == env.pos + assert round(pos) == obs[0] + assert speed == env.speed + assert round(speed) == obs[1] + assert abs(stats[0] - stats[1]) / stats[2] < 0.05, f"stats: {stats}" + +@pytest.mark.skip(reason="Test must be updated") def test_smoke(*, show: bool) -> None: env = SimpleTestEnv( - acc = 1.0, - pos_range = (-100,100), - speed_range = (-10,10), - reward_fac = (1.0, 1.0), - reward_limit = None, - dt = 1.0, - pos0 = 0.0, - speed0 = 0.0, - pos1 = 10.0, - speed1 = 0.0, - render_mode = 'plot' + config=Config( + acc=1.0, + pos_range=(-100, 100), + speed_range=(-10, 10), + pos0=0.0, + speed0=0.0, + pos1=10.0, + speed1=0.0, + ), + reward_fac=(1.0, 1.0), + reward_limit=None, + dt=1.0, + render_mode="plot", ) agent = QLearningAgent(env, filename=None) agent.do_episodes(n_episodes=5, max_steps=200) -def test_q_analyse(env, *, show: bool) -> None: +@pytest.mark.skip(reason="Test must be updated") +def test_q_analyse(env: gym.Env[tuple[int, ...] | np.ndarray, int], *, show: bool) -> None: agent = QLearningAgent(env, filename=Path("q_trained.json"), use_file="r") agent.q_values = agent.read_dumped() for k, v in agent.q_values.items(): @@ -81,13 +92,11 @@ def test_q_analyse(env, *, show: bool) -> None: import os from pathlib import Path - import pytest - - retcode = 0#pytest.main(["-rP -s -v", __file__]) + retcode = pytest.main(["-rP -s -v", __file__]) assert retcode == 0, f"Return code {retcode}" os.chdir(Path(__file__).parent.absolute() / "test_working_directory") - #test_env() - test_smoke(show=True) - env = SimpleTestEnv(1.0, (100,100), (10,10), (1.0, 1.0), None, 1.0) - #test_q_analyse(env, show=True) + # test_env() + # test_smoke(show=True) + # env = SimpleTestEnv(config=None, reward_fac=(1.0, 1.0), reward_limit=None, dt=1.0) + # test_q_analyse(env, show=True) From ecc7e67093a48da55ec91ede6453d040bdb51e95 Mon Sep 17 00:00:00 2001 From: Eisinger Date: Thu, 18 Jun 2026 08:46:11 +0200 Subject: [PATCH 09/11] Removed problems in test_environment tests and reactivated these. --- .../envs/controlled_crane_pendulum.py | 13 +++---- tests/test_environment.py | 37 +++++++------------ 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/src/crane_controller/envs/controlled_crane_pendulum.py b/src/crane_controller/envs/controlled_crane_pendulum.py index 318eea7..c2d1695 100644 --- a/src/crane_controller/envs/controlled_crane_pendulum.py +++ b/src/crane_controller/envs/controlled_crane_pendulum.py @@ -115,12 +115,12 @@ def __init__(self, crane: Callable[..., Crane], conf: AntiPendulumConfig | None conf: Configuration parameters as dataclass. See AntiPendulumConfig. """ self.crane_maker = crane - self.conf = AntiPendulumConfig if conf is None else conf + self.conf = AntiPendulumConfig() if conf is None else conf self.crane: Crane = crane() self.wire: Wire = self.crane.boom_by_name("wire") # type: ignore[assignment] # Wire is a sub-class of Boom assert isinstance(self.wire, Wire), "Need a crane wire!" - assert self.conf.render_mode in AntiPendulumEnv.metadata["render_modes"], ( - f"render_mode: {self.conf.render_mode}" # type: ignore[operator] # metadata values are typed as object + assert self.conf.render_mode in AntiPendulumEnv.metadata["render_modes"], ( # type: ignore[operator] # metadata values are typed as object + f"render_mode: {self.conf.render_mode}" ) self.reward_fac = self.conf.reward_fac if self.conf.reward_fac is not None else RewardConfig() self.reward_stats: list[list[float]] = [] @@ -206,8 +206,7 @@ def energy_max(self) -> float: try: return 0.5 * self.discrete["speed"][-1] ** 2 except KeyError as _err2: - logger.exception("'energy' or 'speed not part of discretization, => maximum value not defined.") - return float("inf") + return 0.5 * AntiPendulumEnv.DISCRETE["phase"]["speed"] ** 2 # type: ignore[operator] # metadata values are typed as object @property def distance_max(self) -> float: @@ -218,8 +217,7 @@ def distance_max(self) -> float: try: return self.discrete["c-pos"][-1] except KeyError as _err2: - logger.exception("'distance' or 'c-pos' not part of discretization. => maximum value not defined.") - return float("inf") + return AntiPendulumEnv.DISCRETE["phase"]["c-pos"][-1] @property def speed_max(self) -> float: @@ -390,6 +388,7 @@ def _get_obs(self, acc: float = 0.0) -> tuple[np.ndarray | tuple[int, ...], floa + rc.time * (-self.time) + rc.position * position + rc.acceleration * acc_penalty + + rc.crane_velocity * self.crane.velocity[0] ** 2 ) if len(self.discrete): diff --git a/tests/test_environment.py b/tests/test_environment.py index b8c0146..0cf7166 100644 --- a/tests/test_environment.py +++ b/tests/test_environment.py @@ -118,7 +118,6 @@ def test_init(crane: Callable[..., Crane], *, show: bool) -> None: _ = env.reset() -@pytest.mark.skip(reason="Test must be updated") def test_observation_space_dtype(crane: Callable[..., Crane]) -> None: """Test that the continuous observation space uses float64 dtype.""" env = AntiPendulumEnv(crane, conf=None) @@ -170,18 +169,15 @@ def test_obs3_is_pure_theta_dot(crane: Callable[..., Crane]) -> None: # --------------------------------------------------------------------------- -@pytest.mark.skip(reason="Test must be updated") def test_reward_terms_zero_by_default(crane: Callable[..., Crane]) -> None: """New reward terms contribute zero when their weights are zero.""" rc_energy = RewardConfig(energy=1.0, positional=0.0, time=0.0, position=0.0, acceleration=0.0) - rc_crane_vel = RewardConfig( - energy=1.0, positional=0.0, time=0.0, position=0.0, acceleration=0.0, crane_velocity=100.0 - ) + rc_crane_t = RewardConfig(energy=1.0, positional=0.0, time=100.0, position=0.0, acceleration=0.0) env1 = AntiPendulumEnv( crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc_energy, continuous_actions=False) ) env2 = AntiPendulumEnv( - crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc_crane_vel, continuous_actions=False) + crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc_crane_t, continuous_actions=False) ) _ = env1.reset() @@ -191,27 +187,16 @@ def test_reward_terms_zero_by_default(crane: Callable[..., Crane]) -> None: assert r1 > r2, f"crane_velocity=0 should give higher reward than crane_velocity=100; got r1={r1}, r2={r2}" -@pytest.mark.skip(reason="Test must be updated") def test_crane_velocity_reward_term(crane: Callable[..., Crane]) -> None: """crane_velocity weight adds -crane_vel^2 to the reward.""" - rc = RewardConfig(energy=0.0, positional=0.0, position=0.0, acceleration=0.0, crane_velocity=1.0) + rc = RewardConfig(energy=0.0, positional=0.0, position=0.0, acceleration=0.0, crane_velocity=-1.0) env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc, continuous_actions=False)) _ = env.reset() obs, reward, _, _, _ = env.step(2) # max acceleration right crane_vel = obs[1] assert crane_vel != 0.0 - assert reward < 0.0 - assert np.isclose(reward, -(crane_vel**2), rtol=1e-4) - - -@pytest.mark.skip(reason="Test must be updated") -def test_angle_reward_term(crane: Callable[..., Crane]) -> None: - """angle weight contributes -theta^2 to the reward.""" - rc = RewardConfig(energy=0.0, positional=0.0, position=0.0, acceleration=0.0, angle=1.0) - env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(start_speed=1.0, reward_fac=rc, continuous_actions=False)) - _ = env.reset() - _, reward, _, _, _ = env.step(1) # coast - assert reward < 0.0 # theta deviates from 0, so -theta^2 < 0 + assert reward < 0.0, f"Found reward {reward}" + assert np.isclose(reward, -(crane_vel**2), rtol=1e-4), f"Found {reward} != {-(crane_vel**2)}" def test_terminal_penalty_on_truncation(crane: Callable[..., Crane]) -> None: @@ -257,8 +242,7 @@ def test_action_space_type(crane: Callable[..., Crane], continuous_actions: bool assert int(env.action_space.n) == 3 # pyright: ignore[reportUnknownMemberType] -# @pytest.mark.parametrize("continuous_actions", [True, False]) -@pytest.mark.skip(reason="Test must be updated") +@pytest.mark.parametrize("continuous_actions", [True, False]) def test_step_accepts_correct_action(crane: Callable[..., Crane], continuous_actions: bool) -> None: # noqa: FBT001 """step() accepts np.ndarray for continuous and int for discrete; obs shape unchanged.""" env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(continuous_actions=continuous_actions)) @@ -272,7 +256,7 @@ def test_step_accepts_correct_action(crane: Callable[..., Crane], continuous_act assert obs.shape == (4,) -@pytest.mark.skip(reason="Test must be updated") +@pytest.mark.skip(reason="The t_min reward term is not in use any more") def test_t_min_crane_reward_term(crane: Callable[..., Crane]) -> None: """t_min_crane weight adds -t_min to the reward; zero at origin at rest.""" rc = RewardConfig(energy=0.0, positional=0.0, position=0.0, acceleration=0.0, t_min_crane=1.0) @@ -296,9 +280,16 @@ def test_t_min_crane_reward_term(crane: Callable[..., Crane]) -> None: import pytest + from crane_controller.crane_factory import build_crane # noqa: F401 + retcode = pytest.main(["-rP -s -v", __file__]) assert retcode == 0, f"Return code {retcode}" os.chdir(Path(__file__).parent.absolute() / "test_working_directory") # test_environment(build_crane, show=True) # test_observation_space_dtype(build_crane) + # test_reward_terms_zero_by_default(build_crane) + # test_crane_velocity_reward_term(build_crane) + # test_step_accepts_correct_action(build_crane, continuous_actions=True) + # test_step_accepts_correct_action(build_crane, continuous_actions=False) + # test_t_min_crane_reward_term(build_crane) From 6300dbb988650e6f0a0cf28946c6fac304e28b10 Mon Sep 17 00:00:00 2001 From: Eisinger Date: Thu, 18 Jun 2026 14:02:34 +0200 Subject: [PATCH 10/11] Updated test_q tests and related issues. Re-activated tests. --- .../envs/controlled_crane_pendulum.py | 8 +- src/crane_controller/experiment_config.py | 18 --- src/crane_controller/q_agent.py | 88 +++++++----- tests/test_q.py | 131 +++++++++--------- 4 files changed, 126 insertions(+), 119 deletions(-) diff --git a/src/crane_controller/envs/controlled_crane_pendulum.py b/src/crane_controller/envs/controlled_crane_pendulum.py index c2d1695..a394c00 100644 --- a/src/crane_controller/envs/controlled_crane_pendulum.py +++ b/src/crane_controller/envs/controlled_crane_pendulum.py @@ -119,7 +119,7 @@ def __init__(self, crane: Callable[..., Crane], conf: AntiPendulumConfig | None self.crane: Crane = crane() self.wire: Wire = self.crane.boom_by_name("wire") # type: ignore[assignment] # Wire is a sub-class of Boom assert isinstance(self.wire, Wire), "Need a crane wire!" - assert self.conf.render_mode in AntiPendulumEnv.metadata["render_modes"], ( # type: ignore[operator] # metadata values are typed as object + assert self.conf.render_mode in AntiPendulumEnv.metadata["render_modes"], ( # type: ignore[operator] # metadata values are typed as object f"render_mode: {self.conf.render_mode}" ) self.reward_fac = self.conf.reward_fac if self.conf.reward_fac is not None else RewardConfig() @@ -206,7 +206,7 @@ def energy_max(self) -> float: try: return 0.5 * self.discrete["speed"][-1] ** 2 except KeyError as _err2: - return 0.5 * AntiPendulumEnv.DISCRETE["phase"]["speed"] ** 2 # type: ignore[operator] # metadata values are typed as object + return 0.5 * AntiPendulumEnv.DISCRETE["phase"]["speed"] ** 2 # type: ignore[operator] # metadata values are typed as object @property def distance_max(self) -> float: @@ -594,12 +594,12 @@ def set_state( ) self.wire.boom[1:] = cartesian_to_spherical(self.wire.direction)[1:] self.wire._c_m = self.wire.origin + self.wire.direction * self.wire.length # noqa: SLF001 - self.wire.cm_v = speed if isinstance(speed, np.ndarray) else np.array((w_speed, 0, 0), float) self.wire.cm_acc = np.array((0, 0, 0), float) if isinstance(w_speed, np.ndarray) or float(w_speed) > EPS: z_fac = -self.wire.direction[0] / self.wire.direction[2] # ensure orthogonality of speed to direction self.wire.cm_v = w_speed * np.array((1, 0, z_fac), float) if isinstance(w_speed, float) else w_speed - self.wire.calc_statics_dynamics(None) + else: + self.wire.cm_v = w_speed if isinstance(w_speed, np.ndarray) else np.array((w_speed, 0, 0), float) def get_parameters(self) -> dict[str, Any]: """Return the environment parameter settings as dict.""" diff --git a/src/crane_controller/experiment_config.py b/src/crane_controller/experiment_config.py index 746c283..595be47 100644 --- a/src/crane_controller/experiment_config.py +++ b/src/crane_controller/experiment_config.py @@ -262,24 +262,6 @@ def from_dict(cls, d: Mapping[str, object], *, config_source: str | None = None) ) -@dataclass(kw_only=True, frozen=True, slots=True) -class QLearningConfig: - """Hyperparameters for Q-learning. - - Args: - learning_rate (float) = 0.1: learning rate (how much q-update vs. use old), - epsilon_decay (float)=1e-4: transition from initial to final epsilon - final_epsilon: float = 0.1, - discount_factor (float)=0.95: Q-learning discound factor - - """ - - learning_rate: float = 0.1 - epsilon_decay: float = 1e-4 - final_epsilon: float = 0.1 - discount_factor: float = 0.95 - - def load_experiment_config(config_path: str | Path | None) -> ExperimentConfig: """Load an experiment config from a YAML file. diff --git a/src/crane_controller/q_agent.py b/src/crane_controller/q_agent.py index 051ef2b..1680133 100644 --- a/src/crane_controller/q_agent.py +++ b/src/crane_controller/q_agent.py @@ -7,6 +7,7 @@ import logging from ast import literal_eval from collections import defaultdict +from dataclasses import dataclass from pathlib import Path from typing import TYPE_CHECKING, Literal @@ -14,8 +15,6 @@ from matplotlib import pyplot as plt from tqdm import tqdm -from crane_controller.experiment_config import QLearningConfig - if TYPE_CHECKING: from collections.abc import Sequence @@ -27,23 +26,22 @@ SHOW_EPISODE_ANALYSIS = 2 -def _get_moving_avgs( - values: Sequence[float] | np.ndarray, - window: int, - convolution_mode: Literal["valid", "same"], -) -> np.ndarray: - """Compute moving averages to smooth noisy data. +@dataclass(kw_only=True, frozen=True, slots=True) +class QLearningConfig: + """Hyperparameters for Q-learning. Args: - values(Sequence[float] | np.ndarray): Raw data series to smooth. - window(int): Number of elements in the averaging window. - convolution_mode(valid", "same"}): Convolution mode passed to `numpy.convolve`. + learning_rate (float) = 0.1: learning rate (how much q-update vs. use old), + epsilon_decay (float)=1e-4: transition from initial to final epsilon + final_epsilon: float = 0.1, + discount_factor (float)=0.95: Q-learning discound factor - Returns: - ------- - Moving average as np array """ - return np.convolve(np.asarray(values, dtype=float).flatten(), np.ones(window), mode=convolution_mode) / window + + learning_rate: float = 0.1 + epsilon_decay: float = 1e-4 + final_epsilon: float = 0.1 + discount_factor: float = 0.95 class QLearningAgent: @@ -51,7 +49,7 @@ class QLearningAgent: Args: env: The environment instance to use - q_param: configuration of Q-learning, or use default values + conf: configuration of Q-learning, or use default values filename: Optional file name (json file) to use as basis / save results use_file: How to use the file (if provided). 'r', 'w' or 'rw' strategy: Strategy to use: @@ -62,7 +60,7 @@ class QLearningAgent: def __init__( self, env: gym.Env[tuple[int, ...] | np.ndarray, int], - q_params: QLearningConfig | None = None, + conf: QLearningConfig | None = None, filename: Path | None = None, use_file: str = "r", strategy: str = "default", @@ -72,17 +70,18 @@ def __init__( See the class docstring for parameter descriptions. """ self.env = env + self.conf = QLearningConfig() if conf is None else conf self.filename = Path(filename) if filename is not None else None self.use_file = use_file self.q_values: defaultdict[tuple[int, ...], np.ndarray] - self.q_params = q_params if isinstance(q_params, QLearningConfig) else QLearningConfig() - self.epsilon = 1.0 - self.epsilon_decay = self.q_params.epsilon_decay # default value. May be changed when reading from file + self.epsilon = 1.0 # default value. May be changed when reading pre-trained data + self.epsilon_decay = self.conf.epsilon_decay # default value. May be changed when reading from file # Track learning progress + self.num_rnd = 0 self.training_error: list[float] = [] - self.previous_steps = 0 + self.previous_steps: int # number of previously run steps when reading pre-trained data self.strategy = strategy def analyse_q(self, obs: tuple[int, ...] | np.ndarray) -> None: @@ -157,12 +156,12 @@ def update_q( # What's the best we could do from the next state? Zero if episode terminated. future_q_value = (not terminated) * np.max(self.q_values[next_obs]) # type: ignore[index] # What should the Q-value be? (Bellman equation) - target = reward + self.q_params.discount_factor * future_q_value + target = reward + self.conf.discount_factor * future_q_value # How wrong was our current estimate? temporal_difference = target - self.q_values[obs][action] # type: ignore[index] # Update our estimate in the direction of the error. Learning rate controls how big steps we take # When no previous knowledge, avoid slow learning - lr = 1 if self.q_values[obs][action] == 0.0 else self.q_params.learning_rate # type: ignore[index] + lr = 1 if self.q_values[obs][action] == 0.0 else self.conf.learning_rate # type: ignore[index] self.q_values[obs][action] = (1 - lr) * self.q_values[obs][action] + lr * temporal_difference # type: ignore[index] # Track learning progress (useful for debugging) @@ -180,9 +179,10 @@ def episodes_init(self, n_episodes: int = 1) -> None: """ if "r" in self.use_file and self.filename is not None and self.filename.exists(): self.q_values = self.read_dumped(self.filename) - logger.info("Starting %s episodes, using pre-trained values from %s", n_episodes, self.filename) + logger.info(f"Starting #{n_episodes} with {self.previous_steps} trained values from file {self.filename}") else: # start from scratch self.q_values = defaultdict(lambda: np.array((0.0,) * self.env.action_space.n, float)) # type: ignore[attr-defined,type-var] + self.previous_steps = 0 logger.info("Starting new training with %s episodes.", n_episodes) def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = 0) -> None: @@ -234,18 +234,19 @@ def do_episodes(self, n_episodes: int = 1000, max_steps: int = 5000, show: int = rewards[1].extend([np.log(-x) - log_r0 for x in self.env.rewards]) # type: ignore[attr-defined] ## extended class total_steps += nsteps # Reduce exploration rate (agent becomes less random over time): - self.epsilon = max(self.q_params.final_epsilon, self.epsilon - self.epsilon_decay) - if show == SHOW_TRAINING_SUMMARY: - self.analyse_training() + self.epsilon = max(self.conf.final_epsilon, self.epsilon - self.epsilon_decay) if self.filename and "w" in self.use_file: self.dump_results(self.filename, n_episodes, total_steps, start_time, num_terminated, num_truncated) logger.info(f"Episodes:{n_episodes}, terminated:{num_terminated}, truncated:{num_truncated}") logger.info(f"Steps:{total_steps}, revised actions:{err_act}, random actions:{self.num_rnd}") logger.info(f"Term:{num_terminated}, trunc:{num_truncated}, tau:{np.average(tau)} +/-{np.std(tau)}") - _, ax = plt.subplots(1, 1) - ax.plot(rewards[0], rewards[1], ".") - plt.show() + if show == SHOW_TRAINING_SUMMARY: + self.analyse_training() + + _, ax = plt.subplots(1, 1) + ax.plot(rewards[0], rewards[1], ".") + plt.show() def dump_results( self, @@ -288,10 +289,10 @@ def dump_results( "use_file": self.use_file, "episodes": str(episodes), "steps": str(steps + self.previous_steps), - "learning_rate": str(self.q_params.learning_rate), - "discount_factor": str(self.q_params.discount_factor), + "learning_rate": str(self.conf.learning_rate), + "discount_factor": str(self.conf.discount_factor), "epsilon-decay": str(self.epsilon_decay), - "final-epsilon": str(self.q_params.final_epsilon), + "final-epsilon": str(self.conf.final_epsilon), "epsilon": str(self.epsilon), "#terminated": n_terminated, "#truncated": n_truncated, @@ -330,7 +331,7 @@ def read_dumped(self, filename: str | Path | None = None) -> defaultdict[tuple[i from_dump = json.load(_f) self.previous_steps = int(from_dump["q_agent"]["steps"]) self.epsilon = float(from_dump["q_agent"].get("epsilon", 1.0)) - self.epsilon_decay = float(from_dump["q_agent"].get("epsilon", 1e-4)) + self.epsilon_decay = float(from_dump["q_agent"].get("epsilon_decay", 1e-4)) assert "q_values" in from_dump, f"Key 'q_values' not found in file {filename}" for k, v in from_dump["q_values"].items(): q_values.update({literal_eval(k): np.array(v) if isinstance(v, list) else v}) @@ -438,3 +439,22 @@ def test_agent(self, num_episodes: int = 10) -> str: msg += f"Average Reward: {average_reward:.3f}\n" msg += f"Standard Deviation: {np.std(total_rewards):.3f}\n" return msg + + +def _get_moving_avgs( + values: Sequence[float] | np.ndarray, + window: int, + convolution_mode: Literal["valid", "same"], +) -> np.ndarray: + """Compute moving averages to smooth noisy data. + + Args: + values(Sequence[float] | np.ndarray): Raw data series to smooth. + window(int): Number of elements in the averaging window. + convolution_mode(valid", "same"}): Convolution mode passed to `numpy.convolve`. + + Returns: + ------- + Moving average as np array + """ + return np.convolve(np.asarray(values, dtype=float).flatten(), np.ones(window), mode=convolution_mode) / window diff --git a/tests/test_q.py b/tests/test_q.py index 915a262..d1f2dde 100644 --- a/tests/test_q.py +++ b/tests/test_q.py @@ -11,11 +11,66 @@ from crane_controller.envs.controlled_crane_pendulum import AntiPendulumConfig, AntiPendulumEnv, _level from crane_controller.experiment_config import RewardConfig -from crane_controller.q_agent import QLearningAgent +from crane_controller.q_agent import QLearningAgent, QLearningConfig logger = logging.getLogger(__name__) +def test_levels(crane: Callable[..., Crane]) -> None: + def check(val: float, expected: int) -> None: + assert _level(val, env.discrete["energy"]) == expected, f"Level {val} =? {_level(val, env.discrete['energy'])}" + + env = AntiPendulumEnv(crane, conf=AntiPendulumConfig(discrete="energy")) + assert list(env.discrete.keys()) == ["energy", "distance", "pos", "speed", "c-pos", "c-speed", "avg-acc"], ( + f"Expected the 'energy' discretization. found {list(env.discrete.keys())}" + ) + check(0, 0) + check(-1e-10, -1) + check(1e-10, 0) + check(0.014, 0) + check(0.015, 1) + check(0.3, 1) + check(0.4, 2) + check(1.4, 2) + check(1.5, 3) + check(5.9, 3) + check(6.0, 4) + check(13.1, 4) + check(13.2, 5) + check(98, 5) + check(99, -1) # marks 'outside range' level + check(float("inf"), -1) + + +def test_intervals(crane: Callable[..., Crane]): + """Test that learning / saving / resuming learning works:""" + save_path = Path.cwd() / "q_interval_training.json" + env = AntiPendulumEnv( + crane, + conf=AntiPendulumConfig( + start_speed=-1.0, + render_mode="none", + reward_limit=-0.05, + discrete="energy", + continuous_actions=False, + ), + ) + + q_conf = QLearningConfig(learning_rate=0.1, epsilon_decay=1e-4, final_epsilon=0.1, discount_factor=0.95) + agent = QLearningAgent(env, conf=q_conf, filename=save_path, use_file="w") + for i in range(10): + _ = env.reset(seed=i + 1) + agent.do_episodes(n_episodes=10, max_steps=100, show=0) + if i != 0: + assert agent.previous_steps == (i - 1) * 10, f"Found {i}, {agent.previous_steps}" + assert agent.epsilon_decay == q_conf.epsilon_decay, "Keeps unchanged" + assert np.isclose(agent.epsilon, 1.0 - (i + 1) * 10 * q_conf.epsilon_decay), ( + f"{i}. Found {agent.epsilon} != {1.0 - (i + 1) * 10 * 0.0001}" + ) + agent = QLearningAgent(env, conf=q_conf, filename=save_path, use_file="rw") + logger.info(f"Model saved to {save_path}") + + def test_smoke(crane: Callable[..., Crane], *, show: bool) -> None: env = AntiPendulumEnv( crane, @@ -31,7 +86,6 @@ def test_smoke(crane: Callable[..., Crane], *, show: bool) -> None: agent.do_episodes(n_episodes=5, max_steps=200) -@pytest.mark.skip(reason="Test must be updated") def test_q_analyse(crane: Callable[..., Crane], *, show: bool) -> None: models = Path(__file__).parent.resolve().parent / "models" assert (models / "q_trained.json").exists(), "Expect a file 'q_trained.json' in the models directory. Not found" @@ -59,56 +113,7 @@ def test_q_analyse(crane: Callable[..., Crane], *, show: bool) -> None: logger.info(f"averages: {acc}") -@pytest.mark.skip(reason="Test must be updated") -def test_intervals(crane: Callable[..., Crane]): - """Test that learning / saving / resuming learning works:""" - save_path = Path.cwd() / "q_interval_training.json" - env = AntiPendulumEnv( - crane, - conf=AntiPendulumConfig( - start_speed=-1.0, - render_mode="none", - reward_limit=-0.05, - discrete="energy", - continuous_actions=False, - ), - ) - - agent = QLearningAgent(env, filename=save_path, use_file="w") - for i in range(10): - _ = env.reset(seed=i + 1) - agent.do_episodes(n_episodes=2, max_steps=100) - if i == 0: - agent = QLearningAgent(env, filename=save_path, use_file="rw") - logger.info(f"Model saved to {save_path}") - - -@pytest.mark.skip(reason="Test must be updated") -def test_levels(crane: Callable[..., Crane]) -> None: - def check(val: float, expected: int) -> None: - assert _level(val, env.discrete["energy"]) == expected, f"Level {val} =? {_level(val, env.discrete['energy'])}" - - env = AntiPendulumEnv(crane) - logger.info(env.discrete) - check(0, 0) - check(-1e-10, -1) - check(1e-10, 0) - check(0.014, 0) - check(0.015, 1) - check(0.3, 1) - check(0.4, 2) - check(1.4, 2) - check(1.5, 3) - check(5.9, 3) - check(6.0, 4) - check(13.1, 4) - check(13.2, 5) - check(98, 5) - check(99, 6) - check(float("inf"), 6) - - -@pytest.mark.skip(reason="Test must be updated") +@pytest.mark.parametrize("discretization", ["energy", "phase"]) def test_discretization(crane: Callable[..., Crane], *, show: bool, discretization: str) -> None: """Test the discretization with respect to yielding unique rewards.""" env = AntiPendulumEnv( @@ -122,6 +127,8 @@ def test_discretization(crane: Callable[..., Crane], *, show: bool, discretizati ), ) env.reset() + if discretization == "phase": # not yet implemented + return _agent = QLearningAgent(env) for e in range(len(env.discrete["energy"]) - 1): for s in range(len(env.discrete["speed"]) - 1): @@ -151,7 +158,6 @@ def test_discretization(crane: Callable[..., Crane], *, show: bool, discretizati logger.info(f"angle:{e}, speed:{s}, c_pos:{c_p}, c_speed:{c_s}: {action_sum}") -@pytest.mark.skip(reason="Test must be updated") def test_state(crane: Callable[..., Crane], *, show: bool) -> None: # noqa: PLR0915 """Set state and calculate reward.""" @@ -199,7 +205,7 @@ def get_state(): env.set_state(pos=0.0, speed=0.0, direction=0.0, w_speed=0.0) for _i in range(10): - assert np.allclose(get_state()[0], (0, 0, 0, 0)) + assert np.allclose(get_state()[0], (0, 0, 0, 0)), f"Found {get_state()[1]}" env.step(1) # check that nothing moves env.step(0) @@ -209,15 +215,15 @@ def get_state(): assert get_state()[0][3] > 0.08 # env.reset() - env.set_state(1.0, 2.0, 0.0, 0.0) + env.set_state(pos=1.0, speed=2.0, direction=0.0, w_speed=0.0) assert np.allclose(get_state()[0], (1.0, 2.0, 0, 0)), f"Found {get_state()[0]}" env.step(1) - assert np.allclose(get_state()[0], (3.0, 2.0, 5.532267250195097, -1.7318224679112262)), f"Found {get_state()[0]}" + assert np.allclose(get_state()[0], (3.0, 2.0, 2.9008725322834694, -0.9094835038309382)), f"Found {get_state()[0]}" env.set_state(0.0, 0.0, np.radians(10), -2.0) assert np.allclose(get_state()[0], (0.0, 0.0, 10, -2)), f"Found {get_state()[0]}" env.step(1) - assert np.allclose(get_state()[0], (0.0, 0.0, 1.0274015154955907, -0.8379044477976203)), f"Found {get_state()[0]}" + assert np.allclose(get_state()[0], (0.0, 0.0, 3.7286798707705713, -0.002822627692914995)), f"Found {get_state()[0]}" # logger.info(f"State: {get_state()[1]}") # check_step( 1, obs=(0, 0, 0, 0, 0, 0, 0, 1, 1), reward=0, terminated=True, truncated=False) # env.set_state(pos=18.0, speed=0.0, direction=0.0, w_speed=0.0) @@ -250,12 +256,11 @@ def get_state(): logger.info(f"reward:{reward}, avg:{reward_sum / s}") logger.info(f"pos:{env.crane.position}, speed:{env.crane.velocity}, dir:{env.wire.direction}, v_w:{env.wire.cm_v}") for k, v in agent.q_values.items(): - logger.info(k, v) + logger.info(f"key:{k}, value:{v}") # env.set_state(pos=18.0, speed=0.0, direction=0.0, w_speed=0.0) # logger.info( env.step(2)) -@pytest.mark.skip(reason="Test must be updated") def test_state2(crane: Callable[..., Crane], *, show: bool) -> None: """Set state and calculate reward.""" @@ -313,10 +318,9 @@ def get_state(): env.set_state(pos=0.0, speed=0.0, direction=np.radians(3.0), w_speed=1.5) env.step(a) # env.step(1) - logger.info(a, get_state()[1], env._get_obs()) + logger.info(f"a:{a}, state:{get_state()[1]}, obs:{env._get_obs()}") -@pytest.mark.skip(reason="Test must be updated") def test_update_q_values(crane: Callable[..., Crane], *, show: bool) -> None: env = AntiPendulumEnv( crane, @@ -358,15 +362,16 @@ def test_update_q_values(crane: Callable[..., Crane], *, show: bool) -> None: from crane_controller.crane_factory import build_crane # noqa: F401 + logging.basicConfig(level=logging.INFO) retcode = pytest.main(["-rP -s -v", __file__]) assert retcode == 0, f"Return code {retcode}" os.chdir(Path(__file__).parent.absolute() / "test_working_directory") # test_levels(build_crane) + # test_intervals(build_crane) # test_smoke(build_crane, show=True) # test_q_analyse(build_crane, show=True) - # test_intervals(build_crane) + # test_discretization(build_crane, show=True, discretization='energy') # test_state(build_crane, show=True) # test_state2(build_crane, show=True) # test_update_q_values(build_crane, show=True) - # test_discretization(build_crane, show=True, discretization='energy') From 3e07c8ba7cfa96a1d85b6e65de64a86c4a56f71f Mon Sep 17 00:00:00 2001 From: Eisinger Date: Thu, 18 Jun 2026 14:16:25 +0200 Subject: [PATCH 11/11] Added q_trained.json, which is needed to do some tests on the server. --- models/q_trained.json | 238 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 models/q_trained.json diff --git a/models/q_trained.json b/models/q_trained.json new file mode 100644 index 0000000..e5468f5 --- /dev/null +++ b/models/q_trained.json @@ -0,0 +1,238 @@ +{ + "date": "29.04.2026 06:53:49", + "pendulum": { + "start_speed": "1.0", + "render_mode": "none", + "reward_limit": "0.0" + }, + "q_agent": { + "use_trained": "True", + "filename": "C:\\Users\\eis\\Documents\\Projects\\Simulation_Model_Assurance\\osp\\packages\\crane-controller\\models\\q_trained.json", + "episodes": "6000", + "steps": "30006000", + "learning_rate": "0.1", + "discount_factor": "0.95" + }, + "q_values": { + "(0, 0, 0, 1, 1)": [ + -0.7127999098776818, + -0.7204031480080048, + -0.7412199306092444 + ], + "(0, 0, 0, 0, 0)": [ + -0.39882058710042717, + -0.43180066871885253, + -0.36789168710316733 + ], + "(0, 0, 0, 1, 0)": [ + -0.49644387699601483, + -0.476832491697103, + -0.4808429865234992 + ], + "(0, 0, 1, 1, 0)": [ + -0.3645407668594485, + -0.34941296493381946, + -0.19816466371287308 + ], + "(0, 1, 1, 1, 0)": [ + -0.27335521972045285, + -0.31790379183091966, + -0.2034872242749172 + ], + "(0, 1, 0, 1, 0)": [ + -0.6087312502217588, + -0.6754940805998394, + -0.6535399837815964 + ], + "(0, 1, 0, 2, 0)": [ + -0.3949208069494323, + -0.4631147311708943, + -0.4776412098931605 + ], + "(0, 0, 0, 2, 0)": [ + -0.2712981364627587, + -0.17654049561221843, + -0.2508326205458066 + ], + "(0, 0, 1, 2, 0)": [ + -0.48498802268403846, + -0.4395215670942963, + -0.4722944229115358 + ], + "(0, 1, 1, 2, 0)": [ + -0.4990197857734165, + -0.5327879501542365, + -0.4941112778002146 + ], + "(0, 0, 0, 3, 0)": [ + -0.5387880192090378, + -0.4784712525147248, + -0.517952873228921 + ], + "(0, 0, 1, 3, 0)": [ + -0.9096919737168466, + -0.9127452620968198, + -0.9420045562304813 + ], + "(0, 1, 1, 3, 0)": [ + -0.8667830882886871, + -0.8757935260356404, + -0.8758730446292982 + ], + "(0, 1, 0, 3, 0)": [ + -0.43694463364384284, + -0.32317351557573637, + -0.37671045435695716 + ], + "(0, 0, 1, 4, 0)": [ + -0.9306066987431686, + -0.9344436974699757, + -0.9655748330701439 + ], + "(0, 1, 1, 4, 0)": [ + -1.009825188680733, + -1.016868953064729, + -0.9957558578136729 + ], + "(0, 1, 0, 4, 0)": [ + -1.0369014461449961, + -1.0197443807886495, + -0.9976879186706535 + ], + "(0, 0, 0, 4, 0)": [ + -0.8997996021390884, + -0.8913054855090478, + -0.8905808268698551 + ], + "(0, 1, 0, 5, 0)": [ + -1.5826848759769268, + -2.7445575744690793, + -2.418367271258592 + ], + "(0, 0, 0, 5, 0)": [ + -1.6683128963172371, + -2.251311793007559, + -2.3851805260338708 + ], + "(0, 0, 1, 5, 0)": [ + -2.2373735329153392, + -1.540495957571949, + -2.76737403946213 + ], + "(0, 1, 1, 5, 0)": [ + -2.3314084980057013, + -1.5138347954693265, + -3.01917937692279 + ], + "(0, 1, 0, 1, 1)": [ + -0.261055476317184, + -0.27846357082465933, + -0.2774020188584469 + ], + "(0, 0, 1, 1, 1)": [ + -0.1342852547795026, + -0.2470169520959763, + -0.2126480225045462 + ], + "(0, 1, 1, 1, 1)": [ + -0.2797380701937499, + -0.2945979948624919, + -0.24076792235861236 + ], + "(0, 1, 1, 2, 1)": [ + -0.2728844361768713, + -0.13972184601087123, + -0.3275551939924255 + ], + "(0, 1, 0, 2, 1)": [ + -0.455039876626072, + -0.43296129057936117, + -0.4316836608934558 + ], + "(0, 0, 0, 2, 1)": [ + -0.5686315534261919, + -0.5538077807341172, + -0.5496103554748915 + ], + "(0, 0, 0, 3, 1)": [ + -0.3966116309786595, + -0.3317568230750391, + -0.30858102473455185 + ], + "(0, 0, 1, 3, 1)": [ + -0.8315655206780324, + -0.8333814435452305, + -0.7756715486070018 + ], + "(0, 1, 1, 3, 1)": [ + -0.9831842749294987, + -0.9782200055298229, + -0.9930127344944251 + ], + "(0, 1, 0, 3, 1)": [ + -0.6539627507980373, + -0.5852573030361744, + -0.6763166111516389 + ], + "(0, 1, 0, 4, 1)": [ + -0.9026947631459618, + -0.9407969095587947, + -0.965156293555089 + ], + "(0, 0, 0, 4, 1)": [ + -1.0295607537932239, + -1.0110078430982656, + -1.0217477290303583 + ], + "(0, 0, 1, 4, 1)": [ + -1.0198724273521527, + -1.0273376264121616, + -1.0372176976745933 + ], + "(0, 1, 1, 4, 1)": [ + -0.8367514960793316, + -0.8072150440466215, + -0.7999324124740165 + ], + "(0, 0, 1, 5, 1)": [ + -2.826052632887979, + -2.8216800501972115, + -2.8339346737355218 + ], + "(0, 1, 1, 5, 1)": [ + -2.769926115050464, + -2.7896094930838444, + -2.784544336312168 + ], + "(0, 1, 0, 5, 1)": [ + -2.7928766121585795, + -2.7887103458307694, + -2.7938313222414037 + ], + "(0, 0, 0, 5, 1)": [ + -2.8104767031828572, + -2.8062208641671322, + -2.8101316497840574 + ], + "(0, 0, 1, 2, 1)": [ + -0.5213427535062244, + -0.5910962186115551, + -0.47068284911064734 + ], + "(0, 0, 1, 0, 0)": [ + -0.41286468970384216, + -0.42684989269569895, + -169.29165129913554 + ], + "(0, 1, 0, 0, 0)": [ + -0.11933872055277986, + -0.1195010821067479, + -0.1499420269134481 + ], + "(0, 1, 1, 0, 0)": [ + -0.20624980702980253, + -0.22645535674627537, + -0.18943028486599597 + ] + } +} \ No newline at end of file