openprocess 0.8.0__tar.gz → 0.10.5__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.8.0/openprocess.egg-info → openprocess-0.10.5}/PKG-INFO +83 -39
- {openprocess-0.8.0 → openprocess-0.10.5}/README.md +82 -38
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/__init__.py +1 -1
- openprocess-0.10.5/openprocess/citation.py +193 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/box.py +20 -1
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/discover.py +15 -1
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/input.py +48 -6
- openprocess-0.10.5/openprocess/flow/figures.py +54 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/record.py +19 -4
- openprocess-0.10.5/openprocess/flow/report.py +270 -0
- openprocess-0.10.5/openprocess/flow/reproducibility.py +62 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/runner.py +16 -0
- openprocess-0.10.5/openprocess/flow/snapshots.py +179 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/types.py +4 -1
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/workflow.py +11 -3
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/canvas.py +8 -1
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/canvas.py +73 -5
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/page.py +278 -30
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/picker.py +136 -16
- openprocess-0.10.5/openprocess/gui/flow/runs.py +130 -0
- openprocess-0.10.5/openprocess/gui/flow/stepper.py +240 -0
- openprocess-0.10.5/openprocess/gui/flow/summary.py +199 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/viewers.py +260 -46
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/app.py +764 -255
- openprocess-0.10.5/openprocess/gui/studio/cite.py +58 -0
- openprocess-0.10.5/openprocess/gui/studio/command_palette.py +162 -0
- openprocess-0.10.5/openprocess/gui/studio/connections.py +186 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/cpn_page.py +7 -4
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/documents.py +10 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/graph_builders.py +24 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/graph_view.py +60 -5
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/log_page.py +49 -2
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/model_page.py +30 -3
- openprocess-0.10.5/openprocess/gui/studio/motion.py +95 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/petri_page.py +24 -9
- openprocess-0.10.5/openprocess/gui/studio/provenance.py +66 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/regions_view.py +4 -1
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/sidebar.py +10 -3
- openprocess-0.10.5/openprocess/gui/studio/spaces.py +60 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/style.py +31 -1
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/widgets.py +71 -4
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/workspace.py +2 -0
- openprocess-0.10.5/openprocess/mining/ocel.py +262 -0
- {openprocess-0.8.0 → openprocess-0.10.5/openprocess.egg-info}/PKG-INFO +83 -39
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/SOURCES.txt +19 -0
- openprocess-0.10.5/tests/test_citation.py +55 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_exercises_gui.py +15 -12
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_flow.py +74 -0
- openprocess-0.10.5/tests/test_flow_gui.py +1158 -0
- openprocess-0.10.5/tests/test_ocel.py +75 -0
- openprocess-0.10.5/tests/test_report.py +55 -0
- openprocess-0.10.5/tests/test_snapshots.py +55 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_studio_gui.py +308 -51
- openprocess-0.8.0/tests/test_flow_gui.py +0 -494
- {openprocess-0.8.0 → openprocess-0.10.5}/LICENSE +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/cpnpy/__init__.py +0 -0
- {openprocess-0.8.0/openprocess/sim → openprocess-0.10.5/openprocess/analysis}/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/analysis/state_space.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/analysis/state_space_process.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/cli.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/answer.pnml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/question.md +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/answer.pnml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/net.pnml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/question.md +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/log.txt +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/question.md +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/question.md +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/ts.txt +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/net.pnml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/question.md +0 -0
- {openprocess-0.8.0/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows → openprocess-0.10.5/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees}/log.txt +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/question.md +0 -0
- {openprocess-0.8.0/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees → openprocess-0.10.5/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows}/log.txt +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m1.pnml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m2.pnml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m3.pnml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/net.pnml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/question.md +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/pack.md +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/check.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/compare.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/cpn.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/filter.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/output.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/predict.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/science.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/sweeps.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/convert.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/datasets.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/explain.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/library.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/sweep.py +0 -0
- {openprocess-0.8.0/openprocess/model → openprocess-0.10.5/openprocess/gui}/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/app.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/arc_editing.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/templates.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/items.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/learn/answer_boxes.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/learn/concealment.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/learn/mode.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/panning.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/resources/openprocess-icon.png +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/__main__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/charts.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/compare_page.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/definition_view.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/derivation_view.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/dotted_chart.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/file_dialogs.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/filter_dialog.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/instances.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/log_editor.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/markdown_view.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/mathtext.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/ml_highlighter.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/net_comparison.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/notes_overlay.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/tool_icons.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/updates.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/workers.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/theme.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/tidy.py +0 -0
- {openprocess-0.8.0/openprocess/ml → openprocess-0.10.5/openprocess/io}/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/io/cpn_reader.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/io/cpn_writer.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/answers.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/checks.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/computed.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/context.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/exam.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/exercise-packs.md +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/importer.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/notation.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/pack.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/sheet.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/analysis.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/columns.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/compare_nets.py +0 -0
- {openprocess-0.8.0/openprocess/mining/discovery → openprocess-0.10.5/openprocess/mining/conformance}/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/conformance/alignments.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/conformance/quality.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/conformance/token_replay.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/csv_import.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/definitions.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/dfg.py +0 -0
- {openprocess-0.8.0/openprocess/mining/conformance → openprocess-0.10.5/openprocess/mining/discovery}/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/discovery/alpha.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/discovery/heuristics.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/discovery/inductive.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/discovery/state_regions.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/filtering.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/footprint.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/invariants.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/layout.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/log.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/petrinet.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/playout.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/pm4py_bridge.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/pnml.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/processtree.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/regions.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/stats.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/structure.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/transition_system.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/xes.py +0 -0
- {openprocess-0.8.0/openprocess/io → openprocess-0.10.5/openprocess/ml}/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/ast_nodes.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/builtins.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/colorsets.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/errors.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/evaluator.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/lexer.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/multiset.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/parser.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/values.py +0 -0
- {openprocess-0.8.0/openprocess/gui → openprocess-0.10.5/openprocess/model}/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/model/declarations.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/model/examples.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/model/net.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/model/plain.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/references.py +0 -0
- {openprocess-0.8.0/openprocess/analysis → openprocess-0.10.5/openprocess/sim}/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/sim/binding.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/sim/export.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/sim/simulator.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/__init__.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/answers.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/checks.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/pack.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/sheet.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/dependency_links.txt +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/entry_points.txt +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/requires.txt +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/top_level.txt +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/pyproject.toml +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/setup.cfg +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_arc_editing.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_colorsets.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_columns.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_cpn_course_model.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_definitions.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_hierarchy.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_io.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_learn.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_learn_gui.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_log_editing.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_mining.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_ml.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_multiset.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_regions.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_rename.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_simulation.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_state_space.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_teaching.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_tidy.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_updates.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_wf_structure.py +0 -0
- {openprocess-0.8.0 → openprocess-0.10.5}/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.10.5
|
|
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
|
|
@@ -68,7 +68,7 @@ tools (and, until version 0.7, went by the name CPNpy):
|
|
|
68
68
|
| | What you can do | Instead of |
|
|
69
69
|
|---|---|---|
|
|
70
70
|
| **Petri nets & WF-nets** | Draw nets the way the lectures do. Get a soundness verdict with a counterexample for every violation, and replay it in the token game. Also: behavioural properties, P- and T-invariants, the footprint matrix, the reachability graph, PNML import and export. | WoPeD, ProM, pen and paper |
|
|
71
|
-
| **Process mining** | Import XES or CSV logs, or type textbook logs like `[<a,b,c>^3, <a,c>^2]`. Filter them, explore variants, the dotted chart and the process map. Discover models (α-algorithm, Inductive Miner, Heuristics Miner, state-based regions). Check conformance (token replay, alignments, precision…) and compare logs. | ProM, Disco |
|
|
71
|
+
| **Process mining** | Import XES or CSV logs, OCEL 2.0 object-centric logs, or type textbook logs like `[<a,b,c>^3, <a,c>^2]`. Filter them, explore variants, the dotted chart and the process map. Discover models (α-algorithm, Inductive Miner, Heuristics Miner, state-based regions). Check conformance (token replay, alignments, precision…) and compare logs. | ProM, Disco |
|
|
72
72
|
| **Coloured Petri nets** | Open, edit and save CPN Tools models (`.cpn`), hierarchical ones included. Step through or simulate them, compute the state space, and export a simulation as an event log to mine. | CPN Tools / CPN IDE |
|
|
73
73
|
| **Workflows** | Boxes on a canvas: a log, a miner, a fitness check, a comparison, a sweep over a setting, a prediction pipeline. Click a box to see its result, *how* it got there (the α-algorithm's eight steps, the replay per variant), its code and its settings. Change a setting and only what follows runs again. Saved as a `.cpnflow` file with everything needed to get the same numbers back. Your own algorithm is one Python function in a `boxes/` folder. | RapidProM |
|
|
74
74
|
| **Learn** | A mode of its own for worksheets, built on the app: answer in boxes on the sheet (sets, markings, matrices, cuts and trees, alignments, a net in the editor or a workflow on the canvas beside it) and press **Check**. Most answers are checked automatically, often against answers worked out from the given log or net. Packs are plain Markdown, can be exams with a clock and points, and a past exam imports as a skeleton pack. Demo exercises included. | Answer sheets, a notes app and guesswork |
|
|
@@ -244,11 +244,11 @@ handling (unsound — try Analysis)**.
|
|
|
244
244
|
2. Look through the tabs: *Overview*, *Variants*, *Cases*, *Dotted chart*,
|
|
245
245
|
*Process map*, *Footprint*. **Filter…** keeps part of the log as a new
|
|
246
246
|
log.
|
|
247
|
-
3. On the *Discover* tab, pick an algorithm
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
4.
|
|
251
|
-
|
|
247
|
+
3. On the *Discover* tab, pick an algorithm and press **Discover in Mine →**:
|
|
248
|
+
an analysis opens with the log and the miner connected and run. Click the
|
|
249
|
+
miner for its result, *How* it was derived, and the *Code* it ran.
|
|
250
|
+
4. **+ Add box ▸ Check fit** on that canvas, wired to the miner and the
|
|
251
|
+
log, scores fitness, precision and more, every step shown.
|
|
252
252
|
|
|
253
253
|
**Simulate a coloured net**
|
|
254
254
|
|
|
@@ -267,15 +267,22 @@ round.
|
|
|
267
267
|
|
|
268
268
|

|
|
269
269
|
|
|
270
|
+
**Three spaces, one folder.** The switcher at the top of the window picks
|
|
271
|
+
**Mine** (event logs and analyses), **Model** (Petri nets and coloured nets)
|
|
272
|
+
or **Learn** (exercises). Each has its own sidebar, so mining and modelling
|
|
273
|
+
never share a list; a document opens in its space, and the folder remembers
|
|
274
|
+
which space you were in.
|
|
275
|
+
|
|
270
276
|
**In the sidebar**
|
|
271
277
|
|
|
272
|
-
- **
|
|
273
|
-
that are not open yet are lighter:
|
|
274
|
-
(✕ or ⌘W) puts it back in that
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
278
|
+
- **Mine lists the folder's analyses**, and its logs folded under them.
|
|
279
|
+
**Model lists its models.** Files that are not open yet are lighter:
|
|
280
|
+
**click one to open it**. Closing a file (✕ or ⌘W) puts it back in that
|
|
281
|
+
state; it stays in the folder.
|
|
282
|
+
- **Flat lists, the same in both spaces.** The folder's own files first,
|
|
283
|
+
then each subfolder's under a caption naming it ("Week 5 / Part 1").
|
|
284
|
+
Nothing to unfold except LOGS. An empty folder shows in both spaces until
|
|
285
|
+
it has files.
|
|
279
286
|
- **Organise from the app**: right-click for **New Folder…**, **Rename…**,
|
|
280
287
|
**Show in Finder** and **Move to Bin** (recoverable from the Bin; never a
|
|
281
288
|
hard delete). **Drag files onto a subfolder** to move them on disk. An open
|
|
@@ -416,8 +423,10 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
416
423
|
a log's footprint (α-algorithm, footprint conformance).
|
|
417
424
|
- **Reachability graph…**, or a coverability graph with ω when the net is
|
|
418
425
|
unbounded.
|
|
419
|
-
- **
|
|
420
|
-
|
|
426
|
+
- **Check against a log ›** (Analysis tab) builds an analysis in Mine with
|
|
427
|
+
this net, a log you pick and *Check fit*, connected and run.
|
|
428
|
+
- Every analysis card has a **{ } code** link that opens the function it is
|
|
429
|
+
computed by, so nothing here is a black box.
|
|
421
430
|
|
|
422
431
|
| The counterexample, replayed | The footprint of the net |
|
|
423
432
|
|---|---|
|
|
@@ -428,8 +437,10 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
428
437
|
- **Step through / Simulate:** the token game, fired by hand or at random.
|
|
429
438
|
With **Trace** ticked, every fired transition shows its step numbers and
|
|
430
439
|
the arcs the tokens used light up, the latest step strongest.
|
|
431
|
-
- **
|
|
432
|
-
|
|
440
|
+
- **Mine a simulated log ›:** plays the net out many times, saves the traces
|
|
441
|
+
as a log in the folder and opens Mine on a new analysis reading it.
|
|
442
|
+
- **Check against a log ›** (Analysis tab): picks a log and opens Mine on a
|
|
443
|
+
new analysis with this net, the log and *Check fit*, connected and run.
|
|
433
444
|
- **Saving:** nets are saved as **PNML** (ProM, WoPeD and PM4Py read it), or
|
|
434
445
|
as `.cpn`. *Save As* names the net after its file. With a folder open, a
|
|
435
446
|
new net is `Untitled 1.pnml` in the folder from the start and is saved as
|
|
@@ -438,8 +449,9 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
438
449
|
- **Renaming:** double-click the net's name in the sidebar, or its title
|
|
439
450
|
above the canvas. The file is renamed with it, in the same folder (an
|
|
440
451
|
existing file is never overwritten).
|
|
441
|
-
- **Opening:** a `.pnml` file opens in this editor. A
|
|
442
|
-
has
|
|
452
|
+
- **Opening:** a `.pnml` file opens in this editor. A net discovered in Mine
|
|
453
|
+
has **Open a copy in Model ›** to bring a copy here; the original result is
|
|
454
|
+
never changed, and the copy's header links back to the analysis.
|
|
443
455
|
|
|
444
456
|

|
|
445
457
|
|
|
@@ -475,21 +487,24 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
475
487
|
- Time unit (Auto, or seconds up to years) and a grid step you can type in.
|
|
476
488
|
- Colour and shape by any attribute. The default palette can be changed
|
|
477
489
|
per value: right-click a value in the legend and pick its colour.
|
|
478
|
-
- **Discover
|
|
490
|
+
- **Discover** hands the log to an analysis in Mine (**Discover in Mine →**),
|
|
491
|
+
where the miner is a box with its result, its *How* and its *Code*:
|
|
479
492
|
- α-algorithm, which shows its eight steps;
|
|
480
|
-
- Inductive Miner
|
|
481
|
-
- Heuristics Miner, as a
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
+
- Inductive Miner (with a noise setting for IMf);
|
|
494
|
+
- Heuristics Miner, as a Petri net: which forks are AND and which XOR is
|
|
495
|
+
learned from the log (a causal net, whose bindings are listed). Like in
|
|
496
|
+
ProM, such a net fits its log but is not always sound;
|
|
497
|
+
- **state-based regions**, two-phase: *Classical states* turns the log
|
|
498
|
+
into a transition system through a state function you choose (the
|
|
499
|
+
prefix, postfix or both of each event; as a set, multiset or sequence;
|
|
500
|
+
over the last *k* events or all of them), and *Regions to net* makes its
|
|
501
|
+
minimal regions the places. The derivation shows the transition system,
|
|
502
|
+
the regions, GER and minimal pre- and post-regions of every event, state
|
|
503
|
+
separation and forward closure, and whether the net's reachability graph
|
|
504
|
+
is isomorphic to the transition system.
|
|
505
|
+
|
|
506
|
+
In Learn, an exercise's log page keeps the miners on the page, since the
|
|
507
|
+
exercise is the context there.
|
|
493
508
|
- **Transition systems** (File ▸ New Transition System…, or a `ts.txt` file):
|
|
494
509
|
type one as `s0 -a-> s1, s0 -b-> s2` and get the same region analysis and
|
|
495
510
|
synthesis. *Is this a region?* answers yes or no for any set of states
|
|
@@ -754,20 +769,41 @@ Miner, a fitness check), *Compare discovery* (three miners side by side),
|
|
|
754
769
|
confidence* (bootstrap intervals, a test and a plot; needs the `science`
|
|
755
770
|
extra) and *Predict the next activity*. Or start empty.
|
|
756
771
|
|
|
757
|
-
- **The page is the canvas.**
|
|
758
|
-
**Run ▶**, and **⋯** for Re-run, Record, Export experiment
|
|
772
|
+
- **The page is the canvas.** Its header has **Canvas | Summary**, then
|
|
773
|
+
**+ Add box**, **Run ▶**, and **⋯** for Re-run, Record, Export experiment
|
|
774
|
+
and Save. The sidebar beside it lists the folder's analyses and, folded
|
|
775
|
+
under them, its logs.
|
|
759
776
|
- **+ Add box** (or a double-click on the canvas) opens every box, by group:
|
|
760
777
|
the six core groups side by side (Input, Filter, Discover, Check, Compare,
|
|
761
778
|
Output) and one line for the rest (Science, Predict, Coloured nets, Sweep,
|
|
762
|
-
your own boxes) with *Show all*.
|
|
763
|
-
|
|
779
|
+
your own boxes) with *Show all*. Under *Input*, **the folder's own files**:
|
|
780
|
+
one click adds the box that reads the file, already set. Type to search
|
|
781
|
+
them all: "alpha" finds the α-algorithm, "boarding" the log; Enter adds the
|
|
782
|
+
first match.
|
|
783
|
+
- **Files flow into the canvas.** Drop a log, an OCEL 2.0 object-centric log
|
|
784
|
+
(`.jsonocel`), a PNML file, a .cpn or a ts.txt on the canvas and it becomes
|
|
785
|
+
its input box at that spot; an input
|
|
786
|
+
box names its file ("INPUT · boarding.xes"). *Open log…* and *Log from
|
|
787
|
+
notation…* in the sidebar land as boxes on the current analysis (or a new
|
|
788
|
+
one named after the file). In a box's **Settings**, *Choose…* picks the
|
|
789
|
+
file and the list beside it offers only the files the box can read.
|
|
790
|
+
- **Summary** is the key figure of every box, in one place: a tile per box,
|
|
791
|
+
in the order the boxes run (a score's first metric, a table's size, a
|
|
792
|
+
log's cases, a net's places and transitions). Nothing is computed there:
|
|
793
|
+
a tile is the box's result, as on the canvas, and a tile opens the box.
|
|
794
|
+
The process map under the tiles is the *Directly-follows graph* box's
|
|
795
|
+
result; an analysis without that box offers to add it in one click.
|
|
764
796
|
- **Connect** by dragging from the dot on the right of a box: while you drag,
|
|
765
797
|
only the inputs that take that kind of result light up, so a wrong
|
|
766
798
|
connection cannot be made. Click a wire and press Delete to remove it.
|
|
767
799
|
- **Click a box** and the side panel appears beside the canvas, on
|
|
768
800
|
**Result** (the net, the log's figures, the table, the figure; a log's
|
|
769
801
|
Result has *Open as log ›* for the dotted chart, process map, footprint,
|
|
770
|
-
variants and cases
|
|
802
|
+
variants and cases, and a net's has *Open a copy in Model ›*). A page
|
|
803
|
+
opened this way shows "‹ Back to <analysis>" above its title. A
|
|
804
|
+
discovered net can be tidied on the Result tab by dragging its places and
|
|
805
|
+
transitions (the layout is saved with the workflow); the net itself is not
|
|
806
|
+
changed there. Its other tabs: **How** (what the box reported: notes,
|
|
771
807
|
intermediate values, the derivation), **Code** (the box's few lines and,
|
|
772
808
|
under them, the actual algorithm it calls: the α-algorithm's eight steps,
|
|
773
809
|
the Inductive Miner's cuts, with the work each follows and *Whole file* for
|
|
@@ -793,6 +829,14 @@ extra) and *Predict the next activity*. Or start empty.
|
|
|
793
829
|
material for a paper, which `openprocess run --check` can verify.
|
|
794
830
|
- **The side panel** resizes by dragging the gap beside it; double-click the
|
|
795
831
|
gap, or *View ▸ Reset Workflow Layout*, for its default width.
|
|
832
|
+
- **Connections** (at the bottom of the sidebar, or *View ▸ Connections*)
|
|
833
|
+
draws what flows in, OpenProcess and its boxes, what flows out, and the
|
|
834
|
+
optional tools (pandas, numpy, scipy, matplotlib, …) with whether each is
|
|
835
|
+
installed, how to install it and the boxes it brings. All of it is read
|
|
836
|
+
from the box library.
|
|
837
|
+
- **Motion** is kept short: a space switch, the side panel and Canvas ↔
|
|
838
|
+
Summary settle in a fifth of a second, and a box pulses once when it
|
|
839
|
+
finishes. `OPENPROCESS_NO_MOTION=1` turns it off.
|
|
796
840
|
|
|
797
841
|
## Workflows from Python
|
|
798
842
|
|
|
@@ -29,7 +29,7 @@ tools (and, until version 0.7, went by the name CPNpy):
|
|
|
29
29
|
| | What you can do | Instead of |
|
|
30
30
|
|---|---|---|
|
|
31
31
|
| **Petri nets & WF-nets** | Draw nets the way the lectures do. Get a soundness verdict with a counterexample for every violation, and replay it in the token game. Also: behavioural properties, P- and T-invariants, the footprint matrix, the reachability graph, PNML import and export. | WoPeD, ProM, pen and paper |
|
|
32
|
-
| **Process mining** | Import XES or CSV logs, or type textbook logs like `[<a,b,c>^3, <a,c>^2]`. Filter them, explore variants, the dotted chart and the process map. Discover models (α-algorithm, Inductive Miner, Heuristics Miner, state-based regions). Check conformance (token replay, alignments, precision…) and compare logs. | ProM, Disco |
|
|
32
|
+
| **Process mining** | Import XES or CSV logs, OCEL 2.0 object-centric logs, or type textbook logs like `[<a,b,c>^3, <a,c>^2]`. Filter them, explore variants, the dotted chart and the process map. Discover models (α-algorithm, Inductive Miner, Heuristics Miner, state-based regions). Check conformance (token replay, alignments, precision…) and compare logs. | ProM, Disco |
|
|
33
33
|
| **Coloured Petri nets** | Open, edit and save CPN Tools models (`.cpn`), hierarchical ones included. Step through or simulate them, compute the state space, and export a simulation as an event log to mine. | CPN Tools / CPN IDE |
|
|
34
34
|
| **Workflows** | Boxes on a canvas: a log, a miner, a fitness check, a comparison, a sweep over a setting, a prediction pipeline. Click a box to see its result, *how* it got there (the α-algorithm's eight steps, the replay per variant), its code and its settings. Change a setting and only what follows runs again. Saved as a `.cpnflow` file with everything needed to get the same numbers back. Your own algorithm is one Python function in a `boxes/` folder. | RapidProM |
|
|
35
35
|
| **Learn** | A mode of its own for worksheets, built on the app: answer in boxes on the sheet (sets, markings, matrices, cuts and trees, alignments, a net in the editor or a workflow on the canvas beside it) and press **Check**. Most answers are checked automatically, often against answers worked out from the given log or net. Packs are plain Markdown, can be exams with a clock and points, and a past exam imports as a skeleton pack. Demo exercises included. | Answer sheets, a notes app and guesswork |
|
|
@@ -205,11 +205,11 @@ handling (unsound — try Analysis)**.
|
|
|
205
205
|
2. Look through the tabs: *Overview*, *Variants*, *Cases*, *Dotted chart*,
|
|
206
206
|
*Process map*, *Footprint*. **Filter…** keeps part of the log as a new
|
|
207
207
|
log.
|
|
208
|
-
3. On the *Discover* tab, pick an algorithm
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
4.
|
|
212
|
-
|
|
208
|
+
3. On the *Discover* tab, pick an algorithm and press **Discover in Mine →**:
|
|
209
|
+
an analysis opens with the log and the miner connected and run. Click the
|
|
210
|
+
miner for its result, *How* it was derived, and the *Code* it ran.
|
|
211
|
+
4. **+ Add box ▸ Check fit** on that canvas, wired to the miner and the
|
|
212
|
+
log, scores fitness, precision and more, every step shown.
|
|
213
213
|
|
|
214
214
|
**Simulate a coloured net**
|
|
215
215
|
|
|
@@ -228,15 +228,22 @@ round.
|
|
|
228
228
|
|
|
229
229
|

|
|
230
230
|
|
|
231
|
+
**Three spaces, one folder.** The switcher at the top of the window picks
|
|
232
|
+
**Mine** (event logs and analyses), **Model** (Petri nets and coloured nets)
|
|
233
|
+
or **Learn** (exercises). Each has its own sidebar, so mining and modelling
|
|
234
|
+
never share a list; a document opens in its space, and the folder remembers
|
|
235
|
+
which space you were in.
|
|
236
|
+
|
|
231
237
|
**In the sidebar**
|
|
232
238
|
|
|
233
|
-
- **
|
|
234
|
-
that are not open yet are lighter:
|
|
235
|
-
(✕ or ⌘W) puts it back in that
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
239
|
+
- **Mine lists the folder's analyses**, and its logs folded under them.
|
|
240
|
+
**Model lists its models.** Files that are not open yet are lighter:
|
|
241
|
+
**click one to open it**. Closing a file (✕ or ⌘W) puts it back in that
|
|
242
|
+
state; it stays in the folder.
|
|
243
|
+
- **Flat lists, the same in both spaces.** The folder's own files first,
|
|
244
|
+
then each subfolder's under a caption naming it ("Week 5 / Part 1").
|
|
245
|
+
Nothing to unfold except LOGS. An empty folder shows in both spaces until
|
|
246
|
+
it has files.
|
|
240
247
|
- **Organise from the app**: right-click for **New Folder…**, **Rename…**,
|
|
241
248
|
**Show in Finder** and **Move to Bin** (recoverable from the Bin; never a
|
|
242
249
|
hard delete). **Drag files onto a subfolder** to move them on disk. An open
|
|
@@ -377,8 +384,10 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
377
384
|
a log's footprint (α-algorithm, footprint conformance).
|
|
378
385
|
- **Reachability graph…**, or a coverability graph with ω when the net is
|
|
379
386
|
unbounded.
|
|
380
|
-
- **
|
|
381
|
-
|
|
387
|
+
- **Check against a log ›** (Analysis tab) builds an analysis in Mine with
|
|
388
|
+
this net, a log you pick and *Check fit*, connected and run.
|
|
389
|
+
- Every analysis card has a **{ } code** link that opens the function it is
|
|
390
|
+
computed by, so nothing here is a black box.
|
|
382
391
|
|
|
383
392
|
| The counterexample, replayed | The footprint of the net |
|
|
384
393
|
|---|---|
|
|
@@ -389,8 +398,10 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
389
398
|
- **Step through / Simulate:** the token game, fired by hand or at random.
|
|
390
399
|
With **Trace** ticked, every fired transition shows its step numbers and
|
|
391
400
|
the arcs the tokens used light up, the latest step strongest.
|
|
392
|
-
- **
|
|
393
|
-
|
|
401
|
+
- **Mine a simulated log ›:** plays the net out many times, saves the traces
|
|
402
|
+
as a log in the folder and opens Mine on a new analysis reading it.
|
|
403
|
+
- **Check against a log ›** (Analysis tab): picks a log and opens Mine on a
|
|
404
|
+
new analysis with this net, the log and *Check fit*, connected and run.
|
|
394
405
|
- **Saving:** nets are saved as **PNML** (ProM, WoPeD and PM4Py read it), or
|
|
395
406
|
as `.cpn`. *Save As* names the net after its file. With a folder open, a
|
|
396
407
|
new net is `Untitled 1.pnml` in the folder from the start and is saved as
|
|
@@ -399,8 +410,9 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
399
410
|
- **Renaming:** double-click the net's name in the sidebar, or its title
|
|
400
411
|
above the canvas. The file is renamed with it, in the same folder (an
|
|
401
412
|
existing file is never overwritten).
|
|
402
|
-
- **Opening:** a `.pnml` file opens in this editor. A
|
|
403
|
-
has
|
|
413
|
+
- **Opening:** a `.pnml` file opens in this editor. A net discovered in Mine
|
|
414
|
+
has **Open a copy in Model ›** to bring a copy here; the original result is
|
|
415
|
+
never changed, and the copy's header links back to the analysis.
|
|
404
416
|
|
|
405
417
|

|
|
406
418
|
|
|
@@ -436,21 +448,24 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
|
|
|
436
448
|
- Time unit (Auto, or seconds up to years) and a grid step you can type in.
|
|
437
449
|
- Colour and shape by any attribute. The default palette can be changed
|
|
438
450
|
per value: right-click a value in the legend and pick its colour.
|
|
439
|
-
- **Discover
|
|
451
|
+
- **Discover** hands the log to an analysis in Mine (**Discover in Mine →**),
|
|
452
|
+
where the miner is a box with its result, its *How* and its *Code*:
|
|
440
453
|
- α-algorithm, which shows its eight steps;
|
|
441
|
-
- Inductive Miner
|
|
442
|
-
- Heuristics Miner, as a
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
+
- Inductive Miner (with a noise setting for IMf);
|
|
455
|
+
- Heuristics Miner, as a Petri net: which forks are AND and which XOR is
|
|
456
|
+
learned from the log (a causal net, whose bindings are listed). Like in
|
|
457
|
+
ProM, such a net fits its log but is not always sound;
|
|
458
|
+
- **state-based regions**, two-phase: *Classical states* turns the log
|
|
459
|
+
into a transition system through a state function you choose (the
|
|
460
|
+
prefix, postfix or both of each event; as a set, multiset or sequence;
|
|
461
|
+
over the last *k* events or all of them), and *Regions to net* makes its
|
|
462
|
+
minimal regions the places. The derivation shows the transition system,
|
|
463
|
+
the regions, GER and minimal pre- and post-regions of every event, state
|
|
464
|
+
separation and forward closure, and whether the net's reachability graph
|
|
465
|
+
is isomorphic to the transition system.
|
|
466
|
+
|
|
467
|
+
In Learn, an exercise's log page keeps the miners on the page, since the
|
|
468
|
+
exercise is the context there.
|
|
454
469
|
- **Transition systems** (File ▸ New Transition System…, or a `ts.txt` file):
|
|
455
470
|
type one as `s0 -a-> s1, s0 -b-> s2` and get the same region analysis and
|
|
456
471
|
synthesis. *Is this a region?* answers yes or no for any set of states
|
|
@@ -715,20 +730,41 @@ Miner, a fitness check), *Compare discovery* (three miners side by side),
|
|
|
715
730
|
confidence* (bootstrap intervals, a test and a plot; needs the `science`
|
|
716
731
|
extra) and *Predict the next activity*. Or start empty.
|
|
717
732
|
|
|
718
|
-
- **The page is the canvas.**
|
|
719
|
-
**Run ▶**, and **⋯** for Re-run, Record, Export experiment
|
|
733
|
+
- **The page is the canvas.** Its header has **Canvas | Summary**, then
|
|
734
|
+
**+ Add box**, **Run ▶**, and **⋯** for Re-run, Record, Export experiment
|
|
735
|
+
and Save. The sidebar beside it lists the folder's analyses and, folded
|
|
736
|
+
under them, its logs.
|
|
720
737
|
- **+ Add box** (or a double-click on the canvas) opens every box, by group:
|
|
721
738
|
the six core groups side by side (Input, Filter, Discover, Check, Compare,
|
|
722
739
|
Output) and one line for the rest (Science, Predict, Coloured nets, Sweep,
|
|
723
|
-
your own boxes) with *Show all*.
|
|
724
|
-
|
|
740
|
+
your own boxes) with *Show all*. Under *Input*, **the folder's own files**:
|
|
741
|
+
one click adds the box that reads the file, already set. Type to search
|
|
742
|
+
them all: "alpha" finds the α-algorithm, "boarding" the log; Enter adds the
|
|
743
|
+
first match.
|
|
744
|
+
- **Files flow into the canvas.** Drop a log, an OCEL 2.0 object-centric log
|
|
745
|
+
(`.jsonocel`), a PNML file, a .cpn or a ts.txt on the canvas and it becomes
|
|
746
|
+
its input box at that spot; an input
|
|
747
|
+
box names its file ("INPUT · boarding.xes"). *Open log…* and *Log from
|
|
748
|
+
notation…* in the sidebar land as boxes on the current analysis (or a new
|
|
749
|
+
one named after the file). In a box's **Settings**, *Choose…* picks the
|
|
750
|
+
file and the list beside it offers only the files the box can read.
|
|
751
|
+
- **Summary** is the key figure of every box, in one place: a tile per box,
|
|
752
|
+
in the order the boxes run (a score's first metric, a table's size, a
|
|
753
|
+
log's cases, a net's places and transitions). Nothing is computed there:
|
|
754
|
+
a tile is the box's result, as on the canvas, and a tile opens the box.
|
|
755
|
+
The process map under the tiles is the *Directly-follows graph* box's
|
|
756
|
+
result; an analysis without that box offers to add it in one click.
|
|
725
757
|
- **Connect** by dragging from the dot on the right of a box: while you drag,
|
|
726
758
|
only the inputs that take that kind of result light up, so a wrong
|
|
727
759
|
connection cannot be made. Click a wire and press Delete to remove it.
|
|
728
760
|
- **Click a box** and the side panel appears beside the canvas, on
|
|
729
761
|
**Result** (the net, the log's figures, the table, the figure; a log's
|
|
730
762
|
Result has *Open as log ›* for the dotted chart, process map, footprint,
|
|
731
|
-
variants and cases
|
|
763
|
+
variants and cases, and a net's has *Open a copy in Model ›*). A page
|
|
764
|
+
opened this way shows "‹ Back to <analysis>" above its title. A
|
|
765
|
+
discovered net can be tidied on the Result tab by dragging its places and
|
|
766
|
+
transitions (the layout is saved with the workflow); the net itself is not
|
|
767
|
+
changed there. Its other tabs: **How** (what the box reported: notes,
|
|
732
768
|
intermediate values, the derivation), **Code** (the box's few lines and,
|
|
733
769
|
under them, the actual algorithm it calls: the α-algorithm's eight steps,
|
|
734
770
|
the Inductive Miner's cuts, with the work each follows and *Whole file* for
|
|
@@ -754,6 +790,14 @@ extra) and *Predict the next activity*. Or start empty.
|
|
|
754
790
|
material for a paper, which `openprocess run --check` can verify.
|
|
755
791
|
- **The side panel** resizes by dragging the gap beside it; double-click the
|
|
756
792
|
gap, or *View ▸ Reset Workflow Layout*, for its default width.
|
|
793
|
+
- **Connections** (at the bottom of the sidebar, or *View ▸ Connections*)
|
|
794
|
+
draws what flows in, OpenProcess and its boxes, what flows out, and the
|
|
795
|
+
optional tools (pandas, numpy, scipy, matplotlib, …) with whether each is
|
|
796
|
+
installed, how to install it and the boxes it brings. All of it is read
|
|
797
|
+
from the box library.
|
|
798
|
+
- **Motion** is kept short: a space switch, the side panel and Canvas ↔
|
|
799
|
+
Summary settle in a fifth of a second, and a box pulses once when it
|
|
800
|
+
finishes. `OPENPROCESS_NO_MOTION=1` turns it off.
|
|
757
801
|
|
|
758
802
|
## Workflows from Python
|
|
759
803
|
|
|
@@ -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.10.5"
|
|
52
52
|
|
|
53
53
|
__all__ = [
|
|
54
54
|
"Arc", "BindingElement", "CPNet", "Marking", "Multiset", "Page", "Place",
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"""Citations: BibTeX for the app, and for the works each algorithm follows.
|
|
2
|
+
|
|
3
|
+
The reference list (:mod:`openprocess.references`) is written for people, one
|
|
4
|
+
line per work. :func:`entry` turns such a line into a BibTeX entry, well
|
|
5
|
+
enough for a bibliography: the authors before the title, the title between
|
|
6
|
+
asterisks, the venue after it, the year at the end, and the DOI or URL when
|
|
7
|
+
the reference has one. :func:`app_bibtex` cites the app itself, with its
|
|
8
|
+
version; ``CITATION.cff`` at the top of the repository says the same for
|
|
9
|
+
GitHub's *Cite this repository*.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import datetime as _dt
|
|
15
|
+
import re
|
|
16
|
+
from dataclasses import dataclass, field
|
|
17
|
+
|
|
18
|
+
from . import references as _references
|
|
19
|
+
|
|
20
|
+
APP_TITLE = "OpenProcess: process mining, Petri nets and workflows in one open app"
|
|
21
|
+
APP_URL = "https://github.com/s4mstruthers/openprocess"
|
|
22
|
+
APP_AUTHORS = (("Struthers", "Sam"),)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def app_version() -> str:
|
|
26
|
+
from . import __version__
|
|
27
|
+
return __version__
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# ---------------------------------------------------------------------------
|
|
31
|
+
# One entry
|
|
32
|
+
# ---------------------------------------------------------------------------
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class Entry:
|
|
35
|
+
"""A BibTeX entry: its kind (``article``, ``book``, …), key and fields, in order."""
|
|
36
|
+
|
|
37
|
+
kind: str
|
|
38
|
+
key: str
|
|
39
|
+
fields: dict[str, str] = field(default_factory=dict)
|
|
40
|
+
|
|
41
|
+
def bibtex(self) -> str:
|
|
42
|
+
width = max((len(name) for name in self.fields), default=0)
|
|
43
|
+
lines = [f"@{self.kind}{{{self.key},"]
|
|
44
|
+
for name, value in self.fields.items():
|
|
45
|
+
if value:
|
|
46
|
+
lines.append(f" {name.ljust(width)} = {{{_escape(value)}}},")
|
|
47
|
+
lines.append("}")
|
|
48
|
+
return "\n".join(lines)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _escape(value: str) -> str:
|
|
52
|
+
return value.replace("&", r"\&").replace("%", r"\%").replace("#", r"\#")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
_TITLE = re.compile(r"\*(.+?)\*")
|
|
56
|
+
_YEAR = re.compile(r"\b(19|20)\d{2}\b")
|
|
57
|
+
_VOLUME = re.compile(r"\s*(\d+)\((\d+)\):(\d+[–-]\d+)")
|
|
58
|
+
_PAGES = re.compile(r"pp\.\s*(\d+[–-]\d+)")
|
|
59
|
+
_PROCEEDINGS = ("LNCS", "LNBIP", "Proceedings", "Workshop", "Conference", "Demo Track", "CEUR", "Symposium",
|
|
60
|
+
"ICPM", "Models of Concurrency")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def entry(reference: _references.Reference) -> Entry:
|
|
64
|
+
"""The reference as a BibTeX entry (its kind guessed from the venue)."""
|
|
65
|
+
text = reference.citation.strip()
|
|
66
|
+
year_match = None
|
|
67
|
+
for year_match in _YEAR.finditer(text):
|
|
68
|
+
pass
|
|
69
|
+
year = year_match.group(0) if year_match else ""
|
|
70
|
+
link = reference.link or ""
|
|
71
|
+
doi, url = (link, "") if link.startswith("10.") else ("", link)
|
|
72
|
+
title_match = _TITLE.search(text)
|
|
73
|
+
if title_match is None: # a standard or a tool, named in one line
|
|
74
|
+
return Entry("misc", reference.key, {"title": text.rstrip("."), "year": year, "doi": doi, "url": url})
|
|
75
|
+
authors = text[:title_match.start()].strip().rstrip(".,").strip()
|
|
76
|
+
title = title_match.group(1).strip().rstrip(",")
|
|
77
|
+
rest = text[title_match.end():].strip().lstrip(".,").strip().rstrip(".")
|
|
78
|
+
rest = re.sub(r",?\s*" + re.escape(year) + r"\s*$", "", rest).strip().rstrip(",.") if year else rest
|
|
79
|
+
fields: dict[str, str] = {}
|
|
80
|
+
if any(ch.isdigit() for ch in authors) or " " not in authors:
|
|
81
|
+
fields["organization"] = authors # "ISO/IEC 15909-2:2011"
|
|
82
|
+
else:
|
|
83
|
+
fields["author"] = " and ".join(part.strip() for part in re.split(r",\s*|\s+and\s+", authors) if part.strip())
|
|
84
|
+
fields["title"] = title
|
|
85
|
+
lower = text.lower()
|
|
86
|
+
volume = _VOLUME.search(rest)
|
|
87
|
+
if "thesis" in lower:
|
|
88
|
+
kind = "phdthesis"
|
|
89
|
+
fields["school"] = re.sub(r"^phd thesis,?\s*", "", rest, flags=re.I)
|
|
90
|
+
elif "working paper" in lower or "technical report" in lower:
|
|
91
|
+
kind = "techreport"
|
|
92
|
+
fields["institution"] = rest
|
|
93
|
+
elif volume is not None:
|
|
94
|
+
kind = "article"
|
|
95
|
+
fields["journal"] = rest[:volume.start()].strip().rstrip(",")
|
|
96
|
+
fields["volume"], fields["number"], fields["pages"] = volume.group(1), volume.group(2), volume.group(3)
|
|
97
|
+
elif any(word in rest for word in _PROCEEDINGS):
|
|
98
|
+
kind = "inproceedings"
|
|
99
|
+
booktitle, publisher = rest, ""
|
|
100
|
+
if ". Springer" in rest or rest.endswith("Springer"):
|
|
101
|
+
booktitle, _, publisher = rest.rpartition(". ")
|
|
102
|
+
publisher = publisher.strip() or "Springer"
|
|
103
|
+
pages = _PAGES.search(booktitle)
|
|
104
|
+
if pages:
|
|
105
|
+
fields["pages"] = pages.group(1)
|
|
106
|
+
booktitle = _PAGES.sub("", booktitle).strip().rstrip(",")
|
|
107
|
+
fields["booktitle"] = booktitle
|
|
108
|
+
fields["publisher"] = publisher
|
|
109
|
+
elif "edition" in rest or rest.endswith("Press") or rest.startswith("Springer") or rest.startswith("Cambridge"):
|
|
110
|
+
kind = "book"
|
|
111
|
+
edition = re.search(r"(\d+)(st|nd|rd|th) edition", rest)
|
|
112
|
+
if edition:
|
|
113
|
+
fields["edition"] = edition.group(1)
|
|
114
|
+
rest = re.sub(r",?\s*\d+(st|nd|rd|th) edition\.?\s*", " ", rest).strip().rstrip(".,")
|
|
115
|
+
fields["publisher"] = rest
|
|
116
|
+
else:
|
|
117
|
+
kind = "misc"
|
|
118
|
+
fields["howpublished"] = rest
|
|
119
|
+
fields["year"] = year
|
|
120
|
+
fields["doi"] = doi
|
|
121
|
+
fields["url"] = url
|
|
122
|
+
return Entry(kind, reference.key, fields)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def entries_for_module(module: str) -> list[Entry]:
|
|
126
|
+
"""The works the code in ``module`` follows (see :func:`references.topics_for_module`)."""
|
|
127
|
+
seen, out = set(), []
|
|
128
|
+
for topic in _references.topics_for_module(module):
|
|
129
|
+
for key in topic.sources:
|
|
130
|
+
reference = _references.reference(key)
|
|
131
|
+
if reference is not None and key not in seen:
|
|
132
|
+
seen.add(key)
|
|
133
|
+
out.append(entry(reference))
|
|
134
|
+
return out
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# ---------------------------------------------------------------------------
|
|
138
|
+
# The app itself
|
|
139
|
+
# ---------------------------------------------------------------------------
|
|
140
|
+
def app_entry(version: str | None = None, year: int | None = None) -> Entry:
|
|
141
|
+
version = version or app_version()
|
|
142
|
+
year = year or _dt.date.today().year
|
|
143
|
+
return Entry("software", "openprocess", {
|
|
144
|
+
"author": " and ".join(f"{last}, {first}" for last, first in APP_AUTHORS),
|
|
145
|
+
"title": APP_TITLE,
|
|
146
|
+
"version": version,
|
|
147
|
+
"year": str(year),
|
|
148
|
+
"url": APP_URL,
|
|
149
|
+
"note": "Every algorithm shows its code and the paper it follows; every analysis keeps a record "
|
|
150
|
+
"that runs again",
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def app_bibtex(version: str | None = None, year: int | None = None) -> str:
|
|
155
|
+
return app_entry(version, year).bibtex()
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def app_text(version: str | None = None, year: int | None = None) -> str:
|
|
159
|
+
"""The citation in one line, as a reference list would have it."""
|
|
160
|
+
version = version or app_version()
|
|
161
|
+
year = year or _dt.date.today().year
|
|
162
|
+
authors = ", ".join(f"{first} {last}" for last, first in APP_AUTHORS)
|
|
163
|
+
return f"{authors}. {APP_TITLE} (version {version}) [software], {year}. {APP_URL}"
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def cff_text(version: str | None = None, released: _dt.date | None = None) -> str:
|
|
167
|
+
"""The contents of ``CITATION.cff`` (Citation File Format 1.2.0) for ``version``."""
|
|
168
|
+
version = version or app_version()
|
|
169
|
+
released = released or _dt.date.today()
|
|
170
|
+
authors = "\n".join(f" - family-names: {last}\n given-names: {first}" for last, first in APP_AUTHORS)
|
|
171
|
+
return (
|
|
172
|
+
"cff-version: 1.2.0\n"
|
|
173
|
+
"message: If you use OpenProcess in teaching or research, please cite it as below.\n"
|
|
174
|
+
"type: software\n"
|
|
175
|
+
f"title: {APP_TITLE}\n"
|
|
176
|
+
f"version: {version}\n"
|
|
177
|
+
f"date-released: {released.isoformat()}\n"
|
|
178
|
+
f"repository-code: {APP_URL}\n"
|
|
179
|
+
f"url: {APP_URL}\n"
|
|
180
|
+
"license: MIT\n"
|
|
181
|
+
"keywords:\n - process mining\n - Petri nets\n - workflow nets\n - conformance checking\n"
|
|
182
|
+
" - teaching\n - reproducible research\n"
|
|
183
|
+
f"authors:\n{authors}\n"
|
|
184
|
+
"abstract: >-\n"
|
|
185
|
+
" OpenProcess is a desktop app for process mining and Petri net modelling in which\n"
|
|
186
|
+
" every algorithm is a function whose code and source paper are one click away, and\n"
|
|
187
|
+
" every analysis keeps a record of its inputs, versions and seeds so that its numbers\n"
|
|
188
|
+
" can be checked again.\n"
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
__all__ = ["Entry", "entry", "entries_for_module", "app_entry", "app_bibtex", "app_text", "cff_text",
|
|
193
|
+
"APP_TITLE", "APP_URL"]
|