Skip to main content

Python bindings for the VVCM forward-kinematics and simulation library.

Project description

vvcm-rs

Rust implementation for kinematics of multi-robot transporting systems with a deformable sheet using the Virtual Variable Cables Model (VVCM).

vvcm-rs is implemented in Rust, but it is not limited to Rust projects. The same VVCM forward-kinematics and simulation library is available to Rust, JavaScript/TypeScript, C++, and Python users through the native Rust API, WebAssembly npm packages, C ABI/C++17 wrapper headers, and Python bindings.

If you plan to modify the codebase, read CONTRIBUTING.md first for workflow, structure, and release expectations.

Citation

If you use the forward kinematics algorithm, please cite:

@article{ma2026stable,
  title = {Stable Kinematics for Multi-Robot Collaborative Transporting System with a Deformable Sheet},
  author = {Ma, Wenyao and Hu, Jiawei and Li, Jiamao and Yi, Jingang and Xiong, Zhenhua},
  year = 2026,
  journal = {IEEE Transactions on Robotics},
  volume = {42},
  pages = {837-853},
  doi = {10.1109/TRO.2026.3653870}
}

For the original VVCM model, please cite:

@article{hu2022multirobot,
  title = {Multi-Robot Object Transport Motion Planning With a Deformable Sheet},
  author = {Hu, Jiawei and Liu, Wenhang and Zhang, Heng and Yi, Jingang and Xiong, Zhenhua},
  year = 2022,
  journal = {IEEE Robotics and Automation Letters},
  volume = {7},
  number = {4},
  pages = {9350--9357}
}

Features

This package includes vvcm-rs for Rust, JavaScript/TypeScript, Python, and C/C++ users with:

  • A Rust VVCM forward-kinematics API built around Point2, Point3, RobotFormation, SheetShape, and FkSolution.
  • Stable-solution search with taut-cable enumeration, candidate solving, and stable-branch filtering.
  • Velocity-driven and manual simulation wrappers.
  • WebAssembly bindings published to npm as @morningfrog/vvcm-rs and the unscoped mirror vvcm-rs, with hand-written TypeScript declarations.
  • Python bindings published as vvcm-rs / vvcm_rs with typed package metadata.
  • C ABI and C++17 wrapper headers for native consumers.
  • Distribution through crates.io, npm, PyPI, GitHub Releases, and vcpkg overlays.

Module Overview

  • fk: forward kinematics engine state and stable-solution entry point.
  • simulation: velocity-driven simulation wrapper.
  • manual_simulation: wrapper for querying a new stable solution from an externally provided robot formation.
  • types: public domain types used by the Rust API.
  • ffi: C ABI implementation behind the C/C++ headers.
  • wasm: WebAssembly bindings compiled with the wasm feature for npm packages.
  • error: crate error type.

Installation

For source-based installation or local development, read CONTRIBUTING.md first.

Rust

Use the crate from crates.io:

cargo add vvcm-rs

Python

Install the package from PyPI:

python -m pip install vvcm-rs

Prebuilt PyPI wheels are published for CPython 3.10 through 3.14 on Windows x64, Linux x64, and macOS arm64. Python 3.9 and other platforms may fall back to building from the source distribution, which requires a local Rust toolchain and Python build tooling.

JavaScript and TypeScript

Install the WebAssembly package from npm:

npm install @morningfrog/vvcm-rs

The unscoped mirror package is also published for users who prefer the shorter install name:

npm install vvcm-rs

The npm packages target modern bundlers such as Vite, Webpack, and Rollup. They include index.d.ts TypeScript declarations and expose ready-to-use named exports from the package entry point.

C and C++

Install the prebuilt package from the GitHub release archive:

vcpkg install vvcm-rs --overlay-ports=<path-to-unzipped-release>/ports --triplet <platform-triplet>

The prebuilt overlay ships native packages for Windows x64, Linux x64, and macOS arm64. It does not require Rust. Use the triplet that matches your platform, such as x64-windows, x64-linux, or arm64-osx.

If you want to build from the repository source instead, use the repo-local overlay port. That overlay builds the native Rust library with Cargo, so Rust must be installed on the machine running vcpkg. Python is only needed when you build the Python extension feature:

vcpkg install vvcm-rs --overlay-ports=<path-to-vvcm-rs>/vcpkg/ports

Then consume the installed CMake package:

find_package(vvcm-rs CONFIG REQUIRED)
target_link_libraries(app PRIVATE vvcm_rs::vvcm_rs)

Usage

The language-specific snippets below assume installation is already complete. Choose the section that matches your project.

The sample outputs below round floating-point values to three decimals; small platform differences are normal.

Rust Usage

After adding vvcm-rs from crates.io, the Rust API looks like this:

use vvcm_rs::{Point2, RobotFormation, SheetShape, VvcmError, VvcmFk};

fn main() -> Result<(), VvcmError> {
    // Robot formation: each Point2 is a robot node position on the world-coordinate XY plane, in millimeters.
    let formation = RobotFormation::new(vec![
        Point2::new(213.7, 122.7),
        Point2::new(804.6, 37.2),
        Point2::new(904.0, 550.0),
        Point2::new(439.3, 715.9),
    ])?;

    // Unfolded sheet: each Point2 is a vertex in the sheet's local coordinate frame, in millimeters.
    let sheet = SheetShape::new(vec![
        Point2::new(-316.1, -421.9),
        Point2::new(803.4, -384.1),
        Point2::new(746.1, 712.8),
        Point2::new(-367.3, 664.2),
    ])?;

    // Create the FK solver for four robots with a 1000 mm hold height.
    let mut fk = VvcmFk::new(4, 1000.0, sheet)?;

    // Ask the solver to enumerate every candidate equilibrium for this formation.
    let solutions = fk.update_stable_solutions(formation)?;

    // Report the total branch count and the subset that is stable.
    println!("all solutions: {}", solutions.all_count());
    println!("stable solutions: {}", solutions.stable_count());

    // Print each stable branch with object pose, virtual object point, and taut cables.
    for (index, solution) in solutions.stable().enumerate() {
        println!(
            "#{index}: Po=({:.3}, {:.3}, {:.3}), Vo=({:.3}, {:.3}), taut={:?}",
            solution.po.x,
            solution.po.y,
            solution.po.z,
            solution.vo.x,
            solution.vo.y,
            solution.taut_cables,
        );
    }

    Ok(())
}

Expected output:

all solutions: 3
stable solutions: 2
#0: Po=(568.841, 324.728, 336.736), Vo=(238.633, 125.028), taut=[0, 1, 2]
#1: Po=(557.919, 341.232, 337.247), Vo=(208.794, 152.532), taut=[0, 2, 3]

JavaScript and TypeScript Usage

After installing @morningfrog/vvcm-rs or vvcm-rs from npm, import the WebAssembly module and use the same solver concepts as the native APIs. Coordinate inputs accept [x, y] tuples or { x, y } objects.

import { VvcmFk } from "@morningfrog/vvcm-rs";

// Robot formation: each tuple is a robot node position on the world-coordinate XY plane, in millimeters.
const formation = [
  [213.7, 122.7],
  [804.6, 37.2],
  [904.0, 550.0],
  [439.3, 715.9],
] as const;

// Unfolded sheet: each tuple is a vertex in the sheet's local coordinate frame, in millimeters.
const sheet = [
  [-316.1, -421.9],
  [803.4, -384.1],
  [746.1, 712.8],
  [-367.3, 664.2],
] as const;

// Create the FK solver for four robots with a 1000 mm hold height.
const fk = new VvcmFk(4, 1000, sheet);

// Solve all candidate equilibria for the current formation.
const solutions = fk.updateStableSolutions(formation);

// Report the total branch count and the subset that is stable.
console.log(`all solutions: ${solutions.allCount}`);
console.log(`stable solutions: ${solutions.stableCount}`);

// Print each stable branch with object pose, virtual object point, and taut cables.
solutions.solutions
  .filter((solution) => solution.stable)
  .forEach((solution, index) => {
    const po = solution.po;
    const vo = solution.vo;
    console.log(
      `#${index}: Po=(${po.x.toFixed(3)}, ${po.y.toFixed(3)}, ${po.z.toFixed(3)}), ` +
        `Vo=(${vo.x.toFixed(3)}, ${vo.y.toFixed(3)}), taut=${JSON.stringify(solution.tautCables)}`,
    );
  });

fk.free();

Expected output:

all solutions: 3
stable solutions: 2
#0: Po=(568.841, 324.728, 336.736), Vo=(238.633, 125.028), taut=[0,1,2]
#1: Po=(557.919, 341.232, 337.247), Vo=(208.794, 152.532), taut=[0,2,3]

C++ Usage

After installing the vcpkg package or a release archive, consume the installed CMake package and headers directly. The package exports the raw C ABI in vvcm_rs.h and the C++17 RAII wrapper in vvcm_rs.hpp.

find_package(vvcm-rs CONFIG REQUIRED)
target_link_libraries(app PRIVATE vvcm_rs::vvcm_rs)
#include <vvcm_rs.hpp>

#include <cstddef>
#include <iomanip>
#include <iostream>
#include <vector>

int main() {
    using namespace vvcm_rs;

    // Robot formation: each Point2 is a robot node position on the world-coordinate XY plane, in millimeters.
    const std::vector<Point2> formation = {
        Point2(213.7f, 122.7f),
        Point2(804.6f, 37.2f),
        Point2(904.0f, 550.0f),
        Point2(439.3f, 715.9f),
    };

    // Unfolded sheet: each Point2 is a vertex in the sheet's local coordinate frame, in millimeters.
    const std::vector<Point2> sheet = {
        Point2(-316.1f, -421.9f),
        Point2(803.4f, -384.1f),
        Point2(746.1f, 712.8f),
        Point2(-367.3f, 664.2f),
    };

    // Build the solver for four robots and a 1000 mm hold height.
    VvcmFk fk(4, 1000.0f, sheet);
    // Solve all candidate equilibria for the current formation.
    FkSolutions solutions = fk.update_stable_solutions(formation);

    // Report the total branch count and the subset that is stable.
    std::cout << "all solutions: " << solutions.all_count() << "\n";
    std::cout << "stable solutions: " << solutions.stable_count() << "\n";

    // Print each stable branch with object pose, virtual object point, and taut cables.
    std::cout << std::fixed << std::setprecision(3);
    const std::vector<FkSolution> stable = solutions.stable();
    for (std::size_t index = 0; index < stable.size(); ++index) {
        const auto &solution = stable[index];
        std::cout << "#" << index << ": Po=("
                  << solution.po.x << ", "
                  << solution.po.y << ", "
                  << solution.po.z << "), Vo=("
                  << solution.vo.x << ", "
                  << solution.vo.y << "), taut=[";
        for (std::size_t taut_index = 0; taut_index < solution.taut_cables.size(); ++taut_index) {
            if (taut_index > 0) {
                std::cout << ", ";
            }
            std::cout << solution.taut_cables[taut_index];
        }
        std::cout << "]\n";
    }
}

Expected output:

all solutions: 3
stable solutions: 2
#0: Po=(568.841, 324.728, 336.736), Vo=(238.633, 125.028), taut=[0, 1, 2]
#1: Po=(557.919, 341.232, 337.247), Vo=(208.794, 152.532), taut=[0, 2, 3]

Python Usage

After installing vvcm-rs from PyPI, import it as vvcm_rs. Coordinate collections accept Point2 values, ordinary list/tuple rows, or sequence-like two-column arrays such as NumPy N x 2 arrays.

from vvcm_rs import VvcmFk

# Robot formation: each tuple is a robot node position on the world-coordinate XY plane, in millimeters.
formation = [
    (213.7, 122.7),
    (804.6, 37.2),
    (904.0, 550.0),
    (439.3, 715.9),
]
# Unfolded sheet: each tuple is a vertex in the sheet's local coordinate frame, in millimeters.
sheet = [
    (-316.1, -421.9),
    (803.4, -384.1),
    (746.1, 712.8),
    (-367.3, 664.2),
]

# Create the solver for four robots and a 1000 mm hold height.
fk = VvcmFk(4, 1000.0, sheet)
# Solve all candidate equilibria for the current formation.
solutions = fk.update_stable_solutions(formation)

# Report the total branch count and the subset that is stable.
print(f"all solutions: {solutions.all_count()}")
print(f"stable solutions: {solutions.stable_count()}")

# Print each stable branch with object pose, virtual object point, and taut cables.
for index, solution in enumerate(solutions.stable()):
    print(
        f"#{index}: Po=({solution.po.x:.3f}, {solution.po.y:.3f}, {solution.po.z:.3f}), "
        f"Vo=({solution.vo.x:.3f}, {solution.vo.y:.3f}), taut={solution.taut_cables}"
    )

Expected output:

all solutions: 3
stable solutions: 2
#0: Po=(568.841, 324.728, 336.736), Vo=(238.633, 125.028), taut=[0, 1, 2]
#1: Po=(557.919, 341.232, 337.247), Vo=(208.794, 152.532), taut=[0, 2, 3]

Length units are not encoded in the API. Use one consistent unit for formation coordinates, sheet coordinates, and hold height; VvcmFk normalizes coordinates internally for numerical stability and maps returned object positions and virtual object points back to the original coordinate frames.

Error Handling

Forward-kinematics and simulation solves report failures through each language's normal error channel. Error messages are intended for human diagnostics; branch on Rust enum variants, JavaScript error codes, Python exception classes, or C/C++ error codes when program logic needs to distinguish failure modes.

The snippets below show one simple handling pattern for each language: catch the failure, print the message, and branch on the typed error when you need a specific recovery path.

Rust

match fk.update_stable_solutions(formation) {
    Ok(solutions) => {
        println!("stable solutions: {}", solutions.stable_count());
    }
    Err(vvcm_rs::VvcmError::InfeasibleFormation) => {
        eprintln!("formation is infeasible");
    }
    Err(error) => {
        eprintln!("vvcm-rs solve failed: {error}");
    }
}

The main solve errors in Rust are:

  • VvcmError::DimensionMismatch for input size mismatches during construction or solve setup.
  • VvcmError::InfeasibleFormation when the robot formation cannot be realized by the sheet geometry.
  • VvcmError::NoSolution when no candidate branch can be constructed.
  • VvcmError::NoStableSolution when candidate branches exist but none are stable.
  • VvcmError remains the common error type, so Err(error) still catches any of them and Err(vvcm_rs::VvcmError::InfeasibleFormation) can catch one case specifically.

Python

from vvcm_rs import InfeasibleFormationError, VvcmError

try:
    solutions = fk.update_stable_solutions(formation)
except InfeasibleFormationError as error:
    print(f"formation is infeasible: {error}")
except VvcmError as error:
    print(f"vvcm-rs solve failed: {error}")
else:
    print(f"stable solutions: {solutions.stable_count()}")

The main solve errors in Python are:

  • DimensionMismatchError for input size mismatches during construction or solve setup.
  • InfeasibleFormationError when the robot formation cannot be realized by the sheet geometry.
  • NoSolutionError when no candidate branch can be constructed.
  • NoStableSolutionError when candidate branches exist but none are stable.
  • VvcmError remains the common base class, so except VvcmError as error still catches any of them and except InfeasibleFormationError as error can catch one case specifically.

JavaScript and TypeScript

import { VvcmFk, type VvcmError } from "@morningfrog/vvcm-rs";

function isVvcmError(error: unknown): error is VvcmError {
  return error instanceof Error && error.name === "VvcmError" && "code" in error;
}

try {
  const solutions = fk.updateStableSolutions(formation);
  console.log(`stable solutions: ${solutions.stableCount}`);
} catch (error) {
  if (isVvcmError(error) && error.code === "INFEASIBLE_FORMATION") {
    console.error("formation is infeasible");
  } else {
    console.error("vvcm-rs solve failed:", error);
  }
}

The main solve errors in JavaScript and TypeScript are:

  • DIMENSION_MISMATCH for input size mismatches during construction or solve setup.
  • INFEASIBLE_FORMATION when the robot formation cannot be realized by the sheet geometry.
  • NO_SOLUTION when no candidate branch can be constructed.
  • NO_STABLE_SOLUTION when candidate branches exist but none are stable.
  • INVALID_ARGUMENT when a JavaScript value cannot be parsed as the expected point, formation, or sheet input shape.

C

VvcmRsErrorCode code = vvcm_rs_fk_update_stable_solutions(
    fk,
    formation_points,
    formation_point_count);
if (code != VVCM_RS_ERROR_OK) {
    fprintf(stderr, "vvcm-rs failed: %s\n", vvcm_rs_last_error_message());
    if (code == VVCM_RS_ERROR_INFEASIBLE_FORMATION) {
        fprintf(stderr, "formation is infeasible\n");
    }
}

The main solve errors in C are:

  • VVCM_RS_ERROR_DIMENSION_MISMATCH for input size mismatches during construction or solve setup.
  • VVCM_RS_ERROR_INFEASIBLE_FORMATION when the robot formation cannot be realized by the sheet geometry.
  • VVCM_RS_ERROR_NO_SOLUTION when no candidate branch can be constructed.
  • VVCM_RS_ERROR_NO_STABLE_SOLUTION when candidate branches exist but none are stable.
  • vvcm_rs_last_error_message() returns the human-readable message for the most recent failure on the current thread, while vvcm_rs_error_message(code) returns the generic message for a given code.

C++

try {
    vvcm_rs::FkSolutions solutions = fk.update_stable_solutions(formation);
    std::cout << "stable solutions: " << solutions.stable_count() << "\n";
} catch (const vvcm_rs::Error &error) {
    std::cerr << "vvcm-rs failed: " << error.what()
              << " (code " << error.code() << ")\n";
    if (error.code() == VVCM_RS_ERROR_INFEASIBLE_FORMATION) {
        std::cerr << "formation is infeasible\n";
    }
}

The main solve errors in C++ are:

  • VVCM_RS_ERROR_DIMENSION_MISMATCH for input size mismatches during construction or solve setup.
  • VVCM_RS_ERROR_INFEASIBLE_FORMATION when the robot formation cannot be realized by the sheet geometry.
  • VVCM_RS_ERROR_NO_SOLUTION when no candidate branch can be constructed.
  • VVCM_RS_ERROR_NO_STABLE_SOLUTION when candidate branches exist but none are stable.
  • vvcm_rs::Error keeps the originating code, so catch (const vvcm_rs::Error &error) still handles all failures and error.code() lets you branch on one case specifically.

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

vvcm_rs-1.2.0.tar.gz (83.4 kB view details)

Uploaded Source

Built Distributions

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

vvcm_rs-1.2.0-cp314-cp314-win_amd64.whl (261.0 kB view details)

Uploaded CPython 3.14Windows x86-64

vvcm_rs-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (403.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

vvcm_rs-1.2.0-cp314-cp314-macosx_11_0_arm64.whl (367.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

vvcm_rs-1.2.0-cp313-cp313-win_amd64.whl (260.2 kB view details)

Uploaded CPython 3.13Windows x86-64

vvcm_rs-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (403.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

vvcm_rs-1.2.0-cp313-cp313-macosx_11_0_arm64.whl (366.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

vvcm_rs-1.2.0-cp312-cp312-win_amd64.whl (260.5 kB view details)

Uploaded CPython 3.12Windows x86-64

vvcm_rs-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (404.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

vvcm_rs-1.2.0-cp312-cp312-macosx_11_0_arm64.whl (367.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

vvcm_rs-1.2.0-cp311-cp311-win_amd64.whl (263.2 kB view details)

Uploaded CPython 3.11Windows x86-64

vvcm_rs-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (406.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

vvcm_rs-1.2.0-cp311-cp311-macosx_11_0_arm64.whl (368.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

vvcm_rs-1.2.0-cp310-cp310-win_amd64.whl (263.1 kB view details)

Uploaded CPython 3.10Windows x86-64

vvcm_rs-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (406.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

vvcm_rs-1.2.0-cp310-cp310-macosx_11_0_arm64.whl (368.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file vvcm_rs-1.2.0.tar.gz.

File metadata

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

File hashes

Hashes for vvcm_rs-1.2.0.tar.gz
Algorithm Hash digest
SHA256 3c0853a82ff629e04985a22ee4ecffcfd02f7212f03584d07d4c8b3b7b639491
MD5 5a64d0eb0a7cdba5629f6b8ec0059f03
BLAKE2b-256 a4889e11911c548a0596526e1f7b910fb3f19edb61a44a19d0549ec867766d5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0.tar.gz:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.2.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 261.0 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vvcm_rs-1.2.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 035c8e580c957d3af9f5f67e8a352d98eaddfcffafb3780398496675ff1ce23e
MD5 589d826d69c6b13abf544137a2780009
BLAKE2b-256 6e3827e0a3fc320d6f5b93ff62194362a980b59d1b8f10fd72d1ef9debf93154

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp314-cp314-win_amd64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 885fc25367da173ba1cf69006c6d4cb4ad3e6609a4524fa55acb42b7dddf8fe7
MD5 3de10d89ce3524a0b1f81f6e887e6fa1
BLAKE2b-256 b78a55585ea7ef3c14a0ce31a68a202daa90123762cd867c76f7ef8b69f8c4b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c660fe9609f92fb92f32d7c1bc61538fa24f7cb62f79ff5ea86cac6dab48209a
MD5 08c7c52a470a9ffc1ade6537e6dff1ac
BLAKE2b-256 d0da24aca89b8efb96f81689575cd8198c2a9dd533a5083219067120915ad5e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 260.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vvcm_rs-1.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 15125626b9d0277ebac15b3f14fc859229d57ddbabb21cb6ee28f465d5abdb6c
MD5 9f8af73683b2321b7ce82b80e6553e91
BLAKE2b-256 d093a109fa6d9334518a49be57ff7258bc3e6ef4a012064920d634bb74bdc849

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp313-cp313-win_amd64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bc32b6d21bbc274f7bc01b39701548e8e366c402ccbfa0b43b564f17b0103666
MD5 dff048da3fc4d7a3a2649d23f6c0e157
BLAKE2b-256 0215d09786c20972a3fec32b575b6336fcf8a3c4db3c15f65f66ca0c95238330

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 510082df85ce5b43837bbbd1acf8ec26f20485aa86966ca7dc95755d3214bde9
MD5 b3ac46542a66c9fdb897ad4119170936
BLAKE2b-256 1d34c8a650dcff4c937aec1234260d395dfda94ba2a55b0002ef6370a9ee46ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 260.5 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vvcm_rs-1.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4115b1174bedeac10ecce8bcb361661c2972b3998d0523c9a77b0b8394063696
MD5 a21c585e86c3afed67389a55f00dde74
BLAKE2b-256 5262114e96c6dfb34b72b5b9c12606d58871bd3486e6247439e226f62d71d563

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp312-cp312-win_amd64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 911f80b628dd185620fcaaf8fab9032b95a3847a5829ecf111fea1db20c4430b
MD5 9c38fbdb0ccfc6d0f1ca88b67f7e2a5b
BLAKE2b-256 439f67aa44eff4dfc86532cf155770cb238974d0d8a3b87a779e3aece74c76fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f48bf757871edc47652a6e478fbfaa21686167a9993d5b64e29f33216a0429cd
MD5 c3a91435973aefce97b44efbe92797d2
BLAKE2b-256 6c0e19c013fef46272427704e93a5c3d5d10fa14dcefa25c93aaeeab7c284adb

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 263.2 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vvcm_rs-1.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 414dea9d4f69cb28c0124f86977ee752b9e16d2ac31e62115b8d8aca8d11f881
MD5 6d9e1de6c51e14b666ac93df73627221
BLAKE2b-256 9a80bfd597fd2f9990d3a5d0b61c954f9edc29a6103ee65e4c46006dcab173cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp311-cp311-win_amd64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aaaf7484858cdea0afce87d5127636b35677411e52c961ee735ba71026126a1a
MD5 e92b603e4191baab6f12322c9c93e3b5
BLAKE2b-256 119dbbe1e75b7cb710d6e9adc7fb447f78fbd388865fc40cea52821d5beef732

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 374f9cfffd1a8104c920b8f439edd6594a657c1fd17b3550fc1729a0ee5dc158
MD5 65b784b33a989886cd40621ca7a57587
BLAKE2b-256 7cea0028bdaf17445b3b516c866be8910ec2b042af64b015507fb89381006b33

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 263.1 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vvcm_rs-1.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e8b55d879b169c76c3d29f850c37310d0b3055e19da87fc3a7b637bc6e49e9a8
MD5 9660666fdb515e41556012a18d743644
BLAKE2b-256 8d4d74b8d65f0878a5c468714fdc014a389e9b3674075f9ad04a490bc4e42c83

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp310-cp310-win_amd64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4aa461377a6974a85b6e5f8a9ccea54b98e37d847edf55456c8da9b9d6ca36c7
MD5 d0a74a6dc5ecce667017b08302253bba
BLAKE2b-256 452a561af0a1f9f9728f79099d77f60c93ec7e60a11a15ab9504761aaef65571

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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

File details

Details for the file vvcm_rs-1.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1f4f5abbb62647c71c00711c296086efa36b99f6e2a33facfae3855d3c59446
MD5 5dccdbbff5c54c53666a2e3e8b311ad7
BLAKE2b-256 3e1c4c97cbdb344b746cc06a1f58a2caf105b0c144fdf344f27ae5898ebe8e68

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: release.yml on MorningFrog/vvcm-rs

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