"""Grid search over the fit parameters with the design's acceptance rules. python design_search.py""" import math, sys, os, itertools sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import design_fit as F D = math.degrees ELB = (math.radians(38), math.radians(115)) rows = [] for s in (0.0018, 0.0020, 0.0022, 0.0024): for u in [i / 20 for i in range(1, 13)]: for px in (-2.6, -2.3, -2.0, -1.7, -1.4, -1.1): for cle in (0.15, 0.4, 0.7): for split in ("prop", 0.0, 0.5, 1.0): ok = True; ms = [] for v in ("A", "B"): S = F.setup(s, u, px, cle, split, "Moonpool_Door_Aft", v) m = None for br in (+1, -1): mm = F.assess(S, 0.0, br) if not mm["fail"] and (m is None or abs(mm["q"]["q4"][0] + mm["q"]["q4"][1]) < abs(m["q"]["q4"][0] + m["q"]["q4"][1])): m = mm if m is None: ok = False; break ms.append(m) if not ok: continue elo = min(m["elb"][0] for m in ms); ehi = max(m["elb"][1] for m in ms) q5 = min(m["minq5"] for m in ms) rr = lambda k: max(m["q"][k][1] for m in ms) - min(m["q"][k][0] for m in ms) dead = min(m["rod"][0] - (m["rod"][1] - m["rod"][0]) for m in ms) wca = min(m["wc_axis"] for m in ms) if elo < ELB[0] or ehi > ELB[1] or q5 < math.radians(20) or dead < 0.08 * s / 0.002 or wca < 0.35: continue rows.append((rr("q1") + 0.8 * rr("q2") + 0.8 * rr("q3"), s, u, px, cle, split, ms, elo, ehi, q5, dead, rr("q1"), rr("q2"), rr("q3"), wca)) rows.sort(key=lambda t: t[0]) print(len(rows), "pass the kinematic rules") for row in rows[:40]: cost, s, u, px, cle, split, ms, elo, ehi, q5, dead, r1, r2, r3, wca = row cls = [] for v in ("A", "B"): S = F.setup(s, u, px, cle, split, "Moonpool_Door_Aft", v) m = F.full(S, 0.0, +1, step=4) if m["fail"]: m = F.full(S, 0.0, -1, step=4) cls.append(m["cl"]) print("cost %.2f s %.4f u %.2f px %.1f cle %.2f split %s | q1r %.0f q2r %.0f q3r %.0f elb %.0f..%.0f q5min %.0f dead %.2f wcaxis %.2f | clA %.3f %s | clB %.3f %s" % ( cost, s, u, px, cle, split, D(r1), D(r2), D(r3), D(elo), D(ehi), D(q5), dead, wca, cls[0][0], cls[0][1], cls[1][0], cls[1][1]))