formatted_io8

Two models, A & B, that send/receive JSON data. Model A receives input from a file and then sends it’s output to model B. Model B receives input from model A and sends it’s output to a file.

C Version

Model Code:

 1#include <stdio.h>
 2// Include methods for input/output channels
 3#include "YggInterface.h"
 4
 5int main(int argc, char *argv[]) {
 6  // Initialize input/output channels
 7  yggInput_t in_channel = yggGenericInput("inputA");
 8  yggOutput_t out_channel = yggGenericOutput("outputA");
 9
10  // Declare resulting variables and create buffer for received message
11  int flag = 1;
12  generic_t vec = init_generic();
13
14  // Loop until there is no longer input or the queues are closed
15  while (flag >= 0) {
16  
17    // Receive input from input channel
18    // If there is an error, the flag will be negative
19    // Otherwise, it is the size of the received message
20    flag = yggRecv(in_channel, &vec);
21    if (flag < 0) {
22      printf("Model A: No more input.\n");
23      break;
24    }
25
26    // Print received message
27    printf("Model A:\n");
28    display_generic(vec);
29
30    // Send output to output channel
31    // If there is an error, the flag will be negative
32    flag = yggSend(out_channel, vec);
33    if (flag < 0) {
34      printf("Model A: Error sending output.\n");
35      break;
36    }
37
38  }
39
40  // Free dynamically allocated generic structure
41  free_generic(&vec);
42  
43  return 0;
44}
45
 1#include <stdio.h>
 2// Include methods for input/output channels
 3#include "YggInterface.h"
 4
 5int main(int argc, char *argv[]) {
 6  // Initialize input/output channels
 7  yggInput_t in_channel = yggGenericInput("inputB");
 8  yggOutput_t out_channel = yggGenericOutput("outputB");
 9
10  // Declare resulting variables and create buffer for received message
11  int flag = 1;
12  generic_t vec = init_generic();
13
14  // Loop until there is no longer input or the queues are closed
15  while (flag >= 0) {
16  
17    // Receive input from input channel
18    // If there is an error, the flag will be negative
19    // Otherwise, it is the size of the received message
20    flag = yggRecv(in_channel, &vec);
21    if (flag < 0) {
22      printf("Model B: No more input.\n");
23      break;
24    }
25
26    // Print received message
27    printf("Model B:\n");
28    display_generic(vec);
29
30    // Send output to output channel
31    // If there is an error, the flag will be negative
32    flag = yggSend(out_channel, vec);
33    if (flag < 0) {
34      printf("Model B: Error sending output.\n");
35      break;
36    }
37
38  }
39
40  // Free dynamically allocated generic structure
41  free_generic(&vec);
42  
43  return 0;
44}
45

Model YAML:

 1models:
 2  - name: c_modelA
 3    language: c
 4    args: ./src/formatted_io8_modelA.c
 5    inputs:
 6      - name: inputA
 7        type: object
 8    outputs:
 9      - name: outputA
10        type: object
11
12  - name: c_modelB
13    language: c
14    args: ./src/formatted_io8_modelB.c
15    inputs:
16      - name: inputB
17        type: object
18    outputs:
19      - name: outputB
20        type: object
21
22connections:
23  - input: outputA  # Connection between model A output & model B input
24    output: inputB
25  - input: ./Input/input.txt  # Connection between file and model A input
26    output: inputA
27    filetype: json
28  - input: outputB  # Connection between model B output and file
29    output: ./output.txt
30    filetype: json

C++ Version

Model Code:

 1#include <iostream>
 2// Include methods for input/output channels
 3#include "YggInterface.hpp"
 4
 5int main(int argc, char *argv[]) {
 6  // Initialize input/output channels
 7  YggGenericInput in_channel("inputA");
 8  YggGenericOutput out_channel("outputA");
 9
10  // Declare resulting variables and create buffer for received message
11  int flag = 1;
12  rapidjson::Document vec;
13
14  // Loop until there is no longer input or the queues are closed
15  while (flag >= 0) {
16  
17    // Receive input from input channel
18    // If there is an error, the flag will be negative
19    // Otherwise, it is the size of the received message
20    flag = in_channel.recv(1, &vec);
21    if (flag < 0) {
22      std::cout << "Model A: No more input." << std::endl;
23      break;
24    }
25
26    // Print received message
27    std::cerr << "Model A:" << std::endl <<
28      document2string(vec) << std::endl;
29
30    // Send output to output channel
31    // If there is an error, the flag will be negative
32    flag = out_channel.send(1, &vec);
33    if (flag < 0) {
34      std::cout << "Model A: Error sending output." << std::endl;
35      break;
36    }
37
38  }
39
40  return 0;
41}
 1#include <iostream>
 2// Include methods for input/output channels
 3#include "YggInterface.hpp"
 4
 5int main(int argc, char *argv[]) {
 6  // Initialize input/output channels
 7  YggGenericInput in_channel("inputB");
 8  YggGenericOutput out_channel("outputB");
 9
10  // Declare resulting variables and create buffer for received message
11  int flag = 1;
12  rapidjson::Document vec;
13
14  // Loop until there is no longer input or the queues are closed
15  while (flag >= 0) {
16  
17    // Receive input from input channel
18    // If there is an error, the flag will be negative
19    // Otherwise, it is the size of the received message
20    flag = in_channel.recv(1, &vec);
21    if (flag < 0) {
22      std::cout << "Model B: No more input." << std::endl;
23      break;
24    }
25
26    // Print received message
27    std::cerr << "Model B:" << std::endl <<
28      document2string(vec) << std::endl;
29
30    // Send output to output channel
31    // If there is an error, the flag will be negative
32    flag = out_channel.send(1, &vec);
33    if (flag < 0) {
34      std::cout << "Model B: Error sending output." << std::endl;
35      break;
36    }
37
38  }
39
40  return 0;
41}

Model YAML:

 1models:
 2  - name: cpp_modelA
 3    language: cpp
 4    args: ./src/formatted_io8_modelA.cpp
 5    inputs:
 6      - name: inputA
 7        type: object
 8    outputs:
 9      - name: outputA
10        type: object
11
12  - name: cpp_modelB
13    language: cpp
14    args: ./src/formatted_io8_modelB.cpp
15    inputs:
16      - name: inputB
17        type: object
18    outputs:
19      - name: outputB
20        type: object
21
22connections:
23  - input: outputA  # Connection between model A output & model B input
24    output: inputB
25  - input: ./Input/input.txt  # Connection between file and model A input
26    output: inputA
27    filetype: json
28  - input: outputB  # Connection between model B output and file
29    output: ./output.txt
30    filetype: json

Fortran Version

Model Code:

 1program main
 2  ! Include methods for input/output channels
 3  use fygg
 4
 5  ! Declare resulting variables and create buffer for received message
 6  logical :: flag = .true.
 7  type(yggcomm) :: in_channel, out_channel
 8  type(ygggeneric) :: obj
 9  obj = init_generic()
10
11  ! initialize input/output channels
12  in_channel = ygg_generic_input("inputA")
13  out_channel = ygg_generic_output("outputA")
14
15  ! Loop until there is no longer input or the queues are closed
16  do while (flag)
17
18     ! Receive input from input channel
19     ! If there is an error, the flag will be negative
20     ! Otherwise, it is the number of variables filled
21     flag = ygg_recv_var(in_channel, yggarg(obj))
22     if (.not.flag) then
23        print *, "Model A: No more input."
24        exit
25     end if
26
27     ! Print received message
28     print *, "Model A:"
29     call display_generic(obj)
30
31     ! Send output to output channel
32     ! If there is an error, the flag will be negative
33     flag = ygg_send_var(out_channel, yggarg(obj))
34     if (.not.flag) then
35        print *, "Model A: Error sending output."
36        exit
37     end if
38
39  end do
40
41end program main
 1program main
 2  ! Include methods for input/output channels
 3  use fygg
 4
 5  ! Declare resulting variables and create buffer for received message
 6  logical :: flag = .true.
 7  type(yggcomm) :: in_channel, out_channel
 8  type(ygggeneric) :: obj
 9  obj = init_generic()
10
11  ! initialize input/output channels
12  in_channel = ygg_generic_input("inputB")
13  out_channel = ygg_generic_output("outputB")
14
15  ! Loop until there is no longer input or the queues are closed
16  do while (flag)
17
18     ! Receive input from input channel
19     ! If there is an error, the flag will be negative
20     ! Otherwise, it is the number of variables filled
21     flag = ygg_recv_var(in_channel, yggarg(obj))
22     if (.not.flag) then
23        print *, "Model B: No more input."
24        exit
25     end if
26
27     ! Print received message
28     print *, "Model B:"
29     call display_generic(obj)
30
31     ! Send output to output channel
32     ! If there is an error, the flag will be negative
33     flag = ygg_send_var(out_channel, yggarg(obj))
34     if (.not.flag) then
35        print *, "Model B: Error sending output."
36        exit
37     end if
38
39  end do
40
41end program main

Model YAML:

 1models:
 2  - name: fortran_modelA
 3    language: fortran
 4    args: ./src/formatted_io8_modelA.f90
 5    inputs:
 6      - name: inputA
 7        type: object
 8    outputs:
 9      - name: outputA
10        type: object
11
12  - name: fortran_modelB
13    language: fortran
14    args: ./src/formatted_io8_modelB.f90
15    inputs:
16      - name: inputB
17        type: object
18    outputs:
19      - name: outputB
20        type: object
21
22connections:
23  - input: outputA  # Connection between model A output & model B input
24    output: inputB
25  - input: ./Input/input.txt  # Connection between file and model A input
26    output: inputA
27    filetype: json
28  - input: outputB  # Connection between model B output and file
29    output: ./output.txt
30    filetype: json

Julia Version

Model Code:

 1# Import library for input/output channels
 2using Yggdrasil
 3using Printf
 4
 5# Initialize input/output channels
 6in_channel = Yggdrasil.YggInterface("YggInput", "inputA")
 7out_channel = Yggdrasil.YggInterface("YggOutput", "outputA")
 8
 9# Loop until there is no longer input or the queues are closed
10while true
11
12    # Receive input from input channel
13    # If there is an error, the flag will be false
14    flag, obj = in_channel.recv()
15    if (!flag)
16        println("Model A: No more input.")
17	break
18    end
19
20    # Print received message
21    println(obj)
22
23    # Send output to output channel
24    # If there is an error, the flag will be false
25    flag = out_channel.send(obj)
26    if (!flag)
27        error("Model A: Error sending output.")
28    end
29
30end  # while
 1# Import library for input/output channels
 2using Yggdrasil
 3using Printf
 4
 5# Initialize input/output channels
 6in_channel = Yggdrasil.YggInterface("YggInput", "inputB")
 7out_channel = Yggdrasil.YggInterface("YggOutput", "outputB")
 8
 9# Loop until there is no longer input or the queues are closed
10while true
11
12    # Receive input from input channel
13    # If there is an error, the flag will be false
14    flag, obj = in_channel.recv()
15    if (!flag)
16        println("Model B: No more input.")
17	break
18    end
19
20    # Print received message
21    println(obj)
22
23    # Send output to output channel
24    # If there is an error, the flag will be false
25    flag = out_channel.send(obj)
26    if (!flag)
27        error("Model B: Error sending output.")
28    end
29
30end  # while

Model YAML:

 1models:
 2  - name: julia_modelA
 3    language: julia
 4    args: ./src/formatted_io8_modelA.jl
 5    inputs:
 6      - name: inputA
 7        type: object
 8    outputs:
 9      - name: outputA
10        type: object
11
12  - name: julia_modelB
13    language: julia
14    args: ./src/formatted_io8_modelB.jl
15    inputs:
16      - name: inputB
17        type: object
18    outputs:
19      - name: outputB
20        type: object
21
22connections:
23  - input: outputA  # Connection between model A output & model B input
24    output: inputB
25  - input: ./Input/input.txt  # Connection between file and model A input
26    output: inputA
27    filetype: json
28  - input: outputB  # Connection between model B output and file
29    output: ./output.txt
30    filetype: json

Matlab Version

Model Code:

 1% Initialize input/output channels 
 2in_channel = YggInterface('YggInput', 'inputA');
 3out_channel = YggInterface('YggOutput', 'outputA');
 4
 5flag = true;
 6
 7% Loop until there is no longer input or the queues are closed
 8while flag
 9
10  % Receive input from input channel
11  % If there is an error, the flag will be False.
12  [flag, obj] = in_channel.recv();
13  if (~flag)
14    disp('Model A: No more input.');
15    break;
16  end;
17
18  % Print received message
19  fprintf('Model A:');
20  disp(obj);
21
22  % Send output to output channel
23  % If there is an error, the flag will be False
24  flag = out_channel.send(obj);
25  if (~flag)
26    error('Model A: Error sending output.');
27    break;
28  end;
29  
30end;
 1% Initialize input/output channels 
 2in_channel = YggInterface('YggInput', 'inputB');
 3out_channel = YggInterface('YggOutput', 'outputB');
 4
 5flag = true;
 6
 7% Loop until there is no longer input or the queues are closed
 8while flag
 9
10  % Receive input from input channel
11  % If there is an error, the flag will be False.
12  [flag, obj] = in_channel.recv();
13  if (~flag)
14    disp('Model B: No more input.');
15    break;
16  end;
17
18  % Print received message
19  fprintf('Model B:');
20  disp(obj);
21
22  % Send output to output channel
23  % If there is an error, the flag will be False
24  flag = out_channel.send(obj);
25  if (~flag)
26    error('Model B: Error sending output.');
27    break;
28  end;
29  
30end;

Model YAML:

 1models:
 2  - name: matlab_modelA
 3    language: matlab
 4    args: ./src/formatted_io8_modelA.m
 5    inputs:
 6      - name: inputA
 7        type: object
 8    outputs:
 9      - name: outputA
10        type: object
11
12  - name: matlab_modelB
13    language: matlab
14    args: ./src/formatted_io8_modelB.m
15    inputs:
16      - name: inputB
17        type: object
18    outputs:
19      - name: outputB
20        type: object
21
22connections:
23  - input: outputA  # Connection between model A output & model B input
24    output: inputB
25  - input: ./Input/input.txt  # Connection between file and model A input
26    output: inputA
27    filetype: json
28  - input: outputB  # Connection between model B output and file
29    output: ./output.txt
30    filetype: json

Python Version

Model Code:

 1# Import classes for input/output channels
 2from yggdrasil.interface.YggInterface import YggInput, YggOutput
 3
 4# Initialize input/output channels
 5in_channel = YggInput('inputA')
 6out_channel = YggOutput('outputA')
 7
 8# Loop until there is no longer input or the queues are closed
 9while True:
10
11    # Receive input from input channel
12    # If there is an error, the flag will be False
13    flag, obj = in_channel.recv()
14    if not flag:
15        print("Model A: No more input.")
16        break
17
18    # Print received message
19    print('Model A: %s' % str(obj))
20
21    # Send output to output channel
22    # If there is an error, the flag will be False
23    flag = out_channel.send(obj)
24    if not flag:
25        raise RuntimeError("Model A: Error sending output.")
 1# Import classes for input/output channels
 2from yggdrasil.interface.YggInterface import YggInput, YggOutput
 3
 4# Initialize input/output channels
 5in_channel = YggInput('inputB')
 6out_channel = YggOutput('outputB')
 7
 8# Loop until there is no longer input or the queues are closed
 9while True:
10
11    # Receive input from input channel
12    # If there is an error, the flag will be False
13    flag, obj = in_channel.recv()
14    if not flag:
15        print("Model B: No more input.")
16        break
17
18    # Print received message
19    print('Model B: %s' % str(obj))
20
21    # Send output to output channel
22    # If there is an error, the flag will be False
23    flag = out_channel.send(obj)
24    if not flag:
25        raise RuntimeError("Model B: Error sending output.")

Model YAML:

 1models:
 2  - name: python_modelA
 3    language: python
 4    args: ./src/formatted_io8_modelA.py
 5    inputs:
 6      - name: inputA
 7        type: object
 8    outputs:
 9      - name: outputA
10        type: object
11
12  - name: python_modelB
13    language: python
14    args: ./src/formatted_io8_modelB.py
15    inputs:
16      - name: inputB
17        type: object
18    outputs:
19      - name: outputB
20        type: object
21
22connections:
23  - input: outputA  # Connection between model A output & model B input
24    output: inputB
25  - input: ./Input/input.txt  # Connection between file and model A input
26    output: inputA
27    filetype: json
28  - input: outputB  # Connection between model B output and file
29    output: ./output.txt
30    filetype: json

R Version

Model Code:

 1# Import library for input/output
 2library(yggdrasil)
 3
 4# Initialize input/output channels
 5in_channel <- YggInterface('YggInput', 'inputA')
 6out_channel <- YggInterface('YggOutput', 'outputA')
 7
 8# Loop until there is no longer input or the queues are closed
 9while(TRUE) {
10
11  # Receive input from input channel
12  # If there is an error, the flag will be False
13  c(flag, obj) %<-% in_channel$recv()
14  if (!flag) {
15    print('Model A: No more input.')
16    break
17  }
18
19  # Print received message
20  print('Model A:')
21  print(obj)
22
23  # Send output to output channel
24  # If there is an error, the flag will be False
25  flag = out_channel$send(obj)
26  if (!flag) {
27    stop('Model A: Error sending output.')
28  }
29
30}
 1# Import library for input/output
 2library(yggdrasil)
 3
 4# Initialize input/output channels
 5in_channel <- YggInterface('YggInput', 'inputB')
 6out_channel <- YggInterface('YggOutput', 'outputB')
 7
 8# Loop until there is no longer input or the queues are closed
 9while(TRUE) {
10
11  # Receive input from input channel
12  # If there is an error, the flag will be False
13  c(flag, obj) %<-% in_channel$recv()
14  if (!flag) {
15    print('Model B: No more input.')
16    break
17  }
18
19  # Print received message
20  print('Model B:')
21  print(obj)
22
23  # Send output to output channel
24  # If there is an error, the flag will be False
25  flag = out_channel$send(obj)
26  if (!flag) {
27    stop('Model B: Error sending output.')
28  }
29
30}

Model YAML:

 1models:
 2  - name: R_modelA
 3    language: R
 4    args: ./src/formatted_io8_modelA.R
 5    inputs:
 6      - name: inputA
 7        type: object
 8    outputs:
 9      - name: outputA
10        type: object
11
12  - name: R_modelB
13    language: R
14    args: ./src/formatted_io8_modelB.R
15    inputs:
16      - name: inputB
17        type: object
18    outputs:
19      - name: outputB
20        type: object
21
22connections:
23  - input: outputA  # Connection between model A output & model B input
24    output: inputB
25  - input: ./Input/input.txt  # Connection between file and model A input
26    output: inputA
27    filetype: json
28  - input: outputB  # Connection between model B output and file
29    output: ./output.txt
30    filetype: json