Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ jobs:

steps:
- uses: actions/checkout@v5
with:
submodules: recursive
- name: Set Additional Envs
run: |
echo "PYTHON_SUBVERSION=$(echo $PYTHON_VERSION | cut -c 3-)" >> $GITHUB_ENV
Expand Down Expand Up @@ -114,6 +116,8 @@ jobs:

steps:
- uses: actions/checkout@v5
with:
submodules: recursive
- uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/test_nlp_solvers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ jobs:
with:
python-version: "3.12"
- uses: actions/checkout@v5
with:
submodules: recursive
- name: Set up Conda
uses: conda-incubator/setup-miniconda@v3
with:
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "diff_engine_core"]
path = diff_engine_core
url = https://github.com/dance858/DNLP-diff-engine
5 changes: 2 additions & 3 deletions cvxpy/reductions/solvers/nlp_solvers/diff_engine/c_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,10 @@

# Import the low-level C bindings
try:
import dnlp_diff_engine as _diffengine
import _diffengine
except ImportError as e:
raise ImportError(
"dnlp-diff-engine is required for NLP solving. "
"Install with: pip install dnlp-diff-engine"
"NLP support requires diff-engine. Rebuild with: pip install -e ."
) from e

from cvxpy.reductions.solvers.nlp_solvers.diff_engine.converters import (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,10 @@

# Import the low-level C bindings
try:
import dnlp_diff_engine as _diffengine
import _diffengine
except ImportError as e:
raise ImportError(
"dnlp-diff-engine is required for NLP solving. "
"Install with: pip install dnlp-diff-engine"
"NLP support requires diff-engine. Rebuild with: pip install -e ."
) from e


Expand Down
1 change: 1 addition & 0 deletions diff_engine_core
Submodule diff_engine_core added at f0df9c
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@

setup_versioning.write_version_py()
VERSION = setup_versioning.VERSION
extensions = [setup_extensions.cvxcore, setup_extensions.sparsecholesky]
extensions = [setup_extensions.cvxcore, setup_extensions.sparsecholesky, setup_extensions.diffengine]

Check failure on line 55 in setup.py

View workflow job for this annotation

GitHub Actions / actions-linting / linters

Ruff (E501)

setup.py:55:101: E501 Line too long (101 > 100)

setup(
name="cvxpy",
Expand Down
33 changes: 33 additions & 0 deletions setup/extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
"""
import glob
import platform

from pybind11.setup_helpers import Pybind11Extension
Expand Down Expand Up @@ -59,3 +60,35 @@ def not_on_windows(s: str) -> str:
extra_compile_args=compiler_args,
extra_link_args=['-O3'],
)

# Diff engine C extension for NLP support
# Gather all C source files from diff_engine_core (submodule)
diff_engine_sources = (
glob.glob('diff_engine_core/src/**/*.c', recursive=True) +
['diff_engine_core/python/bindings.c']
)

# Filter out any Python wrapper files (we only want pure C)
diff_engine_sources = [
s for s in diff_engine_sources
if 'dnlp_diff_engine' not in s
]

diffengine_compiler_args = [
'-O3',
'-std=c99',
'-Wall',
not_on_windows('-Wextra'),
]

diffengine = Extension(
'_diffengine',
sources=diff_engine_sources,
include_dirs=[
'diff_engine_core/include/',
'diff_engine_core/src/',
'diff_engine_core/python/',
],
extra_compile_args=diffengine_compiler_args,
extra_link_args=['-lm'] if platform.system().lower() != 'windows' else [],
)
Loading