def build_lin_op_tree(root_linPy, tmp): """ Breadth-first, pre-order traversal on the Python linOp tree Parameters ------------- root_linPy: a Python LinOp tree tmp: an array to keep data from going out of scope Returns -------- root_linC: a C++ LinOp tree created through our swig interface """ Q = deque() root_linC = cvxcore.LinOp() Q.append((root_linPy, root_linC)) while len(Q) > 0: linPy, linC = Q.popleft() # Updating the arguments our LinOp for argPy in linPy.args: tree = cvxcore.LinOp() tmp.append(tree) Q.append((argPy, tree)) linC.args.push_back(tree) # Setting the type of our lin op linC.type = get_type(linPy.type.upper()) # Setting size for dim in linPy.shape: linC.size.push_back(int(dim)) # Loading the problem data into the appropriate array format if linPy.data is None: pass elif isinstance(linPy.data, tuple) and isinstance( linPy.data[0], slice): set_slice_data(linC, linPy) elif isinstance(linPy.data, float) or isinstance( linPy.data, numbers.Integral): linC.set_dense_data(format_matrix(linPy.data, format='scalar')) linC.data_ndim = 0 # data is supposed to be a LinOp elif isinstance(linPy.data, lo.LinOp) and linPy.data.type == 'scalar_const': linC.set_dense_data(format_matrix(linPy.data.data, format='scalar')) linC.data_ndim = 0 else: set_matrix_data(linC, linPy) return root_linC
def make_linC_from_linPy(linPy, linPy_to_linC): """Construct a C++ LinOp corresponding to LinPy. Children of linPy are retrieved from linPy_to_linC. """ if linPy in linPy_to_linC: return typ = get_type(linPy) shape = cvxcore.IntVector() lin_args_vec = cvxcore.ConstLinOpVector() for dim in linPy.shape: shape.push_back(int(dim)) for argPy in linPy.args: lin_args_vec.push_back(linPy_to_linC[argPy]) linC = cvxcore.LinOp(typ, shape, lin_args_vec) linPy_to_linC[linPy] = linC if linPy.data is not None: if isinstance(linPy.data, lo.LinOp): linC_data = linPy_to_linC[linPy.data] linC.set_linOp_data(linC_data) linC.set_data_ndim(len(linPy.data.shape)) else: set_linC_data(linC, linPy)