Esempio n. 1
0
    def test_model_composition_units(self):
        class Above(Model):
            """A simple upper bound on x

            Lower Unbounded
            ---------------
            x
            """
            def setup(self):
                x = self.x = Variable("x", "ft")
                x_max = Variable("x_{max}", 1, "yard")
                self.cost = 1 / x
                return [x <= x_max]

        class Below(Model):
            """A simple lower bound on x

            Upper Unbounded
            ---------------
            x
            """
            def setup(self):
                x = self.x = Variable("x", "m")
                x_min = Variable("x_{min}", 1, "cm")
                self.cost = x
                return [x >= x_min]

        a, b = Above(), Below()
        concatm = Model(a.cost * b.cost, [a, b])
        concat_cost = concatm.solve(verbosity=0)["cost"]
        almostequal = self.assertAlmostEqual
        yard, cm = gpkit.ureg("yard"), gpkit.ureg("cm")
        ft, meter = gpkit.ureg("ft"), gpkit.ureg("m")
        if not isinstance(a["x"].key.units, str):
            almostequal(a.solve(verbosity=0)["cost"], ft / yard, 5)
            almostequal(b.solve(verbosity=0)["cost"], cm / meter, 5)
            almostequal(cm / yard, concat_cost, 5)
        NamedVariables.reset_modelnumbers()
        a1, b1 = Above(), Below()
        self.assertEqual(a1["x"].key.lineage, (("Above", 0), ))
        m = Model(a1["x"], [a1, b1, b1["x"] == a1["x"]])
        sol = m.solve(verbosity=0)
        if not isinstance(a1["x"].key.units, str):
            almostequal(sol["cost"], cm / ft, 5)
        a1, b1 = Above(), Below()
        self.assertEqual(a1["x"].key.lineage, (("Above", 1), ))
        m = Model(b1["x"], [a1, b1, b1["x"] == a1["x"]])
        sol = m.solve(verbosity=0)
        if not isinstance(b1["x"].key.units, str):
            almostequal(sol["cost"], cm / meter, 5)
        self.assertIn(a1["x"], sol["variables"])
        self.assertIn(b1["x"], sol["variables"])
        self.assertNotIn(a["x"], sol["variables"])
        self.assertNotIn(b["x"], sol["variables"])
Esempio n. 2
0
def monte_carlo_results(m,
                        progress=None,
                        out=None,
                        sol=None,
                        quiet=False,
                        seed=246):
    NamedVariables.reset_modelnumbers()
    np.random.seed(seed=seed)
    monte_up = [{
        k.name: stats.truncnorm.rvs(-3, 3, loc=1, scale=(k.key.orig_pr / 300.))
        for k in m.substitutions if k.pr
    } for _ in range(N)]
    try:
        if sol is None:
            sol = m.localsolve(verbosity=0)
        if out:
            with out:
                print("Fuel consumption: %i lbs" %
                      sol("W_f").to("lbf").magnitude)
        elif not quiet:
            print("Fuel consumption: %i lbs" % sol("W_f").to("lbf").magnitude)
    except Exception:
        return (None, None)
    else:
        failures = 0
        for var in m.varkeys:
            if var.fix:
                m.substitutions[var] = sol["variables"][var.name]
            if var.margin:
                m.substitutions[var] = 1
        m.pop()
        for i, subs in enumerate(monte_up):
            m.substitutions.update(subs)
            try:
                # assert not does_it_fail(sol, W_W_coeff1)
                # UNCOMMENT THE ABOVE AND COMMENT OUT THE BELOW TO SPEED UP
                m.solve(verbosity=0)
            except Exception:
                failures += 1
            if progress:
                progress.value = i / N
        if out:
            with out:
                print("    Failure rate: % 2.1f%% " %
                      (100 * failures / float(N)))
        elif not quiet:
            print("    Failure rate: % 2.1f%% " % (100 * failures / float(N)))
        return (sol("W_f").to("lbf").magnitude, 100 * failures / float(N))