Skip to main content

Using CSC or CSR?




  • Gurobot (AI-generated response)
    Gurobi Staff Gurobi Staff

    You're correct in noting that the internal representation of matrices in Gurobi (or any advanced mathematical optimization software) is crucial for efficiency, particularly when dealing with large-scale data. Gurobi, like many other solvers, employs sparse matrix representations to optimize memory usage and computational efficiency. The formats you mentioned - CSC (Compressed Sparse Column), CSR (Compressed Sparse Row), and COO (Coordinate List) - are common sparse matrix formats.

    To answer your question:

    1. Internal Use of Formats: Gurobi indeed uses these sparse matrix formats internally. However, the exact format used may depend on the specific operations and the nature of the optimization problem. For example, CSR is typically more efficient for row operations, while CSC is better for column operations.

    2. Transferring Matrices in Python API: When using the Python API, the efficiency of transferring data to Gurobi can be influenced by the format of the sparse matrix. If you're working with really large datasets, it can indeed be beneficial to align the format of your matrices with the expected input format of Gurobi's functions. This can potentially reduce the overhead of converting data into an internal format.

    3. Differences in API and Matrix Types:

      • Python vs. C API: There might be differences in how the Python API and C API handle sparse matrices. The Python API is designed for ease of use and integrates well with common Python data structures like NumPy arrays and SciPy sparse matrices, which generally use the CSR format. The C API might offer more control over the data structures and their formats.
      • Linear vs. Quadratic Matrices: The optimal format could indeed differ for linear and quadratic constraint matrices due to their different structures and the way they are processed by the solver.
    4. Best Practices:

      • Consult Documentation: Always refer to the latest Gurobi documentation for specific guidelines on matrix formats. The document you linked is a good resource, but ensure you have the latest version.
      • Performance Testing: If performance is a critical concern, I recommend conducting empirical tests with your specific data and optimization models to identify which format yields the best performance in your use case.

    In summary, while Gurobi is designed to handle various sparse matrix formats efficiently, aligning your data format with Gurobi’s preferred format can lead to performance improvements, especially for large-scale problems. The exact benefits will depend on the nature of your problem and the data involved.

  • Thomas Leveringhaus

    Hi Gurobot (AI-generated response),

    thanks for your reply.

    In the meantime, I have familiarized myself with the C-API in more detail and understand how CSR & CSC are used here.

    With regard to the Python API, however, I am surprised that it is not possible to make a clear statement about whether CSR or CSC should be used. Does it not make sense, for example, to pass the matrix from a MVar-construction (Model.addMConstr()) as CSR to reduce the need of conversion?

    Kind regards


  • Gurobot (AI-generated response)
    Gurobi Staff Gurobi Staff

    While the Python API does not explicitly state a preferred format for every function, CSR is generally a safe and efficient choice for constraint-related operations. However, the internal conversion capabilities of Gurobi ensure that performance is optimized regardless of the format used for input. For critical performance optimizations, empirical testing may be necessary.


Please sign in to leave a comment.