You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

plog.py 4.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # coding: utf-8
  2. # ================================================================#
  3. # Copyright (C) 2020 Freecss All rights reserved.
  4. #
  5. # File Name :plog.py
  6. # Author :freecss
  7. # Email :karlfreecss@gmail.com
  8. # Created Date :2020/10/23
  9. # Description :
  10. #
  11. # ================================================================#
  12. import time
  13. import logging
  14. import pickle as pk
  15. import os
  16. import functools
  17. global recorder
  18. recorder = None
  19. class ResultRecorder:
  20. def __init__(self):
  21. logging.basicConfig(level=logging.DEBUG, filemode="a")
  22. self.result = {}
  23. self.set_savefile()
  24. logging.info("===========================================================")
  25. logging.info("============= Result Recorder Version: 0.03 ===============")
  26. logging.info("===========================================================\n")
  27. pass
  28. def set_savefile(self):
  29. local_time = time.strftime("%Y%m%d_%H_%M_%S", time.localtime())
  30. save_dir = os.path.join("results", local_time)
  31. if not os.path.exists(save_dir):
  32. os.makedirs(save_dir)
  33. save_file_path = os.path.join(save_dir, "result.pk")
  34. save_file = open(save_file_path, "wb")
  35. self.save_dir = save_dir
  36. self.save_file = save_file
  37. filename = os.path.join(save_dir, "log.txt")
  38. file_handler = logging.FileHandler(filename)
  39. file_handler.setLevel(logging.DEBUG)
  40. formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")
  41. file_handler.setFormatter(formatter)
  42. logging.getLogger().addHandler(file_handler)
  43. def print(self, *argv, screen=False):
  44. info = ""
  45. for data in argv:
  46. info += str(data)
  47. if screen:
  48. print(info)
  49. logging.info(info)
  50. def print_result(self, *argv):
  51. for data in argv:
  52. info = "#Result# %s" % str(data)
  53. logging.info(info)
  54. def store(self, *argv):
  55. for data in argv:
  56. if data.find(":") < 0:
  57. continue
  58. label, data = data.split(":")
  59. self.store_kv(label, data)
  60. def write_result(self, *argv):
  61. self.print_result(*argv)
  62. self.store(*argv)
  63. def store_kv(self, label, data):
  64. self.result.setdefault(label, [])
  65. self.result[label].append(data)
  66. def write_kv(self, label, data):
  67. self.print_result({label: data})
  68. # self.print_result(label + ":" + str(data))
  69. self.store_kv(label, data)
  70. def dump(self, save_file=None):
  71. if save_file is None:
  72. save_file = self.save_file
  73. pk.dump(self.result, save_file)
  74. def clock(self, func):
  75. @functools.wraps(func)
  76. def clocked(*args, **kwargs):
  77. t0 = time.perf_counter()
  78. result = func(*args, **kwargs)
  79. elapsed = time.perf_counter() - t0
  80. name = func.__name__
  81. # arg_str = ','.join(repr(arg) for arg in args)
  82. # context = f"{name}: ({arg_str})=>({result}), cost {elapsed}s"
  83. context = f"{name}: cost {elapsed}s"
  84. self.write_kv("func:", context)
  85. return result
  86. return clocked
  87. def __del__(self):
  88. self.dump()
  89. def clocker(*argv):
  90. global recorder
  91. if recorder is None:
  92. recorder = ResultRecorder()
  93. return recorder.clock(*argv)
  94. def INFO(*argv, screen=False):
  95. global recorder
  96. if recorder is None:
  97. recorder = ResultRecorder()
  98. return recorder.print(*argv, screen=screen)
  99. def DEBUG(*argv, screen=False):
  100. global recorder
  101. if recorder is None:
  102. recorder = ResultRecorder()
  103. return recorder.print(*argv, screen=screen)
  104. def logger():
  105. global recorder
  106. if recorder is None:
  107. recorder = ResultRecorder()
  108. return recorder
  109. if __name__ == "__main__":
  110. recorder = ResultRecorder()
  111. recorder.write_kv("test", 1)
  112. recorder.set_savefile(pk_dir="haha")
  113. recorder.write_kv("test", 1)

An efficient Python toolkit for Abductive Learning (ABL), a novel paradigm that integrates machine learning and logical reasoning in a unified framework.