with Ada.Numerics.Discrete_Random;
 
with CNNC.Types;
with CNNC.Engine;
with CNNC.Natural_Network;
with CNNC.Server;
package body CNNC.Commander is
   
   
   package User_Random is new Ada.Numerics.Discrete_Random(User_Id_Type);
   User_Gen : User_Random.Generator;
   package Action_Random is new Ada.Numerics.Discrete_Random(Action_Id_Type);
   Action_Gen : User_Random.Generator;
   package Object_Random is new Ada.Numerics.Discrete_Random(Object_Id_Type);
   Object_Gen : User_Random.Generator;
         
   task body CNNCommander is
      
      
      
      Success     : Boolean := False;
      User_Next   : User_Id_Type   := Random(User_Gen);
      Action_Next : Action_Id_Type := Random(Action_Gen);
      Object_Next : Object_Id_Type := Random(Object_Gen);
   begin
      
      loop
                         
         Success := CNNC.Natural_Network.Respond(User_Next, 
                            Action_Next, 
                            Object_Next);
 
         if Success then
            
            Success := CNNC.Engine.Compute(User_Next, 
                                           Action_Next, 
                                           Object_Next);    
            CNNC.Natural_Network.Train(User_Next, 
                                       Action_Next, 
                                       Object_Next, 
                                       Success);
         end if;                         
         
         select
            CNNC.Engine.Basic_Io.Send(User_Next, 
                                                Action_Next, 
                                                Object_Next);
         or
            delay 120.0;
            
            User_Next   := Random(User_Gen);
            Action_Next := Random(Action_Gen);
            Object_Next := Random(Object_Gen);
         end select;
      end loop;      
   end CNNCommander;
 
end CNNC.Commander;