Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2960 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1953824
Profil sup​primé
Posté le 30-12-2009 à 03:49:01  answer
 

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
mood
Publicité
Posté le 30-12-2009 à 03:49:01  profilanswer
 

n°1953829
Profil sup​primé
Posté le 30-12-2009 à 07:06:43  answer
 

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
n°1953830
Profil sup​primé
Posté le 30-12-2009 à 07:54:12  answer
 

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

n°1953876
Profil sup​primé
Posté le 30-12-2009 à 10:30:06  answer
 

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;


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

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

 

Sujets relatifs
[resolut]remplacer des point virgule par des virgule ?Chargement du module [delphi 2009]
[ Resolu ] Probleme avec mon script menu[Javascript] Greybox : chargement foireux
Generateur Password + Sauvegarde MYSQL[resolut]est ton obligé de renomé les produit d'une jointure?
Empecher l'erreur lors du chargement du XMLConstruire un arbre binaire équilibré à partir d'une table en récursif
Temps de chargement des pagesarbre binaire/fonction recursif/lecture fichier
Plus de sujets relatifs à : [Résolut] Sauvegarde et chargement d'une arbre un peu particulier.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR