Compare commits

...

17 Commits

Author SHA1 Message Date
2a2ba7beef fix(gcc): brought in v2.3.1 of libcomposition
this version of libcomposition fixes a warning in gcc builds related to implimentation defined behavior
2025-12-22 07:45:58 -05:00
63caa78f15 build(libconfig): fixed issues with libconfig installing in python wheel 2025-12-20 14:49:27 -05:00
47341c9845 perf(composition): Brings v2.3.0 of libcomposition
This version of libcomposition stores all data contiguoiusly in memory
to enhance optimization and cache locality
2025-12-08 11:54:59 -05:00
f8599ead01 perf(libcomposition): Faster hashin
Brings in libcomposition v2.2.6, which brings a much faster composition
hashing algorithm
2025-12-07 09:43:24 -05:00
80e62fe54e docs(meson): version bump v0.9.14 -> v0.9.15
this version brings compostion hash caching from v2.2.5 of libcomposition
2025-12-07 07:57:11 -05:00
c7d64feb3c feat(composition): libcomposition
brought libcomposition v2.2.5
2025-12-07 07:56:16 -05:00
243b51a966 docs(logo): added logo 2025-12-06 13:46:16 -05:00
6ff4c88aa7 feat(reflection): Bring in new libconfig
This version of fourdst (v0.9.14) brings in the version libconfig which
includes reflection based config filed (v2.0.2).

This is a breaking change as any code which used versions of libconfig <
v2.0.0 will no longer function when linked against this version of
fourdst
2025-12-06 11:04:55 -05:00
979ec80dc4 fix(wasm): propegate all build flags 2025-12-03 11:27:01 -05:00
2caf46c984 docs(meson): version bump v0.9.11 -> v0.9.12
this version bring wasm support
2025-12-03 11:17:13 -05:00
d52795fa48 build(wasm): all fourdst subprojects support wasm
Updated version tags to bring in subproject versions which compile to wasm
2025-12-03 11:16:50 -05:00
86be969729 fix(unity): brought version of libcomposition which works with unity builds
Note that openssl is incompatible with unity builds. This means that
fourdst can only be built as a unity build if libplugin (which is what
brings in openssl) is not build. Generally this will happen when
building only the python bindings which do not depend on openssl or
libplugin
2025-11-28 11:46:39 -05:00
ac76b4ad3b docs(libplugin): version bump
fourdst v0.9.9 -> v0.9.10
libplugin v0.3.6 -> v0.3.7
2025-11-28 11:17:19 -05:00
b9f88d75ce fix(libplugin): Propegate build_python argument to libplugin 2025-11-28 11:02:33 -05:00
ab2ae12281 feat(meson): More granular build options
fourdst's build system now exposes some options to allow fine grained
control of what is built and what is not
2025-11-28 11:00:51 -05:00
6e489d15e5 fix(gcc): Fixed gcc build errors and warnings
Brought in libcomposition v2.2.1 and libplugin v0.3.5 which resolve gcc
build errors and warnings
2025-11-28 07:52:38 -05:00
250e03f00a feat(composition): added az_to_species binding and added bindings for fourdst exceptions 2025-11-26 12:31:46 -05:00
29 changed files with 4492 additions and 107 deletions

8
.gitignore vendored
View File

@@ -75,7 +75,11 @@ subprojects/liblogging/
subprojects/eigen-*/
!subprojects/pybind11.wrap
subprojects/libplugin/
subprojects/minizip-ng-*
subprojects/.wraplock
subprojects/openssl-*
subprojects/glaze/
subprojects/tomlplusplus-*/
*.csv
*.dot
@@ -83,6 +87,10 @@ subprojects/.wraplock
qhull.wrap
quill.wrap
yaml-cpp.wrap
minizip-ng.wrap
openssl.wrap
glaze.wrap
tomlplusplus.wrap
.vscode/

BIN
assets/logo/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

741
assets/logo/logo.svg Normal file
View File

@@ -0,0 +1,741 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="180"
height="180"
viewBox="0 0 180 180"
version="1.1"
id="svg1"
inkscape:export-filename="logo.png"
inkscape:export-xdpi="273.06668"
inkscape:export-ydpi="273.06668"
sodipodi:docname="logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px">
<inkscape:page
x="0"
y="0"
width="180"
height="180"
id="page2"
margin="0"
bleed="0" />
</sodipodi:namedview>
<defs
id="defs1">
<linearGradient
id="linearGradient7"
inkscape:collect="always">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0.47123286"
id="stop8" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop9" />
</linearGradient>
<linearGradient
id="linearGradient6"
inkscape:collect="always">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0.25479454"
id="stop6" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="0.81643838"
id="stop7" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-2"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(4.37549,17.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-3"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-15.62451,32.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-8"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(2.37549,48.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-0"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12.62451,72.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-36"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(7.37549,85.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-1"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(25.28054,89.619022)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-6"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(50.37549,73.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-37"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(19.37549,65.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-4"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(66.37549,82.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-88"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(97.37549,55.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-7"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(95.37549,26.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-78"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(52.37549,10.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-74"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(81.37549,52.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-22"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(83.37549,72.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-84"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(21.37549,-3.709955)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-840"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(22.37549,23.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-97"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(40.37549,6.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-86"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(83.37549,14.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-75"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(62.37549,-6.709955)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-12"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(71.37549,18.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-390"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(95.37549,-1.709955)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-91"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(110.37549,-108.39958)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-49"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(103.37549,14.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-757"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(108.37549,23.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-00"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(94.37549,45.290041)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-99"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-21.62451,21.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-56"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-26.62451,8.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-568"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-24.62451,42.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-18"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-33.62451,53.290045)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-371"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(66.356312,113.7462)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-05"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(48.90074,92.618386)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-06"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(38.706064,82.855283)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6"
id="radialGradient7-87"
cx="50.969318"
cy="47.054764"
fx="50.969318"
fy="47.054764"
r="2.3448088"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(27.753062,86.761288)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient7"
id="radialGradient9"
cx="90"
cy="90"
fx="90"
fy="90"
r="18.667822"
gradientUnits="userSpaceOnUse" />
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<circle
style="fill:#374c75;stroke:none;stroke-width:5.24053;stroke-linecap:round;stroke-linejoin:round"
id="path1"
cx="90"
cy="90"
r="87.521362" />
<circle
style="fill:url(#radialGradient7);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6"
cx="50.969318"
cy="47.054764"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-2);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-9"
cx="55.344807"
cy="64.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-3);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-0"
cx="35.344807"
cy="79.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-8);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-6"
cx="53.344807"
cy="95.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-0);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-91"
cx="38.344807"
cy="119.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-36);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-1"
cx="58.344807"
cy="132.3448"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-1);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-8"
cx="76.249855"
cy="136.67378"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-6);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-69"
cx="101.34481"
cy="120.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-37);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-81"
cx="70.34481"
cy="112.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-4);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-55"
cx="117.34481"
cy="129.3448"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-88);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-2"
cx="148.3448"
cy="102.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-7);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-7"
cx="146.3448"
cy="73.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-78);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-4"
cx="103.34481"
cy="57.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-74);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-3"
cx="132.3448"
cy="99.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-22);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-71"
cx="134.3448"
cy="119.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-84);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-46"
cx="72.34481"
cy="43.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-840);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-75"
cx="73.34481"
cy="70.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-97);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-30"
cx="91.34481"
cy="53.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-86);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-39"
cx="134.3448"
cy="61.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-75);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-87"
cx="113.34481"
cy="40.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-12);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-59"
cx="122.34481"
cy="65.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-390);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-32"
cx="146.3448"
cy="45.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-91);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-719"
cx="161.3448"
cy="-61.34481"
r="2.3448088"
transform="scale(1,-1)" />
<circle
style="fill:url(#radialGradient7-49);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-93"
cx="154.3448"
cy="61.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-757);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-47"
cx="159.3448"
cy="70.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-00);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-74"
cx="145.3448"
cy="92.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-99);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-77"
cx="29.344809"
cy="68.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-56);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-60"
cx="24.344809"
cy="55.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-568);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-68"
cx="26.344809"
cy="89.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-18);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-31"
cx="17.344809"
cy="100.34481"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-371);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-748"
cx="117.32563"
cy="160.80096"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-05);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-56"
cx="99.870064"
cy="139.67314"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-06);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-43"
cx="89.675385"
cy="129.91005"
r="2.3448088" />
<circle
style="fill:url(#radialGradient7-87);stroke:none;stroke-width:7.62063;stroke-linecap:round;stroke-linejoin:round"
id="circle6-327"
cx="78.722382"
cy="133.81606"
r="2.3448088" />
<path
id="circle20"
style="display:none;fill:#374c75;stroke-width:4.81664;stroke-linecap:round;stroke-linejoin:round"
d="M 90.272303,176.22323 A 88.020147,73.516473 0.86858237 0 1 3.3767108,101.38091 88.020147,73.516473 0.86858237 0 1 92.501182,29.207184 88.020147,73.516473 0.86858237 0 1 179.39677,104.04951 88.020147,73.516473 0.86858237 0 1 90.272303,176.22323 Z" />
<text
xml:space="preserve"
style="font-size:26.6667px;font-family:'FiraCode Nerd Font Mono';-inkscape-font-specification:'FiraCode Nerd Font Mono';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;display:inline;fill:#ffffff;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round"
id="text7"><textPath
xlink:href="#circle20"
startOffset="50%"
id="textPath20"><tspan
id="tspan7"
style="font-size:26.6667px">fourdst</tspan></textPath></text>
<circle
style="fill:url(#radialGradient9);stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round"
id="path7"
cx="90"
cy="90"
r="18.667822" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 50.682124,46.734918 89.601575,89.838407"
id="path9" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 132.35494,99.297466 89.423422,88.81921"
id="path10"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 146.30623,73.316336 90.027634,89.020614"
id="path11"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 103.41948,57.260221 89.222018,88.416401"
id="path12"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="m 91.367968,53.106165 -1.340334,34.50462"
id="path13"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 38.413281,119.31284 89.222018,89.423422"
id="path14"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 116.61298,128.49582 89.423422,89.624826"
id="path15" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="m 35.322086,79.276849 54.30274,10.146573"
id="path16"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 146.2356,45.337388 90.631847,89.624826"
id="path17"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 101.33758,120.39585 89.82623,89.624826"
id="path18"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 58.341803,132.27333 88.214997,90.833251"
id="path19"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffffff;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.4, 1.2;stroke-dashoffset:0;stroke-opacity:1"
d="M 78.664621,133.86567 89.457043,91.171874"
id="path20"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -1,4 +1,9 @@
composition_p = subproject('libcomposition', default_options: ['pkg-config=' + pkg_config_bool_str])
composition_p = subproject('libcomposition',
default_options: [
'pkg_config=' + get_option('pkg_config').to_string(),
'build_tests=' + get_option('build_tests').to_string(),
'build_examples=false'
])
comp_dep = composition_p.get_variable('composition_dep')
libcomposition = composition_p.get_variable('libcomposition')
spw_dep = composition_p.get_variable('species_weight_dep')
@@ -7,4 +12,4 @@ composition_dep = [
spw_dep,
]
alias_target('build-libcomposition', libcomposition)
alias_target('build-libcomposition', libcomposition)

View File

@@ -1,5 +1,7 @@
config_p = subproject('libconfig', default_options:['pkg-config=false'])
config_p = subproject('libconfig',
default_options:[
'pkg_config=' + get_option('pkg_config').to_string(),
'build_tests=' + get_option('build_tests').to_string(),
'build_examples=false'
])
config_dep = config_p.get_variable('config_dep')
libconfig = config_p.get_variable('libconfig')
alias_target('build-libconfig', libconfig)

View File

@@ -1,4 +1,8 @@
const_p = subproject('libconstants', default_options: ['pkg-config=' + pkg_config_bool_str])
const_p = subproject('libconstants', default_options: [
'pkg_config=' + get_option('pkg_config').to_string(),
'build_tests=' + get_option('build_tests').to_string(),
'build_examples=false'
])
const_dep = const_p.get_variable('const_dep')
libconst = const_p.get_variable('libconst')

View File

@@ -1,4 +1,8 @@
logging_p = subproject('liblogging', default_options: ['pkg-config=' + pkg_config_bool_str])
logging_p = subproject('liblogging', default_options: [
'pkg_config=' + get_option('pkg_config').to_string(),
'build_tests=' + get_option('build_tests').to_string(),
'build_examples=false'
])
liblogging = logging_p.get_variable('liblogging')
logging_dep = logging_p.get_variable('logging_dep')
@@ -6,4 +10,4 @@ quill_dep = logging_p.get_variable('quill_dep')
log_dep = [logging_dep, quill_dep]
alias_target('build-liblogging', liblogging)
alias_target('build-liblogging', liblogging)

View File

@@ -1,6 +1,10 @@
plugin_p = subproject('libplugin', default_options: ['pkg-config=' + pkg_config_bool_str, 'tests=' + get_option('tests').to_string()])
plugin_p = subproject('libplugin', default_options: [
'pkg-config=' + get_option('pkg_config').to_string(),
'build-tests=' + get_option('build_tests').to_string(),
'python-wheel=' + get_option('build_python').to_string(),
])
libplugin = plugin_p.get_variable('libplugin')
plugin_dep = plugin_p.get_variable('plugin_dep')
alias_target('build-libplugin', libplugin)
alias_target('build-libplugin', libplugin)

View File

@@ -1,6 +1,19 @@
subdir('libcomposition')
subdir('libconfig')
subdir('libconstants')
subdir('liblogging')
subdir('libplugin')
subdir('pybind')
if get_option('build_lib_comp') or get_option('build_lib_all') or get_option('build_python')
subdir('libcomposition')
endif
if get_option('build_lib_config') or get_option('build_lib_all') or get_option('build_python')
subdir('libconfig')
endif
if get_option('build_lib_const') or get_option('build_lib_all') or get_option('build_python')
subdir('libconstants')
endif
if get_option('build_lib_log') or get_option('build_lib_all')
subdir('liblogging')
endif
if get_option('build_lib_plugin') or get_option('build_lib_all')
subdir('libplugin')
endif
if get_option('build_python')
subdir('pybind')
endif

View File

@@ -1,8 +1,7 @@
# --- Python Extension Setup ---
py_installation = import('python').find_installation('python3', pure: false)
py_mod = py_installation.extension_module(
'_phys', # Name of the generated .so/.pyd file (without extension)
'_phys',
sources: [
meson.project_source_root() + '/src-pybind/bindings.cpp',
meson.project_source_root() + '/src-pybind/composition/bindings.cpp',
@@ -34,6 +33,7 @@ py_installation.install_sources(
meson.project_source_root() + '/src-pybind/fourdst/_phys/atomic.pyi',
meson.project_source_root() + '/src-pybind/fourdst/_phys/config.pyi',
meson.project_source_root() + '/src-pybind/fourdst/_phys/constants.pyi',
meson.project_source_root() + '/src-pybind/fourdst/_phys/exceptions.pyi',
),
subdir: 'fourdst/',
)

View File

@@ -1,19 +1,13 @@
project('fourdst', 'cpp', version: 'v0.9.6', default_options: ['cpp_std=c++23'], meson_version: '>=1.5.0')
project('fourdst', 'cpp', version: 'v0.9.19', default_options: ['cpp_std=c++23'], meson_version: '>=1.5.0')
add_project_arguments('-fvisibility=default', language: 'cpp')
pkg_config_bool_str = 'false'
if get_option('pkg-config')
pkg_config_bool_str = 'true'
endif
# Configure vendor libraries
subdir('build-config')
# Configure python bindings
subdir('build-python')
# Build python bindings
subdir('src-pybind')
if get_option('build_python')
subdir('build-python')
endif

View File

@@ -1,3 +1,10 @@
option('pkg-config', type: 'boolean', value: false, description: 'generate pkg-config file for all libraries and fourdst (defaults to false to allow easy pip building)')
option('electron-build-py-backend', type: 'boolean', value: false, description: 'use pyinstaller to build the python backend for the electron app')
option('tests', type: 'boolean', value: false, description: 'compile subproject tests')
option('pkg_config', type: 'boolean', value: false, description: 'generate pkg-config file for all libraries and fourdst (defaults to false to allow easy pip building)')
option('electron_build_py_backend', type: 'boolean', value: false, description: 'use pyinstaller to build the python backend for the electron app')
option('build_tests', type: 'boolean', value: false, description: 'compile subproject tests')
option('build_lib_all', type: 'boolean', value: true, description: 'build the full fourdst library with all features enabled')
option('build_lib_comp', type: 'boolean', value: false, description: 'build the fourdst libcomposition library')
option('build_lib_config', type: 'boolean', value: false, description: 'build the fourdst library configuration tool only')
option('build_lib_const', type: 'boolean', value: false, description: 'build the fourdst library constants only')
option('build_python', type: 'boolean', value: true, description: 'build the python bindings so you can use fourdst from python. This will also build libcomposition, libconfig, and libconstants')
option('build_lib_log', type: 'boolean', value: false, description: 'build the fourdst library logging features only')
option('build_lib_plugin', type: 'boolean', value: false, description: 'build the fourdst plugin module only')

View File

@@ -8,7 +8,7 @@ build-backend = "mesonpy"
[project]
name = "fourdst" # Choose your Python package name
version = "0.8.5" # Your project's version
version = "v0.9.11" # Your project's version
description = "Python interface to the utility fourdst modules from the 4D-STAR project"
readme = "readme.md"
license = { file = "LICENSE.txt" } # Reference your license file [cite: 2]
@@ -34,3 +34,18 @@ dependencies = [
[project.scripts]
fourdst-cli = "fourdst.cli.main:app"
[tool.meson-python.args]
setup = [
'-Dpkg_config=false',
'-Dbuild_python=true',
'-Delectron_build_py_backend=false',
'-Dbuild_tests=false',
'-Dbuild_lib_all=false',
'-Dbuild_lib_comp=true',
'-Dbuild_lib_config=true',
'-Dbuild_lib_const=true',
'-Dbuild_lib_log=true',
'-Dbuild_lib_plugin=false'
]

View File

@@ -1,3 +1,4 @@
![logo](assets/logo/logo.png)
# fourdst
A hub repository for 4D-STAR utility projects (such as libcomposition, libconfig, and liblogging)

View File

@@ -9,6 +9,9 @@
PYBIND11_MODULE(_phys, m) {
m.doc() = "Python bindings for the fourdst utility modules which are a part of the 4D-STAR project.";
auto exceptionMod = m.def_submodule("exceptions", "Exception bindings");
register_comp_exceptions(exceptionMod);
auto atomicMod = m.def_submodule("atomic", "Species bindings");
register_species_bindings(atomicMod);
@@ -18,6 +21,6 @@ PYBIND11_MODULE(_phys, m) {
auto constMod = m.def_submodule("constants", "Constants-module bindings");
register_const_bindings(constMod);
auto configMod = m.def_submodule("config", "Configuration-module bindings");
register_config_bindings(configMod);
}
const auto configMod = m.def_submodule("config", "Configuration-module bindings");
register_config_enums(configMod);
}

View File

@@ -12,6 +12,7 @@
#include "fourdst/atomic/species.h"
#include "fourdst/composition/utils.h"
#include "fourdst/composition/utils/composition_hash.h"
#include "fourdst/composition/exceptions/exceptions_composition.h"
namespace py = pybind11;
@@ -276,13 +277,6 @@ void register_comp_bindings(pybind11::module &m) {
&fourdst::composition::utils::CompositionHash::hash_exact<fourdst::composition::Composition>,
py::arg("composition"),
"Compute a hash for a given Composition object."
)
.def_static(
"hash_quantized",
&fourdst::composition::utils::CompositionHash::hash_quantized<fourdst::composition::Composition>,
py::arg("composition"),
py::arg("eps"),
"Compute a quantized hash for a given Composition object with specified precision."
);
utils.def(
@@ -335,7 +329,7 @@ void register_comp_bindings(pybind11::module &m) {
}
void register_species_bindings(const pybind11::module &chem_submodule) {
void register_species_bindings(pybind11::module &chem_submodule) {
// --- Bindings for species module ---
py::class_<fourdst::atomic::Species>(chem_submodule, "Species")
.def("mass", &fourdst::atomic::Species::mass, "Get atomic mass (amu)")
@@ -372,4 +366,35 @@ void register_species_bindings(const pybind11::module &chem_submodule) {
chem_submodule.attr("species") = py::cast(fourdst::atomic::species); // Expose the species map
auto replace_dash_with_underscore = [](const std::string& str) {
std::string result = str;
std::ranges::replace(result, '-', '_');
return result;
};
for (const auto& [name, species] : fourdst::atomic::species) {
chem_submodule.attr(replace_dash_with_underscore(name).c_str()) = py::cast(species);
}
chem_submodule.def("az_to_species",
[](const int a, const int z) {
const auto result = fourdst::atomic::az_to_species(a, z);
if (!result) {
throw fourdst::composition::exceptions::SpeciesError(std::format("Species with A={} and Z={} not found.", a, z));
}
return result.value();
},
py::arg("a"),
py::arg("z"),
"Get Species object from proton number (Z) and mass number (A)."
);
}
void register_comp_exceptions(pybind11::module &m) {
py::register_exception<fourdst::composition::exceptions::CompositionError>(m, "CompositionError");
py::register_exception<fourdst::composition::exceptions::InvalidCompositionError>(m, "InvalidCompositionError", m.attr("CompositionError"));
py::register_exception<fourdst::composition::exceptions::SpeciesError>(m, "SpeciesError");
py::register_exception<fourdst::composition::exceptions::UnknownSymbolError>(m, "UnknownSymbolError", m.attr("SpeciesError"));
py::register_exception<fourdst::composition::exceptions::UnregisteredSymbolError>(m, "UnregisteredSymbolError", m.attr("SpeciesError"));
}

View File

@@ -2,5 +2,7 @@
#include <pybind11/pybind11.h>
void register_comp_exceptions(pybind11::module &m);
void register_species_bindings(pybind11::module &m);
void register_comp_bindings(pybind11::module &m);
void register_species_bindings(const pybind11::module &m);

View File

@@ -1,55 +1,17 @@
#include <pybind11/pybind11.h>
#include <pybind11/stl.h> // Needed for vectors, maps, sets, strings
#include <pybind11/stl_bind.h> // Needed for binding std::vector, std::map etc if needed directly
#include <string>
#include "bindings.h"
#include <pybind11/pybind11.h>
#include "fourdst/config/config.h"
namespace py = pybind11;
void register_config_enums(const pybind11::module_& m) {
using namespace fourdst::config;
pybind11::enum_<ConfigState>(m, "ConfigState")
.value("DEFAULT", ConfigState::DEFAULT)
.value("LOADED_FROM_FILE", ConfigState::LOADED_FROM_FILE)
.export_values();
// Helper function template for binding Config::get
template <typename T>
void def_config_get(py::module &m) {
m.def("get",
[](const std::string &key, T defaultValue) {
return fourdst::config::Config::getInstance().get<T>(key, defaultValue);
},
py::arg("key"), py::arg("defaultValue"),
"Get configuration value (type inferred from default)");
}
void register_config_bindings(pybind11::module &config_submodule) {
def_config_get<int>(config_submodule);
def_config_get<double>(config_submodule);
def_config_get<std::string>(config_submodule);
def_config_get<bool>(config_submodule);
config_submodule.def("loadConfig",
[](const std::string& configFilePath) {
return fourdst::config::Config::getInstance().loadConfig(configFilePath);
},
py::arg("configFilePath"),
"Load configuration from a YAML file.");
config_submodule.def("has",
[](const std::string &key) {
return fourdst::config::Config::getInstance().has(key);
},
py::arg("key"),
"Check if a key exists in the configuration.");
config_submodule.def("keys",
[]() {
return py::cast(fourdst::config::Config::getInstance().keys());
},
"Get a list of all configuration keys.");
config_submodule.def("__repr__",
[]() {
std::ostringstream oss;
oss << fourdst::config::Config::getInstance(); // Use the existing operator<<
return std::string("<fourdsse_bindings.config module accessing C++ Singleton>\n") + oss.str();
});
pybind11::enum_<RootNameLoadPolicy>(m, "RootNameLoadPolicy")
.value("FROM_FILE", RootNameLoadPolicy::FROM_FILE)
.value("KEEP_CURRENT", RootNameLoadPolicy::KEEP_CURRENT)
.export_values();
}

View File

@@ -1,5 +1,26 @@
#pragma once
#include <pybind11/pybind11.h>
#include "fourdst/config/config.h"
void register_config_bindings(pybind11::module &config_submodule);
#include <string>
#include <format>
void register_config_enums(const pybind11::module_& m);
template <typename ConfigType>
pybind11::class_<ConfigType> bind_config_specialization(pybind11::module_& m , const std::string& name) {
return pybind11::class_<ConfigType>(m, name.c_str())
.def(pybind11::init<>())
.def("load", &ConfigType::load, pybind11::arg("file_path"), "Load configuration from a file.")
.def("save", &ConfigType::save, pybind11::arg("file_path") = "config_output.toml", "Save configuration to a file.")
.def("save_schema", &ConfigType::save_schema, pybind11::arg("directory") = ".", "Save the configuration schema to a directory.")
.def("get_state", &ConfigType::get_state, "Get the current state of the configuration.")
.def("describe_state", &ConfigType::describe_state, "Get the current state of the configuration.")
.def("__repr__",
[](const ConfigType &cfg) -> std::string {
return std::format("{}", cfg);
}
);
}

View File

@@ -11,4 +11,4 @@ sys.modules['fourdst.config'] = config
__all__ = ['atomic', 'composition', 'constants', 'config', 'core', 'cli']
__version__ = 'v0.9.6'
__version__ = 'v0.9.11'

View File

@@ -6,4 +6,5 @@ from . import atomic
from . import composition
from . import config
from . import constants
__all__: list[str] = ['atomic', 'composition', 'config', 'constants']
from . import exceptions
__all__: list[str] = ['atomic', 'composition', 'config', 'constants', 'exceptions']

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,15 @@
"""
Exception bindings
"""
from __future__ import annotations
__all__: list[str] = ['CompositionError', 'InvalidCompositionError', 'SpeciesError', 'UnknownSymbolError', 'UnregisteredSymbolError']
class CompositionError(Exception):
pass
class InvalidCompositionError(CompositionError):
pass
class SpeciesError(Exception):
pass
class UnknownSymbolError(SpeciesError):
pass
class UnregisteredSymbolError(SpeciesError):
pass

View File

@@ -1,4 +0,0 @@
subdir('composition')
subdir('constants')
subdir('config')

View File

@@ -1,4 +1,4 @@
[wrap-git]
url = https://github.com/4D-STAR/libcomposition.git
revision = v2.2.0
revision = v2.3.1
depth = 1

View File

@@ -1,4 +1,4 @@
[wrap-git]
url = https://github.com/4D-STAR/libconfig.git
revision = v1.1.3
revision = v2.0.3
depth = 1

View File

@@ -1,4 +1,4 @@
[wrap-git]
url = https://github.com/4D-STAR/libconstants.git
revision = v1.1.0
revision = v1.1.1
depth = 1

View File

@@ -1,4 +1,4 @@
[wrap-git]
url = https://github.com/4D-STAR/liblogging.git
revision = v1.1.0
revision = v1.1.1
depth = 1

View File

@@ -1,4 +1,4 @@
[wrap-git]
url = https://github.com/4D-STAR/libplugin.git
revision = v0.3.4
revision = v0.3.7
depth = 1