|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| module jordan_block
|
| use, intrinsic :: iso_c_binding, only: c_int64_t, c_ptr, c_f_pointer, &
|
| c_size_t, c_loc
|
| use, intrinsic :: iso_fortran_env, only: int64, real64, int8
|
| use, intrinsic :: iso_c_binding, only: c_ptr, c_loc, c_int64_t, c_double, c_f_pointer
|
| use sov_monster_kernel, only: dp, ci, czero, &
|
| sov_zmexp_scaling_squaring, sov_apl_step_zgemm_fused, &
|
| sov_blake3_hash_matrix, sov_bifrost_sign, &
|
| sov_is_hermitian_matrix, sov_is_density_matrix, sov_fault, i8
|
| implicit none
|
| private
|
|
|
| public :: jordan_step
|
| public :: jordan_fib
|
| public :: jordan_fixpoint
|
| public :: jordan_gradient
|
| public :: PHI_INV, PHI, PHI_IN2
|
|
|
|
|
| real(dp), parameter :: PHI = 1.6180339887498948482_dp
|
| real(dp), parameter :: PHI_INV = 0.6180339887498948482_dp
|
| real(dp), parameter :: PHI_IN2 = 0.3819660112501051518_dp
|
|
|
| contains
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| subroutine jordan_step(H_ptr, rho_ptr, n, dt, sk_ptr, pk_ptr, &
|
| out_rho_ptr, hash_ptr, sig_ptr) &
|
| bind(C, name="jordan_step")
|
| type(c_ptr), intent(in), value :: H_ptr, rho_ptr
|
| integer(c_int64_t), intent(in), value :: n
|
| real(dp), intent(in), value :: dt
|
| type(c_ptr), intent(in), value :: sk_ptr, pk_ptr
|
| type(c_ptr), value :: out_rho_ptr, hash_ptr, sig_ptr
|
|
|
| complex(dp), pointer :: H(:,:), rho(:,:), out_rho(:,:)
|
| complex(dp), allocatable :: U(:,:), evolved(:,:)
|
| real(dp) :: trace_r
|
| integer(c_int64_t) :: i, j, ii, k
|
| complex(dp) :: comm
|
| real(dp) :: eigval_approx, entropy_bound, delta_t
|
| logical :: anomaly_detected
|
|
|
| call c_f_pointer(H_ptr, H, [n, n])
|
| call c_f_pointer(rho_ptr, rho, [n, n])
|
| call c_f_pointer(out_rho_ptr, out_rho, [n, n])
|
|
|
|
|
| if (.not. sov_is_hermitian_matrix(H, n)) call sov_fault(701)
|
| if (.not. sov_is_density_matrix (rho, n)) call sov_fault(702)
|
|
|
| allocate(U(n,n), evolved(n,n))
|
|
|
|
|
| U = (-ci) * dt * H(1:n, 1:n)
|
| call sov_zmexp_scaling_squaring(U, int(n))
|
|
|
|
|
| call sov_apl_step_zgemm_fused(H, n, rho, n, dt, &
|
| sk_ptr, pk_ptr, evolved, hash_ptr, sig_ptr)
|
|
|
|
|
|
|
|
|
|
|
| do i = 1, n
|
| do j = 1, n
|
| out_rho(i,j) = PHI_INV * evolved(i,j) + PHI_IN2 * rho(i,j)
|
| end do
|
| end do
|
|
|
|
|
|
|
| trace_r = 0.0_dp
|
| do i = 1, n; trace_r = trace_r + real(out_rho(i,i)); end do
|
| if (abs(trace_r) > epsilon(0.0_dp)) then
|
| out_rho = out_rho / trace_r
|
| end if
|
|
|
|
|
| if (.not. sov_is_density_matrix(out_rho, n)) call sov_fault(703)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| block
|
| real(dp) :: entropy_bound, effort_norm, comm_norm
|
| complex(dp) :: comm_val
|
| logical :: anomaly_detected
|
| integer(c_int64_t) :: ii, jj, kk
|
|
|
| anomaly_detected = .false.
|
|
|
|
|
| if (abs(dt - 0.01_dp) > 1.0e-12_dp .and. abs(dt) > 1.0e-15_dp) then
|
| anomaly_detected = .true.
|
| end if
|
|
|
|
|
| entropy_bound = 0.0_dp
|
| do ii = 1, n
|
| eigval_approx = real(out_rho(ii,ii))
|
| if (eigval_approx > 1.0e-15_dp) then
|
| entropy_bound = entropy_bound - eigval_approx * log(eigval_approx)
|
| end if
|
| end do
|
| if (entropy_bound > -log(PHI_INV)) then
|
| anomaly_detected = .true.
|
| end if
|
|
|
|
|
| comm_norm = 0.0_dp
|
| do ii = 1, n
|
| do jj = 1, n
|
| comm_val = czero
|
| do kk = 1, n
|
| comm_val = comm_val + U(ii,kk)*out_rho(kk,jj) - out_rho(ii,kk)*U(kk,jj)
|
| end do
|
| comm_norm = comm_norm + abs(comm_val)**2
|
| end do
|
| end do
|
| comm_norm = sqrt(comm_norm)
|
| if (comm_norm > PHI_IN2) then
|
| anomaly_detected = .true.
|
| out_rho = rho
|
| deallocate(U, evolved)
|
| return
|
| end if
|
|
|
|
|
| effort_norm = 0.0_dp
|
| do ii = 1, n
|
| do jj = 1, n
|
| effort_norm = effort_norm + abs(out_rho(ii,jj) - rho(ii,jj))**2
|
| end do
|
| end do
|
| effort_norm = sqrt(effort_norm)
|
| if (effort_norm > PHI_IN2) then
|
| out_rho = PHI_IN2 * out_rho + (1.0_dp - PHI_IN2) * rho
|
| trace_r = 0.0_dp
|
| do ii = 1, n; trace_r = trace_r + real(out_rho(ii,ii)); end do
|
| if (abs(trace_r) > epsilon(0.0_dp)) out_rho = out_rho / trace_r
|
| end if
|
| end block
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| block
|
| real(dp) :: delta_t
|
| real(dp), parameter :: ZMOS_THRESHOLD = 1.0e-6_dp
|
|
|
| interface
|
| real(c_double) function zmos_spectral_invariant(h_ptr, n_dim, tau) &
|
| bind(C, name="zmos_spectral_invariant")
|
| import :: c_ptr, c_int64_t, c_double
|
| type(c_ptr), value :: h_ptr
|
| integer(c_int64_t), value :: n_dim
|
| real(c_double), value :: tau
|
| end function
|
| end interface
|
|
|
|
|
| delta_t = zmos_spectral_invariant(c_loc(out_rho), n, dt)
|
|
|
|
|
| call sov_bifrost_sign_scalar("ZMOS_SPECTRAL_INVARIANT", delta_t, sk_ptr)
|
|
|
|
|
| if (delta_t < ZMOS_THRESHOLD) then
|
| out_rho = PHI_IN2 * out_rho + (1.0_dp - PHI_IN2) * rho
|
| trace_r = 0.0_dp
|
| do ii = 1, n; trace_r = trace_r + real(out_rho(ii,ii)); end do
|
| if (abs(trace_r) > epsilon(0.0_dp)) out_rho = out_rho / trace_r
|
| end if
|
| end block
|
|
|
|
|
|
|
|
|
|
|
|
|
| block
|
| real(dp) :: current_multiplicity, multiplicity_bound
|
|
|
| interface
|
| real(c_double) function qmhes_mmp_multiplicity(h_ptr, n_dim) &
|
| bind(C, name="qmhes_mmp_multiplicity")
|
| import :: c_ptr, c_int64_t, c_double
|
| type(c_ptr), value :: h_ptr
|
| integer(c_int64_t), value :: n_dim
|
| end function
|
| real(c_double) function qmhes_mmp_bound(n_dim) &
|
| bind(C, name="qmhes_mmp_bound")
|
| import :: c_int64_t, c_double
|
| integer(c_int64_t), value :: n_dim
|
| end function
|
| end interface
|
|
|
|
|
| current_multiplicity = qmhes_mmp_multiplicity(c_loc(out_rho), n)
|
|
|
|
|
| multiplicity_bound = qmhes_mmp_bound(n)
|
|
|
|
|
| call sov_bifrost_sign_scalar("QMHES_MMP_CHECK", current_multiplicity, sk_ptr)
|
|
|
|
|
| if (current_multiplicity > multiplicity_bound) then
|
| call sov_bifrost_sign_scalar("QMHES_MMP_VIOLATION", current_multiplicity, sk_ptr)
|
| out_rho = rho
|
| deallocate(U, evolved)
|
| return
|
| end if
|
| end block
|
|
|
|
|
|
|
|
|
|
|
|
|
| block
|
| integer(i8), target :: freshness_hash(32), latest_worm_hash(32)
|
| logical :: is_fresh
|
| integer(c_int64_t) :: fh_idx
|
|
|
| interface
|
| subroutine sndl_freshness_hash(rho_ptr, n_dim, out_ptr) &
|
| bind(C, name="sndl_freshness_hash")
|
| import :: c_ptr, c_int64_t
|
| type(c_ptr), value :: rho_ptr
|
| integer(c_int64_t), value :: n_dim
|
| type(c_ptr), value :: out_ptr
|
| end subroutine
|
| end interface
|
|
|
|
|
| call sndl_freshness_hash(c_loc(out_rho), n, c_loc(freshness_hash))
|
|
|
|
|
| call worm_get_latest_hash("SNDL_KEY_FRESHNESS", latest_worm_hash)
|
|
|
|
|
| is_fresh = .false.
|
| do fh_idx = 1, 32
|
| if (freshness_hash(fh_idx) /= latest_worm_hash(fh_idx)) then
|
| is_fresh = .true.
|
| exit
|
| end if
|
| end do
|
|
|
|
|
| call sov_bifrost_sign_bytes("SNDL_KEY_FRESHNESS", freshness_hash, 32, sk_ptr)
|
|
|
|
|
| if (.not. is_fresh) then
|
| call sov_bifrost_sign_bytes("SNDL_REPLAY_ATTACK", freshness_hash, 32, sk_ptr)
|
| out_rho = rho
|
| deallocate(U, evolved)
|
| return
|
| end if
|
| end block
|
|
|
| call sov_blake3_hash_matrix(out_rho, int(n), hash_ptr)
|
| call sov_bifrost_sign(hash_ptr, int(32, c_size_t), sk_ptr, sig_ptr)
|
|
|
| deallocate(U, evolved)
|
| end subroutine
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| subroutine jordan_fib(H_list_ptr, dt_list_ptr, n_layers, n, &
|
| rho_ptr, receipts_ptr, sk_ptr, pk_ptr, converged) &
|
| bind(C, name="jordan_fib")
|
| type(c_ptr), intent(in), value :: H_list_ptr, dt_list_ptr
|
| integer(c_int64_t), intent(in), value :: n_layers, n
|
| type(c_ptr), intent(in), value :: rho_ptr, receipts_ptr
|
| type(c_ptr), intent(in), value :: sk_ptr, pk_ptr
|
| integer(c_int64_t), intent(out) :: converged
|
|
|
| complex(dp), pointer :: H_list(:,:,:), rho(:,:)
|
| real(dp), pointer :: dt_list(:)
|
| integer(i8), pointer :: receipts(:)
|
| complex(dp), allocatable, target :: rho_cur(:,:), rho_nxt(:,:)
|
| real(dp) :: fib_a, fib_b, fib_c, diff_norm
|
| integer(c_int64_t) :: k, i, j
|
| integer(c_int64_t), parameter :: RECEIPT_SZ = 96
|
| type(c_ptr) :: hash_ptr, sig_ptr
|
|
|
| call c_f_pointer(H_list_ptr, H_list, [n_layers, n, n])
|
| call c_f_pointer(dt_list_ptr, dt_list, [n_layers])
|
| call c_f_pointer(rho_ptr, rho, [n, n])
|
| call c_f_pointer(receipts_ptr,receipts, [n_layers * RECEIPT_SZ])
|
|
|
| allocate(rho_cur(n,n), rho_nxt(n,n))
|
| rho_cur = rho
|
|
|
|
|
| fib_a = 1.0_dp; fib_b = 1.0_dp
|
|
|
| converged = 0
|
|
|
|
|
| do k = 1, n_layers
|
| hash_ptr = c_loc(receipts((k-1)*RECEIPT_SZ + 1))
|
| sig_ptr = c_loc(receipts((k-1)*RECEIPT_SZ + 33))
|
|
|
| call jordan_step(c_loc(H_list(k,:,:)), c_loc(rho_cur), n, &
|
| dt_list(k), sk_ptr, pk_ptr, &
|
| c_loc(rho_nxt), hash_ptr, sig_ptr)
|
|
|
|
|
| diff_norm = 0.0_dp
|
| do i = 1, n; do j = 1, n
|
| diff_norm = diff_norm + abs(rho_nxt(i,j) - rho_cur(i,j))**2
|
| end do; end do
|
| diff_norm = sqrt(diff_norm)
|
|
|
|
|
| fib_c = fib_a + fib_b; fib_a = fib_b; fib_b = fib_c
|
|
|
| if (diff_norm < PHI_INV**k * 1.0e-6_dp) converged = k
|
|
|
| rho_cur = rho_nxt
|
| end do
|
|
|
| rho = rho_cur
|
| deallocate(rho_cur, rho_nxt)
|
| end subroutine
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| subroutine jordan_fixpoint(H_ptr, rho_ptr, n, dt, sk_ptr, pk_ptr, &
|
| max_iter, tol, iterations, hash_ptr, sig_ptr) &
|
| bind(C, name="jordan_fixpoint")
|
| type(c_ptr), intent(in), value :: H_ptr, rho_ptr
|
| integer(c_int64_t), intent(in), value :: n, max_iter
|
| real(dp), intent(in), value :: dt, tol
|
| type(c_ptr), intent(in), value :: sk_ptr, pk_ptr
|
| integer(c_int64_t), intent(out) :: iterations
|
| type(c_ptr), intent(in), value :: hash_ptr, sig_ptr
|
|
|
| complex(dp), pointer :: rho(:,:)
|
| complex(dp), allocatable, target :: rho_nxt(:,:)
|
| real(dp) :: diff_norm
|
| integer(c_int64_t) :: k, i, j
|
|
|
| call c_f_pointer(rho_ptr, rho, [n, n])
|
| allocate(rho_nxt(n,n))
|
|
|
|
|
| iterations = 0
|
| do k = 1, max_iter
|
| call jordan_step(H_ptr, rho_ptr, n, dt, sk_ptr, pk_ptr, &
|
| c_loc(rho_nxt), hash_ptr, sig_ptr)
|
|
|
| diff_norm = 0.0_dp
|
| do i = 1, n; do j = 1, n
|
| diff_norm = diff_norm + abs(rho_nxt(i,j) - rho(i,j))**2
|
| end do; end do
|
| diff_norm = sqrt(diff_norm)
|
|
|
| rho = rho_nxt
|
| iterations = k
|
|
|
|
|
| if (diff_norm < tol) exit
|
| end do
|
|
|
| deallocate(rho_nxt)
|
| end subroutine
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| subroutine jordan_gradient(rho_fwd_ptr, lambda_ptr, n, dt, dH_ptr) &
|
| bind(C, name="jordan_gradient")
|
| type(c_ptr), intent(in), value :: rho_fwd_ptr, lambda_ptr, dH_ptr
|
| integer(c_int64_t), intent(in), value :: n
|
| real(dp), intent(in), value :: dt
|
|
|
| complex(dp), pointer :: rho_fwd(:,:), lambda(:,:), dH(:,:)
|
| integer(c_int64_t) :: i, j, ii, k
|
| complex(dp) :: comm
|
| real(dp) :: eigval_approx, entropy_bound, delta_t
|
| logical :: anomaly_detected
|
|
|
| call c_f_pointer(rho_fwd_ptr, rho_fwd, [n, n])
|
| call c_f_pointer(lambda_ptr, lambda, [n, n])
|
| call c_f_pointer(dH_ptr, dH, [n, n])
|
|
|
|
|
|
|
|
|
|
|
| do i = 1, n
|
| do j = 1, n
|
| comm = czero
|
| do k = 1, n
|
| comm = comm + lambda(i,k)*rho_fwd(k,j) - rho_fwd(i,k)*lambda(k,j)
|
| end do
|
|
|
| dH(i,j) = (-ci) * dt * comm * PHI_INV
|
| end do
|
| end do
|
|
|
|
|
|
|
|
|
| do i = 1, n
|
| do j = 1, n
|
| dH(i,j) = 0.5_dp * (dH(i,j) + conjg(dH(j,i)))
|
| end do
|
| end do
|
|
|
| end subroutine
|
|
|
| end module jordan_block
|
|
|