openprocess 0.16.0__tar.gz → 0.16.1__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.16.0/openprocess.egg-info → openprocess-0.16.1}/PKG-INFO +1 -1
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/__init__.py +1 -1
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/app.py +10 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/dotted_chart.py +41 -6
- {openprocess-0.16.0 → openprocess-0.16.1/openprocess.egg-info}/PKG-INFO +1 -1
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_dotted_chart.py +25 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_studio_gui.py +31 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/LICENSE +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/README.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/cpnpy/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/analysis/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/analysis/state_space.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/analysis/state_space_process.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/citation.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/cli.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/answer.pnml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/question.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/answer.pnml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/net.pnml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/question.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/log.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/question.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/question.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/ts.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/net.pnml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/question.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/log.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/question.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/log.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m1.pnml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m2.pnml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m3.pnml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/net.pnml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/question.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/pack.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/box.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/check.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/compare.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/cpn.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/discover.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/filter.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/input.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/measure.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/output.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/predict.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/science.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/sweeps.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/changes.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/convert.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/datasets.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/derivation.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/explain.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/figures.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/history.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/library.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/loading.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/parallel.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/provenance.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/record.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/report.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/reproducibility.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/runner.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/script.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/snapshots.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/studio.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/sweep.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/types.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/versions.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/workflow.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/app.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/arc_editing.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/canvas.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/canvas.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/page.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/picker.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/report.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/stepper.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/templates.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/versions.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/viewers.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/items.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/learn/answer_boxes.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/learn/concealment.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/learn/mode.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/panning.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/resources/openprocess-icon.png +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/__main__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/alignment_view.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/charts.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/cite.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/command_palette.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/compare_page.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/connect.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/connections.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/cpn_page.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/definition_view.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/derivation_view.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/documents.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/file_dialogs.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/filter_dialog.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/graph_builders.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/graph_view.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/instances.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/loading.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/log_editor.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/log_page.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/markdown_view.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/mathtext.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/ml_highlighter.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/model_page.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/motion.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/net_comparison.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/notes_overlay.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/petri_page.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/provenance.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/regions_view.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/remote.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/review.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/sidebar.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/spaces.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/style.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/tool_icons.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/updates.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/widgets.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/workers.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/workspace.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/theme.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/tidy.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/io/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/io/cpn_reader.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/io/cpn_writer.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/answers.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/checks.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/computed.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/context.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/exam.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/exercise-packs.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/importer.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/notation.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/pack.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/sheet.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/__main__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/api.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/connecting.md +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/install.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/server.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/analysis.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/bpmn.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/cases.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/columns.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/compare_nets.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/conformance/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/conformance/alignments.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/conformance/quality.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/conformance/token_replay.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/csv_import.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/definitions.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/dfg.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/alpha.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/heuristics.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/inductive.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/state_regions.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/dotted.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/drawing.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/filtering.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/footprint.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/invariants.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/layout.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/log.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/ocel.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/parallel.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/petrinet.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/playout.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/pm4py_bridge.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/pnml.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/processtree.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/regions.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/stats.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/structure.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/transition_system.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/xes.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/ast_nodes.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/builtins.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/colorsets.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/errors.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/evaluator.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/lexer.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/multiset.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/parser.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/values.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/declarations.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/examples.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/net.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/plain.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/packages.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/palette.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/parallel.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/references.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/binding.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/export.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/performance.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/simulator.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/__init__.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/answers.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/checks.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/pack.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/sheet.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/SOURCES.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/dependency_links.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/entry_points.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/requires.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/top_level.txt +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/pyproject.toml +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/setup.cfg +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_arc_editing.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_bpmn.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_citation.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_colorsets.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_columns.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_cpn_course_model.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_definitions.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_docs.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_exercises_gui.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_flow.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_flow_gui.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_framework_contract.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_hierarchy.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_history.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_io.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_large_log_page.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_large_logs.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_learn.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_learn_gui.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_log_editing.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_mcp.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_mcp_gui.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_measure.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_mining.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_ml.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_multiset.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_ocel.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_packages.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_parallel_and_loading.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_parallel_boxes.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_performance.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_regions.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_rename.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_report.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_researcher_api.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_review_fixes.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_simulation.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_snapshots.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_state_space.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_studio_lazy.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_teaching.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_tidy.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_updates.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_wf_structure.py +0 -0
- {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_workspace.py +0 -0
|
@@ -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.16.
|
|
51
|
+
__version__ = "0.16.1"
|
|
52
52
|
|
|
53
53
|
__all__ = [
|
|
54
54
|
"Arc", "BindingElement", "CPNet", "Marking", "Multiset", "Page", "Place",
|
|
@@ -4261,6 +4261,16 @@ class StudioWindow(QMainWindow):
|
|
|
4261
4261
|
self.statusBar().showMessage(message, 8000)
|
|
4262
4262
|
|
|
4263
4263
|
try:
|
|
4264
|
+
if isinstance(document, WorkflowDocument):
|
|
4265
|
+
# Changed by Claude (through the MCP server) or another copy of the
|
|
4266
|
+
# app: the boxes, versions and record are all read again.
|
|
4267
|
+
from ...flow.record import load_all
|
|
4268
|
+
document.workflow, document.record, document.versions = load_all(path, self.library())
|
|
4269
|
+
document.dirty = False
|
|
4270
|
+
self._remember_identity(document)
|
|
4271
|
+
self._replace_page(document)
|
|
4272
|
+
self.statusBar().showMessage(message, 8000)
|
|
4273
|
+
return
|
|
4264
4274
|
if isinstance(document, TransitionSystemDocument):
|
|
4265
4275
|
content = self._read_text_file(path)
|
|
4266
4276
|
document.ts = content.ts
|
|
@@ -73,6 +73,7 @@ SHAPES = ["circle", "square", "triangle", "diamond", "cross", "star"]
|
|
|
73
73
|
#: log stays a picture of milliseconds, not seconds. Shapes, rings and the
|
|
74
74
|
#: lines between a case's events come back as soon as a zoom shows fewer.
|
|
75
75
|
BATCH_FROM = 40_000
|
|
76
|
+
STACK_ALPHA = 0.72 # opacity of a dot; a stack of dots shows darker
|
|
76
77
|
#: Above this many events the dots are worked out on a worker thread.
|
|
77
78
|
BACKGROUND_FROM = 200_000
|
|
78
79
|
#: When drawing the picture took longer than this, a pan or zoom first shows
|
|
@@ -381,6 +382,15 @@ class DottedChart(QWidget):
|
|
|
381
382
|
painter.end()
|
|
382
383
|
return pixmap
|
|
383
384
|
|
|
385
|
+
def dot_radius(self, rect: QRectF) -> float:
|
|
386
|
+
"""The radius a dot is drawn with: the size the rows allow (4 px
|
|
387
|
+
when they are tall, down to 1.6 px when a row is a hairline), scaled
|
|
388
|
+
by the Dot size setting (4 is 1×), so the slider always does
|
|
389
|
+
something and a dense chart stays readable."""
|
|
390
|
+
row_h = rect.height() / max(self.vy1 - self.vy0, 1e-9)
|
|
391
|
+
fitting = max(1.6, min(4.0, row_h * 0.45))
|
|
392
|
+
return max(1.0, fitting * self.data.settings.dot_size / 4.0)
|
|
393
|
+
|
|
384
394
|
def _visible(self, candidates: np.ndarray) -> np.ndarray:
|
|
385
395
|
"""The dots of ``candidates`` (dots in the x window) that are in the
|
|
386
396
|
row window and whose colour the legend shows."""
|
|
@@ -402,12 +412,7 @@ class DottedChart(QWidget):
|
|
|
402
412
|
rect = self.plot_rect()
|
|
403
413
|
self._paint_axes(painter, rect, t, s.grid_lines)
|
|
404
414
|
|
|
405
|
-
|
|
406
|
-
# The dot size the rows allow (4 px when they are tall, down to 1.6 px
|
|
407
|
-
# when a row is a hairline), scaled by the Dot size setting (4 is 1×):
|
|
408
|
-
# the slider always does something, and a dense chart stays readable.
|
|
409
|
-
fitting = max(1.6, min(4.0, row_h * 0.45))
|
|
410
|
-
radius = max(1.0, fitting * s.dot_size / 4.0)
|
|
415
|
+
radius = self.dot_radius(rect)
|
|
411
416
|
# A ring in the surface colour sets a dot apart from its neighbours;
|
|
412
417
|
# drawn on every dot it erases overlapping ones into slivers, so it is
|
|
413
418
|
# kept for the selected case alone, which sits on top.
|
|
@@ -423,6 +428,13 @@ class DottedChart(QWidget):
|
|
|
423
428
|
self._paint_dense(painter, rect, colours, faded, radius, visible)
|
|
424
429
|
on_top = visible[d.case[visible] == selected] if selected >= 0 else []
|
|
425
430
|
else:
|
|
431
|
+
if selected < 0:
|
|
432
|
+
# Dots a little translucent, so a stack of events drawn on
|
|
433
|
+
# the same spot shows darker than a single one. The dense
|
|
434
|
+
# picture sets each pixel once, so it stays opaque; the
|
|
435
|
+
# selected case is opaque to stand out.
|
|
436
|
+
for colour in colours:
|
|
437
|
+
colour.setAlphaF(STACK_ALPHA)
|
|
426
438
|
if s.connect:
|
|
427
439
|
self._paint_connections(painter, rect, visible, t)
|
|
428
440
|
# Unselected first, the selected case last so it sits on top.
|
|
@@ -634,6 +646,16 @@ class DottedChart(QWidget):
|
|
|
634
646
|
nearest = int(distance.argmin())
|
|
635
647
|
return int(near[nearest]) if distance[nearest] <= tolerance else None
|
|
636
648
|
|
|
649
|
+
def stacked_with(self, i: int) -> np.ndarray:
|
|
650
|
+
"""The shown dots drawn over dot ``i``: those on its row whose centre
|
|
651
|
+
is within a dot's width of it on screen, ``i`` itself first."""
|
|
652
|
+
d = self.data
|
|
653
|
+
rect = self.plot_rect()
|
|
654
|
+
reach = 2 * self.dot_radius(rect) / rect.width() * (self.vx1 - self.vx0)
|
|
655
|
+
near = d.between(d.xs[i] - reach, d.xs[i] + reach)
|
|
656
|
+
near = near[(d.rows[near] == d.rows[i]) & d.shown(self.hidden_colours)[d.colour[near]]]
|
|
657
|
+
return np.concatenate(([i], near[near != i]))
|
|
658
|
+
|
|
637
659
|
def describe_dot(self, i: int) -> str:
|
|
638
660
|
d = self.data
|
|
639
661
|
event = d.event(i)
|
|
@@ -646,6 +668,19 @@ class DottedChart(QWidget):
|
|
|
646
668
|
if key not in ("concept:name", "time:timestamp"):
|
|
647
669
|
text = str(value)
|
|
648
670
|
lines.append(f"{key}: {text[:60] + '…' if len(text) > 60 else text}")
|
|
671
|
+
stack = self.stacked_with(i)
|
|
672
|
+
if len(stack) > 1:
|
|
673
|
+
# A pile of dots looks like one: say how many, and over what span.
|
|
674
|
+
cases = len(set(d.case[stack].tolist()))
|
|
675
|
+
text = f"<i>{len(stack) - 1} more event{'s' if len(stack) > 2 else ''} under this dot"
|
|
676
|
+
if cases > 1:
|
|
677
|
+
text += f" ({cases} cases)"
|
|
678
|
+
stamps = [d.event(int(j)).timestamp for j in stack]
|
|
679
|
+
if all(stamps):
|
|
680
|
+
first, last = min(stamps), max(stamps)
|
|
681
|
+
if last > first:
|
|
682
|
+
text += f", spanning {format_duration((last - first).total_seconds())}"
|
|
683
|
+
lines.append(text + ". Drag to zoom in.</i>")
|
|
649
684
|
return "<br>".join(lines)
|
|
650
685
|
|
|
651
686
|
# -- interaction ------------------------------------------------------------------
|
|
@@ -107,3 +107,28 @@ def test_the_pointer_finds_the_nearest_shown_dot(app, monkeypatch):
|
|
|
107
107
|
assert found is not None and d.rows[found] == 0 and d.xs[found] == 1.0
|
|
108
108
|
chart.hidden_colours = set(range(len(d.colour_values)))
|
|
109
109
|
assert chart.dot_at(point) is None
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def test_the_hover_counts_the_dots_drawn_under_one(app, monkeypatch):
|
|
113
|
+
from openprocess.gui.studio import dotted_chart
|
|
114
|
+
from openprocess.gui.studio.documents import LogDocument
|
|
115
|
+
chart = _chart(app, monkeypatch, batch_from=10_000)
|
|
116
|
+
# Rows by activity, x by position in case (from 0): the 10 <b,a> cases
|
|
117
|
+
# put 10 dots on one spot.
|
|
118
|
+
chart.set_data(dotted_chart.DotData(LogDocument(LOG), DotSettings(x_mode=4, rows="Activity")))
|
|
119
|
+
chart.show()
|
|
120
|
+
app.processEvents()
|
|
121
|
+
chart.repaint()
|
|
122
|
+
d = chart.data
|
|
123
|
+
a_row = d.rows[next(j for j in range(len(d.xs)) if d.event(j).activity == "a" and d.xs[j] == 1.0)]
|
|
124
|
+
pile = np.flatnonzero((d.rows == a_row) & (d.xs == 1.0))
|
|
125
|
+
assert len(pile) == 10
|
|
126
|
+
i = int(pile[0])
|
|
127
|
+
stack = chart.stacked_with(i)
|
|
128
|
+
assert stack[0] == i and len(stack) == len(pile)
|
|
129
|
+
text = chart.describe_dot(i)
|
|
130
|
+
assert f"{len(pile) - 1} more events under this dot" in text
|
|
131
|
+
# Hidden colours are not counted, and a lone dot says nothing.
|
|
132
|
+
chart.hidden_colours = set(range(len(d.colour_values)))
|
|
133
|
+
assert len(chart.stacked_with(i)) == 1
|
|
134
|
+
assert "under this dot" not in chart.describe_dot(i)
|
|
@@ -2847,6 +2847,37 @@ def test_a_workflow_opened_from_another_folder_reads_its_files_from_there(app, t
|
|
|
2847
2847
|
assert page.run is not None and all(page.run.status(n) == "done" for n in page.workflow.nodes.values())
|
|
2848
2848
|
|
|
2849
2849
|
|
|
2850
|
+
def test_an_open_workflow_changed_on_disk_is_reloaded(app, tmp_path):
|
|
2851
|
+
"""A .analysis written elsewhere (by Claude through the MCP server) while it is
|
|
2852
|
+
open: the page shows the new boxes, and a later save does not put the old ones back."""
|
|
2853
|
+
from openprocess.flow import Workflow, save
|
|
2854
|
+
from openprocess.flow.record import load_all
|
|
2855
|
+
from openprocess.gui.studio.app import StudioWindow
|
|
2856
|
+
from openprocess.gui.studio.documents import WorkflowDocument
|
|
2857
|
+
week = _week(tmp_path)
|
|
2858
|
+
(week / "log.txt").write_text("[<a,b,c>^3, <a,c,b>]")
|
|
2859
|
+
path = week / "Orders.analysis"
|
|
2860
|
+
wf = Workflow("Orders")
|
|
2861
|
+
wf.connect(wf.add("open_log", {"file": "log.txt"}), wf.add("alpha_miner"))
|
|
2862
|
+
save(wf, path, folder=week)
|
|
2863
|
+
window = StudioWindow()
|
|
2864
|
+
window.show()
|
|
2865
|
+
window.open_workspace(str(week))
|
|
2866
|
+
window.open_path(str(path))
|
|
2867
|
+
document = next(d for d in window.documents if isinstance(d, WorkflowDocument))
|
|
2868
|
+
before = window.pages[document.id]
|
|
2869
|
+
_pump(app, 0.5)
|
|
2870
|
+
|
|
2871
|
+
wf.add("inductive_miner")
|
|
2872
|
+
save(wf, path, folder=week)
|
|
2873
|
+
assert _wait_for(app, lambda: len(document.workflow.nodes) == 3)
|
|
2874
|
+
assert window.pages[document.id] is not before
|
|
2875
|
+
assert "changed on disk — reloaded" in window.statusBar().currentMessage()
|
|
2876
|
+
window.pages[document.id].save()
|
|
2877
|
+
assert len(load_all(path)[0].nodes) == 3
|
|
2878
|
+
window.close()
|
|
2879
|
+
|
|
2880
|
+
|
|
2850
2881
|
def test_not_terminating_is_shown_as_info():
|
|
2851
2882
|
from openprocess.gui.studio.widgets import property_status
|
|
2852
2883
|
assert property_status("Terminating", False) == "info"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|