UNPKG

ts-quantum

Version:

TypeScript library for quantum mechanics calculations and utilities

91 lines 3.18 kB
/** * Intertwiner Tensor Representation * * This module provides tensor representations of intertwiner basis states, * integrating with the StateVector framework for efficient sparse storage. */ import { StateVector } from '../states/stateVector'; import { constructBasisVector } from './basis'; import * as math from 'mathjs'; /** * Convert basis state to sparse tensor representation * * @param basis Intertwiner basis state to convert * @returns Tensor representation with StateVector storage */ export function basisToTensor(basis) { const stateVector = basis.stateVector; const dimensions = extractDimensions(stateVector); validateTensorDimensions(dimensions); // Create sparse representation (already handled by StateVector) const sparseTensor = createSparseTensorRepresentation(stateVector); return { dimensions, stateVector: sparseTensor, basisState: basis }; } /** * Create intertwiner tensor from edge spins and intermediate J * * @param edgeSpins Array of edge angular momentum values * @param intermediateJ Intermediate coupling value * @returns Tensor representation or null if invalid coupling * @throws Error if not 4-valent node */ export function createIntertwinerTensor(edgeSpins, intermediateJ) { if (edgeSpins.length !== 4) { throw new Error('Tensor creation currently supports only 4-valent nodes'); } const [j1, j2, j3, j4] = edgeSpins; const basisState = constructBasisVector(j1, j2, j3, j4, intermediateJ); if (!basisState) { return null; } return basisToTensor(basisState); } // ==================== Helper Functions ==================== /** * Validate tensor dimensions */ function validateTensorDimensions(dimensions) { if (!Array.isArray(dimensions) || dimensions.length === 0) { throw new Error('Dimensions must be non-empty array'); } for (const [i, dim] of dimensions.entries()) { if (!Number.isInteger(dim) || dim < 1) { throw new Error(`Invalid dimension at index ${i}: ${dim}`); } } } /** * Create sparse tensor representation using StateVector */ function createSparseTensorRepresentation(stateVector) { // StateVector already provides efficient sparse storage // Filter out near-zero coefficients for true sparsity const threshold = 1e-10; const amplitudes = stateVector.getAmplitudes(); // Create new amplitudes with true zeros for sparse elements const sparseAmplitudes = amplitudes.map(amp => { const magnitude = math.abs(amp); return magnitude < threshold ? math.complex(0, 0) : amp; }); return new StateVector(stateVector.dimension, sparseAmplitudes, `sparse(${stateVector.basis || 'intertwiner'})`, { ...stateVector.properties, sparse: true, threshold }); } /** * Extract dimensions from StateVector properties */ function extractDimensions(stateVector) { const properties = stateVector.properties; if (properties?.dimensions) { return properties.dimensions; } // Fallback: assume single dimension return [stateVector.dimension]; } //# sourceMappingURL=tensor.js.map