gamsapi 52.5.0__cp312-cp312-win_amd64.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.
Files changed (257) hide show
  1. gams/__init__.py +27 -0
  2. gams/_version.py +1 -0
  3. gams/connect/__init__.py +28 -0
  4. gams/connect/agents/__init__.py +24 -0
  5. gams/connect/agents/_excel/__init__.py +32 -0
  6. gams/connect/agents/_excel/excelagent.py +312 -0
  7. gams/connect/agents/_excel/workbook.py +155 -0
  8. gams/connect/agents/_sqlconnectors/__init__.py +42 -0
  9. gams/connect/agents/_sqlconnectors/_accesshandler.py +211 -0
  10. gams/connect/agents/_sqlconnectors/_databasehandler.py +250 -0
  11. gams/connect/agents/_sqlconnectors/_mysqlhandler.py +168 -0
  12. gams/connect/agents/_sqlconnectors/_postgreshandler.py +131 -0
  13. gams/connect/agents/_sqlconnectors/_pyodbchandler.py +112 -0
  14. gams/connect/agents/_sqlconnectors/_sqlalchemyhandler.py +74 -0
  15. gams/connect/agents/_sqlconnectors/_sqlitehandler.py +262 -0
  16. gams/connect/agents/_sqlconnectors/_sqlserverhandler.py +179 -0
  17. gams/connect/agents/concatenate.py +440 -0
  18. gams/connect/agents/connectagent.py +743 -0
  19. gams/connect/agents/csvreader.py +675 -0
  20. gams/connect/agents/csvwriter.py +151 -0
  21. gams/connect/agents/domainwriter.py +143 -0
  22. gams/connect/agents/excelreader.py +756 -0
  23. gams/connect/agents/excelwriter.py +467 -0
  24. gams/connect/agents/filter.py +223 -0
  25. gams/connect/agents/gamsreader.py +112 -0
  26. gams/connect/agents/gamswriter.py +239 -0
  27. gams/connect/agents/gdxreader.py +109 -0
  28. gams/connect/agents/gdxwriter.py +146 -0
  29. gams/connect/agents/labelmanipulator.py +303 -0
  30. gams/connect/agents/projection.py +539 -0
  31. gams/connect/agents/pythoncode.py +71 -0
  32. gams/connect/agents/rawcsvreader.py +248 -0
  33. gams/connect/agents/rawexcelreader.py +312 -0
  34. gams/connect/agents/schema/CSVReader.yaml +92 -0
  35. gams/connect/agents/schema/CSVWriter.yaml +44 -0
  36. gams/connect/agents/schema/Concatenate.yaml +52 -0
  37. gams/connect/agents/schema/DomainWriter.yaml +25 -0
  38. gams/connect/agents/schema/ExcelReader.yaml +121 -0
  39. gams/connect/agents/schema/ExcelWriter.yaml +78 -0
  40. gams/connect/agents/schema/Filter.yaml +74 -0
  41. gams/connect/agents/schema/GAMSReader.yaml +20 -0
  42. gams/connect/agents/schema/GAMSWriter.yaml +47 -0
  43. gams/connect/agents/schema/GDXReader.yaml +23 -0
  44. gams/connect/agents/schema/GDXWriter.yaml +32 -0
  45. gams/connect/agents/schema/LabelManipulator.yaml +99 -0
  46. gams/connect/agents/schema/Projection.yaml +24 -0
  47. gams/connect/agents/schema/PythonCode.yaml +6 -0
  48. gams/connect/agents/schema/RawCSVReader.yaml +34 -0
  49. gams/connect/agents/schema/RawExcelReader.yaml +42 -0
  50. gams/connect/agents/schema/SQLReader.yaml +75 -0
  51. gams/connect/agents/schema/SQLWriter.yaml +103 -0
  52. gams/connect/agents/sqlreader.py +301 -0
  53. gams/connect/agents/sqlwriter.py +276 -0
  54. gams/connect/connectdatabase.py +275 -0
  55. gams/connect/connectvalidator.py +93 -0
  56. gams/connect/errors.py +34 -0
  57. gams/control/__init__.py +136 -0
  58. gams/control/database.py +2231 -0
  59. gams/control/execution.py +1900 -0
  60. gams/control/options.py +2792 -0
  61. gams/control/workspace.py +1198 -0
  62. gams/core/__init__.py +24 -0
  63. gams/core/cfg/__init__.py +26 -0
  64. gams/core/cfg/_cfgmcc.cp312-win_amd64.pyd +0 -0
  65. gams/core/cfg/cfgmcc.py +519 -0
  66. gams/core/dct/__init__.py +26 -0
  67. gams/core/dct/_dctmcc.cp312-win_amd64.pyd +0 -0
  68. gams/core/dct/dctmcc.py +574 -0
  69. gams/core/embedded/__init__.py +26 -0
  70. gams/core/embedded/gamsemb.py +1024 -0
  71. gams/core/emp/__init__.py +24 -0
  72. gams/core/emp/emplexer.py +89 -0
  73. gams/core/emp/empyacc.py +281 -0
  74. gams/core/gdx/__init__.py +26 -0
  75. gams/core/gdx/_gdxcc.cp312-win_amd64.pyd +0 -0
  76. gams/core/gdx/gdxcc.py +866 -0
  77. gams/core/gev/__init__.py +26 -0
  78. gams/core/gev/_gevmcc.cp312-win_amd64.pyd +0 -0
  79. gams/core/gev/gevmcc.py +855 -0
  80. gams/core/gmd/__init__.py +26 -0
  81. gams/core/gmd/_gmdcc.cp312-win_amd64.pyd +0 -0
  82. gams/core/gmd/gmdcc.py +917 -0
  83. gams/core/gmo/__init__.py +26 -0
  84. gams/core/gmo/_gmomcc.cp312-win_amd64.pyd +0 -0
  85. gams/core/gmo/gmomcc.py +2046 -0
  86. gams/core/idx/__init__.py +26 -0
  87. gams/core/idx/_idxcc.cp312-win_amd64.pyd +0 -0
  88. gams/core/idx/idxcc.py +510 -0
  89. gams/core/numpy/__init__.py +29 -0
  90. gams/core/numpy/_gams2numpy.cp312-win_amd64.pyd +0 -0
  91. gams/core/numpy/gams2numpy.py +1048 -0
  92. gams/core/opt/__init__.py +26 -0
  93. gams/core/opt/_optcc.cp312-win_amd64.pyd +0 -0
  94. gams/core/opt/optcc.py +840 -0
  95. gams/engine/__init__.py +204 -0
  96. gams/engine/api/__init__.py +13 -0
  97. gams/engine/api/auth_api.py +7653 -0
  98. gams/engine/api/cleanup_api.py +751 -0
  99. gams/engine/api/default_api.py +887 -0
  100. gams/engine/api/hypercube_api.py +2629 -0
  101. gams/engine/api/jobs_api.py +5229 -0
  102. gams/engine/api/licenses_api.py +2220 -0
  103. gams/engine/api/namespaces_api.py +7783 -0
  104. gams/engine/api/usage_api.py +5627 -0
  105. gams/engine/api/users_api.py +5931 -0
  106. gams/engine/api_client.py +804 -0
  107. gams/engine/api_response.py +21 -0
  108. gams/engine/configuration.py +601 -0
  109. gams/engine/exceptions.py +216 -0
  110. gams/engine/models/__init__.py +86 -0
  111. gams/engine/models/bad_input.py +89 -0
  112. gams/engine/models/cleanable_job_result.py +104 -0
  113. gams/engine/models/cleanable_job_result_page.py +113 -0
  114. gams/engine/models/engine_license.py +107 -0
  115. gams/engine/models/files_not_found.py +93 -0
  116. gams/engine/models/forwarded_token_response.py +112 -0
  117. gams/engine/models/generic_key_value_pair.py +89 -0
  118. gams/engine/models/hypercube.py +160 -0
  119. gams/engine/models/hypercube_page.py +111 -0
  120. gams/engine/models/hypercube_summary.py +91 -0
  121. gams/engine/models/hypercube_token.py +97 -0
  122. gams/engine/models/identity_provider.py +107 -0
  123. gams/engine/models/identity_provider_ldap.py +121 -0
  124. gams/engine/models/identity_provider_oauth2.py +146 -0
  125. gams/engine/models/identity_provider_oauth2_scope.py +89 -0
  126. gams/engine/models/identity_provider_oauth2_with_secret.py +152 -0
  127. gams/engine/models/identity_provider_oidc.py +133 -0
  128. gams/engine/models/identity_provider_oidc_with_secret.py +143 -0
  129. gams/engine/models/inex.py +91 -0
  130. gams/engine/models/invitation.py +136 -0
  131. gams/engine/models/invitation_quota.py +106 -0
  132. gams/engine/models/invitation_token.py +87 -0
  133. gams/engine/models/job.py +165 -0
  134. gams/engine/models/job_no_text_entry.py +138 -0
  135. gams/engine/models/job_no_text_entry_page.py +111 -0
  136. gams/engine/models/license.py +91 -0
  137. gams/engine/models/log_piece.py +96 -0
  138. gams/engine/models/message.py +87 -0
  139. gams/engine/models/message_and_token.py +99 -0
  140. gams/engine/models/message_with_webhook_id.py +89 -0
  141. gams/engine/models/model_auth_token.py +87 -0
  142. gams/engine/models/model_configuration.py +125 -0
  143. gams/engine/models/model_default_instance.py +99 -0
  144. gams/engine/models/model_default_user_instance.py +98 -0
  145. gams/engine/models/model_hypercube_job.py +106 -0
  146. gams/engine/models/model_hypercube_usage.py +130 -0
  147. gams/engine/models/model_instance_info.py +116 -0
  148. gams/engine/models/model_instance_info_full.py +123 -0
  149. gams/engine/models/model_instance_pool_info.py +112 -0
  150. gams/engine/models/model_job_labels.py +179 -0
  151. gams/engine/models/model_job_usage.py +133 -0
  152. gams/engine/models/model_pool_usage.py +124 -0
  153. gams/engine/models/model_usage.py +115 -0
  154. gams/engine/models/model_user.py +96 -0
  155. gams/engine/models/model_userinstance_info.py +119 -0
  156. gams/engine/models/model_userinstancepool_info.py +95 -0
  157. gams/engine/models/model_version.py +91 -0
  158. gams/engine/models/models.py +120 -0
  159. gams/engine/models/namespace.py +104 -0
  160. gams/engine/models/namespace_quota.py +96 -0
  161. gams/engine/models/namespace_with_permission.py +96 -0
  162. gams/engine/models/not_found.py +91 -0
  163. gams/engine/models/password_policy.py +97 -0
  164. gams/engine/models/perm_and_username.py +89 -0
  165. gams/engine/models/quota.py +117 -0
  166. gams/engine/models/quota_exceeded.py +97 -0
  167. gams/engine/models/status_code_meaning.py +89 -0
  168. gams/engine/models/stream_entry.py +89 -0
  169. gams/engine/models/system_wide_license.py +92 -0
  170. gams/engine/models/text_entries.py +87 -0
  171. gams/engine/models/text_entry.py +101 -0
  172. gams/engine/models/time_span.py +95 -0
  173. gams/engine/models/time_span_pool_worker.py +99 -0
  174. gams/engine/models/token_forward_error.py +87 -0
  175. gams/engine/models/user.py +127 -0
  176. gams/engine/models/user_group_member.py +96 -0
  177. gams/engine/models/user_groups.py +108 -0
  178. gams/engine/models/vapid_info.py +87 -0
  179. gams/engine/models/webhook.py +138 -0
  180. gams/engine/models/webhook_parameterized_event.py +99 -0
  181. gams/engine/py.typed +0 -0
  182. gams/engine/rest.py +258 -0
  183. gams/magic/__init__.py +32 -0
  184. gams/magic/gams_magic.py +142 -0
  185. gams/magic/interactive.py +402 -0
  186. gams/tools/__init__.py +30 -0
  187. gams/tools/errors.py +34 -0
  188. gams/tools/toolcollection/__init__.py +24 -0
  189. gams/tools/toolcollection/alg/__init__.py +24 -0
  190. gams/tools/toolcollection/alg/rank.py +51 -0
  191. gams/tools/toolcollection/data/__init__.py +24 -0
  192. gams/tools/toolcollection/data/csvread.py +444 -0
  193. gams/tools/toolcollection/data/csvwrite.py +311 -0
  194. gams/tools/toolcollection/data/exceldump.py +47 -0
  195. gams/tools/toolcollection/data/sqlitewrite.py +276 -0
  196. gams/tools/toolcollection/gdxservice/__init__.py +24 -0
  197. gams/tools/toolcollection/gdxservice/gdxencoding.py +104 -0
  198. gams/tools/toolcollection/gdxservice/gdxrename.py +94 -0
  199. gams/tools/toolcollection/linalg/__init__.py +24 -0
  200. gams/tools/toolcollection/linalg/cholesky.py +57 -0
  201. gams/tools/toolcollection/linalg/eigenvalue.py +56 -0
  202. gams/tools/toolcollection/linalg/eigenvector.py +58 -0
  203. gams/tools/toolcollection/linalg/invert.py +55 -0
  204. gams/tools/toolcollection/linalg/ols.py +138 -0
  205. gams/tools/toolcollection/tooltemplate.py +321 -0
  206. gams/tools/toolcollection/win32/__init__.py +24 -0
  207. gams/tools/toolcollection/win32/excelmerge.py +93 -0
  208. gams/tools/toolcollection/win32/exceltalk.py +76 -0
  209. gams/tools/toolcollection/win32/msappavail.py +49 -0
  210. gams/tools/toolcollection/win32/shellexecute.py +54 -0
  211. gams/tools/tools.py +116 -0
  212. gams/transfer/__init__.py +35 -0
  213. gams/transfer/_abcs/__init__.py +37 -0
  214. gams/transfer/_abcs/container_abcs.py +433 -0
  215. gams/transfer/_internals/__init__.py +63 -0
  216. gams/transfer/_internals/algorithms.py +436 -0
  217. gams/transfer/_internals/casepreservingdict.py +124 -0
  218. gams/transfer/_internals/constants.py +270 -0
  219. gams/transfer/_internals/domainviolation.py +103 -0
  220. gams/transfer/_internals/specialvalues.py +172 -0
  221. gams/transfer/containers/__init__.py +26 -0
  222. gams/transfer/containers/_container.py +1794 -0
  223. gams/transfer/containers/_io/__init__.py +28 -0
  224. gams/transfer/containers/_io/containers.py +164 -0
  225. gams/transfer/containers/_io/gdx.py +1029 -0
  226. gams/transfer/containers/_io/gmd.py +872 -0
  227. gams/transfer/containers/_mixins/__init__.py +26 -0
  228. gams/transfer/containers/_mixins/ccc.py +1274 -0
  229. gams/transfer/syms/__init__.py +33 -0
  230. gams/transfer/syms/_methods/__init__.py +24 -0
  231. gams/transfer/syms/_methods/tables.py +120 -0
  232. gams/transfer/syms/_methods/toDict.py +115 -0
  233. gams/transfer/syms/_methods/toList.py +83 -0
  234. gams/transfer/syms/_methods/toValue.py +60 -0
  235. gams/transfer/syms/_mixins/__init__.py +32 -0
  236. gams/transfer/syms/_mixins/equals.py +626 -0
  237. gams/transfer/syms/_mixins/generateRecords.py +499 -0
  238. gams/transfer/syms/_mixins/pivot.py +313 -0
  239. gams/transfer/syms/_mixins/pve.py +627 -0
  240. gams/transfer/syms/_mixins/sa.py +27 -0
  241. gams/transfer/syms/_mixins/sapve.py +27 -0
  242. gams/transfer/syms/_mixins/saua.py +27 -0
  243. gams/transfer/syms/_mixins/sauapve.py +199 -0
  244. gams/transfer/syms/_mixins/spve.py +1528 -0
  245. gams/transfer/syms/_mixins/ve.py +936 -0
  246. gams/transfer/syms/container_syms/__init__.py +31 -0
  247. gams/transfer/syms/container_syms/_alias.py +984 -0
  248. gams/transfer/syms/container_syms/_equation.py +333 -0
  249. gams/transfer/syms/container_syms/_parameter.py +973 -0
  250. gams/transfer/syms/container_syms/_set.py +604 -0
  251. gams/transfer/syms/container_syms/_universe_alias.py +461 -0
  252. gams/transfer/syms/container_syms/_variable.py +321 -0
  253. gamsapi-52.5.0.dist-info/METADATA +150 -0
  254. gamsapi-52.5.0.dist-info/RECORD +257 -0
  255. gamsapi-52.5.0.dist-info/WHEEL +5 -0
  256. gamsapi-52.5.0.dist-info/licenses/LICENSE +22 -0
  257. gamsapi-52.5.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,461 @@
1
+ #
2
+ # GAMS - General Algebraic Modeling System Python API
3
+ #
4
+ # Copyright (c) 2017-2026 GAMS Development Corp. <support@gams.com>
5
+ # Copyright (c) 2017-2026 GAMS Software GmbH <support@gams.com>
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"), to deal
9
+ # in the Software without restriction, including without limitation the rights
10
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ # copies of the Software, and to permit persons to whom the Software is
12
+ # furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included in all
15
+ # copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ # SOFTWARE.
24
+ #
25
+
26
+ import pandas as pd
27
+ import weakref
28
+ from gams.core import gdx
29
+ from gams.transfer._abcs import ABCUniverseAlias, ABCAlias, AnyContainerSymbol
30
+ from gams.transfer.syms._mixins import SAUAMixin, SAUAPVEMixin
31
+ from typing import Union, List, TYPE_CHECKING
32
+
33
+ if TYPE_CHECKING:
34
+ from gams.transfer import Container, Set, Alias
35
+
36
+
37
+ class UniverseAlias(SAUAMixin, SAUAPVEMixin, ABCUniverseAlias):
38
+ """
39
+ Universe Alias symbol
40
+
41
+ Parameters
42
+ ----------
43
+ container : Container
44
+ name : str
45
+
46
+ Examples
47
+ --------
48
+ >>> import gams.transfer as gt
49
+ >>> m = gt.Container()
50
+ >>> i = gt.Set(m, "i", records=["seattle", "san-diego"])
51
+ >>> j = gt.Set(m, "j", records=["new-york", "chicago", "topeka"])
52
+ >>> ij = gt.UniverseAlias(m, "ij")
53
+ >>> print(ij.toList())
54
+ ['seattle', 'san-diego', 'new-york', 'chicago', 'topeka']
55
+
56
+ Attributes
57
+ ----------
58
+ alias_with : str
59
+ Aliased object
60
+ container : Container object
61
+ Container where the symbol exists
62
+ description : str
63
+ description of symbol
64
+ dimension : int
65
+ The dimension of symbol
66
+ domain : List[str]
67
+ List of domains given as string (* for universe set)
68
+ domain_labels : List[str]
69
+ The column headings for the records DataFrame
70
+ domain_names : List[str]
71
+ String version of domain names
72
+ domain_type : str
73
+ The state of domain links
74
+ is_singleton : bool
75
+ Flag that identifies if the the alias is singleton
76
+ modified : bool
77
+ Flag that identifies if the symbol has been modified
78
+ name : str
79
+ Name of the symbol
80
+ number_records : int
81
+ The number of symbol records
82
+ records : DataFrame
83
+ The main symbol records
84
+ summary : dict
85
+ A dict of only the metadata
86
+ """
87
+
88
+ @classmethod
89
+ def _from_gams(cls, container, name):
90
+ # create new symbol object
91
+ obj = UniverseAlias.__new__(cls)
92
+
93
+ # set private properties directly
94
+ obj._requires_state_check = False
95
+ obj._container = weakref.proxy(container)
96
+ obj._name = name
97
+ obj._modified = True
98
+
99
+ # typing
100
+ obj._gams_type = gdx.GMS_DT_ALIAS
101
+ obj._gams_subtype = 0
102
+
103
+ # add to container
104
+ obj._container.data.update({name: obj})
105
+ obj._container._requires_state_check = True
106
+
107
+ return obj
108
+
109
+ def __new__(cls, *args, **kwargs):
110
+ # fastpath
111
+ if len(args) == len(kwargs) == 0:
112
+ return object.__new__(cls)
113
+
114
+ try:
115
+ container = args[0]
116
+ except IndexError:
117
+ container = kwargs.get("container", None)
118
+
119
+ try:
120
+ name = args[1]
121
+ except IndexError:
122
+ name = kwargs.get("name", None)
123
+
124
+ try:
125
+ symobj = container[name]
126
+ except (KeyError, IndexError, TypeError):
127
+ symobj = None
128
+
129
+ if symobj is None:
130
+ return object.__new__(cls)
131
+ else:
132
+ if isinstance(symobj, cls):
133
+ return symobj
134
+ else:
135
+ raise TypeError(
136
+ f"Cannot overwrite symbol '{symobj.name}' in container because it is not a {cls.__name__} object"
137
+ )
138
+
139
+ def __init__(self, container: "Container", name: str) -> None:
140
+ self._requires_state_check = True
141
+ self.container = container
142
+ self.name = name
143
+ self.modified = True
144
+ self._gams_type = gdx.GMS_DT_ALIAS
145
+ self._gams_subtype = 0
146
+ container.data.update({name: self})
147
+
148
+ def __delitem__(self):
149
+ # TODO: add in some functionality that might relax the symbols down to a different domain
150
+ # This function would mimic the <Container>.removeSymbols() method -- is more pythonic
151
+ del self.container.data[self.name]
152
+
153
+ def __repr__(self):
154
+ return f"<UniverseAlias `{self.name}` ({hex(id(self))})>"
155
+
156
+ @property
157
+ def is_singleton(self) -> bool:
158
+ """
159
+ Whether a symbol is a singleton set
160
+
161
+ Returns
162
+ -------
163
+ bool
164
+ Always False
165
+ """
166
+ return False
167
+
168
+ def _assert_is_valid(self):
169
+ if self._requires_state_check:
170
+ if self.container is None:
171
+ raise Exception(
172
+ "Symbol is not currently linked to a container, "
173
+ "must add it to a container in order to be valid"
174
+ )
175
+
176
+ # if no exceptions, then turn self._requires_state_check 'off'
177
+ self._requires_state_check = False
178
+
179
+ @property
180
+ def alias_with(self) -> str:
181
+ """
182
+ Returns aliased object
183
+
184
+ Returns
185
+ -------
186
+ str
187
+ Always "*"
188
+ """
189
+ return "*"
190
+
191
+ @property
192
+ def domain_names(self) -> List[str]:
193
+ """
194
+ Always ["*"] for universe alias
195
+
196
+ Returns
197
+ -------
198
+ List[str]
199
+ Always ["*"]
200
+ """
201
+ return ["*"]
202
+
203
+ @property
204
+ def domain_labels(self) -> List[str]:
205
+ """
206
+ Always ["uni"] for universe alias
207
+
208
+ Returns
209
+ -------
210
+ List[str]
211
+ Always ["uni"]
212
+ """
213
+ return ["uni"]
214
+
215
+ @property
216
+ def domain(self) -> List[str]:
217
+ """
218
+ Always ["*"] for universe alias
219
+
220
+ Returns
221
+ -------
222
+ List[str]
223
+ Always ["*"]
224
+ """
225
+ return ["*"]
226
+
227
+ @property
228
+ def description(self) -> str:
229
+ """
230
+ Always 'Aliased with *' for universe alias
231
+
232
+ Returns
233
+ -------
234
+ str
235
+ Always 'Aliased with *'
236
+ """
237
+ return "Aliased with *"
238
+
239
+ @property
240
+ def dimension(self) -> int:
241
+ """
242
+ Always 1 for universe alias
243
+
244
+ Returns
245
+ -------
246
+ int
247
+ Always 1
248
+ """
249
+ return 1
250
+
251
+ def toList(self) -> Union[List[str], None]:
252
+ """
253
+ Convenience method to return symbol records as a python list
254
+
255
+ Returns
256
+ -------
257
+ List[str] | None
258
+ A list of symbol records
259
+
260
+ Examples
261
+ --------
262
+ >>> m = gt.Container()
263
+ >>> i = gt.Set(m, "i", records=["seattle", "san-diego"])
264
+ >>> j = gt.Set(m, "j", records=["new-york", "chicago", "topeka"])
265
+ >>> ij = gt.UniverseAlias(m, "ij")
266
+ >>> print(ij.toList())
267
+ ['seattle', 'san-diego', 'new-york', 'chicago', 'topeka']
268
+ """
269
+ if self.records is not None:
270
+ return self.records.set_index(self.records.columns[0]).index.to_list()
271
+ return None
272
+
273
+ @property
274
+ def records(self) -> Union[pd.DataFrame, None]:
275
+ """
276
+ The main symbol records
277
+
278
+ Returns
279
+ -------
280
+ DataFrame | None
281
+ Records dataframe if there are records, otherwise None.
282
+ """
283
+ if self.isValid():
284
+ return pd.DataFrame(
285
+ data=self.container.getUELs(), columns=self.domain_labels
286
+ )
287
+ return None
288
+
289
+ @property
290
+ def number_records(self) -> Union[int]:
291
+ """
292
+ Number of symbol records (i.e., returns len(records) if not NAN)
293
+
294
+ Returns
295
+ -------
296
+ int
297
+ Number of symbol records
298
+ """
299
+ if self.isValid():
300
+ return len(self.records)
301
+
302
+ return float("nan")
303
+
304
+ @property
305
+ def domain_type(self) -> str:
306
+ """
307
+ Always none for universe alias
308
+
309
+ Returns
310
+ -------
311
+ str
312
+ Always 'none'
313
+ """
314
+ return "none"
315
+
316
+ def getUELs(self, ignore_unused: bool = False) -> Union[List[str], None]:
317
+ """
318
+ Gets UELs from the Container. Returns only UELs in the data if ignore_unused=True, otherwise return all UELs.
319
+
320
+ Parameters
321
+ ----------
322
+ ignore_unused : bool, optional
323
+ Whether to get all UELs or only used ones, by default False
324
+
325
+ Returns
326
+ -------
327
+ list | None
328
+ A list of UELs if the symbol is valid, otherwise None.
329
+ """
330
+ if self.isValid():
331
+ return self.container.getUELs(ignore_unused=ignore_unused)
332
+ return None
333
+
334
+ @property
335
+ def summary(self) -> dict:
336
+ """
337
+ Returns a dict of only the metadata
338
+
339
+ Returns
340
+ -------
341
+ dict
342
+ Outputs a dict of only the metadata
343
+ """
344
+ return {
345
+ "name": self.name,
346
+ "description": self.description,
347
+ "alias_with": self.alias_with,
348
+ }
349
+
350
+ def equals(
351
+ self,
352
+ other: Union["Set", "Alias"],
353
+ check_meta_data: bool = True,
354
+ verbose: bool = False,
355
+ ):
356
+ """
357
+ Used to compare the symbol to another symbol.
358
+ If check_meta_data=True then check that symbol name and description are the same, otherwise skip.
359
+ If verbose=True will return an exception from the asserter describing the nature of the difference.
360
+
361
+ Parameters
362
+ ----------
363
+ other : Set or Alias
364
+ The other symbol (Set or Alias) to compare with the current alias.
365
+ check_meta_data : bool, optional
366
+ If True, compare the metadata of the two symbols, by default True.
367
+ verbose : bool, optional
368
+ If True, raise an exception with an explanation of where the symbols differ if they do differ, by default False.
369
+
370
+ Returns
371
+ -------
372
+ bool
373
+ True if the two symbols are equal in the specified aspects; False if they are not equal and verbose is False.
374
+
375
+ Examples
376
+ --------
377
+ >>> m = gt.Container()
378
+ >>> i = gt.Set(m, "i", records=["seattle", "san-diego"])
379
+ >>> j = gt.Set(m, "j", records=["new-york", "chicago", "topeka"])
380
+ >>> ij = gt.UniverseAlias(m, "ij")
381
+ >>> print(ij.equals(i))
382
+ False
383
+ """
384
+ try:
385
+ #
386
+ # ARG: other
387
+ if not isinstance(other, AnyContainerSymbol):
388
+ raise TypeError("Argument 'other' must be a symbol object")
389
+
390
+ # adjustments
391
+ if isinstance(other, ABCAlias):
392
+ other = other.alias_with
393
+
394
+ #
395
+ # ARG: self & other
396
+ if not isinstance(self, type(other)):
397
+ raise TypeError(
398
+ f"Symbol are not of the same type (`{type(self)}` != `{type(other)}`)"
399
+ )
400
+
401
+ #
402
+ # ARG: check_meta_data
403
+ if not isinstance(check_meta_data, bool):
404
+ raise TypeError("Argument 'check_meta_data' must be type bool")
405
+
406
+ #
407
+ # Mandatory checks
408
+ if not self.isValid():
409
+ raise Exception(
410
+ f"Cannot compare objects because `{self.name}` is not a valid symbol object"
411
+ "Use `<symbol>.isValid(verbose=True)` to debug further."
412
+ )
413
+
414
+ if not other.isValid():
415
+ raise Exception(
416
+ f"Cannot compare objects because `{other.name}` is not a valid symbol object"
417
+ "Use `<symbol>.isValid(verbose=True)` to debug further."
418
+ )
419
+
420
+ #
421
+ # Check metadata (optional)
422
+ if check_meta_data:
423
+ if self.name != other.name:
424
+ raise Exception(
425
+ f"Symbol names do not match (`{self.name}` != `{other.name}`)"
426
+ )
427
+
428
+ if self.getUELs() != other.getUELs():
429
+ raise Exception(
430
+ "Symbol UEL ordering does not match \n\n"
431
+ f"[self]: {left_uels} \n"
432
+ f"[other]: {right_uels} \n"
433
+ )
434
+
435
+ return True
436
+ except Exception as err:
437
+ if verbose:
438
+ raise err
439
+ else:
440
+ return False
441
+
442
+ def pivot(self, *args, **kwargs) -> None:
443
+ """
444
+ Pivot the records DataFrame of a symbol that has a dimension more than 1.
445
+ Always raises a dimensionality exception.
446
+ """
447
+ raise Exception(
448
+ "Pivoting operations only possible on symbols with dimension > 1, "
449
+ f"symbol dimension is {self.dimension}"
450
+ )
451
+
452
+ def getSparsity(self) -> float:
453
+ """
454
+ Get the sparsity of the symbol w.r.t the cardinality
455
+
456
+ Returns
457
+ -------
458
+ float
459
+ Always 0
460
+ """
461
+ return 0.0