with Text_IO; use Text_IO;
with ada.integer_text_IO; use ada.integer_text_IO;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Strings.Unbounded.Text_IO; use Ada.Strings.Unbounded.Text_IO;
with unbounded_strings; use unbounded_strings;
use unbounded_strings.strings_table_package;
use unbounded_strings.unbounded_string_list_package;
with Input_sources.File; use Input_Sources.File;
with Ada.Directories; use Ada.Directories;
with Ada.Long_Long_Integer_Text_IO; use Ada.Long_Long_Integer_Text_IO;
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
package body cnn_pmml is
quote : Character := Character'Val(39);
guil : Character := Character'Val(34);
tab : Character := Character'Val(9);
procedure Initialization_PMML
(Filename : in String;
FileDescriptor : out File_Type;
Description : in Unbounded_String := To_Unbounded_string("");
Timestamp : in Unbounded_String := To_Unbounded_string("2023-13-02 00:00:00");
NbLayer : in Integer
)
is
Default_Integer_Width : Integer := Ada.Integer_Text_IO.Default_Width;
begin
Ada.Integer_Text_IO.Default_Width := 0;
if(Exists(Filename)=True) then
Open(FileDescriptor, Out_File, Filename);
else
Create(FileDescriptor, Out_File, Filename);
end if;
Put_Line(FileDescriptor, "");
Put_Line(FileDescriptor, "");
Put_Line(FileDescriptor, tab & "");
Put_Line(FileDescriptor, tab & tab & "" & Timestamp & "");
Put_Line(FileDescriptor, tab & "");
--Warning NOT GENERIC
Put_Line(FileDescriptor, tab & "");
Put_Line(FileDescriptor, tab & tab & "");
Put_Line(FileDescriptor, tab & tab & "");
Put_Line(FileDescriptor, tab & tab & tab & "");
Put_Line(FileDescriptor, tab & tab & "");
Put_Line(FileDescriptor, tab & "");
Put(FileDescriptor, tab & "");
Put_Line(FileDescriptor, tab & tab & "");
Put_Line(FileDescriptor, tab & tab & tab & "");
Put_Line(FileDescriptor, tab & tab & tab & "");
Put_Line(FileDescriptor, tab & tab & "");
Put_Line(FileDescriptor, tab & tab & "");
Put_Line(FileDescriptor, tab & tab & tab & "");
Put_Line(FileDescriptor, tab & tab & "");
Ada.Integer_Text_IO.Default_Width := Default_Integer_Width;
end Initialization_PMML;
procedure Terminate_PMML
(FileDescriptor : in File_Type
)
is
begin
--Warning not generic
Put_Line(FileDescriptor, tab & tab & "");
Put_Line(FileDescriptor, tab & "");
Put_Line(FileDescriptor, "");
--close(FileDescriptor); FileDescriptor Should be a variable ?
end Terminate_PMML;
--DIFFERENT TYPE OF LAYERS
--------------------------------------------------------------------------------------------
--
-- CREATE INPUT LAYER
--
--------------------------------------------------------------------------------------------
procedure Create_InputLayer
(MyFile : in File_Type;
LayerName : in Unbounded_string;
Size : in ParamVal3D;
OutboundToken : out Token
)
is
Default_Integer_Width : Integer := Ada.Integer_Text_IO.Default_Width;
Default_Long_Long_Integer_Width : Integer := Ada.Long_Long_Integer_Text_IO.Default_Width;
begin
Ada.Long_Long_Integer_Text_IO.Default_Width := 0;
Ada.Integer_Text_IO.Default_Width := 0;
OutboundToken := Size(0)*Size(1)*Size(2);
Put_Line(MyFile, tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, Size(0));
Put(MyFile, " ");
Put(MyFile, Size(1));
Put(MyFile, " ");
Put(MyFile, Size(2));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, OutboundToken);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & "");
Ada.Long_Long_Integer_Text_IO.Default_Width := Default_Long_Long_Integer_Width;
Ada.Integer_Text_IO.Default_Width := Default_Integer_Width;
end Create_InputLayer;
--------------------------------------------------------------------------------------------
--
-- CREATE CONVOLUTION 2D LAYER
--
--------------------------------------------------------------------------------------------
procedure Create_Conv2D
(MyFile : in File_Type;
LayerName : in Unbounded_string;
NameInboundNode : in Unbounded_string;
KernelSize : in ParamVal2D;
DilationRate : in ParamVal2D;
KernelStrides : in ParamVal2D;
ChannelSize : in Natural;
InboundToken : in Token := 1;
OutboundToken : out Token
)
is
Default_Integer_Width : Integer := Ada.Integer_Text_IO.Default_Width;
Default_Long_Long_Integer_Width : Integer := Ada.Long_Long_Integer_Text_IO.Default_Width;
Temp : Token;
Temp1 : Long_Long_Integer;
Temp2 : Long_Long_Integer;
Temp3 : Long_Long_Integer;
begin
Ada.Long_Long_Integer_Text_IO.Default_Width := 0;
Ada.Integer_Text_IO.Default_Width := 0;
Temp := Token(Sqrt(Float(InboundToken)));
--Temp1 := Token(Sqrt(Float(KernelSize(0))));
--OutboundToken := (((Temp - Temp1)+2*DilationRate(0)/KernelStrides(0))+1)**2;
Temp1 := Long_Long_Integer(Sqrt(Float(KernelSize(0)*KernelSize(1))));
Temp2 := DilationRate(0)*DilationRate(1);
Temp3 := KernelStrides(0)*KernelStrides(1);
OutboundToken := (((Temp - Temp1)+2*(Temp2)/(Temp3))+1)**2;
Put_Line(MyFile, tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "" & NameInboundNode & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, InboundToken);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, OutboundToken);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & tab & "");
Put(MyFile, DilationRate(0));
Put(MyFile, " ");
Put(MyFile, DilationRate(1));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & tab & "");
Put(MyFile, KernelSize(0));
Put(MyFile, " ");
Put(MyFile, KernelSize(1));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & tab & "");
Put(MyFile, KernelStrides(0));
Put(MyFile, " ");
Put(MyFile, KernelStrides(1));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & "");
Ada.Long_Long_Integer_Text_IO.Default_Width := Default_Long_Long_Integer_Width;
Ada.Integer_Text_IO.Default_Width := Default_Integer_Width;
end Create_Conv2D;
--------------------------------------------------------------------------------------------
--
-- CREATE MAX POOLING LAYER
--
--------------------------------------------------------------------------------------------
procedure Create_MaxPooling2D
(MyFile : in File_Type;
LayerName : in Unbounded_string;
NameInboundNode : in Unbounded_string;
PoolSize : in ParamVal2D;
PoolStrides : in ParamVal2D;
ChannelSize : in out Natural;
InboundToken : in Token := 1;
OutboundToken : out Token
)
is
Default_Integer_Width : Integer := Ada.Integer_Text_IO.Default_Width;
Default_Long_Long_Integer_Width : Integer := Ada.Long_Long_Integer_Text_IO.Default_Width;
begin
Ada.Long_Long_Integer_Text_IO.Default_Width := 0;
Ada.Integer_Text_IO.Default_Width := 0;
OutboundToken := InboundToken/4;
Put_Line(MyFile, tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "" & NameInboundNode & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, InboundToken);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, OutboundToken);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, PoolSize(0));
Put(MyFile, " ");
Put(MyFile, PoolSize(1));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, PoolStrides(0));
Put(MyFile, " ");
Put(MyFile, PoolStrides(1));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & "");
ChannelSize := ChannelSize*2;
Ada.Long_Long_Integer_Text_IO.Default_Width := Default_Long_Long_Integer_Width;
Ada.Integer_Text_IO.Default_Width := Default_Integer_Width;
end Create_MaxPooling2D;
--------------------------------------------------------------------------------------------
--
-- CREATE CONCATENATE LAYER
--
--------------------------------------------------------------------------------------------
procedure Create_Concatenate
(MyFile : in File_Type;
LayerName : in Unbounded_string;
NameInboundNode1 : in Unbounded_string;
NameInboundNode2 : in Unbounded_string;
InboundToken1 : in Token := 1;
InboundToken2 : in Token := 1;
OutboundToken : out Token
)
is
Default_Integer_Width : Integer := Ada.Integer_Text_IO.Default_Width;
Default_Long_Long_Integer_Width : Integer := Ada.Long_Long_Integer_Text_IO.Default_Width;
begin
Ada.Long_Long_Integer_Text_IO.Default_Width := 0;
Ada.Integer_Text_IO.Default_Width := 0;
OutboundToken := InboundToken1;
Put_Line(MyFile, tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "" & NameInboundNode1 & " " & NameInboundNode2 & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, InboundToken1);
Put(MyFile, " ");
Put(MyFile, InboundToken2);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, OutboundToken);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & "");
Ada.Long_Long_Integer_Text_IO.Default_Width := Default_Long_Long_Integer_Width;
Ada.Integer_Text_IO.Default_Width := Default_Integer_Width;
end Create_Concatenate;
--------------------------------------------------------------------------------------------
--
-- CREATE TransposedConv2D LAYER
--
--------------------------------------------------------------------------------------------
procedure Create_TransposedConv2D
(MyFile : in File_Type;
LayerName : in Unbounded_string;
NameInboundNode : in Unbounded_string;
KernelSize : in ParamVal2D := (2,2);
DilationRate : in ParamVal2D := (4,4);
KernelStrides : in ParamVal2D := (2,2);
ChannelSize : in out Natural;
InboundToken : in Token := 1;
OutboundToken : out Token
)
is
Default_Integer_Width : Integer := Ada.Integer_Text_IO.Default_Width;
Default_Long_Long_Integer_Width : Integer := Ada.Long_Long_Integer_Text_IO.Default_Width;
Temp : Token;
Temp1 : Long_Long_Integer;
Temp11 : Long_Long_Integer;
Temp2 : Long_Long_Integer;
Temp3 : Long_Long_Integer;
begin
Ada.Long_Long_Integer_Text_IO.Default_Width := 0;
Ada.Integer_Text_IO.Default_Width := 0;
Temp := Token(Sqrt(Float(InboundToken)));
Temp1 := Long_Long_Integer(Sqrt(Float(KernelSize(0)*KernelSize(1))));
Temp11 := KernelSize(0)*KernelSize(1);
Temp2 := DilationRate(0)*DilationRate(1);
Temp3 := KernelStrides(0);
OutboundToken := InboundToken * 2;
ChannelSize := ChannelSize/2;
Put_Line(MyFile, tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "" & NameInboundNode & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, InboundToken);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & "");
Put(MyFile, OutboundToken);
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & "");
Put(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & tab & "");
Put(MyFile, DilationRate(0));
Put(MyFile, " ");
Put(MyFile, DilationRate(1));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & tab & "");
Put(MyFile, KernelSize(0));
Put(MyFile, " ");
Put(MyFile, KernelSize(1));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put(MyFile, tab & tab & tab & tab & tab & "");
Put(MyFile, KernelStrides(0));
Put(MyFile, " ");
Put(MyFile, KernelStrides(1));
Put_Line(MyFile, "");
Put_Line(MyFile, tab & tab & tab & tab & "");
Put_Line(MyFile, tab & tab & tab & "");
Put_Line(MyFile, tab & tab & "");
Ada.Long_Long_Integer_Text_IO.Default_Width := Default_Long_Long_Integer_Width;
Ada.Integer_Text_IO.Default_Width := Default_Integer_Width;
end Create_TransposedConv2D;
end cnn_pmml;