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.
Files changed (225) hide show
  1. {openprocess-0.8.0/openprocess.egg-info → openprocess-0.10.5}/PKG-INFO +83 -39
  2. {openprocess-0.8.0 → openprocess-0.10.5}/README.md +82 -38
  3. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/__init__.py +1 -1
  4. openprocess-0.10.5/openprocess/citation.py +193 -0
  5. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/box.py +20 -1
  6. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/discover.py +15 -1
  7. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/input.py +48 -6
  8. openprocess-0.10.5/openprocess/flow/figures.py +54 -0
  9. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/record.py +19 -4
  10. openprocess-0.10.5/openprocess/flow/report.py +270 -0
  11. openprocess-0.10.5/openprocess/flow/reproducibility.py +62 -0
  12. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/runner.py +16 -0
  13. openprocess-0.10.5/openprocess/flow/snapshots.py +179 -0
  14. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/types.py +4 -1
  15. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/workflow.py +11 -3
  16. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/canvas.py +8 -1
  17. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/canvas.py +73 -5
  18. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/page.py +278 -30
  19. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/picker.py +136 -16
  20. openprocess-0.10.5/openprocess/gui/flow/runs.py +130 -0
  21. openprocess-0.10.5/openprocess/gui/flow/stepper.py +240 -0
  22. openprocess-0.10.5/openprocess/gui/flow/summary.py +199 -0
  23. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/viewers.py +260 -46
  24. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/app.py +764 -255
  25. openprocess-0.10.5/openprocess/gui/studio/cite.py +58 -0
  26. openprocess-0.10.5/openprocess/gui/studio/command_palette.py +162 -0
  27. openprocess-0.10.5/openprocess/gui/studio/connections.py +186 -0
  28. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/cpn_page.py +7 -4
  29. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/documents.py +10 -0
  30. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/graph_builders.py +24 -0
  31. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/graph_view.py +60 -5
  32. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/log_page.py +49 -2
  33. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/model_page.py +30 -3
  34. openprocess-0.10.5/openprocess/gui/studio/motion.py +95 -0
  35. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/petri_page.py +24 -9
  36. openprocess-0.10.5/openprocess/gui/studio/provenance.py +66 -0
  37. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/regions_view.py +4 -1
  38. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/sidebar.py +10 -3
  39. openprocess-0.10.5/openprocess/gui/studio/spaces.py +60 -0
  40. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/style.py +31 -1
  41. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/widgets.py +71 -4
  42. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/workspace.py +2 -0
  43. openprocess-0.10.5/openprocess/mining/ocel.py +262 -0
  44. {openprocess-0.8.0 → openprocess-0.10.5/openprocess.egg-info}/PKG-INFO +83 -39
  45. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/SOURCES.txt +19 -0
  46. openprocess-0.10.5/tests/test_citation.py +55 -0
  47. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_exercises_gui.py +15 -12
  48. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_flow.py +74 -0
  49. openprocess-0.10.5/tests/test_flow_gui.py +1158 -0
  50. openprocess-0.10.5/tests/test_ocel.py +75 -0
  51. openprocess-0.10.5/tests/test_report.py +55 -0
  52. openprocess-0.10.5/tests/test_snapshots.py +55 -0
  53. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_studio_gui.py +308 -51
  54. openprocess-0.8.0/tests/test_flow_gui.py +0 -494
  55. {openprocess-0.8.0 → openprocess-0.10.5}/LICENSE +0 -0
  56. {openprocess-0.8.0 → openprocess-0.10.5}/cpnpy/__init__.py +0 -0
  57. {openprocess-0.8.0/openprocess/sim → openprocess-0.10.5/openprocess/analysis}/__init__.py +0 -0
  58. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/analysis/state_space.py +0 -0
  59. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/analysis/state_space_process.py +0 -0
  60. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/cli.py +0 -0
  61. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/answer.pnml +0 -0
  62. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/question.md +0 -0
  63. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/answer.pnml +0 -0
  64. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/net.pnml +0 -0
  65. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/question.md +0 -0
  66. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/log.txt +0 -0
  67. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/question.md +0 -0
  68. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/question.md +0 -0
  69. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/ts.txt +0 -0
  70. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/net.pnml +0 -0
  71. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/question.md +0 -0
  72. {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
  73. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/question.md +0 -0
  74. {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
  75. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m1.pnml +0 -0
  76. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m2.pnml +0 -0
  77. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m3.pnml +0 -0
  78. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/net.pnml +0 -0
  79. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/question.md +0 -0
  80. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/exercises/pack.md +0 -0
  81. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/__init__.py +0 -0
  82. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/__init__.py +0 -0
  83. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/check.py +0 -0
  84. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/compare.py +0 -0
  85. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/cpn.py +0 -0
  86. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/filter.py +0 -0
  87. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/output.py +0 -0
  88. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/predict.py +0 -0
  89. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/science.py +0 -0
  90. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/boxes/sweeps.py +0 -0
  91. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/convert.py +0 -0
  92. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/datasets.py +0 -0
  93. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/explain.py +0 -0
  94. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/library.py +0 -0
  95. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/flow/sweep.py +0 -0
  96. {openprocess-0.8.0/openprocess/model → openprocess-0.10.5/openprocess/gui}/__init__.py +0 -0
  97. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/app.py +0 -0
  98. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/arc_editing.py +0 -0
  99. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/__init__.py +0 -0
  100. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/flow/templates.py +0 -0
  101. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/items.py +0 -0
  102. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/learn/answer_boxes.py +0 -0
  103. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/learn/concealment.py +0 -0
  104. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/learn/mode.py +0 -0
  105. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/panning.py +0 -0
  106. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/resources/openprocess-icon.png +0 -0
  107. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/__init__.py +0 -0
  108. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/__main__.py +0 -0
  109. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/charts.py +0 -0
  110. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/compare_page.py +0 -0
  111. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/definition_view.py +0 -0
  112. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/derivation_view.py +0 -0
  113. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/dotted_chart.py +0 -0
  114. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/file_dialogs.py +0 -0
  115. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/filter_dialog.py +0 -0
  116. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/instances.py +0 -0
  117. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/log_editor.py +0 -0
  118. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/markdown_view.py +0 -0
  119. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/mathtext.py +0 -0
  120. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/ml_highlighter.py +0 -0
  121. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/net_comparison.py +0 -0
  122. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/notes_overlay.py +0 -0
  123. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/tool_icons.py +0 -0
  124. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/updates.py +0 -0
  125. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/studio/workers.py +0 -0
  126. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/theme.py +0 -0
  127. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/gui/tidy.py +0 -0
  128. {openprocess-0.8.0/openprocess/ml → openprocess-0.10.5/openprocess/io}/__init__.py +0 -0
  129. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/io/cpn_reader.py +0 -0
  130. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/io/cpn_writer.py +0 -0
  131. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/__init__.py +0 -0
  132. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/answers.py +0 -0
  133. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/checks.py +0 -0
  134. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/computed.py +0 -0
  135. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/context.py +0 -0
  136. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/exam.py +0 -0
  137. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/exercise-packs.md +0 -0
  138. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/importer.py +0 -0
  139. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/notation.py +0 -0
  140. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/pack.py +0 -0
  141. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/learn/sheet.py +0 -0
  142. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/__init__.py +0 -0
  143. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/analysis.py +0 -0
  144. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/columns.py +0 -0
  145. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/compare_nets.py +0 -0
  146. {openprocess-0.8.0/openprocess/mining/discovery → openprocess-0.10.5/openprocess/mining/conformance}/__init__.py +0 -0
  147. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/conformance/alignments.py +0 -0
  148. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/conformance/quality.py +0 -0
  149. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/conformance/token_replay.py +0 -0
  150. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/csv_import.py +0 -0
  151. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/definitions.py +0 -0
  152. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/dfg.py +0 -0
  153. {openprocess-0.8.0/openprocess/mining/conformance → openprocess-0.10.5/openprocess/mining/discovery}/__init__.py +0 -0
  154. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/discovery/alpha.py +0 -0
  155. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/discovery/heuristics.py +0 -0
  156. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/discovery/inductive.py +0 -0
  157. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/discovery/state_regions.py +0 -0
  158. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/filtering.py +0 -0
  159. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/footprint.py +0 -0
  160. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/invariants.py +0 -0
  161. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/layout.py +0 -0
  162. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/log.py +0 -0
  163. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/petrinet.py +0 -0
  164. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/playout.py +0 -0
  165. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/pm4py_bridge.py +0 -0
  166. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/pnml.py +0 -0
  167. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/processtree.py +0 -0
  168. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/regions.py +0 -0
  169. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/stats.py +0 -0
  170. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/structure.py +0 -0
  171. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/transition_system.py +0 -0
  172. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/mining/xes.py +0 -0
  173. {openprocess-0.8.0/openprocess/io → openprocess-0.10.5/openprocess/ml}/__init__.py +0 -0
  174. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/ast_nodes.py +0 -0
  175. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/builtins.py +0 -0
  176. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/colorsets.py +0 -0
  177. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/errors.py +0 -0
  178. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/evaluator.py +0 -0
  179. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/lexer.py +0 -0
  180. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/multiset.py +0 -0
  181. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/parser.py +0 -0
  182. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/ml/values.py +0 -0
  183. {openprocess-0.8.0/openprocess/gui → openprocess-0.10.5/openprocess/model}/__init__.py +0 -0
  184. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/model/declarations.py +0 -0
  185. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/model/examples.py +0 -0
  186. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/model/net.py +0 -0
  187. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/model/plain.py +0 -0
  188. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/references.py +0 -0
  189. {openprocess-0.8.0/openprocess/analysis → openprocess-0.10.5/openprocess/sim}/__init__.py +0 -0
  190. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/sim/binding.py +0 -0
  191. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/sim/export.py +0 -0
  192. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/sim/simulator.py +0 -0
  193. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/__init__.py +0 -0
  194. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/answers.py +0 -0
  195. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/checks.py +0 -0
  196. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/pack.py +0 -0
  197. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess/teaching/sheet.py +0 -0
  198. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/dependency_links.txt +0 -0
  199. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/entry_points.txt +0 -0
  200. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/requires.txt +0 -0
  201. {openprocess-0.8.0 → openprocess-0.10.5}/openprocess.egg-info/top_level.txt +0 -0
  202. {openprocess-0.8.0 → openprocess-0.10.5}/pyproject.toml +0 -0
  203. {openprocess-0.8.0 → openprocess-0.10.5}/setup.cfg +0 -0
  204. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_arc_editing.py +0 -0
  205. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_colorsets.py +0 -0
  206. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_columns.py +0 -0
  207. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_cpn_course_model.py +0 -0
  208. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_definitions.py +0 -0
  209. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_hierarchy.py +0 -0
  210. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_io.py +0 -0
  211. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_learn.py +0 -0
  212. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_learn_gui.py +0 -0
  213. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_log_editing.py +0 -0
  214. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_mining.py +0 -0
  215. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_ml.py +0 -0
  216. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_multiset.py +0 -0
  217. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_regions.py +0 -0
  218. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_rename.py +0 -0
  219. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_simulation.py +0 -0
  220. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_state_space.py +0 -0
  221. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_teaching.py +0 -0
  222. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_tidy.py +0 -0
  223. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_updates.py +0 -0
  224. {openprocess-0.8.0 → openprocess-0.10.5}/tests/test_wf_structure.py +0 -0
  225. {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.8.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: the model and how it was
248
- derived update straight away. **Open as model →** adds the result to the sidebar (under **MODELS**, or
249
- **UNSAVED** in a folder until you press **Keep** to save it there).
250
- 4. On the model's *Conformance* tab, choose a log and press **Check
251
- conformance**.
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
  ![The folder Week 2 in the sidebar, with its subfolders, one net open and the others listed](docs/screenshots/workspace.png)
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
- - **Every event log and net in the folder** is listed, open or not. Files
273
- that are not open yet are lighter: **click one to open it**. Closing a file
274
- (✕ or ⌘W) puts it back in that state; it stays in the folder.
275
- - **Folders** shows the folder as it is on disk, with collapsible subfolders
276
- (folders first, then files, by name). **By kind** groups the files into
277
- event logs, Petri nets and coloured nets instead. The choice, and which
278
- subfolders are open, is remembered for each folder.
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
- - **Conformance with a log…** opens the net as a model next to your logs,
420
- for token replay and alignments.
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
- - **Generate event log…:** plays the net out many times and opens the
432
- traces as a log.
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 model you discovered
442
- has **✎ Edit a copy** to bring it here.
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
  ![Renaming a transition in place](docs/screenshots/petri-editing.png)
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 and IMf;
481
- - Heuristics Miner, as a dependency graph or as a Petri net: which forks
482
- are AND and which XOR is learned from the log (a causal net, whose
483
- bindings are listed). Like in ProM, such a net fits its log but is not
484
- always sound;
485
- - **state-based regions**, two-phase: the log becomes a transition system
486
- through a state function you choose (the prefix, postfix or both of each
487
- event; as a set, multiset or sequence; over the last *k* events or all
488
- of them), and its minimal regions become the places. The derivation
489
- shows the transition system (pick a trace to light up the states it
490
- passes through), the regions, GER and minimal pre- and post-regions of
491
- every event, state separation and forward closure, and whether the
492
- net's reachability graph is isomorphic to the transition system.
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.** Three buttons in its header: **+ Add box**,
758
- **Run ▶**, and **⋯** for Re-run, Record, Export experiment and Save.
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*. Type to search them all: "alpha" finds the
763
- α-algorithm; Enter adds the first match.
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). Its other tabs: **How** (what the box reported: notes,
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: the model and how it was
209
- derived update straight away. **Open as model →** adds the result to the sidebar (under **MODELS**, or
210
- **UNSAVED** in a folder until you press **Keep** to save it there).
211
- 4. On the model's *Conformance* tab, choose a log and press **Check
212
- conformance**.
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
  ![The folder Week 2 in the sidebar, with its subfolders, one net open and the others listed](docs/screenshots/workspace.png)
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
- - **Every event log and net in the folder** is listed, open or not. Files
234
- that are not open yet are lighter: **click one to open it**. Closing a file
235
- (✕ or ⌘W) puts it back in that state; it stays in the folder.
236
- - **Folders** shows the folder as it is on disk, with collapsible subfolders
237
- (folders first, then files, by name). **By kind** groups the files into
238
- event logs, Petri nets and coloured nets instead. The choice, and which
239
- subfolders are open, is remembered for each folder.
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
- - **Conformance with a log…** opens the net as a model next to your logs,
381
- for token replay and alignments.
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
- - **Generate event log…:** plays the net out many times and opens the
393
- traces as a log.
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 model you discovered
403
- has **✎ Edit a copy** to bring it here.
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
  ![Renaming a transition in place](docs/screenshots/petri-editing.png)
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 and IMf;
442
- - Heuristics Miner, as a dependency graph or as a Petri net: which forks
443
- are AND and which XOR is learned from the log (a causal net, whose
444
- bindings are listed). Like in ProM, such a net fits its log but is not
445
- always sound;
446
- - **state-based regions**, two-phase: the log becomes a transition system
447
- through a state function you choose (the prefix, postfix or both of each
448
- event; as a set, multiset or sequence; over the last *k* events or all
449
- of them), and its minimal regions become the places. The derivation
450
- shows the transition system (pick a trace to light up the states it
451
- passes through), the regions, GER and minimal pre- and post-regions of
452
- every event, state separation and forward closure, and whether the
453
- net's reachability graph is isomorphic to the transition system.
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.** Three buttons in its header: **+ Add box**,
719
- **Run ▶**, and **⋯** for Re-run, Record, Export experiment and Save.
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*. Type to search them all: "alpha" finds the
724
- α-algorithm; Enter adds the first match.
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). Its other tabs: **How** (what the box reported: notes,
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.8.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"]