Skip to content

Conversation

@ZedongPeng
Copy link
Collaborator

@ZedongPeng ZedongPeng commented Dec 15, 2025

Hi @blegat, thank you very much for your help with the MOI wrapper.

Following your instructions, I’ve tested the MOI wrapper. Could you please take a look at the implementation when you have a chance?
The tests are now able to run, although some currently fail due to issues in cuPDLPx itself. I’ll update the source code to fix these shortly.

Test Summary:                                                                  | Pass  Fail  Error  Total     Time
test_runtests                                                                  | 1000   192    145   1337  8m52.0s
  test_DualObjectiveValue_Max_ScalarAffine_LessThan                            |          1             1     6.9s
  test_DualObjectiveValue_Min_ScalarAffine_GreaterThan                         |          1             1     0.4s
  test_HermitianPSDCone_basic                                                  |                        0     4.9s
  test_HermitianPSDCone_min_t                                                  |                        0     0.6s
  test_NormNuclearCone_VectorAffineFunction_with_transform                     |                        0     1.3s
  test_NormNuclearCone_VectorAffineFunction_without_transform                  |                        0     0.0s
  test_NormNuclearCone_VectorOfVariables_with_transform                        |                        0     0.2s
  test_NormNuclearCone_VectorOfVariables_without_transform                     |                        0     0.0s
  test_NormSpectralCone_VectorAffineFunction_with_transform                    |                        0     1.0s
  test_NormSpectralCone_VectorAffineFunction_without_transform                 |                        0     0.0s
  test_NormSpectralCone_VectorOfVariables_with_transform                       |                        0     0.1s
  test_NormSpectralCone_VectorOfVariables_without_transform                    |                        0     0.0s
  test_VectorNonlinearOracle_LagrangeMultipliers_MAX_SENSE                     |                        0     1.7s
  test_VectorNonlinearOracle_LagrangeMultipliers_MIN_SENSE                     |                        0     0.1s
  test_add_constrained_PositiveSemidefiniteConeTriangle                        |                        0     6.0s
  test_add_constrained_PositiveSemidefiniteConeTriangle_VariableName           |                        0     0.1s
  test_add_constrained_PositiveSemidefiniteConeTriangle_VariablePrimalStart    |                        0     0.4s
  test_add_constrained_variables_vector                                        |    6                   6     0.8s
  test_add_parameter                                                           |    6                   6     1.8s
  test_attribute_AbsoluteGapTolerance                                          |                        0     0.1s
  test_attribute_NodeLimit                                                     |                        0     0.1s
  test_attribute_NumberThreads                                                 |                        0     0.1s
  test_attribute_ObjectiveLimit                                                |                        0     0.1s
  test_attribute_RelativeGapTolerance                                          |                        0     0.1s
  test_attribute_Silent                                                        |    4                   4     0.1s
  test_attribute_SolutionLimit                                                 |                        0     0.1s
  test_attribute_SolverName                                                    |    1                   1     0.1s
  test_attribute_SolverVersion                                                 |                        0     0.1s
  test_attribute_TimeLimitSec                                                  |    3                   3     0.3s
  test_attribute_after_empty                                                   |    4                   4     0.0s
  test_attribute_unsupported_constraint                                        |    2                   2     0.7s
  test_basic_ScalarAffineFunction_EqualTo                                      |   24                  24     2.0s
  test_basic_ScalarAffineFunction_GreaterThan                                  |   24                  24     1.2s
  test_basic_ScalarAffineFunction_Integer                                      |                        0     2.3s
  test_basic_ScalarAffineFunction_Interval                                     |   24                  24     1.6s
  test_basic_ScalarAffineFunction_LessThan                                     |   24                  24     1.3s
  test_basic_ScalarAffineFunction_Semicontinuous                               |                        0     2.1s
  test_basic_ScalarAffineFunction_Semiinteger                                  |                        0     2.0s
  test_basic_ScalarAffineFunction_ZeroOne                                      |                        0     1.9s
  test_basic_ScalarNonlinearFunction_EqualTo                                   |                        0     2.0s
  test_basic_ScalarNonlinearFunction_GreaterThan                               |                        0     1.9s
  test_basic_ScalarNonlinearFunction_Integer                                   |                        0     1.9s
  test_basic_ScalarNonlinearFunction_Interval                                  |                        0     1.8s
  test_basic_ScalarNonlinearFunction_LessThan                                  |                        0     1.9s
  test_basic_ScalarNonlinearFunction_Semicontinuous                            |                        0     1.8s
  test_basic_ScalarNonlinearFunction_Semiinteger                               |                        0     1.8s
  test_basic_ScalarNonlinearFunction_ZeroOne                                   |                        0     1.9s
  test_basic_ScalarQuadraticFunction_EqualTo                                   |                        0     2.0s
  test_basic_ScalarQuadraticFunction_GreaterThan                               |                        0     1.6s
  test_basic_ScalarQuadraticFunction_Integer                                   |                        0     1.9s
  test_basic_ScalarQuadraticFunction_Interval                                  |                        0     1.6s
  test_basic_ScalarQuadraticFunction_LessThan                                  |                        0     1.6s
  test_basic_ScalarQuadraticFunction_Semicontinuous                            |                        0     1.9s
  test_basic_ScalarQuadraticFunction_Semiinteger                               |                        0     1.8s
  test_basic_ScalarQuadraticFunction_ZeroOne                                   |                        0     1.9s
  test_basic_VariableIndex_EqualTo                                             |   20                  20     0.9s
  test_basic_VariableIndex_GreaterThan                                         |   20                  20     0.8s
  test_basic_VariableIndex_Integer                                             |                        0     1.0s
  test_basic_VariableIndex_Interval                                            |   20                  20     1.0s
  test_basic_VariableIndex_LessThan                                            |   20                  20     1.0s
  test_basic_VariableIndex_Semicontinuous                                      |                        0     1.0s
  test_basic_VariableIndex_Semiinteger                                         |                        0     1.1s
  test_basic_VariableIndex_ZeroOne                                             |                        0     1.0s
  test_basic_VectorAffineFunction_AllDifferent                                 |                        0     2.7s
  test_basic_VectorAffineFunction_BinPacking                                   |                        0     2.3s
  test_basic_VectorAffineFunction_Circuit                                      |                        0     2.3s
  test_basic_VectorAffineFunction_Complements                                  |                        0     2.2s
  test_basic_VectorAffineFunction_CountAtLeast                                 |                        0     2.5s
  test_basic_VectorAffineFunction_CountBelongs                                 |                        0     2.1s
  test_basic_VectorAffineFunction_CountDistinct                                |                        0     2.4s
  test_basic_VectorAffineFunction_CountGreaterThan                             |                        0     2.2s
  test_basic_VectorAffineFunction_Cumulative                                   |                        0     2.3s
  test_basic_VectorAffineFunction_DualExponentialCone                          |                        0     2.1s
  test_basic_VectorAffineFunction_DualPowerCone                                |                        0     2.1s
  test_basic_VectorAffineFunction_ExponentialCone                              |                        0     2.2s
  test_basic_VectorAffineFunction_GeometricMeanCone                            |                        0     2.4s
  test_basic_VectorAffineFunction_HermitianPositiveSemidefiniteConeTriangle    |                        0     1.7s
  test_basic_VectorAffineFunction_HyperRectangle                               |   24                  24     4.7s
  test_basic_VectorAffineFunction_Indicator_GreaterThan                        |                        0     1.8s
  test_basic_VectorAffineFunction_Indicator_LessThan                           |                        0     1.9s
  test_basic_VectorAffineFunction_LogDetConeSquare                             |                        0     2.6s
  test_basic_VectorAffineFunction_LogDetConeTriangle                           |                        0     2.0s
  test_basic_VectorAffineFunction_Nonnegatives                                 |   24                  24     1.3s
  test_basic_VectorAffineFunction_Nonpositives                                 |   24                  24     2.3s
  test_basic_VectorAffineFunction_NormCone                                     |                        0     2.1s
  test_basic_VectorAffineFunction_NormInfinityCone                             |   24                  24     3.3s
  test_basic_VectorAffineFunction_NormNuclearCone                              |                        0     1.7s
  test_basic_VectorAffineFunction_NormOneCone                                  |   24                  24    48.5s
  test_basic_VectorAffineFunction_NormSpectralCone                             |                        0     1.7s
  test_basic_VectorAffineFunction_Path                                         |                        0     2.2s
  test_basic_VectorAffineFunction_PositiveSemidefiniteConeSquare               |                        0     2.3s
  test_basic_VectorAffineFunction_PositiveSemidefiniteConeTriangle             |                        0     1.9s
  test_basic_VectorAffineFunction_PowerCone                                    |                        0     2.0s
  test_basic_VectorAffineFunction_RelativeEntropyCone                          |                        0     1.9s
  test_basic_VectorAffineFunction_RootDetConeSquare                            |                        0     2.6s
  test_basic_VectorAffineFunction_RootDetConeTriangle                          |                        0     1.9s
  test_basic_VectorAffineFunction_RotatedSecondOrderCone                       |                        0     1.9s
  test_basic_VectorAffineFunction_SOS1                                         |                        0     2.3s
  test_basic_VectorAffineFunction_SOS2                                         |                        0     2.1s
  test_basic_VectorAffineFunction_ScaledPositiveSemidefiniteConeTriangle       |                        0     1.9s
  test_basic_VectorAffineFunction_SecondOrderCone                              |                        0     1.9s
  test_basic_VectorAffineFunction_Table                                        |                        0     2.2s
  test_basic_VectorAffineFunction_VectorNonlinearOracle                        |                        0     2.1s
  test_basic_VectorAffineFunction_Zeros                                        |   24                  24     2.2s
  test_basic_VectorNonlinearFunction_AllDifferent                              |                        0     2.2s
  test_basic_VectorNonlinearFunction_BinPacking                                |                        0     1.8s
  test_basic_VectorNonlinearFunction_Circuit                                   |                        0     1.8s
  test_basic_VectorNonlinearFunction_Complements                               |                        0     1.8s
  test_basic_VectorNonlinearFunction_CountAtLeast                              |                        0     2.0s
  test_basic_VectorNonlinearFunction_CountBelongs                              |                        0     1.9s
  test_basic_VectorNonlinearFunction_CountDistinct                             |                        0     1.8s
  test_basic_VectorNonlinearFunction_CountGreaterThan                          |                        0     2.0s
  test_basic_VectorNonlinearFunction_Cumulative                                |                        0     1.8s
  test_basic_VectorNonlinearFunction_DualExponentialCone                       |                        0     1.8s
  test_basic_VectorNonlinearFunction_DualPowerCone                             |                        0     1.8s
  test_basic_VectorNonlinearFunction_ExponentialCone                           |                        0     1.9s
  test_basic_VectorNonlinearFunction_GeometricMeanCone                         |                        0     2.3s
  test_basic_VectorNonlinearFunction_HermitianPositiveSemidefiniteConeTriangle |                        0     1.9s
  test_basic_VectorNonlinearFunction_HyperRectangle                            |                        0     2.0s
  test_basic_VectorNonlinearFunction_LogDetConeSquare                          |                        0     2.0s
  test_basic_VectorNonlinearFunction_LogDetConeTriangle                        |                        0     1.8s
  test_basic_VectorNonlinearFunction_Nonnegatives                              |                        0     1.8s
  test_basic_VectorNonlinearFunction_Nonpositives                              |                        0     2.0s
  test_basic_VectorNonlinearFunction_NormCone                                  |                        0     1.8s
  test_basic_VectorNonlinearFunction_NormInfinityCone                          |                        0     1.8s
  test_basic_VectorNonlinearFunction_NormNuclearCone                           |                        0     2.0s
  test_basic_VectorNonlinearFunction_NormOneCone                               |                        0     1.9s
  test_basic_VectorNonlinearFunction_NormSpectralCone                          |                        0     1.9s
  test_basic_VectorNonlinearFunction_Path                                      |                        0     1.9s
  test_basic_VectorNonlinearFunction_PositiveSemidefiniteConeSquare            |                        0     2.0s
  test_basic_VectorNonlinearFunction_PositiveSemidefiniteConeTriangle          |                        0     1.8s
  test_basic_VectorNonlinearFunction_PowerCone                                 |                        0     1.8s
  test_basic_VectorNonlinearFunction_RelativeEntropyCone                       |                        0     1.9s
  test_basic_VectorNonlinearFunction_RootDetConeSquare                         |                        0     2.0s
  test_basic_VectorNonlinearFunction_RootDetConeTriangle                       |                        0     1.8s
  test_basic_VectorNonlinearFunction_RotatedSecondOrderCone                    |                        0     1.9s
  test_basic_VectorNonlinearFunction_SOS1                                      |                        0     1.8s
  test_basic_VectorNonlinearFunction_SOS2                                      |                        0     1.8s
  test_basic_VectorNonlinearFunction_ScaledPositiveSemidefiniteConeTriangle    |                        0     1.7s
  test_basic_VectorNonlinearFunction_SecondOrderCone                           |                        0     1.9s
  test_basic_VectorNonlinearFunction_Table                                     |                        0     1.8s
  test_basic_VectorNonlinearFunction_VectorNonlinearOracle                     |                        0     2.0s
  test_basic_VectorNonlinearFunction_Zeros                                     |                        0     1.9s
  test_basic_VectorOfVariables_AllDifferent                                    |                        0     1.6s
  test_basic_VectorOfVariables_BinPacking                                      |                        0     1.7s
  test_basic_VectorOfVariables_Circuit                                         |                        0     1.7s
  test_basic_VectorOfVariables_Complements                                     |                        0     1.6s
  test_basic_VectorOfVariables_CountAtLeast                                    |                        0     1.9s
  test_basic_VectorOfVariables_CountBelongs                                    |                        0     1.7s
  test_basic_VectorOfVariables_CountDistinct                                   |                        0     1.7s
  test_basic_VectorOfVariables_CountGreaterThan                                |                        0     1.6s
  test_basic_VectorOfVariables_Cumulative                                      |                        0     1.7s
  test_basic_VectorOfVariables_DualExponentialCone                             |                        0     1.6s
  test_basic_VectorOfVariables_DualPowerCone                                   |                        0     1.6s
  test_basic_VectorOfVariables_ExponentialCone                                 |                        0     1.7s
  test_basic_VectorOfVariables_GeometricMeanCone                               |                        0     1.6s
  test_basic_VectorOfVariables_HermitianPositiveSemidefiniteConeTriangle       |                        0     1.8s
  test_basic_VectorOfVariables_HyperRectangle                                  |   20                  20     2.2s
  test_basic_VectorOfVariables_LogDetConeSquare                                |                        0     1.7s
  test_basic_VectorOfVariables_LogDetConeTriangle                              |                        0     1.7s
  test_basic_VectorOfVariables_Nonnegatives                                    |   20                  20     1.6s
  test_basic_VectorOfVariables_Nonpositives                                    |   20                  20     2.1s
  test_basic_VectorOfVariables_NormCone                                        |                        0     1.7s
  test_basic_VectorOfVariables_NormInfinityCone                                |   20                  20     2.2s
  test_basic_VectorOfVariables_NormNuclearCone                                 |                        0     1.4s
  test_basic_VectorOfVariables_NormOneCone                                     |   20                  20     2.5s
  test_basic_VectorOfVariables_NormSpectralCone                                |                        0     1.4s
  test_basic_VectorOfVariables_Path                                            |                        0     1.6s
  test_basic_VectorOfVariables_PositiveSemidefiniteConeSquare                  |                        0     1.5s
  test_basic_VectorOfVariables_PositiveSemidefiniteConeTriangle                |                        0     0.8s
  test_basic_VectorOfVariables_PowerCone                                       |                        0     1.7s
  test_basic_VectorOfVariables_RelativeEntropyCone                             |                        0     1.6s
  test_basic_VectorOfVariables_RootDetConeSquare                               |                        0     1.6s
  test_basic_VectorOfVariables_RootDetConeTriangle                             |                        0     1.6s
  test_basic_VectorOfVariables_RotatedSecondOrderCone                          |                        0     1.8s
  test_basic_VectorOfVariables_SOS1                                            |                        0     1.6s
  test_basic_VectorOfVariables_SOS2                                            |                        0     1.7s
  test_basic_VectorOfVariables_ScaledPositiveSemidefiniteConeTriangle          |                        0     1.6s
  test_basic_VectorOfVariables_SecondOrderCone                                 |                        0     1.6s
  test_basic_VectorOfVariables_Table                                           |                        0     1.8s
  test_basic_VectorOfVariables_VectorNonlinearOracle                           |                        0     1.2s
  test_basic_VectorOfVariables_Zeros                                           |   20                  20     2.0s
  test_basic_VectorQuadraticFunction_AllDifferent                              |                        0     2.2s
  test_basic_VectorQuadraticFunction_BinPacking                                |                        0     2.0s
  test_basic_VectorQuadraticFunction_Circuit                                   |                        0     1.9s
  test_basic_VectorQuadraticFunction_Complements                               |                        0     1.9s
  test_basic_VectorQuadraticFunction_CountAtLeast                              |                        0     2.7s
  test_basic_VectorQuadraticFunction_CountBelongs                              |                        0     1.9s
  test_basic_VectorQuadraticFunction_CountDistinct                             |                        0     1.9s
  test_basic_VectorQuadraticFunction_CountGreaterThan                          |                        0     1.9s
  test_basic_VectorQuadraticFunction_Cumulative                                |                        0     1.9s
  test_basic_VectorQuadraticFunction_DualExponentialCone                       |                        0     2.1s
  test_basic_VectorQuadraticFunction_DualPowerCone                             |                        0     1.9s
  test_basic_VectorQuadraticFunction_ExponentialCone                           |                        0     1.8s
  test_basic_VectorQuadraticFunction_GeometricMeanCone                         |                        0     1.8s
  test_basic_VectorQuadraticFunction_HermitianPositiveSemidefiniteConeTriangle |                        0     1.9s
  test_basic_VectorQuadraticFunction_HyperRectangle                            |                        0     1.9s
  test_basic_VectorQuadraticFunction_LogDetConeSquare                          |                        0     1.9s
  test_basic_VectorQuadraticFunction_LogDetConeTriangle                        |                        0     1.9s
  test_basic_VectorQuadraticFunction_Nonnegatives                              |                        0     2.0s
  test_basic_VectorQuadraticFunction_Nonpositives                              |                        0     1.9s
  test_basic_VectorQuadraticFunction_NormCone                                  |                        0     1.9s
  test_basic_VectorQuadraticFunction_NormInfinityCone                          |                        0     1.9s
  test_basic_VectorQuadraticFunction_NormNuclearCone                           |                        0     2.1s
  test_basic_VectorQuadraticFunction_NormOneCone                               |                        0     1.9s
  test_basic_VectorQuadraticFunction_NormSpectralCone                          |                        0     1.9s
  test_basic_VectorQuadraticFunction_Path                                      |                        0     2.1s
  test_basic_VectorQuadraticFunction_PositiveSemidefiniteConeSquare            |                        0     1.8s
  test_basic_VectorQuadraticFunction_PositiveSemidefiniteConeTriangle          |                        0     1.8s
  test_basic_VectorQuadraticFunction_PowerCone                                 |                        0     1.8s
  test_basic_VectorQuadraticFunction_RelativeEntropyCone                       |                        0     2.0s
  test_basic_VectorQuadraticFunction_RootDetConeSquare                         |                        0     1.9s
  test_basic_VectorQuadraticFunction_RootDetConeTriangle                       |                        0     1.9s
  test_basic_VectorQuadraticFunction_RotatedSecondOrderCone                    |                        0     1.9s
  test_basic_VectorQuadraticFunction_SOS1                                      |                        0     2.1s
  test_basic_VectorQuadraticFunction_SOS2                                      |                        0     2.0s
  test_basic_VectorQuadraticFunction_ScaledPositiveSemidefiniteConeTriangle    |                        0     1.9s
  test_basic_VectorQuadraticFunction_SecondOrderCone                           |                        0     1.9s
  test_basic_VectorQuadraticFunction_Table                                     |                        0     2.0s
  test_basic_VectorQuadraticFunction_VectorNonlinearOracle                     |                        0     2.1s
  test_basic_VectorQuadraticFunction_Zeros                                     |                        0     1.9s
  test_conic_DualExponentialCone_VectorAffineFunction                          |                        0     1.4s
  test_conic_DualExponentialCone_VectorOfVariables                             |                        0     0.0s
  test_conic_DualPowerCone_VectorAffineFunction                                |                        0     0.9s
  test_conic_DualPowerCone_VectorOfVariables                                   |                        0     0.0s
  test_conic_Exponential_VectorAffineFunction                                  |                        0     0.7s
  test_conic_Exponential_VectorOfVariables                                     |                        0     0.0s
  test_conic_Exponential_hard                                                  |                        0     0.7s
  test_conic_Exponential_hard_2                                                |                        0     0.9s
  test_conic_GeometricMeanCone_VectorAffineFunction                            |                        0     0.8s
  test_conic_GeometricMeanCone_VectorAffineFunction_2                          |                        0     0.5s
  test_conic_GeometricMeanCone_VectorAffineFunction_3                          |                        0     0.2s
  test_conic_GeometricMeanCone_VectorOfVariables                               |                        0     0.0s
  test_conic_GeometricMeanCone_VectorOfVariables_2                             |                        0     0.0s
  test_conic_GeometricMeanCone_VectorOfVariables_3                             |                        0     0.0s
  test_conic_HermitianPositiveSemidefiniteConeTriangle_1                       |                        0     1.0s
  test_conic_HermitianPositiveSemidefiniteConeTriangle_2                       |                        0     0.2s
  test_conic_LogDetConeSquare                                                  |                        0     0.4s
  test_conic_LogDetConeSquare_VectorAffineFunction                             |                        0     1.1s
  test_conic_LogDetConeSquare_VectorOfVariables                                |                        0     0.0s
  test_conic_LogDetConeTriangle                                                |                        0     0.3s
  test_conic_LogDetConeTriangle_VectorAffineFunction                           |                        0     0.7s
  test_conic_LogDetConeTriangle_VectorOfVariables                              |                        0     0.0s
  test_conic_NormCone                                                          |                        0     0.2s
  test_conic_NormInfinityCone_3                                                |    6     5      5     16     3.2s
  test_conic_NormInfinityCone_INFEASIBLE                                       |    4     2             6     0.2s
  test_conic_NormInfinityCone_VectorAffineFunction                             |    6            1      7     1.2s
  test_conic_NormInfinityCone_VectorOfVariables                                |    6            1      7     0.0s
  test_conic_NormNuclearCone                                                   |                        0     0.3s
  test_conic_NormNuclearCone_2                                                 |                        0     0.2s
  test_conic_NormOneCone                                                       |    6     5      6     17     0.7s
  test_conic_NormOneCone_INFEASIBLE                                            |    4     2             6     0.1s
  test_conic_NormOneCone_VectorAffineFunction                                  |    6            1      7     0.7s
  test_conic_NormOneCone_VectorOfVariables                                     |    6            1      7     0.0s
  test_conic_NormSpectralCone                                                  |                        0     0.3s
  test_conic_NormSpectralCone_2                                                |                        0     0.2s
  test_conic_PositiveSemidefiniteConeSquare_3                                  |                        0     0.4s
  test_conic_PositiveSemidefiniteConeSquare_VectorAffineFunction               |                        0     0.5s
  test_conic_PositiveSemidefiniteConeSquare_VectorAffineFunction_2             |                        0     0.9s
  test_conic_PositiveSemidefiniteConeSquare_VectorOfVariables                  |                        0     0.0s
  test_conic_PositiveSemidefiniteConeSquare_VectorOfVariables_2                |                        0     0.0s
  test_conic_PositiveSemidefiniteConeTriangle                                  |                        0     0.9s
  test_conic_PositiveSemidefiniteConeTriangle_3                                |                        0     0.2s
  test_conic_PositiveSemidefiniteConeTriangle_4                                |                        0     0.5s
  test_conic_PositiveSemidefiniteConeTriangle_VectorAffineFunction             |                        0     0.5s
  test_conic_PositiveSemidefiniteConeTriangle_VectorAffineFunction_2           |                        0     0.6s
  test_conic_PositiveSemidefiniteConeTriangle_VectorOfVariables                |                        0     0.0s
  test_conic_PositiveSemidefiniteConeTriangle_VectorOfVariables_2              |                        0     0.0s
  test_conic_PowerCone_VectorAffineFunction                                    |                        0     0.6s
  test_conic_PowerCone_VectorOfVariables                                       |                        0     0.0s
  test_conic_RelativeEntropyCone                                               |                        0     0.3s
  test_conic_RootDetConeSquare                                                 |                        0     0.4s
  test_conic_RootDetConeSquare_VectorAffineFunction                            |                        0     0.6s
  test_conic_RootDetConeSquare_VectorOfVariables                               |                        0     0.0s
  test_conic_RootDetConeTriangle                                               |                        0     0.3s
  test_conic_RootDetConeTriangle_VectorAffineFunction                          |                        0     0.6s
  test_conic_RootDetConeTriangle_VectorOfVariables                             |                        0     0.0s
  test_conic_RotatedSecondOrderCone_INFEASIBLE                                 |                        0     0.9s
  test_conic_RotatedSecondOrderCone_INFEASIBLE_2                               |                        0     1.5s
  test_conic_RotatedSecondOrderCone_VectorAffineFunction                       |                        0     0.7s
  test_conic_RotatedSecondOrderCone_VectorOfVariables                          |                        0     0.0s
  test_conic_RotatedSecondOrderCone_out_of_order                               |                        0     0.3s
  test_conic_ScaledPositiveSemidefiniteConeTriangle_VectorAffineFunction       |                        0     0.4s
  test_conic_SecondOrderCone_INFEASIBLE                                        |                        0     0.1s
  test_conic_SecondOrderCone_Nonnegatives                                      |                        0     0.4s
  test_conic_SecondOrderCone_Nonpositives                                      |                        0     0.0s
  test_conic_SecondOrderCone_VectorAffineFunction                              |                        0     0.5s
  test_conic_SecondOrderCone_VectorOfVariables                                 |                        0     0.0s
  test_conic_SecondOrderCone_negative_initial_bound                            |                        0     0.2s
  test_conic_SecondOrderCone_negative_post_bound                               |                        0     0.1s
  test_conic_SecondOrderCone_negative_post_bound_2                             |                        0     0.1s
  test_conic_SecondOrderCone_negative_post_bound_3                             |                        0     0.1s
  test_conic_SecondOrderCone_no_initial_bound                                  |                        0     0.1s
  test_conic_SecondOrderCone_nonnegative_initial_bound                         |                        0     0.1s
  test_conic_SecondOrderCone_nonnegative_post_bound                            |                        0     0.1s
  test_conic_SecondOrderCone_out_of_order                                      |                        0     0.3s
  test_conic_empty_matrix                                                      |                        0     0.0s
  test_conic_linear_INFEASIBLE                                                 |    3     1             4     0.2s
  test_conic_linear_INFEASIBLE_2                                               |    3     1             4     0.3s
  test_conic_linear_VectorAffineFunction                                       |    7            1      8     0.4s
  test_conic_linear_VectorAffineFunction_2                                     |    7            1      8     1.2s
  test_conic_linear_VectorOfVariables                                          |    7     5      5     17     0.8s
  test_conic_linear_VectorOfVariables_2                                        |    7     5     12     24     0.9s
  test_constraint_ConstraintDualStart                                          |                        0     0.5s
  test_constraint_ConstraintPrimalStart                                        |                        0     0.4s
  test_constraint_Indicator_ACTIVATE_ON_ONE                                    |                        0     0.5s
  test_constraint_Indicator_ACTIVATE_ON_ZERO                                   |                        0     0.5s
  test_constraint_Indicator_ConstraintName                                     |                        0     0.0s
  test_constraint_PrimalStart_DualStart_SecondOrderCone                        |                        0     0.5s
  test_constraint_ScalarAffineFunction_EqualTo                                 |          5      3      8     0.3s
  test_constraint_ScalarAffineFunction_GreaterThan                             |          5      3      8     0.3s
  test_constraint_ScalarAffineFunction_Interval                                |          5      3      8     0.7s
  test_constraint_ScalarAffineFunction_LessThan                                |          5      3      8     0.3s
  test_constraint_ScalarAffineFunction_duplicate                               |          5      3      8     0.2s
  test_constraint_VectorAffineFunction_duplicate                               |          5      3      8     0.5s
  test_constraint_ZeroOne_bounds                                               |                        0     0.1s
  test_constraint_ZeroOne_bounds_2                                             |                        0     0.0s
  test_constraint_ZeroOne_bounds_3                                             |                        0     0.0s
  test_constraint_get_ConstraintIndex                                          |    7                   7     0.4s
  test_constraint_qcp_duplicate_diagonal                                       |                        0     0.1s
  test_constraint_qcp_duplicate_off_diagonal                                   |                        0     0.2s
  test_cpsat_AllDifferent                                                      |                        0     0.3s
  test_cpsat_BinPacking                                                        |                        0     0.2s
  test_cpsat_Circuit                                                           |                        0     0.1s
  test_cpsat_CountAtLeast                                                      |                        0     0.1s
  test_cpsat_CountBelongs                                                      |                        0     0.1s
  test_cpsat_CountDistinct                                                     |                        0     0.1s
  test_cpsat_CountGreaterThan                                                  |                        0     0.1s
  test_cpsat_Cumulative                                                        |                        0     0.4s
  test_cpsat_Path                                                              |                        0     0.2s
  test_cpsat_ReifiedAllDifferent                                               |                        0     1.2s
  test_cpsat_Table                                                             |                        0     0.1s
  test_infeasible_MAX_SENSE                                                    |                        0     0.1s
  test_infeasible_MAX_SENSE_offset                                             |                        0     0.1s
  test_infeasible_MIN_SENSE                                                    |                        0     0.1s
  test_infeasible_MIN_SENSE_offset                                             |                        0     0.1s
  test_infeasible_affine_MAX_SENSE                                             |                        0     0.1s
  test_linear_DUAL_INFEASIBLE                                                  |    3            1      4     0.2s
  test_linear_DUAL_INFEASIBLE_2                                                |    3            1      4     0.2s
  test_linear_FEASIBILITY_SENSE                                                |    3     2      1      6     0.3s
  test_linear_HyperRectangle_VectorAffineFunction                              |                 2      2     0.1s
  test_linear_HyperRectangle_VectorOfVariables                                 |                 2      2     0.3s
  test_linear_INFEASIBLE                                                       |    3     1             4     0.2s
  test_linear_INFEASIBLE_2                                                     |    3     1             4     0.2s
  test_linear_Indicator_ON_ONE                                                 |                        0     0.1s
  test_linear_Indicator_ON_ZERO                                                |                        0     0.4s
  test_linear_Indicator_constant_term                                          |                        0     0.2s
  test_linear_Indicator_integration                                            |                        0     0.2s
  test_linear_Interval_inactive                                                |    5     3      4     12     0.7s
  test_linear_LessThan_and_GreaterThan                                         |    1            1      2     0.3s
  test_linear_SOS1_integration                                                 |                        0     0.3s
  test_linear_SOS2_integration                                                 |                        0     0.4s
  test_linear_Semicontinuous_integration                                       |                        0     0.8s
  test_linear_Semiinteger_integration                                          |                        0     0.0s
  test_linear_VariablePrimalStart_partial                                      |          3      2      5     0.3s
  test_linear_VectorAffineFunction                                             |    1            1      2     0.5s
  test_linear_VectorAffineFunction_empty_row                                   |    1            1      2     0.2s
  test_linear_add_constraints                                                  |    3     3      2      8     0.4s
  test_linear_complex_Zeros                                                    |    1     1      5      7     1.8s
  test_linear_complex_Zeros_duplicate                                          |    1     1      5      7     0.3s
  test_linear_inactive_bounds                                                  |   13     5      2     20     0.5s
  test_linear_integer_integration                                              |                        0     0.4s
  test_linear_integer_knapsack                                                 |                        0     0.4s
  test_linear_integer_solve_twice                                              |                        0     0.3s
  test_linear_integration                                                      |   38    28     20     86     4.4s
  test_linear_integration_2                                                    |    7     5      6     18     0.6s
  test_linear_integration_Interval                                             |    7    18      7     32     1.1s
  test_linear_integration_modification                                         |    6    12      4     22     1.3s
  test_linear_modify_GreaterThan_and_LessThan_constraints                      |    5            1      6     0.5s
  test_linear_transform                                                        |    4     6            10     0.3s
  test_model_ListOfConstraintAttributesSet                                     |    2                   2     0.1s
  test_model_ListOfConstraintsWithAttributeSet                                 |    1                   1     0.2s
  test_model_ListOfVariablesWithAttributeSet                                   |    1                   1     0.1s
  test_model_LowerBoundAlreadySet                                              |    4                   4     0.1s
  test_model_ModelFilter_AbstractConstraintAttribute                           |                        0     1.2s
  test_model_ModelFilter_AbstractModelAttribute                                |    1                   1     0.4s
  test_model_ModelFilter_AbstractVariableAttribute                             |                        0     0.3s
  test_model_ModelFilter_ListOfConstraintIndices                               |   10                  10     0.6s
  test_model_ModelFilter_ListOfConstraintTypesPresent                          |    3                   3     0.5s
  test_model_Name                                                              |    7                   7     0.1s
  test_model_Name_VariableName_ConstraintName                                  |   72                  72     2.7s
  test_model_ScalarAffineFunction_ConstraintName                               |    5                   5     0.1s
  test_model_ScalarFunctionConstantNotZero                                     |    2                   2     0.1s
  test_model_UpperBoundAlreadySet                                              |    4                   4     0.1s
  test_model_VariableIndex_ConstraintName                                      |    1                   1     0.0s
  test_model_VariableName                                                      |    6                   6     0.1s
  test_model_VariablePrimalStart                                               |                        0     0.1s
  test_model_add_constrained_variable_tuple                                    |    6                   6     0.1s
  test_model_copy_to_UnsupportedAttribute                                      |    6                   6     2.1s
  test_model_copy_to_UnsupportedConstraint                                     |    2                   2     1.0s
  test_model_default_DualStatus                                                |    1                   1     0.0s
  test_model_default_ObjectiveSense                                            |    1                   1     0.0s
  test_model_default_PrimalStatus                                              |    1                   1     0.0s
  test_model_default_TerminationStatus                                         |    1                   1     0.0s
  test_model_delete                                                            |   64                  64     1.6s
  test_model_duplicate_ScalarAffineFunction_ConstraintName                     |    6                   6     0.1s
  test_model_duplicate_VariableName                                            |    6                   6     0.1s
  test_model_empty                                                             |    3                   3     0.0s
  test_model_is_valid                                                          |    9                   9     0.6s
  test_model_ordered_indices                                                   |   12                  12     0.1s
  test_model_show                                                              |    1                   1     1.0s
  test_model_supports_constraint_ScalarAffineFunction_EqualTo                  |    1                   1     0.0s
  test_model_supports_constraint_VariableIndex_EqualTo                         |    2                   2     0.3s
  test_model_supports_constraint_VectorOfVariables_Nonnegatives                |    2                   2     0.2s
  test_modification_affine_deletion_edge_cases                                 |                 1      1     0.3s
  test_modification_coef_scalaraffine_lessthan                                 |         10      6     16     0.3s
  test_modification_const_vectoraffine_nonpos                                  |                 1      1     0.1s
  test_modification_const_vectoraffine_zeros                                   |                 1      1     0.3s
  test_modification_constraint_scalarquadraticcoefficientchange                |                        0     0.5s
  test_modification_func_scalaraffine_lessthan                                 |    1     9      5     15     0.5s
  test_modification_func_vectoraffine_nonneg                                   |                 1      1     0.3s
  test_modification_incorrect                                                  |    2                   2     0.1s
  test_modification_incorrect_VariableIndex                                    |    3                   3     0.1s
  test_modification_mathoptinterface_issue_2452                                |    3                   3     0.2s
  test_modification_multirow_vectoraffine_nonpos                               |          8      4     12     0.6s
  test_modification_objective_scalarquadraticcoefficientchange                 |                        0     0.7s
  test_modification_set_function_single_variable                               |    1                   1     0.0s
  test_modification_set_scalaraffine_lessthan                                  |    1    10      6     17     0.6s
  test_multiobjective_vector_affine_function                                   |                        0     0.4s
  test_multiobjective_vector_affine_function_delete                            |                        0     0.1s
  test_multiobjective_vector_affine_function_delete_vector                     |                        0     0.1s
  test_multiobjective_vector_affine_function_modify                            |                        0     0.2s
  test_multiobjective_vector_nonlinear                                         |                        0     0.4s
  test_multiobjective_vector_nonlinear_delete                                  |                        0     0.1s
  test_multiobjective_vector_nonlinear_delete_vector                           |                        0     0.1s
  test_multiobjective_vector_nonlinear_modify                                  |                        0     0.2s
  test_multiobjective_vector_of_variables                                      |                        0     0.0s
  test_multiobjective_vector_of_variables_delete                               |                        0     0.0s
  test_multiobjective_vector_of_variables_delete_all                           |                        0     0.1s
  test_multiobjective_vector_of_variables_delete_vector                        |                        0     0.1s
  test_multiobjective_vector_quadratic_function                                |                        0     0.7s
  test_multiobjective_vector_quadratic_function_delete                         |                        0     0.3s
  test_multiobjective_vector_quadratic_function_delete_vector                  |                        0     0.1s
  test_multiobjective_vector_quadratic_function_modify                         |                        0     0.2s
  test_nonlinear_Feasibility_internal                                          |    9                   9     0.2s
  test_nonlinear_HS071_internal                                                |   11                  11     0.3s
  test_nonlinear_InvalidEvaluator_internal                                     |    3                   3     0.1s
  test_nonlinear_constraint_log                                                |                        0     0.1s
  test_nonlinear_constraint_scalar_affine_function                             |                        0     0.1s
  test_nonlinear_constraint_uminus                                             |                        0     0.0s
  test_nonlinear_duals                                                         |                        0     3.0s
  test_nonlinear_expression_hs071                                              |                        0     0.1s
  test_nonlinear_expression_hs071_epigraph                                     |                        0     0.1s
  test_nonlinear_expression_hs109                                              |                        0     0.1s
  test_nonlinear_expression_hs110                                              |                        0     0.1s
  test_nonlinear_expression_multivariate_function                              |                        0     0.2s
  test_nonlinear_expression_overrides_objective                                |                        0     0.1s
  test_nonlinear_expression_quartic                                            |                        0     0.1s
  test_nonlinear_expression_univariate_function                                |                        0     0.1s
  test_nonlinear_hs071                                                         |                        0     0.4s
  test_nonlinear_hs071_NLPBlockDual                                            |                        0     0.3s
  test_nonlinear_hs071_hessian_vector_product                                  |                        0     0.0s
  test_nonlinear_hs071_no_hessian                                              |                        0     0.0s
  test_nonlinear_invalid                                                       |                        0     0.0s
  test_nonlinear_mixed_complementarity                                         |                        0     0.2s
  test_nonlinear_objective                                                     |                        0     0.1s
  test_nonlinear_objective_and_moi_objective_test                              |                        0     0.1s
  test_nonlinear_qp_complementarity_constraint                                 |                        0     0.3s
  test_nonlinear_quadratic_1                                                   |                        0     0.1s
  test_nonlinear_quadratic_2                                                   |                        0     0.1s
  test_nonlinear_quadratic_3                                                   |                        0     0.1s
  test_nonlinear_quadratic_4                                                   |                        0     0.1s
  test_nonlinear_vector_complements                                            |                        0     0.3s
  test_nonlinear_with_scalar_quadratic_function_with_off_diag                  |                        0     0.1s
  test_nonlinear_without_objective                                             |                        0     0.1s
  test_objective_ObjectiveSense_FEASIBILITY_SENSE                              |    1                   1     0.0s
  test_objective_ObjectiveSense_MAX_SENSE                                      |    1                   1     0.0s
  test_objective_ObjectiveSense_MIN_SENSE                                      |    1                   1     0.0s
  test_objective_ObjectiveSense_in_ListOfModelAttributesSet                    |    2                   2     0.0s
  test_objective_ScalarAffineFunction_in_ListOfModelAttributesSet              |    2                   2     0.0s
  test_objective_ScalarQuadraticFunction_in_ListOfModelAttributesSet           |                        0     0.1s
  test_objective_VariableIndex_in_ListOfModelAttributesSet                     |    2                   2     0.0s
  test_objective_get_ObjectiveFunction_ScalarAffineFunction                    |    5                   5     0.1s
  test_objective_qp_ObjectiveFunction_edge_cases                               |                        0     0.2s
  test_objective_qp_ObjectiveFunction_zero_ofdiag                              |                        0     0.1s
  test_objective_set_via_modify                                                |    2                   2     0.1s
  test_quadratic_Integer_SecondOrderCone                                       |                        0     0.2s
  test_quadratic_SecondOrderCone_basic                                         |                        0     0.4s
  test_quadratic_constraint_GreaterThan                                        |                        0     0.7s
  test_quadratic_constraint_LessThan                                           |                        0     0.0s
  test_quadratic_constraint_basic                                              |                        0     0.1s
  test_quadratic_constraint_integration                                        |                        0     0.3s
  test_quadratic_constraint_minimize                                           |                        0     0.1s
  test_quadratic_duplicate_terms                                               |                        0     0.8s
  test_quadratic_integration                                                   |                        0     0.3s
  test_quadratic_nonconvex_constraint_basic                                    |                        0     0.3s
  test_quadratic_nonconvex_constraint_integration                              |                        0     0.2s
  test_quadratic_nonhomogeneous                                                |                        0     0.4s
  test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_EqualTo_lower                |          1             1     0.2s
  test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_EqualTo_upper                |          1             1     0.1s
  test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_GreaterThan                  |          1             1     0.1s
  test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_Interval_lower               |          1             1     0.1s
  test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_Interval_upper               |          1             1     0.1s
  test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_LessThan                     |          1             1     0.1s
  test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_VariableIndex_LessThan       |          1             1     0.1s
  test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_VariableIndex_LessThan_max   |          1             1     0.1s
  test_solve_ObjectiveBound_MAX_SENSE_IP                                       |                        0     0.0s
  test_solve_ObjectiveBound_MAX_SENSE_LP                                       |                        0     0.0s
  test_solve_ObjectiveBound_MIN_SENSE_IP                                       |                        0     0.0s
  test_solve_ObjectiveBound_MIN_SENSE_LP                                       |                        0     0.0s
  test_solve_SOS2_add_and_delete                                               |                        0     0.5s
  test_solve_conflict_EqualTo                                                  |                        0     0.2s
  test_solve_conflict_NOT_IN_CONFLICT                                          |                        0     0.1s
  test_solve_conflict_affine_affine                                            |                        0     0.1s
  test_solve_conflict_bound_bound                                              |                        0     0.0s
  test_solve_conflict_feasible                                                 |                        0     0.0s
  test_solve_conflict_invalid_interval                                         |                        0     0.0s
  test_solve_conflict_two_affine                                               |                        0     0.0s
  test_solve_conflict_zeroone                                                  |                        0     0.0s
  test_solve_conflict_zeroone_2                                                |                        0     0.0s
  test_unbounded_MAX_SENSE                                                     |                        0     0.1s
  test_unbounded_MAX_SENSE_offset                                              |                        0     0.1s
  test_unbounded_MIN_SENSE                                                     |                        0     0.1s
  test_unbounded_MIN_SENSE_offset                                              |                        0     0.1s
  test_variable_VariableName                                                   |    4                   4     0.0s
  test_variable_add_variable                                                   |    3                   3     0.0s
  test_variable_add_variables                                                  |    2                   2     0.0s
  test_variable_delete                                                         |    3                   3     0.0s
  test_variable_delete_Nonnegatives                                            |   13                  13     0.3s
  test_variable_delete_Nonnegatives_row                                        |   12                  12     0.2s
  test_variable_delete_SecondOrderCone                                         |                        0     0.1s
  test_variable_delete_variables                                               |    9                   9     0.1s
  test_variable_get_VariableIndex                                              |    2                   2     0.0s
  test_variable_solve_Integer_with_lower_bound                                 |                        0     0.1s
  test_variable_solve_Integer_with_upper_bound                                 |                        0     0.0s
  test_variable_solve_ZeroOne_with_0_upper_bound                               |                        0     0.0s
  test_variable_solve_ZeroOne_with_1_lower_bound                               |                        0     0.0s
  test_variable_solve_ZeroOne_with_bounds_then_delete                          |                        0     0.0s
  test_variable_solve_ZeroOne_with_upper_bound                                 |                        0     0.0s
  test_vector_nonlinear_oracle                                                 |                        0     0.5s
  test_vector_nonlinear_oracle_no_hessian                                      |                        0     0.2s
RNG of the outermost testset: Random.Xoshiro(0x736ba6975498c45d, 0x37520585ba5d170c, 0xd0ff0d079956ee04, 0x8a0978648d4993a1, 0xf49f430e5f65b8fc)
ERROR: LoadError: Some tests did not pass: 1000 passed, 192 failed, 145 errored, 0 broken.
in expression starting at /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:89
in expression starting at /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/runtests.jl:346

@ZedongPeng ZedongPeng requested a review from blegat December 15, 2025 07:34
@ZedongPeng ZedongPeng changed the title [WIP] MOI test run all (some failed) [WIP] MOI wrapper test (some failed) Dec 15, 2025

using cuPDLPx_jll
# TODO: I have to add this in my local environment. This might be a issue in JLL.
const libcupdlpx = "/home/zdpeng/.julia/artifacts/4d407e51174c3bfe2f138e6e1db2531d0bc6240d/lib/libcupdlpx.so"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I actually had the same issue and it prevented me to run it locally, for me, it seems to be because I have CUDA v13.0

$ nvidia-smi
Thu Dec 18 08:27:35 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.105.08             Driver Version: 580.105.08     CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
julia> CUDA.versioninfo()
CUDA toolchain: 
- runtime 13.0, artifact installation
- driver 580.105.8 for 13.0
- compiler 13.1

and cuPDLPx is only available on CUDA up to v12.9:
https://github.com/JuliaBinaryWrappers/cuPDLPx_jll.jl/tree/main/src/wrappers
The issue seems to be this line:
https://github.com/JuliaPackaging/Yggdrasil/blob/96df50e83da84ec3a4c48b4d9360abaa9c5a843d/C/cuPDLPx/build_tarballs.jl#L51
If you can run it locally and show me test errors here I can help. Otherwise, if the jll is fixed for CUDA v13 then I will be able to run the tests locally and it should be more efficient

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! I’ll update build_tarballs.jl to add CUDA 13 support.
For the const libcupdlpx = "/home/zdpeng/.julia/artifacts/..." workaround: I asked Gemini and it suggested changing LibraryProduct("libcupdlpx", :libcupdlpx), to LibraryProduct("cupdlpx", :libcupdlpx), in build_tarballs.jl.
Do you think that makes sense here?

Reference: https://github.com/JuliaPackaging/Yggdrasil/blob/96df50e83da84ec3a4c48b4d9360abaa9c5a843d/C/cuPDLPx/build_tarballs.jl#L47

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have updated cuPDLPx_jll to v0.1.5, which should support CUDA 13 now.

@ZedongPeng
Copy link
Collaborator Author

Hi @blegat . I updated runtests.jl, which works right now. However, the following error will be reported in MOI_wrapper.jl. It looks like that default parameters are not set.

test_DualObjectiveValue_Max_ScalarAffine_LessThan: Error During Test at /home/zdpeng/.julia/packages/MathOptInterface/03Qtw/src/Test/Test.jl:264
  Got exception outside of a @test
  DivideError: integer division error
  Stacktrace:
    [1] solve_lp_problem
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/src/LibcuPDLPx.jl:170 [inlined]
    [2] optimize!(dest::cuPDLPx.Optimizer, src::cuPDLPx.OptimizerCache)
      @ cuPDLPx /orcd/home/002/zdpeng/github/cuPDLPx.jl/src/MOI_wrapper.jl:231
    [3] optimize!
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/src/MOI_wrapper.jl:242 [inlined]
    [4] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{cuPDLPx.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}})
      @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/03Qtw/src/Utilities/cachingoptimizer.jl:370
    [5] optimize!
      @ ~/.julia/packages/MathOptInterface/03Qtw/src/Bridges/bridge_optimizer.jl:367 [inlined]
    [6] test_DualObjectiveValue_Max_ScalarAffine_LessThan(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{cuPDLPx.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, config::MathOptInterface.Test.Config{Float64})
      @ MathOptInterface.Test ~/.julia/packages/MathOptInterface/03Qtw/src/Test/test_solve.jl:2013
    [7] macro expansion
      @ ~/.julia/packages/MathOptInterface/03Qtw/src/Test/Test.jl:270 [inlined]
    [8] macro expansion
      @ /orcd/home/002/zdpeng/.julia/juliaup/julia-1.12.2+0.x64.linux.gnu/share/julia/stdlib/v1.12/Test/src/Test.jl:1776 [inlined]
    [9] runtests(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{cuPDLPx.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, config::MathOptInterface.Test.Config{Float64}; include::Vector{String}, exclude::Vector{Regex}, warn_unsupported::Bool, verbose::Bool, exclude_tests_after::VersionNumber, test_module::Module)
      @ MathOptInterface.Test ~/.julia/packages/MathOptInterface/03Qtw/src/Test/Test.jl:265
   [10] runtests
      @ ~/.julia/packages/MathOptInterface/03Qtw/src/Test/Test.jl:223 [inlined]
   [11] test_runtests()
      @ Main.TestMOI /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:29
   [12] macro expansion
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:80 [inlined]
   [13] macro expansion
      @ /orcd/home/002/zdpeng/.julia/juliaup/julia-1.12.2+0.x64.linux.gnu/share/julia/stdlib/v1.12/Test/src/Test.jl:1776 [inlined]
   [14] runtests()
      @ Main.TestMOI /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:80
   [15] top-level scope
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:89
   [16] include(mapexpr::Function, mod::Module, _path::String)
      @ Base ./Base.jl:307
   [17] top-level scope
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/runtests.jl:254
   [18] include(mapexpr::Function, mod::Module, _path::String)
      @ Base ./Base.jl:307
   [19] top-level scope
      @ none:6
   [20] eval(m::Module, e::Any)
      @ Core ./boot.jl:489
   [21] exec_options(opts::Base.JLOptions)
      @ Base ./client.jl:283
   [22] _start()
      @ Base ./client.jl:550
---------------------------------------------------------------------------------------
                                    cuPDLPx v0.1.5                                    
                        A GPU-Accelerated First-Order LP Solver                        
               (c) Haihao Lu, Massachusetts Institute of Technology, 2025              
---------------------------------------------------------------------------------------
problem:
  variables     : 1
  constraints   : 1
  nonzeros(A)   : 1
settings:
  iter_limit         : 247049344
  time_limit         : 0.00 sec
  eps_opt            : 5.9e-316
  eps_feas           : 1.1e-310
  eps_infeas_detect  : 3.0e-323
  l_inf_ruiz_iter    : 0
  pock_chambolle_alpha : 1.1e-310
  has_pock_chambolle_alpha : off
  bound_obj_rescaling : on
  sv_max_iter        : 256
  sv_tol             : 1.1e-310
  evaluation_freq    : 0
  feasibility_polishing : on
  eps_feas_polish_relative : 1.1e-310
---------------------------------------------------------------------------------------
   runtime     |     objective      |   absolute residuals    |   relative residuals    
  iter   time  |  pr obj    du obj  |  pr res  du res   gap   |  pr res  du res   gap   
---------------------------------------------------------------------------------------
     0 1.4e-04 |  0.0e+00   0.0e+00 | 2.0e+00 3.0e+00 0.0e+00 | 6.7e-01 7.5e-01 0.0e+00 
test_DualObjectiveValue_Min_ScalarAffine_GreaterThan: Error During Test at /home/zdpeng/.julia/packages/MathOptInterface/03Qtw/src/Test/Test.jl:264
  Got exception outside of a @test
  DivideError: integer division error
  Stacktrace:
    [1] solve_lp_problem
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/src/LibcuPDLPx.jl:170 [inlined]
    [2] optimize!(dest::cuPDLPx.Optimizer, src::cuPDLPx.OptimizerCache)
      @ cuPDLPx /orcd/home/002/zdpeng/github/cuPDLPx.jl/src/MOI_wrapper.jl:231
    [3] optimize!
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/src/MOI_wrapper.jl:242 [inlined]
    [4] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{cuPDLPx.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}})
      @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/03Qtw/src/Utilities/cachingoptimizer.jl:370
    [5] optimize!
      @ ~/.julia/packages/MathOptInterface/03Qtw/src/Bridges/bridge_optimizer.jl:367 [inlined]
    [6] test_DualObjectiveValue_Min_ScalarAffine_GreaterThan(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{cuPDLPx.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, config::MathOptInterface.Test.Config{Float64})
      @ MathOptInterface.Test ~/.julia/packages/MathOptInterface/03Qtw/src/Test/test_solve.jl:1971
    [7] macro expansion
      @ ~/.julia/packages/MathOptInterface/03Qtw/src/Test/Test.jl:270 [inlined]
    [8] macro expansion
      @ /orcd/home/002/zdpeng/.julia/juliaup/julia-1.12.2+0.x64.linux.gnu/share/julia/stdlib/v1.12/Test/src/Test.jl:1776 [inlined]
    [9] runtests(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{cuPDLPx.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, config::MathOptInterface.Test.Config{Float64}; include::Vector{String}, exclude::Vector{Regex}, warn_unsupported::Bool, verbose::Bool, exclude_tests_after::VersionNumber, test_module::Module)
      @ MathOptInterface.Test ~/.julia/packages/MathOptInterface/03Qtw/src/Test/Test.jl:265
   [10] runtests
      @ ~/.julia/packages/MathOptInterface/03Qtw/src/Test/Test.jl:223 [inlined]
   [11] test_runtests()
      @ Main.TestMOI /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:29
   [12] macro expansion
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:80 [inlined]
   [13] macro expansion
      @ /orcd/home/002/zdpeng/.julia/juliaup/julia-1.12.2+0.x64.linux.gnu/share/julia/stdlib/v1.12/Test/src/Test.jl:1776 [inlined]
   [14] runtests()
      @ Main.TestMOI /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:80
   [15] top-level scope
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/MOI_wrapper.jl:89
   [16] include(mapexpr::Function, mod::Module, _path::String)
      @ Base ./Base.jl:307
   [17] top-level scope
      @ /orcd/home/002/zdpeng/github/cuPDLPx.jl/test/runtests.jl:254
   [18] include(mapexpr::Function, mod::Module, _path::String)
      @ Base ./Base.jl:307
   [19] top-level scope
      @ none:6
   [20] eval(m::Module, e::Any)
      @ Core ./boot.jl:489
   [21] exec_options(opts::Base.JLOptions)
      @ Base ./client.jl:283
   [22] _start()
      @ Base ./client.jl:550

The following MOI_wrapper.jl fixed this issue, but I am not sure if it is a good design.

Updated code
import MathOptInterface as MOI

const Lib = cuPDLPx.LibcuPDLPx

MOI.Utilities.@product_of_sets(
    _LPProductOfSets,
    MOI.EqualTo{T},
    MOI.GreaterThan{T},
    MOI.LessThan{T},
    MOI.Interval{T},
)

const OptimizerCache = MOI.Utilities.GenericModel{
    Cdouble,
    MOI.Utilities.ObjectiveContainer{Cdouble},
    MOI.Utilities.VariablesContainer{Cdouble},
    MOI.Utilities.MatrixOfConstraints{
        Cdouble,
        MOI.Utilities.MutableSparseMatrixCSC{Cdouble,Cint,MOI.Utilities.ZeroBasedIndexing},
        MOI.Utilities.Hyperrectangle{Cdouble},
        _LPProductOfSets{Cdouble},
    },
}

Base.show(io::IO, ::Type{OptimizerCache}) = print(io, "cuPDLPx.OptimizerCache")

const BOUND_SETS = Union{
    MOI.GreaterThan{Float64},
    MOI.LessThan{Float64},
    MOI.EqualTo{Float64},
    MOI.Interval{Float64},
}

"""
    Optimizer()

Create a new cuPDLPx optimizer.
"""
mutable struct Optimizer <: MOI.AbstractOptimizer
    result::Union{Nothing,Lib.cupdlpx_result_t}
    native_result_ptr::Ptr{Lib.cupdlpx_result_t}
    parameters::Lib.pdhg_parameters_t
    sets::Union{Nothing,_LPProductOfSets{Cdouble}}
    max_sense::Bool
    silent::Bool

    function Optimizer()
        params_ref = Ref{Lib.pdhg_parameters_t}()
        Lib.set_default_parameters(
            Base.unsafe_convert(Ptr{Lib.pdhg_parameters_t}, params_ref),
        )

        return new(nothing, C_NULL, params_ref[], nothing, false, false)
    end
end

function MOI.default_cache(::Optimizer, ::Type)
    return OptimizerCache()
end

# ====================
#   Helper: Immutable Update
# ====================
function _update_immutable(obj::T, field::Symbol, value) where {T}
    args = map(fieldnames(T)) do f
        f == field ? value : getfield(obj, f)
    end
    return T(args...)
end

# ====================
#   Parameters
# ====================

MOI.get(::Optimizer, ::MOI.SolverName) = "cuPDLPx"

function MOI.supports(::Optimizer, param::MOI.RawOptimizerAttribute)
    return hasfield(Lib.pdhg_parameters_t, Symbol(param.name))
end

function MOI.set(optimizer::Optimizer, param::MOI.RawOptimizerAttribute, value)
    if !MOI.supports(optimizer, param)
        throw(MOI.UnsupportedAttribute(param))
    end
    optimizer.parameters =
        _update_immutable(optimizer.parameters, Symbol(param.name), value)
    return
end

function MOI.get(optimizer::Optimizer, param::MOI.RawOptimizerAttribute)
    if !MOI.supports(optimizer, param)
        throw(MOI.UnsupportedAttribute(param))
    end
    return getfield(optimizer.parameters, Symbol(param.name))
end

MOI.supports(::Optimizer, ::MOI.TimeLimitSec) = true
function MOI.set(optimizer::Optimizer, ::MOI.TimeLimitSec, value::Real)
    current_criteria = optimizer.parameters.termination_criteria
    new_criteria = _update_immutable(current_criteria, :time_sec_limit, Float64(value))
    optimizer.parameters =
        _update_immutable(optimizer.parameters, :termination_criteria, new_criteria)
    return
end

function MOI.get(optimizer::Optimizer, ::MOI.TimeLimitSec)
    return optimizer.parameters.termination_criteria.time_sec_limit
end

MOI.supports(::Optimizer, ::MOI.Silent) = true
function MOI.set(optimizer::Optimizer, ::MOI.Silent, value::Bool)
    optimizer.silent = value
    new_verbose = value ? 0 : 1
    optimizer.parameters = _update_immutable(optimizer.parameters, :verbose, new_verbose)
    return
end
MOI.get(optimizer::Optimizer, ::MOI.Silent) = optimizer.silent

# ====================
#   Empty & Status
# ====================

function MOI.is_empty(optimizer::Optimizer)
    return isnothing(optimizer.result)
end

function MOI.empty!(optimizer::Optimizer)
    if optimizer.native_result_ptr != C_NULL
        Lib.cupdlpx_result_free(optimizer.native_result_ptr)
        optimizer.native_result_ptr = C_NULL
    end
    optimizer.result = nothing
    optimizer.sets = nothing
    return
end

# ========================================
#   Constraints & Objectives
# ========================================

function MOI.supports_constraint(
    ::Optimizer,
    ::Type{MOI.VariableIndex},
    ::Type{<:BOUND_SETS},
)
    return true
end

function MOI.supports_constraint(
    ::Optimizer,
    ::Type{MOI.ScalarAffineFunction{Float64}},
    ::Type{<:BOUND_SETS},
)
    return true
end

MOI.supports(::Optimizer, ::MOI.ObjectiveSense) = true

function MOI.supports(
    ::Optimizer,
    ::MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}},
)
    return true
end

# ===============================
#   Optimize
# ===============================

function _flip_sense(optimizer::Optimizer, obj)
    return optimizer.max_sense ? -obj : obj
end

function create_matrix_desc_ref(
    A::MOI.Utilities.MutableSparseMatrixCSC{Cdouble,Cint,MOI.Utilities.ZeroBasedIndexing},
)
    A_csc = Lib.MatrixCSC(
        length(A.rowval),
        pointer(A.colptr),
        pointer(A.rowval),
        pointer(A.nzval),
    )

    desc_ref = Ref{Lib.matrix_desc_t}()

    desc_val = Lib.matrix_desc_t(ntuple(_ -> UInt8(0), 56))
    desc_ref[] = desc_val

    desc_ptr = Base.unsafe_convert(Ptr{Lib.matrix_desc_t}, desc_ref)

    desc_ptr.m = Cint(A.m)
    desc_ptr.n = Cint(A.n)
    desc_ptr.fmt = Lib.matrix_csc
    desc_ptr.zero_tolerance = 1e-12
    desc_ptr.data.csc = A_csc

    return desc_ref
end

function MOI.optimize!(dest::Optimizer, src::OptimizerCache)
    MOI.empty!(dest)
    if src.constraints.coefficients.n == 0
        dest.result = nothing
        return MOI.Utilities.identity_index_map(src), false
    end

    dest.max_sense = MOI.get(src, MOI.ObjectiveSense()) == MOI.MAX_SENSE
    obj = MOI.get(src, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}())

    c = zeros(Cdouble, src.constraints.coefficients.n)
    for term in obj.terms
        c[term.variable.value] += _flip_sense(dest, term.coefficient)
    end
    obj_const = [_flip_sense(dest, MOI.constant(obj))]

    dest.sets = src.constraints.sets

    matrix_desc_ref = create_matrix_desc_ref(src.constraints.coefficients)
    matrix_desc_ptr = Base.unsafe_convert(Ptr{Lib.matrix_desc_t}, matrix_desc_ref)

    params_ref = Ref(dest.parameters)
    params_ptr = Base.unsafe_convert(Ptr{Lib.pdhg_parameters_t}, params_ref)

    const_lb = src.constraints.constants.lower
    const_ub = src.constraints.constants.upper
    var_lb   = src.variables.lower
    var_ub   = src.variables.upper

    GC.@preserve c obj_const matrix_desc_ref params_ref const_lb const_ub var_lb var_ub begin
        
        prob = Lib.create_lp_problem(
            pointer(c),
            matrix_desc_ptr,
            pointer(const_lb),
            pointer(const_ub),
            pointer(var_lb),
            pointer(var_ub),
            pointer(obj_const),
        )
        @assert prob != C_NULL

        result_ptr = Lib.solve_lp_problem(prob, params_ptr)
        @assert result_ptr != C_NULL

        dest.result = unsafe_load(result_ptr)
        dest.native_result_ptr = result_ptr

        Lib.cupdlpx_result_free(result_ptr)
        Lib.lp_problem_free(prob)
    end

    return MOI.Utilities.identity_index_map(src), false
end

function MOI.optimize!(dest::Optimizer, src::MOI.ModelLike)
    cache = OptimizerCache()
    index_map = MOI.copy_to(cache, src)
    MOI.optimize!(dest, cache)
    return index_map, false
end

# ====================
#   Result Getters
# ====================

function MOI.get(optimizer::Optimizer, ::MOI.SolveTimeSec)
    return optimizer.result.cumulative_time_sec
end

function MOI.get(optimizer::Optimizer, ::MOI.RawStatusString)
    return isnothing(optimizer.result) ? "Optimize not called" : "Solver finished"
end

const _TERMINATION_STATUS_MAP = Dict(
    Lib.TERMINATION_REASON_UNSPECIFIED => MOI.OPTIMIZE_NOT_CALLED,
    Lib.TERMINATION_REASON_OPTIMAL => MOI.OPTIMAL,
    Lib.TERMINATION_REASON_PRIMAL_INFEASIBLE => MOI.INFEASIBLE,
    Lib.TERMINATION_REASON_DUAL_INFEASIBLE => MOI.DUAL_INFEASIBLE,
    Lib.TERMINATION_REASON_TIME_LIMIT => MOI.TIME_LIMIT,
    Lib.TERMINATION_REASON_ITERATION_LIMIT => MOI.ITERATION_LIMIT,
    Lib.TERMINATION_REASON_FEAS_POLISH_SUCCESS => MOI.OTHER_ERROR,
)

function MOI.get(optimizer::Optimizer, ::MOI.TerminationStatus)
    return isnothing(optimizer.result) ? MOI.OPTIMIZE_NOT_CALLED :
           _TERMINATION_STATUS_MAP[optimizer.result.termination_reason]
end

function MOI.get(optimizer::Optimizer, attr::MOI.ObjectiveValue)
    MOI.check_result_index_bounds(optimizer, attr)
    return _flip_sense(optimizer, optimizer.result.primal_objective_value)
end

function MOI.get(optimizer::Optimizer, attr::MOI.DualObjectiveValue)
    MOI.check_result_index_bounds(optimizer, attr)
    return _flip_sense(optimizer, optimizer.result.dual_objective_value)
end

const _PRIMAL_STATUS_MAP = Dict(
    Lib.TERMINATION_REASON_UNSPECIFIED => MOI.NO_SOLUTION,
    Lib.TERMINATION_REASON_OPTIMAL => MOI.FEASIBLE_POINT,
    Lib.TERMINATION_REASON_PRIMAL_INFEASIBLE => MOI.NO_SOLUTION,
    Lib.TERMINATION_REASON_DUAL_INFEASIBLE => MOI.INFEASIBILITY_CERTIFICATE,
    Lib.TERMINATION_REASON_TIME_LIMIT => MOI.UNKNOWN_RESULT_STATUS,
    Lib.TERMINATION_REASON_ITERATION_LIMIT => MOI.UNKNOWN_RESULT_STATUS,
    Lib.TERMINATION_REASON_FEAS_POLISH_SUCCESS => MOI.UNKNOWN_RESULT_STATUS,
)

const _DUAL_STATUS_MAP = Dict(
    LibcuPDLPx.TERMINATION_REASON_UNSPECIFIED => MOI.NO_SOLUTION,
    LibcuPDLPx.TERMINATION_REASON_OPTIMAL => MOI.FEASIBLE_POINT,
    LibcuPDLPx.TERMINATION_REASON_PRIMAL_INFEASIBLE => MOI.INFEASIBILITY_CERTIFICATE,
    LibcuPDLPx.TERMINATION_REASON_DUAL_INFEASIBLE => MOI.NO_SOLUTION,
    LibcuPDLPx.TERMINATION_REASON_TIME_LIMIT => MOI.UNKNOWN_RESULT_STATUS,
    LibcuPDLPx.TERMINATION_REASON_ITERATION_LIMIT => MOI.UNKNOWN_RESULT_STATUS,
    LibcuPDLPx.TERMINATION_REASON_FEAS_POLISH_SUCCESS => MOI.UNKNOWN_RESULT_STATUS,
)

function MOI.get(optimizer::Optimizer, attr::MOI.PrimalStatus)
    if attr.result_index > MOI.get(optimizer, MOI.ResultCount())
        return MOI.NO_SOLUTION
    end
    return _PRIMAL_STATUS_MAP[optimizer.result.termination_reason]
end

function MOI.get(optimizer::Optimizer, attr::MOI.VariablePrimal, vi::MOI.VariableIndex)
    MOI.check_result_index_bounds(optimizer, attr)
    return unsafe_load(optimizer.result.primal_solution, vi.value)
end

function MOI.get(optimizer::Optimizer, attr::MOI.DualStatus)
    if attr.result_index > MOI.get(optimizer, MOI.ResultCount())
        return MOI.NO_SOLUTION
    end
    return _DUAL_STATUS_MAP[optimizer.result.termination_reason]
end

function MOI.get(
    optimizer::Optimizer,
    attr::MOI.ConstraintDual,
    ci::MOI.ConstraintIndex{MOI.ScalarAffineFunction{Float64}},
)
    MOI.check_result_index_bounds(optimizer, attr)
    row = only(MOI.Utilities.rows(optimizer.sets, ci))
    return unsafe_load(optimizer.result.dual_solution, row)
end

function MOI.get(optimizer::Optimizer, ::MOI.ResultCount)
    return isnothing(optimizer.result) ? 0 : 1
end

error("TODO")
optimizer.silent = value
new_verbose = value ? 0 : 1
optimizer.parameters = _update_immutable(optimizer.parameters, :verbose, new_verbose)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When Silent is set back to false, the :verbose parameters should get back to the value it had before Silent was set to true. Since you erase it here, it won't be possible. What we do (and it's the reason why we keep new_verbose as a separate field), is, in optimize!, if silent is true, you set the verbose field to 0, then you call solve_lp then you reset to its value, and you keep a local variable to remember the old value in optimize!

Copy link
Collaborator Author

@ZedongPeng ZedongPeng Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried to update the code as below, but it still doesn’t work. Do you have any idea what I might be missing?

# TODO: not working
# solve_params = dest.parameters
# if dest.silent
# solve_params = _update_immutable(solve_params, :verbose, Cint(0))
# end
# params_ref = Ref{Lib.pdhg_parameters_t}(solve_params)
# params_ptr = Base.unsafe_convert(Ptr{Lib.pdhg_parameters_t}, params_ref)

@blegat
Copy link
Collaborator

blegat commented Dec 24, 2025

I am not sure if it is a good design.

Yes it's good, just a minor comment in https://github.com/MIT-Lu-Lab/cuPDLPx.jl/pull/6/files#r2645187112

@ZedongPeng
Copy link
Collaborator Author

Hi @blegat . When I run the package tests, I hit the following error.

(cuPDLPx) pkg> test
Test Summary:                | Pass  Total  Time
LibcuPDLPx Translation Tests |   19     19  1.3s
Skipping feasibility polishing as the solution is already sufficiently feasible.
Solution Summary
  Status             : OPTIMAL
  Presolve time      : 0.000132 sec
  Solve time         : 3e-05 sec
  Iterations         : 0
  Primal objective   : -6
  Dual objective     : -6
  Objective gap      : 0.000e+00
  Primal infeas      : 0.000e+00
  Dual infeas        : 0.000e+00
CUDA Error at /workspace/srcdir/cuPDLPx/src/solver.cu:460: cudaErrorInvalidValue
ERROR: Package cuPDLPx errored during testing

Related code: https://github.com/MIT-Lu-Lab/cuPDLPx/blob/4513094a4dfec9be1da5df35f2691205e090bde0/src/solver.cu#L453-L460

It seems to occur for LPs with no linear constraints (or cases where presolve removes all linear constraints). One example is test_DualObjectiveValue_Max_VariableIndex_LessThan. What confuses me is that if I solve the same instance via the cuPDLPx command-line interface, it succeeds.

# MPS file
NAME
ROWS
 N  OBJ
COLUMNS
    x         OBJ       -3
RHS
RANGES
BOUNDS
 MI bounds    x
 UP bounds    x         2
ENDATA

Output

(base) [zdpeng@node2641 cuPDLPx2]$ ./build/cupdlpx test.mps test/ -v
---------------------------------------------------------------------------------------
                                    cuPDLPx v0.2.2                                    
                        A GPU-Accelerated First-Order LP Solver                        
               (c) Haihao Lu, Massachusetts Institute of Technology, 2025              
---------------------------------------------------------------------------------------
problem: 0 rows, 1 columns, 0 nonzeros
settings:
  iter_limit         : 2147483647
  time_limit         : 3600.00 sec
  eps_opt            : 1.0e-04
  eps_feas           : 1.0e-04
  eps_infeas_detect  : 1.0e-10

Running presolver (PSLP v0.0.3)...
  status          : REDUCED
  presolve time   : 0.000198 sec
  reduced problem : 0 rows, 0 columns, 0 nonzeros
state->num_constraints: 0
state->num_variables: 0
state->constraint_matrix->num_nonzeros: 0
state->constraint_matrix->row_ptr: 0x153b93e00000
state->constraint_matrix->col_ind: (nil)
state->constraint_matrix->val: (nil)
---------------------------------------------------------------------------------------
   runtime     |     objective      |   absolute residuals    |   relative residuals    
  iter   time  |  pr obj    du obj  |  pr res  du res   gap   |  pr res  du res   gap   
---------------------------------------------------------------------------------------
     0 5.3e-04 | -6.0e+00  -6.0e+00 | 0.0e+00 0.0e+00 0.0e+00 | 0.0e+00 0.0e+00 0.0e+00 
---------------------------------------------------------------------------------------
Solution Summary
  Status             : OPTIMAL
  Presolve time      : 0.000198 sec
  Solve time         : 0.000527 sec
  Iterations         : 0
  Primal objective   : -6
  Dual objective     : -6
  Objective gap      : 0.000e+00
  Primal infeas      : 0.000e+00
  Dual infeas        : 0.000e+00

Do you have any idea which part of the MOI wrapper/test harness could be triggering this, or where I should look first? Thanks in advance!

@ZedongPeng
Copy link
Collaborator Author

Hi @blegat. By default, the test suite runs test_DualObjectiveValue_Max_ScalarAffine_LessThan first and then test_DualObjectiveValue_Min_ScalarAffine_GreaterThan. When test_DualObjectiveValue_Min_ScalarAffine_GreaterThan is executed immediately after test_DualObjectiveValue_Max_ScalarAffine_LessThan, it fails with:

CUDA Error at /workspace/srcdir/cuPDLPx/src/solver.cu:460: cudaErrorInvalidValue

However, if I exclude test_DualObjectiveValue_Max_ScalarAffine_LessThan, test_DualObjectiveValue_Min_ScalarAffine_GreaterThan succeeds.

Do you have any insights into what might cause this? Thanks in advance.

@blegat
Copy link
Collaborator

blegat commented Jan 8, 2026

Quite surprising indeed, the only state I see that could remain is max_sense

@ZedongPeng
Copy link
Collaborator Author

ZedongPeng commented Jan 8, 2026

Hi @blegat . I added optimizer.max_sense = false and moved dest.max_sense before if. It still did not work.
Do you think this points to an issue in the cuPDLPx C core, or is there something subtle I'm missing in the MOI integration logic?

@ZedongPeng
Copy link
Collaborator Author

The good news is that the following test succeeded.

using JuMP
using cuPDLPx

model = read_from_file("2club200v15p5scn.mps.gz")
undo = relax_integrality(model);

println("Read mps succeed.")

set_optimizer(model, cuPDLPx.Optimizer)

optimize!(model)
solution_summary(model)

optimize!(model)
solution_summary(model)

Output

julia> include("test.jl")
Read mps succeed.
Solution Summary
  Status             : OPTIMAL
  Presolve time      : 0.00965 sec
  Solve time         : 0.0982 sec
  Iterations         : 2900
  Primal objective   : -121.2208385
  Dual objective     : -121.2221966
  Objective gap      : 5.579e-06
  Primal infeas      : 9.346e-06
  Dual infeas        : 3.708e-05
Solution Summary
  Status             : OPTIMAL
  Presolve time      : 0.00951 sec
  Solve time         : 0.0957 sec
  Iterations         : 2900
  Primal objective   : -121.2208385
  Dual objective     : -121.2221966
  Objective gap      : 5.579e-06
  Primal infeas      : 9.346e-06
  Dual infeas        : 3.708e-05
solution_summary(; result = 1, verbose = false)
├ solver_name          : cuPDLPx
├ Termination
│ ├ termination_status : OPTIMAL
│ ├ result_count       : 1
│ └ raw_status         : Solver finished
├ Solution (result = 1)
│ ├ primal_status        : FEASIBLE_POINT
│ ├ dual_status          : FEASIBLE_POINT
│ ├ objective_value      : -1.21221e+02
│ └ dual_objective_value : -1.21222e+02
└ Work counters
  └ solve_time (sec)   : 9.56510e-02

@ZedongPeng ZedongPeng requested a review from blegat January 8, 2026 18:20
@ZedongPeng ZedongPeng marked this pull request as ready for review January 8, 2026 18:20
@blegat
Copy link
Collaborator

blegat commented Jan 8, 2026

Hi @blegat . I added optimizer.max_sense = false and moved dest.max_sense before if. It still did not work. Do you think this points to an issue in the cuPDLPx C core, or is there something subtle I'm missing in the MOI integration logic?

I have a feeling it might be from the C core, I don't see any state that would be kept between the MOI test in the MOI wrapper.

Copy link
Collaborator

@blegat blegat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, let's merge it into the MOI branch

@blegat blegat merged commit 81bd0f6 into MOI Jan 8, 2026
@ZedongPeng
Copy link
Collaborator Author

Thank you so much, @blegat. Since I’m more familiar with the cuPDLPx source code and you’re more familiar with MOI/JuMP, we can hop on a quick Zoom to debug it together if needed.

@blegat
Copy link
Collaborator

blegat commented Jan 9, 2026

Yes, start with open a PR with the current attempt and the associated error

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants