pcglasso 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,48 @@
1
+ name: CI
2
+
3
+ # Build the extension on every platform and run the test suite, so compile
4
+ # breakage (notably the pyo3/rust-numpy binding surface) and behavioural
5
+ # regressions are caught before a release is ever tagged. Tags do not match
6
+ # the branch filter, so this does not double-run alongside the release
7
+ # workflow.
8
+ on:
9
+ push:
10
+ branches: [main, master]
11
+ pull_request:
12
+ workflow_dispatch:
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ concurrency:
18
+ group: ci-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ build:
23
+ name: build & test (${{ matrix.os }})
24
+ runs-on: ${{ matrix.os }}
25
+ strategy:
26
+ fail-fast: false
27
+ matrix:
28
+ os: [ubuntu-latest, macos-14, windows-latest]
29
+ steps:
30
+ - uses: actions/checkout@v4
31
+
32
+ - uses: actions/setup-python@v5
33
+ with:
34
+ python-version: "3.10"
35
+
36
+ - name: Build wheel
37
+ uses: PyO3/maturin-action@v1
38
+ with:
39
+ command: build
40
+ args: --release --out dist
41
+ manylinux: auto
42
+
43
+ - name: Install and run tests
44
+ shell: bash
45
+ run: |
46
+ python -m pip install --upgrade pip
47
+ python -m pip install --find-links dist "pcglasso[test]"
48
+ pytest -q
@@ -0,0 +1,169 @@
1
+ name: Release
2
+
3
+ # Tag push (vX.Y.Z) -> build wheels + sdist -> GitHub release -> publish to PyPI.
4
+ # A manual run (workflow_dispatch) only builds, and can optionally publish to
5
+ # TestPyPI for a dry run.
6
+ on:
7
+ push:
8
+ tags: ["v*"]
9
+ workflow_dispatch:
10
+ inputs:
11
+ testpypi:
12
+ description: "Publish the built artifacts to TestPyPI"
13
+ type: boolean
14
+ default: false
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+ # Fail fast if the tag does not match the packaged version.
21
+ check-version:
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - name: Verify tag matches pyproject version
26
+ if: startsWith(github.ref, 'refs/tags/')
27
+ shell: bash
28
+ run: |
29
+ tag="${GITHUB_REF_NAME#v}"
30
+ ver=$(grep -m1 '^version' pyproject.toml | sed -E 's/.*"(.*)".*/\1/')
31
+ cargo_ver=$(grep -m1 '^version' Cargo.toml | sed -E 's/.*"(.*)".*/\1/')
32
+ echo "tag=$tag pyproject=$ver cargo=$cargo_ver"
33
+ if [ "$tag" != "$ver" ]; then
34
+ echo "::error::Tag v$tag does not match pyproject version $ver"; exit 1
35
+ fi
36
+ if [ "$ver" != "$cargo_ver" ]; then
37
+ echo "::error::pyproject version $ver != Cargo.toml version $cargo_ver"; exit 1
38
+ fi
39
+
40
+ # Gate every build/publish job on a green test suite across all platforms.
41
+ test:
42
+ needs: check-version
43
+ name: test (${{ matrix.os }})
44
+ runs-on: ${{ matrix.os }}
45
+ strategy:
46
+ fail-fast: false
47
+ matrix:
48
+ os: [ubuntu-latest, macos-14, windows-latest]
49
+ steps:
50
+ - uses: actions/checkout@v4
51
+ - uses: actions/setup-python@v5
52
+ with:
53
+ python-version: "3.10"
54
+ - name: Build wheel
55
+ uses: PyO3/maturin-action@v1
56
+ with:
57
+ command: build
58
+ args: --release --out dist
59
+ manylinux: auto
60
+ - name: Install and run tests
61
+ shell: bash
62
+ run: |
63
+ python -m pip install --upgrade pip
64
+ python -m pip install --find-links dist "pcglasso[test]"
65
+ pytest -q
66
+
67
+ linux:
68
+ needs: test
69
+ runs-on: ubuntu-latest
70
+ strategy:
71
+ matrix:
72
+ target: [x86_64, aarch64]
73
+ steps:
74
+ - uses: actions/checkout@v4
75
+ - uses: actions/setup-python@v5
76
+ with:
77
+ python-version: "3.10"
78
+ - uses: PyO3/maturin-action@v1
79
+ with:
80
+ target: ${{ matrix.target }}
81
+ args: --release --out dist
82
+ manylinux: auto
83
+ - uses: actions/upload-artifact@v4
84
+ with:
85
+ name: wheels-linux-${{ matrix.target }}
86
+ path: dist
87
+
88
+ macos:
89
+ needs: test
90
+ runs-on: macos-14
91
+ steps:
92
+ - uses: actions/checkout@v4
93
+ - uses: actions/setup-python@v5
94
+ with:
95
+ python-version: "3.10"
96
+ - uses: PyO3/maturin-action@v1
97
+ with:
98
+ target: universal2-apple-darwin
99
+ args: --release --out dist
100
+ - uses: actions/upload-artifact@v4
101
+ with:
102
+ name: wheels-macos-universal2
103
+ path: dist
104
+
105
+ windows:
106
+ needs: test
107
+ runs-on: windows-latest
108
+ steps:
109
+ - uses: actions/checkout@v4
110
+ - uses: actions/setup-python@v5
111
+ with:
112
+ python-version: "3.10"
113
+ - uses: PyO3/maturin-action@v1
114
+ with:
115
+ target: x64
116
+ args: --release --out dist
117
+ - uses: actions/upload-artifact@v4
118
+ with:
119
+ name: wheels-windows-x64
120
+ path: dist
121
+
122
+ sdist:
123
+ needs: test
124
+ runs-on: ubuntu-latest
125
+ steps:
126
+ - uses: actions/checkout@v4
127
+ - uses: PyO3/maturin-action@v1
128
+ with:
129
+ command: sdist
130
+ args: --out dist
131
+ - uses: actions/upload-artifact@v4
132
+ with:
133
+ name: wheels-sdist
134
+ path: dist
135
+
136
+ release:
137
+ needs: [linux, macos, windows, sdist]
138
+ runs-on: ubuntu-latest
139
+ permissions:
140
+ contents: write # create the GitHub release
141
+ id-token: write # PyPI trusted publishing (OIDC) — no stored token
142
+ steps:
143
+ - uses: actions/download-artifact@v4
144
+ with:
145
+ path: dist
146
+ merge-multiple: true
147
+
148
+ - name: List artifacts
149
+ run: ls -R dist
150
+
151
+ - name: GitHub release
152
+ if: startsWith(github.ref, 'refs/tags/')
153
+ uses: softprops/action-gh-release@v2
154
+ with:
155
+ files: dist/*
156
+ generate_release_notes: true
157
+
158
+ - name: Publish to PyPI
159
+ if: ${{ startsWith(github.ref, 'refs/tags/') && !inputs.testpypi }}
160
+ uses: pypa/gh-action-pypi-publish@release/v1
161
+ with:
162
+ packages-dir: dist
163
+
164
+ - name: Publish to TestPyPI
165
+ if: ${{ inputs.testpypi }}
166
+ uses: pypa/gh-action-pypi-publish@release/v1
167
+ with:
168
+ packages-dir: dist
169
+ repository-url: https://test.pypi.org/legacy/
@@ -0,0 +1,20 @@
1
+ # Rust
2
+ /target
3
+ Cargo.lock
4
+
5
+ # Python
6
+ __pycache__/
7
+ *.py[cod]
8
+ *.so
9
+ *.pyd
10
+ build/
11
+ dist/
12
+ *.egg-info/
13
+ .venv/
14
+ .eggs/
15
+
16
+ # PDF extraction cache (exploration only)
17
+ .pdfwork/
18
+
19
+ # Throwaway dev scripts (parity / benchmark)
20
+ scratch/
@@ -0,0 +1,46 @@
1
+ cff-version: 1.2.0
2
+ message: 'If you use this software, please cite it as below.'
3
+ title: 'pcglasso: fast Partial Correlation Graphical LASSO'
4
+ abstract: >-
5
+ A fast Python implementation of the Partial Correlation Graphical LASSO
6
+ (PCGLASSO) with the iterative coordinate-descent core written in Rust
7
+ (PyO3 / maturin).
8
+ type: software
9
+ authors:
10
+ - name: pcglasso-dev
11
+ license: GPL-3.0-or-later
12
+ repository-code: 'https://github.com/shahrozeabbas/pcglasso'
13
+ url: 'https://github.com/shahrozeabbas/pcglasso'
14
+ version: 0.1.0
15
+ keywords:
16
+ - graphical-lasso
17
+ - partial-correlation
18
+ - precision-matrix
19
+ - gaussian-graphical-model
20
+ - sparse-estimation
21
+ references:
22
+ - type: article
23
+ title: Partial correlation graphical LASSO
24
+ authors:
25
+ - family-names: Carter
26
+ - family-names: Rossell
27
+ - family-names: Smith
28
+ journal: Scandinavian Journal of Statistics
29
+ year: 2024
30
+ - type: article
31
+ title: >-
32
+ Existence and optimisation of the partial correlation graphical lasso
33
+ authors:
34
+ - family-names: Carter
35
+ - family-names: Molinari
36
+ year: 2025
37
+ - type: article
38
+ title: >-
39
+ Identifying network hubs with the partial correlation graphical LASSO
40
+ authors:
41
+ - family-names: Bogdan
42
+ - family-names: Chojecki
43
+ - family-names: Hejný
44
+ - family-names: Kołodziejek
45
+ - family-names: Wallin
46
+ year: 2026
@@ -0,0 +1,269 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "autocfg"
7
+ version = "1.5.1"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
10
+
11
+ [[package]]
12
+ name = "cfg-if"
13
+ version = "1.0.4"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
16
+
17
+ [[package]]
18
+ name = "heck"
19
+ version = "0.5.0"
20
+ source = "registry+https://github.com/rust-lang/crates.io-index"
21
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
22
+
23
+ [[package]]
24
+ name = "indoc"
25
+ version = "2.0.7"
26
+ source = "registry+https://github.com/rust-lang/crates.io-index"
27
+ checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
28
+ dependencies = [
29
+ "rustversion",
30
+ ]
31
+
32
+ [[package]]
33
+ name = "libc"
34
+ version = "0.2.186"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
37
+
38
+ [[package]]
39
+ name = "matrixmultiply"
40
+ version = "0.3.10"
41
+ source = "registry+https://github.com/rust-lang/crates.io-index"
42
+ checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08"
43
+ dependencies = [
44
+ "autocfg",
45
+ "rawpointer",
46
+ ]
47
+
48
+ [[package]]
49
+ name = "memoffset"
50
+ version = "0.9.1"
51
+ source = "registry+https://github.com/rust-lang/crates.io-index"
52
+ checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
53
+ dependencies = [
54
+ "autocfg",
55
+ ]
56
+
57
+ [[package]]
58
+ name = "ndarray"
59
+ version = "0.16.1"
60
+ source = "registry+https://github.com/rust-lang/crates.io-index"
61
+ checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841"
62
+ dependencies = [
63
+ "matrixmultiply",
64
+ "num-complex",
65
+ "num-integer",
66
+ "num-traits",
67
+ "portable-atomic",
68
+ "portable-atomic-util",
69
+ "rawpointer",
70
+ ]
71
+
72
+ [[package]]
73
+ name = "num-complex"
74
+ version = "0.4.6"
75
+ source = "registry+https://github.com/rust-lang/crates.io-index"
76
+ checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
77
+ dependencies = [
78
+ "num-traits",
79
+ ]
80
+
81
+ [[package]]
82
+ name = "num-integer"
83
+ version = "0.1.46"
84
+ source = "registry+https://github.com/rust-lang/crates.io-index"
85
+ checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
86
+ dependencies = [
87
+ "num-traits",
88
+ ]
89
+
90
+ [[package]]
91
+ name = "num-traits"
92
+ version = "0.2.19"
93
+ source = "registry+https://github.com/rust-lang/crates.io-index"
94
+ checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
95
+ dependencies = [
96
+ "autocfg",
97
+ ]
98
+
99
+ [[package]]
100
+ name = "numpy"
101
+ version = "0.22.1"
102
+ source = "registry+https://github.com/rust-lang/crates.io-index"
103
+ checksum = "edb929bc0da91a4d85ed6c0a84deaa53d411abfb387fc271124f91bf6b89f14e"
104
+ dependencies = [
105
+ "libc",
106
+ "ndarray",
107
+ "num-complex",
108
+ "num-integer",
109
+ "num-traits",
110
+ "pyo3",
111
+ "rustc-hash",
112
+ ]
113
+
114
+ [[package]]
115
+ name = "once_cell"
116
+ version = "1.21.4"
117
+ source = "registry+https://github.com/rust-lang/crates.io-index"
118
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
119
+
120
+ [[package]]
121
+ name = "pcglasso"
122
+ version = "0.1.0"
123
+ dependencies = [
124
+ "numpy",
125
+ "pyo3",
126
+ ]
127
+
128
+ [[package]]
129
+ name = "portable-atomic"
130
+ version = "1.13.1"
131
+ source = "registry+https://github.com/rust-lang/crates.io-index"
132
+ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
133
+
134
+ [[package]]
135
+ name = "portable-atomic-util"
136
+ version = "0.2.7"
137
+ source = "registry+https://github.com/rust-lang/crates.io-index"
138
+ checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
139
+ dependencies = [
140
+ "portable-atomic",
141
+ ]
142
+
143
+ [[package]]
144
+ name = "proc-macro2"
145
+ version = "1.0.106"
146
+ source = "registry+https://github.com/rust-lang/crates.io-index"
147
+ checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
148
+ dependencies = [
149
+ "unicode-ident",
150
+ ]
151
+
152
+ [[package]]
153
+ name = "pyo3"
154
+ version = "0.22.6"
155
+ source = "registry+https://github.com/rust-lang/crates.io-index"
156
+ checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884"
157
+ dependencies = [
158
+ "cfg-if",
159
+ "indoc",
160
+ "libc",
161
+ "memoffset",
162
+ "once_cell",
163
+ "portable-atomic",
164
+ "pyo3-build-config",
165
+ "pyo3-ffi",
166
+ "pyo3-macros",
167
+ "unindent",
168
+ ]
169
+
170
+ [[package]]
171
+ name = "pyo3-build-config"
172
+ version = "0.22.6"
173
+ source = "registry+https://github.com/rust-lang/crates.io-index"
174
+ checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38"
175
+ dependencies = [
176
+ "once_cell",
177
+ "target-lexicon",
178
+ ]
179
+
180
+ [[package]]
181
+ name = "pyo3-ffi"
182
+ version = "0.22.6"
183
+ source = "registry+https://github.com/rust-lang/crates.io-index"
184
+ checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636"
185
+ dependencies = [
186
+ "libc",
187
+ "pyo3-build-config",
188
+ ]
189
+
190
+ [[package]]
191
+ name = "pyo3-macros"
192
+ version = "0.22.6"
193
+ source = "registry+https://github.com/rust-lang/crates.io-index"
194
+ checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453"
195
+ dependencies = [
196
+ "proc-macro2",
197
+ "pyo3-macros-backend",
198
+ "quote",
199
+ "syn",
200
+ ]
201
+
202
+ [[package]]
203
+ name = "pyo3-macros-backend"
204
+ version = "0.22.6"
205
+ source = "registry+https://github.com/rust-lang/crates.io-index"
206
+ checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe"
207
+ dependencies = [
208
+ "heck",
209
+ "proc-macro2",
210
+ "pyo3-build-config",
211
+ "quote",
212
+ "syn",
213
+ ]
214
+
215
+ [[package]]
216
+ name = "quote"
217
+ version = "1.0.45"
218
+ source = "registry+https://github.com/rust-lang/crates.io-index"
219
+ checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
220
+ dependencies = [
221
+ "proc-macro2",
222
+ ]
223
+
224
+ [[package]]
225
+ name = "rawpointer"
226
+ version = "0.2.1"
227
+ source = "registry+https://github.com/rust-lang/crates.io-index"
228
+ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
229
+
230
+ [[package]]
231
+ name = "rustc-hash"
232
+ version = "1.1.0"
233
+ source = "registry+https://github.com/rust-lang/crates.io-index"
234
+ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
235
+
236
+ [[package]]
237
+ name = "rustversion"
238
+ version = "1.0.22"
239
+ source = "registry+https://github.com/rust-lang/crates.io-index"
240
+ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
241
+
242
+ [[package]]
243
+ name = "syn"
244
+ version = "2.0.118"
245
+ source = "registry+https://github.com/rust-lang/crates.io-index"
246
+ checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
247
+ dependencies = [
248
+ "proc-macro2",
249
+ "quote",
250
+ "unicode-ident",
251
+ ]
252
+
253
+ [[package]]
254
+ name = "target-lexicon"
255
+ version = "0.12.16"
256
+ source = "registry+https://github.com/rust-lang/crates.io-index"
257
+ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
258
+
259
+ [[package]]
260
+ name = "unicode-ident"
261
+ version = "1.0.24"
262
+ source = "registry+https://github.com/rust-lang/crates.io-index"
263
+ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
264
+
265
+ [[package]]
266
+ name = "unindent"
267
+ version = "0.2.4"
268
+ source = "registry+https://github.com/rust-lang/crates.io-index"
269
+ checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
@@ -0,0 +1,26 @@
1
+ [package]
2
+ name = "pcglasso"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ description = "Rust core for the Partial Correlation Graphical LASSO (PCGLASSO)"
6
+ license = "GPL-3.0-or-later"
7
+ readme = "README.md"
8
+
9
+ [lib]
10
+ name = "_core"
11
+ crate-type = ["cdylib"]
12
+
13
+ # We depend only on pyo3 and rust-numpy. ndarray is consumed via the
14
+ # `numpy::ndarray` re-export so its version always matches rust-numpy's,
15
+ # and the solver core needs no BLAS/LAPACK backend (pure-Rust wheels).
16
+ #
17
+ # `abi3-py310` builds against CPython's stable ABI: one forward-compatible
18
+ # wheel per platform that works on Python >= 3.10 (no per-version matrix).
19
+ [dependencies]
20
+ pyo3 = { version = "0.22", features = ["extension-module", "abi3-py310"] }
21
+ numpy = "0.22"
22
+
23
+ [profile.release]
24
+ opt-level = 3
25
+ lto = true
26
+ codegen-units = 1