Skip to main content

Simple Lattice/Graph Library

Project description

Build C++17 Rust Author License: Apache-2.0

lattice

Simple Lattice/Graph Library

Main functions

  • Access to information of lattice structure (sites, bonds, etc)
  • Construct lattice from unitcell, span vector of supercell, and boundary conditions
  • Construct lattice by adding sites and bonds one by one
  • Reading and writing ALPS Lattice XML file

Prerequisites

For Rust

  • Rust toolchain (rustc, cargo)

For Python

  • Python (>= 3.9)
  • Rust toolchain (rustc, cargo)
  • maturin
  • NumPy

For C++

  • C++-17 compiler
  • CMake (>= 3.14)
  • Eigen3
  • Rust toolchain (rustc, cargo) for auto-building rust/lattice-ffi

Note: C++ build may invoke cargo automatically to build rust/lattice-ffi when the shared library is missing.

Rust workspace

The repository is being extended with a Rust core under rust/ as the shared implementation base for future Python and Julia bindings.

C++ XML compatibility bridge (default)

Rust-backed XML implementation is now the default C++ XML backend.

When building C++ targets, CMake automatically builds rust/lattice-ffi with cargo if the required shared library is missing.

Rust targets are managed in the workspace under rust/:

  • lattice-core: core model + XML parser/writer
  • lattice-ffi: C ABI layer for C++ compatibility
  • lattice-python: PyO3/maturin Python bindings

Build, test, and sample run

Rust

Build and run Rust tests:

cargo build
cargo test

The Python extension crate is a workspace member, but it is not a default member because PyO3 extension modules should be linked by maturin. Build it with the Python instructions below.

Python

Create a virtual environment and install the Python extension in editable mode:

python3 -m venv .venv
.venv/bin/python -m pip install maturin numpy
.venv/bin/python -m maturin develop

From PyPI, the distribution name is lattice-graph-core and the import name is lattice:

python -m pip install lattice-graph-core

Run the Python tests:

.venv/bin/python -m unittest discover -s python/tests

See PyPI publishing notes for release-build and PyPI upload steps.

Minimal Python example:

import lattice

graph = lattice.Graph.simple(2, 4)
print(graph.num_sites)
print(graph.coordinates().shape)

Run Rust samples:

cargo run -p lattice-core --example construct1
cargo run -p lattice-core --example construct2
cargo run -p lattice-core --example construct3
cargo run -p lattice-core --example construct4
cargo run -p lattice-core --example construct_xml
cargo run -p lattice-core --example ising

C++ (default)

Configure and build:

cmake -S . -B build
cmake --build build

Run C++ tests:

Enable tests at configure time, then run ctest:

cmake -S . -B build -DLATTICE_BUILD_TESTS=ON
cmake --build build
ctest --test-dir build --output-on-failure

Run C++ samples:

./build/example/construct1
./build/example/construct2
./build/example/construct3
./build/example/construct4
./build/example/construct_xml
./build/example/ising

Workaround for MacOSX26.sdk

Use CMake presets to pin the SDK to MacOSX15.4.sdk:

cmake --preset macos-sdk154
cmake --build --preset macos-sdk154
ctest --preset macos-sdk154

Using Installed Package

Install into a prefix:

cmake --install build-sdk154 --prefix /path/to/prefix

CMake find_package(lattice)

Set CMAKE_PREFIX_PATH to the install prefix and use find_package:

cmake_minimum_required(VERSION 3.14)
project(lattice_consumer CXX)

find_package(lattice REQUIRED)

add_executable(app main.cpp)
target_link_libraries(app PRIVATE lattice::lattice)

Configure example:

cmake -S . -B build -DCMAKE_PREFIX_PATH=/path/to/prefix
cmake --build build

pkg-config

Set PKG_CONFIG_PATH and query compile/link flags:

export PKG_CONFIG_PATH=/path/to/prefix/lib/pkgconfig:$PKG_CONFIG_PATH
pkg-config --cflags --libs lattice

Compile example:

c++ -std=c++17 main.cpp $(pkg-config --cflags --libs lattice) -o app

Classes/types

  • lattice::basis

    Helper class that contains the shape, i.e. the set of basis vectors, of the unit cell.

  • lattice::unitcell

    Helper class that contains the structure, i.e. sites and bonds, of the unit cell.

  • lattice::graph

    This class contains the structure of the whole lattice structure. It provides various information of sites (vertices) and bonds (edges) via the following member functions:

    member functions description
    std::size_t dimension() const; dimension of the lattice
    std::size_t num_sites() const; total number of sites
    std::size_t site_type(std::size_t s) const; type of site s
    const coordinate_t& coordinate(std::size_t s) const; coordinate of site s
    std::size_t num_neighbors(std::size_t s) const; number of neighboring sites of site s
    std::size_t neighbor(std::size_t s, std::size_t k) const; k-th neighbor site of site s
    std::size_t neighbor_bond(std::size_t s, std::size_t k) const; bond connecting site s and its k-th neighbor site
    std::size_t num_bonds() const; total number of bonds
    int bond_type(std::size_t b) const; type of bond s
    std::size_t source(std::size_t b) const; start point (site) of bond b
    std::size_t target(std::size_t b) const; end point (site) of bond b

How to construct lattices

Rust

  • periodic chain lattice of 16 sites

    • simplest interface

      use lattice_core::Graph;
      
      let graph = Graph::simple(1, 16);
      
    • most generic interface

      use lattice_core::{Basis, BasisMatrix, Boundary, CoordinateVector, ExtentVector, Graph, OffsetVector, Unitcell};
      
      let basis = Basis::new(BasisMatrix::from_row_slice(1, 1, &[1.0]));
      let mut unitcell = Unitcell::new(1);
      unitcell.add_site(CoordinateVector::from_element(1, 0.0), 0);
      unitcell.add_bond(0, 0, OffsetVector::from_element(1, 1), 0);
      let extent = ExtentVector::from_element(1, 16);
      let boundary = vec![Boundary::Periodic; 1];
      let graph = Graph::from_basis_unitcell_extent(&basis, &unitcell, &extent, &boundary);
      
  • periodic square lattice of 4 x 4 sites

    • simplest interface

      use lattice_core::Graph;
      
      let graph = Graph::simple(2, 4);
      
    • most generic interface

      use lattice_core::{Basis, BasisMatrix, Boundary, CoordinateVector, ExtentVector, Graph, OffsetVector, Unitcell};
      
      let basis = Basis::new(BasisMatrix::from_row_slice(2, 2, &[1.0, 0.0, 0.0, 1.0]));
      let mut unitcell = Unitcell::new(2);
      unitcell.add_site(CoordinateVector::from_vec(vec![0.0, 0.0]), 0);
      unitcell.add_bond(0, 0, OffsetVector::from_vec(vec![1, 0]), 0);
      unitcell.add_bond(0, 0, OffsetVector::from_vec(vec![0, 1]), 0);
      let extent = ExtentVector::from_vec(vec![4, 4]);
      let boundary = vec![Boundary::Periodic; 2];
      let graph = Graph::from_basis_unitcell_extent(&basis, &unitcell, &extent, &boundary);
      
    • reading basis and unitcell from XML file

      use lattice_core::{read_basis_from_file, read_unitcell_from_file, Boundary, ExtentVector, Graph};
      
      let file = "cxx/example/lattices.xml";
      let basis = read_basis_from_file(file, "square lattice")?;
      let cell = read_unitcell_from_file(file, "simple2d")?;
      let extent = ExtentVector::from_vec(vec![4, 4]);
      let boundary = vec![Boundary::Periodic; 2];
      let graph = Graph::from_basis_unitcell_extent(&basis, &cell, &extent, &boundary);
      
  • fully connected lattice of 10 sites

    use lattice_core::Graph;
    
    let graph = Graph::fully_connected(10);
    

C++

  • periodic chain lattice of 16 sites

    • simplest interface

       lattice::graph lat = lattice::graph::simple(1, 16);
      
    • most generic interface

       lattice::basis_t bs(1, 1); bs << 1; // 1x1 matrix
       lattice::basis basis(bs);
       lattice::unitcell unitcell(1);
       unitcell.add_site(lattice::coordinate(0), 0);
       unitcell.add_bond(0, 0, lattice::offset(1), 0);
       lattice::span_t span(1, 1); span << 16; // 1x1 matrix
       std::vector<lattice::boundary_t> boundary(1, lattice::boundary_t::periodic);
       lattice::graph lat(basis, unitcell, span, boundary);
      
  • periodic square lattice of 4 x 4 sites

    • simplest interface

       lattice::graph lat = lattice::graph::simple(2, 4);
      
    • most generic interface

       lattice::basis_t bs(2, 2); bs << 1, 0, 0, 1; // 2x2 matrix
       lattice::basis basis(bs);
       lattice::unitcell unitcell(2);
       unitcell.add_site(lattice::coordinate(0, 0), 0);
       unitcell.add_bond(0, 0, lattice::offset(1, 0), 0);
       unitcell.add_bond(0, 0, lattice::offset(0, 1), 0);
       lattice::span_t span(2, 2); span << 4, 0, 0, 4; // 2x2 matrix
       std::vector<lattice::boundary_t> boundary(2, lattice::boundary_t::periodic);
       lattice::graph lat(basis, unitcell, span, boundary);
      
    • reading basis and unitcell from XML file

      std::string file = "lattices.xml";
      lattice::basis bs;
      read_xml_file(file, "square lattice", bs);
      lattice::unitcell cell;
      read_xml_file(file, "simple2d", cell);
      lattice::graph lat(bs, cell, lattice::extent(4, 4));
      ```
    
  • fully connected lattice of 10 sites

    lattice::graph lat = lattice::graph::fully_connected(10);
    

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lattice_graph_core-0.2.2.tar.gz (30.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

lattice_graph_core-0.2.2-cp311-cp311-win_amd64.whl (290.2 kB view details)

Uploaded CPython 3.11Windows x86-64

lattice_graph_core-0.2.2-cp311-cp311-macosx_11_0_arm64.whl (394.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

lattice_graph_core-0.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (437.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

File details

Details for the file lattice_graph_core-0.2.2.tar.gz.

File metadata

  • Download URL: lattice_graph_core-0.2.2.tar.gz
  • Upload date:
  • Size: 30.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lattice_graph_core-0.2.2.tar.gz
Algorithm Hash digest
SHA256 62fa40f01fe6fabc293f50b266ac81f92dd07f18572194a6e5507c08b515bb07
MD5 9081e60f217d6b1c1e8a62093fbcebf6
BLAKE2b-256 78251ca9dbe338644269c818a5878da4acc28f874ab3ff67b1cd0b8733a98194

See more details on using hashes here.

Provenance

The following attestation bundles were made for lattice_graph_core-0.2.2.tar.gz:

Publisher: python-publish.yml on todo-group/lattice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lattice_graph_core-0.2.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for lattice_graph_core-0.2.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 da26ccb78c28647a04d25cce391626179240d709847eb2bd98af1a3389dd3357
MD5 db5a4a941a48f71f6189e8fe61310656
BLAKE2b-256 785fb1b2a4026e7da91f7d507572b4d6bf253c03d2fc8847b68db283a256b6b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for lattice_graph_core-0.2.2-cp311-cp311-win_amd64.whl:

Publisher: python-publish.yml on todo-group/lattice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lattice_graph_core-0.2.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lattice_graph_core-0.2.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e0b121b9e504c32cffd03ca5780ba3111281dd638e8f81f49c7e0e070b6067a8
MD5 cd6f5984e022060106e7f77a7e6d4287
BLAKE2b-256 c4ea71c777bb18f5d96ed576d72b571255329ca11fb9e4a30076dac3d7720a0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for lattice_graph_core-0.2.2-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on todo-group/lattice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lattice_graph_core-0.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lattice_graph_core-0.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6bb176ca5986bfad6fb9b49b982c9ffb340aa7df2cdbd7df5f376d988abb0f12
MD5 a4e0b6964b65913f8fe253665a19342a
BLAKE2b-256 9a02d790b6766ccc849317acbab80de37a9dffc340675b1f13653ba6f58cee46

See more details on using hashes here.

Provenance

The following attestation bundles were made for lattice_graph_core-0.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on todo-group/lattice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page