/// The `Model` struct holds a set of variables and constraints for manipulating and evaluating symbolic expressions.
/// - For example, the name `x` might be linked to a `DecisionVariable` that says `x` can only take values between 1 and 10.
/// - Can be a single constraint or a combination of various expressions, such as logical operations (e.g., `AND`, `OR`),
/// arithmetic operations (e.g., `SafeDiv`, `UnsafeDiv`), or specialized constraints like `SumEq`.
/// - Can be safely read or changed by multiple parts of the program at the same time, making it good for multi-threaded use.
/// - Have transformations, optimizations, and simplifications applied to it using a set of rules.