bw_graph_tools Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.8] - 2026-05-13
#43 Add fourth and fifth production-exchange heuristics:
gpe_fourth_heuristicidentifies waste treatment activities by finding columns with a single negative entry in the assembled matrix;gpe_fifth_heuristicdeterministically resolves remaining columns by finding products that appear in exactly one unidentified column (columns with multiple candidate rows are left unassigned rather than guessed); both are wired intoguess_production_exchanges#43: Added docstrings to
gpe_second_heuristic,gpe_third_heuristic, and all new heuristic functions; added early-return guards to heuristics 2–4; documented a known ordering limitation ingpe_third_heuristic(can misidentify waste-treatment co-product as production exchange before the fourth heuristic runs) with an xfail test#43: Removed unused
reorder_mapped_matrixstub
[0.7] - 2026-04-15
#36 Injectable
CachingSolverwith external cache pre-population: Newcaching_solverfield onGraphTraversalSettingsallows sharing a solver across multiple traversals;CachingSolvernow exposesin_cache()andadd_to_cache()for external pre-population#39 Warn when graph traversal coverage is below threshold: New
min_coverage_fractionfield onGraphTraversalSettings(default 0.9); emits a warning if traversal covers less than the threshold fraction of total LCA score#38 Replace deprecated
np.in1dwithnp.isin: FixesAttributeErrorwith NumPy ≥ 2.0
[0.6] - 2025-06-26
Remove Numpy
<2version pinFix tests for upstream API changes
[0.5] - 2024-09-10
This release is a big shift from purely functional programming to storing state in the graph traversal class instances. Storing state was necessary to support SameNodeEachVisitGraphTraversal, which needs to remember when a node has been visited.
The old API still works but is deprecated; please shift from NewNodeEachVisitGraphTraversal.calculate() to NewNodeEachVisitGraphTraversal().traverse(). Note that the graph traversal input configuration is now wrapped in a Pydantic class GraphTraversalSettings.
[0.4.1] - 2024-05-24
Fix #16 - Add optional
max_depthargument to graph traversal
[0.4] - 2024-05-24
Added the following attributes to Node dataclasses:
direct_emissions_score_outside_specific_flows (float): The score attributable to direct emissions of this node which isn’t broken out into separate
Flowobjects.remaining_cumulative_score_outside_specific_flows (float): The cumulative score of this node, including direct emissions, which isn’t broken out into separate
Flowobjects.terminal (bool): Boolean flag indicating whether graph traversal was cutoff at this node
[0.3.1] - 2024-05-11
Update packaging
Python 3.9 compatibility
[0.3] - 2023-10-13
Remove
scikit-networkdependency
[0.2.5] - 2023-08-08
Updated CI scripts
[0.2.4] - 2023-08-08
[0.2.3] - 2023-05-22
Fix scikit-network dependency as API changed in new version
[0.2.2] - 2023-05-08
Refactor some testing functions
[0.2.1] - 2023-05-07
Fix dependencies for pip installation
[0.2.0] - 2023-05-07
Corrected graph traversal scaling and switched to
NewNodeEachVisitGraphTraversalclass name.Fixed bug in first heuristic for guessing production exchanges
Integration tests for graph traversal
[0.1.0] - 2023-04-26
First release