labnotes 0.1.0__tar.gz → 0.1.2__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 (202) hide show
  1. {labnotes-0.1.0 → labnotes-0.1.2}/PKG-INFO +3 -2
  2. {labnotes-0.1.0 → labnotes-0.1.2}/README.md +2 -1
  3. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/context.md +4 -2
  4. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/experiments.py +2 -1
  5. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/parse_subset.py +3 -5
  6. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/check_subset.py +7 -6
  7. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/fill_experiment_env.py +6 -6
  8. labnotes-0.1.2/src/labnotes/runner/in_subset.py +5 -0
  9. labnotes-0.1.2/src/labnotes/runner/placeholders.py +2 -0
  10. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/prepare_experiment.py +1 -1
  11. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/run_experiment.py +1 -1
  12. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/start_experiment.py +1 -1
  13. labnotes-0.1.0/src/labnotes/runner/in_subset.py +0 -5
  14. {labnotes-0.1.0 → labnotes-0.1.2}/.gitignore +0 -0
  15. {labnotes-0.1.0 → labnotes-0.1.2}/CHANGELOG.md +0 -0
  16. {labnotes-0.1.0 → labnotes-0.1.2}/MIGRATIONS.md +0 -0
  17. {labnotes-0.1.0 → labnotes-0.1.2}/pyproject.toml +0 -0
  18. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/__init__.py +0 -0
  19. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/__main__.py +0 -0
  20. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/asset_url.py +0 -0
  21. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/check_counts.py +0 -0
  22. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/cli.py +0 -0
  23. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/compose_experiment.py +0 -0
  24. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/context_guide.py +0 -0
  25. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/count_groups.py +0 -0
  26. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/count_runs.py +0 -0
  27. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/create_app.py +0 -0
  28. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/create_experiment.py +0 -0
  29. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/create_note.py +0 -0
  30. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/data_html.py +0 -0
  31. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/default_config_text.py +0 -0
  32. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/default_counts.py +0 -0
  33. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/drain_watch.py +0 -0
  34. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/experiment_notes.py +0 -0
  35. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/experiment_runs.py +0 -0
  36. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/file_changes.py +0 -0
  37. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/format_duration.py +0 -0
  38. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/format_started.py +0 -0
  39. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/format_value.py +0 -0
  40. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/get_state.py +0 -0
  41. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/grid_cell.py +0 -0
  42. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/group_runs.py +0 -0
  43. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/init.py +0 -0
  44. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/invocation_started.py +0 -0
  45. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/is_non_negative_int.py +0 -0
  46. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/is_non_negative_number.py +0 -0
  47. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/is_positive_int.py +0 -0
  48. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/list_experiments.py +0 -0
  49. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/list_runs.py +0 -0
  50. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/load_config.py +0 -0
  51. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/load_experiment.py +0 -0
  52. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/load_run.py +0 -0
  53. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/log.py +0 -0
  54. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/log_path.py +0 -0
  55. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/memory_interval.py +0 -0
  56. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/models.py +0 -0
  57. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/modes.py +0 -0
  58. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/nests_runs.py +0 -0
  59. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/note_path.py +0 -0
  60. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/notebook_kernel.py +0 -0
  61. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/output_html.py +0 -0
  62. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/parse_run_view.py +0 -0
  63. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/pivot_runs.py +0 -0
  64. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/print_rows.py +0 -0
  65. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/python_blocks.py +0 -0
  66. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/read_config.py +0 -0
  67. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/read_path.py +0 -0
  68. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/render_markdown.py +0 -0
  69. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/retries.py +0 -0
  70. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/run_output.py +0 -0
  71. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/__init__.py +0 -0
  72. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/cgroup_memory.py +0 -0
  73. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/check_args.py +0 -0
  74. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/container_cgroup.py +0 -0
  75. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/container_memory.py +0 -0
  76. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/describe_event.py +0 -0
  77. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/docker_output.py +0 -0
  78. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/execute_run.py +0 -0
  79. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/exit_signal.py +0 -0
  80. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/fill_dirs.py +0 -0
  81. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/finalize_lost_runs.py +0 -0
  82. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/flag_name.py +0 -0
  83. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/hook_dirs.py +0 -0
  84. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/invocation_hook.py +0 -0
  85. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/invocation_meta.py +0 -0
  86. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/new_param_run_id.py +0 -0
  87. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/new_run_id.py +0 -0
  88. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/new_stamped_run_id.py +0 -0
  89. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/param_args.py +0 -0
  90. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/param_grid.py +0 -0
  91. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/param_run_name.py +0 -0
  92. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/plan_runs.py +0 -0
  93. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/project_snapshot.py +0 -0
  94. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/read_experiment_config.py +0 -0
  95. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/record_memory.py +0 -0
  96. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/run_folder.py +0 -0
  97. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/run_git.py +0 -0
  98. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/run_headless.py +0 -0
  99. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/runs_parent.py +0 -0
  100. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/shell_command.py +0 -0
  101. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/signal_tree.py +0 -0
  102. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/stop_then_kill.py +0 -0
  103. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/wait_for_tree.py +0 -0
  104. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runner/write_run_json.py +0 -0
  105. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/runs_view_command.py +0 -0
  106. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/save_conflict_copy.py +0 -0
  107. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/save_note.py +0 -0
  108. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/saved_outputs.py +0 -0
  109. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/serve_app.py +0 -0
  110. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/server.py +0 -0
  111. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/set_state.py +0 -0
  112. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/shared_params.py +0 -0
  113. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/sort_href.py +0 -0
  114. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/sql_quote.py +0 -0
  115. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/state_path.py +0 -0
  116. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/elapsed.js +0 -0
  117. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/experiment.js +0 -0
  118. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/labnotes.css +0 -0
  119. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/local-time.js +0 -0
  120. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/new-note.js +0 -0
  121. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/note-edit.js +0 -0
  122. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/note-editor.js +0 -0
  123. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/row-link.js +0 -0
  124. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/run-cell.js +0 -0
  125. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/run-output.js +0 -0
  126. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/static/view-toggle.js +0 -0
  127. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/summarize_config.py +0 -0
  128. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/__init__.py +0 -0
  129. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/experiment_rows.py +0 -0
  130. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/experiment_run_ids.py +0 -0
  131. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/experiment_toml.py +0 -0
  132. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/experiments_ddl.py +0 -0
  133. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/file_prefix.py +0 -0
  134. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/file_text.py +0 -0
  135. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/iso_time.py +0 -0
  136. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/list_experiment_runs.py +0 -0
  137. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/note_text.py +0 -0
  138. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/open_tables.py +0 -0
  139. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/path_glob.py +0 -0
  140. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/path_pattern.py +0 -0
  141. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/read_blocks.py +0 -0
  142. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/read_experiment.py +0 -0
  143. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/read_file.py +0 -0
  144. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/read_log.py +0 -0
  145. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/read_memory.py +0 -0
  146. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/read_run.py +0 -0
  147. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/read_run_file.py +0 -0
  148. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/runs_columns.py +0 -0
  149. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tables/summarize_experiments.py +0 -0
  150. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/templates/base.html +0 -0
  151. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/templates/editor_imports.html +0 -0
  152. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/templates/experiment.html +0 -0
  153. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/templates/index.html +0 -0
  154. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/templates/note.html +0 -0
  155. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/templates/run.html +0 -0
  156. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/__init__.py +0 -0
  157. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/browse_app.py +0 -0
  158. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/browse_tui.py +0 -0
  159. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/check_view_response.py +0 -0
  160. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/config.py +0 -0
  161. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/dim.py +0 -0
  162. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/experiment_screen.py +0 -0
  163. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/experiments_screen.py +0 -0
  164. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/fill_table.py +0 -0
  165. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/format_cell.py +0 -0
  166. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/format_elapsed.py +0 -0
  167. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/group_cells.py +0 -0
  168. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/invocation_columns.py +0 -0
  169. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/invocation_rows.py +0 -0
  170. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/leave_prompt.py +0 -0
  171. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/log_block.py +0 -0
  172. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/log_blocks.py +0 -0
  173. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/native_rows.py +0 -0
  174. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/reload_on_change.py +0 -0
  175. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/run_app.py +0 -0
  176. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/run_cells.py +0 -0
  177. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/run_output.py +0 -0
  178. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/run_screen.py +0 -0
  179. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/run_tui.py +0 -0
  180. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/runs_table.py +0 -0
  181. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/runs_view.py +0 -0
  182. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/stopped_title.py +0 -0
  183. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/view_column.py +0 -0
  184. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/tui/view_process.py +0 -0
  185. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/utils/__init__.py +0 -0
  186. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/utils/format_bytes.py +0 -0
  187. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/utils/process_alive.py +0 -0
  188. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/utils/run_usage.py +0 -0
  189. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/utils/tree_rss.py +0 -0
  190. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/utils/tree_usage.py +0 -0
  191. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/view/__init__.py +0 -0
  192. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/view/answer.py +0 -0
  193. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/view/build.py +0 -0
  194. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/view/respond.py +0 -0
  195. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/view/serve.py +0 -0
  196. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/wait_for_note.py +0 -0
  197. {labnotes-0.1.0 → labnotes-0.1.2}/src/labnotes/watch_rows.py +0 -0
  198. {labnotes-0.1.0 → labnotes-0.1.2}/testing-conventions.toml +0 -0
  199. {labnotes-0.1.0 → labnotes-0.1.2}/tests/conftest.py +0 -0
  200. {labnotes-0.1.0 → labnotes-0.1.2}/tests/e2e/conftest.py +0 -0
  201. {labnotes-0.1.0 → labnotes-0.1.2}/tests/integration/conftest.py +0 -0
  202. {labnotes-0.1.0 → labnotes-0.1.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: labnotes
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Browse experiment designs, notes, and run data from a folder.
5
5
  Project-URL: Repository, https://github.com/thekevinscott/labnotes
6
6
  Author-email: Kevin Scott <me@thekevinscott.com>
@@ -121,7 +121,8 @@ line per event instead.
121
121
  - `--concurrency N` runs N at a time (default 1).
122
122
  - `-e PATH` reads another file instead of `experiment.toml`.
123
123
  - `--PARAM=VALUE` runs only the cells where that param has that value, like
124
- `--model=small`.
124
+ `--model=small`. Repeat a param to run several values:
125
+ `--model=small --model=large`.
125
126
  - With runs going, Ctrl-C asks first. Enter (or a second Ctrl-C) stops the running scripts and records their end,
126
127
  then kills any still going 5 seconds later. Escape goes back. SIGTERM and
127
128
  SIGHUP stop them the same way.
@@ -96,7 +96,8 @@ line per event instead.
96
96
  - `--concurrency N` runs N at a time (default 1).
97
97
  - `-e PATH` reads another file instead of `experiment.toml`.
98
98
  - `--PARAM=VALUE` runs only the cells where that param has that value, like
99
- `--model=small`.
99
+ `--model=small`. Repeat a param to run several values:
100
+ `--model=small --model=large`.
100
101
  - With runs going, Ctrl-C asks first. Enter (or a second Ctrl-C) stops the running scripts and records their end,
101
102
  then kills any still going 5 seconds later. Escape goes back. SIGTERM and
102
103
  SIGHUP stop them the same way.
@@ -192,8 +192,10 @@ going. Elsewhere, it prints a line per event instead.
192
192
  - `--PARAM=VALUE` runs only the cells where that param has that value, e.g.
193
193
  `labnotes experiments NAME run --model=small`. PARAM must be a key in
194
194
  `[params]` and VALUE one of its values, written as it shows in `runs`
195
- (`true`, `2`); anything else is an error. One value per param; give several
196
- params to narrow further (`--model=small --lang=en`). It changes only what
195
+ (`true`, `2`); anything else is an error. Repeat a param to run any of
196
+ several values (`--model=small --model=large`); give several params to
197
+ narrow further (`--model=small --lang=en`). Values are never split on
198
+ commas. It changes only what
197
199
  this `run` starts: counts, progress and `repeats` still cover the full
198
200
  matrix, so a later plain `run` fills in the rest. Use it instead of editing
199
201
  `experiment.toml` to run a slice.
@@ -33,7 +33,8 @@ class PassthroughCommand(click.Command):
33
33
  cls=PassthroughCommand,
34
34
  help="List experiments, show one, list its runs, or run it."
35
35
  " `new [NAME]` creates one. With run, --PARAM=VALUE runs only the"
36
- " matrix cells where that param has that value, and anything after --"
36
+ " matrix cells where that param has that value (repeat it for several"
37
+ " values), and anything after --"
37
38
  " is appended to every run's command and recorded in run.json, so never"
38
39
  " pass secrets there.",
39
40
  context_settings={"ignore_unknown_options": True, "allow_extra_args": True},
@@ -1,10 +1,8 @@
1
- def parse_subset(args: list[str]) -> dict[str, str]:
2
- only: dict[str, str] = {}
1
+ def parse_subset(args: list[str]) -> dict[str, list[str]]:
2
+ only: dict[str, list[str]] = {}
3
3
  for arg in args:
4
4
  param, equals, value = arg.removeprefix("--").partition("=")
5
5
  if not arg.startswith("--") or not equals or not param:
6
6
  raise ValueError(f"Unexpected {arg}. Pick params with --PARAM=VALUE.")
7
- if param in only:
8
- raise ValueError(f"--{param} given twice. Pass one value per param.")
9
- only[param] = value
7
+ only.setdefault(param, []).append(value)
10
8
  return only
@@ -1,13 +1,14 @@
1
1
  from labnotes.format_value import format_value
2
2
 
3
3
 
4
- def check_subset(params: dict[str, list[object]], only: dict[str, str]) -> None:
5
- for param, value in only.items():
4
+ def check_subset(params: dict[str, list[object]], only: dict[str, list[str]]) -> None:
5
+ for param, wanted in only.items():
6
6
  if param not in params:
7
7
  declared = ", ".join(params) or "none"
8
8
  raise ValueError(f"No param {param}. Params: {declared}.")
9
9
  values = [format_value(option) for option in params[param]]
10
- if value not in values:
11
- raise ValueError(
12
- f"No value {value} for {param}. Values: {', '.join(values)}."
13
- )
10
+ for value in wanted:
11
+ if value not in values:
12
+ raise ValueError(
13
+ f"No value {value} for {param}. Values: {', '.join(values)}."
14
+ )
@@ -1,6 +1,7 @@
1
1
  from collections.abc import Mapping
2
2
 
3
3
  from labnotes.runner.fill_dirs import fill_dirs
4
+ from labnotes.runner.placeholders import HOOK_PLACEHOLDERS, PLACEHOLDERS
4
5
 
5
6
 
6
7
  def fill_experiment_env(
@@ -20,12 +21,11 @@ def fill_experiment_env(
20
21
  for key, value in configured.items():
21
22
  if key in caller:
22
23
  continue
23
- if hook is not None and "{run_dir}" in value:
24
- raise ValueError(
25
- f"{hook} env.{key} uses {{run_dir}}; use {{invocation_dir}} instead."
26
- )
27
- for name in ("run_dir", "invocation_dir"):
28
- if f"{{{name}}}" in value and name not in dirs:
24
+ used = [name for name in PLACEHOLDERS if f"{{{name}}}" in value]
25
+ if hook is not None and any(name not in HOOK_PLACEHOLDERS for name in used):
26
+ continue
27
+ for name in used:
28
+ if name not in dirs:
29
29
  raise ValueError(
30
30
  f"{hook} env.{key} uses {{{name}}}, but this invocation plans "
31
31
  f"{runs} runs. {{{name}}} needs exactly one run in this mode."
@@ -0,0 +1,5 @@
1
+ from labnotes.format_value import format_value
2
+
3
+
4
+ def in_subset(cell: dict[str, object], only: dict[str, list[str]]) -> bool:
5
+ return all(format_value(cell[param]) in values for param, values in only.items())
@@ -0,0 +1,2 @@
1
+ PLACEHOLDERS = ("run_dir", "invocation_dir")
2
+ HOOK_PLACEHOLDERS = ("invocation_dir",)
@@ -13,7 +13,7 @@ async def prepare_experiment(
13
13
  name: str,
14
14
  experiment_config: Path | None,
15
15
  concurrency: int | None,
16
- only: dict[str, str] | None = None,
16
+ only: dict[str, list[str]] | None = None,
17
17
  args: list[str] | None = None,
18
18
  setup: str | None = None,
19
19
  teardown: str | None = None,
@@ -47,7 +47,7 @@ async def run_experiment(
47
47
  listen: Listen,
48
48
  timeout: float | None = None,
49
49
  retry_seconds: float = RETRY_SECONDS,
50
- only: dict[str, str] | None = None,
50
+ only: dict[str, list[str]] | None = None,
51
51
  args: list[str] | None = None,
52
52
  environment: dict[str, str] | None = None,
53
53
  snapshot: ProjectSnapshot | None = None,
@@ -13,7 +13,7 @@ def start_experiment(
13
13
  experiment_config: Path | None,
14
14
  concurrency: int | None,
15
15
  timeout: int | None,
16
- only: dict[str, str] | None,
16
+ only: dict[str, list[str]] | None,
17
17
  args: list[str] | None,
18
18
  setup: str | None,
19
19
  teardown: str | None,
@@ -1,5 +0,0 @@
1
- from labnotes.format_value import format_value
2
-
3
-
4
- def in_subset(cell: dict[str, object], only: dict[str, str]) -> bool:
5
- return all(format_value(cell[param]) == value for param, value in only.items())
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes