---------------------------------------------------------------------------
-- Frustrated Inhibitive Synapse Learning (FISL) Input-Output (IO)
-- package body
-- Copyright 1994 David W. Croft.  All rights reserved.
-- CompuServe [76600, 102]
-- Internet   CroftDW@Portia.Caltech.Edu
---------------------------------------------------------------------------

with DC_Text; use DC_Text;

package body FISL_IO is
---------------------------------------------------------------------------
---------------------------------------------------------------------------

procedure Get ( Phases : in out Phases_Type ) is
---------------------------------------------------------------------------
  Neuron : positive := Phases'first;
  Phase_Char : string ( Phases'first..( Phases'last + 1 ) );
  Phase_Count : natural := 0;
begin
  loop
    Put ( "Neuron" & positive'image ( Neuron )
      & " Phase ( F = Fire, R = Rest, C = Cold, Default = float ): " );
    Get_Line ( Phase_Char, Phase_Count );
    Phase_Count := Phase_Count - Phases'first + 1;
    if Phase_Count > 0 then
      for Phase in Phases'first..( Phases'first + Phase_Count - 1 ) loop
	case Phase_Char ( Phase ) is
	  when 'f' | 'F' => Phases ( Neuron ) := Fire;
	  when 'r' | 'R' => Phases ( Neuron ) := Rest;
	  when 'c' | 'C' => Phases ( Neuron ) := Cold;
	  when others => null;
	end case;
	Neuron := Neuron + 1;
	exit when Neuron > Phases'last;
      end loop;
    else
      Neuron := Neuron + 1;
    end if;
    exit when Neuron > Phases'last;
  end loop;
  Put_Line ( "" );
end Get;

procedure Get ( Setup : in out Setup_Type ) is
---------------------------------------------------------------------------
  package Nat_IO is new Integer_IO ( natural  );
  package Pos_IO is new Integer_IO ( positive );
begin
  Ask ( Setup.No_Self, "Do you want to disallow self-connections "
    & "(zero diagonal)? ", Setup.No_Self );
  Ask ( Setup.Forward, "Do you want it to be feed-forward only "
    & "(zero diagonal and top-right)? ", Setup.Forward );
  Ask ( Setup.Layered, "Do you want it to be layered "
    & "(zero all inputs from same layer)? ", Setup.Layered );
  Nat_IO.Ask ( Setup.Input_Count, "Input_Count ", Setup.Input_Count );
  Pos_IO.Ask ( Setup.Output_Count, "Output_Count ", Setup.Output_Count );
--  Total_Count := Input_Count + Output_Count;
  Pos_IO.Ask ( Setup.Total_Count, "Total_Count ", Setup.Total_Count );
end Get;

procedure Put (
  Inputs  : in     FISL.Inputs_Type ) is
---------------------------------------------------------------------------
begin
  for Input in Inputs'range loop
    Put ( Inputs ( Input ), 2, 2, 0 );
    Put ( ' ' );
  end loop;
  Put_Line ( "" );
end Put;

procedure Put (
  Network : in     FISL.Network_Type ) is
---------------------------------------------------------------------------
begin
  Put_Line ( "Network Inputs" );
  Put ( Network.Inputs );
  Put_Line ( "" );
  Put_Line ( "Network Weights" );
  Put ( Network.Weights );
  Put_Line ( "" );
  Put_Line ( "Network Transmitters" );
  Put ( Network.Transmitters );
  Put_Line ( "" );
  Put_Line ( "Network Phases" );
  Put ( Network.Phases );
  Put_Line ( "" );
end Put;

procedure Put ( Phase : in FISL.Phase_Type ) is
---------------------------------------------------------------------------
begin
  Put ( Phase.Membrane_Voltage, 2, 3, 0 );
  Put ( ' ' );
  Put ( Phase.Activated_Sodium, 2, 3, 0 );
  Put ( ' ' );
  Put ( Phase.Activated_Potassium, 2, 3, 0 );
  Put_Line ( "" );
end Put;

procedure Put (
  Phases : in     FISL.Phases_Type ) is
---------------------------------------------------------------------------
begin
  for Phase in Phases'range loop
    Put ( Phases ( Phase ) );
  end loop;
  Put_Line ( "" );
end Put;

procedure Put (
  Transmitters : in     FISL.Transmitters_Type ) is
---------------------------------------------------------------------------
begin
  for Neuron in Transmitters'range loop
    for Transmitter in Transmitters'range loop
      Put ( Transmitters ( Neuron, Transmitter ), 2, 3, 0 );
      Put ( ' ' );
    end loop;
    Put_Line ( "" );
  end loop;
  Put_Line ( "" );
end Put;

procedure Put (
  Weight : in     FISL.Weight_Type ) is
---------------------------------------------------------------------------
begin
  Put ( Weight.Excitatory, 1, 3, 0 );
  Put ( "/" );
  Put ( Weight.Inhibitory, 1, 3, 0 );
end Put;

procedure Put (
  Weights : in FISL.Weights_Type ) is
---------------------------------------------------------------------------
begin
  for Neuron in Weights'range loop
    for Weight in Weights'range loop
      Put ( Weights ( Neuron, Weight ) );
      Put ( ' ' );
    end loop;
    Put_Line ( "" );
  end loop;
  Put_Line ( "" );
end Put;

---------------------------------------------------------------------------
---------------------------------------------------------------------------
end FISL_IO;

