pydae 0.56.4__py3-none-any.whl → 0.57__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.
pydae/utils/dates.py ADDED
@@ -0,0 +1,233 @@
1
+ import datetime
2
+ import pytz
3
+ from typing import Optional,List
4
+
5
+ def get_absolute_hour_of_year_with_dst(month: int, day: int, day_hour: int, year: int, timezone_name: str) -> int:
6
+ """
7
+ Calculates the absolute hour of the year (0-indexed) for a given date and hour,
8
+ correctly handling Daylight Saving Time (DST) shifts.
9
+
10
+ Args:
11
+ month: The month (1-12).
12
+ day: The day of the month (1-31).
13
+ day_hour: The hour of the day (0-23).
14
+ year: The year for the calculation.
15
+ timezone_name: The IANA time zone string (e.g., 'Europe/Madrid', 'America/New_York').
16
+
17
+ Returns:
18
+ The absolute hour of the year (0-indexed).
19
+ """
20
+ try:
21
+ # 1. Define the time zone
22
+ tz = pytz.timezone(timezone_name)
23
+
24
+ # 2. Create the start-of-year time (Jan 1st, 00:00), making it time zone-aware
25
+ start_of_year = tz.localize(datetime(year, 1, 1, 0, 0, 0))
26
+
27
+ # 3. Create the target time, making it time zone-aware
28
+ # Note: localize handles ambiguous times (the hour repeated when clocks fall back)
29
+ # by defaulting to the first occurrence (is_dst=False), which is generally safe.
30
+ target_naive = datetime.datetime(year, month, day, day_hour)
31
+ target_time = tz.localize(target_naive)
32
+
33
+ # 4. Calculate the difference (timedelta)
34
+ time_difference = target_time - start_of_year
35
+
36
+ # 5. Convert the difference to total hours
37
+ # This conversion correctly uses the total elapsed seconds, accounting for
38
+ # the 23-hour or 25-hour days caused by DST shifts.
39
+ total_hours = int(time_difference.total_seconds() / 3600)
40
+
41
+ return total_hours
42
+
43
+ except pytz.UnknownTimeZoneError:
44
+ print(f"Error: Unknown time zone '{timezone_name}'.")
45
+ return -1
46
+ except ValueError as e:
47
+ print(f"Error: Invalid date/time input. {e}")
48
+ return -1
49
+
50
+
51
+
52
+
53
+ def datetime_to_hour_of_year(date_input: datetime.datetime) -> Optional[int]:
54
+ """
55
+ Calculates the absolute hour of the year (0-indexed) for a given date.
56
+ It uses the timezone already attached to the input object for the calculation.
57
+
58
+ Args:
59
+ date_input: A timezone-aware datetime object (tzinfo MUST be set).
60
+
61
+ Returns:
62
+ The absolute hour of the year (0-indexed) as an integer, or None on error.
63
+ """
64
+
65
+ # 🚨 Input Validation: Check if the input is timezone-aware
66
+ target_tz = date_input.tzinfo
67
+ if target_tz is None or target_tz.utcoffset(date_input) is None:
68
+ print("Error: Invalid date/time input. Input 'date_input' MUST be a timezone-aware datetime object.")
69
+ return None
70
+
71
+ try:
72
+ # 1. The target timezone is extracted directly from the input object (target_tz)
73
+
74
+ # 2. Create the start-of-year time (Jan 1st, 00:00) in the input's timezone
75
+ start_of_year_naive = datetime.datetime(date_input.year, 1, 1, 0, 0, 0)
76
+
77
+ # We must use localize() here since start_of_year_naive is, by definition, naive.
78
+ start_of_year_aware = target_tz.localize(start_of_year_naive)
79
+
80
+ # 3. The target time is already aware (date_input), so no conversion is needed.
81
+ target_time_aware = date_input
82
+
83
+ # 4. Calculate the difference (timedelta)
84
+ # This calculation is safe because both datetimes are aware and use the same tzinfo.
85
+ time_difference = target_time_aware - start_of_year_aware
86
+
87
+ # 5. Convert the difference to total hours
88
+ total_hours = int(time_difference.total_seconds() / 3600)
89
+
90
+ return total_hours
91
+
92
+ except pytz.exceptions.UnknownTimeZoneError:
93
+ # This catch is mostly for safety, though the tzinfo should be valid if set by pytz initially.
94
+ print(f"Error: Timezone attached to the input is not recognized.")
95
+ return None
96
+ except Exception as e:
97
+ print(f"An unexpected error occurred: {e}")
98
+ return None
99
+
100
+
101
+ def parse_datetime(date_string: str, timezone_name: str) -> Optional[datetime.datetime]:
102
+ """
103
+ Attempts to parse a date string using a predefined list of common formats.
104
+
105
+ Args:
106
+ date_string: The raw string input from the user (e.g., '2025-11-22 10:30').
107
+ timezone_name: The timezone to apply (e.g., 'Europe/Madrid').
108
+
109
+ Returns:
110
+ A timezone-aware datetime object if successful, otherwise None.
111
+ """
112
+
113
+ # 1. Define the list of formats to try (from most specific/common to least)
114
+ common_formats = [
115
+ # Full date and time
116
+ "%Y-%m-%d %H:%M:%S", # 2025-11-22 10:30:00
117
+ "%Y-%m-%d %H:%M", # 2025-11-22 10:30
118
+ "%d/%m/%Y %H:%M:%S", # 22/11/2025 10:30:00
119
+ "%d/%m/%Y %H:%M", # 22/11/2025 10:30
120
+
121
+ # Date only (assuming midnight)
122
+ "%Y-%m-%d", # 2025-11-22
123
+ "%d/%m/%Y", # 22/11/2025
124
+ "%m/%d/%Y", # 11/22/2025 (Common in US)
125
+ ]
126
+
127
+ # --- Timezone Setup ---
128
+ try:
129
+ # Get the timezone object using pytz
130
+ tz = pytz.timezone(timezone_name)
131
+ except pytz.exceptions.UnknownTimeZoneError:
132
+ print(f"Error: Timezone '{timezone_name}' is not recognized.")
133
+ return None
134
+
135
+ # --- Iteration and Parsing ---
136
+ for fmt in common_formats:
137
+ try:
138
+ # 1. Try to parse the string with the current format
139
+ naive_dt = datetime.datetime.strptime(date_string, fmt)
140
+
141
+ # 2. **Safety Net**: Ensure the object is naive before localization.
142
+ # (Though strptime is expected to return a naive object, this is safe practice)
143
+ naive_dt = naive_dt.replace(tzinfo=None)
144
+
145
+ # 3. Localize the naive datetime object (make it timezone-aware)
146
+ localized_dt = tz.localize(naive_dt)
147
+
148
+ # 4. Success! Return the localized object immediately
149
+ print(f"✅ Successfully parsed '{date_string}' using format: '{fmt}'")
150
+ return localized_dt
151
+
152
+ except ValueError:
153
+ # If the parsing fails for this format, simply continue to the next one
154
+ continue
155
+
156
+ # If the loop finishes without returning, no format worked
157
+ print(f"❌ Could not parse '{date_string}' with any known format.")
158
+ return None
159
+
160
+
161
+ def list_full_hours_between(start_dt: datetime, end_dt: datetime) -> List[datetime]:
162
+ """
163
+ Lists all full hours (on the hour mark) between a start and end datetime.
164
+ The list includes the hour of the start_dt, but excludes the hour of the end_dt.
165
+
166
+ Args:
167
+ start_dt: The starting datetime object (must be timezone-aware).
168
+ end_dt: The ending datetime object (must be timezone-aware).
169
+
170
+ Returns:
171
+ A list of timezone-aware datetime objects, all set to the start of the hour.
172
+
173
+ Raises:
174
+ ValueError: If datetimes are not timezone-aware or start_dt is after end_dt.
175
+ """
176
+
177
+ # --- Input Validation ---
178
+ if start_dt.tzinfo is None or start_dt.tzinfo.utcoffset(start_dt) is None:
179
+ raise ValueError("Start datetime must be timezone-aware (tzinfo is required).")
180
+ if end_dt.tzinfo is None or end_dt.tzinfo.utcoffset(end_dt) is None:
181
+ raise ValueError("End datetime must be timezone-aware (tzinfo is required).")
182
+ if start_dt >= end_dt:
183
+ return []
184
+
185
+ # --- 1. Find the first full hour mark to start the iteration ---
186
+ # Set the minute and second to zero for the start_dt's hour
187
+ current_dt = start_dt.replace(minute=0, second=0, microsecond=0)
188
+
189
+ # If the start_dt itself was not exactly on the hour, we must include it
190
+ # as the first item in the list, otherwise, the next iteration would skip it.
191
+ if start_dt.minute > 0 or start_dt.second > 0:
192
+ pass # current_dt now represents the start of the hour containing start_dt
193
+
194
+ hours_list = []
195
+
196
+ # --- 2. Iterate hour by hour until the end_dt is reached ---
197
+ one_hour = datetime.timedelta(hours=1)
198
+
199
+ while current_dt < end_dt:
200
+ # Append the current full hour to the list
201
+ hours_list.append(current_dt)
202
+
203
+ # Move to the next hour
204
+ current_dt += one_hour
205
+
206
+ return hours_list
207
+
208
+ def absolute_hours_list(datetime_list,time_zone='Europe/Paris'):
209
+
210
+ result_ini = parse_datetime( '1/12/2024 23:00', 'Europe/Paris')
211
+ result_end = parse_datetime('31/12/2024 23:00', 'Europe/Paris')
212
+
213
+
214
+ hours_list = []
215
+ for item in list_full_hours_between(result_ini,result_end):
216
+ hours_list += [datetime_to_hour_of_year(item)]
217
+
218
+ return hours_list
219
+
220
+
221
+
222
+ if __name__ == '__main__':
223
+
224
+ result_1 = parse_datetime('31/12/2024 23:00', 'Europe/Paris')
225
+ print(datetime_to_hour_of_year(result_1))
226
+
227
+ result_ini = parse_datetime( '1/12/2024 23:00', 'Europe/Paris')
228
+ result_end = parse_datetime('31/12/2024 23:00', 'Europe/Paris')
229
+
230
+ print(list_full_hours_between(result_ini,result_end))
231
+
232
+ print(absolute_hours_list('1/12/2024 23:00','1/12/2024 23:00'))
233
+
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pydae
3
- Version: 0.56.4
3
+ Version: 0.57
4
4
  Summary: =====
5
5
  Keywords: engineering
6
6
  Author-email: Juan Manuel Mauricio <jmmauricio6@gmail.com>
@@ -18,6 +18,8 @@ Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: Implementation :: CPython
20
20
  Classifier: Topic :: Scientific/Engineering
21
+ License-File: COPYING
22
+ License-File: LICENSE
21
23
  Requires-Dist: numpy
22
24
  Requires-Dist: scipy
23
25
  Requires-Dist: sympy
@@ -1,12 +1,12 @@
1
1
  pydae/.gitignore,sha256=c1jUQV9WXX3PWrlOzHiKvUWFomLJUrfYogbU7nYwAwc,288
2
- pydae/__init__.py,sha256=tC7ODVqBfv538NrCOaJBs4cHTgNvcGoqT4GXtmp5yfE,106
2
+ pydae/__init__.py,sha256=RO7L59GtEqyO3RIZ2ZKEMR8WFEua04JOz4qlCqq10q4,104
3
3
  pydae/b_pu.py,sha256=FdRRVieJLQDYPwYNWhbXJ0SXvf4jtPdbvIZTKWi16I0,6775
4
4
  pydae/bpu.py,sha256=FdRRVieJLQDYPwYNWhbXJ0SXvf4jtPdbvIZTKWi16I0,6775
5
5
  pydae/build.py,sha256=ECfc_doyK9PhrjEAlWJGLfirQmpT24XuYNxUgtrXI74,46151
6
- pydae/build_cffi.py,sha256=o-l7xV5wH4sg0PuWq8Qll53phuXpRB2H04BDkYRuSzk,43879
6
+ pydae/build_cffi.py,sha256=jzsAIT_D3bWQHR6mpJQ4O99F2yR9iPtA6OdKfwKxxgs,43890
7
7
  pydae/build_cffi_mp.py,sha256=gJSQ9Ff_g09zqBvDQQBfMA4DTU6U0mtrV3ac4MLkP5A,44276
8
8
  pydae/build_test_cffi.c,sha256=5DtNrpLj8_dWHKrVaffSEIitG1PYFO37In__abX9jDQ,106204
9
- pydae/build_v2.py,sha256=UPgm16Wc6T1MVRmMAD7hLpjj82PN61FsO48Vs2lxY9A,66821
9
+ pydae/build_v2.py,sha256=ctx4Q6KxZr7LyDkbMPlnXRWESV-4CAZn50l-l8sAnr8,67240
10
10
  pydae/buildfast.py,sha256=Mg0GNjmf6QvG6JlcTprftBRbcS8TFLdGRAeglAM-ugA,31931
11
11
  pydae/checker.txt,sha256=FbB6zPVdXWrp2OkmmJZBwkKz5PtPJsoP8f72TWq-9ko,117
12
12
  pydae/ctrl.py,sha256=TSfiLY5nugOaN010aIjmdz_IiEgrYEv1182r7mvWe58,15561
@@ -37,17 +37,18 @@ pydae/solver_run.c,sha256=sCM1TBaor1dv8ZFQmjJ1JuR7qrR9008BbZ4Csg-e6Xk,47295
37
37
  pydae/solver_run.o,sha256=U_wlDQ1VVZlFljhzBx_WLzn73kOzGgaPW1kaDTgwPYk,16760
38
38
  pydae/solvers.py,sha256=0JpWaSiha00R7Qi0yqqH9NAP2YyG0BcbqcPBnpAEdWo,4419
39
39
  pydae/ssa.py,sha256=kbOQcZpbkrsTm49gTj2GDfgB4fqkDR-zAXRVkhErORs,27427
40
- pydae/temp.py,sha256=K_4SgF8_b6a9zkSCYM_1Ta9olJhpafuduiHSYCzLKQc,60271
41
- pydae/temp_ini_cffi.c,sha256=IOhBAj5NvJB7jtw7jhAlsbxWAyk4SXln_WbtQ-te_2k,42517
42
- pydae/temp_run_cffi.c,sha256=KXXwvj8Vco20aFVEGrXwv66w941e3Ko0kks4C3kI7nY,42511
43
- pydae/temp_trap_cffi.c,sha256=6TrwKnjjB1S_QDRMY57oz09trX0CjZSQHa0pOaWW88o,33135
40
+ pydae/temp.py,sha256=IuMEqgtKqPhtJvpNI62SohOoU6Kmmdf3I6e-dOwK_5w,60283
41
+ pydae/temp_ini_cffi.c,sha256=4xGnXaEQYvMjGNdZsJiAgS4RuIo5mDnhfMsOJro3JU0,42776
42
+ pydae/temp_run_cffi.c,sha256=On-W7eVVF0CSuXSc_hPeRCWyBsaxNTODmdzxNbK5io4,42770
43
+ pydae/temp_trap_cffi.c,sha256=j_WECL6AyenjkLW6m4VUbgn9W9a8zaoRz-MnrKyvfBQ,33394
44
44
  pydae/tools.py,sha256=f7VexbXpH0JOLFeH-l0o2vDG3faN7ai3OPlLldQqg9k,4765
45
45
  pydae/train_tools.py,sha256=8I-bKxIi0Ab0SXB_gKKUwk4n5wFipbDUdUjtFPl_rAE,6115
46
46
  pydae/transformers.py,sha256=tVei7P88EFJWx-68NjscVL8eYFJYECpQtRgS6BH_3B0,17289
47
47
  pydae/xy_0.json,sha256=uX-p5beHXjMDIkSTd5egfdq2UOq4n37oHpB8XJbpUts,240
48
48
  pydae/.ipynb_checkpoints/models-checkpoint.py,sha256=N8-m1Dk6HdmgpELHhEudVGup3ZO_b_DrJls7nanY4O8,58246
49
49
  pydae/bmapu/__init__.py,sha256=r7mgVYduCfuZ_pqaNXp_Y6Y-L3wcOKT4dzBLPsr8oak,105
50
- pydae/bmapu/bmapu_builder.py,sha256=QwP2bEmLQAIO2aIG_1qaijipslW9kYDLtaqdBQ9qn3E,27450
50
+ pydae/bmapu/bmapu_builder.py,sha256=xuLXpO5OpfXAxMXjYz3bWUf_U6epWpWXbFqpoNNYlrY,26807
51
+ pydae/bmapu/bmapu_builder_line_exp.py,sha256=QljQTMT24enZPCvoQyxtN4uSzhmgWQWkdR3qnKYDxDE,21974
51
52
  pydae/bmapu/avrs/__init__.py,sha256=JhpeBVii27qLqxJqimWLBYwjPgXrz3hYq7PQQf2ssGs,99
52
53
  pydae/bmapu/avrs/avr_antiw.py,sha256=WtezvBDcr82VEqEmbSMdfKS_jdeI-ZcBan5FWqTURd4,15589
53
54
  pydae/bmapu/avrs/avrs.py,sha256=sWz29mcLMPcK7N0NiCtkF7MszAkv-RNAvo8Vst81m2A,1104
@@ -89,7 +90,14 @@ pydae/bmapu/govs/temp_xy_0.json,sha256=s1NHn0VvC_-yKfF5ZWR3c45AbF-2wyHxQHfEtavNp
89
90
  pydae/bmapu/govs/tgov1.py,sha256=FBpgHh9n__9Z4PdVolU6dTx-qpi887Km89939k3qNVU,2799
90
91
  pydae/bmapu/govs/xy_0.json,sha256=s1NHn0VvC_-yKfF5ZWR3c45AbF-2wyHxQHfEtavNpYQ,325
91
92
  pydae/bmapu/lines/__init__.py,sha256=oqQul2vN-ptslMdLyvGd7_KLLYgCV5beQvOICuavTRA,189
92
- pydae/bmapu/lines/lines.py,sha256=y0pjz63NIgwdDbmS58k9VV69FHcujeHzlZtBqXaTrXI,2331
93
+ pydae/bmapu/lines/lib_dtr.py,sha256=cen93cIFMQDWV92tt2GTKVwS2dEfg8IGmzwD49lgDkE,15675
94
+ pydae/bmapu/lines/lines.py,sha256=HJldB_qECtnOZD2k_KCqaEtjbYveHKqLkg7aT8z9CNM,11430
95
+ pydae/bmapu/lines/temp.py,sha256=NX7WzyKRAMqUFNLY6briw5DHwiz871iAvqYYUfVuNzU,61118
96
+ pydae/bmapu/lines/temp_ini_cffi.c,sha256=fkVX3FKuznEXZy7RcpzaNLKVb0e1MhkAflq0zcUSFIM,45210
97
+ pydae/bmapu/lines/temp_run_cffi.c,sha256=IwLffjIAYi-sfkTfB-tFfOBuNkQb6rHfpZGIT-SA_9U,45210
98
+ pydae/bmapu/lines/temp_trap_cffi.c,sha256=8fYuXK1AtdWQcQkU4T2M2tP9BMeycnd4Gz1GQLh-jjI,35014
99
+ pydae/bmapu/lines/temp_xy_0.json,sha256=CPFm4uAYlOUHuONVUyrJCc-ecch9fHk-I6HXmKH7k8A,102
100
+ pydae/bmapu/lines/xy_0.json,sha256=CPFm4uAYlOUHuONVUyrJCc-ecch9fHk-I6HXmKH7k8A,102
93
101
  pydae/bmapu/loads/__init__.py,sha256=rh5unTQUN14OzJ7B98byS7szyklhxQyipKDZdxN9pno,77
94
102
  pydae/bmapu/loads/load_zip.py,sha256=Y8DOXsDCTdznWH0mycZ0Zd6PG8f3HJo0ssfCnleMeVc,4734
95
103
  pydae/bmapu/loads/loads.py,sha256=7xDg4c5JjKWJKkMT4qWEGIoiU_eDu1GQ4q5Fky9bcls,1085
@@ -145,6 +153,7 @@ pydae/bmapu/pvs/pv_dq_ss.py,sha256=sb-s0WRbJcNQHPZagp9empMjAtK01mVhq8bkRD2SdX8,2
145
153
  pydae/bmapu/pvs/pv_dq_ss_dev.ipynb,sha256=1qo11UJDU7Hu6AfuYD6C8311nFEpS1zI2RrQcZioq6I,4551
146
154
  pydae/bmapu/pvs/pv_dq_ss_test.ipynb,sha256=sJevn6PnKK3OlPRwBpc1etGOPHdg2ikeD9uT5FuqK6Y,222484
147
155
  pydae/bmapu/pvs/pv_model_test.ipynb,sha256=UZMSZz5VcTCynyYP3E9CALz5kXrA9Kahi4kkFhJ2_1g,221714
156
+ pydae/bmapu/pvs/pv_string.py,sha256=cHT1TS2ZmkRJZX8DKg-7ZikOl0M_3eKuxpAEW1MTd-k,23563
148
157
  pydae/bmapu/pvs/pv_test.py,sha256=Ku2XC39nefqELSJC0u_gzRhJtBC5Pu7Y2n0M671u3nw,63880
149
158
  pydae/bmapu/pvs/pv_test_cffi.c,sha256=kfumVy9p7LgH7hu-bpFVHtIp0p5hgUh1yG0zEpoNx2E,111095
150
159
  pydae/bmapu/pvs/pvs.py,sha256=TG39NflgJoEZY55BYQZnluc1Xn303iMH8QQ_roIY64o,2003
@@ -447,14 +456,22 @@ pydae/etools/solar.py,sha256=hudSW8GEH5bOjIWW0maxd9jr9lMJqO6p7hWey4xlbVQ,14016
447
456
  pydae/etools/vsc_losses.py,sha256=Momed_X7oa8Q_i3pqkHfV9-x-vj_m3Y-nKkcoads-to,22266
448
457
  pydae/models/__init__.py,sha256=p1f9JVQU3e7SjQZu2jnrxLHLMvhPi8gqrvkXvKc0Wtc,78
449
458
  pydae/models/pendulum/__init__.py,sha256=HomUjsGC09OFQGv-4BWAafBo-gLUIH2V1V96uyiupso,86
459
+ pydae/models/pendulum/api_test.http,sha256=ztZuKeN_0dQw7tIDFFkRbRKqvCvThPCy4S-8KxAts9g,2246
450
460
  pydae/models/pendulum/dae.py,sha256=ECoATeDOwwgSs8HmYF9nURGORZzOJTSLhRZNu7N2LnY,2260
461
+ pydae/models/pendulum/dae_api.py,sha256=OgsPRtwcGtZIK05D9YsjVCV1OLAwLonVyWIuu2xjT3Y,3389
462
+ pydae/models/pendulum/dashboard.py,sha256=g3uENlLsEmZipPMxqERtxkdtz3Mv8Y7dDOFLdIeQfIY,7475
451
463
  pydae/models/pendulum/pendulum.py,sha256=yGH-ByRuSBqKE5McpLeYYCos4WqO2hVYHvwlD4JNEXw,63988
452
464
  pydae/models/pendulum/pendulum_cffi.c,sha256=v_ZXyjjLnKXIMqCZAo1ROQ8vQWXyIZIlZCMz0mv6i0I,97882
465
+ pydae/models/pendulum/temp.py,sha256=mAIDJM6jyRrROENGGUYFQzyrqZ9-IEN-bkbpZdSfjds,62496
466
+ pydae/models/pendulum/temp_ini_cffi.c,sha256=5Tj0_24oeQ_hh5tJpNBr3p_y9OkaoSFqP-ld385P7NA,42794
467
+ pydae/models/pendulum/temp_run_cffi.c,sha256=c8S4uRJJx3JdIeIH5-3bQuZvWWpCJMKy_xjMEf_bYHs,42788
468
+ pydae/models/pendulum/temp_trap_cffi.c,sha256=j_WECL6AyenjkLW6m4VUbgn9W9a8zaoRz-MnrKyvfBQ,33394
453
469
  pydae/optimization/__init__.py,sha256=8cq4RcwL2QG2fqMqtx-PzCFXXfQXtSPXZnglln_GX14,41
454
470
  pydae/optimization/ofo.py,sha256=jsfdvBT9LsR7mgh4BX6gl0tjICyk0JB7_DPM7ClyxQo,4849
455
471
  pydae/svg_tools/__init__.py,sha256=HPY2P6vKDaWLj1aVw2ARs3UBU-5B4NU_SmTxl9KrEZo,127
472
+ pydae/svg_tools/bmapu_tooltips.ipynb,sha256=1gxFpP2VU6oENLEeiUBlsNw0JKWdzr4XpaAXi2bsD4I,3171
456
473
  pydae/svg_tools/set_tooltips_v2.py,sha256=IPOiM7jKVDH--ATBS4-YULom_QGhy77XIuYbtv5I7eY,15962
457
- pydae/svg_tools/svg_tools.py,sha256=B7D1IeVsnVQMB-Be5kHZ9cVb6YqOaHCbSOdt14ruh_c,33572
474
+ pydae/svg_tools/svg_tools.py,sha256=T_m45_RmLrGYLsKMn_ldvbt12n-pdp_kqB9nTPPce6Y,33746
458
475
  pydae/systems/__init__.py,sha256=-kUhPRMpjduTbVejNlhWd1hV8rQVUrDSjLPalKcCXr8,80
459
476
  pydae/systems/smib.json,sha256=Ll7_eOvuUQKwY3Z9lcH4qatnQDQkRUZFige1aYLeTLo,926
460
477
  pydae/systems/atydse/__init__.py,sha256=-kUhPRMpjduTbVejNlhWd1hV8rQVUrDSjLPalKcCXr8,80
@@ -487,6 +504,7 @@ pydae/templates/backaup_run.cpp,sha256=O7MChkWXrCUlUTd8svHk_1ler5ZGfJvGvwm5h7pWu
487
504
  pydae/templates/class_dae_cffi_template.py,sha256=FN1KHkzA1raEU67i0n8YOTC2D_pkEKfY4Tto9WSbMZg,63319
488
505
  pydae/templates/class_dae_fast_template.py,sha256=nNtEAJUjVy8pZ42ByXQnDNfiDBIVtODLDy3NUo2QxCA,31669
489
506
  pydae/templates/class_dae_template.py,sha256=VcmY8aLMpHMaqj2tUyTxeSmi9mDWuLHOpWCYkVllGX0,26686
507
+ pydae/templates/class_dae_template_api.py,sha256=C1xIk_y1rf23R-Hzr6xVHErpB3gx2k61RztLP6r5bH4,61764
490
508
  pydae/templates/class_dae_template_v2.py,sha256=Iz7PQL8IkhC3WpSSBGplRZfl4uvEWVUnkxt0r9D7xqo,59560
491
509
  pydae/templates/class_dae_template_v2_mkl.py,sha256=IX9834W2HSBcG53THQUQ9LetUIW2egaycaL0ZvuI0q8,29889
492
510
  pydae/templates/class_template.py,sha256=dnsUxjEyLuZsiDlxIcCauWPH5XgoBdbiV6d-hYnDRCc,4162
@@ -717,14 +735,15 @@ pydae/urisi/vsgs/vsg_lpf_ib.hjson,sha256=xpuo5fPCdO5Ze0X-KDCsa_eRpde5f5KDDFoDkWI
717
735
  pydae/urisi/vsgs/vsgs.py,sha256=v17sLm7EaaAyBVJk9-8DnLtxPDtXmkyizFlGhgqyFEE,644
718
736
  pydae/urisi/vsgs/xy_0.json,sha256=Q6qWPIqEP-w5Qu2twd3S4PX4zMggpNpG2W62e7ry70g,851
719
737
  pydae/utils/__init__.py,sha256=kwp76qeU2mnwrCexDSF15id9ih12Q0VRL3l-_c6omcQ,184
738
+ pydae/utils/dates.py,sha256=gIJAVlZxLcGoahS_eMzowyqS6a-CUtgWsqpOOIQkl8U,9175
720
739
  pydae/utils/ss_num2sym.py,sha256=ZA-x01y1mEWk1HdlpNv9rNspFdH0RBlTq_JRDHmjlpU,3209
721
740
  pydae/utils/svg2pdf.py,sha256=6tNORhlu_cMPDp264Kg3X_eBORfT9Q1cqAcWaWgDs7k,1861
722
741
  pydae/utils/tools.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
723
742
  pydae/utils/types_converter.py,sha256=3eAWwELgG1d6iFX8sn8iGPIp6NBaX4I-eyUriRDOFyE,7929
724
743
  pydae/utils/utils.py,sha256=AI0wZr4PJ3Td3vjfAW06FJdgcK01TpUAukhG37gZP5g,1079
725
744
  pydae/utils/emtp/readPL4.py,sha256=R59KhXTmFrqtdv-9nv5tkdHoTs9uoofGqEfBCF4fGEY,3088
726
- pydae-0.56.4.dist-info/COPYING,sha256=QWnWoslbTjQmtlFSRoGF3wxJEJuTJdlEMZ7lHtbGAeQ,1139
727
- pydae-0.56.4.dist-info/LICENSE,sha256=8hQe1oM4ySdliF3R-NEvR6HqrcGDKvsLFJC3gA1sNjY,1108
728
- pydae-0.56.4.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
729
- pydae-0.56.4.dist-info/METADATA,sha256=Dg71icY-yXGhkgv66E1lg0kNhDU1FxMOf7vTZgVypP0,1046
730
- pydae-0.56.4.dist-info/RECORD,,
745
+ pydae-0.57.dist-info/licenses/COPYING,sha256=QWnWoslbTjQmtlFSRoGF3wxJEJuTJdlEMZ7lHtbGAeQ,1139
746
+ pydae-0.57.dist-info/licenses/LICENSE,sha256=8hQe1oM4ySdliF3R-NEvR6HqrcGDKvsLFJC3gA1sNjY,1108
747
+ pydae-0.57.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
748
+ pydae-0.57.dist-info/METADATA,sha256=RtYLcND2I5k6bKSbUwwBUCnwB8ILrJr7jsEQmLXigjY,1088
749
+ pydae-0.57.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: flit 3.9.0
2
+ Generator: flit 3.12.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any