langfun 0.1.1.dev20240827__py3-none-any.whl → 0.1.1.dev20240828__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.
@@ -13,17 +13,30 @@
13
13
  # limitations under the License.
14
14
  """Utility library for handling concurrency in langfun."""
15
15
 
16
+ import abc
16
17
  import collections
17
18
  import concurrent.futures
18
19
  import dataclasses
20
+ import io
19
21
  import random
22
+ import sys
20
23
  import threading
21
24
  import time
22
25
  from typing import Any, Callable, Iterable, Iterator, Literal, Sequence, Tuple, Type, Union
23
26
 
24
27
  from langfun.core import component
28
+ from langfun.core import text_formatting
25
29
  import pyglove as pg
26
- from tqdm import auto as tqdm
30
+
31
+
32
+ progress_bar: Literal['tqdm', 'console', None] = None
33
+
34
+ try:
35
+ from tqdm import auto as tqdm # pylint: disable=g-import-not-at-top
36
+ progress_bar = 'tqdm'
37
+ except ImportError as e:
38
+ progress_bar = 'console'
39
+ tqdm = None
27
40
 
28
41
 
29
42
  def with_context_access(func: Callable[..., Any]) -> Callable[..., Any]:
@@ -142,7 +155,6 @@ def with_retry(
142
155
  attempt = 1
143
156
  return base_interval() * (2 ** (attempt - 1))
144
157
 
145
- wait_interval = None
146
158
  wait_intervals = []
147
159
  errors = []
148
160
  while True:
@@ -356,17 +368,17 @@ class ProgressBar:
356
368
  label: str | None
357
369
  total: int
358
370
  color: str | None = None
359
- postfix: dict[str, str] | None = None
371
+ status: dict[str, Any] | None = None
360
372
 
361
373
  @dataclasses.dataclass
362
374
  class Update:
363
375
  """Progress bar update."""
364
376
  bar_id: int
365
377
  delta: int
366
- postfix: Union[dict[str, str], str, None] = None
378
+ status: Union[dict[str, Any], str, None] = None
367
379
  color: str | None = None
368
380
 
369
- _progress_bars: dict[int, tqdm.tqdm] = {}
381
+ _progress_bars: dict[int, '_ProgressControl'] = {}
370
382
  _install_requests: list[tuple[int, Settings]] = []
371
383
  _updates: collections.deque[Update] = collections.deque()
372
384
  _uninstall_requests: list[int] = []
@@ -378,11 +390,11 @@ class ProgressBar:
378
390
  label: str | None,
379
391
  total: int,
380
392
  color: str | None = None,
381
- postfix: dict[str, str] | None = None,
393
+ status: dict[str, Any] | None = None,
382
394
  ) -> int:
383
395
  """Installs a progress bar and returns a reference id."""
384
396
  with cls._lock:
385
- settings = ProgressBar.Settings(label, total, color, postfix)
397
+ settings = ProgressBar.Settings(label, total, color, status)
386
398
  bar_id = id(settings)
387
399
  cls._install_requests.append((bar_id, settings))
388
400
  return bar_id
@@ -392,15 +404,17 @@ class ProgressBar:
392
404
  cls,
393
405
  bar_id: int,
394
406
  delta: int = 0,
395
- postfix: Union[dict[str, str], str, None] = None,
407
+ status: Union[dict[str, Any], str, None] = None,
396
408
  color: str | None = None,
397
409
  refresh: bool = True,
398
410
  ) -> None:
399
411
  """Report the progress for a label."""
412
+ if status is not None and not isinstance(status, (str, dict)):
413
+ raise ValueError(f'Unsupported status: {status}')
400
414
  with cls._lock:
401
415
  cls._updates.append(
402
416
  ProgressBar.Update(
403
- bar_id=bar_id, delta=delta, postfix=postfix, color=color,
417
+ bar_id=bar_id, delta=delta, status=status, color=color,
404
418
  )
405
419
  )
406
420
  if refresh:
@@ -422,11 +436,11 @@ class ProgressBar:
422
436
  # Process install requests.
423
437
  if cls._install_requests:
424
438
  for bar_id, settings in cls._install_requests:
425
- cls._progress_bars[bar_id] = tqdm.tqdm(
439
+ cls._progress_bars[bar_id] = _progress_control(
426
440
  total=settings.total,
427
- desc=settings.label,
428
- colour=settings.color,
429
- postfix=settings.postfix)
441
+ label=settings.label,
442
+ color=settings.color,
443
+ status=settings.status)
430
444
  cls._install_requests.clear()
431
445
 
432
446
  # Process updates.
@@ -441,15 +455,11 @@ class ProgressBar:
441
455
  if update.delta > 0:
442
456
  bar.update(update.delta)
443
457
 
444
- if isinstance(update.postfix, str):
445
- bar.set_postfix_str(update.postfix, refresh=False)
446
- elif isinstance(update.postfix, dict):
447
- bar.set_postfix(update.postfix, refresh=False)
448
- elif update.postfix is not None:
449
- raise ValueError(f'Unsupported postfix: {update.postfix}')
458
+ if update.status is not None:
459
+ bar.set_status(update.status)
450
460
 
451
461
  if update.color is not None:
452
- bar.colour = update.color
462
+ bar.set_color(update.color)
453
463
  updated_bars.add(bar)
454
464
 
455
465
  # Refresh each updated bar just once.
@@ -603,7 +613,7 @@ def concurrent_map(
603
613
  if len(error_text) >= 64:
604
614
  error_text = error_text[:64] + '...'
605
615
  status['LastError'] = error_text
606
- ProgressBar.update(bar_id, delta=1, postfix=status)
616
+ ProgressBar.update(bar_id, delta=1, status=status)
607
617
 
608
618
  try:
609
619
  if ordered:
@@ -729,5 +739,122 @@ class ExecutorPool:
729
739
  raise ValueError(f'Unsupported value: {maybe_executor}.')
730
740
 
731
741
 
742
+ class _ProgressControl(pg.Object):
743
+ """Abstract progress control."""
744
+ # Disable symbolic comparison so the hash is based on object address.
745
+ use_symbolic_comparison = False
746
+
747
+ total: int
748
+ label: str | None
749
+ color: str | None
750
+ status: str | dict[str, Any] | None
751
+
752
+ def set_color(self, color: str | None):
753
+ with pg.notify_on_change(False):
754
+ self.rebind(color=color)
755
+
756
+ def set_status(self, status: str | dict[str, Any] | None):
757
+ with pg.notify_on_change(False):
758
+ self.rebind(status=status)
759
+
760
+ @abc.abstractmethod
761
+ def update(self, delta):
762
+ """Update progress."""
763
+
764
+ @abc.abstractmethod
765
+ def refresh(self) -> None:
766
+ """Refresh progress bar."""
767
+
768
+
769
+ class _TqdmProgressControl(_ProgressControl):
770
+ """Tqdm-based progress control."""
771
+
772
+ def _on_bound(self):
773
+ super()._on_bound()
774
+ assert tqdm is not None
775
+ self._tqdm = tqdm.tqdm(
776
+ total=self.total,
777
+ desc=self.label,
778
+ colour=self.color,
779
+ postfix=self.status,
780
+ )
781
+
782
+ def update(self, delta: int) -> None:
783
+ self._tqdm.update(delta)
784
+
785
+ def refresh(self):
786
+ self._tqdm.set_description(self.label, refresh=False)
787
+ if isinstance(self.status, str):
788
+ self._tqdm.set_postfix_str(self.status, refresh=False)
789
+ else:
790
+ self._tqdm.set_postfix(self.status, refresh=False)
791
+ self._tqdm.colour = self.color
792
+ self._tqdm.refresh()
793
+
794
+
795
+ class _ConsoleProgressControl(_ProgressControl):
796
+ """Simple progress control by printing the status to the console."""
797
+
798
+ def _on_bound(self):
799
+ super()._on_bound()
800
+ self._progress = 0
801
+
802
+ def update(self, delta: int) -> None:
803
+ self._progress += delta
804
+
805
+ def refresh(self):
806
+ s = io.StringIO()
807
+ if self.label is not None:
808
+ s.write(text_formatting.colored(self.label, 'red', styles=['bold']))
809
+ s.write(': ')
810
+ s.write(
811
+ text_formatting.colored(
812
+ '%d%% (%d/%d)' %
813
+ (
814
+ self._progress * 100 // self.total,
815
+ self._progress,
816
+ self.total,
817
+ ),
818
+ color=self.color or 'green'
819
+ )
820
+ )
821
+ if self.status is not None:
822
+ status = repr(self.status) if isinstance(
823
+ self.status, dict) else self.status
824
+ s.write(f' : {status}')
825
+ sys.stderr.write(s.getvalue() + '\n')
826
+
827
+
828
+ class _NoopProgressControl(_ProgressControl):
829
+ """No-op progress control."""
830
+
831
+ def update(self, delta: int) -> None:
832
+ pass
833
+
834
+ def refresh(self) -> None:
835
+ pass
836
+
837
+
838
+ def _progress_control(
839
+ total: int,
840
+ label: str | None,
841
+ color: str | None,
842
+ status: str | dict[str, Any] | None,
843
+ ) -> _ProgressControl:
844
+ """Creates a process control."""
845
+ if progress_bar == 'tqdm':
846
+ if not tqdm:
847
+ raise RuntimeError(
848
+ 'Please install package "tqdm" to use `tqdm` progress bar.'
849
+ )
850
+ return _TqdmProgressControl(total, label, color, status)
851
+ elif progress_bar == 'console':
852
+ return _ConsoleProgressControl(total, label, color, status)
853
+ elif progress_bar is None:
854
+ return _NoopProgressControl(total, label, color, status)
855
+ else:
856
+ raise ValueError(f'Unsupported progress bar type: {progress_bar}')
857
+
858
+
732
859
  # The global executor pool based on resource IDs.
733
860
  _executor_pool = ExecutorPool()
@@ -233,6 +233,57 @@ class ProgressTest(unittest.TestCase):
233
233
  self.assertIs(p.last_error, job2.error)
234
234
 
235
235
 
236
+ class ProgressControlTest(unittest.TestCase):
237
+
238
+ def test_noop(self):
239
+ concurrent.progress_bar = None
240
+ ctrl = concurrent._progress_control(100, 'noop', 'blue', None)
241
+ self.assertIsInstance(ctrl, concurrent._NoopProgressControl)
242
+ string_io = io.StringIO()
243
+ with contextlib.redirect_stderr(string_io):
244
+ ctrl.update(1)
245
+ ctrl.refresh()
246
+ self.assertEqual(string_io.getvalue(), '')
247
+ concurrent.progress_bar = 'tqdm'
248
+
249
+ def test_console(self):
250
+ concurrent.progress_bar = 'console'
251
+ ctrl = concurrent._progress_control(100, 'foo', 'blue', None)
252
+ self.assertIsInstance(ctrl, concurrent._ConsoleProgressControl)
253
+ string_io = io.StringIO()
254
+ with contextlib.redirect_stderr(string_io):
255
+ ctrl.set_status('bar')
256
+ ctrl.update(10)
257
+ ctrl.refresh()
258
+ self.assertEqual(
259
+ string_io.getvalue(),
260
+ '\x1b[1m\x1b[31mfoo\x1b[0m: \x1b[34m10% (10/100)\x1b[0m : bar\n'
261
+ )
262
+ concurrent.progress_bar = 'tqdm'
263
+
264
+ def test_tqdm(self):
265
+ concurrent.progress_bar = 'tqdm'
266
+ string_io = io.StringIO()
267
+ with contextlib.redirect_stderr(string_io):
268
+ ctrl = concurrent._progress_control(100, 'foo', 'blue', None)
269
+ self.assertIsInstance(ctrl, concurrent._TqdmProgressControl)
270
+ ctrl.update(10)
271
+ ctrl.refresh()
272
+ self.assertIn('10/100', string_io.getvalue())
273
+
274
+ tqdm = concurrent.tqdm
275
+ concurrent.tqdm = None
276
+ with self.assertRaisesRegex(RuntimeError, 'install package "tqdm"'):
277
+ _ = concurrent._progress_control(100, 'foo', 'blue', None)
278
+ concurrent.tqdm = tqdm
279
+
280
+ def test_unsupported(self):
281
+ concurrent.progress_bar = 'unknown'
282
+ with self.assertRaisesRegex(ValueError, 'Unsupported progress bar type'):
283
+ _ = concurrent._progress_control(100, 'foo', 'blue', None)
284
+ concurrent.progress_bar = 'tqdm'
285
+
286
+
236
287
  class ProgressBarTest(unittest.TestCase):
237
288
 
238
289
  def test_multithread_support(self):
@@ -241,13 +292,12 @@ class ProgressBarTest(unittest.TestCase):
241
292
  bar_id = concurrent.ProgressBar.install(None, 5)
242
293
  def fun(x):
243
294
  del x
244
- concurrent.ProgressBar.update(bar_id, 1, postfix=None)
295
+ concurrent.ProgressBar.update(bar_id, 1, status=None)
245
296
 
246
297
  for _ in concurrent.concurrent_execute(fun, range(5)):
247
298
  concurrent.ProgressBar.refresh()
248
299
  concurrent.ProgressBar.uninstall(bar_id)
249
300
  output_str = string_io.getvalue()
250
- print(output_str)
251
301
  self.assertIn('100%', output_str)
252
302
  self.assertIn('5/5', output_str)
253
303
 
@@ -255,12 +305,12 @@ class ProgressBarTest(unittest.TestCase):
255
305
  string_io = io.StringIO()
256
306
  with contextlib.redirect_stderr(string_io):
257
307
  bar_id = concurrent.ProgressBar.install(None, 4)
258
- concurrent.ProgressBar.update(bar_id, 1, postfix=None)
259
- concurrent.ProgressBar.update(bar_id, 1, postfix='hello')
260
- concurrent.ProgressBar.update(bar_id, color='lightgreen')
261
- concurrent.ProgressBar.update(bar_id, 2, postfix=dict(x=1))
262
- with self.assertRaisesRegex(ValueError, 'Unsupported postfix'):
263
- concurrent.ProgressBar.update(bar_id, 0, postfix=1)
308
+ concurrent.ProgressBar.update(bar_id, 1, status=None)
309
+ concurrent.ProgressBar.update(bar_id, 1, status='hello')
310
+ concurrent.ProgressBar.update(bar_id, color='green')
311
+ concurrent.ProgressBar.update(bar_id, 2, status=dict(x=1))
312
+ with self.assertRaisesRegex(ValueError, 'Unsupported status'):
313
+ concurrent.ProgressBar.update(bar_id, 0, status=1)
264
314
  concurrent.ProgressBar.uninstall(bar_id)
265
315
  self.assertIn('1/4', string_io.getvalue())
266
316
  self.assertIn('2/4', string_io.getvalue())
langfun/core/eval/base.py CHANGED
@@ -242,7 +242,7 @@ class Evaluable(lf.Component):
242
242
  ):
243
243
  if show_progress:
244
244
  lf.concurrent.ProgressBar.update(
245
- progress_bar, postfix='LOADING SAVED RESULTS...', color='yellow'
245
+ progress_bar, status='LOADING SAVED RESULTS...', color='yellow'
246
246
  )
247
247
  if self.try_load_result():
248
248
  run_status = 'CACHED'
@@ -271,7 +271,7 @@ class Evaluable(lf.Component):
271
271
  if should_save:
272
272
  if show_progress:
273
273
  lf.concurrent.ProgressBar.update(
274
- progress_bar, postfix='SAVING RESULTS...', color='yellow'
274
+ progress_bar, status='SAVING RESULTS...', color='yellow'
275
275
  )
276
276
 
277
277
  # Save evaluation results.
@@ -284,7 +284,7 @@ class Evaluable(lf.Component):
284
284
  if show_progress:
285
285
  lf.concurrent.ProgressBar.update(
286
286
  progress_bar,
287
- postfix=self._completion_status(run_status),
287
+ status=self._completion_status(run_status),
288
288
  color='green',
289
289
  )
290
290
  else:
@@ -340,7 +340,7 @@ class Evaluable(lf.Component):
340
340
  f'[#{leaf.index} - {leaf.node.id}]',
341
341
  total=leaf.node.num_examples if leaf.enabled else 0,
342
342
  color='cyan' if leaf.enabled else 'yellow',
343
- postfix=None if leaf.enabled else 'SKIPPED.')
343
+ status=None if leaf.enabled else 'SKIPPED.')
344
344
 
345
345
  # Run leaf groups in parallel.
346
346
  try:
@@ -354,7 +354,7 @@ class Evaluable(lf.Component):
354
354
  # Save results for non-leaf nodes.
355
355
  lf.concurrent.ProgressBar.update(
356
356
  overview_bar,
357
- postfix='SAVING RESULTS...',
357
+ status='SAVING RESULTS...',
358
358
  color='yellow')
359
359
 
360
360
  for node in self.nonleaf_nodes:
@@ -364,7 +364,7 @@ class Evaluable(lf.Component):
364
364
 
365
365
  if should_save and summary:
366
366
  lf.concurrent.ProgressBar.update(
367
- overview_bar, postfix='FINALIZING SUMMARY...'
367
+ overview_bar, status='FINALIZING SUMMARY...'
368
368
  )
369
369
 
370
370
  summary.save(os.path.join(self.root_dir, Evaluable.SUMMARY_HTML))
@@ -378,7 +378,7 @@ class Evaluable(lf.Component):
378
378
  # Signal all task completed by making the bar green.
379
379
  lf.concurrent.ProgressBar.update(
380
380
  overview_bar,
381
- postfix='COMPLETED',
381
+ status='COMPLETED',
382
382
  color='green')
383
383
 
384
384
  finally:
@@ -16,7 +16,11 @@
16
16
  import io
17
17
  import re
18
18
  from typing import Any
19
- import termcolor
19
+
20
+ try:
21
+ import termcolor # pylint: disable=g-import-not-at-top
22
+ except ImportError:
23
+ termcolor = None
20
24
 
21
25
 
22
26
  # Regular expression for ANSI color characters.
@@ -49,6 +53,8 @@ def colored(
49
53
  Returns:
50
54
  A string with ANSI color characters embracing the entire text.
51
55
  """
56
+ if not termcolor:
57
+ return text
52
58
  return termcolor.colored(
53
59
  text,
54
60
  color=color,
@@ -42,6 +42,24 @@ class TextFormattingTest(unittest.TestCase):
42
42
  )
43
43
  self.assertEqual(text_formatting.decolored(colored_text), original_text)
44
44
 
45
+ def test_colored_without_termcolor(self):
46
+ termcolor = text_formatting.termcolor
47
+ text_formatting.termcolor = None
48
+ original_text = inspect.cleandoc("""
49
+ Hi {{ foo }}
50
+ {# print x if x is present #}
51
+ {% if x %}
52
+ {{ x }}
53
+ {% endif %}
54
+ """)
55
+
56
+ colored_text = text_formatting.colored_template(
57
+ text_formatting.colored(original_text, color='blue')
58
+ )
59
+ self.assertEqual(colored_text, original_text)
60
+ self.assertEqual(text_formatting.decolored(colored_text), original_text)
61
+ text_formatting.termcolor = termcolor
62
+
45
63
 
46
64
  if __name__ == '__main__':
47
65
  unittest.main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langfun
3
- Version: 0.1.1.dev20240827
3
+ Version: 0.1.1.dev20240828
4
4
  Summary: Langfun: Language as Functions.
5
5
  Home-page: https://github.com/google/langfun
6
6
  Author: Langfun Authors
@@ -2,8 +2,8 @@ langfun/__init__.py,sha256=ZqERg4fvvtFwr5L41Lfev9FSuCBm8PbQrZmcKvvloxE,2274
2
2
  langfun/core/__init__.py,sha256=r86kuy-BiJIveqnXx5OklUUXtMG3q79nWRBum6zFOCQ,4835
3
3
  langfun/core/component.py,sha256=Icyoj9ICoJoK2r2PHbrFXbxnseOr9QZZOvKWklLWNo8,10276
4
4
  langfun/core/component_test.py,sha256=q15Xn51cVTu2RKxZ9U5VQgT3bm6RQ4638bKhWBtvW5o,8220
5
- langfun/core/concurrent.py,sha256=TRc49pJ3HQro2kb5FtcWkHjhBm8UcgE8RJybU5cU3-0,24537
6
- langfun/core/concurrent_test.py,sha256=9HWnS4ja5Ji1ALfJs2zIt7w4w0oNm9dOZM7bgzoX5ag,15176
5
+ langfun/core/concurrent.py,sha256=qZteOkA7jzLt7a5AVmNqDc5ZEvj_hwiLECqGMVYdzSU,27756
6
+ langfun/core/concurrent_test.py,sha256=ULVrE6JGzsClRBLHAlqLF1A2mfxMO2X0245qYTYQ76o,16943
7
7
  langfun/core/console.py,sha256=bk5rNPNm9rMGW5YT2HixxU04p2umnoabn5SDz6Dqe88,2317
8
8
  langfun/core/console_test.py,sha256=5SYJdxpJGLgdSSQqqMPoA1X6jpsLD8rgcyk-EgI65oE,1077
9
9
  langfun/core/langfunc.py,sha256=G50YgoVZ0y1GFw2ev41MlOqr6qa8YakbvNC0h_E0PiA,11140
@@ -27,8 +27,8 @@ langfun/core/subscription.py,sha256=euawEuSZP-BHydaT-AQpfYFL0m5pWPGcW0upFhrojqc,
27
27
  langfun/core/subscription_test.py,sha256=Y4ZdbZEwm83YNZBxHff0QR4QUa4rdaNXA3_jfIcArBo,8717
28
28
  langfun/core/template.py,sha256=UhNNGUDJ4StUhPBKzHmjym36khxHOGWGr9MDxBwgxQA,22284
29
29
  langfun/core/template_test.py,sha256=cb005qM_3dvJikaPDB3rirfIrMAIIVRpoiXGREGJ43o,15468
30
- langfun/core/text_formatting.py,sha256=ytjj7opnRJ6w-pkglL2CZUyfYDXLpNf65E42LBb31gc,5158
31
- langfun/core/text_formatting_test.py,sha256=nyKC6tn2L4hPJiqQHgxcbQsJJi4A4Nbj8FiO8iT6B80,1514
30
+ langfun/core/text_formatting.py,sha256=d7t9vaY6aCn1dkfkikpNYnBy5E_i93vHbfyDWFclGZU,5284
31
+ langfun/core/text_formatting_test.py,sha256=ck0Xzdd4YF4CtCUj7VE0GybfbAyKQ8p3xkM1FBGrqIk,2096
32
32
  langfun/core/coding/__init__.py,sha256=5utju_fwEsImaiftx4oXKl9FAM8p281k8-Esdh_-m1w,835
33
33
  langfun/core/coding/python/__init__.py,sha256=MJ-vubliz-ebrZH3OBRKBwMi0S9-FrhGCp8YQLR6_I4,1776
34
34
  langfun/core/coding/python/correction.py,sha256=a2aFUt9ocbXTCR6Z6OGNjQZDI1LfU0PBkSe7hJB8dEM,6589
@@ -44,7 +44,7 @@ langfun/core/coding/python/parsing_test.py,sha256=9vAWF484kWIm6JZq8NFiMgKUDhXV-d
44
44
  langfun/core/coding/python/permissions.py,sha256=1QWGHvzL8MM0Ok_auQ9tURqZHtdOfJaDpBzZ29GUE-c,2544
45
45
  langfun/core/coding/python/permissions_test.py,sha256=w5EDb8QxpxgJyZkojyzVWQvDfg366zn99-g__6TbPQ0,2699
46
46
  langfun/core/eval/__init__.py,sha256=Ogdr9OtTywhhLPHi3AZzOD2mXX2oyaHWflrSTMm96uA,1899
47
- langfun/core/eval/base.py,sha256=yuKIJzelGyhWrNaAS9ziioSwwhn2LgoK4Z6eZahRLtU,74758
47
+ langfun/core/eval/base.py,sha256=YU_R9pKITKWyWa5-dSY8Q5O9pK8xioWX1ZdqYVOZcK8,74751
48
48
  langfun/core/eval/base_test.py,sha256=VEraWaRybSxOCOcZrZouNkiroDEPR6uyFBJoAz-1pQg,26930
49
49
  langfun/core/eval/matching.py,sha256=9GX8HfO9jKxgNLAivgy5K88Xhoh6Z7Pptq65pe7vht8,9762
50
50
  langfun/core/eval/matching_test.py,sha256=f7iVyXH5KGJBWt4Wp14Bt9J3X59A6Ayfog9MbuFvPew,5532
@@ -119,8 +119,8 @@ langfun/core/templates/demonstration.py,sha256=vCrgYubdZM5Umqcgp8NUVGXgr4P_c-fik
119
119
  langfun/core/templates/demonstration_test.py,sha256=SafcDQ0WgI7pw05EmPI2S4v1t3ABKzup8jReCljHeK4,2162
120
120
  langfun/core/templates/selfplay.py,sha256=yhgrJbiYwq47TgzThmHrDQTF4nDrTI09CWGhuQPNv-s,2273
121
121
  langfun/core/templates/selfplay_test.py,sha256=rBW2Qr8yi-aWYwoTwRR-n1peKyMX9QXPZXURjLgoiRs,2264
122
- langfun-0.1.1.dev20240827.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
123
- langfun-0.1.1.dev20240827.dist-info/METADATA,sha256=O4CZgKKxbwRK492QWVfyTGmU1RnRBLyWs12Uo9F8ldM,5234
124
- langfun-0.1.1.dev20240827.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
125
- langfun-0.1.1.dev20240827.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
126
- langfun-0.1.1.dev20240827.dist-info/RECORD,,
122
+ langfun-0.1.1.dev20240828.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
123
+ langfun-0.1.1.dev20240828.dist-info/METADATA,sha256=zPpmQkxNgUcb7ilrk9JmSBVnq_ISkkujk3bPQ2nPKDQ,5234
124
+ langfun-0.1.1.dev20240828.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
125
+ langfun-0.1.1.dev20240828.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
126
+ langfun-0.1.1.dev20240828.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (73.0.1)
2
+ Generator: setuptools (74.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5