From 3aa5baa15507f030e61236e1f4d396ac4249464f Mon Sep 17 00:00:00 2001 From: Ned Burnell Date: Fri, 12 Feb 2021 13:21:39 -0800 Subject: [PATCH 01/12] make Sankey test optional (#1538) --- docs/source/examples/performance_modeling.py | 14 ++++++++------ gpkit/solution_array.py | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/source/examples/performance_modeling.py b/docs/source/examples/performance_modeling.py index 48ffda6c9..7fcb0b3cb 100644 --- a/docs/source/examples/performance_modeling.py +++ b/docs/source/examples/performance_modeling.py @@ -242,9 +242,11 @@ def setup(self): sol = M.solve(verbosity=0) print(sol.diff("solution.pkl", showvars=vars_of_interest, sortbymodel=False)) -# this will only make an image when run in jupyter notebook -# from gpkit.interactive.sankey import Sankey -from gpkit.interactive.sankey import Sankey -variablesankey = Sankey(sol, M).diagram(AC.wing.A) -sankey = Sankey(sol, M).diagram(width=1200, height=400, maxlinks=30) -sankey # pylint: disable=pointless-statement +try: + from gpkit.interactive.sankey import Sankey + variablesankey = Sankey(sol, M).diagram(AC.wing.A) + sankey = Sankey(sol, M).diagram(width=1200, height=400, maxlinks=30) + # the line below shows an interactive graph if run in jupyter notebook + sankey # pylint: disable=pointless-statement +except (ImportError, ModuleNotFoundError): + print("Making Sankey diagrams requires the ipysankeywidget package") diff --git a/gpkit/solution_array.py b/gpkit/solution_array.py index 8b5925945..20f97a645 100644 --- a/gpkit/solution_array.py +++ b/gpkit/solution_array.py @@ -377,7 +377,7 @@ def almost_equal(self, other, reltol=1e-3, sens_abstol=0.01): def diff(self, other, showvars=None, *, constraintsdiff=True, senssdiff=False, sensstol=0.1, absdiff=False, abstol=0, reldiff=True, reltol=1.0, - sortmodelsbysenss= True, **tableargs): + sortmodelsbysenss=True, **tableargs): """Outputs differences between this solution and another Arguments From 6f4f481b3daa532f05e03166618331054d2ce3ad Mon Sep 17 00:00:00 2001 From: Ned Burnell Date: Fri, 26 Feb 2021 14:08:17 -0800 Subject: [PATCH 02/12] Variable References Plots (#1539) --- docs/source/examples/performance_modeling.py | 3 + docs/source/visint.rst | 47 ++++++- fulltests.sh | 3 +- gpkit/interactive/references.py | 86 ++++++++++++ gpkit/interactive/referencesplot.html | 139 +++++++++++++++++++ runtests.sh | 1 + 6 files changed, 274 insertions(+), 5 deletions(-) create mode 100644 gpkit/interactive/references.py create mode 100644 gpkit/interactive/referencesplot.html diff --git a/docs/source/examples/performance_modeling.py b/docs/source/examples/performance_modeling.py index 7fcb0b3cb..a0a50f57a 100644 --- a/docs/source/examples/performance_modeling.py +++ b/docs/source/examples/performance_modeling.py @@ -250,3 +250,6 @@ def setup(self): sankey # pylint: disable=pointless-statement except (ImportError, ModuleNotFoundError): print("Making Sankey diagrams requires the ipysankeywidget package") + +from gpkit.interactive.references import referencesplot +referencesplot(M, openimmediately=False) diff --git a/docs/source/visint.rst b/docs/source/visint.rst index 65fc32a49..cd5bcc354 100644 --- a/docs/source/visint.rst +++ b/docs/source/visint.rst @@ -1,5 +1,44 @@ Visualization and Interaction ***************************** + +Variable Reference Plots +======================== + +Code in this section uses the `CE solar model `_ + +.. code:: python + from solar.solar import * + Vehicle = Aircraft(Npod=3, sp=True) + M = Mission(Vehicle, latitude=[20]) + M.cost = M[M.aircraft.Wtotal] + sol = M.localsolve() + + from gpkit.interactive.references import referencesplot + referencesplot(M, openimmediately=True) + +Running the code above will produce two files in your working directory: +``referencesplot.html`` and ``referencesplot.json``, and (unless you specify +``openimmediately=False``) open the former in your web browser, +showing you something like this: + +.. figure:: figures/referencesplot.png + +`Click to see the interactive version of this plot. `_ + +When a model's name is hovered over its connections are highlighted, showing in +red the other models it imports variables from to use in its constraints and in +blue the models that import variables from it. + +By default connections are shown with equal width ("Unweighted"). +When "Global Sensitivities" is selected, connection width is proportional to +the sensitivity of all variables in that connection to the importing model, +corresponding exactly to how much the model's cost would decrease if those variables were relaxed +in only that importing model. This can give a sense of which connections are vital to +the overall model. When "Normalized Sensitivities" is selected, that +global weight is divided by the weight of all variables in the importing model, +giving a sense of which connections are vital to each subsystem. + + .. _sankey: Sensitivity Diagrams ==================== @@ -9,9 +48,9 @@ Requirements - Jupyter Notebook - `ipysankeywidget `__ - Note that you'll need to activate these widgets on Jupyter by runnning - + - ``jupyter nbextension enable --py --sys-prefix widgetsnbextension`` - + - ``jupyter nbextension enable --py --sys-prefix ipysankeywidget`` Example @@ -25,10 +64,10 @@ Code in this section uses the `CE solar model + +GPkit Variable Reference Map + + + +
+
+ + + + + + +
+
+ + diff --git a/runtests.sh b/runtests.sh index 0467a0f38..7e988fc17 100755 --- a/runtests.sh +++ b/runtests.sh @@ -5,3 +5,4 @@ python -c "import gpkit.tests; gpkit.tests.run()" && mv settings gpkit/env rm *.pkl rm *.pgz rm solution.* +rm referencesplot.* From c21885a4515dbc7519d01b41e6254ed4922726e3 Mon Sep 17 00:00:00 2001 From: Ned Burnell Date: Fri, 26 Feb 2021 14:08:25 -0800 Subject: [PATCH 03/12] avoid DeprecationWarning (#1537) --- gpkit/keydict.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gpkit/keydict.py b/gpkit/keydict.py index bc86f5d9c..c6f393ed4 100644 --- a/gpkit/keydict.py +++ b/gpkit/keydict.py @@ -242,7 +242,13 @@ def __setitem__(self, key, value): if not hasattr(value, "__len__"): value = np.full(key.shape, value, "f") elif not isinstance(value[0], np.ndarray): - value = np.array([clean_value(key, v) for v in value]) + clean_values = [clean_value(key, v) for v in value] + dtype = None + if any(is_sweepvar(cv) for cv in clean_values): + dtype = "object" + value = np.array(clean_values, dtype=dtype) + # else: + # value = np.array(clean_values) # can't use dtype=None super().__setitem__(key, value) self.owned.add(key) From 85b5ce70d94ab32c7ebe2856a07c1302798fb0fb Mon Sep 17 00:00:00 2001 From: Edward Burnell Date: Fri, 26 Feb 2021 14:10:17 -0800 Subject: [PATCH 04/12] add referenceplot.png --- docs/source/figures/referencesplot.png | Bin 0 -> 152495 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/source/figures/referencesplot.png diff --git a/docs/source/figures/referencesplot.png b/docs/source/figures/referencesplot.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c9ddfff185f9d0d63441e1a5e5c84c93c20abf GIT binary patch literal 152495 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

NfOnKWCRk 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⁡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

  • qZ(a<* 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 DEfrll literal 0 HcmV?d00001 From 65827ccc6523c3036424dfdf78174f74910f2d1f Mon Sep 17 00:00:00 2001 From: Edward Burnell Date: Fri, 26 Feb 2021 14:12:44 -0800 Subject: [PATCH 05/12] docs typo fixes --- docs/source/visint.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/visint.rst b/docs/source/visint.rst index cd5bcc354..234bf88dc 100644 --- a/docs/source/visint.rst +++ b/docs/source/visint.rst @@ -4,9 +4,10 @@ Visualization and Interaction Variable Reference Plots ======================== -Code in this section uses the `CE solar model `_ +Code in this section uses the `CE solar model `_. .. code:: python + from solar.solar import * Vehicle = Aircraft(Npod=3, sp=True) M = Mission(Vehicle, latitude=[20]) From e768533800175c0e07a9494813a84480324c96e0 Mon Sep 17 00:00:00 2001 From: Ned Burnell Date: Wed, 10 Mar 2021 17:11:48 -0800 Subject: [PATCH 06/12] sweep-related fixes (#1540) * don't add forward-differentiated sensitivities to constants no longer present * fix warnings table for intermittent warnings in sweeps * cleanup model sensitivity printing * remove gradients from constants before calculating linked variables --- docs/source/examples/relaxation_output.txt | 2 +- gpkit/constraints/bounded.py | 3 ++- gpkit/constraints/gp.py | 11 +++++----- gpkit/constraints/loose.py | 3 ++- gpkit/constraints/prog_factories.py | 16 +++++++++++---- gpkit/constraints/relax.py | 5 ++++- gpkit/constraints/tight.py | 3 ++- gpkit/small_scripts.py | 8 ++++++-- gpkit/solution_array.py | 24 +++++++++++++++------- 9 files changed, 52 insertions(+), 23 deletions(-) diff --git a/docs/source/examples/relaxation_output.txt b/docs/source/examples/relaxation_output.txt index 179e4cb74..24f295d22 100644 --- a/docs/source/examples/relaxation_output.txt +++ b/docs/source/examples/relaxation_output.txt @@ -150,7 +150,7 @@ Relaxed Constants Model Sensitivities (sorts models in sections below) ------------------- +2.0 : Relax2.OriginalValues - <1E-8 : Relax2 + <1e-8 : Relax2 Free Variables -------------- diff --git a/gpkit/constraints/bounded.py b/gpkit/constraints/bounded.py index 8f87eda88..f9b66ead4 100644 --- a/gpkit/constraints/bounded.py +++ b/gpkit/constraints/bounded.py @@ -3,7 +3,7 @@ import numpy as np from .. import Variable from .set import ConstraintSet -from ..small_scripts import appendsolwarning +from ..small_scripts import appendsolwarning, initsolwarning def varkey_bounds(varkeys, lower, upper): @@ -77,6 +77,7 @@ def process_result(self, result): def check_boundaries(self, result): "Creates (and potentially prints) a dictionary of unbounded variables." out = defaultdict(set) + initsolwarning(result, "Arbitrarily Bounded Variables") for i, varkey in enumerate(self.bound_varkeys): value = result["variables"][varkey] c_senss = [result["sensitivities"]["constraints"].get(c, 0) diff --git a/gpkit/constraints/gp.py b/gpkit/constraints/gp.py index 06ed88b71..89a8fe294 100644 --- a/gpkit/constraints/gp.py +++ b/gpkit/constraints/gp.py @@ -222,15 +222,17 @@ def solve(self, solver=None, *, verbosity=1, gen_result=True, **kwargs): msg = ("The model ran to an infinitely low cost;" " bounding the right variables would prevent this.") elif isinstance(infeasibility, UnknownInfeasible): - msg = "The solver failed for an unknown reason." + msg = ("Solver failed for an unknown reason. Relaxing" + " constraints/constants, bounding variables, or" + " using a different solver might fix it.") if (verbosity > 0 and solver_out["soltime"] < 1 and hasattr(self, "model")): # fast, top-level model print(msg + "\nSince the model solved in less than a second," " let's run `.debug()` to analyze what happened.\n`") return self.model.debug(solver=solver) # else, raise a clarifying error - msg += (" Running `.debug()` may pinpoint the trouble. You can" - " also try another solver, or increase the verbosity.") + msg += (" Running `.debug()` or increasing verbosity may pinpoint" + " the trouble.") raise infeasibility.__class__(msg) from infeasibility if not gen_result: @@ -330,8 +332,7 @@ def _compile_result(self, solver_out): with warnings.catch_warnings(): # skip pesky divide-by-zeros warnings.simplefilter("ignore") dlogv_dlogc = dv_dc * result["constants"][c]/val - before = gpv_ss.get(c, 0) - gpv_ss[c] = before + dlogcost_dlogv*dlogv_dlogc + gpv_ss[c] = gpv_ss.get(c, 0) + dlogcost_dlogv*dlogv_dlogc if v in cost_senss: if c in self.cost.vks: dlogcost_dlogv = cost_senss.pop(v) diff --git a/gpkit/constraints/loose.py b/gpkit/constraints/loose.py index 84d410d32..2baadc34a 100644 --- a/gpkit/constraints/loose.py +++ b/gpkit/constraints/loose.py @@ -1,6 +1,6 @@ "Implements Loose" from .set import ConstraintSet -from ..small_scripts import appendsolwarning +from ..small_scripts import appendsolwarning, initsolwarning class Loose(ConstraintSet): @@ -15,6 +15,7 @@ def __init__(self, constraints, *, senstol=None): def process_result(self, result): "Checks that all constraints are satisfied with equality" super().process_result(result) + initsolwarning(result, "Unexpectedly Tight Constraints") for constraint in self.flat(): c_senss = result["sensitivities"]["constraints"].get(constraint, 0) if c_senss >= self.senstol: diff --git a/gpkit/constraints/prog_factories.py b/gpkit/constraints/prog_factories.py index 3468b0cb7..b846b4455 100644 --- a/gpkit/constraints/prog_factories.py +++ b/gpkit/constraints/prog_factories.py @@ -15,6 +15,9 @@ def evaluate_linked(constants, linked): for k, v in constants.items()}) kdc_plain = None array_calulated = {} + for key in constants: # remove gradients from constants + if key.gradients: + del key.descr["gradients"] for v, f in linked.items(): try: if v.veckey and v.veckey.original_fn: @@ -130,7 +133,7 @@ def run_sweep(genfunction, self, solution, skipsweepfailures, for (var, grid) in zip(sweepvars, sweep_grids)} if verbosity > 0: - print("Sweeping over %i solves." % N_passes) + print("Sweeping with %i solves:" % N_passes) tic = time() self.program = [] @@ -143,6 +146,8 @@ def run_sweep(genfunction, self, solution, skipsweepfailures, program, solvefn = genfunction(self, constants) self.program.append(program) # NOTE: SIDE EFFECTS try: + if verbosity > 1: + print("\nSolve %i:" % i) result = solvefn(solver, verbosity=verbosity-1, **solveargs) if solveargs.get("process_result", True): self.process_result(result) @@ -151,10 +156,13 @@ def run_sweep(genfunction, self, solution, skipsweepfailures, last_error = e if not skipsweepfailures: raise RuntimeWarning( - "Sweep halted! Progress saved to m.program. To skip over" - " such failures, solve with skipsweepfailures=True.") from e + "Solve %i was infeasible; progress saved to m.program." + " To continue sweeping after failures, solve with" + " skipsweepfailures=True." % i) from e + if verbosity > 0: + print("Solve %i was %s." % (i, e.__class__.__name__)) if not solution: - raise RuntimeWarning("No sweeps solved successfully.") from last_error + raise RuntimeWarning("All solves were infeasible.") from last_error solution["sweepvariables"] = KeyDict() ksweep = KeyDict(sweep) diff --git a/gpkit/constraints/relax.py b/gpkit/constraints/relax.py index 50147238f..0498eff93 100644 --- a/gpkit/constraints/relax.py +++ b/gpkit/constraints/relax.py @@ -3,7 +3,7 @@ from ..nomials import Variable, VectorVariable, parse_subs, NomialArray from ..keydict import KeyDict from .. import NamedVariables, SignomialsEnabled -from ..small_scripts import appendsolwarning, mag +from ..small_scripts import appendsolwarning, initsolwarning, mag class ConstraintsRelaxedEqually(ConstraintSet): @@ -50,6 +50,7 @@ def process_result(self, result): def check_relaxed(self, result): "Adds relaxation warnings to the result" + initsolwarning(result, "Relaxed Constraints") for val, msg in get_relaxed([result["freevariables"][self.relaxvar]], ["All constraints relaxed by %i%%"]): appendsolwarning(msg % (0.9+(val-1)*100), self, result, @@ -103,6 +104,7 @@ def check_relaxed(self, result): "Adds relaxation warnings to the result" relaxed = get_relaxed(result["freevariables"][self.relaxvars], range(len(self["relaxed constraints"]))) + initsolwarning(result, "Relaxed Constraints") for relaxval, i in relaxed: relax_percent = "%i%%" % (0.5+(relaxval-1)*100) oldconstraint = self.original_constraints[i] @@ -224,6 +226,7 @@ def check_relaxed(self, result): "Adds relaxation warnings to the result" relaxed = get_relaxed([result["freevariables"][r] for r in self.relaxvars], self.freedvars) + initsolwarning(result, "Relaxed Constants") for (_, freed) in relaxed: msg = (" %s: relaxed from %-.4g to %-.4g" % (freed, diff --git a/gpkit/constraints/tight.py b/gpkit/constraints/tight.py index 063c4e7b2..9aa0d02a5 100644 --- a/gpkit/constraints/tight.py +++ b/gpkit/constraints/tight.py @@ -1,7 +1,7 @@ "Implements Tight" from .set import ConstraintSet from ..small_scripts import mag -from ..small_scripts import appendsolwarning +from ..small_scripts import appendsolwarning, initsolwarning from .. import SignomialsEnabled @@ -18,6 +18,7 @@ def process_result(self, result): "Checks that all constraints are satisfied with equality" super().process_result(result) variables = result["variables"] + initsolwarning(result, "Unexpectedly Loose Constraints") for constraint in self.flat(): with SignomialsEnabled(): leftval = constraint.left.sub(variables).value diff --git a/gpkit/small_scripts.py b/gpkit/small_scripts.py index 3d282d2fa..1ce4406ee 100644 --- a/gpkit/small_scripts.py +++ b/gpkit/small_scripts.py @@ -3,12 +3,16 @@ import numpy as np -def appendsolwarning(msg, data, result, category="uncategorized"): - "Append a particular category of warnings to a solution." +def initsolwarning(result, category="uncategorized"): + "Creates a results dictionary for a particular category of warning." if "warnings" not in result: result["warnings"] = {} if category not in result["warnings"]: result["warnings"][category] = [] + + +def appendsolwarning(msg, data, result, category="uncategorized"): + "Append a particular category of warnings to a solution." result["warnings"][category].append((msg, data)) diff --git a/gpkit/solution_array.py b/gpkit/solution_array.py index 20f97a645..7af996894 100644 --- a/gpkit/solution_array.py +++ b/gpkit/solution_array.py @@ -67,24 +67,30 @@ def msenss_table(data, _, **kwargs): lines = ["Model Sensitivities", "-------------------"] if kwargs["sortmodelsbysenss"]: lines[0] += " (sorts models in sections below)" + previousmsenssstr = "" for model, msenss in data: if not model: # for now let's only do named models continue if (msenss < 0.1).all(): msenss = np.max(msenss) if msenss: - msenssstr = "%6s" % ("<1E%i" % np.log10(msenss)) + msenssstr = "%6s" % ("<1e%i" % np.log10(msenss)) else: msenssstr = " =0 " elif not msenss.shape: msenssstr = "%+6.1f" % msenss else: meansenss = np.mean(msenss) + msenssstr = "%+6.1f" % meansenss deltas = msenss - meansenss - deltastrs = ["%+4.1f" % d if abs(d) >= 0.1 else " - " - for d in deltas] - msenssstr = "%+6.1f + [ %s ]" % (meansenss, " ".join(deltastrs)) - + if np.max(np.abs(deltas)) > 0.1: + deltastrs = ["%+4.1f" % d if abs(d) >= 0.1 else " - " + for d in deltas] + msenssstr += " + [ %s ]" % " ".join(deltastrs) + if msenssstr == previousmsenssstr: + msenssstr = " " + else: + previousmsenssstr = msenssstr lines.append("%s : %s" % (msenssstr, model)) return lines + [""] if len(lines) > 3 else [] @@ -234,9 +240,13 @@ def warnings_table(self, _, **kwargs): return [] for wtype in sorted(self["warnings"]): data_vec = self["warnings"][wtype] + if len(data_vec) == 0: + continue if not hasattr(data_vec, "shape"): data_vec = [data_vec] for i, data in enumerate(data_vec): + if len(data) == 0: + continue data = sorted(data, key=lambda l: l[0]) # sort by msg title = wtype if len(data_vec) > 1: @@ -650,8 +660,8 @@ def summary(self, showvars=(), ntopsenss=5, **kwargs): return out def table(self, showvars=(), - tables=("cost", "warnings", "sweepvariables", - "model sensitivities", "freevariables", + tables=("cost", "warnings", "model sensitivities", + "sweepvariables", "freevariables", "constants", "sensitivities", "tightest constraints"), sortmodelsbysenss=True, **kwargs): """A table representation of this SolutionArray From 027bac062a9503659c8bd7196912bba048044f51 Mon Sep 17 00:00:00 2001 From: Edward Burnell Date: Fri, 19 Mar 2021 12:32:24 -0700 Subject: [PATCH 07/12] clean first x0, add test --- docs/source/examples/simple_sp.py | 4 ++++ gpkit/constraints/sgp.py | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/source/examples/simple_sp.py b/docs/source/examples/simple_sp.py index 4cf7fea21..e755affd5 100644 --- a/docs/source/examples/simple_sp.py +++ b/docs/source/examples/simple_sp.py @@ -17,3 +17,7 @@ # full interim solutions are available print("x values of each GP solve (note convergence)") print(", ".join("%.5f" % sol["freevariables"][x] for sol in m.program.results)) + +# use x0 to give the solution, reducing number of GPs needed +m.localsolve(verbosity=0, x0={x: 0.9, y:0.1}) +assert len(m.program.results) == 2 diff --git a/gpkit/constraints/sgp.py b/gpkit/constraints/sgp.py index 321721273..159af174c 100644 --- a/gpkit/constraints/sgp.py +++ b/gpkit/constraints/sgp.py @@ -149,7 +149,7 @@ def localsolve(self, solver=None, *, verbosity=1, x0=None, reltol=1e-4, "Unsolved after %s iterations. Check `m.program.results`;" " if they're converging, try `.localsolve(...," " iteration_limit=NEWLIMIT)`." % len(self.gps)) - gp = self.gp(x0, cleanx0=True) + gp = self.gp(x0, cleanx0=(len(self.gps) >= 1)) # clean the first x0 self.gps.append(gp) # NOTE: SIDE EFFECTS if verbosity > 1: print("\nGP Solve %i" % len(self.gps)) @@ -217,7 +217,10 @@ def gp(self, x0=None, *, cleanx0=False): if not x0: return self._gp # return last generated if not cleanx0: - x0 = KeyDict(x0) + cleanedx0 = KeyDict() + cleanedx0.varkeys = self._gp.x0.varkeys + cleanedx0.update(x0) + x0 = cleanedx0 self._gp.x0.update({vk: x0[vk] for vk in self.sgpvks if vk in x0}) p_idx = 0 for sgpc in self.sgpconstraints: From d318e38ff6b291bcae3b2ed43f991b5dc8c3ae57 Mon Sep 17 00:00:00 2001 From: Edward Burnell Date: Fri, 19 Mar 2021 12:33:23 -0700 Subject: [PATCH 08/12] fix docs typo --- docs/source/signomialprogramming.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/signomialprogramming.rst b/docs/source/signomialprogramming.rst index 5b80da324..d50125944 100644 --- a/docs/source/signomialprogramming.rst +++ b/docs/source/signomialprogramming.rst @@ -33,7 +33,7 @@ Example Usage When using the ``localsolve`` method, the ``reltol`` argument specifies the relative tolerance of the solver: that is, by what percent does the solution have to improve between iterations? If any iteration improves less than that amount, the solver stops and returns its value. -If you wish to start the local optimization at a particular point :math:`x_k`, however, you may do so by putting that position (a dictionary formatted as you would a substitution) as the ``xk`` argument. +If you wish to start the local optimization at a particular point :math:`x_k`, however, you may do so by putting that position (a dictionary formatted as you would a substitution) as the ``x0`` argument. .. _sgp: From 746985f7a4ba8cbdfd4553744e2470e7748ee1a2 Mon Sep 17 00:00:00 2001 From: Edward Burnell Date: Fri, 19 Mar 2021 13:06:28 -0700 Subject: [PATCH 09/12] use vks for susbtitutions keydicting --- gpkit/constraints/set.py | 3 +-- gpkit/constraints/sgp.py | 10 ++++++---- gpkit/keydict.py | 10 ++++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/gpkit/constraints/set.py b/gpkit/constraints/set.py index 830d97b83..dc3dcf8fd 100644 --- a/gpkit/constraints/set.py +++ b/gpkit/constraints/set.py @@ -76,7 +76,7 @@ def __init__(self, constraints, substitutions=None, *, bonusvks=None): # pylint self.vks = set(self.unique_varkeys) self.substitutions = KeyDict({k: k.value for k in self.unique_varkeys if "value" in k.descr}) - self.substitutions.cset = self + self.substitutions.vks = self.vks self.bounded, self.meq_bounded = set(), defaultdict(set) for i, constraint in enumerate(self): if hasattr(constraint, "vks"): @@ -95,7 +95,6 @@ def __init__(self, constraints, substitutions=None, *, bonusvks=None): # pylint self.vks.update(bonusvks) if substitutions: self.substitutions.update(substitutions) - self._varkeys = None for key in self.vks: if key not in self.substitutions: if key.veckey is None or key.veckey not in self.substitutions: diff --git a/gpkit/constraints/sgp.py b/gpkit/constraints/sgp.py index 159af174c..0463af3f5 100644 --- a/gpkit/constraints/sgp.py +++ b/gpkit/constraints/sgp.py @@ -66,7 +66,7 @@ def __init__(self, cost, model, substitutions, *, self.approxconstraints = [] self.sgpvks = set() x0 = KeyDict(substitutions) - x0.varkeys = model.varkeys # for string access and so forth + x0.vks = model.vks # for string access and so forth for cs in model.flat(): try: if not hasattr(cs, "as_hmapslt1"): @@ -199,8 +199,10 @@ def localsolve(self, solver=None, *, verbosity=1, x0=None, reltol=1e-4, " %.2g%%. Calling .localsolve with a higher" " `pccp_penalty` (it was %.3g this time) will reduce" " final slack if the model is solvable with less. If" - " you think it might not be, check by solving with " - "`use_pccp=False, x0=(this model's final solution)`.\n" + " you think it might not be, check by generating an SP with" + "`use_pccp=False`, then solving with x0=(this model's final" + " solution); e.g. `m.sp(use_pccp=False).localsolve(" + "x0=m.solution[\"variables\"])`.\n" % (100*excess_slack, self.pccp_penalty)) return self.result @@ -218,7 +220,7 @@ def gp(self, x0=None, *, cleanx0=False): return self._gp # return last generated if not cleanx0: cleanedx0 = KeyDict() - cleanedx0.varkeys = self._gp.x0.varkeys + cleanedx0.vks = self._gp.x0.vks cleanedx0.update(x0) x0 = cleanedx0 self._gp.x0.update({vk: x0[vk] for vk in self.sgpvks if vk in x0}) diff --git a/gpkit/keydict.py b/gpkit/keydict.py index c6f393ed4..a64ce9a61 100644 --- a/gpkit/keydict.py +++ b/gpkit/keydict.py @@ -45,7 +45,7 @@ class KeyMap: collapse_arrays = False keymap = [] log_gets = False - cset = None + vks = varkeys = None def __init__(self, *args, **kwargs): "Passes through to super().__init__ via the `update()` method" @@ -62,12 +62,14 @@ def parse_and_index(self, key): return key.veckey, key.idx return key, None except AttributeError: - if self.cset is None: + if self.vks is None and self.varkeys is None: return key, self.update_keymap() # looks like we're in a substitutions dictionary - if key not in self.cset.varkeys: + if self.varkeys is None: + self.varkeys = KeySet(self.vks) + if key not in self.varkeys: raise KeyError(key) - newkey, *otherkeys = self.cset.varkeys[key] + newkey, *otherkeys = self.varkeys[key] if otherkeys: if all(k.veckey == newkey.veckey for k in otherkeys): return newkey.veckey, None From 5423bf51a254426804e0d6c61137888e0ba10c99 Mon Sep 17 00:00:00 2001 From: Ned Burnell Date: Fri, 19 Mar 2021 13:44:20 -0700 Subject: [PATCH 10/12] Clean user-submitted x0s during localsolve (#1541) * clean first x0, add test * fix docs typo (xk instead of x0) * use vks for susbtitutions keydicting --- docs/source/examples/simple_sp.py | 4 ++++ docs/source/signomialprogramming.rst | 2 +- gpkit/constraints/set.py | 3 +-- gpkit/constraints/sgp.py | 15 ++++++++++----- gpkit/keydict.py | 10 ++++++---- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/docs/source/examples/simple_sp.py b/docs/source/examples/simple_sp.py index 4cf7fea21..e755affd5 100644 --- a/docs/source/examples/simple_sp.py +++ b/docs/source/examples/simple_sp.py @@ -17,3 +17,7 @@ # full interim solutions are available print("x values of each GP solve (note convergence)") print(", ".join("%.5f" % sol["freevariables"][x] for sol in m.program.results)) + +# use x0 to give the solution, reducing number of GPs needed +m.localsolve(verbosity=0, x0={x: 0.9, y:0.1}) +assert len(m.program.results) == 2 diff --git a/docs/source/signomialprogramming.rst b/docs/source/signomialprogramming.rst index 5b80da324..d50125944 100644 --- a/docs/source/signomialprogramming.rst +++ b/docs/source/signomialprogramming.rst @@ -33,7 +33,7 @@ Example Usage When using the ``localsolve`` method, the ``reltol`` argument specifies the relative tolerance of the solver: that is, by what percent does the solution have to improve between iterations? If any iteration improves less than that amount, the solver stops and returns its value. -If you wish to start the local optimization at a particular point :math:`x_k`, however, you may do so by putting that position (a dictionary formatted as you would a substitution) as the ``xk`` argument. +If you wish to start the local optimization at a particular point :math:`x_k`, however, you may do so by putting that position (a dictionary formatted as you would a substitution) as the ``x0`` argument. .. _sgp: diff --git a/gpkit/constraints/set.py b/gpkit/constraints/set.py index 830d97b83..dc3dcf8fd 100644 --- a/gpkit/constraints/set.py +++ b/gpkit/constraints/set.py @@ -76,7 +76,7 @@ def __init__(self, constraints, substitutions=None, *, bonusvks=None): # pylint self.vks = set(self.unique_varkeys) self.substitutions = KeyDict({k: k.value for k in self.unique_varkeys if "value" in k.descr}) - self.substitutions.cset = self + self.substitutions.vks = self.vks self.bounded, self.meq_bounded = set(), defaultdict(set) for i, constraint in enumerate(self): if hasattr(constraint, "vks"): @@ -95,7 +95,6 @@ def __init__(self, constraints, substitutions=None, *, bonusvks=None): # pylint self.vks.update(bonusvks) if substitutions: self.substitutions.update(substitutions) - self._varkeys = None for key in self.vks: if key not in self.substitutions: if key.veckey is None or key.veckey not in self.substitutions: diff --git a/gpkit/constraints/sgp.py b/gpkit/constraints/sgp.py index 321721273..0463af3f5 100644 --- a/gpkit/constraints/sgp.py +++ b/gpkit/constraints/sgp.py @@ -66,7 +66,7 @@ def __init__(self, cost, model, substitutions, *, self.approxconstraints = [] self.sgpvks = set() x0 = KeyDict(substitutions) - x0.varkeys = model.varkeys # for string access and so forth + x0.vks = model.vks # for string access and so forth for cs in model.flat(): try: if not hasattr(cs, "as_hmapslt1"): @@ -149,7 +149,7 @@ def localsolve(self, solver=None, *, verbosity=1, x0=None, reltol=1e-4, "Unsolved after %s iterations. Check `m.program.results`;" " if they're converging, try `.localsolve(...," " iteration_limit=NEWLIMIT)`." % len(self.gps)) - gp = self.gp(x0, cleanx0=True) + gp = self.gp(x0, cleanx0=(len(self.gps) >= 1)) # clean the first x0 self.gps.append(gp) # NOTE: SIDE EFFECTS if verbosity > 1: print("\nGP Solve %i" % len(self.gps)) @@ -199,8 +199,10 @@ def localsolve(self, solver=None, *, verbosity=1, x0=None, reltol=1e-4, " %.2g%%. Calling .localsolve with a higher" " `pccp_penalty` (it was %.3g this time) will reduce" " final slack if the model is solvable with less. If" - " you think it might not be, check by solving with " - "`use_pccp=False, x0=(this model's final solution)`.\n" + " you think it might not be, check by generating an SP with" + "`use_pccp=False`, then solving with x0=(this model's final" + " solution); e.g. `m.sp(use_pccp=False).localsolve(" + "x0=m.solution[\"variables\"])`.\n" % (100*excess_slack, self.pccp_penalty)) return self.result @@ -217,7 +219,10 @@ def gp(self, x0=None, *, cleanx0=False): if not x0: return self._gp # return last generated if not cleanx0: - x0 = KeyDict(x0) + cleanedx0 = KeyDict() + cleanedx0.vks = self._gp.x0.vks + cleanedx0.update(x0) + x0 = cleanedx0 self._gp.x0.update({vk: x0[vk] for vk in self.sgpvks if vk in x0}) p_idx = 0 for sgpc in self.sgpconstraints: diff --git a/gpkit/keydict.py b/gpkit/keydict.py index c6f393ed4..a64ce9a61 100644 --- a/gpkit/keydict.py +++ b/gpkit/keydict.py @@ -45,7 +45,7 @@ class KeyMap: collapse_arrays = False keymap = [] log_gets = False - cset = None + vks = varkeys = None def __init__(self, *args, **kwargs): "Passes through to super().__init__ via the `update()` method" @@ -62,12 +62,14 @@ def parse_and_index(self, key): return key.veckey, key.idx return key, None except AttributeError: - if self.cset is None: + if self.vks is None and self.varkeys is None: return key, self.update_keymap() # looks like we're in a substitutions dictionary - if key not in self.cset.varkeys: + if self.varkeys is None: + self.varkeys = KeySet(self.vks) + if key not in self.varkeys: raise KeyError(key) - newkey, *otherkeys = self.cset.varkeys[key] + newkey, *otherkeys = self.varkeys[key] if otherkeys: if all(k.veckey == newkey.veckey for k in otherkeys): return newkey.veckey, None From c867b70d28dc9ad5a8ea322c7de32252842738c6 Mon Sep 17 00:00:00 2001 From: Edward Burnell Date: Fri, 19 Mar 2021 13:57:16 -0700 Subject: [PATCH 11/12] fix docs typo --- docs/source/signomialprogramming.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/signomialprogramming.rst b/docs/source/signomialprogramming.rst index d50125944..61875dd8c 100644 --- a/docs/source/signomialprogramming.rst +++ b/docs/source/signomialprogramming.rst @@ -33,7 +33,7 @@ Example Usage When using the ``localsolve`` method, the ``reltol`` argument specifies the relative tolerance of the solver: that is, by what percent does the solution have to improve between iterations? If any iteration improves less than that amount, the solver stops and returns its value. -If you wish to start the local optimization at a particular point :math:`x_k`, however, you may do so by putting that position (a dictionary formatted as you would a substitution) as the ``x0`` argument. +If you wish to start the local optimization at a particular point :math:`x_0`, however, you may do so by putting that position (a dictionary formatted as you would a substitution) as the ``x0`` argument. .. _sgp: From 1b09b7f5f484433208d8cfc8dad15ef1c1424f27 Mon Sep 17 00:00:00 2001 From: Ned Burnell Date: Sun, 21 Mar 2021 14:18:56 -0700 Subject: [PATCH 12/12] Working MIGP (#1527) * migp with choice variables * add test and use warnings to discuss migp results * update docs --- docs/source/advancedcommands.rst | 59 ++++++++++++++++++ docs/source/examples/migp.py | 10 ++++ docs/source/examples/migp_output.txt | 59 ++++++++++++++++++ docs/source/installation.rst | 32 +++++----- gpkit/constraints/gp.py | 30 +++++++++- gpkit/small_classes.py | 5 +- gpkit/solution_array.py | 14 +++-- gpkit/solvers/mosek_conif.py | 89 +++++++++++++++++++++------- gpkit/tests/helpers.py | 5 +- gpkit/tests/t_examples.py | 7 +++ 10 files changed, 264 insertions(+), 46 deletions(-) create mode 100644 docs/source/examples/migp.py create mode 100644 docs/source/examples/migp_output.txt diff --git a/docs/source/advancedcommands.rst b/docs/source/advancedcommands.rst index 5afa5e8f3..a01d3b529 100644 --- a/docs/source/advancedcommands.rst +++ b/docs/source/advancedcommands.rst @@ -1,6 +1,65 @@ Advanced Commands ***************** +.. _migp: + +Choice Variables +================ +If MOSEK 9 is installed, GPkit supports discretized free variables with the ``mosek_conif`` solver. +Choice variables are free in the sense of having multiple possible choices, but discretized in the +sense of having a limited set of possible solutions. + +.. literalinclude:: examples/migp.py + +If solved with the mosek_conif solver, the script above will print:: + + Optimal Cost + ------------ + [ 1.5 2.15 2.8 3.22 ... ] + + ~~~~~~~~ + WARNINGS + ~~~~~~~~ + No Dual Solution + ---------------- + This model has the discretized choice variables [x] and hence no dual + solution. You can fix those variables to their optimal value and get + sensitivities to the resulting continuous problem by updating your model's + substitions with `sol["choicevariables"]`. + ~~~~~~~~ + + Swept Variables + --------------- + numerator : [ 0.5 + 1.15 + 1.8 + 2.45 + 3.1 + 3.75 + 4.4 + 5.05 + 5.7 + 6.35 + 7 ] + + Free Variables + -------------- + x : [ 1 + 1 + 1 + 2 + 2 + 2 + 2 + 2 + 2 + 3 + 3 ] + +Note that the optimal values for ``x`` are discretized, clicking from 1 +to 2 to 3 during the sweep, and that the solution has no dual variables. + + Derived Variables ================= diff --git a/docs/source/examples/migp.py b/docs/source/examples/migp.py new file mode 100644 index 000000000..372c7ab1f --- /dev/null +++ b/docs/source/examples/migp.py @@ -0,0 +1,10 @@ +import numpy as np +from gpkit import * + +x = Variable("x", choices=range(1,4)) +num = Variable("numerator", np.linspace(0.5, 7, 11)) + +m = Model(x + num/x) +sol = m.solve(verbosity=0) + +print(sol.table()) diff --git a/docs/source/examples/migp_output.txt b/docs/source/examples/migp_output.txt new file mode 100644 index 000000000..8dfe175c2 --- /dev/null +++ b/docs/source/examples/migp_output.txt @@ -0,0 +1,59 @@ + +Optimal Cost +------------ + [ 1.41 2.14 2.68 3.13 ... ] + +~~~~~~~~ +WARNINGS +~~~~~~~~ +Freed Choice Variables +---------------------- +This model has the discretized choice variables [x], but since the 'cvxopt' solver doesn't support discretization they were treated as continuous variables. +~~~~~~~~ + +Swept Variables +--------------- +numerator : [ 0.5 + 1.15 + 1.8 + 2.45 + 3.1 + 3.75 + 4.4 + 5.05 + 5.7 + 6.35 + 7 ] + +Free Variables +-------------- +x : [ 0.707 + 1.07 + 1.34 + 1.57 + 1.76 + 1.94 + 2.1 + 2.25 + 2.39 + 2.52 + 2.65 ] + +Variable Sensitivities +---------------------- +numerator : [ +0.5 + +0.5 + +0.5 + +0.5 + +0.5 + +0.5 + +0.5 + +0.5 + +0.5 + +0.5 + +0.5 ] + +Most Sensitive Constraints (in last sweep) +------------------------------------------ +(none) + diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 96dc5d84a..15fb59528 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -4,42 +4,44 @@ Installation ************ 1. If you are on Mac or Windows, we recommend installing `Anaconda `_. Alternatively, `install pip and create a virtual environment `_. -2. (optional) Install the MOSEK solver as directed below -3. Run ``pip install gpkit`` in the appropriate terminal or command prompt. -4. Open a Python prompt and run ``import gpkit`` to finish installation and run unit tests. +2. (optional) Install the MOSEK 9 solver with ``pip install Mosek``, then a license as described below +3. (optional) Install the MOSEK 8 solver as described below +4. Run ``pip install gpkit`` in the appropriate terminal or command prompt. +5. Open a Python prompt and run ``import gpkit`` to finish installation and run unit tests. If you encounter any bugs please email ``gpkit@mit.edu`` or `raise a GitHub issue `_. -Installing MOSEK -================ -GPkit interfaces with two off the shelf solvers: cvxopt, and MOSEK. +Installing MOSEK 8 +================== +GPkit interfaces with two off the shelf solvers: cvxopt, and MOSEK (versions 8 and 9). Cvxopt is open source and installed by default; MOSEK requires a commercial licence or (free) -academic license. +academic license. In MOSEK version 8 GPkit uses the command-line interface ``mskexpopt`` solver, while +in MOSEK 9 it uses the more active exponential-cone interface (and hence supports :ref:`migp`). Mac OS X - If ``which gcc`` does not return anything, install the `Apple Command Line Tools `_. - Download `MOSEK 8 `_, then: - Move the ``mosek`` folder to your home directory - Follow `these steps for Mac `_. - - Request an `academic license file `_ and put it in ``~/mosek/`` + - Request an `academic license file `_ and put it in ``~/mosek/`` Linux - Download `MOSEK 8 `_, then: - Move the ``mosek`` folder to your home directory - Follow `these steps for Linux `_. - - Request an `academic license file `_ and put it in ``~/mosek/`` + - Request an `academic license file `_ and put it in ``~/mosek/`` Windows + - Make sure ``gcc`` is on your system path. + - To do this, type ``gcc`` into a command prompt. + - If you get ``executable not found``, then install the 64-bit version (x86_64 installer architecture dropdown option) with GCC version 6.4.0 or older of `mingw `_. + - In an Anaconda command prompt (or equivalent), run ``cd C:\Program Files\mingw-w64\x86_64-6.4.0-posix-seh-rt_v5-rev0\`` (or whatever corresponds to the correct installation directory; note that if mingw is in ``Program Files (x86)`` instead of ``Program Files`` you've installed the 32-bit version by mistake) + - Run ``mingw-w64`` to add it to your executable path. For step 3 of the install process you'll need to run ``pip install gpkit`` from this prompt. - Download `MOSEK 8 `_, then: - Follow `these steps for Windows `_. - - Request an `academic license file `_ and put it in ``C:\Users\(your_username)\mosek\`` - - Make sure ``gcc`` is on your system path. - - To do this, type ``gcc`` into a command prompt. - - If you get ``executable not found``, then install the 64-bit version (x86_64 installer architecture dropdown option) with GCC version 6.4.0 or older of `mingw `_. - - In an Anaconda command prompt (or equivalent), run ``cd C:\Program Files\mingw-w64\x86_64-6.4.0-posix-seh-rt_v5-rev0\`` (or whatever corresponds to the correct installation directory; note that if mingw is in ``Program Files (x86)`` instead of ``Program Files`` you've installed the 32-bit version by mistake) - - Run ``mingw-w64`` to add it to your executable path. For step 3 of the install process you'll need to run ``pip install gpkit`` from this prompt. + - Request an `academic license file `_ and put it in ``C:\Users\(your_username)\mosek\`` Debugging your installation =========================== diff --git a/gpkit/constraints/gp.py b/gpkit/constraints/gp.py index 89a8fe294..b236596e7 100644 --- a/gpkit/constraints/gp.py +++ b/gpkit/constraints/gp.py @@ -69,6 +69,7 @@ class GeometricProgram: >>> gp.solve() """ _result = solve_log = solver_out = model = v_ss = nu_by_posy = None + choicevaridxs = integersolve = None def __init__(self, cost, constraints, substitutions, *, checkbounds=True): self.cost, self.substitutions = cost, substitutions @@ -155,6 +156,8 @@ def gen(self): m_idx += 1 self.p_idxs = np.array(self.p_idxs, "int32") # to use array equalities self.varidxs = {vk: i for i, vk in enumerate(self.varlocs)} + self.choicevaridxs = {vk: i for i, vk in enumerate(self.varlocs) + if vk.choices} for j, (var, locs) in enumerate(self.varlocs.items()): row.extend(locs) col.extend([j]*len(locs)) @@ -191,6 +194,9 @@ def solve(self, solver=None, *, verbosity=1, gen_result=True, **kwargs): solverargs = DEFAULT_SOLVER_KWARGS.get(solvername, {}) solverargs.update(kwargs) + if self.choicevaridxs and solvername == "mosek_conif": + solverargs["choicevaridxs"] = self.choicevaridxs + self.integersolve = True starttime = time() solver_out, infeasibility, original_stdout = {}, None, sys.stdout try: @@ -304,6 +310,27 @@ def _compile_result(self, solver_out): result["constants"] = KeyDict(self.substitutions) result["variables"] = KeyDict(result["freevariables"]) result["variables"].update(result["constants"]) + result["soltime"] = solver_out["soltime"] + if self.integersolve: + result["choicevariables"] = KeyDict( \ + {k: v for k, v in result["freevariables"].items() + if k in self.choicevaridxs}) + result["warnings"] = {"No Dual Solution": [(\ + "This model has the discretized choice variables" + " %s and hence no dual solution. You can fix those variables" + " to their optimal value and get sensitivities to the resulting" + " continuous problem by updating your model's substitions with" + " `sol[\"choicevariables\"]`." + % sorted(self.choicevaridxs.keys()), self.choicevaridxs)]} + return SolutionArray(result) + elif self.choicevaridxs: + result["warnings"] = {"Freed Choice Variables": [(\ + "This model has the discretized choice variables" + " %s, but since the '%s' solver doesn't support discretization" + " they were treated as continuous variables." + % (sorted(self.choicevaridxs.keys()), solver_out["solver"]), + self.choicevaridxs)]} + result["sensitivities"] = {"constraints": {}} la, self.nu_by_posy = self._generate_nula(solver_out) cost_senss = sum(nu_i*exp for (nu_i, exp) in zip(self.nu_by_posy[0], @@ -342,7 +369,6 @@ def _compile_result(self, solver_out): result["sensitivities"]["variables"] = KeyDict(gpv_ss) result["sensitivities"]["constants"] = \ result["sensitivities"]["variables"] # NOTE: backwards compat. - result["soltime"] = solver_out["soltime"] return SolutionArray(result) def check_solution(self, cost, primal, nu, la, tol, abstol=1e-20): @@ -379,6 +405,8 @@ def almost_equal(num1, num2): raise Infeasible("Primal solution violates constraint: %s is " "greater than 1" % primal_exp_vals[mi].sum()) # check dual sol # + if self.integersolve: + return # note: follows dual formulation in section 3.1 of # http://web.mit.edu/~whoburg/www/papers/hoburg_phd_thesis.pdf if not almost_equal(self.nu_by_posy[0].sum(), 1): diff --git a/gpkit/small_classes.py b/gpkit/small_classes.py index b66d71464..81d5043fc 100644 --- a/gpkit/small_classes.py +++ b/gpkit/small_classes.py @@ -74,9 +74,10 @@ def __init__(self, output=None, *, verbosity=0): def write(self, writ): "Append and potentially write the new line." + if writ[:2] == "b'": + writ = writ[2:-1] if writ != "\n": - writ = writ.rstrip("\n") - self.append(str(writ)) + self.append(writ.rstrip("\n")) if self.verbosity > 0: # pragma: no cover self.output.write(writ) diff --git a/gpkit/solution_array.py b/gpkit/solution_array.py index 7af996894..30fe3eda9 100644 --- a/gpkit/solution_array.py +++ b/gpkit/solution_array.py @@ -243,7 +243,9 @@ def warnings_table(self, _, **kwargs): if len(data_vec) == 0: continue if not hasattr(data_vec, "shape"): - data_vec = [data_vec] + data_vec = [data_vec] # not a sweep + if all((data == data_vec[0]).all() for data in data_vec[1:]): + data_vec = [data_vec[0]] # warnings identical across all sweeps for i, data in enumerate(data_vec): if len(data) == 0: continue @@ -340,7 +342,8 @@ class SolutionArray(DictOfLists): """ modelstr = "" _name_collision_varkeys = None - table_titles = {"sweepvariables": "Swept Variables", + table_titles = {"choicevariables": "Choice Variables", + "sweepvariables": "Swept Variables", "freevariables": "Free Variables", "constants": "Fixed Variables", # TODO: change everywhere "variables": "Variables"} @@ -683,7 +686,7 @@ def table(self, showvars=(), ------- str """ - if sortmodelsbysenss: + if sortmodelsbysenss and "sensitivities" in self: kwargs["sortmodelsbysenss"] = self["sensitivities"]["models"] else: kwargs["sortmodelsbysenss"] = False @@ -700,7 +703,10 @@ def table(self, showvars=(), showvars = self._parse_showvars(showvars) strs = [] for table in tables: - if table == "cost": + if "sensitivities" not in self and ("sensitivities" in table or + "constraints" in table): + continue + elif table == "cost": cost = self["cost"] # pylint: disable=unsubscriptable-object if kwargs.get("latex", None): # cost is not printed for latex continue diff --git a/gpkit/solvers/mosek_conif.py b/gpkit/solvers/mosek_conif.py index 75c4b123c..450acaef1 100644 --- a/gpkit/solvers/mosek_conif.py +++ b/gpkit/solvers/mosek_conif.py @@ -180,6 +180,35 @@ def optimize(*, c, A, k, p_idxs, **kwargs): task.putconboundlist(con_indices, type_constraint, h, h) cur_con_idx += log_c_lin.size # + # Constrain choice variables to discrete choices + # + choicevaridxs = kwargs.get("choicevaridxs", {}) + if choicevaridxs: + n_choicevars = 0 + for var, idx in choicevaridxs.items(): + choices = sorted(var.choices) + m_choices = len(choices) - 1 # the first option is the default + choiceidxs = np.arange(msk_nvars + n_choicevars, + msk_nvars + n_choicevars + m_choices) + n_choicevars += m_choices + task.appendvars(m_choices) + task.putvartypelist(choiceidxs, + [mosek.variabletype.type_int]*m_choices) + task.putvarboundlist(choiceidxs, [mosek.boundkey.ra]*m_choices, + np.zeros(m_choices), np.ones(m_choices)) + task.appendcons(m_choices) + for i in range(m_choices - 1): + # each larger choice requires those before it + task.putarow(cur_con_idx + i, choiceidxs[i:i+2], [1.0, -1.0]) + task.putconbound(cur_con_idx + i, mosek.boundkey.lo, 0.0, 0.0) + cur_con_idx += 1 + base = np.log(choices[0]) + logdiffs = np.diff(np.log(choices)).tolist() + task.putarow(cur_con_idx, choiceidxs.tolist() + [idx], + logdiffs + [-1]) # choices are summed + task.putconbound(cur_con_idx, mosek.boundkey.fx, -base, -base) + cur_con_idx += 1 + # # Set the objective function # task.putclist([int(m + 3*n_lse)], [1]) @@ -212,40 +241,54 @@ def streamprinter(text): # # Recover the solution # - msk_solsta = task.getsolsta(mosek.soltype.itr) + if choicevaridxs: + sol = mosek.soltype.itg + optimal = mosek.solsta.integer_optimal + else: + sol = mosek.soltype.itr + optimal = mosek.solsta.optimal + msk_solsta = task.getsolsta(sol) if msk_solsta == mosek.solsta.prim_infeas_cer: raise PrimalInfeasible() if msk_solsta == mosek.solsta.dual_infeas_cer: raise DualInfeasible() - if msk_solsta != mosek.solsta.optimal: # pragma: no cover + if msk_solsta != optimal: # pragma: no cover raise UnknownInfeasible("solution status: ", msk_solsta) # recover primal variables x = [0.] * m - task.getxxslice(mosek.soltype.itr, 0, m, x) + task.getxxslice(sol, 0, m, x) + # recover binary variables + # xbin = [0.] * (n_choicevars) + # task.getxxslice(sol, msk_nvars, msk_nvars + n_choicevars, xbin) + # wrap things up in a dictionary + solution = {"status": "optimal", "primal": np.array(x), + "objective": np.exp(task.getprimalobj(sol))} # recover dual variables for log-sum-exp epigraph constraints # (skip epigraph of the objective function). - z_duals = [0.] * (p_lse - 1) - task.getsuxslice(mosek.soltype.itr, m + 3*n_lse + 1, msk_nvars, z_duals) - z_duals = np.array(z_duals) - z_duals[z_duals < 0] = 0 - # recover dual variables for the remaining user-provided constraints - if log_c_lin is not None: - aff_duals = [0.] * log_c_lin.size - task.getsucslice(mosek.soltype.itr, n_lse + p_lse, cur_con_idx, - aff_duals) - aff_duals = np.array(aff_duals) - aff_duals[aff_duals < 0] = 0 - # merge z_duals with aff_duals - merged_duals = np.zeros(len(k)) - merged_duals[lse_posys[1:]] = z_duals # skipping the cost - merged_duals[lin_posys] = aff_duals - merged_duals = merged_duals[1:] + if choicevaridxs: # no dual solution + solution["la"] = [] + solution["nu"] = [] else: - merged_duals = z_duals - # wrap things up in a dictionary - solution = {"status": "optimal", "primal": np.array(x), "la": merged_duals, - "objective": np.exp(task.getprimalobj(mosek.soltype.itr))} + z_duals = [0.] * (p_lse - 1) + task.getsuxslice(mosek.soltype.itr, m + 3*n_lse + 1, msk_nvars, z_duals) + z_duals = np.array(z_duals) + z_duals[z_duals < 0] = 0 + # recover dual variables for the remaining user-provided constraints + if log_c_lin is None: + solution["la"] = z_duals + else: + aff_duals = [0.] * log_c_lin.size + task.getsucslice(mosek.soltype.itr, n_lse + p_lse, cur_con_idx, + aff_duals) + aff_duals = np.array(aff_duals) + aff_duals[aff_duals < 0] = 0 + # merge z_duals with aff_duals + merged_duals = np.zeros(len(k)) + merged_duals[lse_posys[1:]] = z_duals # skipping the cost + merged_duals[lin_posys] = aff_duals + solution["la"] = merged_duals[1:] + task.__exit__(None, None, None) env.__exit__(None, None, None) return solution diff --git a/gpkit/tests/helpers.py b/gpkit/tests/helpers.py index 206575032..dadad448b 100644 --- a/gpkit/tests/helpers.py +++ b/gpkit/tests/helpers.py @@ -84,7 +84,10 @@ def test(self): filepath = ("".join([path, os.sep, "%s_output.txt" % name]) if name not in imported else None) with StdoutCaptured(logfilepath=filepath): - imported[name] = importlib.import_module(name) + if name in imported: + importlib.reload(imported[name]) + else: + imported[name] = importlib.import_module(name) getattr(self, name)(imported[name]) return test diff --git a/gpkit/tests/t_examples.py b/gpkit/tests/t_examples.py index 41db5f576..c84bb9cb6 100644 --- a/gpkit/tests/t_examples.py +++ b/gpkit/tests/t_examples.py @@ -92,6 +92,13 @@ def test_evaluated_free_variables(self, example): def test_external_constraint(self, example): pass + def test_migp(self, example): + if settings["default_solver"] == "mosek_conif": + assert_logtol(example.sol(example.x), [1]*3 + [2]*6 + [3]*2) + else: + assert_logtol(example.sol(example.x), + np.sqrt(example.sol(example.num))) + def test_external_function(self, example): external_code = example.external_code self.assertEqual(external_code(0), 0)