BrainLoader.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import inspect
  2. import logging
  3. import os
  4. from YAMLLoader import YAMLLoader
  5. from core.ConfigurationManager.ConfigurationChecker import ConfigurationChecker
  6. from core.Models.Brain import Brain
  7. from core.Models.Event import Event
  8. from core.Models.Neuron import Neuron
  9. from core.Models.Order import Order
  10. from core.Models.Synapse import Synapse
  11. logging.basicConfig()
  12. logger = logging.getLogger("kalliope")
  13. class BrainLoader(object):
  14. """
  15. This Class is used to get the brain YAML and the Brain as an object
  16. """
  17. def __init__(self):
  18. pass
  19. @classmethod
  20. def get_yaml_config(cls, file_path=None):
  21. """
  22. Class Methods which loads default or the provided YAML file and return it as a String
  23. :param file_path: the brain file path to load
  24. :type file_path: String
  25. :return: The loaded brain YAML
  26. :rtype: String
  27. :Example:
  28. brain_yaml = BrainLoader.get_yaml_config(/var/tmp/brain.yml)
  29. .. warnings:: Class Method
  30. """
  31. if file_path is None:
  32. brain_file_path = cls._get_root_brain_path()
  33. else:
  34. brain_file_path = file_path
  35. return YAMLLoader.get_config(brain_file_path)
  36. @classmethod
  37. def get_brain(cls, file_path=None):
  38. """
  39. Class Methods which loads default or the provided YAML file and return a Brain
  40. :param file_path: the brain file path to load
  41. :type file_path: String
  42. :return: The loaded Brain
  43. :rtype: Brain
  44. :Example:
  45. brain = BrainLoader.get_brain(file_path="/var/tmp/brain.yml")
  46. .. seealso:: Brain
  47. .. warnings:: Class Method
  48. """
  49. # Instantiate a brain
  50. brain = Brain.Instance()
  51. logger.debug("Is brain already loaded ? %r" % brain.is_loaded)
  52. if brain.is_loaded is False:
  53. # get the brain with dict
  54. dict_brain = cls.get_yaml_config(file_path)
  55. brain.brain_yaml = dict_brain
  56. # create list of Synapse
  57. synapses = list()
  58. for synapses_dict in dict_brain:
  59. if "includes" not in synapses_dict: # we don't need to check includes as it's not a synapse
  60. if ConfigurationChecker().check_synape_dict(synapses_dict):
  61. # print "synapses_dict ok"
  62. name = synapses_dict["name"]
  63. neurons = cls._get_neurons(synapses_dict["neurons"])
  64. signals = cls._get_signals(synapses_dict["signals"])
  65. new_synapse = Synapse(name=name, neurons=neurons, signals=signals)
  66. synapses.append(new_synapse)
  67. brain.synapses = synapses
  68. if file_path is None:
  69. brain.brain_file = cls._get_root_brain_path()
  70. else:
  71. brain.brain_file = file_path
  72. # check that no synapse have the same name than another
  73. if not ConfigurationChecker().check_synapes(synapses):
  74. brain = None
  75. # The Brain Singleton is loaded
  76. brain.is_loaded = True
  77. return brain
  78. @staticmethod
  79. def _get_neurons(neurons_dict):
  80. """
  81. Get a list of Neuron object from a neuron dict
  82. :param neurons_dict: Neuron name or dictionary of Neuron_name/Neuron_parameters
  83. :type neurons_dict: String or dict
  84. :return: A list of Neurons
  85. :rtype: List
  86. :Example:
  87. neurons = cls._get_neurons(synapses_dict["neurons"])
  88. .. seealso:: Neuron
  89. .. warnings:: Static and Private
  90. """
  91. neurons = list()
  92. for neuron_dict in neurons_dict:
  93. if isinstance(neuron_dict, dict):
  94. if ConfigurationChecker().check_neuron_dict(neuron_dict):
  95. # print "Neurons dict ok"
  96. for neuron_name in neuron_dict:
  97. name = neuron_name
  98. parameters = neuron_dict[name]
  99. # print parameters
  100. new_neuron = Neuron(name=name, parameters=parameters)
  101. neurons.append(new_neuron)
  102. else:
  103. # the neuron does not have parameter
  104. if ConfigurationChecker().check_neuron_dict(neuron_dict):
  105. new_neuron = Neuron(name=neuron_dict)
  106. neurons.append(new_neuron)
  107. return neurons
  108. @classmethod
  109. def _get_signals(cls, signals_dict):
  110. """
  111. Get a list of Signal object from a signals dict
  112. :param signals_dict: Signal name or dictionary of Signal_name/Signal_parameters
  113. :type signals_dict: String or dict
  114. :return: A list of Event and/or Order
  115. :rtype: List
  116. :Example:
  117. signals = cls._get_signals(synapses_dict["signals"])
  118. .. seealso:: Event, Order
  119. .. warnings:: Class method and Private
  120. """
  121. # print signals_dict
  122. signals = list()
  123. for signal_dict in signals_dict:
  124. if ConfigurationChecker().check_signal_dict(signal_dict):
  125. # print "Signals dict ok"
  126. event_or_order = cls._get_event_or_order_from_dict(signal_dict)
  127. signals.append(event_or_order)
  128. return signals
  129. @staticmethod
  130. def _get_event_or_order_from_dict(signal_or_event_dict):
  131. """
  132. The signal is either an Event or an Order
  133. :param signal_or_event_dict: A dict of event or signal
  134. :type signal_or_event_dict: dict
  135. :return: The object corresponding to An Order or an Event
  136. :rtype: An Order or an Event
  137. :Example:
  138. event_or_order = cls._get_event_or_order_from_dict(signal_dict)
  139. .. seealso:: Event, Order
  140. .. warnings:: Static method and Private
  141. """
  142. if 'event' in signal_or_event_dict:
  143. # print "is event"
  144. event = signal_or_event_dict["event"]
  145. if ConfigurationChecker.check_event_dict(event):
  146. return Event(period=event)
  147. if 'order' in signal_or_event_dict:
  148. order = signal_or_event_dict["order"]
  149. if ConfigurationChecker.check_order_dict(order):
  150. return Order(sentence=order)
  151. @staticmethod
  152. def _get_root_brain_path():
  153. """
  154. Return the full path of the default brain file
  155. :Example:
  156. brain.brain_file = cls._get_root_brain_path()
  157. .. raises:: IOError
  158. .. warnings:: Static method and Private
  159. """
  160. # get current script directory path. We are in /an/unknown/path/kalliope/core/ConfigurationManager
  161. cur_script_directory = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
  162. # get parent dir. Now we are in /an/unknown/path/kalliope
  163. parent_dir = os.path.normpath(cur_script_directory + os.sep + os.pardir + os.sep + os.pardir)
  164. brain_path = parent_dir + os.sep + "brain.yml"
  165. logger.debug("Real brain.yml path: %s" % brain_path)
  166. if os.path.isfile(brain_path):
  167. return brain_path
  168. raise IOError("Default brain.yml file not found")