langfun 0.1.2.dev202412220804__py3-none-any.whl → 0.1.2.dev202412240804__py3-none-any.whl

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.
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  """Checkpointing evaluation runs."""
15
+ import abc
15
16
  import threading
16
17
  import traceback
17
18
 
@@ -28,21 +29,74 @@ Runner = experiment_lib.Runner
28
29
  class Checkpointer(experiment_lib.Plugin):
29
30
  """Base class for checkpointing evaluation examples."""
30
31
 
31
- def on_experiment_start(self, experiment: Experiment):
32
+ def on_experiment_start(
33
+ self,
34
+ runner: Runner,
35
+ experiment: Experiment
36
+ ) -> None:
37
+ if not experiment.is_leaf:
38
+ return
39
+
40
+ # For refresh runs, we don't want to load the previous state.
41
+ if not runner.current_run.refresh:
42
+ if runner.current_run.input_root != runner.current_run.output_root:
43
+ experiment.info(
44
+ f'Warm starting from directory: {runner.current_run.input_root}.'
45
+ )
46
+ self._load_experiment(runner, experiment)
47
+
32
48
  if experiment.state.evaluated_examples:
49
+ loaded_example_ids = list(
50
+ sorted(experiment.state.evaluated_examples.keys())
51
+ )
52
+ example_ids_to_evaluate = (
53
+ set(runner.current_run.example_ids) if runner.current_run.example_ids
54
+ else set(range(1, experiment.num_examples + 1))
55
+ )
56
+ example_ids_to_evaluate -= set(loaded_example_ids)
57
+
33
58
  experiment.info(
34
- 'Loaded %d examples from checkpoint files. Example IDs: %s' %
35
- (
36
- len(experiment.state.evaluated_examples),
37
- list(sorted(experiment.state.evaluated_examples.keys()))
38
- ),
59
+ f'{len(experiment.state.evaluated_examples)} examples have been '
60
+ 'loaded from checkpoint files. Their outputs will be used '
61
+ f'for recomputing metrics. Example IDs: {loaded_example_ids}'
62
+ )
63
+ experiment.info(
64
+ f'{len(example_ids_to_evaluate)} examples will be processed from '
65
+ f'scratch. Example IDs: {list(sorted(example_ids_to_evaluate))}'
39
66
  )
40
67
  else:
41
68
  experiment.info(
42
- 'No previous evaluated examples are loaded. '
69
+ 'No examples are loaded from checkpoint files. '
43
70
  f'Experiment {experiment.id} starts from scratch.'
44
71
  )
45
72
 
73
+ def on_example_complete(
74
+ self,
75
+ runner: Runner,
76
+ experiment: Experiment,
77
+ example: Example,
78
+ ) -> None:
79
+ """Saves the example to the checkpoint file."""
80
+ if example.has_error:
81
+ experiment.warning(
82
+ f'Example {example.id} has error. Skipping checkpointing.'
83
+ )
84
+ else:
85
+ self._save_example(runner, experiment, example)
86
+
87
+ @abc.abstractmethod
88
+ def _load_experiment(self, runner: Runner, experiment: Experiment) -> None:
89
+ """Loads the experiment state from checkpoint files."""
90
+
91
+ @abc.abstractmethod
92
+ def _save_example(
93
+ self,
94
+ runner: Runner,
95
+ experiment: Experiment,
96
+ example: Example,
97
+ ) -> None:
98
+ """Saves an evaluated example."""
99
+
46
100
 
47
101
  class PerExampleCheckpointer(Checkpointer):
48
102
  """Checkpointer that saves each example to a separate file."""
@@ -55,80 +109,86 @@ class PerExampleCheckpointer(Checkpointer):
55
109
  self._checkpoint_file_prefix = prefix
56
110
  self._checkpoint_file_ext = ext
57
111
 
58
- def on_experiment_start(
112
+ def _load_experiment(
59
113
  self,
60
114
  runner: Runner,
61
115
  experiment: Experiment,
62
116
  ) -> None:
63
117
  """Creates the checkpoint file."""
64
- if not experiment.is_leaf:
65
- return
118
+ experiment_dir = runner.current_run.input_dir(experiment)
119
+ if pg.io.path_exists(experiment_dir):
120
+ ckpt_files = [
121
+ runner.current_run.input_path_for(experiment, filename)
122
+ for filename in pg.io.listdir(experiment_dir)
123
+ if filename.startswith(self._checkpoint_file_prefix)
124
+ and filename.endswith(self._checkpoint_file_ext)
125
+ ]
126
+ else:
127
+ ckpt_files = []
66
128
 
67
- # For refresh runs, we don't want to load the previous state.
68
- if not runner.current_run.refresh:
69
- if runner.current_run.input_root != runner.current_run.output_root:
70
- experiment.info(
71
- f'Warm starting from directory: {runner.current_run.input_root}.'
129
+ experiment.info(f'Found {len(ckpt_files)} checkpoint files to load.')
130
+
131
+ # Load the checkpoint files in parallel.
132
+ context = dict(counter=0, counter_lock=threading.Lock())
133
+ def _load_state(ckpt_file):
134
+ error = None
135
+ with pg.timeit() as t:
136
+ try:
137
+ experiment.load_state(ckpt_file)
138
+ except BaseException as e: # pylint: disable=broad-except
139
+ error = e
140
+ finally:
141
+ with context['counter_lock']:
142
+ context['counter'] += 1
143
+
144
+ progress_str = f'{context["counter"]}/{len(ckpt_files)}'
145
+ if error is None:
146
+ experiment.info(
147
+ f'Loaded checkpoint file {ckpt_file} in {t.elapse:.2f} '
148
+ f'seconds. ({progress_str})'
149
+ )
150
+ else:
151
+ experiment.warning(
152
+ f'Failed to load checkpoint file {ckpt_file}: {error}. '
153
+ f'Skipping the file. ({progress_str})'
154
+ )
155
+
156
+ _ = list(
157
+ lf.concurrent_map(
158
+ _load_state, ckpt_files, max_workers=16, silence_on_errors=None
72
159
  )
73
- def _load_state(ckpt_file):
74
- experiment.load_state(ckpt_file)
75
-
76
- experiment_dir = runner.current_run.input_dir(experiment)
77
- if pg.io.path_exists(experiment_dir):
78
- ckpt_files = [
79
- runner.current_run.input_path_for(experiment, filename)
80
- for filename in pg.io.listdir(experiment_dir)
81
- if filename.startswith(self._checkpoint_file_prefix)
82
- and filename.endswith(self._checkpoint_file_ext)
83
- ]
84
- else:
85
- ckpt_files = []
86
-
87
- for ckpt_file, _, error in lf.concurrent_map(
88
- _load_state, ckpt_files, max_workers=64,
89
- ):
90
- if error is not None:
91
- experiment.warning(
92
- f'Failed to load checkpoint file {ckpt_file}: {error}. '
93
- 'Skipping the file.'
94
- )
95
- super().on_experiment_start(experiment)
160
+ )
96
161
 
97
- def on_example_complete(
162
+ def _save_example(
98
163
  self,
99
164
  runner: Runner,
100
165
  experiment: Experiment,
101
166
  example: Example,
102
167
  ) -> None:
103
168
  """Saves the example to the checkpoint file."""
104
- if example.has_error:
105
- experiment.warning(
106
- f'Example {example.id} has error. Skipping checkpointing.'
169
+ def save_state(example: Example):
170
+ writer = SequenceWriter(
171
+ runner.current_run.output_path_for(
172
+ experiment,
173
+ (
174
+ f'{self._checkpoint_file_prefix}_{example.id}'
175
+ f'{self._checkpoint_file_ext}'
176
+ )
177
+ )
107
178
  )
108
- else:
109
- def save_state(example: Example):
110
- writer = SequenceWriter(
111
- runner.current_run.output_path_for(
112
- experiment,
113
- (
114
- f'{self._checkpoint_file_prefix}_{example.id}'
115
- f'{self._checkpoint_file_ext}'
116
- )
117
- )
179
+ try:
180
+ writer.add(example)
181
+ writer.close()
182
+ experiment.info(
183
+ f'Example {example.id} saved to {writer.path}.',
118
184
  )
119
- try:
120
- writer.add(example)
121
- writer.close()
122
- experiment.info(
123
- f'Example {example.id} is saved to {writer.path}.',
124
- )
125
- except BaseException as e: # pylint: disable=broad-except
126
- experiment.error(
127
- f'Failed to save example {example.id} to {writer.path}. '
128
- f'Error: {e}, Stacktrace: \n{traceback.format_exc()}.',
129
- )
130
- raise e
131
- runner.background_run(save_state, example)
185
+ except BaseException as e: # pylint: disable=broad-except
186
+ experiment.error(
187
+ f'Failed to save example {example.id} to {writer.path}. '
188
+ f'Error: {e}, Stacktrace: \n{traceback.format_exc()}.',
189
+ )
190
+ raise e
191
+ runner.background_run(save_state, example)
132
192
 
133
193
  def _file_prefix_and_ext(self, filename: str) -> tuple[str, str]:
134
194
  ext_index = filename.rfind('.')
@@ -180,30 +240,31 @@ class BulkCheckpointer(Checkpointer):
180
240
  runner: Runner,
181
241
  experiment: Experiment,
182
242
  ) -> None:
183
- """Creates the checkpoint file."""
184
- if not experiment.is_leaf:
185
- return
186
- # For refresh runs, we don't want to load the previous state.
187
- if not runner.current_run.refresh:
188
- if runner.current_run.input_root != runner.current_run.output_root:
189
- experiment.info(
190
- f'Warm starting from directory: {runner.current_run.input_root}.'
191
- )
192
- experiment.load_state(
193
- runner.current_run.input_path_for(
243
+ super().on_experiment_start(runner, experiment)
244
+
245
+ # Prepare the sequence writer for the experiment.
246
+ if experiment.is_leaf:
247
+ sequence_writer = SequenceWriter(
248
+ runner.current_run.output_path_for(
194
249
  experiment, self.checkpoint_filename
195
- ),
196
- raise_if_not_exist=False
250
+ )
197
251
  )
198
- sequence_writer = SequenceWriter(
199
- runner.current_run.output_path_for(
252
+ with self._lock:
253
+ if self._sequence_writer is not None:
254
+ self._sequence_writer[experiment.id] = sequence_writer
255
+
256
+ def _load_experiment(
257
+ self,
258
+ runner: Runner,
259
+ experiment: Experiment,
260
+ ) -> None:
261
+ """Creates the checkpoint file."""
262
+ experiment.load_state(
263
+ runner.current_run.input_path_for(
200
264
  experiment, self.checkpoint_filename
201
- )
265
+ ),
266
+ raise_if_not_exist=False
202
267
  )
203
- with self._lock:
204
- if self._sequence_writer is not None:
205
- self._sequence_writer[experiment.id] = sequence_writer
206
- super().on_experiment_start(experiment)
207
268
 
208
269
  def on_experiment_complete(
209
270
  self,
@@ -225,7 +286,7 @@ class BulkCheckpointer(Checkpointer):
225
286
  f'checkpointed to {writer.path}.'
226
287
  )
227
288
 
228
- def on_example_complete(
289
+ def _save_example(
229
290
  self,
230
291
  runner: Runner,
231
292
  experiment: Experiment,
@@ -233,22 +294,20 @@ class BulkCheckpointer(Checkpointer):
233
294
  ) -> None:
234
295
  """Saves the example to the checkpoint file."""
235
296
  assert experiment.id in self._sequence_writer
236
- if example.has_error:
237
- experiment.warning(
238
- f'Example {example.id} has error. Skipping checkpointing.'
239
- )
240
- else:
241
- def _save_example(example: Example):
242
- writer = self._sequence_writer[experiment.id]
243
- try:
244
- writer.add(example)
245
- except BaseException as e: # pylint: disable=broad-except
246
- experiment.error(
247
- f'Failed to save example {example.id} to {writer.path}. '
248
- f'Error: {e}, Stacktrace: \n{traceback.format_exc()}.',
249
- )
250
- raise e
251
- runner.background_run(_save_example, example)
297
+ def _save_example(example: Example):
298
+ writer = self._sequence_writer[experiment.id]
299
+ try:
300
+ writer.add(example)
301
+ experiment.info(
302
+ f'Example {example.id} added to {writer.path}.',
303
+ )
304
+ except BaseException as e: # pylint: disable=broad-except
305
+ experiment.error(
306
+ f'Failed to save example {example.id} to {writer.path}. '
307
+ f'Error: {e}, Stacktrace: \n{traceback.format_exc()}.',
308
+ )
309
+ raise e
310
+ runner.background_run(_save_example, example)
252
311
 
253
312
 
254
313
  class SequenceWriter:
@@ -55,6 +55,7 @@ class SequenceWriterTest(unittest.TestCase):
55
55
  class PerExampleCheckpointerTest(unittest.TestCase):
56
56
 
57
57
  def test_checkpointing(self):
58
+ pg.defaults.loggers.use_stdout()
58
59
  root_dir = os.path.join(tempfile.gettempdir(), 'per_example_checkpointer')
59
60
  experiment = eval_test_helper.test_experiment()
60
61
  checkpoint_filename = 'checkpoint.jsonl'
@@ -81,7 +81,7 @@ class Experiment(lf.Component, pg.views.HtmlTreeView.Extension):
81
81
  directory (using the ID 'latest'). Users can specify 'new' to start a fresh
82
82
  run or provide a specific run ID (typically in the format %Y%m%d_%<number>).
83
83
  Additionally, when initiating a new run, users may specify a `warm_start_from`
84
- ID to restore the experiment’s state from a previous run.
84
+ directory to restore the experiment’s state from a previous run.
85
85
 
86
86
  Examples:
87
87
 
@@ -97,9 +97,9 @@ class Experiment(lf.Component, pg.views.HtmlTreeView.Extension):
97
97
  # Start a new, clean run.
98
98
  experiment.run(root_dir, 'new')
99
99
 
100
- # Start a new run with a warm start from the previous run located in
101
- # 'run_20241031_1' of the root directory.
102
- experiment.run(root_dir, 'new', warm_start_from='20241031_1')
100
+ # Start a new run with a warm start from the another run located at
101
+ # '/path/to/another/run' (e.g. /my_expreriment/run_20241031_1).
102
+ experiment.run(root_dir, 'new', warm_start_from='/path/to/another/run')
103
103
 
104
104
  # Resume run '20241031_1', re-running failed examples and recomputing
105
105
  # metrics as needed.
@@ -13,12 +13,14 @@
13
13
  # limitations under the License.
14
14
  """Reporting evaluation results."""
15
15
 
16
+ import threading
16
17
  import time
17
18
  import traceback
18
19
  from typing import Annotated
19
20
 
20
21
  from langfun.core.eval.v2 import example as example_lib
21
22
  from langfun.core.eval.v2 import experiment as experiment_lib
23
+ import pyglove as pg
22
24
 
23
25
  Runner = experiment_lib.Runner
24
26
  Experiment = experiment_lib.Experiment
@@ -40,12 +42,15 @@ class HtmlReporter(experiment_lib.Plugin):
40
42
  experiment_report_interval: Annotated[
41
43
  int,
42
44
  'The interval of writing report for inidividual experiments in seconds.'
43
- ] = 60
45
+ ] = 120
44
46
 
45
47
  def _on_bound(self):
46
48
  super()._on_bound()
47
49
  self._last_summary_time = 0
48
50
  self._last_experiment_report_time = {}
51
+ self._update_thread = None
52
+ self._stop_update = False
53
+ self._stop_update_experiment_ids = set()
49
54
 
50
55
  def on_run_start(
51
56
  self,
@@ -54,12 +59,19 @@ class HtmlReporter(experiment_lib.Plugin):
54
59
  ) -> None:
55
60
  self._maybe_update_summary(runner)
56
61
  self._last_experiment_report_time = {leaf.id: 0 for leaf in root.leaf_nodes}
62
+ self._stop_update = False
63
+ self._stop_update_experiment_ids = set()
64
+ self._update_thread = threading.Thread(
65
+ target=self._update_thread_func, args=(runner,)
66
+ )
67
+ self._update_thread.start()
57
68
 
58
69
  def on_run_complete(
59
70
  self,
60
71
  runner: Runner,
61
72
  root: Experiment
62
73
  ) -> None:
74
+ self._stop_update = True
63
75
  self._maybe_update_summary(runner, force=True)
64
76
 
65
77
  def on_run_abort(
@@ -68,8 +80,20 @@ class HtmlReporter(experiment_lib.Plugin):
68
80
  root: Experiment,
69
81
  error: BaseException
70
82
  ) -> None:
83
+ self._stop_update = True
71
84
  self._maybe_update_summary(runner, force=True)
72
85
 
86
+ def _update_thread_func(self, runner: Runner):
87
+ while not self._stop_update:
88
+ self._maybe_update_summary(runner, background=False)
89
+ for leaf in runner.current_run.experiment.leaf_nodes:
90
+ if leaf.id in self._stop_update_experiment_ids:
91
+ continue
92
+ self._maybe_update_experiment_html(runner, leaf, background=False)
93
+ if leaf.progress.is_stopped:
94
+ self._stop_update_experiment_ids.add(leaf.id)
95
+ time.sleep(5)
96
+
73
97
  def on_experiment_start(
74
98
  self,
75
99
  runner: Runner,
@@ -101,7 +125,11 @@ class HtmlReporter(experiment_lib.Plugin):
101
125
  self._maybe_update_experiment_html(runner, experiment)
102
126
  self._maybe_update_summary(runner)
103
127
 
104
- def _maybe_update_summary(self, runner: Runner, force: bool = False) -> None:
128
+ def _maybe_update_summary(
129
+ self,
130
+ runner: Runner,
131
+ background: bool = True,
132
+ force: bool = False) -> None:
105
133
  """Maybe update the summary of current run."""
106
134
  run = runner.current_run
107
135
  def _summary():
@@ -115,26 +143,37 @@ class HtmlReporter(experiment_lib.Plugin):
115
143
  )
116
144
 
117
145
  if force or (time.time() - self._last_summary_time > self.summary_interval):
118
- runner.background_run(_summary)
146
+ if background:
147
+ runner.background_run(_summary)
148
+ else:
149
+ _summary()
119
150
  self._last_summary_time = time.time()
120
151
 
121
152
  def _maybe_update_experiment_html(
122
- self, runner: Runner, experiment: Experiment, force: bool = False
153
+ self,
154
+ runner: Runner,
155
+ experiment: Experiment,
156
+ force: bool = False,
157
+ background: bool = True,
123
158
  ) -> None:
124
159
  def _save():
125
160
  index_html_path = runner.current_run.output_path_for(
126
161
  experiment, _EVALULATION_DETAIL_FILE
127
162
  )
128
163
  try:
129
- html = experiment.to_html(
130
- collapse_level=None,
131
- extra_flags=dict(
132
- current_run=runner.current_run,
133
- interactive=False,
134
- card_view=False,
135
- ),
136
- )
137
- html.save(index_html_path)
164
+ with pg.timeit() as t:
165
+ html = experiment.to_html(
166
+ collapse_level=None,
167
+ extra_flags=dict(
168
+ current_run=runner.current_run,
169
+ interactive=False,
170
+ card_view=False,
171
+ ),
172
+ )
173
+ html.save(index_html_path)
174
+ experiment.info(
175
+ f'Generated HTML {index_html_path!r} in {t.elapse:.2f} seconds.',
176
+ )
138
177
  except BaseException as e: # pylint: disable=broad-except
139
178
  experiment.error(
140
179
  f'Failed to save HTML {index_html_path!r}. '
@@ -146,7 +185,10 @@ class HtmlReporter(experiment_lib.Plugin):
146
185
  time.time() - self._last_experiment_report_time[experiment.id]
147
186
  > self.experiment_report_interval
148
187
  ):
149
- runner.background_run(_save)
188
+ if background:
189
+ runner.background_run(_save)
190
+ else:
191
+ _save()
150
192
  self._last_experiment_report_time[experiment.id] = time.time()
151
193
 
152
194
  def _save_example_html(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langfun
3
- Version: 0.1.2.dev202412220804
3
+ Version: 0.1.2.dev202412240804
4
4
  Summary: Langfun: Language as Functions.
5
5
  Home-page: https://github.com/google/langfun
6
6
  Author: Langfun Authors
@@ -58,14 +58,14 @@ langfun/core/eval/patching_test.py,sha256=8kCd54Egjju22FMgtJuxEsrXkW8ifs-UUBHtrC
58
58
  langfun/core/eval/scoring.py,sha256=B69IsIxiPs1xZcOBFIhZF70YmDue2Siik-CPL2bh33s,6254
59
59
  langfun/core/eval/scoring_test.py,sha256=O8olHbrUEg60gMxwOkWzKBJZpZoUlmVnBANX5Se2SXM,4546
60
60
  langfun/core/eval/v2/__init__.py,sha256=qoa6zKdFXOFyCX6vay6OdgPf1eUhYGoHYAxe35qECGk,1628
61
- langfun/core/eval/v2/checkpointing.py,sha256=zr2hxOjm6Hdq71sYTsbQtL_CwQOWr-Ir9T5TPUnhqMI,8741
62
- langfun/core/eval/v2/checkpointing_test.py,sha256=Imy96lwDkvmtj-1YFpP2DZukMOoYqpPov2J_MsQKxxI,4398
61
+ langfun/core/eval/v2/checkpointing.py,sha256=5Koc9IM5OFAhLaO7sAZC979vEFxR8a_ssXcaqG_iVw0,10325
62
+ langfun/core/eval/v2/checkpointing_test.py,sha256=i9qmEJk90kz6SB7OBGAHCogKVyazUZxAZlKXZt9hccI,4435
63
63
  langfun/core/eval/v2/eval_test_helper.py,sha256=pDpZTBnWRR5xjJv3Uy3NWEzArqlL8FTMOgeR4C53F5M,2348
64
64
  langfun/core/eval/v2/evaluation.py,sha256=NFBGAWw2BtW7H0zcoZhfWtz59Psra84eshJm73uAFwg,21807
65
65
  langfun/core/eval/v2/evaluation_test.py,sha256=GmV1TiqX1V15st2qpcGWooM5hudomQVjW5kajovGDvE,6231
66
66
  langfun/core/eval/v2/example.py,sha256=fURrvdNmMsVMqoEErcsmLmC6Xq3ny16dYsnLH8HVlcY,9626
67
67
  langfun/core/eval/v2/example_test.py,sha256=WcJmU7IQQXvjFia63mokySC4CqxzVL9Wso1sC5F0YK8,3032
68
- langfun/core/eval/v2/experiment.py,sha256=xfk4aNZ3dH46y0lWSS_fC7JpfJCG77Z5qsakV4gHcOs,29762
68
+ langfun/core/eval/v2/experiment.py,sha256=DuuqTJA0jmep-CM098MYutKkarLIcd1Do9P0W_HhdBg,29800
69
69
  langfun/core/eval/v2/experiment_test.py,sha256=zSMHYqC9cA0k61U71pCSYTAJ6yK2_b6Dml5btc-bKzQ,9133
70
70
  langfun/core/eval/v2/metric_values.py,sha256=_B905bC-jxrYPLSEcP2M8MaHZOVMz_bVrUw8YC4arCE,4660
71
71
  langfun/core/eval/v2/metric_values_test.py,sha256=ab2oF_HsIwrSy459108ggyjgefHSPn8UVILR4dRwx14,2634
@@ -75,7 +75,7 @@ langfun/core/eval/v2/progress.py,sha256=azZgssQgNdv3IgjKEaQBuGI5ucFDNbdi02P4z_nQ
75
75
  langfun/core/eval/v2/progress_test.py,sha256=YU7VHzmy5knPZwj9vpBN3rQQH2tukj9eKHkuBCI62h8,2540
76
76
  langfun/core/eval/v2/progress_tracking.py,sha256=l9fEkz4oP5McpZzf72Ua7PYm3lAWtRru7gRWNf8H0ms,6083
77
77
  langfun/core/eval/v2/progress_tracking_test.py,sha256=fouMVJkFJqHjbhQJngGLGCmA9x3n0dU4USI2dY163mg,2291
78
- langfun/core/eval/v2/reporting.py,sha256=vsh45GLVnA7GMU-8cvNYOt4Nb7mEwvcguhO-BSXSzTE,5358
78
+ langfun/core/eval/v2/reporting.py,sha256=qFxoxqQhNGxh1APg6-JVDlIfniGdty2Rh8aXQMc1aak,6612
79
79
  langfun/core/eval/v2/reporting_test.py,sha256=4nobW6pcaatiZh8u4xciexciaiZNDlDoJci157Wp_RI,1492
80
80
  langfun/core/eval/v2/runners.py,sha256=t6_yHAJ4HWufK4wvh_OntKcok2KquA5ARIHIk1vvEwc,15870
81
81
  langfun/core/eval/v2/runners_test.py,sha256=A37fKK2MvAVTiShsg_laluJzJ9AuAQn52k7HPbfD0Ks,11666
@@ -148,8 +148,8 @@ langfun/core/templates/demonstration.py,sha256=vCrgYubdZM5Umqcgp8NUVGXgr4P_c-fik
148
148
  langfun/core/templates/demonstration_test.py,sha256=SafcDQ0WgI7pw05EmPI2S4v1t3ABKzup8jReCljHeK4,2162
149
149
  langfun/core/templates/selfplay.py,sha256=yhgrJbiYwq47TgzThmHrDQTF4nDrTI09CWGhuQPNv-s,2273
150
150
  langfun/core/templates/selfplay_test.py,sha256=Ot__1P1M8oJfoTp-M9-PQ6HUXqZKyMwvZ5f7yQ3yfyM,2326
151
- langfun-0.1.2.dev202412220804.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
152
- langfun-0.1.2.dev202412220804.dist-info/METADATA,sha256=SKSVb1h469QIDbiOKMxz5HwTjTIOWoomol55YNkkFqU,8281
153
- langfun-0.1.2.dev202412220804.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
154
- langfun-0.1.2.dev202412220804.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
155
- langfun-0.1.2.dev202412220804.dist-info/RECORD,,
151
+ langfun-0.1.2.dev202412240804.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
152
+ langfun-0.1.2.dev202412240804.dist-info/METADATA,sha256=BLBcqKA0YgIcOpGcLwl4iXagfZaUBS0h3pDbm4AG978,8281
153
+ langfun-0.1.2.dev202412240804.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
154
+ langfun-0.1.2.dev202412240804.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
155
+ langfun-0.1.2.dev202412240804.dist-info/RECORD,,