### How to Specify Data for Arc Multipliers

If you are familiar with using the NETFLOW procedure to solve pure network problems, then solving generalized network problems is fairly simple. You just need to provide the additional data for the arc multipliers. Arcs by default have a multiplier of 1.0, so you only need to provide arc multipliers that are not equal to 1.0. You can specify the arc multiplier data in either or both of the `ARCDATA=` and `CONDATA=` data sets. The procedure scans the SAS variables in the `ARCDATA=` data set, and if it finds a name `_MULT_` (or a similar name with letters of different case), then it assumes that the SAS variable contains data for arc multipliers. `CONDATA=` is scanned for special type values that indicates data are arc multipliers.

The rest of this section describes the various ways in which you can specify data for the arc multipliers. The network in Figure 6.25 is used for illustration.

#### All Arc Multiplier Data in the ARCDATA= Data Set

You can specify all the arc multiplier data in the `ARCDATA=` data set. The following code creates the input SAS data sets:

```/****************************************************************
*                                                              *
* Generalized Networks:                                        *
* How to Specify Data for Arc Multipliers                      *
*                                                              *
****************************************************************/

/*  All Arc Multiplier Data in the ARCDATA= Data Set  */
```
```data nodes;
input _node_ \$ _sd_ ;
datalines;
N1  22
N4 -30
N5 -10
;
```
```data arcs;
input _from_ \$ _to_ \$  _cost_ _mult_;
datalines;
N1 N2   2   4
N1 N3  10 0.5
N2 N4   0   1
N2 N5   7   3
N3 N2  12   2
N3 N5  10   2
N5 N4  55 0.9
;
```

Let us first look at the data for this problem. There is a variable named `_mult_` in the `ARCDATA=` data set, so PROC NETFLOW assumes it represents the arc multipliers. The SAS variable `_sd_` represents the `supdem` value of a node. A positive or missing S value indicates supply, and a negative or missing D value indicates demand.

The optimal solution can be obtained from the `CONOUT=` data set. Note that you need to specify the `CONOUT=` data set even if the network has no side constraints; you cannot use the `ARCOUT=` data set.

You can use the following SAS code to run PROC NETFLOW:

```
title1 'The NETFLOW Procedure';
proc netflow
bytes    = 100000
nodedata = nodes
arcdata  = arcs
conout   = solution;
run;
```

The optimal solution is displayed in Figure 6.26.

Figure 6.26: Output of the Example Problem

 The NETFLOW Procedure

Obs _from_ _to_ _cost_ _CAPAC_ _LO_ _mult_ _SUPPLY_ _DEMAND_ _FLOW_ _FCOST_
1 N1 N2 2 99999999 0 4.0 22 . 6.0000 12.000
2 N3 N2 12 99999999 0 2.0 . . 3.0000 36.000
3 N1 N3 10 99999999 0 0.5 22 . 16.0000 160.000
4 N2 N4 0 99999999 0 1.0 . 30 30.0000 0.000
5 N5 N4 55 99999999 0 0.9 . 30 -0.0000 -0.000
6 N2 N5 7 99999999 0 3.0 . 10 0.0000 0.000
7 N3 N5 10 99999999 0 2.0 . 10 5.0000 50.000

#### All Arc Multiplier Data in CONDATA= Data Set

Let us now solve the same problem, but with all the arc multipliers specified in the `CONDATA=` data set. The `CONDATA=` data set can have either a sparse format or a dense format. The following code illustrates the dense format representation:

```data arcs1b;
input _from_ \$ _to_ \$  _cost_;
datalines;
N1 N2   2
N1 N3  10
N2 N4   0
N2 N5   7
N3 N2  12
N3 N5  10
N5 N4  55
;

data MUdense;
input _type_ \$ N1_N2 N1_N3 N2_N4 N2_N5 N3_N2 N3_N5 N5_N4;
datalines;
mult 4.0  0.5  1.0  0.3  2.0  2.0  0.9
;
```

You can use the following SAS code to obtain the solution:

```proc netflow
gennet
nodedata = nodes
arcdata  = arcs1b
condata  = MUdense
conout   = soln1b;
run;
```

Note that a new option, GENNET, has been specified in the call to PROC NETFLOW. This option is necessary when the network is generalized and there are no arc multiplier data in the `ARCDATA=` data set. If this option is not specified, then the procedure assumes that the network is pure (without arc multipliers) and sets up the excess supply node and the excess arcs.

The sparse format representation is as follows:

```data MUsparse;
input _type_ \$ _col_ \$ _coef_;
datalines;
mult N1_N2 4.0
mult N1_N3 0.5
mult N2_N4 1.0
mult N2_N5 0.3
mult N3_N2 2.0
mult N3_N5 2.0
mult N5_N4 0.9
;
```

You can use the following SAS code to obtain the solution:

```proc netflow
gennet   sparsecondata
nodedata = nodes
arcdata  = arcs1b
condata  = MUsparse
conout   = soln1c;
run;
```

Note that you need to specify the SPARSECONDATA option in the call to PROC NETFLOW.

#### Arc Multiplier Data in Both ARCDATA= and CONDATA= Data Sets

You can also provide some multiplier data in the `ARCDATA=` data set, and the rest in the `CONDATA=` data set as follows:

```data arcs1c;
input _from_ \$ _to_ \$  _cost_ _mult_;
datalines;
N1 N2   2   4
N1 N3  10  .5
N2 N4   0   .
N2 N5   7   .
N3 N2  12   .
N3 N5  10   .
N5 N4  55   .
;

data MUdense1;
input _type_ \$ N2_N4 N2_N5 N3_N2 N3_N5 N5_N4;
datalines;
mult 1.0  0.3  2.0  2.0  0.9
;
```

The procedure merges the data when all the input data sets have been read.

#### Specifying Arc Multiplier Data Using a List Statement

You can also specify the name of the multiplier variable in the list statement MULT, or MULTIPLIER. For example, if the name of the variable is `lossrate`, then use the following:

```   proc netflow
...
;
mult lossrate;
run;
```

You may also use MULT, GAIN, or LOSS (or similar names with letters of different case) as a value of the TYPE list SAS variable.