In PROC OPTMODEL, parameters and expressions can have numeric or character values. These correspond to the elementary types
named NUMBER and STRING, respectively. The NUMBER type is the same as the SAS data set numeric type. The NUMBER type includes
support for missing values. The STRING type corresponds to the SAS character type, except that strings can have lengths up
to a maximum of 65,534 characters (versus 32,767 for SAS character-type variables). The NUMBER and STRING types together are
called the *scalar types*. You can abbreviate the type names as NUM and STR, respectively.

PROC OPTMODEL also supports set types for parameters and expressions. Sets represent collections of values of a member type,
which can be a NUMBER, a STRING, or a vector of scalars (the latter is called a *tuple* and described in the following paragraphs). Members of a set all have the same member type. Members that have the same value
are stored only once. For example, PROC OPTMODEL stores the set 2, 2, 2 as the set 2.

Specify a set of numbers with SET<NUMBER>. Similarly, specify a set of strings as SET<STRING>.

A set can also contain a collection of tuples, all of the same fixed length. A *tuple* is an ordered collection that contains a fixed number of elements. Each element in a tuple contains a scalar value. In PROC
OPTMODEL, tuples of length 1 are equivalent to scalars. Two tuples have equal values if the elements at corresponding positions
in each tuple have the same value. Within a set of tuples, the element type at a particular position in each tuple is the
same for all set members. The element types are part of the set type. For example, the following statement declares `parts`

as a set of tuples that have a string in the first element position and a number in the second element position and then
initializes its elements to be <R 1>, <R 2>, <C 1>, and <C 2>.

set<string,number> parts = /<R 1> <R 2> <C 1> <C 2>/;

To create a compact model, use sets to take advantage of the structure of the problem being modeled. For example, a model might contain various values that specify attributes for each member of a group of suppliers. You could create a set that contains members that represent each supplier. You can then model the attribute values by using arrays that are indexed by members of the set.

The section Parameters has more details and examples.