Release notes
What changed in each witwin (WiTwin Core) release, newest first, with migration steps from 0.3 to 0.4 and the known issues of 0.4.0.
This page summarizes each witwin release, newest first. The repository has no changelog file; these notes come from the git history and the tags of witwin-core and from the README's migration section. Core uses semantic versioning within 0.x, so a minor release can break the API.
0.4.0 (2026-07-30)#
Current release. Pure-Python wheel witwin-0.4.0-py3-none-any.whl on PyPI. Requires CPython 3.10 to 3.14, torch>=2.10 and numpy>=1.24. Channel 0.5.0 pins witwin==0.4.0; Maxwell 0.5.1 and Radar 0.4.1 require witwin>=0.4,<0.5.
0.4.0 turns Core from a geometry-and-material library into the shared logical world model of the WiTwin solvers.
Added
- World model.
Scene,SceneSnapshot,SceneVersions,StructureState,EndpointState. A scene holds structures and antenna endpoints, enforces unique IDs, and reports four granular versions (topology, geometry, material, assignment) that also detect in-place tensor changes. Thewith_*methods return updated scenes. See The world model. - Motion.
DynamicScene,LinearTrajectory,RigidMotion,DeformationStateand theTrajectoryandDeformationprotocols. See Animate a scene. - Antennas.
AntennaState,ReceiverGrid,AntennaPatternandantenna_orientation_matrix, with differentiable orientation, polarization and grid points. - Identity.
StructureId,MaterialId,AssignmentId,SurfaceId,AntennaId,PrimitiveId, withnew_*_id()andreserve_*_id()allocators. See Identity and versions. - Materials.
PhysicalMaterialgainsmaterial_id,version,thickness_m,layers,geometry_mode, front and back roughness,dispersion,gain,scattering_coefficient,xpd_coefficientandconductor_model, plusPhysicalMaterial.perfect_conductor(). New:MaterialLayer,SurfaceRoughness,PhaseScreen,PowerLawDispersion,DispersionSpec,MaterialAssignment. Frequency evaluation keeps autograd for tensor inputs. - Structures.
Structuregains stable IDs,primitive_idsandprimitive_id(), aphase_screen, and typed mesh UVs (uv,face_uv). - Math.
normalize_vec3, and the type aliasesScalarLike(float | torch.Tensor) andComplexLike. - Stable API. The supported public API is exactly
witwin.core.__all__, and a test locks it.
Changed
Mesh.vertices,Mesh.faces,Mesh.world_verticesandMesh.bounds_worldare tensors.verticesandfacesreturn the authored tensors themselves.bounds_worldhas shape(2, 3): minimum corner in row 0, maximum in row 1.- Geometry never moves a tensor to another device. Conflicting devices raise
ValueError. - CUDA-authored meshes skip host topology diagnostics and never build a host BVH, so
fill_mode="auto"needs an explicit"solid"or"surface"before a distance query. Structuremoved fromwitwin.core.materialtowitwin.core.structure. Imports fromwitwin.coreare unchanged.- Continuous quantities are annotated
ScalarLikeinstead ofAny. Accepted runtime values are unchanged. - Reading scene versions is about 6 times faster (four versions on a 1024-structure scene: 112 ms to 16.8 ms). The values are unchanged.
Removed
Material. It was an alias of the material class; usePhysicalMaterial.Mesh.world_vertices_tensor(). Use theworld_verticesproperty, which is now a tensor.- The compiled CUDA mesh-SDF module and its prebuilt binaries. Core now ships no native code and computes mesh distances in PyTorch. A solver package can install a faster backend.
- The
channelextra (witwin-channel-native).
Known issues
GeometryBase.with_material()raisesImportError. UseStructure(geometry, material).to_mesh()ofCylinder,Cone,Pyramid,PrismandToruswithaxis="x"oraxis="y"returns inward-wound faces. Distances and masks are correct.- The
maxwell,radar,genesisandallextras still name old solver ranges (witwin-maxwell<0.3,witwin-radar<0.4), andwitwin-genesisis not on PyPI. Install solvers by their own package names.
Migrating from 0.3#
| 0.3 | 0.4 |
|---|---|
from witwin.core import Material | from witwin.core import PhysicalMaterial |
mesh.vertices, mesh.faces (NumPy arrays) | tensors; call .detach().cpu().numpy() if you need NumPy |
mesh.world_vertices_tensor() | mesh.world_vertices |
mesh.bounds_world as ((xmin, xmax), (ymin, ymax), (zmin, zmax)) | a (2, 3) tensor [[xmin, ymin, zmin], [xmax, ymax, zmax]] |
| Tensors on mixed devices, moved implicitly | put every tensor on one device before you build the geometry |
from witwin.core.material import Structure | from witwin.core import Structure |
Use reserve_*_id(value) (or pass explicit IDs to constructors) wherever IDs must match across processes. new_*_id() depends on construction order.
0.3.0 (2026-07-15)#
- Platform wheels built against the CPython Stable ABI, carrying a prebuilt CUDA mesh signed-distance module, with wider CUDA architecture coverage.
- Narrowed the shared geometry and material contracts:
GeometrySpec,MaterialSpec,Material,Structureand the nine primitives plusMesh. - Fixed the torus mesh parameterization.
- Optional extras for Maxwell, Radar, Channel (
witwin-channel-native) and Genesis.
Earlier releases#
0.0.1 (2026-03-22) and 0.0.2 were early packaging releases. Their API differs from the one on these pages.