openprocess 0.16.0__tar.gz → 0.16.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. {openprocess-0.16.0/openprocess.egg-info → openprocess-0.16.1}/PKG-INFO +1 -1
  2. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/__init__.py +1 -1
  3. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/app.py +10 -0
  4. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/dotted_chart.py +41 -6
  5. {openprocess-0.16.0 → openprocess-0.16.1/openprocess.egg-info}/PKG-INFO +1 -1
  6. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_dotted_chart.py +25 -0
  7. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_studio_gui.py +31 -0
  8. {openprocess-0.16.0 → openprocess-0.16.1}/LICENSE +0 -0
  9. {openprocess-0.16.0 → openprocess-0.16.1}/README.md +0 -0
  10. {openprocess-0.16.0 → openprocess-0.16.1}/cpnpy/__init__.py +0 -0
  11. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/analysis/__init__.py +0 -0
  12. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/analysis/state_space.py +0 -0
  13. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/analysis/state_space_process.py +0 -0
  14. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/citation.py +0 -0
  15. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/cli.py +0 -0
  16. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/answer.pnml +0 -0
  17. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/1 Petri nets/Exercise 1.1 Order handling/question.md +0 -0
  18. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/answer.pnml +0 -0
  19. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/net.pnml +0 -0
  20. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/2 Soundness/Exercise 2.1 Spot the flaw/question.md +0 -0
  21. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/log.txt +0 -0
  22. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/3 Discovery/Exercise 3.1 The alpha-algorithm/question.md +0 -0
  23. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/question.md +0 -0
  24. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/4 Regions/Exercise 4.1 Regions of a transition system/ts.txt +0 -0
  25. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/net.pnml +0 -0
  26. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/5 Markings/Exercise 5.1 Markings and matrices/question.md +0 -0
  27. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/log.txt +0 -0
  28. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/6 Inductive Miner/Exercise 6.1 Cuts and trees/question.md +0 -0
  29. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/log.txt +0 -0
  30. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m1.pnml +0 -0
  31. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m2.pnml +0 -0
  32. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/m3.pnml +0 -0
  33. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/net.pnml +0 -0
  34. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/7 Conformance/Exercise 7.1 Replay, alignments and workflows/question.md +0 -0
  35. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/exercises/pack.md +0 -0
  36. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/__init__.py +0 -0
  37. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/box.py +0 -0
  38. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/__init__.py +0 -0
  39. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/check.py +0 -0
  40. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/compare.py +0 -0
  41. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/cpn.py +0 -0
  42. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/discover.py +0 -0
  43. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/filter.py +0 -0
  44. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/input.py +0 -0
  45. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/measure.py +0 -0
  46. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/output.py +0 -0
  47. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/predict.py +0 -0
  48. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/science.py +0 -0
  49. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/boxes/sweeps.py +0 -0
  50. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/changes.py +0 -0
  51. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/convert.py +0 -0
  52. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/datasets.py +0 -0
  53. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/derivation.py +0 -0
  54. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/explain.py +0 -0
  55. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/figures.py +0 -0
  56. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/history.py +0 -0
  57. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/library.py +0 -0
  58. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/loading.py +0 -0
  59. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/parallel.py +0 -0
  60. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/provenance.py +0 -0
  61. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/record.py +0 -0
  62. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/report.py +0 -0
  63. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/reproducibility.py +0 -0
  64. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/runner.py +0 -0
  65. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/script.py +0 -0
  66. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/snapshots.py +0 -0
  67. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/studio.py +0 -0
  68. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/sweep.py +0 -0
  69. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/types.py +0 -0
  70. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/versions.py +0 -0
  71. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/flow/workflow.py +0 -0
  72. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/__init__.py +0 -0
  73. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/app.py +0 -0
  74. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/arc_editing.py +0 -0
  75. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/canvas.py +0 -0
  76. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/__init__.py +0 -0
  77. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/canvas.py +0 -0
  78. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/page.py +0 -0
  79. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/picker.py +0 -0
  80. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/report.py +0 -0
  81. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/stepper.py +0 -0
  82. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/templates.py +0 -0
  83. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/versions.py +0 -0
  84. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/flow/viewers.py +0 -0
  85. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/items.py +0 -0
  86. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/learn/answer_boxes.py +0 -0
  87. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/learn/concealment.py +0 -0
  88. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/learn/mode.py +0 -0
  89. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/panning.py +0 -0
  90. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/resources/openprocess-icon.png +0 -0
  91. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/__init__.py +0 -0
  92. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/__main__.py +0 -0
  93. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/alignment_view.py +0 -0
  94. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/charts.py +0 -0
  95. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/cite.py +0 -0
  96. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/command_palette.py +0 -0
  97. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/compare_page.py +0 -0
  98. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/connect.py +0 -0
  99. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/connections.py +0 -0
  100. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/cpn_page.py +0 -0
  101. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/definition_view.py +0 -0
  102. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/derivation_view.py +0 -0
  103. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/documents.py +0 -0
  104. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/file_dialogs.py +0 -0
  105. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/filter_dialog.py +0 -0
  106. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/graph_builders.py +0 -0
  107. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/graph_view.py +0 -0
  108. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/instances.py +0 -0
  109. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/loading.py +0 -0
  110. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/log_editor.py +0 -0
  111. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/log_page.py +0 -0
  112. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/markdown_view.py +0 -0
  113. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/mathtext.py +0 -0
  114. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/ml_highlighter.py +0 -0
  115. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/model_page.py +0 -0
  116. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/motion.py +0 -0
  117. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/net_comparison.py +0 -0
  118. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/notes_overlay.py +0 -0
  119. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/petri_page.py +0 -0
  120. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/provenance.py +0 -0
  121. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/regions_view.py +0 -0
  122. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/remote.py +0 -0
  123. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/review.py +0 -0
  124. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/sidebar.py +0 -0
  125. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/spaces.py +0 -0
  126. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/style.py +0 -0
  127. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/tool_icons.py +0 -0
  128. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/updates.py +0 -0
  129. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/widgets.py +0 -0
  130. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/workers.py +0 -0
  131. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/studio/workspace.py +0 -0
  132. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/theme.py +0 -0
  133. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/gui/tidy.py +0 -0
  134. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/io/__init__.py +0 -0
  135. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/io/cpn_reader.py +0 -0
  136. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/io/cpn_writer.py +0 -0
  137. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/__init__.py +0 -0
  138. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/answers.py +0 -0
  139. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/checks.py +0 -0
  140. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/computed.py +0 -0
  141. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/context.py +0 -0
  142. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/exam.py +0 -0
  143. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/exercise-packs.md +0 -0
  144. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/importer.py +0 -0
  145. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/notation.py +0 -0
  146. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/pack.py +0 -0
  147. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/learn/sheet.py +0 -0
  148. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/__init__.py +0 -0
  149. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/__main__.py +0 -0
  150. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/api.py +0 -0
  151. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/connecting.md +0 -0
  152. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/install.py +0 -0
  153. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mcp/server.py +0 -0
  154. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/__init__.py +0 -0
  155. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/analysis.py +0 -0
  156. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/bpmn.py +0 -0
  157. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/cases.py +0 -0
  158. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/columns.py +0 -0
  159. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/compare_nets.py +0 -0
  160. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/conformance/__init__.py +0 -0
  161. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/conformance/alignments.py +0 -0
  162. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/conformance/quality.py +0 -0
  163. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/conformance/token_replay.py +0 -0
  164. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/csv_import.py +0 -0
  165. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/definitions.py +0 -0
  166. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/dfg.py +0 -0
  167. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/__init__.py +0 -0
  168. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/alpha.py +0 -0
  169. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/heuristics.py +0 -0
  170. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/inductive.py +0 -0
  171. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/discovery/state_regions.py +0 -0
  172. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/dotted.py +0 -0
  173. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/drawing.py +0 -0
  174. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/filtering.py +0 -0
  175. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/footprint.py +0 -0
  176. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/invariants.py +0 -0
  177. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/layout.py +0 -0
  178. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/log.py +0 -0
  179. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/ocel.py +0 -0
  180. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/parallel.py +0 -0
  181. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/petrinet.py +0 -0
  182. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/playout.py +0 -0
  183. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/pm4py_bridge.py +0 -0
  184. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/pnml.py +0 -0
  185. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/processtree.py +0 -0
  186. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/regions.py +0 -0
  187. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/stats.py +0 -0
  188. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/structure.py +0 -0
  189. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/transition_system.py +0 -0
  190. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/mining/xes.py +0 -0
  191. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/__init__.py +0 -0
  192. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/ast_nodes.py +0 -0
  193. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/builtins.py +0 -0
  194. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/colorsets.py +0 -0
  195. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/errors.py +0 -0
  196. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/evaluator.py +0 -0
  197. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/lexer.py +0 -0
  198. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/multiset.py +0 -0
  199. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/parser.py +0 -0
  200. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/ml/values.py +0 -0
  201. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/__init__.py +0 -0
  202. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/declarations.py +0 -0
  203. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/examples.py +0 -0
  204. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/net.py +0 -0
  205. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/model/plain.py +0 -0
  206. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/packages.py +0 -0
  207. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/palette.py +0 -0
  208. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/parallel.py +0 -0
  209. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/references.py +0 -0
  210. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/__init__.py +0 -0
  211. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/binding.py +0 -0
  212. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/export.py +0 -0
  213. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/performance.py +0 -0
  214. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/sim/simulator.py +0 -0
  215. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/__init__.py +0 -0
  216. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/answers.py +0 -0
  217. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/checks.py +0 -0
  218. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/pack.py +0 -0
  219. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess/teaching/sheet.py +0 -0
  220. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/SOURCES.txt +0 -0
  221. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/dependency_links.txt +0 -0
  222. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/entry_points.txt +0 -0
  223. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/requires.txt +0 -0
  224. {openprocess-0.16.0 → openprocess-0.16.1}/openprocess.egg-info/top_level.txt +0 -0
  225. {openprocess-0.16.0 → openprocess-0.16.1}/pyproject.toml +0 -0
  226. {openprocess-0.16.0 → openprocess-0.16.1}/setup.cfg +0 -0
  227. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_arc_editing.py +0 -0
  228. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_bpmn.py +0 -0
  229. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_citation.py +0 -0
  230. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_colorsets.py +0 -0
  231. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_columns.py +0 -0
  232. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_cpn_course_model.py +0 -0
  233. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_definitions.py +0 -0
  234. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_docs.py +0 -0
  235. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_exercises_gui.py +0 -0
  236. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_flow.py +0 -0
  237. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_flow_gui.py +0 -0
  238. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_framework_contract.py +0 -0
  239. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_hierarchy.py +0 -0
  240. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_history.py +0 -0
  241. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_io.py +0 -0
  242. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_large_log_page.py +0 -0
  243. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_large_logs.py +0 -0
  244. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_learn.py +0 -0
  245. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_learn_gui.py +0 -0
  246. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_log_editing.py +0 -0
  247. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_mcp.py +0 -0
  248. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_mcp_gui.py +0 -0
  249. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_measure.py +0 -0
  250. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_mining.py +0 -0
  251. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_ml.py +0 -0
  252. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_multiset.py +0 -0
  253. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_ocel.py +0 -0
  254. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_packages.py +0 -0
  255. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_parallel_and_loading.py +0 -0
  256. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_parallel_boxes.py +0 -0
  257. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_performance.py +0 -0
  258. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_regions.py +0 -0
  259. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_rename.py +0 -0
  260. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_report.py +0 -0
  261. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_researcher_api.py +0 -0
  262. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_review_fixes.py +0 -0
  263. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_simulation.py +0 -0
  264. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_snapshots.py +0 -0
  265. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_state_space.py +0 -0
  266. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_studio_lazy.py +0 -0
  267. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_teaching.py +0 -0
  268. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_tidy.py +0 -0
  269. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_updates.py +0 -0
  270. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_wf_structure.py +0 -0
  271. {openprocess-0.16.0 → openprocess-0.16.1}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openprocess
3
- Version: 0.16.0
3
+ Version: 0.16.1
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
@@ -48,7 +48,7 @@ from .sim.simulator import Simulator
48
48
  #: The one place the version number is written (pyproject.toml, the update
49
49
  #: check and packaging/build.py read it from here). A release is tagged
50
50
  #: "v" + this, e.g. v0.2.0.
51
- __version__ = "0.16.0"
51
+ __version__ = "0.16.1"
52
52
 
53
53
  __all__ = [
54
54
  "Arc", "BindingElement", "CPNet", "Marking", "Multiset", "Page", "Place",
@@ -4261,6 +4261,16 @@ class StudioWindow(QMainWindow):
4261
4261
  self.statusBar().showMessage(message, 8000)
4262
4262
 
4263
4263
  try:
4264
+ if isinstance(document, WorkflowDocument):
4265
+ # Changed by Claude (through the MCP server) or another copy of the
4266
+ # app: the boxes, versions and record are all read again.
4267
+ from ...flow.record import load_all
4268
+ document.workflow, document.record, document.versions = load_all(path, self.library())
4269
+ document.dirty = False
4270
+ self._remember_identity(document)
4271
+ self._replace_page(document)
4272
+ self.statusBar().showMessage(message, 8000)
4273
+ return
4264
4274
  if isinstance(document, TransitionSystemDocument):
4265
4275
  content = self._read_text_file(path)
4266
4276
  document.ts = content.ts
@@ -73,6 +73,7 @@ SHAPES = ["circle", "square", "triangle", "diamond", "cross", "star"]
73
73
  #: log stays a picture of milliseconds, not seconds. Shapes, rings and the
74
74
  #: lines between a case's events come back as soon as a zoom shows fewer.
75
75
  BATCH_FROM = 40_000
76
+ STACK_ALPHA = 0.72 # opacity of a dot; a stack of dots shows darker
76
77
  #: Above this many events the dots are worked out on a worker thread.
77
78
  BACKGROUND_FROM = 200_000
78
79
  #: When drawing the picture took longer than this, a pan or zoom first shows
@@ -381,6 +382,15 @@ class DottedChart(QWidget):
381
382
  painter.end()
382
383
  return pixmap
383
384
 
385
+ def dot_radius(self, rect: QRectF) -> float:
386
+ """The radius a dot is drawn with: the size the rows allow (4 px
387
+ when they are tall, down to 1.6 px when a row is a hairline), scaled
388
+ by the Dot size setting (4 is 1×), so the slider always does
389
+ something and a dense chart stays readable."""
390
+ row_h = rect.height() / max(self.vy1 - self.vy0, 1e-9)
391
+ fitting = max(1.6, min(4.0, row_h * 0.45))
392
+ return max(1.0, fitting * self.data.settings.dot_size / 4.0)
393
+
384
394
  def _visible(self, candidates: np.ndarray) -> np.ndarray:
385
395
  """The dots of ``candidates`` (dots in the x window) that are in the
386
396
  row window and whose colour the legend shows."""
@@ -402,12 +412,7 @@ class DottedChart(QWidget):
402
412
  rect = self.plot_rect()
403
413
  self._paint_axes(painter, rect, t, s.grid_lines)
404
414
 
405
- row_h = rect.height() / max(self.vy1 - self.vy0, 1e-9)
406
- # The dot size the rows allow (4 px when they are tall, down to 1.6 px
407
- # when a row is a hairline), scaled by the Dot size setting (4 is 1×):
408
- # the slider always does something, and a dense chart stays readable.
409
- fitting = max(1.6, min(4.0, row_h * 0.45))
410
- radius = max(1.0, fitting * s.dot_size / 4.0)
415
+ radius = self.dot_radius(rect)
411
416
  # A ring in the surface colour sets a dot apart from its neighbours;
412
417
  # drawn on every dot it erases overlapping ones into slivers, so it is
413
418
  # kept for the selected case alone, which sits on top.
@@ -423,6 +428,13 @@ class DottedChart(QWidget):
423
428
  self._paint_dense(painter, rect, colours, faded, radius, visible)
424
429
  on_top = visible[d.case[visible] == selected] if selected >= 0 else []
425
430
  else:
431
+ if selected < 0:
432
+ # Dots a little translucent, so a stack of events drawn on
433
+ # the same spot shows darker than a single one. The dense
434
+ # picture sets each pixel once, so it stays opaque; the
435
+ # selected case is opaque to stand out.
436
+ for colour in colours:
437
+ colour.setAlphaF(STACK_ALPHA)
426
438
  if s.connect:
427
439
  self._paint_connections(painter, rect, visible, t)
428
440
  # Unselected first, the selected case last so it sits on top.
@@ -634,6 +646,16 @@ class DottedChart(QWidget):
634
646
  nearest = int(distance.argmin())
635
647
  return int(near[nearest]) if distance[nearest] <= tolerance else None
636
648
 
649
+ def stacked_with(self, i: int) -> np.ndarray:
650
+ """The shown dots drawn over dot ``i``: those on its row whose centre
651
+ is within a dot's width of it on screen, ``i`` itself first."""
652
+ d = self.data
653
+ rect = self.plot_rect()
654
+ reach = 2 * self.dot_radius(rect) / rect.width() * (self.vx1 - self.vx0)
655
+ near = d.between(d.xs[i] - reach, d.xs[i] + reach)
656
+ near = near[(d.rows[near] == d.rows[i]) & d.shown(self.hidden_colours)[d.colour[near]]]
657
+ return np.concatenate(([i], near[near != i]))
658
+
637
659
  def describe_dot(self, i: int) -> str:
638
660
  d = self.data
639
661
  event = d.event(i)
@@ -646,6 +668,19 @@ class DottedChart(QWidget):
646
668
  if key not in ("concept:name", "time:timestamp"):
647
669
  text = str(value)
648
670
  lines.append(f"{key}: {text[:60] + '…' if len(text) > 60 else text}")
671
+ stack = self.stacked_with(i)
672
+ if len(stack) > 1:
673
+ # A pile of dots looks like one: say how many, and over what span.
674
+ cases = len(set(d.case[stack].tolist()))
675
+ text = f"<i>{len(stack) - 1} more event{'s' if len(stack) > 2 else ''} under this dot"
676
+ if cases > 1:
677
+ text += f" ({cases} cases)"
678
+ stamps = [d.event(int(j)).timestamp for j in stack]
679
+ if all(stamps):
680
+ first, last = min(stamps), max(stamps)
681
+ if last > first:
682
+ text += f", spanning {format_duration((last - first).total_seconds())}"
683
+ lines.append(text + ". Drag to zoom in.</i>")
649
684
  return "<br>".join(lines)
650
685
 
651
686
  # -- interaction ------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openprocess
3
- Version: 0.16.0
3
+ Version: 0.16.1
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
@@ -107,3 +107,28 @@ def test_the_pointer_finds_the_nearest_shown_dot(app, monkeypatch):
107
107
  assert found is not None and d.rows[found] == 0 and d.xs[found] == 1.0
108
108
  chart.hidden_colours = set(range(len(d.colour_values)))
109
109
  assert chart.dot_at(point) is None
110
+
111
+
112
+ def test_the_hover_counts_the_dots_drawn_under_one(app, monkeypatch):
113
+ from openprocess.gui.studio import dotted_chart
114
+ from openprocess.gui.studio.documents import LogDocument
115
+ chart = _chart(app, monkeypatch, batch_from=10_000)
116
+ # Rows by activity, x by position in case (from 0): the 10 <b,a> cases
117
+ # put 10 dots on one spot.
118
+ chart.set_data(dotted_chart.DotData(LogDocument(LOG), DotSettings(x_mode=4, rows="Activity")))
119
+ chart.show()
120
+ app.processEvents()
121
+ chart.repaint()
122
+ d = chart.data
123
+ a_row = d.rows[next(j for j in range(len(d.xs)) if d.event(j).activity == "a" and d.xs[j] == 1.0)]
124
+ pile = np.flatnonzero((d.rows == a_row) & (d.xs == 1.0))
125
+ assert len(pile) == 10
126
+ i = int(pile[0])
127
+ stack = chart.stacked_with(i)
128
+ assert stack[0] == i and len(stack) == len(pile)
129
+ text = chart.describe_dot(i)
130
+ assert f"{len(pile) - 1} more events under this dot" in text
131
+ # Hidden colours are not counted, and a lone dot says nothing.
132
+ chart.hidden_colours = set(range(len(d.colour_values)))
133
+ assert len(chart.stacked_with(i)) == 1
134
+ assert "under this dot" not in chart.describe_dot(i)
@@ -2847,6 +2847,37 @@ def test_a_workflow_opened_from_another_folder_reads_its_files_from_there(app, t
2847
2847
  assert page.run is not None and all(page.run.status(n) == "done" for n in page.workflow.nodes.values())
2848
2848
 
2849
2849
 
2850
+ def test_an_open_workflow_changed_on_disk_is_reloaded(app, tmp_path):
2851
+ """A .analysis written elsewhere (by Claude through the MCP server) while it is
2852
+ open: the page shows the new boxes, and a later save does not put the old ones back."""
2853
+ from openprocess.flow import Workflow, save
2854
+ from openprocess.flow.record import load_all
2855
+ from openprocess.gui.studio.app import StudioWindow
2856
+ from openprocess.gui.studio.documents import WorkflowDocument
2857
+ week = _week(tmp_path)
2858
+ (week / "log.txt").write_text("[<a,b,c>^3, <a,c,b>]")
2859
+ path = week / "Orders.analysis"
2860
+ wf = Workflow("Orders")
2861
+ wf.connect(wf.add("open_log", {"file": "log.txt"}), wf.add("alpha_miner"))
2862
+ save(wf, path, folder=week)
2863
+ window = StudioWindow()
2864
+ window.show()
2865
+ window.open_workspace(str(week))
2866
+ window.open_path(str(path))
2867
+ document = next(d for d in window.documents if isinstance(d, WorkflowDocument))
2868
+ before = window.pages[document.id]
2869
+ _pump(app, 0.5)
2870
+
2871
+ wf.add("inductive_miner")
2872
+ save(wf, path, folder=week)
2873
+ assert _wait_for(app, lambda: len(document.workflow.nodes) == 3)
2874
+ assert window.pages[document.id] is not before
2875
+ assert "changed on disk — reloaded" in window.statusBar().currentMessage()
2876
+ window.pages[document.id].save()
2877
+ assert len(load_all(path)[0].nodes) == 3
2878
+ window.close()
2879
+
2880
+
2850
2881
  def test_not_terminating_is_shown_as_info():
2851
2882
  from openprocess.gui.studio.widgets import property_status
2852
2883
  assert property_status("Terminating", False) == "info"
File without changes
File without changes