As observed in the comments in #20461:
sage: mip = MixedIntegerLinearProgram(solver='GLPK')
sage: mip.gen(0) ### Names a variable, but does not create it in the backend
x_0
sage: mip.number_of_variables()
0
sage: mip[0] ### This now creates a variable. It prints the same as the result of gen(0), but is different.
x_0
sage: mip.get_values(mip.gen(0))
[...]
TypeError: Not a MIPVariable: x_0
sage: mip.is_real(mip.gen(0))
[...]
KeyError: x_0
sage: mip.is_real(mip[0])
True
To summarize, the gen method pretends that it can refer to backend variables (and so do linear_function and the special __call__ method that is identical to linear_function). In reality, these methods cannot be use for anything except for what is tested in the docstring: printing some meaningless stuff.
This patch deprecates these three methods and removes the corresponding confusing and useless examples from the class documentation.
In return, the notion of the "default MIP variable" (which __getitem__ refers to) is explained; and it is exposed to the user by new method default_variable.
CC: @nbruin @dimpase @videlec @jdemeyer @fchapoton @novoselt
Component: numerical
Author: Matthias Koeppe
Branch/Commit: 684e91c
Reviewer: Dima Pasechnik
Issue created by migration from https://trac.sagemath.org/ticket/20602