Linear Assignment Problem, Sparse vs. Dense Input (netsle04)

```/*************************************************************************/
/*                                                                       */
/*          S A S   S A M P L E   L I B R A R Y                          */
/*                                                                       */
/*    NAME: netsle04                                                     */
/*   TITLE: Linear Assignment Problem, Sparse vs. Dense Input (netsle04) */
/* PRODUCT: OR                                                           */
/*  SYSTEM: ALL                                                          */
/*    KEYS: OR                                                           */
/*   PROCS: OPTMODEL, CONTENTS, SQL, PRINT                               */
/*    DATA:                                                              */
/*                                                                       */
/* SUPPORT:                             UPDATE:                          */
/*     REF:                                                              */
/*    MISC: Example 4 from the network solver documentation.             */
/*                                                                       */
/*************************************************************************/

data RelayTimesMatrix;
input name \$ sex \$ back breast fly free;
datalines;
Sue     F   .  36.7 28.3 36.1
Karen   F 34.6    .    . 26.2
Jan     F 31.3    . 27.1    .
Andrea  F 28.6    . 29.1    .
Carol   F 32.9    . 26.6    .
;

input name \$ attr \$ cost;
datalines;
Sue     breast 36.7
Sue     fly    28.3
Sue     free   36.1
Karen   back   34.6
Karen   free   26.2
Jan     back   31.3
Jan     fly    27.1
Andrea  back   28.6
Andrea  fly    29.1
Carol   back   32.9
Carol   fly    26.6
;

proc contents data=RelayTimesMatrix
out=stroke_data(rename=(name=stroke) where=(type=1));
run;

proc optmodel;
set <str> STROKES;
set <str> SWIMMERS;
str sex {SWIMMERS};
num time {SWIMMERS, STROKES};
sex
{stroke in STROKES} <time[name,stroke]=col(stroke)>;
set SWIMMERS_STROKES =
{name in SWIMMERS, stroke in STROKES: time[name,stroke] ne .};
set <str,str> PAIRS;

solve with NETWORK /
graph_direction = directed
lap
out             = (assignments=PAIRS)
;

put PAIRS;
create data LinearAssignMatrix from [name assign]=PAIRS
sex[name] cost=time;
quit;

proc sql;
create table stroke_data as
select distinct attr as stroke
quit;

proc optmodel;
set <str> STROKES;
set <str> SWIMMERS;
str sex {SWIMMERS};
set <str,str> SWIMMERS_STROKES;
num time {SWIMMERS_STROKES};
set <str,str> PAIRS;

solve with NETWORK /
graph_direction = directed
lap
out             = (assignments=PAIRS)
;

put PAIRS;
create data LinearAssignLinks from [name attr]=PAIRS cost=time;
quit;

proc print data=LinearAssignMatrix noobs label;
sum cost;
run;