edsger 0.1.1__cp39-cp39-win32.whl → 0.1.2__cp39-cp39-win32.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.
edsger/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.1"
1
+ __version__ = "0.1.2"
Binary file
Binary file
edsger/dijkstra.pyx CHANGED
@@ -23,6 +23,11 @@ from edsger.commons cimport (
23
23
  DTYPE_INF, UNLABELED, SCANNED, DTYPE_t, ElementState)
24
24
  cimport edsger.pq_4ary_dec_0b as pq # priority queue
25
25
 
26
+ # Memory prefetching support (x86/x64 only)
27
+ cdef extern from "prefetch_compat.h":
28
+ void prefetch_hint(char*, int) nogil
29
+ int PREFETCH_T0
30
+
26
31
 
27
32
  cpdef cnp.ndarray compute_sssp(
28
33
  cnp.uint32_t[::1] csr_indptr,
@@ -83,8 +88,17 @@ cpdef cnp.ndarray compute_sssp(
83
88
  <size_t>csr_indptr[tail_vert_idx + 1]):
84
89
 
85
90
  head_vert_idx = <size_t>csr_indices[idx]
91
+
92
+ # Prefetch next iteration data to improve cache performance
93
+ if idx + 1 < <size_t>csr_indptr[tail_vert_idx + 1]:
94
+ prefetch_hint(<char*>&csr_indices[idx + 1], PREFETCH_T0)
95
+ prefetch_hint(<char*>&csr_data[idx + 1], PREFETCH_T0)
96
+
86
97
  vert_state = pqueue.Elements[head_vert_idx].state
87
98
  if vert_state != SCANNED:
99
+ # Prefetch priority queue element data for the vertex
100
+ prefetch_hint(<char*>&pqueue.Elements[head_vert_idx], PREFETCH_T0)
101
+
88
102
  head_vert_val = tail_vert_val + csr_data[idx]
89
103
  if vert_state == UNLABELED:
90
104
  pq.insert(&pqueue, head_vert_idx, head_vert_val)
@@ -164,8 +178,17 @@ cpdef cnp.ndarray compute_sssp_w_path(
164
178
  <size_t>csr_indptr[tail_vert_idx + 1]):
165
179
 
166
180
  head_vert_idx = <size_t>csr_indices[idx]
181
+
182
+ # Prefetch next iteration data to improve cache performance
183
+ if idx + 1 < <size_t>csr_indptr[tail_vert_idx + 1]:
184
+ prefetch_hint(<char*>&csr_indices[idx + 1], PREFETCH_T0)
185
+ prefetch_hint(<char*>&csr_data[idx + 1], PREFETCH_T0)
186
+
167
187
  vert_state = pqueue.Elements[head_vert_idx].state
168
188
  if vert_state != SCANNED:
189
+ # Prefetch priority queue element data for the vertex
190
+ prefetch_hint(<char*>&pqueue.Elements[head_vert_idx], PREFETCH_T0)
191
+
169
192
  head_vert_val = tail_vert_val + csr_data[idx]
170
193
  if vert_state == UNLABELED:
171
194
  pq.insert(&pqueue, head_vert_idx, head_vert_val)
Binary file
edsger/path_tracking.pyx CHANGED
@@ -43,7 +43,7 @@ cpdef cnp.ndarray compute_path(cnp.uint32_t[::1] path_links, int vertex_idx):
43
43
  cdef int _compute_path_first_pass(
44
44
  cnp.uint32_t[::1] path_links,
45
45
  int vertex_idx
46
- ) nogil noexcept:
46
+ ) noexcept nogil:
47
47
  """Returns the path length.
48
48
  """
49
49
 
@@ -69,7 +69,7 @@ cdef void _compute_path_second_pass(
69
69
  cnp.uint32_t[::1] path_links,
70
70
  cnp.uint32_t[::1] path_vertices,
71
71
  int vertex_idx
72
- ) nogil noexcept:
72
+ ) noexcept nogil:
73
73
  """Compute the sequence of vertices forming a path.
74
74
  """
75
75
  cdef size_t i, j, k
Binary file
edsger/pq_4ary_dec_0b.pxd CHANGED
@@ -17,13 +17,13 @@ cdef struct PriorityQueue:
17
17
  size_t* A # array storing the binary tree
18
18
  Element* Elements # array storing the elements
19
19
 
20
- cdef void init_pqueue(PriorityQueue*, size_t, size_t) nogil
21
- cdef void free_pqueue(PriorityQueue*) nogil
22
- cdef void insert(PriorityQueue*, size_t, DTYPE_t) nogil
23
- cdef DTYPE_t peek(PriorityQueue*) nogil
24
- cdef size_t extract_min(PriorityQueue*) nogil
25
- cdef bint is_empty(PriorityQueue*) nogil
26
- cdef void decrease_key(PriorityQueue*, size_t, DTYPE_t) nogil
20
+ cdef void init_pqueue(PriorityQueue*, size_t, size_t) noexcept nogil
21
+ cdef void free_pqueue(PriorityQueue*) noexcept nogil
22
+ cdef void insert(PriorityQueue*, size_t, DTYPE_t) noexcept nogil
23
+ cdef DTYPE_t peek(PriorityQueue*) noexcept nogil
24
+ cdef size_t extract_min(PriorityQueue*) noexcept nogil
25
+ cdef bint is_empty(PriorityQueue*) noexcept nogil
26
+ cdef void decrease_key(PriorityQueue*, size_t, DTYPE_t) noexcept nogil
27
27
  cdef cnp.ndarray copy_keys_to_numpy(PriorityQueue*, size_t)
28
28
 
29
29
 
edsger/pq_4ary_dec_0b.pyx CHANGED
@@ -47,7 +47,7 @@ from edsger.commons cimport (
47
47
  cdef void init_pqueue(
48
48
  PriorityQueue* pqueue,
49
49
  size_t heap_length,
50
- size_t element_count) nogil noexcept:
50
+ size_t element_count) noexcept nogil:
51
51
  """
52
52
  Initialize the priority queue.
53
53
 
@@ -77,7 +77,7 @@ cdef void init_pqueue(
77
77
 
78
78
  cdef void _initialize_element(
79
79
  PriorityQueue* pqueue,
80
- size_t element_idx) nogil noexcept:
80
+ size_t element_idx) noexcept nogil:
81
81
  """
82
82
  Initialize a single element.
83
83
 
@@ -92,7 +92,7 @@ cdef void _initialize_element(
92
92
 
93
93
 
94
94
  cdef void free_pqueue(
95
- PriorityQueue* pqueue) nogil noexcept:
95
+ PriorityQueue* pqueue) noexcept nogil:
96
96
  """
97
97
  Free the priority queue.
98
98
 
@@ -107,7 +107,7 @@ cdef void free_pqueue(
107
107
  cdef void insert(
108
108
  PriorityQueue* pqueue,
109
109
  size_t element_idx,
110
- DTYPE_t key) nogil noexcept:
110
+ DTYPE_t key) noexcept nogil:
111
111
  """
112
112
  Insert an element into the heap and reorder the heap.
113
113
 
@@ -134,7 +134,7 @@ cdef void insert(
134
134
  cdef void decrease_key(
135
135
  PriorityQueue* pqueue,
136
136
  size_t element_idx,
137
- DTYPE_t key_new) nogil noexcept:
137
+ DTYPE_t key_new) noexcept nogil:
138
138
  """
139
139
  Decrease the key of a element in the heap, given its element index.
140
140
 
@@ -154,7 +154,7 @@ cdef void decrease_key(
154
154
  key_new)
155
155
 
156
156
 
157
- cdef DTYPE_t peek(PriorityQueue* pqueue) nogil noexcept:
157
+ cdef DTYPE_t peek(PriorityQueue* pqueue) noexcept nogil:
158
158
  """
159
159
  Find heap min key.
160
160
 
@@ -174,7 +174,7 @@ cdef DTYPE_t peek(PriorityQueue* pqueue) nogil noexcept:
174
174
  return pqueue.Elements[pqueue.A[0]].key
175
175
 
176
176
 
177
- cdef bint is_empty(PriorityQueue* pqueue) nogil noexcept:
177
+ cdef bint is_empty(PriorityQueue* pqueue) noexcept nogil:
178
178
  """
179
179
  Check if the heap is empty.
180
180
 
@@ -190,7 +190,7 @@ cdef bint is_empty(PriorityQueue* pqueue) nogil noexcept:
190
190
  return isempty
191
191
 
192
192
 
193
- cdef size_t extract_min(PriorityQueue* pqueue) nogil noexcept:
193
+ cdef size_t extract_min(PriorityQueue* pqueue) noexcept nogil:
194
194
  """
195
195
  Extract element with min keay from the heap,
196
196
  and return its element index.
@@ -229,7 +229,7 @@ cdef size_t extract_min(PriorityQueue* pqueue) nogil noexcept:
229
229
  cdef cnp.ndarray copy_keys_to_numpy(
230
230
  PriorityQueue* pqueue,
231
231
  size_t vertex_count
232
- ) noexcept:
232
+ ):
233
233
  """
234
234
  Copy the keys into a numpy array.
235
235
 
@@ -261,7 +261,7 @@ cdef cnp.ndarray copy_keys_to_numpy(
261
261
  cdef void _exchange_nodes(
262
262
  PriorityQueue* pqueue,
263
263
  size_t node_i,
264
- size_t node_j) nogil noexcept:
264
+ size_t node_j) noexcept nogil:
265
265
  """
266
266
  Exchange two nodes in the heap.
267
267
 
@@ -286,7 +286,7 @@ cdef void _exchange_nodes(
286
286
 
287
287
  cdef void _min_heapify(
288
288
  PriorityQueue* pqueue,
289
- size_t node_idx) nogil noexcept:
289
+ size_t node_idx) noexcept nogil:
290
290
  """
291
291
  Re-order sub-tree under a given node (given its node index)
292
292
  until it satisfies the heap property.
@@ -363,7 +363,7 @@ cdef void _min_heapify(
363
363
  cdef void _decrease_key_from_node_index(
364
364
  PriorityQueue* pqueue,
365
365
  size_t node_idx,
366
- DTYPE_t key_new) nogil noexcept:
366
+ DTYPE_t key_new) noexcept nogil:
367
367
  """
368
368
  Decrease the key of an element in the heap, given its tree index.
369
369
 
@@ -594,7 +594,7 @@ cpdef is_empty_01():
594
594
  assert is_empty(&pqueue) == 1
595
595
  insert(&pqueue, 1, 3.0)
596
596
  assert is_empty(&pqueue) == 0
597
- idx = extract_min(&pqueue)
597
+ _ = extract_min(&pqueue)
598
598
  assert is_empty(&pqueue) == 1
599
599
 
600
600
  free_pqueue(&pqueue)
@@ -652,7 +652,7 @@ cpdef decrease_key_01():
652
652
  free_pqueue(&pqueue)
653
653
 
654
654
 
655
- cdef void heapsort(DTYPE_t[::1] values_in, DTYPE_t[::1] values_out) nogil:
655
+ cdef void heapsort(DTYPE_t[::1] values_in, DTYPE_t[::1] values_out) noexcept nogil:
656
656
  """
657
657
  Heap sort by inerting all the values into the priority queue,
658
658
  and extracting them.
@@ -676,8 +676,6 @@ cpdef sort_01(int n, random_seed=124):
676
676
  and with the numpy default sort function, compare the results.
677
677
  """
678
678
 
679
- cdef PriorityQueue pqueue
680
-
681
679
  rng = np.random.default_rng(random_seed)
682
680
  values_in = rng.random(size=n)
683
681
  values_out = np.empty_like(values_in, dtype=DTYPE_PY)
@@ -0,0 +1,21 @@
1
+ #ifndef PREFETCH_COMPAT_H
2
+ #define PREFETCH_COMPAT_H
3
+
4
+ // Cross-platform memory prefetching compatibility header
5
+
6
+ #if defined(__aarch64__) || defined(_M_ARM64) || defined(__arm64__)
7
+ // ARM64 platforms - use ARM-specific prefetch
8
+ #define prefetch_hint(addr, hint) __builtin_prefetch((const void*)(addr), 0, 3)
9
+ #define PREFETCH_T0 0
10
+ #elif defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
11
+ // x86/x64 platforms - use SSE intrinsics
12
+ #include <xmmintrin.h>
13
+ #define prefetch_hint(addr, hint) _mm_prefetch((const char*)(addr), hint)
14
+ #define PREFETCH_T0 _MM_HINT_T0
15
+ #else
16
+ // Other platforms - no-op (compile time optimization will remove calls)
17
+ #define prefetch_hint(addr, hint) ((void)0)
18
+ #define PREFETCH_T0 0
19
+ #endif
20
+
21
+ #endif // PREFETCH_COMPAT_H
Binary file
Binary file
edsger/star.pyx CHANGED
@@ -204,7 +204,7 @@ cdef void _coo_to_csr_uint32(
204
204
  cnp.uint32_t [::1] Ax,
205
205
  cnp.uint32_t [::1] Bp,
206
206
  cnp.uint32_t [::1] Bj,
207
- cnp.uint32_t [::1] Bx) nogil noexcept:
207
+ cnp.uint32_t [::1] Bx) noexcept nogil:
208
208
 
209
209
  cdef:
210
210
  size_t i, row, dest
@@ -280,7 +280,7 @@ cpdef void _coo_to_csr_float64(
280
280
  cnp.float64_t [::1] Ax,
281
281
  cnp.uint32_t [::1] Bp,
282
282
  cnp.uint32_t [::1] Bj,
283
- cnp.float64_t [::1] Bx) nogil noexcept:
283
+ cnp.float64_t [::1] Bx) noexcept nogil:
284
284
 
285
285
  cdef:
286
286
  size_t i, row, dest
@@ -318,7 +318,7 @@ cpdef void _coo_to_csc_float64(
318
318
  cnp.float64_t [::1] Ax,
319
319
  cnp.uint32_t [::1] Bp,
320
320
  cnp.uint32_t [::1] Bi,
321
- cnp.float64_t [::1] Bx) nogil noexcept:
321
+ cnp.float64_t [::1] Bx) noexcept nogil:
322
322
 
323
323
  cdef:
324
324
  size_t i, col, dest
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edsger
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Graph algorithms in Cython.
5
5
  Author-email: François Pacull <francois.pacull@architecture-performance.fr>
6
6
  Maintainer-email: François Pacull <francois.pacull@architecture-performance.fr>
@@ -70,20 +70,19 @@ from edsger.path import Dijkstra
70
70
  edges = pd.DataFrame({
71
71
  'tail': [0, 0, 1, 2, 2, 3],
72
72
  'head': [1, 2, 2, 3, 4, 4],
73
- 'weight': [1, 4, 2, 1, 3, 1]
73
+ 'weight': [1, 4, 2, 1.5, 3, 1]
74
74
  })
75
75
  edges
76
76
  ```
77
77
 
78
- | | tail | head | weight |
79
- |---:|-------:|-------:|---------:|
80
- | 0 | 0 | 1 | 1 |
81
- | 1 | 0 | 2 | 4 |
82
- | 2 | 1 | 2 | 2 |
83
- | 3 | 2 | 3 | 1 |
84
- | 4 | 2 | 4 | 3 |
85
- | 5 | 3 | 4 | 1 |
86
-
78
+ | | tail | head | weight |
79
+ |---:|-------:|-------:|---------:|
80
+ | 0 | 0 | 1 | 1.0 |
81
+ | 1 | 0 | 2 | 4.0 |
82
+ | 2 | 1 | 2 | 2.0 |
83
+ | 3 | 2 | 3 | 1.5 |
84
+ | 4 | 2 | 4 | 3.0 |
85
+ | 5 | 3 | 4 | 1.0 |
87
86
 
88
87
  ```python
89
88
  # Initialize the Dijkstra object
@@ -94,10 +93,18 @@ shortest_paths = dijkstra.run(vertex_idx=0)
94
93
  print("Shortest paths:", shortest_paths)
95
94
  ```
96
95
 
97
- Shortest paths: [0. 1. 3. 4. 5.]
96
+ Shortest paths: [0. 1. 3. 4.5 5.5]
98
97
 
99
98
  We get the shortest paths from the source node 0 to all other nodes in the graph. The output is an array with the shortest path length to each node. A path length is the sum of the weights of the edges in the path.
100
99
 
100
+ ## Why Use Edsger?
101
+
102
+ Edsger is designed to be **dataframe-friendly**, providing seamless integration with pandas workflows for graph algorithms. Also it is rather efficient. Our benchmarks on the USA road network (23.9M vertices, 57.7M edges) demonstrate nice performance:
103
+
104
+ <img src="docs/source/assets/dijkstra_benchmark_comparison.png" alt="Dijkstra Performance Comparison" width="700">
105
+
106
+ *Benchmark performed on Intel i9-12900H laptop.*
107
+
101
108
  ## Contributing
102
109
 
103
110
  We welcome contributions to the Edsger library. If you have any suggestions, bug reports, or feature requests, please open an issue on our [GitHub repository](https://github.com/aetperf/Edsger).
@@ -0,0 +1,27 @@
1
+ edsger/.gitignore,sha256=mr9Izcwvjgv215xjRKhWEZ7vsyrKWhMqvWjSLHRYDjk,13
2
+ edsger/__init__.py,sha256=lgtGe3cqdwWdO1DLEOx7fX3i8D4Z_2rXHSq7Xecf-NM,41
3
+ edsger/_version.py,sha256=K5SiDdEGYMpdqXThrqwTqECJJBOQNTQDrnpc2K5mzKs,21
4
+ edsger/commons.cp39-win32.pyd,sha256=825_KAmdxCsMTXKERrb1X_Ma5Vv-wlb64a1H8QRpixo,19968
5
+ edsger/commons.pxd,sha256=UshKjr5ve3Or9u75xGyGPKRz1RwCCb5N-xgNevXZ4j4,464
6
+ edsger/commons.pyx,sha256=6Ze22eE_zwXPRAe550DEhEvu-b7hvKmwQu73rzzWMUE,839
7
+ edsger/dijkstra.cp39-win32.pyd,sha256=xCV8RFI7dJ09R6cIf9ffFtIS8j6oG7hJIXLqRoKtX-k,165376
8
+ edsger/dijkstra.pyx,sha256=5yjCC2NqXrfBe8tp1sN_XSsWF92IHFrOu-QdbOV8Rvo,17915
9
+ edsger/networks.py,sha256=hH9sgT5Ic4TLVCjxPNzMDWNjNDbqpXMxXxLeWxCpdLE,10730
10
+ edsger/path.py,sha256=OnXbP8Mf1rcO_9m6XsDrdXCRcLMeOb2vOAb1eHcZfM8,30395
11
+ edsger/path_tracking.cp39-win32.pyd,sha256=7IppG2qmxPYQ7eWjUWJAKPWo3PGBRqPhzkHYbYbN0FI,109056
12
+ edsger/path_tracking.pyx,sha256=H24TLmC53I8LjbM1S5E7gS8WEb5uE_PZ8nhG6BteMYA,1900
13
+ edsger/pq_4ary_dec_0b.cp39-win32.pyd,sha256=_0XomEQ8n8_sYtd2QBDyN2H4v-ygFZk5rc9GL5RoOf8,132608
14
+ edsger/pq_4ary_dec_0b.pxd,sha256=VvXcQzJq3OGBptrbawtemagPimuqSCayGQ91Jrad894,1098
15
+ edsger/pq_4ary_dec_0b.pyx,sha256=IzvzQerf-LYy7weQpgI0f28Q8gUrR4ENaedekXs1Jeg,18486
16
+ edsger/prefetch_compat.h,sha256=AyAYq_ZHKk5ChaJDrZOAOYe6SprL0_2byjRbjcBGrsU,826
17
+ edsger/spiess_florian.cp39-win32.pyd,sha256=5xarQgyWL-DJUXlowcMqw7daPR6B6lqL4Qp1piDuhrk,156160
18
+ edsger/spiess_florian.pyx,sha256=tjfF9Iv8nqpp4lnv4KAjF-37ij0_SgQ0fnacVVKx-CE,9934
19
+ edsger/star.cp39-win32.pyd,sha256=8-fnUSx0ei4aONNlpUrby-1KUqG5-9yN0u5QNAORsm0,147456
20
+ edsger/star.pyx,sha256=9LAIXhlccEeDgT41ico7n57FJ7PKCzhPv4f22Lphn78,9602
21
+ edsger/utils.py,sha256=xYfOFIbYpAiZljhUOgGWy0TVNvWaMFCwbCLPBkzdVos,2097
22
+ edsger-0.1.2.dist-info/licenses/AUTHORS.rst,sha256=8udN6bgZHdHYcVzV38y6SPnF-x6Ks0uXxxFsic6Aces,110
23
+ edsger-0.1.2.dist-info/licenses/LICENSE,sha256=w7gRlruGxK3_4KTZAyJsOR2tML4UQgB-GNm2LerwJS0,1132
24
+ edsger-0.1.2.dist-info/METADATA,sha256=Z2KnsYE4vh_m5tvRYU-LIyDso2Kpdl7iQQeFYH_zfhM,5273
25
+ edsger-0.1.2.dist-info/WHEEL,sha256=Q3uEVTFw-CqGed7ywmQZcdvBC5FiRV941NvAhTjjkOQ,95
26
+ edsger-0.1.2.dist-info/top_level.txt,sha256=QvhzFORJIIot6GzSnDrtGa9KQt9iifCbOC5ULlzY5dg,7
27
+ edsger-0.1.2.dist-info/RECORD,,
@@ -1,26 +0,0 @@
1
- edsger/.gitignore,sha256=mr9Izcwvjgv215xjRKhWEZ7vsyrKWhMqvWjSLHRYDjk,13
2
- edsger/__init__.py,sha256=lgtGe3cqdwWdO1DLEOx7fX3i8D4Z_2rXHSq7Xecf-NM,41
3
- edsger/_version.py,sha256=8oAxKUG747GUokmxjkrWejyJa5yPNEsoJDlXxoedxTw,21
4
- edsger/commons.cp39-win32.pyd,sha256=GaKm6rRj-zJrXLBlYbRELS2MZQwkZ5FYjE3tt5Gnb2M,19968
5
- edsger/commons.pxd,sha256=UshKjr5ve3Or9u75xGyGPKRz1RwCCb5N-xgNevXZ4j4,464
6
- edsger/commons.pyx,sha256=6Ze22eE_zwXPRAe550DEhEvu-b7hvKmwQu73rzzWMUE,839
7
- edsger/dijkstra.cp39-win32.pyd,sha256=4N-W2IhymcGqfQOw4LcPu4kHUms5ZcZCUyJqjS1q3mo,165888
8
- edsger/dijkstra.pyx,sha256=0Hs3ccSGWpKx53md3kHye344u63KaunHj_gmG3_T8EE,16830
9
- edsger/networks.py,sha256=hH9sgT5Ic4TLVCjxPNzMDWNjNDbqpXMxXxLeWxCpdLE,10730
10
- edsger/path.py,sha256=OnXbP8Mf1rcO_9m6XsDrdXCRcLMeOb2vOAb1eHcZfM8,30395
11
- edsger/path_tracking.cp39-win32.pyd,sha256=HCR99wtXAHcWQVA9bpANV8mCNIvmflRcx9dBPZph2FI,109056
12
- edsger/path_tracking.pyx,sha256=ZyIJQucG4-pyltgjsfGuZ7B6d0bFeovCuNh34LrBSvM,1900
13
- edsger/pq_4ary_dec_0b.cp39-win32.pyd,sha256=rOFeMCG2nNQ6iAs3lYdZ9HQ_a1ef06HnVIt23FIWouI,132608
14
- edsger/pq_4ary_dec_0b.pxd,sha256=s0IsejKiG95SPgS3EX8rG86w1gzEyAkXJMaq5zj3HzE,1035
15
- edsger/pq_4ary_dec_0b.pyx,sha256=x9rDOYMAjS6uCyp_VQYrI1yFBY4va4sTLXn05be4rTo,18521
16
- edsger/spiess_florian.cp39-win32.pyd,sha256=BOZZlvBqhk1D_eXFtEhgK9OjL8DmJVD0B6iqyAWn9FI,156672
17
- edsger/spiess_florian.pyx,sha256=tjfF9Iv8nqpp4lnv4KAjF-37ij0_SgQ0fnacVVKx-CE,9934
18
- edsger/star.cp39-win32.pyd,sha256=FaToID7IeHO5cuXqMxFiXXH7CuVT1r2IEEGC97CSqw8,147456
19
- edsger/star.pyx,sha256=50sopL56DnCQokHORsJ4IydQv_Zqs39W3WZLnadwgfk,9602
20
- edsger/utils.py,sha256=xYfOFIbYpAiZljhUOgGWy0TVNvWaMFCwbCLPBkzdVos,2097
21
- edsger-0.1.1.dist-info/licenses/AUTHORS.rst,sha256=8udN6bgZHdHYcVzV38y6SPnF-x6Ks0uXxxFsic6Aces,110
22
- edsger-0.1.1.dist-info/licenses/LICENSE,sha256=w7gRlruGxK3_4KTZAyJsOR2tML4UQgB-GNm2LerwJS0,1132
23
- edsger-0.1.1.dist-info/METADATA,sha256=I6IBbA-l70HNaSOT9dlFffY90wm0eeXqbukb_-no2qo,4789
24
- edsger-0.1.1.dist-info/WHEEL,sha256=Q3uEVTFw-CqGed7ywmQZcdvBC5FiRV941NvAhTjjkOQ,95
25
- edsger-0.1.1.dist-info/top_level.txt,sha256=QvhzFORJIIot6GzSnDrtGa9KQt9iifCbOC5ULlzY5dg,7
26
- edsger-0.1.1.dist-info/RECORD,,
File without changes