BookmarkSubscribeRSS Feed
norachanisara
Calcite | Level 5

Hi i am gaving a trouble with loading data in. This is the error log i have. Does anyone know how to make SAS read data in a correct way?

 

1          OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
 68         
 69         /* Create the distance matrix */
 70         data distance_matrix;
 71             input loc1 loc2 distance;
 72             datalines;
 
 NOTE: The data set WORK.DISTANCE_MATRIX has 36 observations and 3 variables.
 NOTE: DATA statement used (Total process time):
       real time           0.00 seconds
       user cpu time       0.01 seconds
       system cpu time     0.00 seconds
       memory              778.25k
       OS Memory           22180.00k
       Timestamp           09/18/2024 02:11:35 PM
       Step Count                        258  Switch Count  2
       Page Faults                       0
       Page Reclaims                     102
       Page Swaps                        0
       Voluntary Context Switches        9
       Involuntary Context Switches      0
       Block Input Operations            0
       Block Output Operations           264
       
 
 109        ;
 110        run;
 111        
 112        /* Create the weekly hours dataset */
 113        data week_hours;
 114            input loc hours;
 115            datalines;
 
 NOTE: The data set WORK.WEEK_HOURS has 9 observations and 2 variables.
 NOTE: DATA statement used (Total process time):
       real time           0.00 seconds
       user cpu time       0.00 seconds
       system cpu time     0.00 seconds
       memory              778.25k
       OS Memory           22180.00k
       Timestamp           09/18/2024 02:11:35 PM
       Step Count                        259  Switch Count  2
       Page Faults                       0
       Page Reclaims                     85
       Page Swaps                        0
       Voluntary Context Switches        9
       Involuntary Context Switches      1
       Block Input Operations            0
       Block Output Operations           264
       
 
 125        ;
 126        run;
 127        
 128        /* Create the revenue dataset */
 129        data revenue;
 130            input loc revenue;
 131            datalines;
 
 NOTE: The data set WORK.REVENUE has 9 observations and 2 variables.
 NOTE: DATA statement used (Total process time):
       real time           0.00 seconds
       user cpu time       0.00 seconds
       system cpu time     0.00 seconds
       memory              778.25k
       OS Memory           22180.00k
       Timestamp           09/18/2024 02:11:35 PM
       Step Count                        260  Switch Count  2
       Page Faults                       0
       Page Reclaims                     87
       Page Swaps                        0
       Voluntary Context Switches        12
       Involuntary Context Switches      0
       Block Input Operations            0
       Block Output Operations           264
       
 
 141        ;
 142        run;
 143        
 144        data staff;
 145            input staff;
 146            datalines;
 
 NOTE: The data set WORK.STAFF has 8 observations and 1 variables.
 NOTE: DATA statement used (Total process time):
       real time           0.00 seconds
       user cpu time       0.00 seconds
       system cpu time     0.00 seconds
       memory              778.25k
       OS Memory           22180.00k
       Timestamp           09/18/2024 02:11:35 PM
       Step Count                        261  Switch Count  2
       Page Faults                       0
       Page Reclaims                     85
       Page Swaps                        0
       Voluntary Context Switches        12
       Involuntary Context Switches      0
       Block Input Operations            0
       Block Output Operations           264
       
 
 155        ;
 156        run;
 157        
 158        
 159        /* Create datasets for above and below threshold */
 160        proc sql;
 161            create table above_threshold as
 162            select loc1, loc2, distance
 163            from distance_matrix
 164            where distance > 40;
 NOTE: Table WORK.ABOVE_THRESHOLD created, with 5 rows and 3 columns.
 
 165        
 166            create table below_threshold as
 167            select loc1, loc2, distance
 168            from distance_matrix
 169            where distance <= 40;
 NOTE: Table WORK.BELOW_THRESHOLD created, with 31 rows and 3 columns.
 
 170        quit;
 NOTE: PROCEDURE SQL used (Total process time):
       real time           0.00 seconds
       user cpu time       0.01 seconds
       system cpu time     0.00 seconds
       memory              5899.12k
       OS Memory           27560.00k
       Timestamp           09/18/2024 02:11:35 PM
       Step Count                        262  Switch Count  4
       Page Faults                       0
       Page Reclaims                     275
       Page Swaps                        0
       Voluntary Context Switches        23
       Involuntary Context Switches      0
       Block Input Operations            0
       Block Output Operations           528
       
 
 171        
 172        proc optmodel;
 173            /* First model for locations with distances above threshold */
 174            set LOCS;
 175            set STAFF;
 176            number distance{LOCS, LOCS};
 177            number hours{LOCS};
 178            number revenue{LOCS};
 179        
 180            /* Read the distance data */
 181            read data above_threshold into LOCS=[loc1 loc2] distance=distance[loc1, loc2];
                                                                ________         _
                                                                587              22
 ERROR 587-782: The set element length does not match key count, 1 NE 2.
 
 ERROR 22-322: Expecting a name.  
 
 182        
 183            /* Read the weekly hours and revenue data */
 184            read data week_hours into LOCS=[loc] hours=hours;
 NOTE: There were 9 observations read from the data set WORK.WEEK_HOURS.
 185            read data revenue into LOCS=[loc] revenue=revenue;
 NOTE: There were 9 observations read from the data set WORK.REVENUE.
 186            read data staff into STAFF=[staff];
 NOTE: There were 8 observations read from the data set WORK.STAFF.
 187        
 188            /* Define your decision variables, objective, and constraints here */
 189        
 190            num wage =  23.45;
 191        num max_hours = 40;
 192        
 193        /* declare decision variables */
 194        var RequiredHour {staff, LOCS} >= 0;
 194      !                                       /* Hours worked by staff i on site j */
 195        
 196        /* declare objective */
 197        max Profit = sum {j in LOCS} revenue[j]
 198        - (wage * sum {i in staff, j in LOCS} RequiredHour[i,j])
 199        - 0.15 * (wage * sum {i in staff, j in LOCS} RequiredHour[i,j])
 200        - 0.04 * (sum {j in LOCS} revenue[j] );
 201        
 202        /* declare constraints */
 203        con MaximumHours {i in staff}: sum{j in LOCS} RequiredHour[i,j] <= 40;
 204        con Totalhours {j in LOCS}: sum {i in staff} RequiredHour[i,j] = hours[j];
 205        
 206        /* Solve the problem */
 207            solve;
 NOTE: Problem generation will use 2 threads.
 NOTE: Previous errors might cause the problem to be resolved incorrectly.
 NOTE: The problem has 72 variables (0 free, 0 fixed).
 NOTE: The problem has 17 linear constraints (8 LE, 9 EQ, 0 GE, 0 range).
 NOTE: The problem has 144 linear constraint coefficients.
 NOTE: The problem has 0 nonlinear constraints (0 LE, 0 EQ, 0 GE, 0 range).
 NOTE: The OPTMODEL presolver is disabled for linear problems.
 NOTE: The problem is a pure network instance. The ALGORITHM=NETWORK option is recommended for solving problems with this structure.
 NOTE: The LP presolver value AUTOMATIC is applied.
 NOTE: The LP presolver time is 0.00 seconds.
 NOTE: The LP presolver removed 8 variables and 1 constraints.
 NOTE: The LP presolver removed 16 constraint coefficients.
 NOTE: The presolved problem has 64 variables, 16 constraints, and 128 constraint coefficients.
 NOTE: The LP solver is called.
 NOTE: The Dual Simplex algorithm is used.
                            Objective
       Phase Iteration        Value         Time
        D 2          1    4.505280E+03         0
        P 2         14    5.949925E+02         0
 NOTE: Optimal.
 NOTE: Objective = 594.9925.
 NOTE: The Dual Simplex solve time is 0.00 seconds.
 208        
 209            /* Display the results */
 210            print Profit dollar10.2;
 211        print 'Allocation';
 212            print RequiredHour;
 213        
 214        
 215        quit;
 NOTE: The SAS System stopped processing this step because of errors.
 NOTE: PROCEDURE OPTMODEL used (Total process time):
       real time           0.04 seconds
       user cpu time       0.04 seconds
       system cpu time     0.00 seconds
       memory              12913.73k
       OS Memory           33968.00k
       Timestamp           09/18/2024 02:11:35 PM
       Step Count                        263  Switch Count  18
       Page Faults                       0
       Page Reclaims                     385
       Page Swaps                        0
       Voluntary Context Switches        129
       Involuntary Context Switches      2
       Block Input Operations            0
       Block Output Operations           352
       
 216        
 
 
 217        proc optmodel;
 218            /* Second model for locations with distances below threshold */
 219            set LOCS;
 220            number distance{LOCS, LOCS};
 221            number hours{LOCS};
 222            number revenue{LOCS};
 223        
 224            /* Read the distance data */
 225            read data below_threshold into LOCS=[loc1 loc2] distance=distance[loc1, loc2];
                                                                ________         _
                                                                587              22
 ERROR 587-782: The set element length does not match key count, 1 NE 2.
 
 ERROR 22-322: Expecting a name.  
 
 226        
 227            /* Read the weekly hours and revenue data */
 228            read data week_hours into LOCS=[loc] hours=hours;
 NOTE: There were 9 observations read from the data set WORK.WEEK_HOURS.
 229            read data revenue into LOCS=[loc] revenue=revenue;
 NOTE: There were 9 observations read from the data set WORK.REVENUE.
 230        
 231            /* Define your decision variables, objective, and constraints here */
 232        
 233            NUM n = card(LOCS);
 234            NUM eps = 0.00001;
 235        
 236            /* Define variables */
 237            var x {LOCS, LOCS} binary;
 238            var y {LOCS} binary;
 239            var u {LOCS} >= 0;
 239      !                        /* dummy variable - represents the order in which each location is visited */
 240            var NumStaff >= 0 integer;
 240      !                                /* New variable representing the number of staff */
 241            /*impvar NumVan = ceil(NumEmployees/2)
 242        
 243            /* Define flow in and out of all customer nodes */
 244            impvar FlowOut {i in LOCS} = sum {j in LOCS: i ne j} x[i,j];
 245            impvar FlowIn {j in LOCS} = sum {i in LOCS: i ne j} x[i,j];
 246        
 247            /* Set "arbitrary" starting point */
 248        num home = 9;
 249        
 250            /* Declare constraints */
 251        
 252            /* The vehicle must arrive and depart from each customer */
 253            con Arrival_con {i in LOCS}: FlowIn[i] = 1;
 254            con Departure_con {j in LOCS}: FlowOut[j] = 1;
 255        
 256            /* Remove subtours */
 257            con Subtour_elimination_con {i in LOCS, j in LOCS: i ne j & i ne home}:
 258                u[i] - u[j] + n*x[i,j] <= n-1;
 259            con u_restrict1_con {i in LOCS: i ne home}: u[i] >= 1;
 260            con u_restrict2_con {i in LOCS: i ne home}: u[i] <= n - 1;
 261        
 262        
 263            /* Maximum working hours constraint: actual work time + travel time cannot exceed 40 hours per employee */
 264            con Max_Working_Hours_Con:
 265                sum {i in LOCS} hours[i] * y[i] +
 266                    sum {i in LOCS, j in LOCS} (distance[i,j] /60) * x[i,j] <= 40 * NumStaff ;
 267        
 268        
 269        
 270        
 271            /* Declare objective */
 272            max TotalProfit =
 273                sum {i in LOCS} revenue[i] * y[i]
 274                /* sum of travel cost + actual work cost at location */
 275                - 40 * 26 * NumStaff
 276                - 0.04 * sum {i in LOCS} revenue[i] /* Cleaning Material Cost */
 277                - 0.2 * sum {i in LOCS, j in LOCS} distance[i,j] * x[i,j] /* Fuel cost */
 278                - 0.15 * 40 * 26 * NumStaff
 279                - 20 * n
 280        
 281            ;
 282            solve;
 NOTE: Problem generation will use 2 threads.
 NOTE: Previous errors might cause the problem to be resolved incorrectly.
 ERROR: The array element 'distance[1,1]' has no value at line 266 column 41.
 NOTE: Unable to create problem instance due to previous errors.
 283        
 284            /* Print results */
 285            title 'Route';
 286            print {i in LOCS, j in LOCS: x[i,j] > 0} x;
 287            print u;
 288            print FlowOut FlowIn;
 289            print NumStaff;
 289      !                     /* Print number of employees used */
 290        
 291        quit;
 NOTE: The SAS System stopped processing this step because of errors.
 NOTE: PROCEDURE OPTMODEL used (Total process time):
       real time           0.03 seconds
       user cpu time       0.03 seconds
       system cpu time     0.01 seconds
       memory              1168.85k
       OS Memory           23212.00k
       Timestamp           09/18/2024 02:11:35 PM
       Step Count                        264  Switch Count  4
       Page Faults                       0
       Page Reclaims                     151
       Page Swaps                        0
       Voluntary Context Switches        56
       Involuntary Context Switches      1
       Block Input Operations            0
       Block Output Operations           224
       
 292        
 293        
 294        
 295        OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
 305        
7 REPLIES 7
PaigeMiller
Diamond | Level 26

@norachanisara 

Please note that we previously requested you to show us the log for the PROC that has the error only. We don't need the log before that PROC.

--
Paige Miller
RobPratt
SAS Super FREQ

You have declared LOCS as a set of singletons, but the first READ DATA statement specifies to populate LOCS as a set of pairs.  Instead, you should first populate LOCS:

   /* Read the weekly hours and revenue data */
   read data week_hours into LOCS=[loc] hours=hours;

And then read the distance data:

   /* Read the distance data */
   read data above_threshold into [loc1 loc2] distance=distance[loc1, loc2];

You can alternatively shorten the statement as follows:

   read data above_threshold into [loc1 loc2] distance;

You can find many more examples of reading various types of data in this book of examples:

SAS Help Center: SAS/OR® User's Guide: Mathematical Programming Examples

norachanisara
Calcite | Level 5

Hi.

Thank you for the advice. I have made sure to read data properly, however the program still says my distance element has no value.

 

 264        
 265        
 266            con Max_Working_Hours_Con:
 267                sum {i in LOCS} hours[i] * y[i] +
 268                    sum {i in LOCS, j in LOCS} (distance[i,j] /60) * x[i,j] <= 40 * NumStaff ;
 269        
 270        
 271        
 272        
 273            /* Declare objective */
 274            max TotalProfit =
 275                sum {i in LOCS} revenue[i] * y[i]
 276                /* sum of travel cost + actual work cost at location */
 277                - 40 * 26 * NumStaff
 278                - 0.04 * sum {i in LOCS} revenue[i] /* Cleaning Material Cost */
 279                - 0.2 * sum {i in LOCS, j in LOCS} distance[i,j] * x[i,j] /* Fuel cost */
 280                - 0.15 * 40 * 26 * NumStaff
 281                - 20 * n
 282        
 283            ;
 284            solve;
 NOTE: Problem generation will use 2 threads.
 ERROR: The array element 'distance[1,1]' has no value at line 268 column 43.
 NOTE: Unable to create problem instance due to previous errors.
RobPratt
SAS Super FREQ
Please show the DATA steps and READ DATA statements that led to this error.
norachanisara
Calcite | Level 5

this is my data

 

/* Create the distance matrix */
data distance_matrix;
    input loc1 $ loc2 $ distance;
    datalines;
s1 s2 42.00467
s1 s3 44.1595
s1 s4 23.43201
s1 s5 41.38763
s1 s6 56.03623
s1 s7 51.65744
s1 s8 38.74528
s1 s9 0
s2 s3 3.50019
s2 s4 18.70469
s2 s5 0.76708
s2 s6 15.58126
s2 s7 14.86843
s2 s8 4.31273
s2 s9 0
s3 s4 21.17541
s3 s5 3.58332
3s s6 15.60379
s3 s7 16.43565
s3 s8 7.74752
s3 s9 0
s4 s5 18.13469
s4 s6 32.69996
s4 s7 28.85598
s4 s8 15.31329
s4 s9 0
s5 s6 16.34423
s5 s7 15.58827
s5 s8 4.18141
s5 s9 0
s6 s7 7.08766
s6 s8 17.5934
s6 s9 0
s7 s8 15.05738
s7 s9 0
s8 s9 0
;
run;
/* Create datasets for above and below threshold */
proc sql;
    create table above_threshold as
    select loc1, loc2, distance
    from distance_matrix
    where distance > 40;

    create table below_threshold as
    select loc1, loc2, distance
    from distance_matrix
    where distance <= 40;
quit;

 

and my read data

proc optmodel;
    /* Second model for locations with distances below threshold */
    set <str> LOCS;
    number distance{LOCS, LOCS};
    number hours{LOCS};
    number revenue{LOCS};

    
    /* Read the weekly hours and revenue data */
    read data week_hours into LOCS=[loc] hours=hours;
    read data revenue into LOCS=[loc] revenue=revenue;
    /* Read the distance data */
    read data below_threshold into [loc1 loc2] distance;



RobPratt
SAS Super FREQ

You declare the distance parameter over the full Cartesian product LOCS cross LOCS but then populate it only for pairs <loc1,loc2> where the distance would be <= 40.  So you get an error because the model uses all distance[i,j] values.

 

Are you trying to disallow using arcs whose distances exceed 40?  If so, you should use a sparse index set, as in this doc example:

SAS Help Center: Sparse Modeling

norachanisara
Calcite | Level 5

I see. Thank you very much for the explanation where the error comes from. I will take a look at the sparse modelling. I was just trying to allocate the pair of distance < 30 to one proc optmodel and the pair of distance > 30 to another pro optmodel code. This was just the idea. 

But I think this is not the right logic or not applicable in SAS. 

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 7 replies
  • 392 views
  • 0 likes
  • 3 in conversation