gamspy 1.18.2__py3-none-any.whl → 1.18.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gamspy/_cli/cli.py +2 -1
- gamspy/_cli/mps2gms.py +128 -0
- gamspy/_container.py +42 -0
- gamspy/_convert.py +25 -18
- gamspy/_model.py +2 -4
- gamspy/_symbols/equation.py +1 -1
- gamspy/_symbols/universe_alias.py +5 -1
- gamspy/_validation.py +9 -0
- gamspy/utils.py +1 -0
- {gamspy-1.18.2.dist-info → gamspy-1.18.3.dist-info}/METADATA +1 -1
- {gamspy-1.18.2.dist-info → gamspy-1.18.3.dist-info}/RECORD +15 -14
- {gamspy-1.18.2.dist-info → gamspy-1.18.3.dist-info}/WHEEL +0 -0
- {gamspy-1.18.2.dist-info → gamspy-1.18.3.dist-info}/entry_points.txt +0 -0
- {gamspy-1.18.2.dist-info → gamspy-1.18.3.dist-info}/licenses/LICENSE +0 -0
- {gamspy-1.18.2.dist-info → gamspy-1.18.3.dist-info}/top_level.txt +0 -0
gamspy/_cli/cli.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typer
|
|
4
4
|
|
|
5
|
-
from . import gdx, install, list, probe, retrieve, run, show, uninstall
|
|
5
|
+
from . import gdx, install, list, mps2gms, probe, retrieve, run, show, uninstall
|
|
6
6
|
|
|
7
7
|
app = typer.Typer(
|
|
8
8
|
rich_markup_mode="rich",
|
|
@@ -16,6 +16,7 @@ app.add_typer(retrieve.app, name="retrieve")
|
|
|
16
16
|
app.add_typer(run.app, name="run")
|
|
17
17
|
app.add_typer(show.app, name="show")
|
|
18
18
|
app.add_typer(uninstall.app, name="uninstall")
|
|
19
|
+
app.command(name="mps2gms")(mps2gms.mps2gms)
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
def version_callback(value: bool):
|
gamspy/_cli/mps2gms.py
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import platform
|
|
5
|
+
import subprocess
|
|
6
|
+
from pathlib import Path # noqa: TC003
|
|
7
|
+
from typing import Annotated
|
|
8
|
+
|
|
9
|
+
import gamspy_base
|
|
10
|
+
import typer
|
|
11
|
+
|
|
12
|
+
# Valid values for categorical parameters based on help string
|
|
13
|
+
VALID_YN = {"0", "N", "1", "Y"}
|
|
14
|
+
VALID_DUPLICATES = {"NOCHECK", "ADD", "IGNORE", "ERROR"}
|
|
15
|
+
VALID_ORIGNAMES = {"NO", "MODIFIED", "ALL"}
|
|
16
|
+
VALID_CONVERTSENSE = {"0", "N", "1", "Y", "MIN", "-1", "MAX"}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Completion functions for Typer
|
|
20
|
+
def complete_yn(ctx: typer.Context, incomplete: str):
|
|
21
|
+
return [v for v in VALID_YN if v.lower().startswith(incomplete.lower())]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def complete_duplicates(ctx: typer.Context, incomplete: str):
|
|
25
|
+
return [v for v in VALID_DUPLICATES if v.lower().startswith(incomplete.lower())]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def complete_orignames(ctx: typer.Context, incomplete: str):
|
|
29
|
+
return [v for v in VALID_ORIGNAMES if v.lower().startswith(incomplete.lower())]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def complete_convertsense(ctx: typer.Context, incomplete: str):
|
|
33
|
+
return [v for v in VALID_CONVERTSENSE if v.lower().startswith(incomplete.lower())]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def mps2gms(
|
|
37
|
+
input_file: Annotated[
|
|
38
|
+
Path, typer.Argument(help="MPS or LP file to translate.", exists=True)
|
|
39
|
+
],
|
|
40
|
+
gdx_file: Annotated[
|
|
41
|
+
Path | None, typer.Argument(help="Name of GDX output file.")
|
|
42
|
+
] = None,
|
|
43
|
+
gms_file: Annotated[
|
|
44
|
+
Path | None, typer.Argument(help="Name of GAMS program output file.")
|
|
45
|
+
] = None,
|
|
46
|
+
py_file: Annotated[
|
|
47
|
+
str | None, typer.Option("--py", help="Name of GAMSPy program output file.")
|
|
48
|
+
] = None,
|
|
49
|
+
dec_file: Annotated[
|
|
50
|
+
str | None, typer.Option("--dec", help="DEC file for decomposition info.")
|
|
51
|
+
] = None,
|
|
52
|
+
column_int_vars_binary: Annotated[
|
|
53
|
+
str | None,
|
|
54
|
+
typer.Option(
|
|
55
|
+
"--columnintvarsarebinary",
|
|
56
|
+
help="Integer variables appearing first are binary.",
|
|
57
|
+
autocompletion=complete_yn,
|
|
58
|
+
),
|
|
59
|
+
] = None,
|
|
60
|
+
duplicates: Annotated[
|
|
61
|
+
str | None,
|
|
62
|
+
typer.Option(
|
|
63
|
+
help="How to handle multiple coefficients.",
|
|
64
|
+
autocompletion=complete_duplicates,
|
|
65
|
+
),
|
|
66
|
+
] = None,
|
|
67
|
+
orignames: Annotated[
|
|
68
|
+
str | None,
|
|
69
|
+
typer.Option(
|
|
70
|
+
help="Whether to make original names available.",
|
|
71
|
+
autocompletion=complete_orignames,
|
|
72
|
+
),
|
|
73
|
+
] = None,
|
|
74
|
+
stageshift: Annotated[
|
|
75
|
+
int | None, typer.Option(help="Shift block numbers by this integer.")
|
|
76
|
+
] = None,
|
|
77
|
+
convertsense: Annotated[
|
|
78
|
+
str | None,
|
|
79
|
+
typer.Option(
|
|
80
|
+
help="Convert the objective function sense.",
|
|
81
|
+
autocompletion=complete_convertsense,
|
|
82
|
+
),
|
|
83
|
+
] = None,
|
|
84
|
+
):
|
|
85
|
+
"""
|
|
86
|
+
Translates an MPS or LP file into equivalent generic GAMS and GAMSPy programs.
|
|
87
|
+
Defaults to writing .py and .gdx files if no outputs are specified.
|
|
88
|
+
"""
|
|
89
|
+
binary_name = "mps2gms.exe" if platform.system() == "Windows" else "mps2gms"
|
|
90
|
+
MPS2GMS_PATH = os.path.join(gamspy_base.directory, binary_name)
|
|
91
|
+
|
|
92
|
+
if not os.path.exists(MPS2GMS_PATH):
|
|
93
|
+
typer.echo(f"Binary not found: {MPS2GMS_PATH}", err=True)
|
|
94
|
+
raise typer.Exit(code=1)
|
|
95
|
+
|
|
96
|
+
# Determine default names based on input stem
|
|
97
|
+
input_name = input_file.with_suffix("")
|
|
98
|
+
actual_gdx = gdx_file if gdx_file else f"{input_name}.gdx"
|
|
99
|
+
actual_py = py_file if py_file else f"{input_name}.py"
|
|
100
|
+
|
|
101
|
+
# mps2gms <input> <gdx>
|
|
102
|
+
cmd = [MPS2GMS_PATH, str(input_file), str(actual_gdx)]
|
|
103
|
+
|
|
104
|
+
# If gms_file is provided, add it as the third positional;
|
|
105
|
+
# otherwise, explicitly disable GMS output to prioritize py/gdx.
|
|
106
|
+
if gms_file:
|
|
107
|
+
cmd.append(str(gms_file))
|
|
108
|
+
else:
|
|
109
|
+
cmd.append("GMS=")
|
|
110
|
+
|
|
111
|
+
# Construct key=value parameters for the binary call
|
|
112
|
+
params = {
|
|
113
|
+
"PY": actual_py,
|
|
114
|
+
"DEC": dec_file,
|
|
115
|
+
"COLUMNINTVARSAREBINARY": column_int_vars_binary,
|
|
116
|
+
"DUPLICATES": duplicates,
|
|
117
|
+
"ORIGNAMES": orignames,
|
|
118
|
+
"STAGESHIFT": stageshift,
|
|
119
|
+
"CONVERTSENSE": convertsense,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
for key, value in params.items():
|
|
123
|
+
if value is not None:
|
|
124
|
+
cmd.append(f"{key}={value}")
|
|
125
|
+
|
|
126
|
+
print(f"Running command: {' '.join(cmd)}")
|
|
127
|
+
result = subprocess.run(cmd, text=True)
|
|
128
|
+
raise typer.Exit(code=result.returncode)
|
gamspy/_container.py
CHANGED
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import atexit
|
|
4
4
|
import os
|
|
5
5
|
import platform
|
|
6
|
+
import re
|
|
6
7
|
import shutil
|
|
7
8
|
import signal
|
|
8
9
|
import sys
|
|
@@ -42,6 +43,7 @@ if TYPE_CHECKING:
|
|
|
42
43
|
Model,
|
|
43
44
|
Parameter,
|
|
44
45
|
Set,
|
|
46
|
+
UniverseAlias,
|
|
45
47
|
Variable,
|
|
46
48
|
)
|
|
47
49
|
from gamspy._algebra.expression import Expression
|
|
@@ -139,6 +141,7 @@ class Container(gt.Container):
|
|
|
139
141
|
self.output = output
|
|
140
142
|
self._gams_string = ""
|
|
141
143
|
self.models: dict[str, Model] = {}
|
|
144
|
+
self._mpsge_models: list[str] = []
|
|
142
145
|
if IS_MIRO_INIT:
|
|
143
146
|
atexit.register(self._write_miro_files)
|
|
144
147
|
|
|
@@ -838,6 +841,14 @@ class Container(gt.Container):
|
|
|
838
841
|
|
|
839
842
|
for _, symbol in self:
|
|
840
843
|
symbol.modified = False
|
|
844
|
+
|
|
845
|
+
# Unfortunately MPSGE requires a dirty trick
|
|
846
|
+
pattern = re.compile(r"^\$sysInclude\s+mpsgeset\s+(\w+)\s*$", re.MULTILINE)
|
|
847
|
+
match = pattern.search(gams_code)
|
|
848
|
+
if match:
|
|
849
|
+
model_name = match.group(1)
|
|
850
|
+
self._mpsge_models.append(model_name.lower())
|
|
851
|
+
|
|
841
852
|
self._unsaved_statements = []
|
|
842
853
|
|
|
843
854
|
def close(self) -> None:
|
|
@@ -888,6 +899,37 @@ class Container(gt.Container):
|
|
|
888
899
|
|
|
889
900
|
return gp.Alias(self, name, alias_with)
|
|
890
901
|
|
|
902
|
+
def addUniverseAlias(self, name: str | None = None) -> UniverseAlias:
|
|
903
|
+
"""
|
|
904
|
+
Creates a new UniverseAlias and adds it to the container
|
|
905
|
+
|
|
906
|
+
Parameters
|
|
907
|
+
----------
|
|
908
|
+
name : str, optional
|
|
909
|
+
Name of the universe alias.
|
|
910
|
+
|
|
911
|
+
Returns
|
|
912
|
+
-------
|
|
913
|
+
UniverseAlias
|
|
914
|
+
|
|
915
|
+
Raises
|
|
916
|
+
------
|
|
917
|
+
ValueError
|
|
918
|
+
If there is symbol with same name but different type in the
|
|
919
|
+
Container
|
|
920
|
+
|
|
921
|
+
Examples
|
|
922
|
+
--------
|
|
923
|
+
>>> import gamspy as gp
|
|
924
|
+
>>> m = gp.Container()
|
|
925
|
+
>>> a = m.addUniverseAlias("a")
|
|
926
|
+
|
|
927
|
+
"""
|
|
928
|
+
if name is None:
|
|
929
|
+
name = self._get_symbol_name(prefix="u")
|
|
930
|
+
|
|
931
|
+
return gp.UniverseAlias(self, name)
|
|
932
|
+
|
|
891
933
|
def addSet(
|
|
892
934
|
self,
|
|
893
935
|
name: str | None = None,
|
gamspy/_convert.py
CHANGED
|
@@ -585,20 +585,26 @@ class LatexConverter:
|
|
|
585
585
|
self.latex_str = latex_str
|
|
586
586
|
|
|
587
587
|
def to_pdf(self) -> None:
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
588
|
+
try:
|
|
589
|
+
subprocess.run(["xelatex", "-version"], check=True, text=True)
|
|
590
|
+
except subprocess.CalledProcessError as e:
|
|
591
591
|
raise ValidationError(
|
|
592
|
-
"`
|
|
592
|
+
"`xelatex` is required to generate the pdf! Please install `xelatex` and add it to the path."
|
|
593
|
+
) from e
|
|
594
|
+
|
|
595
|
+
try:
|
|
596
|
+
subprocess.run(
|
|
597
|
+
[
|
|
598
|
+
"xelatex",
|
|
599
|
+
"-verbose",
|
|
600
|
+
f"-output-directory={self.path}",
|
|
601
|
+
self.tex_path,
|
|
602
|
+
],
|
|
603
|
+
check=True,
|
|
604
|
+
text=True,
|
|
593
605
|
)
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
["pdflatex", f"-output-directory={self.path}", self.tex_path],
|
|
597
|
-
capture_output=True,
|
|
598
|
-
text=True,
|
|
599
|
-
)
|
|
600
|
-
if process.returncode:
|
|
601
|
-
raise LatexException(f"Could not generate pdf file: {process.stderr}")
|
|
606
|
+
except subprocess.CalledProcessError as e:
|
|
607
|
+
raise LatexException(f"Could not generate pdf file: {e}") from e
|
|
602
608
|
|
|
603
609
|
def get_table(self, symbol_type) -> str:
|
|
604
610
|
table = [TABLE_HEADER]
|
|
@@ -629,10 +635,10 @@ class LatexConverter:
|
|
|
629
635
|
continue
|
|
630
636
|
|
|
631
637
|
domain_str = ",".join([elem.latexRepr() for elem in equation.domain])
|
|
632
|
-
header = "\\subsubsection*{
|
|
638
|
+
header = "\\subsubsection*{" + equation._latex_name
|
|
633
639
|
if domain_str:
|
|
634
|
-
header += f"_{{{domain_str}}}"
|
|
635
|
-
header += "
|
|
640
|
+
header += f"$_{{{domain_str}}}$"
|
|
641
|
+
header += "}\n"
|
|
636
642
|
|
|
637
643
|
footer = "\n\\vspace{5pt}\n\\hrule"
|
|
638
644
|
latex_repr = f"{header}{equation.latexRepr()}{footer}"
|
|
@@ -641,13 +647,13 @@ class LatexConverter:
|
|
|
641
647
|
return "\n".join(definitions)
|
|
642
648
|
|
|
643
649
|
def get_constraints(self) -> str:
|
|
644
|
-
constraints = ["
|
|
650
|
+
constraints = [r"\begin{flalign*}"]
|
|
645
651
|
for name in self.symbols:
|
|
646
652
|
symbol = self.container[name]
|
|
647
653
|
if not isinstance(symbol, syms.Variable):
|
|
648
654
|
continue
|
|
649
655
|
|
|
650
|
-
constraint = "
|
|
656
|
+
constraint = "&" + symbol.latexRepr()
|
|
651
657
|
if symbol.type == "binary":
|
|
652
658
|
constraint += "\\in " + r"\{0,1\}"
|
|
653
659
|
if symbol.domain:
|
|
@@ -687,9 +693,10 @@ class LatexConverter:
|
|
|
687
693
|
else:
|
|
688
694
|
continue
|
|
689
695
|
|
|
690
|
-
constraint += "
|
|
696
|
+
constraint += "&\\\\"
|
|
691
697
|
constraints.append(constraint)
|
|
692
698
|
|
|
699
|
+
constraints.append(r"\end{flalign*}")
|
|
693
700
|
return "\n".join(constraints)
|
|
694
701
|
|
|
695
702
|
def get_header(self) -> str:
|
gamspy/_model.py
CHANGED
|
@@ -114,9 +114,6 @@ class Problem(Enum):
|
|
|
114
114
|
EMP = "EMP"
|
|
115
115
|
"""Extended Mathematical Program"""
|
|
116
116
|
|
|
117
|
-
MPSGE = "MPSGE"
|
|
118
|
-
"""General Equilibrium"""
|
|
119
|
-
|
|
120
117
|
@classmethod
|
|
121
118
|
def values(cls):
|
|
122
119
|
"""Convenience function to return all values of enum"""
|
|
@@ -371,7 +368,7 @@ class Model:
|
|
|
371
368
|
equations : Sequence[Equation]
|
|
372
369
|
Sequence of Equation objects.
|
|
373
370
|
problem : Problem | str, optional
|
|
374
|
-
'LP', 'NLP', 'QCP', 'DNLP', 'MIP', 'RMIP', 'MINLP', 'RMINLP', 'MIQCP', 'RMIQCP', 'MCP', 'CNS', 'MPEC', 'RMPEC', 'EMP',
|
|
371
|
+
'LP', 'NLP', 'QCP', 'DNLP', 'MIP', 'RMIP', 'MINLP', 'RMINLP', 'MIQCP', 'RMIQCP', 'MCP', 'CNS', 'MPEC', 'RMPEC', 'EMP',
|
|
375
372
|
by default Problem.LP.
|
|
376
373
|
sense : Sense | str, optional
|
|
377
374
|
"MIN", "MAX", or "FEASIBILITY". By default, Sense.FEASIBILITY
|
|
@@ -415,6 +412,7 @@ class Model:
|
|
|
415
412
|
limited_variables: Sequence[ImplicitVariable] | None = None,
|
|
416
413
|
external_module: str | None = None,
|
|
417
414
|
):
|
|
415
|
+
self._is_mpsge = False
|
|
418
416
|
self._auto_id = "m" + utils._get_unique_name()
|
|
419
417
|
if equations is None:
|
|
420
418
|
equations = []
|
gamspy/_symbols/equation.py
CHANGED
|
@@ -534,7 +534,7 @@ class Equation(gt.Equation, Symbol):
|
|
|
534
534
|
eq_type in rhs_repr for eq_type in EQ_TYPES
|
|
535
535
|
):
|
|
536
536
|
# x - c -> x - c == 0
|
|
537
|
-
rhs = rhs == 0
|
|
537
|
+
rhs = rhs == gp.Number(0)
|
|
538
538
|
|
|
539
539
|
rhs_repr = rhs.gamsRepr()
|
|
540
540
|
if not any(eq_type in rhs_repr for eq_type in EQ_TYPES):
|
|
@@ -96,7 +96,11 @@ class UniverseAlias(gt.UniverseAlias):
|
|
|
96
96
|
|
|
97
97
|
def __init__(self, container: Container | None = None, name: str = "universe"):
|
|
98
98
|
# check if the name is a reserved word
|
|
99
|
-
name
|
|
99
|
+
if name is not None:
|
|
100
|
+
name = validation.validate_name(name)
|
|
101
|
+
else:
|
|
102
|
+
name = container._get_symbol_name(prefix="u")
|
|
103
|
+
|
|
100
104
|
if container is None:
|
|
101
105
|
try:
|
|
102
106
|
container = gp._ctx_managers[(os.getpid(), threading.get_native_id())]
|
gamspy/_validation.py
CHANGED
|
@@ -584,9 +584,18 @@ def validate_equations(model: Model) -> None:
|
|
|
584
584
|
if not get_option("VALIDATION"):
|
|
585
585
|
return
|
|
586
586
|
|
|
587
|
+
# We don't have the definitions of equations as an expression tree if the container
|
|
588
|
+
# is restarted. We have it instead as a string. Hence, do not try to do validation.
|
|
587
589
|
if model.container._is_restarted:
|
|
588
590
|
return
|
|
589
591
|
|
|
592
|
+
# We don't have the definition of MPSGE equations since they are autogenerated on the GAMS side.
|
|
593
|
+
if (
|
|
594
|
+
model.problem == Problem.MCP
|
|
595
|
+
and model.name.lower() in model.container._mpsge_models
|
|
596
|
+
):
|
|
597
|
+
return
|
|
598
|
+
|
|
590
599
|
allow_ambiguous_equations = get_option("ALLOW_AMBIGUOUS_EQUATIONS").lower()
|
|
591
600
|
|
|
592
601
|
for equation in model.equations:
|
gamspy/utils.py
CHANGED
|
@@ -2,21 +2,21 @@ gamspy/__init__.py,sha256=HZulKBgt2ubfX6r6v6Xv3MJVI6Prm40j5W45aUetQok,1797
|
|
|
2
2
|
gamspy/__main__.py,sha256=3HW3NYEe4pZnGhJ10s1G0vaZAkI9Zl_lXqHT9iDNXQg,108
|
|
3
3
|
gamspy/_communication.py,sha256=18drDsKxi1Iv6oAKZfKGJcPYYWebBQsyeOxiEKXZngE,7148
|
|
4
4
|
gamspy/_config.py,sha256=n7RXUFczIlol15-mxhnj54fHXHet8HcOnWiGm3mpMgg,3589
|
|
5
|
-
gamspy/_container.py,sha256=
|
|
6
|
-
gamspy/_convert.py,sha256=
|
|
5
|
+
gamspy/_container.py,sha256=r4-uGBy2yxBl7yPaxAPdgmJ-bkb7moeXJtx8xupY9DE,46966
|
|
6
|
+
gamspy/_convert.py,sha256=3_agmO6QPXqy-wyiEncdMk9B2KuqK73G2d5T9SB3phM,23456
|
|
7
7
|
gamspy/_database.py,sha256=SVo4lEfS0Q2f80uMu7k71BBQNRwUei-2KFc_EGxsOcw,6873
|
|
8
8
|
gamspy/_extrinsic.py,sha256=OGrlNzcSQjoIZw8lpsk_4SObEAhGX5bkc_D0d3lPZMQ,4807
|
|
9
9
|
gamspy/_miro.py,sha256=MeFGcaFtNgtydWjH0KS0l9y3mNy7tPyXwm43jwomodg,12245
|
|
10
|
-
gamspy/_model.py,sha256=
|
|
10
|
+
gamspy/_model.py,sha256=CPupNZ8Hpkco9DgC_0cuPSRI1qnccQtOlx57sCQ8iZE,52828
|
|
11
11
|
gamspy/_model_instance.py,sha256=ZHG3-inc6vDx7F2Oo9HYWYAi8hki6upIgAQn5II_o1U,24384
|
|
12
12
|
gamspy/_options.py,sha256=FTty65WRdikvnhPyWSTuwuUz0Rs6aZwDFWL-UsfEgd0,27211
|
|
13
13
|
gamspy/_serialization.py,sha256=fwAQpABCZQyxtAkddsvCDjtyQyPUT3EJy19r9BKR6aY,4062
|
|
14
14
|
gamspy/_types.py,sha256=_KQjRntvIAicc9_sZ5BYWAHjs-WBURf2NJwTpJQT5xw,162
|
|
15
|
-
gamspy/_validation.py,sha256=
|
|
15
|
+
gamspy/_validation.py,sha256=uaLzEeXE2h-1_9-x_Gv28qio08vk1q52vgtr-lahq3E,22029
|
|
16
16
|
gamspy/_workspace.py,sha256=QrnC8aPN5C9zyqbaYvfuPlRHvBrDx_i4Imw1AzsJs7k,2175
|
|
17
17
|
gamspy/exceptions.py,sha256=q-Cb6syXv1abf2JBfNFidGkvOWkp9FXU5NzJwkR5W7o,2929
|
|
18
18
|
gamspy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
|
-
gamspy/utils.py,sha256=
|
|
19
|
+
gamspy/utils.py,sha256=nDmyhkCv5yk40jf3OL-HtW-wWTWh20UDC3bO4D5Vc4k,20114
|
|
20
20
|
gamspy/version.py,sha256=GsqTw9rQ4Zz80ZSlIo44vYqgcVBJSbGOqJFJW3j_z88,109
|
|
21
21
|
gamspy/_algebra/__init__.py,sha256=HdTHRBzfOGXihibQOAOAHGHKinlMuHVnpuP4pJWSQCc,479
|
|
22
22
|
gamspy/_algebra/condition.py,sha256=mVJeCk65dvLgYalTQHfZt0bEFFf9yoTWLXjhODf7gvg,6229
|
|
@@ -31,10 +31,11 @@ gamspy/_backend/engine.py,sha256=N3BIb4CDmH76CQIj87JSJBNnMLln3jsUuLy9_O5sEJ0,318
|
|
|
31
31
|
gamspy/_backend/local.py,sha256=-LE7obmZT3zdB-0LJHJ9xfulMBw5vvzFIS9WJ7ISE-4,3804
|
|
32
32
|
gamspy/_backend/neos.py,sha256=I21TOqPZC5cBp_rQpz5S9cmLPRJcizIT0KuncwMcUrw,17762
|
|
33
33
|
gamspy/_cli/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
|
|
34
|
-
gamspy/_cli/cli.py,sha256=
|
|
34
|
+
gamspy/_cli/cli.py,sha256=SUnkhiReUirVZBJoGxSZ_mvENzHqhSKmS0gr3sEsacs,1634
|
|
35
35
|
gamspy/_cli/gdx.py,sha256=YRu1delsmDh-dpzEr8n1kTK0JFdXlNqz4YuUQzK1mvo,12024
|
|
36
36
|
gamspy/_cli/install.py,sha256=Kr09kp146LujiO64GpoJxMPRZmY9GnhxuhWm-ZU2l4w,13257
|
|
37
37
|
gamspy/_cli/list.py,sha256=fMmaIZcZf-Tf_-J37tJ4zrk2bcVO9cPSfs08mQyGWiY,2907
|
|
38
|
+
gamspy/_cli/mps2gms.py,sha256=4zmM5gS_YlgkzBcgHDzjM6F_r2vKJTi0P_ZYgZxjoEw,4192
|
|
38
39
|
gamspy/_cli/probe.py,sha256=K7fYwfdk-2mGGQKAxXFvkWMRJ1qYTUpX2tvklU56JZU,1122
|
|
39
40
|
gamspy/_cli/retrieve.py,sha256=bnTcIbHJfkq-dvrFitdkxsjQNZz-Cx4-LiaRfhe0cYM,2446
|
|
40
41
|
gamspy/_cli/run.py,sha256=oaWT4alxSXqPDF2mRYmfy5aOWCKoEExUfqYoAT_zSUM,4387
|
|
@@ -43,11 +44,11 @@ gamspy/_cli/uninstall.py,sha256=_g3SbT6G7DZcYgtmHLhaGl1B9jY1K3D0sStifxIyqxQ,5183
|
|
|
43
44
|
gamspy/_cli/util.py,sha256=ey3Wn7tCEggkr-sjcLqrVBda-jdadjWOn-APhSe4toE,2849
|
|
44
45
|
gamspy/_symbols/__init__.py,sha256=p0Zd7XytuOe8kRclN1lFrRFaN_btFSSGdIBSXrlp03E,450
|
|
45
46
|
gamspy/_symbols/alias.py,sha256=BidmqvYxqMXLxU9tSJHJ484P1R-7pq9J-cP0ITNmkVc,8907
|
|
46
|
-
gamspy/_symbols/equation.py,sha256=
|
|
47
|
+
gamspy/_symbols/equation.py,sha256=qQi24g9GD3qpMOMl2R-bQJbVYWHIy3bbsoHt6ZgD2oQ,40136
|
|
47
48
|
gamspy/_symbols/parameter.py,sha256=nZVE_AEbY2vyQ6OedrH8TC6ffPtSZk75MRstV-zY1z8,19833
|
|
48
49
|
gamspy/_symbols/set.py,sha256=aUw8AO72sEmZlH-BpGBlMXMvJHLc-Skx0cpPvPJxOag,29242
|
|
49
50
|
gamspy/_symbols/symbol.py,sha256=azKG8vJzrBrjGXCcKe865I5rEEbT1ZqQ02khQXPtiGs,10888
|
|
50
|
-
gamspy/_symbols/universe_alias.py,sha256=
|
|
51
|
+
gamspy/_symbols/universe_alias.py,sha256=3JBG710YIJi6jmNp9tKKqW6IoiXsUaSUf8flj9woFiU,4672
|
|
51
52
|
gamspy/_symbols/variable.py,sha256=T6cMVz2pYgJIIY8_HxUkH7PgcDJhC-pMCcRPWplYe2s,30636
|
|
52
53
|
gamspy/_symbols/implicits/__init__.py,sha256=bvYl_lYtnTztfNUTMxqteIztotwh1T2CUQpidQITSMQ,391
|
|
53
54
|
gamspy/_symbols/implicits/implicit_equation.py,sha256=V28B9kJBpeCYekFPEvHKFwxNxkX3VEPSoMcXP6fEvzo,5070
|
|
@@ -81,9 +82,9 @@ gamspy/math/matrix.py,sha256=PmYsMhF8Pq3bcgtyINryq4xV36i4KW0BtcFApOvt8GQ,16365
|
|
|
81
82
|
gamspy/math/misc.py,sha256=qrduVOZ7CmD9wjUJx86t2J_2XMQzTz2vhd40sFwuRUk,37727
|
|
82
83
|
gamspy/math/probability.py,sha256=gAVU_PTfbjXuN6i8XNjZpIYvFg8dPk1imZCbKQloSG0,4290
|
|
83
84
|
gamspy/math/trigonometric.py,sha256=VBWQcP3ggl1oGDEzRs2M_T88HPJn9N0QfMJZwEUkx4w,4276
|
|
84
|
-
gamspy-1.18.
|
|
85
|
-
gamspy-1.18.
|
|
86
|
-
gamspy-1.18.
|
|
87
|
-
gamspy-1.18.
|
|
88
|
-
gamspy-1.18.
|
|
89
|
-
gamspy-1.18.
|
|
85
|
+
gamspy-1.18.3.dist-info/licenses/LICENSE,sha256=D4HfHbHRs3LVWo3uXq44WQc1FkBP5srUCEa-vO0W9tE,1189
|
|
86
|
+
gamspy-1.18.3.dist-info/METADATA,sha256=-2s1hRKHXEJuOl3HvHz3ggCLxXcEfXjzD10KOBDb9us,5301
|
|
87
|
+
gamspy-1.18.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
88
|
+
gamspy-1.18.3.dist-info/entry_points.txt,sha256=tzgC7L0Y_BiyagBCaYOPK7lE4olRJKM_PH2inmMvj60,48
|
|
89
|
+
gamspy-1.18.3.dist-info/top_level.txt,sha256=fsq4q5lfdb2GEZC9O3PUih38s7TfIgolIaO5NgR3Hf8,7
|
|
90
|
+
gamspy-1.18.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|