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 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
- process = subprocess.run(["pdflatex", "-v"], capture_output=True)
589
- if process.returncode:
590
- print(process.stderr)
588
+ try:
589
+ subprocess.run(["xelatex", "-version"], check=True, text=True)
590
+ except subprocess.CalledProcessError as e:
591
591
  raise ValidationError(
592
- "`pdflatex` is required to generate the pdf! Please install `pdflatex` and add it to the path."
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
- process = subprocess.run(
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*{$" + equation._latex_name
638
+ header = "\\subsubsection*{" + equation._latex_name
633
639
  if domain_str:
634
- header += f"_{{{domain_str}}}"
635
- header += "$}\n"
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 = ["\\bigskip"]
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 = "$" + symbol.latexRepr()
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', or 'MPSGE',
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 = []
@@ -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 = validation.validate_name(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
@@ -137,6 +137,7 @@ def getSolverCapabilities(system_directory: str) -> dict[str, list[str]]:
137
137
 
138
138
  capabilities[solver] = problem_types
139
139
 
140
+ capabilities.pop("MPSGE", None)
140
141
  _capabilities[system_directory] = capabilities
141
142
  return capabilities
142
143
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gamspy
3
- Version: 1.18.2
3
+ Version: 1.18.3
4
4
  Summary: Python-based algebraic modeling interface to GAMS
5
5
  Author-email: GAMS Development Corporation <support@gams.com>
6
6
  Project-URL: homepage, https://gams.com/sales/gamspy_facts/
@@ -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=meoK0UFi-8oZOn9A1l5rKrZWUUIGREaBM04aWvg6el8,45860
6
- gamspy/_convert.py,sha256=g8rtrSwKkETWYvtp1loxsJ2uuIPrS1L6VP1EMypJghY,23259
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=fcHa3W8ioTUBI6qOQsPk-HRU9i9PEKhrI-grlK4Uvzc,52860
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=Wa5Rv0-QY-ij1RiNIOtuIplWXCtHjQDNvSVqNdu0V10,21619
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=Am8Zr40GtLwIp1waRps3HElpzLwPzKBWVZi05PAacEY,20078
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=a4AtD-VI5jk0ZcO0JAwD0f0KJRwmxA8MzR_2MmhPWpg,1580
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=6Zf0VJNTVNSAJEitIgd-5NbuycY0akMgXmLEYHnmzcU,40125
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=xs4UIvhNPOyYz2VyKcfZRCZaDLxp2fBVWzGdBFPBaJg,4566
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.2.dist-info/licenses/LICENSE,sha256=D4HfHbHRs3LVWo3uXq44WQc1FkBP5srUCEa-vO0W9tE,1189
85
- gamspy-1.18.2.dist-info/METADATA,sha256=DR4AHXYISLO7i3CJUNIhjnUpkaEYk2qfCkwsM3HluUE,5301
86
- gamspy-1.18.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
87
- gamspy-1.18.2.dist-info/entry_points.txt,sha256=tzgC7L0Y_BiyagBCaYOPK7lE4olRJKM_PH2inmMvj60,48
88
- gamspy-1.18.2.dist-info/top_level.txt,sha256=fsq4q5lfdb2GEZC9O3PUih38s7TfIgolIaO5NgR3Hf8,7
89
- gamspy-1.18.2.dist-info/RECORD,,
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,,