openprocess 0.13.2__tar.gz → 0.14.0__tar.gz
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.
- {openprocess-0.13.2/openprocess.egg-info → openprocess-0.14.0}/PKG-INFO +8 -5
- {openprocess-0.13.2 → openprocess-0.14.0}/README.md +6 -3
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/__init__.py +1 -1
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/app.py +7 -3
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/compare_page.py +10 -2
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/connections.py +1 -1
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/documents.py +21 -14
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/dotted_chart.py +220 -96
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/filter_dialog.py +80 -26
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/log_editor.py +203 -45
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/log_page.py +160 -29
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/workers.py +18 -4
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/columns.py +231 -17
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/csv_import.py +65 -8
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/dfg.py +57 -25
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/dotted.py +197 -155
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/filtering.py +36 -1
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/log.py +17 -14
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/stats.py +15 -11
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/xes.py +115 -23
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/packages.py +1 -1
- {openprocess-0.13.2 → openprocess-0.14.0/openprocess.egg-info}/PKG-INFO +8 -5
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess.egg-info/SOURCES.txt +2 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/pyproject.toml +8 -6
- openprocess-0.14.0/tests/test_dotted_chart.py +109 -0
- openprocess-0.14.0/tests/test_large_log_page.py +353 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_researcher_api.py +3 -2
- {openprocess-0.13.2 → openprocess-0.14.0}/LICENSE +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/cpnpy/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/analysis/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/analysis/state_space.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/analysis/state_space_process.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/citation.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/cli.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/answer.pnml +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/question.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/answer.pnml +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/net.pnml +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/question.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/log.txt +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/question.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/question.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/ts.txt +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/net.pnml +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/question.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/log.txt +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/question.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/log.txt +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m1.pnml +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m2.pnml +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m3.pnml +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/net.pnml +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/question.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/exercises/pack.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/box.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/check.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/compare.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/cpn.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/discover.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/filter.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/input.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/measure.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/output.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/predict.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/science.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/boxes/sweeps.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/changes.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/convert.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/datasets.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/derivation.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/explain.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/figures.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/history.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/library.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/loading.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/parallel.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/provenance.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/record.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/report.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/reproducibility.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/runner.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/script.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/snapshots.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/studio.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/sweep.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/types.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/flow/workflow.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/app.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/arc_editing.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/canvas.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/canvas.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/page.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/picker.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/runs.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/stepper.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/summary.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/templates.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/flow/viewers.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/items.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/learn/answer_boxes.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/learn/concealment.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/learn/mode.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/panning.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/resources/openprocess-icon.png +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/__main__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/alignment_view.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/charts.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/cite.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/command_palette.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/connect.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/cpn_page.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/definition_view.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/derivation_view.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/file_dialogs.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/graph_builders.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/graph_view.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/instances.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/loading.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/markdown_view.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/mathtext.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/ml_highlighter.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/model_page.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/motion.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/net_comparison.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/notes_overlay.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/petri_page.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/provenance.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/regions_view.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/remote.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/review.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/sidebar.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/spaces.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/style.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/tool_icons.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/updates.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/widgets.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/studio/workspace.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/theme.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/gui/tidy.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/io/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/io/cpn_reader.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/io/cpn_writer.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/answers.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/checks.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/computed.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/context.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/exam.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/exercise-packs.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/importer.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/notation.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/pack.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/learn/sheet.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mcp/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mcp/__main__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mcp/api.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mcp/connecting.md +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mcp/install.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mcp/server.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/analysis.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/bpmn.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/cases.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/compare_nets.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/conformance/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/conformance/alignments.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/conformance/quality.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/conformance/token_replay.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/definitions.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/discovery/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/discovery/alpha.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/discovery/heuristics.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/discovery/inductive.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/discovery/state_regions.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/drawing.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/footprint.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/invariants.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/layout.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/ocel.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/parallel.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/petrinet.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/playout.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/pm4py_bridge.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/pnml.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/processtree.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/regions.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/structure.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/mining/transition_system.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/ast_nodes.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/builtins.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/colorsets.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/errors.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/evaluator.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/lexer.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/multiset.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/parser.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/ml/values.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/model/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/model/declarations.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/model/examples.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/model/net.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/model/plain.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/palette.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/parallel.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/references.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/sim/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/sim/binding.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/sim/export.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/sim/performance.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/sim/simulator.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/teaching/__init__.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/teaching/answers.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/teaching/checks.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/teaching/pack.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess/teaching/sheet.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess.egg-info/dependency_links.txt +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess.egg-info/entry_points.txt +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess.egg-info/requires.txt +1 -1
- {openprocess-0.13.2 → openprocess-0.14.0}/openprocess.egg-info/top_level.txt +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/setup.cfg +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_arc_editing.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_bpmn.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_citation.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_colorsets.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_columns.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_cpn_course_model.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_definitions.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_docs.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_exercises_gui.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_flow.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_flow_gui.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_framework_contract.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_hierarchy.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_history.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_io.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_large_logs.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_learn.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_learn_gui.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_log_editing.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_mcp.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_mcp_gui.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_measure.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_mining.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_ml.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_multiset.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_ocel.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_packages.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_parallel_and_loading.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_parallel_boxes.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_performance.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_regions.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_rename.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_report.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_review_fixes.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_simulation.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_snapshots.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_state_space.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_studio_gui.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_studio_lazy.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_teaching.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_tidy.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_updates.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_wf_structure.py +0 -0
- {openprocess-0.13.2 → openprocess-0.14.0}/tests/test_workspace.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openprocess
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.0
|
|
4
4
|
Summary: Process mining, Petri nets and workflows in one open app: every algorithm visible, every result reproducible, every step teachable
|
|
5
5
|
Author: Sam Struthers
|
|
6
6
|
License: MIT
|
|
@@ -18,6 +18,7 @@ Classifier: Topic :: Education
|
|
|
18
18
|
Requires-Python: >=3.10
|
|
19
19
|
Description-Content-Type: text/markdown
|
|
20
20
|
License-File: LICENSE
|
|
21
|
+
Requires-Dist: numpy>=1.24
|
|
21
22
|
Provides-Extra: app
|
|
22
23
|
Requires-Dist: PySide6>=6.6; extra == "app"
|
|
23
24
|
Requires-Dist: certifi; extra == "app"
|
|
@@ -28,7 +29,6 @@ Provides-Extra: dev
|
|
|
28
29
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
29
30
|
Requires-Dist: mcp>=2.3; extra == "dev"
|
|
30
31
|
Provides-Extra: science
|
|
31
|
-
Requires-Dist: numpy>=1.24; extra == "science"
|
|
32
32
|
Requires-Dist: pandas>=2.0; extra == "science"
|
|
33
33
|
Requires-Dist: scipy>=1.10; extra == "science"
|
|
34
34
|
Requires-Dist: matplotlib>=3.7; extra == "science"
|
|
@@ -494,6 +494,9 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
494
494
|
- Time unit (Auto, or seconds up to years) and a grid step you can type in.
|
|
495
495
|
- Colour and shape by any attribute. The default palette can be changed
|
|
496
496
|
per value: right-click a value in the legend and pick its colour.
|
|
497
|
+
- A log of a million events (the BPI Challenge logs) pans, zooms and
|
|
498
|
+
answers the pointer without a pause: the dots are numpy arrays and a
|
|
499
|
+
dense picture is rasterised a colour at a time, not a dot at a time.
|
|
497
500
|
- **Discover** hands the log to an analysis in Mine (**Discover in Mine →**),
|
|
498
501
|
where the miner is a box with its result, its *How* and its *Code*:
|
|
499
502
|
- α-algorithm, which shows its eight steps;
|
|
@@ -759,7 +762,7 @@ renders every page offscreen into `docs/screenshots/`, so run it after a
|
|
|
759
762
|
change to the app's looks.
|
|
760
763
|
|
|
761
764
|
The engines (`openprocess.mining`, `openprocess.ml`, `openprocess.sim`, `openprocess.analysis`)
|
|
762
|
-
|
|
765
|
+
need **nothing but numpy**, so they work in a notebook or a script:
|
|
763
766
|
|
|
764
767
|
```python
|
|
765
768
|
from openprocess.mining import read_xes, inductive_miner
|
|
@@ -884,7 +887,7 @@ extra) and *Predict the next activity*. Or start empty.
|
|
|
884
887
|
with the course's miners and checks on the 2AMI10 exam log.
|
|
885
888
|
- **Connections** (at the bottom of the sidebar, or *View ▸ Connections*)
|
|
886
889
|
draws what flows in, OpenProcess and its boxes, what flows out, and the
|
|
887
|
-
optional tools (pandas,
|
|
890
|
+
optional tools (pandas, scipy, matplotlib, …) with whether each is
|
|
888
891
|
installed, how to install it and the boxes it brings. All of it is read
|
|
889
892
|
from the box library. *Install…* works in the downloaded app too: it carries
|
|
890
893
|
pip and installs into a folder of your own (on a Mac,
|
|
@@ -949,7 +952,7 @@ See [Parallel work](docs/workflows.md#parallel-work) for the rules (each item
|
|
|
949
952
|
from its own inputs, `flow.item_seed` for randomness). OpenProcess's own
|
|
950
953
|
alignments and token replay run this way on large logs.
|
|
951
954
|
|
|
952
|
-
`pip install -e ".[science]"` adds the pandas,
|
|
955
|
+
`pip install -e ".[science]"` adds the pandas, SciPy and matplotlib
|
|
953
956
|
boxes (describe, bootstrap intervals, tests, plots).
|
|
954
957
|
|
|
955
958
|
**Large logs.** A log above 20 MB is read into columns rather than objects,
|
|
@@ -452,6 +452,9 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
452
452
|
- Time unit (Auto, or seconds up to years) and a grid step you can type in.
|
|
453
453
|
- Colour and shape by any attribute. The default palette can be changed
|
|
454
454
|
per value: right-click a value in the legend and pick its colour.
|
|
455
|
+
- A log of a million events (the BPI Challenge logs) pans, zooms and
|
|
456
|
+
answers the pointer without a pause: the dots are numpy arrays and a
|
|
457
|
+
dense picture is rasterised a colour at a time, not a dot at a time.
|
|
455
458
|
- **Discover** hands the log to an analysis in Mine (**Discover in Mine →**),
|
|
456
459
|
where the miner is a box with its result, its *How* and its *Code*:
|
|
457
460
|
- α-algorithm, which shows its eight steps;
|
|
@@ -717,7 +720,7 @@ renders every page offscreen into `docs/screenshots/`, so run it after a
|
|
|
717
720
|
change to the app's looks.
|
|
718
721
|
|
|
719
722
|
The engines (`openprocess.mining`, `openprocess.ml`, `openprocess.sim`, `openprocess.analysis`)
|
|
720
|
-
|
|
723
|
+
need **nothing but numpy**, so they work in a notebook or a script:
|
|
721
724
|
|
|
722
725
|
```python
|
|
723
726
|
from openprocess.mining import read_xes, inductive_miner
|
|
@@ -842,7 +845,7 @@ extra) and *Predict the next activity*. Or start empty.
|
|
|
842
845
|
with the course's miners and checks on the 2AMI10 exam log.
|
|
843
846
|
- **Connections** (at the bottom of the sidebar, or *View ▸ Connections*)
|
|
844
847
|
draws what flows in, OpenProcess and its boxes, what flows out, and the
|
|
845
|
-
optional tools (pandas,
|
|
848
|
+
optional tools (pandas, scipy, matplotlib, …) with whether each is
|
|
846
849
|
installed, how to install it and the boxes it brings. All of it is read
|
|
847
850
|
from the box library. *Install…* works in the downloaded app too: it carries
|
|
848
851
|
pip and installs into a folder of your own (on a Mac,
|
|
@@ -907,7 +910,7 @@ See [Parallel work](docs/workflows.md#parallel-work) for the rules (each item
|
|
|
907
910
|
from its own inputs, `flow.item_seed` for randomness). OpenProcess's own
|
|
908
911
|
alignments and token replay run this way on large logs.
|
|
909
912
|
|
|
910
|
-
`pip install -e ".[science]"` adds the pandas,
|
|
913
|
+
`pip install -e ".[science]"` adds the pandas, SciPy and matplotlib
|
|
911
914
|
boxes (describe, bootstrap intervals, tests, plots).
|
|
912
915
|
|
|
913
916
|
**Large logs.** A log above 20 MB is read into columns rather than objects,
|
|
@@ -48,7 +48,7 @@ from .sim.simulator import Simulator
|
|
|
48
48
|
#: The one place the version number is written (pyproject.toml, the update
|
|
49
49
|
#: check and packaging/build.py read it from here). A release is tagged
|
|
50
50
|
#: "v" + this, e.g. v0.2.0.
|
|
51
|
-
__version__ = "0.
|
|
51
|
+
__version__ = "0.14.0"
|
|
52
52
|
|
|
53
53
|
__all__ = [
|
|
54
54
|
"Arc", "BindingElement", "CPNet", "Marking", "Multiset", "Page", "Place",
|
|
@@ -4270,14 +4270,15 @@ class StudioWindow(QMainWindow):
|
|
|
4270
4270
|
page = self.pages[document.id]
|
|
4271
4271
|
if document.path and not document.missing:
|
|
4272
4272
|
try:
|
|
4273
|
-
page.write_to(document.path, quiet=True)
|
|
4273
|
+
written = page.write_to(document.path, quiet=True)
|
|
4274
4274
|
except Exception as error: # noqa: BLE001 - the edit stays, unsaved
|
|
4275
4275
|
QMessageBox.warning(self, "Could not save the log",
|
|
4276
4276
|
f"{Path(document.path).name}\n\n{error}\n\nYour changes "
|
|
4277
4277
|
"are still open here: export the log to keep them.")
|
|
4278
4278
|
else:
|
|
4279
|
-
|
|
4280
|
-
|
|
4279
|
+
if written: # else the page reports as it goes
|
|
4280
|
+
self.statusBar().showMessage(f"Saved your changes to "
|
|
4281
|
+
f"{Path(document.path).name}", 6000)
|
|
4281
4282
|
else:
|
|
4282
4283
|
self._materialise(document)
|
|
4283
4284
|
self._replace_page(document)
|
|
@@ -4289,8 +4290,11 @@ class StudioWindow(QMainWindow):
|
|
|
4289
4290
|
def _replace_page(self, document) -> None:
|
|
4290
4291
|
"""Rebuild a document's page (after reloading it), keeping it in view."""
|
|
4291
4292
|
shown = self.content.currentWidget() is self.holders.built(document.id)
|
|
4293
|
+
previous = self.pages.built(document.id)
|
|
4292
4294
|
self._drop_page(document)
|
|
4293
4295
|
self._make_page(document)
|
|
4296
|
+
if previous is not None and hasattr(previous, "successor"):
|
|
4297
|
+
previous.successor = self.pages[document.id] # a save still running reports to the new page
|
|
4294
4298
|
self._update_autosave(document)
|
|
4295
4299
|
if document.missing:
|
|
4296
4300
|
self._show_missing(document)
|
|
@@ -22,6 +22,7 @@ import statistics
|
|
|
22
22
|
from dataclasses import replace
|
|
23
23
|
from datetime import timedelta
|
|
24
24
|
|
|
25
|
+
import numpy as np
|
|
25
26
|
from PySide6.QtCore import Qt, Signal
|
|
26
27
|
from PySide6.QtGui import QColor, QStandardItemModel
|
|
27
28
|
from PySide6.QtWidgets import (
|
|
@@ -168,7 +169,7 @@ def align_colours(datas: list[DotData]) -> list[str]:
|
|
|
168
169
|
index = {v: i for i, v in enumerate(shared)}
|
|
169
170
|
for data in datas:
|
|
170
171
|
mapping = [index[v] for v in data.colour_values]
|
|
171
|
-
data.colour =
|
|
172
|
+
data.colour = np.asarray(mapping, dtype=np.int32)[data.colour]
|
|
172
173
|
data.colour_counts = {v: data.colour_counts.get(v, 0) for v in shared}
|
|
173
174
|
data.colour_values = list(shared)
|
|
174
175
|
return shared
|
|
@@ -428,10 +429,17 @@ class ComparePage(QWidget):
|
|
|
428
429
|
self._syncing = False
|
|
429
430
|
for widget in (self.x_box, self.colour_box):
|
|
430
431
|
widget.currentIndexChanged.connect(lambda _: self._rebuild_dots())
|
|
431
|
-
self.size_box.valueChanged.connect(lambda _: self.
|
|
432
|
+
self.size_box.valueChanged.connect(lambda _: self._resize_dots())
|
|
432
433
|
self._rebuild_dots()
|
|
433
434
|
return page
|
|
434
435
|
|
|
436
|
+
def _resize_dots(self) -> None:
|
|
437
|
+
"""A new dot size: the same dots, painted again."""
|
|
438
|
+
for chart in self.charts:
|
|
439
|
+
if chart.data is not None:
|
|
440
|
+
chart.data.settings.dot_size = self.size_box.value()
|
|
441
|
+
chart._invalidate()
|
|
442
|
+
|
|
435
443
|
def _rebuild_dots(self) -> None:
|
|
436
444
|
settings = replace(self.dot_settings, x_mode=self.x_box.currentIndex(),
|
|
437
445
|
colour_by=self.colour_box.currentText(),
|
|
@@ -41,7 +41,7 @@ OUTPUTS = [
|
|
|
41
41
|
("Python", "every box is a function: call it from a script or a notebook", ()),
|
|
42
42
|
]
|
|
43
43
|
#: What pip installs for each tool (the package itself, pinned as the app's extras pin it).
|
|
44
|
-
PACKAGES = {"pandas": "pandas>=2.0", "
|
|
44
|
+
PACKAGES = {"pandas": "pandas>=2.0", "scipy": "scipy>=1.10",
|
|
45
45
|
"matplotlib": "matplotlib>=3.7", "pm4py": "pm4py"}
|
|
46
46
|
|
|
47
47
|
|
|
@@ -33,8 +33,11 @@ class LogDocument:
|
|
|
33
33
|
|
|
34
34
|
def __post_init__(self) -> None:
|
|
35
35
|
self.classifier: Classifier = self.log.default_classifier()
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
#: The summary and the colours under each classifier looked at so far
|
|
37
|
+
#: (by its key, see :func:`~openprocess.flow.loading.summary_key`):
|
|
38
|
+
#: switching back to a classifier costs nothing.
|
|
39
|
+
self._summaries: dict[tuple, LogSummary] = {}
|
|
40
|
+
self._colours: dict[tuple, ActivityColours] = {}
|
|
38
41
|
|
|
39
42
|
@property
|
|
40
43
|
def name(self) -> str:
|
|
@@ -46,29 +49,33 @@ class LogDocument:
|
|
|
46
49
|
self.log = log
|
|
47
50
|
self.classifier = (classifier if classifier in log.available_classifiers()
|
|
48
51
|
else log.default_classifier())
|
|
49
|
-
self.
|
|
50
|
-
self._colours
|
|
52
|
+
self._summaries.clear()
|
|
53
|
+
self._colours.clear()
|
|
51
54
|
|
|
52
55
|
def set_classifier(self, classifier: Classifier) -> None:
|
|
53
56
|
self.classifier = classifier
|
|
54
|
-
self._summary = None
|
|
55
|
-
self._colours = None
|
|
56
57
|
|
|
57
58
|
@property
|
|
58
59
|
def summary(self) -> LogSummary:
|
|
59
|
-
|
|
60
|
+
from ...flow.loading import summary_key
|
|
61
|
+
key = summary_key(self.classifier)
|
|
62
|
+
summary = self._summaries.get(key)
|
|
63
|
+
if summary is None:
|
|
60
64
|
# A large log read by a worker process comes with its summary worked out
|
|
61
65
|
# there (by the same summarise(), for its default classifier).
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
self.
|
|
65
|
-
return
|
|
66
|
+
ready = (getattr(self.log, "precomputed_summaries", None) or {}).get(key)
|
|
67
|
+
summary = ready if ready is not None else summarise(self.log, self.classifier)
|
|
68
|
+
self._summaries[key] = summary
|
|
69
|
+
return summary
|
|
66
70
|
|
|
67
71
|
@property
|
|
68
72
|
def colours(self) -> ActivityColours:
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
from ...flow.loading import summary_key
|
|
74
|
+
key = summary_key(self.classifier)
|
|
75
|
+
colours = self._colours.get(key)
|
|
76
|
+
if colours is None:
|
|
77
|
+
colours = self._colours[key] = ActivityColours([a.name for a in self.summary.activities])
|
|
78
|
+
return colours
|
|
72
79
|
|
|
73
80
|
def simple_log(self):
|
|
74
81
|
return self.log.simple_log(self.classifier)
|