[Résolut] Sauvegarde et chargement d'une arbre un peu particulier.

Sauvegarde et chargement d'une arbre un peu particulier. [Résolut] - Algo - Programmation

Marsh Posté le 30-12-2009 à 03:49:01    

Bonjour,
Merci de votre intérêt.
 
J'ai construit une structure qui ressemble à un arbre dont chaque noeud est composer d'un tableau de longueur variable de pointeur sur les noeuds sous jacents.
Je souhaite sauver cette structure sur fichier pour la recharger par la suite.
A priori, la sauvegarde ne me posais pas de problème, tandis que je sèche pour le chargement.
Je viens donc vous demander votre aide pour le chargement de cette structure.
 
Voici les codes des définitions et algorithmes que j'ai entrepris.  
 
Les types :

Code :
  1. type T_Neuron is
  2.      record
  3.         .../...
  4.      end record;
  5.   type T_Node;
  6.   type Node_Access is access T_Node;
  7.   type T_Connector is array (Positive range <> ) of Node_Access;
  8.   type Connector_Access is access T_Connector;
  9.   type T_Node is
  10.      record
  11.         Neuron    : T_Neuron;
  12.         Connector : Connector_access;
  13.      end record;
  14.  
  15.   type T_Arche is
  16.      record
  17.         Root : Node_Access;
  18.         .../...
  19.      end record;


 
Ma sauvegarde :

Code :
  1. procedure Save_Node(Root : Node_Access; Filename : String) is
  2.      File : Stream_Io.File_Type;
  3.      File_Access : Stream_Io.Stream_Access;
  4.      File_Name : String(1..64) := (others => Character'Val(32));
  5.   begin
  6.      Stream_Io.open(File, Stream_Io.Append_File, Filename);
  7.      File_Access := Stream_Io.Stream(File);
  8.      -- Sauvegarde du neurone
  9.      Positive'Write(File_Access, Root.Connector'Length);
  10.      Stream_Io.Close(File);
  11.      for I in Root.Connector'Range loop
  12.         if Root.Connector(I) /= null then
  13.            Save_Node(Root.Connector(I), Filename);
  14.         else
  15.            exit;
  16.         end if;
  17.      end loop;
  18.   end Save_Node;
  19.  
  20.   Filename : constant String := "arche";
  21.  
  22.   procedure Save is
  23.  
  24.      File : Stream_Io.File_Type;
  25.      File_Access : Stream_Io.Stream_Access;
  26.   begin
  27.      if Arche.Root = null then
  28.         raise No_Network;
  29.      end if;
  30.      Stream_Io.Create(File, Stream_Io.Out_File, Filename);
  31.      File_Access := Stream_Io.Stream(File);
  32.      Natural'Write(File_Access, Arche.Length);
  33.      Stream_Io.Close(File);
  34.      Save_Node(Arche.Root, Filename);
  35.   end Save;


 
Ce que j'ai fais pour le chargement mais....
 

Code :
  1. procedure Load is
  2.      File : Stream_Io.File_Type;
  3.      File_Access : Stream_Io.Stream_Access;
  4.      File_Name : String(1..64) := (others => Character'Val(32));
  5.      Connector_Length : Positive;
  6.      Index : Positive := 1;
  7.      Parent_Node, Current_Node : Node_Access;
  8.  
  9.   begin
  10.      Stream_Io.open(File, Stream_Io.Append_File, Filename);
  11.      File_Access := Stream_Io.Stream(File);
  12.      -- Chargement du 1er neurone
  13.      Positive'Read(File_Access, Connector_Length);
  14.      Arche.Root.Connector := new T_Connector(1..Connector_Length);
  15.      Current_Node := Arche.Root;
  16.  
  17.      if not Stream_Io.End_Of_File(File) then
  18.     Main :
  19.         loop
  20.            for I in Current_Node.Connector'Range loop
  21.               Current_Node.Connector(I) := new T_Node;
  22.               -- Chargement des neurones suivant
  23.               Positive'Read(File_Access, Connector_Length);
  24.               Current_Node.Connector(I).connector := new T_Connector(1..Connector_Length);
  25.               exit Main when Stream_Io.End_Of_File(File);          
  26.            end loop;
  27.         Parent_Node := Current_Node;      
  28.         end loop Main;
  29.      end if;
  30.      Stream_Io.Close(File);
  31.   end Load;


 
Merci bien !


Message édité par Profil supprimé le 30-12-2009 à 15:35:16
Reply

Marsh Posté le 30-12-2009 à 03:49:01   

Reply

Marsh Posté le 30-12-2009 à 07:06:43    

Re-...
 
 
J'ai légèrement progressé durant la nuit...
 
Voila ou j'en suis ; J'ai écrit trois procédures pour charger ma structure.
Load_Node, pour affecter les Neuron et initialiser le connector.

Code :
  1. procedure Load_Node(-- paramètre pour le neurone
  2.                       Length        : Positive;
  3.                       To            : Node_Access) is
  4.   begin
  5.      if To = null then
  6.         raise No_Network;
  7.      end if;
  8.      -- Affectation du neurone.
  9.      To.Connector := new T_Connector(1..Length);
  10.   end Load_Node;


 
 
Read_Nodes pour lire les noeud suisvant le premier et selectionner le pointeur cible.
 

Code :
  1. procedure Read_Nodes(File : Stream_Io.File_Type; Root : Node_Access) is
  2.  
  3.      File_Name : String(1..64) := (others => Character'Val(32));
  4.      File_Access : Stream_Io.Stream_Access;
  5.      -- variable de neurone
  6.      Length        : Positive;
  7.      Last          : Natural;
  8.   begin
  9.      File_Access := Stream_Io.Stream(File);
  10.      if not Stream_Io.End_Of_File(File) then
  11.         for I in 1..Root.Connector'Length loop
  12.            Root.Connector(I) := new T_Node;
  13.            -- Lecture des neurones suivant.
  14.            Positive'Read(File_Access, Length);
  15.            Load_Node(Num_Input, Num_Output, Trainfile, Train_Length, Converged, Max_Epochs, Network, Length, Root.Connector(I));
  16.            Text_Io.Put_Line("Creating Node" );
  17.            exit when Stream_Io.End_Of_File(File);
  18.         end loop;
  19.      end if;
  20.      for I in 1..Root.Connector'Length loop
  21.         if Root.Connector(I) /= null then
  22.            Read_Nodes(File, Root.Connector(I));
  23.         else
  24.            exit;
  25.         end if;
  26.      end loop;
  27.   end Read_Nodes;


 
Load, qui lit le premier noeud. Et appelle Read_Nodes.
 

Code :
  1. procedure Load is
  2.  
  3.      File : Stream_Io.File_Type;
  4.      File_Access : Stream_Io.Stream_Access;
  5.      -- Les variable du 1er neurone.
  6.      Length        : Positive;
  7.      Last          : Natural;
  8.   begin
  9.  
  10.      Stream_Io.open(File, Stream_Io.in_File, Filename);
  11.      File_Access := Stream_Io.Stream(File);
  12.      Natural'Read(File_Access, Arche.Length);
  13.      Arche.Root := new T_Node;
  14.      -- Lecture du premier neurone.
  15.      Positive'Read(File_Access, Length);
  16.      Load_Node(Num_Input, Num_Output, Trainfile, Train_Length, Converged, Max_Epochs, Network, Length, Arche.Root);
  17.      Text_Io.Put_Line("Creating Root" );
  18.      Read_Nodes(File, Arche.Root);
  19.      Stream_Io.Close(File);
  20.   end Load;


 
Mais ça cloche encore, et je ne sais encore pourquoi.


Message édité par Profil supprimé le 30-12-2009 à 07:08:25
Reply

Marsh Posté le 30-12-2009 à 07:54:12    

Ca marche !  :bounce:  
 
Merci d'avoir joué !  :jap:

Reply

Marsh Posté le 30-12-2009 à 10:30:06    

Pour la postérité, il suffis de modifier le code de Read_Nodes comme suit :
 

Code :
  1. procedure Read_Nodes(File : Stream_Io.File_Type; Root : Node_Access) is
  2.    
  3.         File_Name : String(1..64) := (others => Character'Val(32));
  4.         File_Access : Stream_Io.Stream_Access;
  5.         -- variable de neurone
  6.         Length        : Positive;
  7.         Last          : Natural;
  8.      begin
  9.         File_Access := Stream_Io.Stream(File);
  10.         if not Stream_Io.End_Of_File(File) then
  11.            for I in 1..Root.Connector'Length loop
  12.               Root.Connector(I) := new T_Node;
  13.               -- Lecture des neurones suivant.
  14.               Positive'Read(File_Access, Length);
  15.               Load_Node(Num_Input, Num_Output, Trainfile, Train_Length, Converged, Max_Epochs, Network, Length, Root.Connector(I));
  16.               Text_Io.Put_Line("Creating Node" );
  17.               Read_Nodes(File, Root.Connector(I));
  18.               exit when Stream_Io.End_Of_File(File);
  19.            end loop;
  20.         end if;        
  21.      end Read_Nodes;

Reply

Sujets relatifs:

Leave a Replay

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