BrainLoader.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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("jarvis")
  13. class BrainLoader(YAMLLoader):
  14. def __init__(self, filepath=None):
  15. self.brain_file_path = filepath
  16. if filepath is None:
  17. self.brain_file_path = self._get_root_brain_path()
  18. # self.filePath = "../../" + self.fileName
  19. YAMLLoader.__init__(self, self.brain_file_path)
  20. def get_config(self):
  21. return YAMLLoader.get_config(self)
  22. def get_brain(self):
  23. """
  24. return a brain object from YAML settings
  25. :return: Brain object
  26. :rtype: Brain
  27. """
  28. # get the brain with dict
  29. dict_brain = self.get_config()
  30. # create a new brain
  31. brain = Brain()
  32. # create list of Synapse
  33. synapses = list()
  34. for synapes_dict in dict_brain:
  35. # print synapses_dict
  36. if ConfigurationChecker().check_synape_dict(synapes_dict):
  37. # print "synapses_dict ok"
  38. name = synapes_dict["name"]
  39. neurons = self._get_neurons(synapes_dict["neurons"])
  40. signals = self._get_signals(synapes_dict["signals"])
  41. new_synapse = Synapse(name=name, neurons=neurons, signals=signals)
  42. synapses.append(new_synapse)
  43. brain.synapes = synapses
  44. brain.brain_file = self.brain_file_path
  45. # check that no synapse have the same name than another
  46. if ConfigurationChecker().check_synapes(synapses):
  47. return brain
  48. return None
  49. @staticmethod
  50. def _get_neurons(neurons_dict):
  51. """
  52. Get a list of Neuron object from a neuron dict
  53. :param neurons_dict:
  54. :return:
  55. """
  56. neurons = list()
  57. for neuron_dict in neurons_dict:
  58. if isinstance(neuron_dict, dict):
  59. if ConfigurationChecker().check_neuron_dict(neuron_dict):
  60. # print "Neurons dict ok"
  61. for neuron_name in neuron_dict:
  62. name = neuron_name
  63. parameters = neuron_dict[name]
  64. # print parameters
  65. new_neuron = Neuron(name=name, parameters=parameters)
  66. neurons.append(new_neuron)
  67. else:
  68. # the neuron does not have parameter
  69. if ConfigurationChecker().check_neuron_dict(neuron_dict):
  70. new_neuron = Neuron(name=neuron_dict)
  71. neurons.append(new_neuron)
  72. return neurons
  73. def _get_signals(self, signals_dict):
  74. # print signals_dict
  75. signals = list()
  76. for signal_dict in signals_dict:
  77. if ConfigurationChecker().check_signal_dict(signal_dict):
  78. # print "Signals dict ok"
  79. event_or_order = self._get_event_or_order_from_dict(signal_dict)
  80. signals.append(event_or_order)
  81. return signals
  82. @staticmethod
  83. def _get_event_or_order_from_dict(signal_or_event_dict):
  84. if 'event' in signal_or_event_dict:
  85. # print "is event"
  86. event = signal_or_event_dict["event"]
  87. if ConfigurationChecker.check_event_dict(event):
  88. return Event(period=event)
  89. if 'order' in signal_or_event_dict:
  90. order = signal_or_event_dict["order"]
  91. if ConfigurationChecker.check_order_dict(order):
  92. return Order(sentence=order)
  93. @staticmethod
  94. def _get_root_brain_path():
  95. """
  96. Return the full path of the default brain file
  97. :return:
  98. """
  99. # get current script directory path. We are in /an/unknown/path/jarvis/core/ConfigurationManager
  100. cur_script_directory = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
  101. # get parent dir. Now we are in /an/unknown/path/jarvis
  102. parent_dir = os.path.normpath(cur_script_directory + os.sep + os.pardir + os.sep + os.pardir)
  103. brain_path = parent_dir + os.sep + "brain.yml"
  104. logger.debug("Real brain.yml path: %s" % brain_path)
  105. if os.path.isfile(brain_path):
  106. return brain_path
  107. raise IOError("Default brain.yml file not found")