Suppose I'm at an optimal solution of an LP relaxation in a MILP branch-and-bound descent. I want to add an additional cut of my own devices. To compute this cut I need the extreme rays of the cone originating in the LP optimum. The rays will be recessionary (aka, leading away from the optimum); I have no intention of traveling them. This data should be available in the LP tableau (assuming a simplex algorithm), right? Can you explain to me the general process for reading extreme (or all) recession rays from the tableau extending from the current optimum?
A few points of my confusion on this: Some constraints should be tight at the LP optimum, and I can find those. However, I want rays, not planes. I want intersections of those constraints -- like what we walk in the simplex algorithm. Hence, it doesn't seem like a row of the tableau. It seems like it should be a column of the tableau, like the rays should be all the columns not in the optimal basis. However, the rays should have a component corresponding to each variable, and the number of rows in the tableau is not representative of the number of variables.
A third point of confusion comes from looking at SCIP. SCIP has a nice interface for adding custom "separators". It allows me to iterate through the rows and columns of the tableau, but it's not the full tableau. It seems to be missing the slack columns, but it gives me methods for getting the LHS and RHS slack values. Whatever those are, I'm not sure how I would align them between rows. Maybe this has to do with the way the "revised simplex algorithm" stores values, which thing I don't fully understand.
I'm also interested in how to iterate these rays in SCIP.