SOCR ≫ TCIU Website ≫ TCIU GitHub ≫

1 Figure 1.8

A schematic of the 5D spacekime manifold, two cones representing space (\(\mathbb{R}^3\)) - kime (\(\mathbb{R}^2\))

Complex-time (kime) can be defined using polar coordinates, \(\kappa = t\ e^{i \varphi}\).

library(plotly)
library(dplyr)

Kime naturally extends time, \(\kappa = t\ e^{i \varphi}\), i.e., time is just the magnitude of kime, \(t=|\kappa|\). The time domain \((t\in\mathbb{R}^+)\) is a subgroup of the multiplicative group of the reals, whereas kime \((\kappa\in\mathbb{C})\) is the smallest algebraically closed prime field that naturally extends the time domain. The time domain of the positive reals is ordered, but its kime extension is not. The kime domain, \(\mathbb{C}\), represents the smallest natural extension of time, as a complete filed that covers time.

This Figure shows the spacekime representation of observable processes indexed by space, reduced to 1D, and kime (2D). At a given spatial location (\(x\)), the red balls scattered along the circle of fixed radius (time) represent the repeated process measurements from the experimentally controlled trials colocalized in spacetime.

# parameter space sweep for the spherical coordinates
phi <- seq(from = 0, to = 2*pi, by = ((2*pi - 0)/(200 - 1)))
psi <- seq(from = 0, to = pi, by = ((pi - 0)/(200 - 1)))

# shape=="cone1")
    # rendering (u,v) parametric surfaces requires x,y,z arguments to be 2D arrays
    # In out case, the three coordinates have to be 200*200 parameterized tensors/arrays
    h1= 10   # cone height
    r1 = seq(from = 0, to = h1, by = ((h1 - 0)/(200 - 1)))  # r = radius
    x1 = 20* ((h1 - r1)/h1 ) %o% rep(1, 200)             # x = 3*r
    y1 = 3* ((h1 - r1)/h1 ) %o% sin(phi)   # y = r*sin(phi)
    z1 = 3* ((h1 - r1)/h1 ) %o% cos(phi)   # z = r*cos(phi)

    # circle1 boundary
    x11 = rep(20, 200) %o% rep(1, 200)             # x = 20
    y11 = 3* ((h1 - r1)/h1 ) %o% sin(phi)   # y = r*sin(phi)
    z11 = 3* ((h1 - r1)/h1 ) %o% cos(phi)   # z = r*cos(phi)
    
    # randomly kime-phase sample points on cone3
    randX1 <- sample((dim(x1))[2], 10)

# shape=="cone2")
    h2= 10   # cone height
    r2 = seq(from = 0, to = h2, by = ((h2 - 0)/(200 - 1)))  # r = radius
    x2 = 20* ((h2 - r2)/h2 ) %o% rep(1, 200)             # x = 3*r
    y2 = 2* ((h2 - r2)/h2 ) %o% sin(phi)   # y = r*sin(phi)
    z2 = 2* ((h2 - r2)/h2 ) %o% cos(phi)   # z = r*cos(phi)

    # circle2 boundary
    x21 = rep(20, 200) %o% rep(1, 200)             # x = 20
    y21 = 2* ((h2 - r2)/h2 ) %o% sin(phi)   # y = r*sin(phi)
    z21 = 2* ((h2 - r2)/h2 ) %o% cos(phi)   # z = r*cos(phi)
    
# shape=="cone3")
    h3= 10   # cone height
    r3 = seq(from = 0, to = h3, by = ((h3 - 0)/(200 - 1)))  # r = radius
    x3 = 15* ((h3 - r3)/h3 ) %o% rep(1, 200)             # x = 3*r
    y3 = 3* ((h3 - r3)/h3 ) %o% sin(phi)   # y = r*sin(phi)
    z3 = 3* ((h3 - r3)/h3 ) %o% cos(phi)   # z = r*cos(phi)

    # circle3 boundary
    x31 = rep(15, 200) %o% rep(1, 200)             # x = 15
    y31 = 3* ((h3 - r3)/h3) %o% sin(phi)   # y = r*sin(phi)
    z31 = 3* ((h3 - r3)/h3) %o% cos(phi)   # z = r*cos(phi)
    
shape_names <- c("all", "cone1", "cone2", "cone3")

# https://plot.ly/r/custom-buttons/

# updatemenus component
updatemenus <- list(
  list(
    active = -1,
    type = 'buttons',
    buttons = list(
      list(
        label = shape_names[1],
        method = "update",
        args = list(list(visible = c(TRUE, TRUE, TRUE, TRUE)),
                    list(title = shape_names[1]))),
      list(
        label = shape_names[2],
        method = "update",
        args = list(list(visible = c(TRUE, FALSE, FALSE, FALSE)),
                    list(title = shape_names[2]))),
      list(
        label = shape_names[3],
        method = "update",
        args = list(list(visible = c(TRUE, TRUE, FALSE, FALSE)),
                    list(title = shape_names[3]))),
      list(
        label = shape_names[4],
        method = "update",
        args = list(list(visible = c(TRUE, FALSE, FALSE, TRUE)),
                    list(title = shape_names[4])))
    )
  )
)

p <- 
  plot_ly(showscale = FALSE) %>%
  # add cone1
  # Randomly sample points (kime-phase sampling) the boundary of cone1 surface
  add_trace(x=~x1[1,randX1], y=~y11[1,randX1], z=~z11[1,randX1], type="scatter3d", 
            mode="markers", marker = list(size = 10, color="red"), name="Phase-Samples",
            text = paste0("Kime-Phase:\n", "  space=", 20, "\n  time=|kime|=", h1, 
                          "\n  kime-phase=", round((phi[randX1])-pi,2))) %>%
  add_trace(x = ~x1, y = ~y1, z = ~z1, type = 'surface', opacity=0.3, visible=T,
             contour=list(show=F, color="#000", width=15, lwd=10,
                          opacity=0.5, hoverinfo="none", legendshow=F)) %>%
  # add cone2
  add_trace(x = ~x2, y = ~y2, z = ~z2, type='surface', opacity=0.4,visible=T,
             contour=list(show=F, color="#000", width=15, lwd=10,
                          opacity=0.5, hoverinfo="none", legendshow=F)) %>%
  # add cone3
  add_trace(x = ~x3, y = ~y3, z = ~z3, type='surface', opacity=0.5,visible=T,
             contour=list(show=F, color="#000", width=15, lwd=10,
                          opacity=0.5, hoverinfo="none", legendshow=F)) %>%
  #
  #
  # trace the x-axis
  add_trace(x=~1.1*x1[,1], y=0, z=0, type="scatter3d", mode="lines", 
              line = list(width = 10, color="light blue"), name="Z",
              hoverinfo="none", legendshow=F) %>%
  #
  #
  # trace the boundary of cone1 surface
  add_trace(x=~x1[1,], y=~y11[1,], z=~z11[1,], type="scatter3d", mode="lines", 
              line = list(width = 10, color="red"), name="Surface Boundary",
              hoverinfo="none", legendshow=F) %>%
  # add center for kime circle1 at location x1
  add_trace(x=~x1[1,1], y=0, z=0, type="scatter3d", mode="markers", 
              marker = list(size = 10, color="red"), name="Z",
              hoverinfo="none", legendshow=F) %>%
  # trace the boundary of cone2 surface
  add_trace(x=~x2[1,], y=~y21[1,], z=~z21[1,], type="scatter3d", mode="lines", 
              line = list(width = 10, color="green"), name="Surface Boundary",
              hoverinfo="none", legendshow=F) %>%
  # trace the boundary of cone3 surface
  add_trace(x=~x3[1,], y=~y31[1,], z=~z31[1,], type="scatter3d", mode="lines", 
              line = list(width = 10, color="blue"), name="Surface Boundary",
              hoverinfo="none", legendshow=F) %>%
  # add center for cime circle3 at location x3
  add_trace(x=~x3[1,1], y=0, z=0, type="scatter3d", mode="markers", 
              line = list(width = 10, color="navy blue"), name="Z",
              hoverinfo="none", legendshow=F) %>%
  # layout
  layout(title = "Schematic of Space (1D) and Kime (2D) Representaiton", showlegend = FALSE,
         scene = list(xaxis=list(title="space"), yaxis=list(title="kappa1"),
                      zaxis=list(title="kappa2")),
         updatemenus = updatemenus)
p

2 Kime-Phase Representation

See this kime-phase representation GIF animation.

library(animation)
library(plotly)
library(circular)

epsilon <- 0.1
sampleSize <- 1000   # total number of phases to sample for 3 different processes (x, y, z)
sizePerTime <- 100   # number of phases to use for each fixed time (must divide sampleSize)
circleUniformPhi <- seq(from=-pi, to=pi, length.out=sizePerTime)

oopt = ani.options(interval = 0.2)
set.seed(1234)
# sample the the kime-phases for all 3 different processes and the r time points
x <- rvonmises(n=sampleSize, mu=circular(pi/5), kappa=3)
y <- rvonmises(n=sampleSize, mu=circular(-pi/3), kappa=5)
z <- rvonmises(n=sampleSize, mu=circular(0), kappa=10)
r <- seq(from=1, to=sampleSize/sizePerTime, length.out=10)

# Define a function that renormalizes the kime-phase to [-pi, pi)
pheRenormalize <- function (x) {
  out <- ifelse(as.numeric(x) <= pi, as.numeric(x)+pi, as.numeric(x)-pi)
  return (out)
}

# transform Von Mises samples from [0, 2*pi) to [-pi, pi)
x <- pheRenormalize(x)
y <- pheRenormalize(y)
z <- pheRenormalize(z)

# vectorize the samples
vectorX = as.vector(x)
vectorY = as.vector(y)
vectorZ = as.vector(z)
# Starting phases, set the first phase index=1
plotX = c(vectorX[1])
plotY = c(vectorY[1])
plotZ = c(vectorZ[1])

pl_scene <- plot_ly(type='scatter3d', mode="markers")
plotX <- list() 
plotY <- list() 
plotZ <- list() 

plotX_df <- list()   # need separate dataframes to store all time foliations
plotY_df <- list()
plotZ_df <- list()

for (t in 1:length(r)) {  # loop over time
  # loop over kime-phases
  plotX[[t]] <- as.numeric(x[c(( (t-1)*length(r) + 1):((t-1)*length(r) + sizePerTime))])
  plotY[[t]] <- as.numeric(y[c(( (t-1)*length(r) + 1):((t-1)*length(r) + sizePerTime))])
  plotZ[[t]] <- as.numeric(z[c(( (t-1)*length(r) + 1):((t-1)*length(r) + sizePerTime))])
  
    # Try to "stack=T the points ....
    #r1 = sqrt((resx$x)^2+(resx$y)^2)/2;
    #resx$x = r1*cos(resx$data)
    #resx$x = r1*cos(resx$data)

  tempX = circular(unlist(plotX[[t]]))
  tempY = circular(unlist(plotY[[t]]))
  tempZ = circular(unlist(plotZ[[t]]))
  
  resx <- density(tempX, bw=25, xaxt='n', yaxt='n')
  resy <- density(tempY, bw=25, xaxt='n', yaxt='n')
  resz <- density(tempZ, bw=25, xaxt='n', yaxt='n')
  # res <- plot(resx, points.plot=TRUE, xlim=c(-1.1,1.5), ylim=c(-1.5, 1.5),
  # main="Trivariate random sampling of\n kime-magnitudes (times) and kime-directions (phases)",
  # offset=0.9, shrink=1.0, ticks=T, lwd=3, axes=F, stack=TRUE, bins=150)
  # pl_list[[t]] 
  unifPhi_df <- as.data.frame(cbind(t=t, circleUniformPhi=circleUniformPhi))
  plotX_df[[t]] <- as.data.frame(cbind(t=t, plotX=unlist(plotX[[t]])))
  plotY_df[[t]] <- as.data.frame(cbind(t=t, plotY=unlist(plotY[[t]])))
  plotZ_df[[t]] <- as.data.frame(cbind(t=t, plotZ=unlist(plotZ[[t]])))
  
  pl_scene <- pl_scene %>% add_trace(data=unifPhi_df, showlegend=FALSE,
                      x = ~((t-epsilon)*cos(circleUniformPhi)), 
                      y = ~((t-epsilon)*sin(circleUniformPhi)), z=0,
                      name=paste0("Time=",t), line=list(color='gray'),
                      mode = 'lines', opacity=0.3) %>%
    add_markers(data=plotX_df[[t]], x=~(t*cos(plotX)), y=~(t*sin(plotX)), z=0,
                      type='scatter3d', name=paste0("X: t=",t), 
                      marker=list(color='green'), showlegend=FALSE,
                      mode = 'markers', opacity=0.3) %>%
    add_markers(data=plotY_df[[t]], x=~((t+epsilon)*cos(plotY)),
                    y=~((t+epsilon)*sin(plotY)), z=0-epsilon, showlegend=FALSE,
                    type='scatter3d', name=paste0("Y: t=",t), 
                    marker=list(color='blue'),
                    mode = 'markers', opacity=0.3) %>%
    add_markers(data=plotZ_df[[t]], x=~((t+2*epsilon)*cos(plotZ)),
                y=~((t+2*epsilon)*sin(plotZ)), z=0+epsilon, showlegend=FALSE,
                type='scatter3d', name=paste0("Z: t=",t), 
                marker=list(color='red'),
                mode = 'markers', opacity=0.3)
} 

means_df <- as.data.frame(cbind(t = c(1:length(r)),
                                plotX_means=unlist(lapply(plotX, mean)),
                                plotY_means=unlist(lapply(plotY, mean)),
                                plotZ_means=unlist(lapply(plotZ, mean))))
pl_scene <- pl_scene %>% 
  # add averaged (donoised) phase trajectories
  add_trace(data=means_df, x=~(t*cos(plotX_means)), 
        y=~(t*sin(plotX_means)), z=0,
        type='scatter3d', showlegend=FALSE, mode='lines', name="Expected Obs X", 
        line=list(color='green', width=15), opacity=0.8) %>%
  add_trace(data=means_df, x=~(t*cos(plotY_means)), 
        y=~(t*sin(plotY_means)), z=0-epsilon,
        type='scatter3d', showlegend=FALSE, mode='lines', name="Expected Obs X", 
        line=list(color='blue', width=15), opacity=0.8) %>%
  add_trace(data=means_df, x=~(t*cos(plotZ_means)), 
        y=~(t*sin(plotZ_means)), z=0+epsilon,
        type='scatter3d', showlegend=FALSE, mode='lines', name="Expected Obs X", 
        line=list(color='red', width=15), opacity=0.8) %>%
  add_trace(x=0, y=0, z=c(-2,2), name="Space", showlegend=FALSE,
             line=list(color='gray', width=15), opacity=0.8) %>%
  layout(title="Pseudo Spacekime (1D Space, 2D Kime) Kime-Phase Sampling and Foliation",
          scene = list(xaxis=list(title="Kappa1"), yaxis=list(title="Kappa2"),
                        zaxis=list(title="Space"))) %>% hide_colorbar()
pl_scene
SOCR Resource Visitor number Web Analytics SOCR Email