Multipoint opening argument
Consider the commitments $A,B,C,D$ to polynomials $a(X),b(X),c(X),d(X)$. Let's say that $a$ and $b$ were queried at the point $x$, while $c$ and $d$ were queried at both points $x$ and $ωx$. (Here, $ω$ is the primitive root of unity in the multiplicative subgroup over which we constructed the polynomials).
To open these commitments, we could create a polynomial $Q$ for each point that we queried at (corresponding to each relative rotation used in the circuit). But this would not be efficient in the circuit; for example, $c(X)$ would appear in multiple polynomials.
Instead, we can group the commitments by the sets of points at which they were queried: $ {x}AB {x,ωx}CD $
For each of these groups, we combine them into a polynomial set, and create a single $Q$ for that set, which we open at each rotation.
Optimization steps
The multipoint opening optimization takes as input:
 A random $x$ sampled by the verifier, at which we evaluate $a(X),b(X),c(X),d(X)$.
 Evaluations of each polynomial at each point of interest, provided by the prover: $a(x),b(x),c(x),d(x),c(ωx),d(ωx)$
These are the outputs of the vanishing argument.
The multipoint opening optimization proceeds as such:

Sample random $x_{1}$, to keep $a,b,c,d$ linearly independent.

Accumulate polynomials and their corresponding evaluations according to the point set at which they were queried:
q_polys
: $q_{1}(X)q_{2}(X) == a(X)c(X) ++ x_{1}b(X)x_{1}d(X) $q_eval_sets
:[ [a(x) + x_1 b(x)], [ c(x) + x_1 d(x), c(\omega x) + x_1 d(\omega x) ] ]
NB:
q_eval_sets
is a vector of sets of evaluations, where the outer vector goes over the point sets, and the inner vector goes over the points in each set. 
Interpolate each set of values in
q_eval_sets
:r_polys
: $r_{1}(X)s.t.r_{2}(X)s.t. r_{1}(x)r_{2}(x)r_{2}(ωx) === a(x)+x_{1}b(x)c(x)+x_{1}d(x)c(ωx)+x_{1}d(ωx) $ 
Construct
f_polys
which check the correctness ofq_polys
:f_polys
$f_{1}(X)f_{2}(X) == X−xq_{1}(X)−r_{1}(X) (X−x)(X−ωx)q_{2}(X)−r_{2}(X) $If $q_{1}(x)=r_{1}(x)$, then $f_{1}(X)$ should be a polynomial. If $q_{2}(x)=r_{2}(x)$ and $q_{2}(ωx)=r_{2}(ωx)$ then $f_{2}(X)$ should be a polynomial.

Sample random $x_{2}$ to keep the
f_polys
linearly independent. 
Construct $f(X)=f_{1}(X)+x_{2}f_{2}(X)$.

Sample random $x_{3}$, at which we evaluate $f(X)$: $f(x_{3}) == f_{1}(x_{3})x_{3}−xq_{1}(x_{3})−r_{1}(x_{3}) ++ x_{2}f_{2}(x_{3})x_{2}(x_{3}−x)(x_{3}−ωx)q_{2}(x_{3})−r_{2}(x_{3}) $

Sample random $x_{4}$ to keep $f(X)$ and
q_polys
linearly independent. 
Construct
final_poly
, $final_poly(X)=f(X)+x_{4}q_{1}(X)+x_{4}q_{2}(X),$ which is the polynomial we commit to in the inner product argument.