applyMainOperationsInCol(colIndex, ctx) {
        if (colIndex < 0 || colIndex >= this.columns.length) {
            return;
        }

        this._applyOpsInCol(colIndex, ctx, gate => {
            if (gate.definitelyHasNoEffect() || gate === Gates.Special.SwapHalf) {
                return undefined;
            }

            if (gate.customOperation !== undefined) {
                return gate.customOperation;
            }

            return ctx => GateShaders.applyMatrixOperation(ctx, gate.knownMatrixAt(ctx.time));
        });

        let swapRows = this.colGetEnabledSwapGate(colIndex);
        if (swapRows !== undefined) {
            let [i, j] = swapRows;
            ctx.applyOperation(CircuitShaders.swap(ctx.withRow(i + ctx.row), j + ctx.row));
        }
    }
@param {!int} colIndex
@param {!CircuitEvalContext} ctx
@return {void}