_cutRow(row) {
        let row_gates = [];
        let cols = [];
        for (let i = 0; i < this.circuitDefinition.columns.length; i++) {
            let col_gates = [...this.circuitDefinition.columns[i].gates];
            row_gates.push(col_gates[row]);
            col_gates.splice(row, 1);
            col_gates.push(undefined);
            cols.push(new GateColumn(col_gates));
        }
        let newInitialStates = seq(this.circuitDefinition.customInitialValues.entries()).
            filter(([k, _]) => k !== row).
            map(([k, v]) => [k - (k > row ? 1 : 0), v]).
            toMap(([k, _]) => k, ([_, v]) => v);
        return {
            newCircuit: this.circuitDefinition.withColumns(cols).withInitialStates(newInitialStates),
            rowGates: row_gates,
            initialState: this.circuitDefinition.customInitialValues.get(row)
        };
    }
@param {!int} row
@returns {!{newCircuit: !CircuitDefinition, rowGates: !Array.<undefined|!Gate>, initialState: *}}
@private