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 +5 -5
- elphick/geomet/flowsheet/flowsheet.py +33 -7
- elphick/geomet/flowsheet/stream.py +7 -6
- elphick/geomet/interval_sample.py +4 -3
- elphick/geomet/utils/interp.py +4 -4
- elphick/geomet/utils/pandas.py +1 -1
- elphick/geomet/utils/timer.py +1 -1
- {geometallurgy-0.4.10.dist-info → geometallurgy-0.4.12.dist-info}/METADATA +1 -1
- {geometallurgy-0.4.10.dist-info → geometallurgy-0.4.12.dist-info}/RECORD +12 -13
- elphick/geomet/utils/sampling.py +0 -5
- {geometallurgy-0.4.10.dist-info → geometallurgy-0.4.12.dist-info}/LICENSE +0 -0
- {geometallurgy-0.4.10.dist-info → geometallurgy-0.4.12.dist-info}/WHEEL +0 -0
- {geometallurgy-0.4.10.dist-info → geometallurgy-0.4.12.dist-info}/entry_points.txt +0 -0
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],
|
|
718
|
-
comp.nodes = [self.nodes[1],
|
|
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],
|
|
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],
|
|
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([
|
|
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([
|
|
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([
|
|
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([
|
|
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 = [
|
|
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],
|
|
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],
|
|
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,
|
elphick/geomet/utils/interp.py
CHANGED
|
@@ -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(
|
|
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
|
-
|
elphick/geomet/utils/pandas.py
CHANGED
|
@@ -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.
|
|
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.
|
elphick/geomet/utils/timer.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
elphick/geomet/__init__.py,sha256=gcaArz-agLsm_Tf9KNvmGznw4Jml2QTjj_CxKUC1Ejg,274
|
|
2
|
-
elphick/geomet/base.py,sha256=
|
|
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=
|
|
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=
|
|
22
|
-
elphick/geomet/interval_sample.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
46
|
-
geometallurgy-0.4.
|
|
47
|
-
geometallurgy-0.4.
|
|
48
|
-
geometallurgy-0.4.
|
|
49
|
-
geometallurgy-0.4.
|
|
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,,
|
elphick/geomet/utils/sampling.py
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|