Skip to main content

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.

Open the visual test bench at vvcm-web.

VVCM Visual Test Bench live preview

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 values that include taut-cable lambda coefficients.
  • 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, taut cables, and matching lambda values.
    for (index, solution) in solutions.stable().enumerate() {
        let lambda_values = solution
            .lambda_values
            .iter()
            .map(|value| format!("{value:.3}"))
            .collect::<Vec<_>>()
            .join(", ");
        println!(
            "#{index}: Po=({:.3}, {:.3}, {:.3}), Vo=({:.3}, {:.3}), taut={:?}, lambda=[{}]",
            solution.po.x,
            solution.po.y,
            solution.po.z,
            solution.vo.x,
            solution.vo.y,
            solution.taut_cables,
            lambda_values,
        );
    }

    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], lambda=[0.480, 0.039, 0.481]
#1: Po=(557.919, 341.232, 337.247), Vo=(208.794, 152.532), taut=[0, 2, 3], lambda=[0.493, 0.495, 0.012]

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, taut cables, and matching lambda values.
solutions.solutions
  .filter((solution) => solution.stable)
  .forEach((solution, index) => {
    const po = solution.po;
    const vo = solution.vo;
    const lambdaValues = solution.lambdaValues.map((value) => value.toFixed(3)).join(", ");
    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)}, ` +
        `lambda=[${lambdaValues}]`,
    );
  });

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], lambda=[0.480, 0.039, 0.481]
#1: Po=(557.919, 341.232, 337.247), Vo=(208.794, 152.532), taut=[0,2,3], lambda=[0.493, 0.495, 0.012]

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, taut cables, and matching lambda values.
    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 << "], lambda=[";
        for (std::size_t lambda_index = 0; lambda_index < solution.lambda_values.size(); ++lambda_index) {
            if (lambda_index > 0) {
                std::cout << ", ";
            }
            std::cout << solution.lambda_values[lambda_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], lambda=[0.480, 0.039, 0.481]
#1: Po=(557.919, 341.232, 337.247), Vo=(208.794, 152.532), taut=[0, 2, 3], lambda=[0.493, 0.495, 0.012]

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, taut cables, and matching lambda values.
for index, solution in enumerate(solutions.stable()):
    lambda_values = ", ".join(f"{value:.3f}" for value in solution.lambda_values)
    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}, "
        f"lambda=[{lambda_values}]"
    )

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], lambda=[0.480, 0.039, 0.481]
#1: Po=(557.919, 341.232, 337.247), Vo=(208.794, 152.532), taut=[0, 2, 3], lambda=[0.493, 0.495, 0.012]

For every returned FkSolution, lambda_values is taut-only: lambda_values[i] corresponds to taut_cables[i]. Slack cables are omitted instead of represented by zero-valued placeholders.

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.

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.3.0.tar.gz (86.2 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.3.0-cp314-cp314-win_amd64.whl (264.2 kB view details)

Uploaded CPython 3.14Windows x86-64

vvcm_rs-1.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (407.7 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

vvcm_rs-1.3.0-cp314-cp314-macosx_11_0_arm64.whl (368.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

vvcm_rs-1.3.0-cp313-cp313-win_amd64.whl (264.0 kB view details)

Uploaded CPython 3.13Windows x86-64

vvcm_rs-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (407.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

vvcm_rs-1.3.0-cp313-cp313-macosx_11_0_arm64.whl (368.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

vvcm_rs-1.3.0-cp312-cp312-win_amd64.whl (264.1 kB view details)

Uploaded CPython 3.12Windows x86-64

vvcm_rs-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (408.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

vvcm_rs-1.3.0-cp312-cp312-macosx_11_0_arm64.whl (368.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

vvcm_rs-1.3.0-cp311-cp311-win_amd64.whl (266.0 kB view details)

Uploaded CPython 3.11Windows x86-64

vvcm_rs-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (409.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

vvcm_rs-1.3.0-cp311-cp311-macosx_11_0_arm64.whl (370.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

vvcm_rs-1.3.0-cp310-cp310-win_amd64.whl (265.9 kB view details)

Uploaded CPython 3.10Windows x86-64

vvcm_rs-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (409.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

vvcm_rs-1.3.0-cp310-cp310-macosx_11_0_arm64.whl (370.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: vvcm_rs-1.3.0.tar.gz
  • Upload date:
  • Size: 86.2 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.3.0.tar.gz
Algorithm Hash digest
SHA256 79642ca9d1796f4c58518e42742410af4cc159e00a3e33edd5d096cba638b927
MD5 a97706ce877bdfc9b4dbe4e3f3caf4fd
BLAKE2b-256 8c092ec53e8996b046a5a30856b08d0406412ce2501c80d00d54ecb5941d002b

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.3.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 264.2 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.3.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 cc4e6f688e740ecac3ecdb802f1103b04e1c54e20f16c817fdeb349abc18359c
MD5 df6077ebf992d05fdb0a35cfe16df5de
BLAKE2b-256 120d7eb15b2eb87c5f35ba92e0887ced26a329c0c510780571e4feaedd86d632

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c85093ed6aee12659ac57127b423bbc0c88b74635ab95a98e4538c8c7128003
MD5 2725b6decf05ae9401beeff75d5f83a8
BLAKE2b-256 53952ab59424bbcb44672b513b9dc6c2cbc9499337b32d35abf3203b3fbd2b55

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 792b1fc41d5250d13df4a04d6b0df57c92b7af76ecd2cdabb209d9c59d1a6ea2
MD5 b7fe3df9e7985f8a1ba22c46e0f519e4
BLAKE2b-256 bec34bc1d7d4f7d261ed4519328a816ef999345ab8ee7d47fc88457ef9921cf0

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 264.0 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.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e93d21331c358af34354258071b5f7b472f317edaf04e03d4bcc2a6f76366a63
MD5 bb41fe61658f94e376de24b737c4cbfe
BLAKE2b-256 2c338bcfe48de2bbf1eace0b62b7a2a4fe8a3b2f2d44fcbc28b9bf6d5319f0d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ee3c2981daf011fbd7430a364d94f47aa7b5eee583ada174fbfe95883b1ed6fd
MD5 df83d3f0f920433aea29a956a920f8b7
BLAKE2b-256 b4c7429eb852fd3184c0f72dd8f2540a959a2b260ce69c3e56bd3be4ec709617

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8e4abb0701f712b1f8ededa24d2cb001d55425cb2b717f9a84b9b8c84c1f5f94
MD5 16565a5f5076ec203ca7253d65e94cc1
BLAKE2b-256 0042f20e7990d42b3ed9d0de4dfdd1951697a8e98f2ef5e8fc30d46787876aa6

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 264.1 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.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 87f307cb8b8e96f8899371ddd91cb860aa103736a74d60806852b9290d0fcb26
MD5 df50b80b084731935ac5995a6955d1c2
BLAKE2b-256 fbe5ecbb59b8c6294c17c5d059d7a32841ef9a63b8fa2916bd8e130a2ecf6c1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 438e5d88a089bbebcdddcbf7004791e845d4ab13b1156c20109df68cb12aa57d
MD5 3e4d01c2fab73e63180f747cde3507fb
BLAKE2b-256 886c0ff94efba65a6d42ef7fb6a60737b3ca5fdccf90f72b0f41659776fa8d02

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c85d2658ea8a5adb6ecf684502cd8e8ace64d62f0d776d1245ca621f9fe8225
MD5 c8fa3b41082407675f0625d6289bd695
BLAKE2b-256 a05cae03669f719851b06f92011758db912fd0276351bdca49dc40fe81017295

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 266.0 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.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 afb735e1a31f483f19fe92de8cba5742af410b2a7cc6e26a651cfb546e71e5a3
MD5 731fde36af803cf43cae2ea781f95b4c
BLAKE2b-256 f4e34b3a18e25676f3b24c5c0076120a231fd0f72515cd0a582a978e72b284fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 521d8474afaf39088dfdf6df401b6803f27b43f602c875d4a47f6ab5986f1f07
MD5 28abceea004e3933d53227fae8cfca3a
BLAKE2b-256 0f698be52afbe2bea52690d7c7e50b83e783795f03736fa4fa82098388767d8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ee5a294ef50ed8c391f555c1ebba25c597b18eb14b7ee10acfedc0de4dfd02af
MD5 a65540d9f55d0f556101c3dfebbbbe9b
BLAKE2b-256 90d79492a92b87f765ceb8994b35a50cab65ef6821222dd06636fb7d367c0994

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: vvcm_rs-1.3.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 265.9 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.3.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1cb49c1e357682aaf3a80458c64339291c783e45c521dd7ec33c26e1e46e7c9d
MD5 c6595d166a88242df1adc79d46792b55
BLAKE2b-256 6b1715161f5c52b4a776644710e20a8441e7a60525e115c7e67e1e503f5e239a

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 45c51b14642d6f2a1d4221f29373e9e1611f1bae7716ac28bce0d98d0fc62978
MD5 d10cc0e80616b73443b9081a0e314fc8
BLAKE2b-256 cd2ee8cc1fc7f7c8cb2c26b0bde43b724c2821567a9bb5b2eb0a5ab7009f8d9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.3.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vvcm_rs-1.3.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3ed862d0162f987fadd1580f04291d23098ae157861ff0a65c7a8066ba2ef198
MD5 fb08244c8568dd68fae54b5017777095
BLAKE2b-256 52c8b2d901b599157b4a21562e6108ab1f2cfd5cb3754c2ec67fb0d6a92d969b

See more details on using hashes here.

Provenance

The following attestation bundles were made for vvcm_rs-1.3.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.

Release history Release notifications | RSS feed

2.0.0

16 files

This release

1.3.0 This release

16 files

1.2.0

16 files

1.1.0

16 files

1.0.0

16 files

Supported by

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