network.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. ## Fichier : network.py
  2. # Auteur : Jovian Hersemeule
  3. # Gère l'arbre des neurones pour le cerveau.
  4. class Network :
  5. def __init__( self ): # Jovian 17 janvier 2017
  6. """
  7. Créé un réseau vide. Le graphe est implémenté par liste d'adjacence.
  8. La sortie est indexée 0.
  9. Les entrées sont indexées de 1 à inSize.
  10. Les intermédiaires sont indexés de inSize + 1 à total de neurones.
  11. """
  12. self.tree = None # string list list
  13. self.poids = None # matrice de poids[de][vers]
  14. self.total = 1 # int
  15. self.nb_in = 0
  16. self.nb_aux = 0
  17. self.nb_out = 1
  18. def in_node_to_num( self, node ): # Jovian 7 mars 2017
  19. """
  20. Convertit un identidiant de noeud ( par exemple s0 ou i42 ) en indice de tableau.
  21. Les entrées occupent [0 : nb_in ]
  22. Les intermédiaires occupent [ nb_in : nb_in + nb_aux ]
  23. """
  24. # Décryptage du noeud
  25. sort = node[0]
  26. num = int( node[1:] )
  27. # Détection d'une requête sans sens
  28. if sort == 's' :
  29. print( "Appel de in_node_to_num impertinent sur un neurone de sortie." )
  30. print( "Exécuté sur ", node )
  31. return -1
  32. # Décalage dû aux types
  33. if sort == "i" :
  34. num += self.nb_in
  35. # Fin
  36. return num
  37. def out_node_to_num( self, node ): # Jovian 7 mars 2017
  38. """
  39. Convertit un identidiant de noeud ( par exemple s0 ou i42 ) en indice de tableau.
  40. Les intermédiaires occupent [0 : nb_aux ]
  41. Les sorties occupent [ nb_aux : nb_aux + nb_out ]
  42. """
  43. # Décryptage du noeud
  44. sort = node[0]
  45. num = int( node[1:] )
  46. # Détection d'une requête sans sens
  47. if sort == 'e' :
  48. print( "Appel de out_node_to_num impertinent sur un neurone d'entrée." )
  49. print( "Exécuté sur ", node )
  50. return -1
  51. # Décalage dû aux types
  52. elif sort == "s" :
  53. num += self.nb_aux
  54. # Fin
  55. return num
  56. def build( self, liste_synapses, liste_poids, nb_in, nb_aux, nb_out = 1, debug = False ): # Jovian 7 mars 2017
  57. """
  58. Construit le réseau à partir d'une liste de synapses.
  59. Argument liste_synapses : Couple string list, liste de synapses.
  60. Argument liste_poids : liste des poids respectifs des synapses.
  61. Argument nb_in : entier nombre d'entrées.
  62. Argument nb_int : entier nombre d'intermédiaires.
  63. Argument nb_out : entier nombre de sortie(s).
  64. """
  65. # Annonce
  66. if debug : print("\n> Début de la procédure de construction du network.")
  67. # Ecrasement possible
  68. if self.total > 1 :
  69. if debug : print( "\n> Network déjà existant : écrasement." )
  70. self.tree = None
  71. self.poids = None
  72. self.total = 1
  73. self.nb_in = nb_in
  74. self.nb_aux = nb_aux
  75. self.nb_out = nb_out
  76. # Initialisation des attributs
  77. self.tree = [[] for k in range( nb_out + nb_aux ) ]
  78. self.poids = [ [ 0 for j in range( nb_aux + nb_out ) ] for i in range( nb_in + nb_aux ) ]
  79. # Balayage
  80. nb_synapses = len( liste_synapses )
  81. for k in range( nb_synapses ):
  82. # Déconstruction du synapse
  83. node_start = liste_synapses[k][0]
  84. node_end = liste_synapses[k][1]
  85. if debug :
  86. print( "> ", liste_synapses[k] )
  87. print("Traitement synapse de ", node_start, " à ", node_end )
  88. # Ajout dans l'arbre
  89. id_end = self.out_node_to_num( node_end )
  90. self.tree[id_end].append( node_start )
  91. # Ajout dans la matrice
  92. id_start = self.in_node_to_num( node_start )
  93. self.poids[ id_start ][ id_end ] = liste_poids[k]
  94. # Fin
  95. if debug :
  96. print( len( self.poids ) * len( self.poids[0] ), " cases dans la matrice poids." )
  97. print( nb_synapses, " poids enregistrés dans la matrice." )
  98. #print( "Matrice de poids :" )
  99. #for syn in self.poids :
  100. #print( syn )
  101. print( "\nListe des parents :" )
  102. for c in enumerate(self.tree) :
  103. # Tuple
  104. nb, parents = c
  105. # Annonce de la classe
  106. if nb == 0 :
  107. print("| Les parents des intermédiaires")
  108. elif nb == nb_aux :
  109. print("\n| Les parents des sorties")
  110. # Affichage parents
  111. print( parents )
  112. print("\n> Fin de la procédure de construction du network.\n")
  113. def getParents( self, index ): # Jovian 7 mars 2017
  114. """
  115. Retourne liste identifiants des parents.
  116. Argument index : noeud dont on veut connaître les parents.
  117. """
  118. identifiant = self.out_node_to_num( index )
  119. if identifiant == -1 :
  120. return []
  121. else :
  122. return self.tree[ identifiant ]
  123. def getPoids( self, nodeA, nodeB ): # Jovian 7 mars 2017
  124. """
  125. Retourne le poids du noeud A au noeud B.
  126. Argument nodeA : noeud A.
  127. Argument nodeB : noeud B.
  128. """
  129. identifiantA = self.in_node_to_num( nodeA )
  130. identifiantB = self.out_node_to_num( nodeB )
  131. return self.poids[ identifiantA ][ identifiantB ]