Skip to content

Commit e2a6ead

Browse files
committed
fix circular dependencies
1 parent 64e6899 commit e2a6ead

File tree

3 files changed

+135
-155
lines changed

3 files changed

+135
-155
lines changed

.github/workflows/build-package.yml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ jobs:
1010
- name: download release asset from deterministicGaussianSampling
1111
uses: robinraju/release-downloader@v1
1212
with:
13-
repository: 'KIT-ISAS/deterministicGaussianSampling'
13+
repository: "KIT-ISAS/deterministicGaussianSampling"
1414
latest: true
15-
fileName: '*.zip'
16-
out-file-path: 'deterministicGaussianSamplingLibs'
15+
fileName: "*.zip"
16+
out-file-path: "deterministicGaussianSamplingLibs"
1717
token: ${{ secrets.GITHUB_TOKEN }}
18-
18+
1919
- name: upload downloaded libs as artifact
2020
uses: actions/upload-artifact@v4
2121
with:
@@ -48,23 +48,23 @@ jobs:
4848
- name: extract ZIP on Unix
4949
if: ${{ runner.os == 'Linux' }}
5050
run: |
51-
mkdir -p external_libs_unpacked/linux
52-
unzip external_libs/linux.zip -d external_libs_unpacked/linux
53-
mkdir -p src/deterministic_gaussian_sampling/lib/linux/bin
54-
cp -r external_libs_unpacked/linux/lib/* src/deterministic_gaussian_sampling/lib/linux/bin
51+
mkdir -p external_libs_unpacked/linux
52+
unzip external_libs/linux.zip -d external_libs_unpacked/linux
53+
mkdir -p src/deterministic_gaussian_sampling/lib/linux/bin
54+
cp -r external_libs_unpacked/linux/lib/* src/deterministic_gaussian_sampling/lib/linux/bin
5555
5656
- name: extract ZIP on Windows
5757
if: ${{ runner.os == 'Windows' }}
5858
shell: pwsh
5959
run: |
60-
New-Item -ItemType Directory -Path external_libs_unpacked\windows -Force
61-
Expand-Archive -Path external_libs/windows.zip -DestinationPath external_libs_unpacked\windows -Force
62-
New-Item -ItemType Directory -Path src\deterministic_gaussian_sampling\lib\windows\bin -Force
63-
Copy-Item external_libs_unpacked\windows\bin\* src\deterministic_gaussian_sampling\lib\windows\bin -Recurse -Force
60+
New-Item -ItemType Directory -Path external_libs_unpacked\windows -Force
61+
Expand-Archive -Path external_libs/windows.zip -DestinationPath external_libs_unpacked\windows -Force
62+
New-Item -ItemType Directory -Path src\deterministic_gaussian_sampling\lib\windows\bin -Force
63+
Copy-Item external_libs_unpacked\windows\bin\* src\deterministic_gaussian_sampling\lib\windows\bin -Recurse -Force
6464
6565
- name: run tests
6666
run: |
67-
pip install -e .
68-
pip install --upgrade pip
69-
pip install pytest
70-
pytest -v
67+
pip install -e .
68+
pip install --upgrade pip
69+
pip install pytest scipy
70+
pytest -v
Lines changed: 95 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,119 @@
1+
# ctypes_wrapper.py
12
import ctypes
2-
import deterministic_gaussian_sampling.type_wrapper.python_variant as python_variant
3+
from typing import TYPE_CHECKING
4+
5+
# avoid importing python_variant at top-level to break circular imports
6+
# (only import it inside functions when needed)
37

48
class GslMinimizerResultCTypes(ctypes.Structure):
59
_fields_ = [
6-
("initalStepSize", ctypes.c_double), # initialStepSize
7-
("stepTolerance", ctypes.c_double), # stepTolerance
8-
("lastXtolAbs", ctypes.c_double), # lastXtolAbs
9-
("lastXtolRel", ctypes.c_double), # lastFtolRel
10-
("lastFtolAbs", ctypes.c_double), # lastFtolAbs
11-
("lastFtolRel", ctypes.c_double), # lastFtolRel
12-
("lastGtol", ctypes.c_double), # lastGtol
13-
("xtolAbs", ctypes.c_double), # xtolAbs
14-
("xtolRel", ctypes.c_double), # xtolRel
15-
("ftolAbs", ctypes.c_double), # ftolAbs
16-
("ftolRel", ctypes.c_double), # ftolRel
17-
("gtol", ctypes.c_double), # gtol
18-
("iterations", ctypes.c_size_t), # iterations
19-
("maxIterations", ctypes.c_size_t), # maxIterations
20-
("elapsedTimeMicro", ctypes.c_size_t), # elapsedTimeMicro
10+
("initalStepSize", ctypes.c_double),
11+
("stepTolerance", ctypes.c_double),
12+
("lastXtolAbs", ctypes.c_double),
13+
("lastXtolRel", ctypes.c_double),
14+
("lastFtolAbs", ctypes.c_double),
15+
("lastFtolRel", ctypes.c_double),
16+
("lastGtol", ctypes.c_double),
17+
("xtolAbs", ctypes.c_double),
18+
("xtolRel", ctypes.c_double),
19+
("ftolAbs", ctypes.c_double),
20+
("ftolRel", ctypes.c_double),
21+
("gtol", ctypes.c_double),
22+
("iterations", ctypes.c_size_t),
23+
("maxIterations", ctypes.c_size_t),
24+
("elapsedTimeMicro", ctypes.c_size_t),
2125
]
2226

2327
@staticmethod
24-
def from_py_type(pyT: python_variant.GslMinimizerResultPy) -> GslMinimizerResultCTypes:
28+
def from_py_type(pyT: "deterministic_gaussian_sampling.type_wrapper.python_variant.GslMinimizerResultPy") -> "GslMinimizerResultCTypes":
29+
# local import to avoid circular import at module import time
30+
import deterministic_gaussian_sampling.type_wrapper.python_variant as python_variant # noqa: F401
2531
return GslMinimizerResultCTypes(
26-
ctypes.c_double(pyT.initalStepSize), # initialStepSize
27-
ctypes.c_double(pyT.stepTolerance), # stepTolerance
28-
ctypes.c_double(pyT.lastXtolAbs), # lastXtolAbs
29-
ctypes.c_double(pyT.lastXtolRel), # lastFtolRel
30-
ctypes.c_double(pyT.lastFtolAbs), # lastFtolAbs
31-
ctypes.c_double(pyT.lastFtolRel), # lastFtolRel
32-
ctypes.c_double(pyT.lastGtol), # lastGtol
33-
ctypes.c_double(pyT.xtolAbs), # xtolAbs
34-
ctypes.c_double(pyT.xtolRel), # xtolRel
35-
ctypes.c_double(pyT.ftolAbs), # ftolAbs
36-
ctypes.c_double(pyT.ftolRel), # ftolRel
37-
ctypes.c_double(pyT.gtol), # gtol
38-
ctypes.c_size_t(pyT.iterations), # iterations
39-
ctypes.c_size_t(pyT.maxIterations), # maxIterations
40-
ctypes.c_size_t(pyT.elapsedTimeMicro) # elapsedTimeMicro
32+
ctypes.c_double(pyT.initalStepSize),
33+
ctypes.c_double(pyT.stepTolerance),
34+
ctypes.c_double(pyT.lastXtolAbs),
35+
ctypes.c_double(pyT.lastXtolRel),
36+
ctypes.c_double(pyT.lastFtolAbs),
37+
ctypes.c_double(pyT.lastFtolRel),
38+
ctypes.c_double(pyT.lastGtol),
39+
ctypes.c_double(pyT.xtolAbs),
40+
ctypes.c_double(pyT.xtolRel),
41+
ctypes.c_double(pyT.ftolAbs),
42+
ctypes.c_double(pyT.ftolRel),
43+
ctypes.c_double(pyT.gtol),
44+
ctypes.c_size_t(pyT.iterations),
45+
ctypes.c_size_t(pyT.maxIterations),
46+
ctypes.c_size_t(pyT.elapsedTimeMicro),
4147
)
42-
43-
def to_py_type(self) -> python_variant.GslMinimizerResultPy:
48+
49+
def to_py_type(self):
50+
# local import to avoid circular import at module import time
51+
import deterministic_gaussian_sampling.type_wrapper.python_variant as python_variant
4452
return python_variant.GslMinimizerResultPy(
45-
float(self.initalStepSize), # initialStepSize
46-
float(self.stepTolerance), # stepTolerance
47-
float(self.lastXtolAbs), # lastXtolAbs
48-
float(self.lastXtolRel), # lastFtolRel
49-
float(self.lastFtolAbs), # lastFtolAbs
50-
float(self.lastFtolRel), # lastFtolRel
51-
float(self.lastGtol), # lastGtol
52-
float(self.xtolAbs), # xtolAbs
53-
float(self.xtolRel), # xtolRel
54-
float(self.ftolAbs), # ftolAbs
55-
float(self.ftolRel), # ftolRel
56-
float(self.gtol), # gtol
57-
int(self.iterations), # iterations
58-
int(self.maxIterations), # maxIterations
59-
int(self.elapsedTimeMicro) # elapsedTimeMicro
53+
float(self.initalStepSize),
54+
float(self.stepTolerance),
55+
float(self.lastXtolAbs),
56+
float(self.lastXtolRel),
57+
float(self.lastFtolAbs),
58+
float(self.lastFtolRel),
59+
float(self.lastGtol),
60+
float(self.xtolAbs),
61+
float(self.xtolRel),
62+
float(self.ftolAbs),
63+
float(self.ftolRel),
64+
float(self.gtol),
65+
int(self.iterations),
66+
int(self.maxIterations),
67+
int(self.elapsedTimeMicro),
6068
)
6169

70+
6271
class ApproximateOptionsCTypes(ctypes.Structure):
6372
_fields_ = [
64-
("xtolAbs", ctypes.c_double), # xtolAbs
65-
("xtolRel", ctypes.c_double), # xtolRel
66-
("ftolAbs", ctypes.c_double), # ftolAbs
67-
("ftolRel", ctypes.c_double), # ftolRel
68-
("gtol", ctypes.c_double), # gtol
69-
("initialX", ctypes.c_bool), # intialX
70-
("maxIterations", ctypes.c_size_t), # maxIterations
71-
("verbose", ctypes.c_bool), # verbose
73+
("xtolAbs", ctypes.c_double),
74+
("xtolRel", ctypes.c_double),
75+
("ftolAbs", ctypes.c_double),
76+
("ftolRel", ctypes.c_double),
77+
("gtol", ctypes.c_double),
78+
("initialX", ctypes.c_bool),
79+
("maxIterations", ctypes.c_size_t),
80+
("verbose", ctypes.c_bool),
7281
]
7382

7483
@staticmethod
75-
def from_py_type(pyT: python_variant.ApproximateOptionsPy) -> ApproximateOptionsCTypes:
84+
def from_py_type(pyT: "deterministic_gaussian_sampling.type_wrapper.python_variant.ApproximateOptionsPy") -> "ApproximateOptionsCTypes":
85+
# local import
86+
import deterministic_gaussian_sampling.type_wrapper.python_variant as python_variant # noqa: F401
7687
return ApproximateOptionsCTypes(
77-
ctypes.c_double(pyT.xtolAbs), # xtolAbs
78-
ctypes.c_double(pyT.xtolRel), # xtolRel
79-
ctypes.c_double(pyT.ftolAbs), # ftolAbs
80-
ctypes.c_double(pyT.ftolRel), # ftolRel
81-
ctypes.c_double(pyT.gtol), # gtol
82-
ctypes.c_bool(pyT.initialX), # intialX
83-
ctypes.c_size_t(pyT.maxIterations), # maxIteration
84-
ctypes.c_bool(pyT.verbose) # verbose
88+
ctypes.c_double(pyT.xtolAbs),
89+
ctypes.c_double(pyT.xtolRel),
90+
ctypes.c_double(pyT.ftolAbs),
91+
ctypes.c_double(pyT.ftolRel),
92+
ctypes.c_double(pyT.gtol),
93+
ctypes.c_bool(pyT.initialX),
94+
ctypes.c_size_t(pyT.maxIterations),
95+
ctypes.c_bool(pyT.verbose),
8596
)
86-
87-
def to_py_type(self) -> python_variant.ApproximateOptionsPy:
97+
98+
def to_py_type(self):
99+
import deterministic_gaussian_sampling.type_wrapper.python_variant as python_variant
88100
return python_variant.ApproximateOptionsPy(
89-
float(self.xtolAbs), # xtolAbs
90-
float(self.xtolRel), # xtolRel
91-
float(self.ftolAbs), # ftolAbs
92-
float(self.ftolRel), # ftolRel
93-
float(self.gtol), # gtol
94-
bool(self.initialX), # intialX
95-
int(self.maxIterations), # maxIteration
96-
bool(self.verbose) # verbose
101+
float(self.xtolAbs),
102+
float(self.xtolRel),
103+
float(self.ftolAbs),
104+
float(self.ftolRel),
105+
float(self.gtol),
106+
bool(self.initialX),
107+
int(self.maxIterations),
108+
bool(self.verbose),
97109
)
98110

111+
99112
wXCallbackCTypes = ctypes.CFUNCTYPE(
100-
None, # return
101-
ctypes.POINTER(ctypes.c_double), # x
102-
ctypes.POINTER(ctypes.c_double), # res
103-
ctypes.c_size_t, # L
104-
ctypes.c_size_t # N
113+
None,
114+
ctypes.POINTER(ctypes.c_double),
115+
ctypes.POINTER(ctypes.c_double),
116+
ctypes.c_size_t,
117+
ctypes.c_size_t,
105118
)
106-
wXDCallbackCTypes = wXCallbackCTypes
119+
wXDCallbackCTypes = wXCallbackCTypes

src/deterministic_gaussian_sampling/type_wrapper/python_variant.py

Lines changed: 24 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
1+
# python_variant.py
2+
from __future__ import annotations
13
from dataclasses import dataclass
24
import ctypes
3-
import numpy
4-
import deterministic_gaussian_sampling.type_wrapper.python_variant as python_variant
5-
import deterministic_gaussian_sampling.type_wrapper.ctypes_wrapper as ctypes_wrapper
6-
5+
import numpy as np
76

87
@dataclass
98
class ApproximationResultPy:
109
success: bool
11-
result: python_variant.GslMinimizerResultPy
12-
x: numpy.ndarray
10+
result: "GslMinimizerResultPy"
11+
x: np.ndarray
1312

1413
@staticmethod
1514
def from_ctypes(
1615
success: ctypes.c_bool,
17-
minimizer_result: ctypes_wrapper.GslMinimizerResultCTypes,
16+
minimizer_result,
1817
x_ptr: ctypes.POINTER[ctypes.c_double],
1918
L: int,
2019
N: int,
2120
) -> "ApproximationResultPy":
21+
from deterministic_gaussian_sampling.type_wrapper import ctypes_wrapper
22+
2223
return ApproximationResultPy(
2324
bool(success),
2425
minimizer_result.to_py_type(),
25-
numpy.ctypeslib.as_array(x_ptr, shape=(L, N)),
26+
np.ctypeslib.as_array(x_ptr, shape=(L, N)),
2627
)
2728

2829
def __str__(self):
@@ -37,55 +38,21 @@ def __str__(self):
3738

3839
@dataclass
3940
class GslMinimizerResultPy:
40-
initalStepSize: float
41-
stepTolerance: float
42-
lastXtolAbs: float
43-
lastXtolRel: float
44-
lastFtolAbs: float
45-
lastFtolRel: float
46-
lastGtol: float
47-
xtolAbs: float
48-
xtolRel: float
49-
ftolAbs: float
50-
ftolRel: float
51-
gtol: float
52-
iterations: int
53-
maxIterations: int
54-
elapsedTimeMicro: int
55-
56-
def __init__(
57-
self,
58-
initalStepSize=0.0,
59-
stepTolerance=0.0,
60-
lastXtolAbs=0.0,
61-
lastXtolRel=0.0,
62-
lastFtolAbs=0.0,
63-
lastFtolRel=0.0,
64-
lastGtol=0.0,
65-
xtolAbs=0.0,
66-
xtolRel=0.0,
67-
ftolAbs=0.0,
68-
ftolRel=0.0,
69-
gtol=0.0,
70-
iterations=0,
71-
maxIterations=0,
72-
elapsedTimeMicro=0,
73-
):
74-
self.initalStepSize = initalStepSize
75-
self.stepTolerance = stepTolerance
76-
self.lastXtolAbs = lastXtolAbs
77-
self.lastXtolRel = lastXtolRel
78-
self.lastFtolAbs = lastFtolAbs
79-
self.lastFtolRel = lastFtolRel
80-
self.lastGtol = lastGtol
81-
self.xtolAbs = xtolAbs
82-
self.xtolRel = xtolRel
83-
self.ftolAbs = ftolAbs
84-
self.ftolRel = ftolRel
85-
self.gtol = gtol
86-
self.iterations = iterations
87-
self.maxIterations = maxIterations
88-
self.elapsedTimeMicro = elapsedTimeMicro
41+
initalStepSize: float = 0.0
42+
stepTolerance: float = 0.0
43+
lastXtolAbs: float = 0.0
44+
lastXtolRel: float = 0.0
45+
lastFtolAbs: float = 0.0
46+
lastFtolRel: float = 0.0
47+
lastGtol: float = 0.0
48+
xtolAbs: float = 0.0
49+
xtolRel: float = 0.0
50+
ftolAbs: float = 0.0
51+
ftolRel: float = 0.0
52+
gtol: float = 0.0
53+
iterations: int = 0
54+
maxIterations: int = 0
55+
elapsedTimeMicro: int = 0
8956

9057
@staticmethod
9158
def _format_elapsed_time(elapsedMicro):

0 commit comments

Comments
 (0)