Historically, I think our design philosophy has placed more weight on providing easy-to-use and flexible modeling components that we can use to implement new and interesting optimization strategies, but we still make some attempts at making sure things stay lightweight where possible (e.g., by using __slots__).
I can direct you to some prototype components related to points (2) and (3), but it’s hard to say how much they will help without more details about your large-scale test instances. In general, it would be interesting to know the following:
- What proportion of the total memory is used by variables? constraints (expressions)? data (Set, Param, other data)?
- What proportion of the total time is spent creating the variables? creating the constraints? converting the model to the solver input format (e.g., inside the LP writer)?
Some of this might be difficult to determine, but it would be very useful to us.
Gabe