У меня есть следующий класс
type :: net_t
private
character(:), allocatable :: net_type !< Type of the net
integer(kind=integer_4neuro) :: num_of_neurons !< Number of neurons in the net
character(:), allocatable :: training_method !< Used training method
class(neuron_t), allocatable :: neuron_arr(:) !< Array containing all neurons
integer(kind=integer_4neuro), allocatable :: input_neuron_arr(:) !< Array of input neuron indices
integer(kind=integer_4neuro), allocatable :: output_neuron_arr(:) !< Array of output neuron indices
class(connection_t), allocatable :: connection_arr(:) !< Array of all connections
contains
!> Prints information about the network to the standard output.
procedure :: print_info => print_info_impl
!> Saves the network instance to the Fortran binary file
procedure :: save_net_bin => save_net_bin_impl
!> Implementation of write function enabling the storage of
!! allocatable arrays.
procedure :: write_sample => write_sample_impl
!> Implementation of read function enabling to read
!! the whole instance of net_t stored as binary file.
procedure :: read_sample => read_sample_impl
generic :: write(unformatted) => write_sample
generic :: read(unformatted) => read_sample
end type net_t
Мне нужно реализовать свой собственный write
и прочитать functions
, чтобы иметь возможность сериализовать экземпляры net_t
, поскольку он содержит размещаемые массивы.
Я пытался реализовать функцию write
следующим образом:
subroutine write_sample_impl(this, unit, iostat, iomsg)
class(net_t), intent(in) :: this
integer, intent(in) :: unit
integer, intent(out) :: iostat
character(*), intent(inout) :: iomsg
integer :: i !< Counter
! Write a record giving sizes for the allocation
write(unit, iostat=iostat, iomsg=iomsg) SIZE(this%neuron_arr), &
SIZE(this%input_neuron_arr), &
SIZE(this%output_neuron_arr), &
SIZE(this%connection_arr)
write(unit, iostat=iostat, iomsg=iomsg) (this%neuron_arr(i)%get_id(), &
this%neuron_arr(i)%get_potential(), &
this%neuron_arr(i)%get_state(), &
i=1,SIZE(this%neuron_arr)), &
this%input_neuron_arr, &
this%output_neuron_arr, &
(this%connection_arr(i)%get_input_neuron(), &
this%connection_arr(i)%get_output_neuron(), &
this%connection_arr(i)%get_weight(), &
i=1,SIZE(this%connection_arr))
end subroutine write_sample_impl
Но теперь возникла другая проблема - я получаю следующую ошибку :
(this%connection_arr(i)%get_input_neuron(), &
1
Error: Data transfer element at (1) cannot be polymorphic unless it is processed by a defined input/output procedure
this%connection_arr(i)%get_output_neuron(), &
1
Error: Data transfer element at (1) cannot be polymorphic unless it is processed by a defined input/output procedure
Я вижу проблему в том, что класс connection_t
содержит указатели на нейроны, как мы можем видеть здесь:
!> Represents a connection between two neurons.
type, extends(abstract_base_t) :: connection_t
private
class(neuron_t), pointer :: input_neuron !< Pointer to an input neuron
class(neuron_t), pointer :: output_neuron !< Pointer to an output neuron
real(kind=real_4neuro) :: weight !< Weight of the connection
contains
! Implementation of methods
end type connection_t
Возможно ли сериализовать указатели таким образом? Я хотел использовать нейроны, чтобы предотвратить копирование neuron_t
самих экземпляров.