geometallurgy 0.4.10__py3-none-any.whl → 0.4.12__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.
elphick/geomet/base.py CHANGED
@@ -2,6 +2,7 @@ import copy
2
2
  import inspect
3
3
  import logging
4
4
  import re
5
+ import uuid
5
6
  from abc import ABC
6
7
  from pathlib import Path
7
8
  from typing import Optional, Union, Literal, TypeVar, TYPE_CHECKING
@@ -15,7 +16,6 @@ from elphick.geomet.config import read_yaml
15
16
  from elphick.geomet.utils.components import get_components, is_compositional
16
17
  from elphick.geomet.utils.moisture import solve_mass_moisture
17
18
  from elphick.geomet.utils.pandas import mass_to_composition, composition_to_mass, composition_factors
18
- from elphick.geomet.utils.sampling import random_int
19
19
  from elphick.geomet.utils.timer import log_timer
20
20
  from .config.config_read import get_column_config
21
21
  from .plot import parallel_plot, comparison_plot
@@ -714,8 +714,8 @@ class MassComposition(ABC):
714
714
  comp: 'Stream'
715
715
 
716
716
  # create the relationships
717
- ref.nodes = [self.nodes[1], random_int()]
718
- comp.nodes = [self.nodes[1], random_int()]
717
+ ref.nodes = [self.nodes[1], uuid.uuid4()]
718
+ comp.nodes = [self.nodes[1], uuid.uuid4()]
719
719
 
720
720
  return ref, comp
721
721
 
@@ -747,7 +747,7 @@ class MassComposition(ABC):
747
747
 
748
748
  # create the relationships
749
749
  other.nodes = [other.nodes[0], self.nodes[1]]
750
- res.nodes = [self.nodes[1], random_int()]
750
+ res.nodes = [self.nodes[1], uuid.uuid4()]
751
751
 
752
752
  return res
753
753
 
@@ -780,7 +780,7 @@ class MassComposition(ABC):
780
780
 
781
781
  # create the relationships
782
782
  other.nodes = [self.nodes[1], other.nodes[1]]
783
- res.nodes = [self.nodes[1], random_int()]
783
+ res.nodes = [self.nodes[1], uuid.uuid4()]
784
784
 
785
785
  return res
786
786
 
@@ -1,6 +1,7 @@
1
1
  import copy
2
2
  import json
3
3
  import logging
4
+ import uuid
4
5
  from pathlib import Path
5
6
  from typing import Dict, List, Optional, Tuple, Union, TypeVar, TYPE_CHECKING
6
7
  import re
@@ -15,6 +16,7 @@ import seaborn as sns
15
16
  import yaml
16
17
  from matplotlib import pyplot as plt
17
18
  from matplotlib.colors import ListedColormap, LinearSegmentedColormap
19
+ from networkx.algorithms.dag import is_directed_acyclic_graph
18
20
  from plotly.subplots import make_subplots
19
21
 
20
22
  from elphick.geomet import Sample
@@ -24,7 +26,6 @@ from elphick.geomet.flowsheet.operation import NodeType, OP, PartitionOperation,
24
26
  from elphick.geomet.plot import parallel_plot, comparison_plot
25
27
  from elphick.geomet.utils.layout import digraph_linear_layout
26
28
  from elphick.geomet.flowsheet.loader import streams_from_dataframe
27
- from elphick.geomet.utils.sampling import random_int
28
29
 
29
30
  # if TYPE_CHECKING:
30
31
  from elphick.geomet.flowsheet.stream import Stream
@@ -306,6 +307,12 @@ class Flowsheet:
306
307
  def solve(self):
307
308
  """Solve missing streams"""
308
309
 
310
+ if not is_directed_acyclic_graph(self.graph):
311
+ self._logger.error("Graph is not a Directed Acyclic Graph (DAG), so cannot be solved.")
312
+ self._logger.debug(f"Graph nodes: {self.graph.nodes(data=True)}")
313
+ self._logger.debug(f"Graph edges: {self.graph.edges(data=True)}")
314
+ raise ValueError("Graph is not a Directed Acyclic Graph (DAG), so cannot be solved.")
315
+
309
316
  # Check the number of missing mc's on edges in the network
310
317
  missing_count: int = sum([1 for u, v, d in self.graph.edges(data=True) if d['mc'] is None])
311
318
  prev_missing_count = missing_count + 1 # Initialize with a value greater than missing_count
@@ -350,6 +357,12 @@ class Flowsheet:
350
357
  self.set_operation_data(node)
351
358
 
352
359
  missing_count: int = sum([1 for u, v, d in self.graph.edges(data=True) if d['mc'] is None])
360
+ self._logger.info(f"Missing count: {missing_count}")
361
+
362
+ if missing_count > 0:
363
+ self._logger.error(f"Failed to solve the flowsheet. Missing count: {missing_count}")
364
+ raise ValueError(
365
+ f"Failed to solve the flowsheet. Some streams are still missing. Missing count: {missing_count}")
353
366
 
354
367
  def query(self, expr: str, stream_name: Optional[str] = None, inplace=False) -> 'Flowsheet':
355
368
  """Reduce the Flowsheet Stream records with a query
@@ -424,6 +437,8 @@ class Flowsheet:
424
437
  degrees = {n: d for n, d in self.graph.degree()}
425
438
 
426
439
  res: list[MC] = [d['mc'] for u, v, d in self.graph.edges(data=True) if degrees[u] == 1]
440
+ if not res:
441
+ raise ValueError("No input streams found")
427
442
  return res
428
443
 
429
444
  def get_output_streams(self) -> list[MC]:
@@ -437,6 +452,8 @@ class Flowsheet:
437
452
  degrees = {n: d for n, d in self.graph.degree()}
438
453
 
439
454
  res: list[MC] = [d['mc'] for u, v, d in self.graph.edges(data=True) if degrees[v] == 1]
455
+ if not res:
456
+ raise ValueError("No output streams found")
440
457
  return res
441
458
 
442
459
  @staticmethod
@@ -1036,6 +1053,7 @@ class Flowsheet:
1036
1053
  if ('mc' in self.graph.nodes[node].keys()) and (node in node_names.keys()):
1037
1054
  self.graph.nodes[node]['mc'].name = node_names[node]
1038
1055
 
1056
+
1039
1057
  def set_stream_data(self, stream_data: dict[str, Optional[MC]]):
1040
1058
  """Set the data (MassComposition) of network edges (streams) with a Dict"""
1041
1059
  for stream_name, stream_data in stream_data.items():
@@ -1057,6 +1075,7 @@ class Flowsheet:
1057
1075
  self.graph.nodes[node]['mc'].outputs = [self.graph.get_edge_data(e[0], e[1])['mc'] for e in
1058
1076
  self.graph.out_edges(node)]
1059
1077
 
1078
+
1060
1079
  def set_operation_data(self, node):
1061
1080
  """Set the input and output data for a node.
1062
1081
  Uses the data on the edges (streams) connected to the node to refresh the data and check for node balance.
@@ -1066,6 +1085,7 @@ class Flowsheet:
1066
1085
  node_data.outputs = [self.graph.get_edge_data(e[0], e[1])['mc'] for e in self.graph.out_edges(node)]
1067
1086
  node_data.check_balance()
1068
1087
 
1088
+
1069
1089
  def streams_to_dict(self) -> Dict[str, MC]:
1070
1090
  """Export the Stream objects to a Dict
1071
1091
 
@@ -1079,6 +1099,7 @@ class Flowsheet:
1079
1099
  streams[data['mc'].name] = data['mc']
1080
1100
  return streams
1081
1101
 
1102
+
1082
1103
  def nodes_to_dict(self) -> Dict[int, OP]:
1083
1104
  """Export the MCNode objects to a Dict
1084
1105
 
@@ -1092,13 +1113,14 @@ class Flowsheet:
1092
1113
  nodes[node] = self.graph.nodes[node]['mc']
1093
1114
  return nodes
1094
1115
 
1116
+
1095
1117
  def set_nodes(self, stream: str, nodes: Tuple[int, int]):
1096
1118
  mc: MC = self.get_stream_by_name(stream)
1097
1119
  mc._nodes = nodes
1098
1120
  self._update_graph(mc)
1099
1121
 
1100
- def reset_nodes(self, stream: Optional[str] = None):
1101
1122
 
1123
+ def reset_nodes(self, stream: Optional[str] = None):
1102
1124
  """Reset stream nodes to break relationships
1103
1125
 
1104
1126
  Args:
@@ -1112,13 +1134,14 @@ class Flowsheet:
1112
1134
  if stream is None:
1113
1135
  streams: Dict[str, MC] = self.streams_to_dict()
1114
1136
  for k, v in streams.items():
1115
- streams[k] = v.set_nodes([random_int(), random_int()])
1137
+ streams[k] = v.set_nodes([uuid.uuid4(), uuid.uuid4()])
1116
1138
  self.graph = Flowsheet(name=self.name).from_objects(objects=list(streams.values())).graph
1117
1139
  else:
1118
1140
  mc: MC = self.get_stream_by_name(stream)
1119
- mc.set_nodes([random_int(), random_int()])
1141
+ mc.set_nodes([uuid.uuid4(), uuid.uuid4()])
1120
1142
  self._update_graph(mc)
1121
1143
 
1144
+
1122
1145
  def _update_graph(self, mc: MC):
1123
1146
  """Update the graph with an existing stream object
1124
1147
 
@@ -1137,6 +1160,7 @@ class Flowsheet:
1137
1160
  strms.append(a['mc'])
1138
1161
  self.graph = Flowsheet(name=self.name).from_objects(objects=strms).graph
1139
1162
 
1163
+
1140
1164
  def get_stream_by_name(self, name: str) -> MC:
1141
1165
  """Get the Stream object from the network by its name
1142
1166
 
@@ -1157,18 +1181,20 @@ class Flowsheet:
1157
1181
 
1158
1182
  return res
1159
1183
 
1184
+
1160
1185
  def set_stream_parent(self, stream: str, parent: str):
1161
1186
  mc: MC = self.get_stream_by_name(stream)
1162
1187
  mc.set_parent_node(self.get_stream_by_name(parent))
1163
1188
  self._update_graph(mc)
1164
1189
 
1190
+
1165
1191
  def set_stream_child(self, stream: str, child: str):
1166
1192
  mc: MC = self.get_stream_by_name(stream)
1167
1193
  mc.set_child_node(self.get_stream_by_name(child))
1168
1194
  self._update_graph(mc)
1169
1195
 
1170
- def reset_stream_nodes(self, stream: Optional[str] = None):
1171
1196
 
1197
+ def reset_stream_nodes(self, stream: Optional[str] = None):
1172
1198
  """Reset stream nodes to break relationships
1173
1199
 
1174
1200
  Args:
@@ -1182,9 +1208,9 @@ class Flowsheet:
1182
1208
  if stream is None:
1183
1209
  streams: Dict[str, MC] = self.streams_to_dict()
1184
1210
  for k, v in streams.items():
1185
- streams[k] = v.set_nodes([random_int(), random_int()])
1211
+ streams[k] = v.set_nodes([uuid.uuid4(), uuid.uuid4()])
1186
1212
  self.graph = Flowsheet(name=self.name).from_objects(objects=list(streams.values())).graph
1187
1213
  else:
1188
1214
  mc: MC = self.get_stream_by_name(stream)
1189
- mc.set_nodes([random_int(), random_int()])
1215
+ mc.set_nodes([uuid.uuid4(), uuid.uuid4()])
1190
1216
  self._update_graph(mc)
@@ -1,10 +1,12 @@
1
+ import uuid
2
+
1
3
  from elphick.geomet.base import MassComposition
2
4
 
3
5
 
4
6
  class Stream(MassComposition):
5
7
  def __init__(self, *args, **kwargs):
6
8
  super().__init__(*args, **kwargs)
7
- self.nodes = [self.random_int(), self.random_int()]
9
+ self.nodes = [uuid.uuid4(), uuid.uuid4()]
8
10
 
9
11
  def set_parent_node(self, parent: 'Stream') -> 'Stream':
10
12
  self.nodes = [parent.nodes[1], self.nodes[1]]
@@ -15,14 +17,13 @@ class Stream(MassComposition):
15
17
  return self
16
18
 
17
19
  def set_nodes(self, nodes: list) -> 'Stream':
20
+ if len(nodes) != 2:
21
+ raise ValueError('Nodes must be a list of length 2')
22
+ if nodes[0] == nodes[1]:
23
+ raise ValueError('Nodes must be different')
18
24
  self.nodes = nodes
19
25
  return self
20
26
 
21
- @staticmethod
22
- def random_int():
23
- import random
24
- return random.randint(0, 100)
25
-
26
27
  # @classmethod
27
28
  # def from_mass_composition(cls, obj: MassComposition) -> 'Stream':
28
29
  # filtered_kwargs = filter_kwargs(obj, **obj.__dict__)
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import functools
4
+ import uuid
4
5
  from pathlib import Path
5
6
  from typing import Optional, Literal, Callable, Union, Iterable, TYPE_CHECKING
6
7
 
@@ -18,7 +19,6 @@ from elphick.geomet.utils.interp import mass_preserving_interp
18
19
  from elphick.geomet.utils.interp2 import mass_preserving_interp_2d
19
20
  from elphick.geomet.utils.pandas import MeanIntervalIndex, weight_average, calculate_recovery, calculate_partition, \
20
21
  cumulate, mass_to_composition
21
- from elphick.geomet.utils.sampling import random_int
22
22
 
23
23
  from elphick.geomet.base import MassComposition
24
24
 
@@ -146,10 +146,10 @@ class IntervalSample(MassComposition):
146
146
 
147
147
  sample_1 = self.create_congruent_object(name=name_1).to_stream()
148
148
  sample_1.mass_data = self.mass_data.copy().multiply(pn, axis=0)
149
- sample_1.set_nodes([self.nodes[1], random_int()])
149
+ sample_1.set_nodes([self.nodes[1], uuid.uuid4()])
150
150
  sample_2 = self.create_congruent_object(name=name_2)
151
151
  sample_2.mass_data = self.mass_data.copy().multiply((1 - pn), axis=0)
152
- sample_2.set_nodes([self.nodes[1], random_int()])
152
+ sample_2.set_nodes([self.nodes[1], uuid.uuid4()])
153
153
 
154
154
  return sample_1, sample_2
155
155
 
@@ -585,6 +585,7 @@ class IntervalSample(MassComposition):
585
585
  df_upsampled: pd.DataFrame = mass_preserving_interp(self.mass_data,
586
586
  interval_edges=interval_edges, precision=precision,
587
587
  include_original_edges=include_original_edges,
588
+ mass_wet=None, mass_dry=self.mass_dry_var,
588
589
  interval_data_as_mass=True)
589
590
 
590
591
  obj: IntervalSample = IntervalSample(df_upsampled, name=self.name, moisture_in_scope=False,
@@ -9,7 +9,7 @@ from elphick.geomet.utils.pandas import composition_to_mass, mass_to_composition
9
9
 
10
10
  def mass_preserving_interp(df_intervals: pd.DataFrame, interval_edges: Union[Iterable, int],
11
11
  include_original_edges: bool = True, precision: Optional[int] = None,
12
- mass_wet: str = 'mass_wet', mass_dry: str = 'mass_dry',
12
+ mass_wet: Optional[str] = 'mass_wet', mass_dry: str = 'mass_dry',
13
13
  interval_data_as_mass: bool = False) -> pd.DataFrame:
14
14
  """Interpolate with zero mass loss using pchip
15
15
 
@@ -81,7 +81,7 @@ def mass_preserving_interp(df_intervals: pd.DataFrame, interval_edges: Union[Ite
81
81
  # if the new grid extrapolates (on the coarse side), mass will be lost, so we assume that when extrapolating.
82
82
  # the mass in the extrapolated fractions is zero. By inserting these records the spline will conform.
83
83
  x_extra = grid_vals[grid_vals > mass_cum.index.max()]
84
- if x_extra:
84
+ if len(x_extra) > 0:
85
85
  cum_max: pd.Series = mass_cum.iloc[-1, :]
86
86
  mass_cum = mass_cum.reindex(index=mass_cum.index.append(pd.Index(x_extra))) # reindex to enable insert
87
87
  mass_cum.loc[x_extra, :] = cum_max.values
@@ -180,7 +180,8 @@ def mass_preserving_interp_2d(intervals: pd.DataFrame, interval_edges: dict[str,
180
180
  # proportion the dim_1 interpolated values by the dim_2 recovery
181
181
  new_vals: pd.DataFrame = dim_2_deportment.mul(filtered_intervals_mass.loc[dim_1_interp_interval].values)
182
182
  # create a multiindex by combining the dim_1 and dim_2 intervals
183
- new_index = pd.MultiIndex.from_arrays([pd.IntervalIndex([dim_1_interp_interval] * len(new_vals)), new_vals.index])
183
+ new_index = pd.MultiIndex.from_arrays(
184
+ [pd.IntervalIndex([dim_1_interp_interval] * len(new_vals)), new_vals.index])
184
185
  new_vals.index = new_index
185
186
  chunks.append(new_vals)
186
187
 
@@ -190,4 +191,3 @@ def mass_preserving_interp_2d(intervals: pd.DataFrame, interval_edges: dict[str,
190
191
  # convert to composition
191
192
  res = mass_to_composition(res, mass_dry=mass_dry)
192
193
  return res
193
-
@@ -88,7 +88,7 @@ def composition_to_mass(df: pd.DataFrame,
88
88
  df: The pd.DataFrame containing mass. H2O if provided will be ignored. All columns other than the
89
89
  mass_wet and mass_dry are assumed to be `additive`, that is, dry mass weighting is valid.
90
90
  Assumes composition is in %w/w units.
91
- mass_wet: The wet mass column, optional. If not provided, it's assumed to be equal to mass_dry.
91
+ mass_wet: The wet mass column, optional.
92
92
  mass_dry: The dry mass column, not optional. Consider solve_mass_moisture prior to this call if needed.
93
93
  moisture_column_name: if mass_wet is provided, the resultant moisture will be returned with this column name.
94
94
  If None, and moisture is detected in the input, that column name will be used instead.
@@ -10,7 +10,7 @@ from typing import Union
10
10
 
11
11
  class MyLogger:
12
12
  def __init__(self):
13
- logging.basicConfig(level=logging.INFO,
13
+ logging.basicConfig(level=logging.DEBUG,
14
14
  format=' %(asctime)s - %(levelname)s - %(message)s')
15
15
 
16
16
  def get_logger(self, name=None):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geometallurgy
3
- Version: 0.4.10
3
+ Version: 0.4.12
4
4
  Summary: Tools for the geometallurgist
5
5
  Home-page: https://github.com/elphick/geometallurgy
6
6
  Author: Greg
@@ -1,5 +1,5 @@
1
1
  elphick/geomet/__init__.py,sha256=gcaArz-agLsm_Tf9KNvmGznw4Jml2QTjj_CxKUC1Ejg,274
2
- elphick/geomet/base.py,sha256=4e4cJUDUPsVgv6xEyU8ML9xYUkOznCLPidQB3fXcVnM,50644
2
+ elphick/geomet/base.py,sha256=vp0C7DEAAUDGhTdQ8_Hz9WmqZRjNGn7m5CqEGy3L_98,50603
3
3
  elphick/geomet/block_model.py,sha256=Q-LEdILajUoteO0834IXeS75k8pcPqSaMrinMcWD8R4,14639
4
4
  elphick/geomet/config/__init__.py,sha256=F94hbxN3KzSaljbElIGVhdEwX0FKmHxST4jJ7rNohxY,35
5
5
  elphick/geomet/config/config_read.py,sha256=frRwfRwUXpgxwMNCiBVFUw1-yPbBHs3h2KjmzXImvxY,1396
@@ -15,11 +15,11 @@ elphick/geomet/datasets/register.csv,sha256=-N3F6L0097C-I79axINi_ewFAxiqbT_SOSW3
15
15
  elphick/geomet/datasets/sample_data.py,sha256=jt5DWxdMmPbZGDuon2s8Q2wlX3cEegB0dSmRKF4pz4I,7684
16
16
  elphick/geomet/extras.py,sha256=0yDwbPMylP21EOo27juu4gUiewygSXLSjggYDrPvDcQ,1128
17
17
  elphick/geomet/flowsheet/__init__.py,sha256=-lxSLPZNQfiLXKZ2qqS5XbbhrZA2ABi3ppx0LaHnNEI,33
18
- elphick/geomet/flowsheet/flowsheet.py,sha256=ZSTXcdIo8ERRFsgDU8x1Wdh49mVDi4cIi5AY8hH8Yg8,51105
18
+ elphick/geomet/flowsheet/flowsheet.py,sha256=__kgowBIyWfvXcdPWCFihoEUdOqTj7KszSbKGF1AkBo,52032
19
19
  elphick/geomet/flowsheet/loader.py,sha256=8nd9Vqbg1de35iuoc4mdRFxrUsIBZed0ivXIAu80jBk,4756
20
20
  elphick/geomet/flowsheet/operation.py,sha256=f8k0-Gr_Uy2SlEp8bwAaG4yeBa3DU0HoPn9wyWhYipE,9720
21
- elphick/geomet/flowsheet/stream.py,sha256=RL4ZNcSm-u0MwdXp1gWq2q6FTnPs5q4xIOavs9FEDVg,1286
22
- elphick/geomet/interval_sample.py,sha256=6Cu9hN6Vnl8w3Tuzs7YP7Fv4H7-70vw-tJimJbP96Ng,31258
21
+ elphick/geomet/flowsheet/stream.py,sha256=NOXcYeZLSmOSoSRFc7M36Jc8c1ARgjiCvtRuixYfuqA,1370
22
+ elphick/geomet/interval_sample.py,sha256=fhcWBTA01TqvCBsJv7dzWZHRBpw_4W2Ahawks5SPj28,31320
23
23
  elphick/geomet/io.py,sha256=tZsX_getGxL07dPlF3Ozyzvt2tFHE5OdgPM5pc5xL68,15709
24
24
  elphick/geomet/plot.py,sha256=e9uz8L3QZ23CW4OYm78NhdZl01i0DxHfC4r1kigz7Ss,5732
25
25
  elphick/geomet/profile.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -30,20 +30,19 @@ elphick/geomet/utils/block_model_converter.py,sha256=REYbS4cu-8z0IzCpuU9ISlPnAvx
30
30
  elphick/geomet/utils/components.py,sha256=oDR8w7aFKRP38u98yfHp-8MtOaG-c0YcGtwNjgrhGWA,3546
31
31
  elphick/geomet/utils/data.py,sha256=AnQ3JXEt2M-T5doGljM_fvdX1CvGbMr6wwjxqcw0fjs,1983
32
32
  elphick/geomet/utils/estimates.py,sha256=-x6KDQb-04IrxN8yO38Fx93F6_SGG67koagCtYBtW3c,4892
33
- elphick/geomet/utils/interp.py,sha256=VLzz1ui5j7iyYDKtJeZ8FIdArYEPipuvgW9iAquoBi0,10644
33
+ elphick/geomet/utils/interp.py,sha256=9lb2sEFfAWYzFECybLPD4nF0S85Xo37nNkxU1DG__A4,10679
34
34
  elphick/geomet/utils/interp2.py,sha256=ybuQBNTQOdVzmVYOhQDx2LkGKpl8yxgbQPz_hwS8ClQ,6633
35
35
  elphick/geomet/utils/layout.py,sha256=-c1EF-G0qGRQbLrrTS-LsbII-lnvw71y97iUBLd02do,2080
36
36
  elphick/geomet/utils/moisture.py,sha256=t9WMwADyz-QAMW-cdah1tIlzTDrhooSoKOPdIlVQHvU,2192
37
- elphick/geomet/utils/pandas.py,sha256=prMAtLlgRJaFICwbZXX7Fn4R_PbzJsVoLWsr7oYEcN8,17452
37
+ elphick/geomet/utils/pandas.py,sha256=6sKl3WUjXLR7qFmqBzuCjnfCoUsLRapwZk2nO5BfzYI,17397
38
38
  elphick/geomet/utils/parallel.py,sha256=l38JBTkCmdqKHQkS8njoA-sBN9XQGkhF59XtAhWShgs,842
39
39
  elphick/geomet/utils/partition.py,sha256=U0jFpvdvZJVdutfB6RzUzKfO9NWCGtBkeySx-QbP-l4,1534
40
- elphick/geomet/utils/sampling.py,sha256=qwf1ZUjsg431rpFqto_8WxLwlMCGyC5bWUlPXo-nHIM,61
41
40
  elphick/geomet/utils/size.py,sha256=EmV_sv2bOImQN3s7TWCniU_y83HNJEPtZH7fMMkYTcc,2272
42
- elphick/geomet/utils/timer.py,sha256=J09nGNSkH8jdHzSmY1F3goBmycDacVe0SUMEhj7ATzw,3111
41
+ elphick/geomet/utils/timer.py,sha256=8WNKLFcINRsZ3IsKtOIZ77YbKtqczyOOTEWY9h9Uxxw,3112
43
42
  elphick/geomet/utils/viz.py,sha256=M0CnfDXBHtYb8aak1Sfz6XLvRSmkzX3ybIDllEmDR8A,1718
44
43
  elphick/geomet/validate.py.hide,sha256=qAWJlgq0jp19UakVV0dEU_AsqV_JctUn1QTHn8cCRw0,6738
45
- geometallurgy-0.4.10.dist-info/LICENSE,sha256=GrSVdcGtNbGvAYC_tIjLHBrIVPyg-Ksfe7ZGr087yCI,1069
46
- geometallurgy-0.4.10.dist-info/METADATA,sha256=W0FwaOzfkkhGA55im6RoioV5CkvcnSxQQWKm5pL3fxE,4386
47
- geometallurgy-0.4.10.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
48
- geometallurgy-0.4.10.dist-info/entry_points.txt,sha256=aQI-8kmaba_c9ZGOFkJgWl0MWBke5BQLNyPSVcbS7EU,58
49
- geometallurgy-0.4.10.dist-info/RECORD,,
44
+ geometallurgy-0.4.12.dist-info/LICENSE,sha256=GrSVdcGtNbGvAYC_tIjLHBrIVPyg-Ksfe7ZGr087yCI,1069
45
+ geometallurgy-0.4.12.dist-info/METADATA,sha256=iatuwf4Pey2ZHhaEu-p-NJ-tEVCdZAijNXZf91jhgpM,4386
46
+ geometallurgy-0.4.12.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
47
+ geometallurgy-0.4.12.dist-info/entry_points.txt,sha256=aQI-8kmaba_c9ZGOFkJgWl0MWBke5BQLNyPSVcbS7EU,58
48
+ geometallurgy-0.4.12.dist-info/RECORD,,
@@ -1,5 +0,0 @@
1
- import uuid
2
-
3
-
4
- def random_int():
5
- return int(uuid.uuid4())