[Ada/Modélisation] Modélisation d'un cerveau bicéphale.

Modélisation d'un cerveau bicéphale. [Ada/Modélisation] - Ada - Programmation

Marsh Posté le 27-03-2010 à 09:40:03    

Bonjour à tous et à chacun.
 
Je tente une nouvelle approche de modélisation de l'intelligence artificielle avec une architecture bicéphale.
Toute vos remarque et critique son les bien venu.
 
Je ne sais plus très bien ou j'en suis, c'est pourquoi je poste ici, f.h.fr est la clef de ma réussite.  [:talen]  

Code :
  1. with Ada.Characters.Handling;
  2. with Ada.Characters.Latin_1;            use Ada.Characters;
  3. with Ada.Wide_Text_Io;                  use Ada.Wide_Text_Io;
  4.  
  5. package body Prophet.Neural_Network is
  6.  
  7.   type T_Node;
  8.   type Node_Access is access T_Node;
  9.   type T_Connector is
  10.     record
  11.        Left, Right : Node_Access;
  12.     end record;
  13.   type Connector_Access is access T_Connector;
  14.  
  15.   type T_Get_Handler is access
  16.     procedure (Input  : out Wide_String; Last : out Natural);
  17.   type T_Put_Handler is access
  18.     procedure (Output : in Wide_String);
  19.  
  20.   type T_Mode is (In_Put, Out_Put);
  21.  
  22.   type T_Action(Mode : T_Mode) is
  23.      record
  24.         Register : Wide_String(1..4096);
  25.         Length   : Natural := 0;
  26.         case Mode is
  27.            when In_Put =>
  28.               Get_Action : T_Get_Handler;
  29.            when Out_Put =>
  30.               Put_Action : T_Put_Handler;
  31.         end case;
  32.      end record;
  33.   type Action_Access is access T_Action;
  34.   type T_Action_Handler is access procedure (Action : in out Action_Access);
  35.  
  36.   procedure Action (Action : in out Action_Access);
  37.  
  38.   subtype T_Key is Integer range -131071..131071;
  39.   type T_Node is
  40.      record
  41.         Action : Action_Access;
  42.         Key : T_Key := 0;
  43.         run : T_Action_Handler;
  44.         Connector : Connector_Access;
  45.      end record;
  46.  
  47.  
  48.   task Life_Cycle is
  49.      entry Ctrl_C;
  50.   private
  51.      entry Switch(Node : in Node_Access);
  52.   end Life_Cycle;
  53.  
  54.   procedure Ctrl_C is
  55.      Ctrl_C_Message : constant Wide_String :=
  56.        Handling.To_Wide_String(Latin_1.Cr & " Interruption, please wait!" );
  57.   begin
  58.  
  59.      Put_Line(Ctrl_C_Message);
  60.      Life_Cycle.Ctrl_C;
  61.   end Ctrl_C;
  62.  
  63.  
  64.   procedure Put_line(Output : in Wide_String);
  65.   procedure Get_line(Input  : out Wide_String; Last : out Natural);
  66.  
  67.   Input : Action_Access :=
  68.     new T_Action' (Register => (others => Wide_Character'Val(0)),
  69.                    Length => 0,
  70.                    Mode => In_Put,
  71.                    Get_Action => Prophet.Neural_Network.Get_Line'Access);
  72.  
  73.   output : Action_Access :=
  74.     new T_Action' (Register => (others => Wide_Character'Val(0)),
  75.                    Length => 0,
  76.                    Mode => Out_Put,
  77.                    Put_Action => Prophet.Neural_Network.put_Line'Access);
  78.  
  79.   task body Life_Cycle is
  80.  
  81.      task type T_Cortex is
  82.         entry Initialize(Root : in Node_Access; Env : in Node_access);
  83.         entry Reset;
  84.      end T_Cortex;
  85.  
  86.      task body T_Cortex is
  87.  
  88.         Root, Env, Current_Node : Node_Access;
  89.  
  90.         function Next_Key(Key : in Integer) return Integer is
  91.         begin
  92.  
  93.            return Root.Key * (abs(Key) + 1);
  94.         end Next_Key;
  95.  
  96.  
  97.      begin
  98.         accept Initialize(Root : in Node_Access; Env : in Node_access) do
  99.            T_Cortex.Root := Root;
  100.            T_Cortex.Current_Node := Root;
  101.            T_Cortex.Env := Env;
  102.         end Initialize;
  103.         loop
  104.            select
  105.               accept Reset do
  106.                  Current_Node := Root;
  107.               end Reset;
  108.            or
  109.               delay 0.01;
  110.               if Current_Node.Action.Mode /= Env.Action.Mode then
  111.                  Current_Node.Run(Current_Node.Action);
  112.                  Life_Cycle.Switch(Current_Node);
  113.                  if Current_Node.Key < 0 then
  114.                     Current_Node.Connector :=
  115.                       new T_Connector ' ((new T_Node '
  116.                                           (Current_Node.Action,
  117.                                            Next_Key(Current_Node.Key),
  118.                                            Action'Access,
  119.                                            null)),
  120.                                          null);
  121.                     Current_Node := Current_Node.Connector.Left;
  122.                  elsif Current_Node.Key > 0 then
  123.                     Current_Node.Connector :=
  124.                       new T_Connector ' (
  125.                                          null,
  126.                                          (new T_Node '
  127.                                           (Current_Node.Action,
  128.                                            Next_Key(Current_Node.Key),
  129.                                            Action'Access,
  130.                                            null))
  131.                                          );
  132.                     Current_Node := Current_Node.Connector.Right;
  133.                  else
  134.                     raise Program_Error;
  135.                  end if;
  136.  
  137.               end if;
  138.            end select;
  139.         end loop;
  140.      exception
  141.         when Program_Error =>
  142.            Put_Line("Cortex : id " &
  143.                     Handling.To_Wide_String(Integer'Image(Current_Node.Key)) &
  144.                     " := Program_Error" );
  145.      end T_Cortex;
  146.  
  147.      L_Root :  Node_Access :=
  148.        new T_Node ' (output,
  149.                      -1,
  150.                      Action'Access,
  151.                      null);
  152.      R_Root :  Node_Access :=
  153.        new T_Node ' (input,
  154.                      1,
  155.                      Action'Access,
  156.                      null);
  157.      L_Env    :  Node_Access :=
  158.        new T_Node ' (input,
  159.                      0,
  160.                      Action'Access,
  161.                      new T_Connector '
  162.                      (null, R_Root));
  163.      R_Env    :  Node_Access :=
  164.        new T_Node ' (output,
  165.                      0,
  166.                      Action'Access,
  167.                      new T_Connector '
  168.                      (L_Root, null));
  169.      Left : T_Cortex;
  170.      Right : T_Cortex;
  171.  
  172.      Current_L_Env : Node_Access := L_Env;
  173.      Current_R_Env : Node_Access := R_Env;
  174.  
  175.   begin
  176.  
  177.      Left.Initialize(L_Root, L_Env);
  178.      Right.Initialize(R_Root, R_Env);
  179.      loop
  180.         select
  181.            accept Ctrl_C do
  182.               null;
  183.               --Left.Reset;
  184.               --Right.Reset;
  185.            end Ctrl_C;
  186.         or
  187.            accept Switch(Node : in Node_Access) do
  188.  
  189.               if Node.Key < 0 then
  190.                  Put("From left key : " &
  191.                           Handling.To_Wide_String(Integer'Image(Node.Key))
  192.                           & ":" );
  193.                  Node.Run(Node.Action);
  194.  
  195.  
  196.               elsif Node.Key > 0 then
  197.                  Put("From right key : " &
  198.                           Handling.To_Wide_String(Integer'Image(Node.Key)) &
  199.                           ":" );
  200.                  Node.Run(Node.Action);
  201.  
  202.               else
  203.                  raise Program_Error;
  204.               end if;
  205.            end Switch;
  206.         end select;
  207.      end loop;
  208.   exception
  209.      when Program_Error =>
  210.         Put_Line("Life_Cycle ::= Program_Error" );
  211.   end Life_Cycle;
  212.  
  213.   procedure Action (Action : in out Action_Access) is
  214.   begin
  215.      case Action.Mode is
  216.         when In_Put =>
  217.            if Action.Get_Action /= null then
  218.               Action.Get_Action(Action.Register, Action.length);
  219.            end if;
  220.            Action :=
  221.              new T_Action' (Register => Action.Register,
  222.                             Length => Action.Length,
  223.                             Mode => Out_Put,
  224.                             Put_Action => Prophet.Neural_Network.put_Line'Access);
  225.         when Out_Put =>
  226.  
  227.            if Action.Put_Action /= null then
  228.  
  229.               if Action.Length /= 0 then
  230.  
  231.                  Action.Put_Action(Action.Register(1..Action.length));
  232.               else
  233.                  Action.Put_Action("String is left empty." );
  234.               end if;
  235.            end if;
  236.            Action := Input;
  237.      end case;
  238.   end Action;
  239.  
  240.  
  241.   procedure Put_line(Output : in Wide_String) is
  242.   begin
  243.      Ada.Wide_Text_Io.Put_Line(" Prophet > " & Output);
  244.   end Put_Line;
  245.  
  246.   procedure Get_line(Input  : out Wide_String; Last : out Natural) is
  247.   begin
  248.      Put(" Prophet < " );
  249.      Ada.Wide_Text_Io.Get_Line(Input, Last);
  250.   end Get_Line;
  251.  
  252.  
  253. end Prophet.Neural_Network;


Message édité par Profil supprimé le 30-03-2010 à 11:23:16
Reply

Marsh Posté le 27-03-2010 à 09:40:03   

Reply

Marsh Posté le 27-03-2010 à 15:04:08    

C'est pas mal, mais c'est encore pas à ça que je souhaite parvenir....
J'ai un problème de simultanéité de lecture et/ou d'écriture....

Reply

Marsh Posté le 30-03-2010 à 11:26:24    

Bonjour,
 
J'ai toujours mon problème de simultanéité des opération à effectuer par les deux taches concourante.
 
C'est le problème du jour, voir de la semaine.
 
Je cherche le moyen de synchronisé ces deux tache pour n'effectuer qu'une seule opération d'écriture ou de lecture pour servir les deux taches.
 
Comment procéder ? S'il vous plaît. Merci pour votre aide.

Reply

Marsh Posté le 30-03-2010 à 11:52:40    

Bonjour,
Je connais pas trop le ada pour comprendre le problème mais si tu veux que 2 threads (c'est ca tes taches?) ne modifie pas une meme variable/tableau en même temps,renseigne toi sur les mutex/semaphiore.

Message cité 1 fois
Message édité par breizhbugs le 30-03-2010 à 11:54:45
Reply

Marsh Posté le 30-03-2010 à 12:40:54    

breizhbugs a écrit :

Bonjour,
Je connais pas trop le ada pour comprendre le problème mais si tu veux que 2 threads (c'est ca tes taches?) ne modifie pas une meme variable/tableau en même temps,renseigne toi sur les mutex/semaphiore.


 
Merci, oui, je connait un peu... Mais la c'est le mécanisme inverse que je cherche, si je peux m'exprimer ainsi. (enfin je crois).
 
J'ai deux taches (thread) qui doivent lire ou écrire chacune une variable respective. Cependant, je ne doit effectuer qu'un lecture ou écriture pour ces deux taches. C'est à dire que le contenue des variables doit être le même pour les deux taches. De plus je doit synchroniser ces écriture et lecture. C'est à dire que je doit attendre que les deux tache demande la même opération pour l'accomplir.
 
Je crois que j'ai trouvé une solution. Je réviserait mas copie en faveur des mécanisme de mutex et sémaphore si j'échoue.
 
Merci.  :jap:

Reply

Marsh Posté le 22-01-2011 à 07:46:08    

Bonjour Jovalise,
 
As-tu pensé aux objets protégés ? Type protégé, objet protégé, et compagnie ? C’est la première chose à laquelle on pense en Ada lorsqu’une question de synchronisation se pose.
 
Voir dans la référence de Ada 2005 (ou même Ada 95), la section 9.4, “Protected Units and Protected Objects”
 
 
P.S. Je ne connais pas trop ce forum, je n’y suis jamais, mais je viens de regarder la section Ada… ben t’es comme chez toi ici, je te vois partout  :bounce:


Message édité par Hibou57 le 22-01-2011 à 07:51:18
Reply

Marsh Posté le 22-01-2011 à 10:53:45    

Bonjour Hibou, je connais un peut les objet protégé de ce que j'ai pu en lire dans la presse papier en français. Mais comme tu peux le voir, ce projet date un peux, j'y repenserais probablement cependant. Merci pour le lien.
C'est sympa ici, un peu violant parfois mais tranquille en dehors de ces saut d'humeur de certain forumeur. Par contre en catégorie Ada, comme tu peut le voir, c'est un peut à l'abandon.

Reply

Marsh Posté le 06-06-2011 à 13:14:11    

bonjour,
j'ai un programme avancé de compréhension du langage naturelle....plus de 100 000 DE CODE .si vous êtes intéressé pour donner vie à l'i a .peut être que votre connaissance plus la mienne en linguistique permettait de réaliser un jolie programme Homme machine.

Reply

Marsh Posté le 06-06-2011 à 17:24:29    

Bonjour pierre,  
Pourquoi pas !

Reply

Marsh Posté le 08-06-2011 à 10:42:39    

avez vous une adresse mail pour vous envoyer une documentation de ce que réalise déjà ce petit programme.merci à bientôt

Reply

Marsh Posté le 08-06-2011 à 10:42:39   

Reply

Marsh Posté le 08-06-2011 à 11:19:35    

Jovalise, je suis convaincu qu'un jour, tu démontreras que P=NP par accident :D

Reply

Marsh Posté le 08-06-2011 à 14:20:10    

pierrecadounou a écrit :

avez vous une adresse mail pour vous envoyer une documentation de ce que réalise déjà ce petit programme.merci à bientôt


jovalise@gmail.com, merci.


[:dpenche]

Reply

Marsh Posté le 31-10-2013 à 19:01:29    

pierrecadounou a écrit :

avez vous une adresse mail pour vous envoyer une documentation de ce que réalise déjà ce petit programme.merci à bientôt


 
Je suis pas certain d'avoir répondu à la question. (10 ans plus tard). :/
Je ne sais plus ou j'en suis sur ce prog, je vais relire.
 
En tout cas, je repense à l'idée de faire un tel processus.
 
Je vous tiens au courant.
 
Mais je suis à la recherche d'un interlocuteur aussi.

Reply

Marsh Posté le 01-11-2013 à 12:53:38    

Un cerveau bicéphale, c'est un seul cerveau dans deux têtes. Physiologiquement, ça ne me semble pas tenir la route... :whistle:  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-11-2013 à 17:20:34    

j'ai appris ça entre temps.
Je me suis mal exprimé.
Je sais pas comment dire mieux.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed