openprocess 0.13.1__tar.gz → 0.14.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. {openprocess-0.13.1/openprocess.egg-info → openprocess-0.14.0}/PKG-INFO +8 -5
  2. {openprocess-0.13.1 → openprocess-0.14.0}/README.md +6 -3
  3. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/__init__.py +1 -1
  4. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/studio.py +20 -1
  5. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/app.py +7 -3
  6. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/compare_page.py +10 -2
  7. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/connections.py +1 -1
  8. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/documents.py +21 -14
  9. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/dotted_chart.py +220 -96
  10. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/filter_dialog.py +80 -26
  11. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/log_editor.py +203 -45
  12. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/log_page.py +160 -29
  13. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/workers.py +18 -4
  14. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/columns.py +231 -17
  15. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/csv_import.py +65 -8
  16. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/dfg.py +57 -25
  17. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/dotted.py +197 -155
  18. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/filtering.py +36 -1
  19. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/log.py +17 -14
  20. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/stats.py +15 -11
  21. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/xes.py +115 -23
  22. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/packages.py +1 -1
  23. {openprocess-0.13.1 → openprocess-0.14.0/openprocess.egg-info}/PKG-INFO +8 -5
  24. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess.egg-info/SOURCES.txt +2 -0
  25. {openprocess-0.13.1 → openprocess-0.14.0}/pyproject.toml +8 -6
  26. openprocess-0.14.0/tests/test_dotted_chart.py +109 -0
  27. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_flow.py +18 -0
  28. openprocess-0.14.0/tests/test_large_log_page.py +353 -0
  29. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_researcher_api.py +3 -2
  30. {openprocess-0.13.1 → openprocess-0.14.0}/LICENSE +0 -0
  31. {openprocess-0.13.1 → openprocess-0.14.0}/cpnpy/__init__.py +0 -0
  32. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/analysis/__init__.py +0 -0
  33. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/analysis/state_space.py +0 -0
  34. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/analysis/state_space_process.py +0 -0
  35. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/citation.py +0 -0
  36. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/cli.py +0 -0
  37. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/answer.pnml +0 -0
  38. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/question.md +0 -0
  39. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/answer.pnml +0 -0
  40. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/net.pnml +0 -0
  41. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/question.md +0 -0
  42. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/log.txt +0 -0
  43. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/question.md +0 -0
  44. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/question.md +0 -0
  45. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/ts.txt +0 -0
  46. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/net.pnml +0 -0
  47. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/question.md +0 -0
  48. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/log.txt +0 -0
  49. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/question.md +0 -0
  50. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/log.txt +0 -0
  51. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m1.pnml +0 -0
  52. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m2.pnml +0 -0
  53. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m3.pnml +0 -0
  54. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/net.pnml +0 -0
  55. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/question.md +0 -0
  56. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/exercises/pack.md +0 -0
  57. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/__init__.py +0 -0
  58. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/box.py +0 -0
  59. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/__init__.py +0 -0
  60. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/check.py +0 -0
  61. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/compare.py +0 -0
  62. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/cpn.py +0 -0
  63. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/discover.py +0 -0
  64. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/filter.py +0 -0
  65. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/input.py +0 -0
  66. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/measure.py +0 -0
  67. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/output.py +0 -0
  68. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/predict.py +0 -0
  69. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/science.py +0 -0
  70. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/boxes/sweeps.py +0 -0
  71. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/changes.py +0 -0
  72. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/convert.py +0 -0
  73. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/datasets.py +0 -0
  74. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/derivation.py +0 -0
  75. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/explain.py +0 -0
  76. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/figures.py +0 -0
  77. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/history.py +0 -0
  78. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/library.py +0 -0
  79. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/loading.py +0 -0
  80. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/parallel.py +0 -0
  81. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/provenance.py +0 -0
  82. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/record.py +0 -0
  83. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/report.py +0 -0
  84. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/reproducibility.py +0 -0
  85. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/runner.py +0 -0
  86. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/script.py +0 -0
  87. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/snapshots.py +0 -0
  88. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/sweep.py +0 -0
  89. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/types.py +0 -0
  90. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/flow/workflow.py +0 -0
  91. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/__init__.py +0 -0
  92. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/app.py +0 -0
  93. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/arc_editing.py +0 -0
  94. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/canvas.py +0 -0
  95. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/__init__.py +0 -0
  96. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/canvas.py +0 -0
  97. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/page.py +0 -0
  98. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/picker.py +0 -0
  99. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/runs.py +0 -0
  100. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/stepper.py +0 -0
  101. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/summary.py +0 -0
  102. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/templates.py +0 -0
  103. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/flow/viewers.py +0 -0
  104. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/items.py +0 -0
  105. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/learn/answer_boxes.py +0 -0
  106. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/learn/concealment.py +0 -0
  107. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/learn/mode.py +0 -0
  108. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/panning.py +0 -0
  109. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/resources/openprocess-icon.png +0 -0
  110. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/__init__.py +0 -0
  111. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/__main__.py +0 -0
  112. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/alignment_view.py +0 -0
  113. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/charts.py +0 -0
  114. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/cite.py +0 -0
  115. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/command_palette.py +0 -0
  116. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/connect.py +0 -0
  117. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/cpn_page.py +0 -0
  118. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/definition_view.py +0 -0
  119. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/derivation_view.py +0 -0
  120. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/file_dialogs.py +0 -0
  121. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/graph_builders.py +0 -0
  122. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/graph_view.py +0 -0
  123. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/instances.py +0 -0
  124. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/loading.py +0 -0
  125. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/markdown_view.py +0 -0
  126. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/mathtext.py +0 -0
  127. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/ml_highlighter.py +0 -0
  128. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/model_page.py +0 -0
  129. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/motion.py +0 -0
  130. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/net_comparison.py +0 -0
  131. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/notes_overlay.py +0 -0
  132. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/petri_page.py +0 -0
  133. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/provenance.py +0 -0
  134. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/regions_view.py +0 -0
  135. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/remote.py +0 -0
  136. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/review.py +0 -0
  137. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/sidebar.py +0 -0
  138. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/spaces.py +0 -0
  139. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/style.py +0 -0
  140. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/tool_icons.py +0 -0
  141. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/updates.py +0 -0
  142. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/widgets.py +0 -0
  143. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/studio/workspace.py +0 -0
  144. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/theme.py +0 -0
  145. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/gui/tidy.py +0 -0
  146. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/io/__init__.py +0 -0
  147. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/io/cpn_reader.py +0 -0
  148. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/io/cpn_writer.py +0 -0
  149. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/__init__.py +0 -0
  150. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/answers.py +0 -0
  151. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/checks.py +0 -0
  152. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/computed.py +0 -0
  153. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/context.py +0 -0
  154. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/exam.py +0 -0
  155. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/exercise-packs.md +0 -0
  156. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/importer.py +0 -0
  157. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/notation.py +0 -0
  158. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/pack.py +0 -0
  159. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/learn/sheet.py +0 -0
  160. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mcp/__init__.py +0 -0
  161. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mcp/__main__.py +0 -0
  162. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mcp/api.py +0 -0
  163. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mcp/connecting.md +0 -0
  164. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mcp/install.py +0 -0
  165. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mcp/server.py +0 -0
  166. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/__init__.py +0 -0
  167. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/analysis.py +0 -0
  168. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/bpmn.py +0 -0
  169. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/cases.py +0 -0
  170. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/compare_nets.py +0 -0
  171. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/conformance/__init__.py +0 -0
  172. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/conformance/alignments.py +0 -0
  173. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/conformance/quality.py +0 -0
  174. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/conformance/token_replay.py +0 -0
  175. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/definitions.py +0 -0
  176. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/discovery/__init__.py +0 -0
  177. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/discovery/alpha.py +0 -0
  178. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/discovery/heuristics.py +0 -0
  179. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/discovery/inductive.py +0 -0
  180. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/discovery/state_regions.py +0 -0
  181. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/drawing.py +0 -0
  182. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/footprint.py +0 -0
  183. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/invariants.py +0 -0
  184. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/layout.py +0 -0
  185. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/ocel.py +0 -0
  186. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/parallel.py +0 -0
  187. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/petrinet.py +0 -0
  188. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/playout.py +0 -0
  189. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/pm4py_bridge.py +0 -0
  190. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/pnml.py +0 -0
  191. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/processtree.py +0 -0
  192. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/regions.py +0 -0
  193. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/structure.py +0 -0
  194. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/mining/transition_system.py +0 -0
  195. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/__init__.py +0 -0
  196. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/ast_nodes.py +0 -0
  197. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/builtins.py +0 -0
  198. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/colorsets.py +0 -0
  199. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/errors.py +0 -0
  200. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/evaluator.py +0 -0
  201. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/lexer.py +0 -0
  202. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/multiset.py +0 -0
  203. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/parser.py +0 -0
  204. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/ml/values.py +0 -0
  205. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/model/__init__.py +0 -0
  206. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/model/declarations.py +0 -0
  207. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/model/examples.py +0 -0
  208. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/model/net.py +0 -0
  209. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/model/plain.py +0 -0
  210. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/palette.py +0 -0
  211. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/parallel.py +0 -0
  212. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/references.py +0 -0
  213. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/sim/__init__.py +0 -0
  214. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/sim/binding.py +0 -0
  215. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/sim/export.py +0 -0
  216. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/sim/performance.py +0 -0
  217. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/sim/simulator.py +0 -0
  218. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/teaching/__init__.py +0 -0
  219. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/teaching/answers.py +0 -0
  220. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/teaching/checks.py +0 -0
  221. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/teaching/pack.py +0 -0
  222. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess/teaching/sheet.py +0 -0
  223. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess.egg-info/dependency_links.txt +0 -0
  224. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess.egg-info/entry_points.txt +0 -0
  225. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess.egg-info/requires.txt +1 -1
  226. {openprocess-0.13.1 → openprocess-0.14.0}/openprocess.egg-info/top_level.txt +0 -0
  227. {openprocess-0.13.1 → openprocess-0.14.0}/setup.cfg +0 -0
  228. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_arc_editing.py +0 -0
  229. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_bpmn.py +0 -0
  230. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_citation.py +0 -0
  231. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_colorsets.py +0 -0
  232. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_columns.py +0 -0
  233. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_cpn_course_model.py +0 -0
  234. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_definitions.py +0 -0
  235. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_docs.py +0 -0
  236. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_exercises_gui.py +0 -0
  237. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_flow_gui.py +0 -0
  238. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_framework_contract.py +0 -0
  239. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_hierarchy.py +0 -0
  240. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_history.py +0 -0
  241. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_io.py +0 -0
  242. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_large_logs.py +0 -0
  243. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_learn.py +0 -0
  244. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_learn_gui.py +0 -0
  245. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_log_editing.py +0 -0
  246. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_mcp.py +0 -0
  247. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_mcp_gui.py +0 -0
  248. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_measure.py +0 -0
  249. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_mining.py +0 -0
  250. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_ml.py +0 -0
  251. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_multiset.py +0 -0
  252. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_ocel.py +0 -0
  253. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_packages.py +0 -0
  254. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_parallel_and_loading.py +0 -0
  255. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_parallel_boxes.py +0 -0
  256. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_performance.py +0 -0
  257. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_regions.py +0 -0
  258. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_rename.py +0 -0
  259. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_report.py +0 -0
  260. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_review_fixes.py +0 -0
  261. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_simulation.py +0 -0
  262. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_snapshots.py +0 -0
  263. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_state_space.py +0 -0
  264. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_studio_gui.py +0 -0
  265. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_studio_lazy.py +0 -0
  266. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_teaching.py +0 -0
  267. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_tidy.py +0 -0
  268. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_updates.py +0 -0
  269. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_wf_structure.py +0 -0
  270. {openprocess-0.13.1 → openprocess-0.14.0}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openprocess
3
- Version: 0.13.1
3
+ Version: 0.14.0
4
4
  Summary: Process mining, Petri nets and workflows in one open app: every algorithm visible, every result reproducible, every step teachable
5
5
  Author: Sam Struthers
6
6
  License: MIT
@@ -18,6 +18,7 @@ Classifier: Topic :: Education
18
18
  Requires-Python: >=3.10
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE
21
+ Requires-Dist: numpy>=1.24
21
22
  Provides-Extra: app
22
23
  Requires-Dist: PySide6>=6.6; extra == "app"
23
24
  Requires-Dist: certifi; extra == "app"
@@ -28,7 +29,6 @@ Provides-Extra: dev
28
29
  Requires-Dist: pytest>=8.0; extra == "dev"
29
30
  Requires-Dist: mcp>=2.3; extra == "dev"
30
31
  Provides-Extra: science
31
- Requires-Dist: numpy>=1.24; extra == "science"
32
32
  Requires-Dist: pandas>=2.0; extra == "science"
33
33
  Requires-Dist: scipy>=1.10; extra == "science"
34
34
  Requires-Dist: matplotlib>=3.7; extra == "science"
@@ -494,6 +494,9 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
494
494
  - Time unit (Auto, or seconds up to years) and a grid step you can type in.
495
495
  - Colour and shape by any attribute. The default palette can be changed
496
496
  per value: right-click a value in the legend and pick its colour.
497
+ - A log of a million events (the BPI Challenge logs) pans, zooms and
498
+ answers the pointer without a pause: the dots are numpy arrays and a
499
+ dense picture is rasterised a colour at a time, not a dot at a time.
497
500
  - **Discover** hands the log to an analysis in Mine (**Discover in Mine →**),
498
501
  where the miner is a box with its result, its *How* and its *Code*:
499
502
  - α-algorithm, which shows its eight steps;
@@ -759,7 +762,7 @@ renders every page offscreen into `docs/screenshots/`, so run it after a
759
762
  change to the app's looks.
760
763
 
761
764
  The engines (`openprocess.mining`, `openprocess.ml`, `openprocess.sim`, `openprocess.analysis`)
762
- have **no dependencies**, so they work in a notebook or a script:
765
+ need **nothing but numpy**, so they work in a notebook or a script:
763
766
 
764
767
  ```python
765
768
  from openprocess.mining import read_xes, inductive_miner
@@ -884,7 +887,7 @@ extra) and *Predict the next activity*. Or start empty.
884
887
  with the course's miners and checks on the 2AMI10 exam log.
885
888
  - **Connections** (at the bottom of the sidebar, or *View ▸ Connections*)
886
889
  draws what flows in, OpenProcess and its boxes, what flows out, and the
887
- optional tools (pandas, numpy, scipy, matplotlib, …) with whether each is
890
+ optional tools (pandas, scipy, matplotlib, …) with whether each is
888
891
  installed, how to install it and the boxes it brings. All of it is read
889
892
  from the box library. *Install…* works in the downloaded app too: it carries
890
893
  pip and installs into a folder of your own (on a Mac,
@@ -949,7 +952,7 @@ See [Parallel work](docs/workflows.md#parallel-work) for the rules (each item
949
952
  from its own inputs, `flow.item_seed` for randomness). OpenProcess's own
950
953
  alignments and token replay run this way on large logs.
951
954
 
952
- `pip install -e ".[science]"` adds the pandas, NumPy, SciPy and matplotlib
955
+ `pip install -e ".[science]"` adds the pandas, SciPy and matplotlib
953
956
  boxes (describe, bootstrap intervals, tests, plots).
954
957
 
955
958
  **Large logs.** A log above 20 MB is read into columns rather than objects,
@@ -452,6 +452,9 @@ links to the definitions it builds on; **Help ▸ Definitions** lists them all.
452
452
  - Time unit (Auto, or seconds up to years) and a grid step you can type in.
453
453
  - Colour and shape by any attribute. The default palette can be changed
454
454
  per value: right-click a value in the legend and pick its colour.
455
+ - A log of a million events (the BPI Challenge logs) pans, zooms and
456
+ answers the pointer without a pause: the dots are numpy arrays and a
457
+ dense picture is rasterised a colour at a time, not a dot at a time.
455
458
  - **Discover** hands the log to an analysis in Mine (**Discover in Mine →**),
456
459
  where the miner is a box with its result, its *How* and its *Code*:
457
460
  - α-algorithm, which shows its eight steps;
@@ -717,7 +720,7 @@ renders every page offscreen into `docs/screenshots/`, so run it after a
717
720
  change to the app's looks.
718
721
 
719
722
  The engines (`openprocess.mining`, `openprocess.ml`, `openprocess.sim`, `openprocess.analysis`)
720
- have **no dependencies**, so they work in a notebook or a script:
723
+ need **nothing but numpy**, so they work in a notebook or a script:
721
724
 
722
725
  ```python
723
726
  from openprocess.mining import read_xes, inductive_miner
@@ -842,7 +845,7 @@ extra) and *Predict the next activity*. Or start empty.
842
845
  with the course's miners and checks on the 2AMI10 exam log.
843
846
  - **Connections** (at the bottom of the sidebar, or *View ▸ Connections*)
844
847
  draws what flows in, OpenProcess and its boxes, what flows out, and the
845
- optional tools (pandas, numpy, scipy, matplotlib, …) with whether each is
848
+ optional tools (pandas, scipy, matplotlib, …) with whether each is
846
849
  installed, how to install it and the boxes it brings. All of it is read
847
850
  from the box library. *Install…* works in the downloaded app too: it carries
848
851
  pip and installs into a folder of your own (on a Mac,
@@ -907,7 +910,7 @@ See [Parallel work](docs/workflows.md#parallel-work) for the rules (each item
907
910
  from its own inputs, `flow.item_seed` for randomness). OpenProcess's own
908
911
  alignments and token replay run this way on large logs.
909
912
 
910
- `pip install -e ".[science]"` adds the pandas, NumPy, SciPy and matplotlib
913
+ `pip install -e ".[science]"` adds the pandas, SciPy and matplotlib
911
914
  boxes (describe, bootstrap intervals, tests, plots).
912
915
 
913
916
  **Large logs.** A log above 20 MB is read into columns rather than objects,
@@ -48,7 +48,7 @@ from .sim.simulator import Simulator
48
48
  #: The one place the version number is written (pyproject.toml, the update
49
49
  #: check and packaging/build.py read it from here). A release is tagged
50
50
  #: "v" + this, e.g. v0.2.0.
51
- __version__ = "0.13.1"
51
+ __version__ = "0.14.0"
52
52
 
53
53
  __all__ = [
54
54
  "Arc", "BindingElement", "CPNet", "Marking", "Multiset", "Page", "Place",
@@ -44,10 +44,29 @@ def socket_path() -> str:
44
44
  ``QLocalServer`` names it)."""
45
45
  if sys.platform == "win32":
46
46
  return rf"\\.\pipe\{NAME}"
47
- base = os.environ.get("XDG_RUNTIME_DIR") or os.environ.get("TMPDIR") or "/tmp"
47
+ base = os.environ.get("XDG_RUNTIME_DIR") or os.environ.get("TMPDIR") or _user_temp_folder() or "/tmp"
48
48
  return str(Path(base) / f"{NAME}-{os.getuid()}")
49
49
 
50
50
 
51
+ _temp_folder: list[str] = []
52
+
53
+
54
+ def _user_temp_folder() -> str:
55
+ """The Mac's own per-user temp folder (``/var/folders/…/T/``), for a process
56
+ started without ``$TMPDIR``: Claude Desktop starts the MCP server that way,
57
+ while the app, opened from the Finder, listens there."""
58
+ if sys.platform != "darwin":
59
+ return ""
60
+ if not _temp_folder:
61
+ try:
62
+ found = subprocess.run(["/usr/bin/getconf", "DARWIN_USER_TEMP_DIR"], capture_output=True,
63
+ text=True, timeout=5).stdout.strip()
64
+ except (OSError, subprocess.SubprocessError):
65
+ found = ""
66
+ _temp_folder.append(found)
67
+ return _temp_folder[0]
68
+
69
+
51
70
  def send(message: dict, timeout: float = 5.0) -> dict:
52
71
  """Send one message to the running app and return its answer.
53
72
 
@@ -4270,14 +4270,15 @@ class StudioWindow(QMainWindow):
4270
4270
  page = self.pages[document.id]
4271
4271
  if document.path and not document.missing:
4272
4272
  try:
4273
- page.write_to(document.path, quiet=True)
4273
+ written = page.write_to(document.path, quiet=True)
4274
4274
  except Exception as error: # noqa: BLE001 - the edit stays, unsaved
4275
4275
  QMessageBox.warning(self, "Could not save the log",
4276
4276
  f"{Path(document.path).name}\n\n{error}\n\nYour changes "
4277
4277
  "are still open here: export the log to keep them.")
4278
4278
  else:
4279
- self.statusBar().showMessage(f"Saved your changes to "
4280
- f"{Path(document.path).name}", 6000)
4279
+ if written: # else the page reports as it goes
4280
+ self.statusBar().showMessage(f"Saved your changes to "
4281
+ f"{Path(document.path).name}", 6000)
4281
4282
  else:
4282
4283
  self._materialise(document)
4283
4284
  self._replace_page(document)
@@ -4289,8 +4290,11 @@ class StudioWindow(QMainWindow):
4289
4290
  def _replace_page(self, document) -> None:
4290
4291
  """Rebuild a document's page (after reloading it), keeping it in view."""
4291
4292
  shown = self.content.currentWidget() is self.holders.built(document.id)
4293
+ previous = self.pages.built(document.id)
4292
4294
  self._drop_page(document)
4293
4295
  self._make_page(document)
4296
+ if previous is not None and hasattr(previous, "successor"):
4297
+ previous.successor = self.pages[document.id] # a save still running reports to the new page
4294
4298
  self._update_autosave(document)
4295
4299
  if document.missing:
4296
4300
  self._show_missing(document)
@@ -22,6 +22,7 @@ import statistics
22
22
  from dataclasses import replace
23
23
  from datetime import timedelta
24
24
 
25
+ import numpy as np
25
26
  from PySide6.QtCore import Qt, Signal
26
27
  from PySide6.QtGui import QColor, QStandardItemModel
27
28
  from PySide6.QtWidgets import (
@@ -168,7 +169,7 @@ def align_colours(datas: list[DotData]) -> list[str]:
168
169
  index = {v: i for i, v in enumerate(shared)}
169
170
  for data in datas:
170
171
  mapping = [index[v] for v in data.colour_values]
171
- data.colour = [mapping[c] for c in data.colour]
172
+ data.colour = np.asarray(mapping, dtype=np.int32)[data.colour]
172
173
  data.colour_counts = {v: data.colour_counts.get(v, 0) for v in shared}
173
174
  data.colour_values = list(shared)
174
175
  return shared
@@ -428,10 +429,17 @@ class ComparePage(QWidget):
428
429
  self._syncing = False
429
430
  for widget in (self.x_box, self.colour_box):
430
431
  widget.currentIndexChanged.connect(lambda _: self._rebuild_dots())
431
- self.size_box.valueChanged.connect(lambda _: self._rebuild_dots())
432
+ self.size_box.valueChanged.connect(lambda _: self._resize_dots())
432
433
  self._rebuild_dots()
433
434
  return page
434
435
 
436
+ def _resize_dots(self) -> None:
437
+ """A new dot size: the same dots, painted again."""
438
+ for chart in self.charts:
439
+ if chart.data is not None:
440
+ chart.data.settings.dot_size = self.size_box.value()
441
+ chart._invalidate()
442
+
435
443
  def _rebuild_dots(self) -> None:
436
444
  settings = replace(self.dot_settings, x_mode=self.x_box.currentIndex(),
437
445
  colour_by=self.colour_box.currentText(),
@@ -41,7 +41,7 @@ OUTPUTS = [
41
41
  ("Python", "every box is a function: call it from a script or a notebook", ()),
42
42
  ]
43
43
  #: What pip installs for each tool (the package itself, pinned as the app's extras pin it).
44
- PACKAGES = {"pandas": "pandas>=2.0", "numpy": "numpy>=1.24", "scipy": "scipy>=1.10",
44
+ PACKAGES = {"pandas": "pandas>=2.0", "scipy": "scipy>=1.10",
45
45
  "matplotlib": "matplotlib>=3.7", "pm4py": "pm4py"}
46
46
 
47
47
 
@@ -33,8 +33,11 @@ class LogDocument:
33
33
 
34
34
  def __post_init__(self) -> None:
35
35
  self.classifier: Classifier = self.log.default_classifier()
36
- self._summary: LogSummary | None = None
37
- self._colours: ActivityColours | None = None
36
+ #: The summary and the colours under each classifier looked at so far
37
+ #: (by its key, see :func:`~openprocess.flow.loading.summary_key`):
38
+ #: switching back to a classifier costs nothing.
39
+ self._summaries: dict[tuple, LogSummary] = {}
40
+ self._colours: dict[tuple, ActivityColours] = {}
38
41
 
39
42
  @property
40
43
  def name(self) -> str:
@@ -46,29 +49,33 @@ class LogDocument:
46
49
  self.log = log
47
50
  self.classifier = (classifier if classifier in log.available_classifiers()
48
51
  else log.default_classifier())
49
- self._summary = None
50
- self._colours = None
52
+ self._summaries.clear()
53
+ self._colours.clear()
51
54
 
52
55
  def set_classifier(self, classifier: Classifier) -> None:
53
56
  self.classifier = classifier
54
- self._summary = None
55
- self._colours = None
56
57
 
57
58
  @property
58
59
  def summary(self) -> LogSummary:
59
- if self._summary is None:
60
+ from ...flow.loading import summary_key
61
+ key = summary_key(self.classifier)
62
+ summary = self._summaries.get(key)
63
+ if summary is None:
60
64
  # A large log read by a worker process comes with its summary worked out
61
65
  # there (by the same summarise(), for its default classifier).
62
- from ...flow.loading import summary_key
63
- ready = (getattr(self.log, "precomputed_summaries", None) or {}).get(summary_key(self.classifier))
64
- self._summary = ready if ready is not None else summarise(self.log, self.classifier)
65
- return self._summary
66
+ ready = (getattr(self.log, "precomputed_summaries", None) or {}).get(key)
67
+ summary = ready if ready is not None else summarise(self.log, self.classifier)
68
+ self._summaries[key] = summary
69
+ return summary
66
70
 
67
71
  @property
68
72
  def colours(self) -> ActivityColours:
69
- if self._colours is None:
70
- self._colours = ActivityColours([a.name for a in self.summary.activities])
71
- return self._colours
73
+ from ...flow.loading import summary_key
74
+ key = summary_key(self.classifier)
75
+ colours = self._colours.get(key)
76
+ if colours is None:
77
+ colours = self._colours[key] = ActivityColours([a.name for a in self.summary.activities])
78
+ return colours
72
79
 
73
80
  def simple_log(self):
74
81
  return self.log.simple_log(self.classifier)