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!

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