s2.lisp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183
  1. (in-package :cl-user)
  2. (defpackage #:ocm.s2
  3. (:use :cl))
  4. (in-package :ocm.s2)
  5. ;; This file contains documentation of the various coordinate systems used
  6. ;; throughout the library. Most importantly, S2 defines a framework for
  7. ;; decomposing the unit sphere into a hierarchy of "cells". Each cell is a
  8. ;; quadrilateral bounded by four geodesics. The top level of the hierarchy is
  9. ;; obtained by projecting the six faces of a cube onto the unit sphere, and
  10. ;; lower levels are obtained by subdividing each cell into four children
  11. ;; recursively. Cells are numbered such that sequentially increasing cells
  12. ;; follow a continuous space-filling curve over the entire sphere. The
  13. ;; transformation is designed to make the cells at each level fairly uniform
  14. ;; in size.
  15. ;;
  16. ;;
  17. ;; ////////////////////////// S2Cell Decomposition /////////////////////////
  18. ;;
  19. ;; The following methods define the cube-to-sphere projection used by
  20. ;; the S2Cell decomposition.
  21. ;;
  22. ;; In the process of converting a latitude-longitude pair to a 64-bit cell
  23. ;; id, the following coordinate systems are used:
  24. ;;
  25. ;; (id)
  26. ;; An S2CellId is a 64-bit encoding of a face and a Hilbert curve position
  27. ;; on that face. The Hilbert curve position implicitly encodes both the
  28. ;; position of a cell and its subdivision level (see s2cell_id.h).
  29. ;;
  30. ;; (face, i, j)
  31. ;; Leaf-cell coordinates. "i" and "j" are integers in the range
  32. ;; [0,(2**30)-1] that identify a particular leaf cell on the given face.
  33. ;; The (i, j) coordinate system is right-handed on each face, and the
  34. ;; faces are oriented such that Hilbert curves connect continuously from
  35. ;; one face to the next.
  36. ;;
  37. ;; (face, s, t)
  38. ;; Cell-space coordinates. "s" and "t" are real numbers in the range
  39. ;; [0,1] that identify a point on the given face. For example, the point
  40. ;; (s, t) = (0.5, 0.5) corresponds to the center of the top-level face
  41. ;; cell. This point is also a vertex of exactly four cells at each
  42. ;; subdivision level greater than zero.
  43. ;;
  44. ;; (face, si, ti)
  45. ;; Discrete cell-space coordinates. These are obtained by multiplying
  46. ;; "s" and "t" by 2**31 and rounding to the nearest unsigned integer.
  47. ;; Discrete coordinates lie in the range [0,2**31]. This coordinate
  48. ;; system can represent the edge and center positions of all cells with
  49. ;; no loss of precision (including non-leaf cells). In binary, each
  50. ;; coordinate of a level-k cell center ends with a 1 followed by
  51. ;; (30 - k) 0s. The coordinates of its edges end with (at least)
  52. ;; (31 - k) 0s.
  53. ;;
  54. ;; (face, u, v)
  55. ;; Cube-space coordinates in the range [-1,1]. To make the cells at each
  56. ;; level more uniform in size after they are projected onto the sphere,
  57. ;; we apply a nonlinear transformation of the form u=f(s), v=f(t).
  58. ;; The (u, v) coordinates after this transformation give the actual
  59. ;; coordinates on the cube face (modulo some 90 degree rotations) before
  60. ;; it is projected onto the unit sphere.
  61. ;;
  62. ;; (face, u, v, w)
  63. ;; Per-face coordinate frame. This is an extension of the (face, u, v)
  64. ;; cube-space coordinates that adds a third axis "w" in the direction of
  65. ;; the face normal. It is always a right-handed 3D coordinate system.
  66. ;; Cube-space coordinates can be converted to this frame by setting w=1,
  67. ;; while (u,v,w) coordinates can be projected onto the cube face by
  68. ;; dividing by w, i.e. (face, u/w, v/w).
  69. ;;
  70. ;; (x, y, z)
  71. ;; Direction vector (S2Point). Direction vectors are not necessarily unit
  72. ;; length, and are often chosen to be points on the biunit cube
  73. ;; [-1,+1]x[-1,+1]x[-1,+1]. They can be be normalized to obtain the
  74. ;; corresponding point on the unit sphere.
  75. ;;
  76. ;; (lat, lng)
  77. ;; Latitude and longitude (S2LatLng). Latitudes must be between -90 and
  78. ;; 90 degrees inclusive, and longitudes must be between -180 and 180
  79. ;; degrees inclusive.
  80. ;;
  81. ;; Note that the (i, j), (s, t), (si, ti), and (u, v) coordinate systems are
  82. ;; right-handed on all six faces.
  83. (defconstant +swap-mask+ 1)
  84. (defconstant +invert-mask+ 2)
  85. (defconstant +max-cell-level+ 28 "This is the number of levels needed to specify a leaf cell.")
  86. (defconstant +limit-ij+ (ash 1 +max-cell-level+) "The maximum index of a valid leaf cell plus one. The range of valid leaf cell indices is [0..+limit-ij+-1].")
  87. (defconstant +max-si-ti+ (ash 1 (1+ +max-cell-level+)) "The maximum value of an si- or ti-coordinate. The range of valid (si,ti) values is [0..+max-si-ti+].")
  88. (deftype ij () `(integer 0 ,+limit-ij+))
  89. (deftype si-ti () `(integer 0 ,+max-si-ti+))
  90. ;; An S2CellId is a 64-bit unsigned integer that uniquely identifies a
  91. ;; cell in the S2 cell decomposition. It has the following format:
  92. ;;
  93. ;; id = [face][face_pos]
  94. ;;
  95. ;; face: a 3-bit number (range 0..5) encoding the cube face.
  96. ;;
  97. ;; face_pos: a 61-bit number encoding the position of the center of this
  98. ;; cell along the Hilbert curve over this face (see the Wiki
  99. ;; pages for details).
  100. ;;
  101. ;; Sequentially increasing cell ids follow a continuous space-filling curve
  102. ;; over the entire sphere. They have the following properties:
  103. ;;
  104. ;; - The id of a cell at level k consists of a 3-bit face number followed
  105. ;; by k bit pairs that recursively select one of the four children of
  106. ;; each cell. The next bit is always 1, and all other bits are 0.
  107. ;; Therefore, the level of a cell is determined by the position of its
  108. ;; lowest-numbered bit that is turned on (for a cell at level k, this
  109. ;; position is 2 * (kMaxLevel - k).)
  110. ;;
  111. ;; - The id of a parent cell is at the midpoint of the range of ids spanned
  112. ;; by its children (or by its descendants at any level).
  113. (defconstant +face-bits+ 3)
  114. (defconstant +num-faces+ 6)
  115. (defconstant +max-level+ +max-cell-level+)
  116. (defconstant +pos-bits+ (1+ (* 2 +max-level+)))
  117. (defconstant +max-size+ (ash 1 +max-level+))
  118. (deftype level () `(integer 0 ,+max-level+))
  119. (deftype face () `(integer 0 ,(1- +num-faces+)))
  120. (deftype cell-id () `(integer 0 ,(1- (ash 1 (+ +face-bits+ +pos-bits+)))))
  121. (declaim (inline ij-to-stmin))
  122. (defun ij-to-stmin (i)
  123. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  124. (type ij i))
  125. (* i (/ 1d0 +limit-ij+)))
  126. (declaim (inline st-to-ij))
  127. (defun st-to-ij (s)
  128. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  129. (double-float s))
  130. (max 0 (min (1- +limit-ij+)
  131. (the ij (round (- (* s +limit-ij+) 0.5d0))))))
  132. ;; Use quadratic (s,t) -> (u,v) projection. See S2 sources for explanation.
  133. (declaim (inline st-to-uv))
  134. (defun st-to-uv (s)
  135. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  136. (type double-float s))
  137. (* (/ 1 3d0)
  138. (if (>= s 0.5d0)
  139. (1- (* 4 s s))
  140. (- 1 (* 4 (- 1 s) (- 1 s))))))
  141. (declaim (inline uv-to-st))
  142. (defun uv-to-st (u)
  143. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  144. (type double-float u))
  145. (if (>= u 0)
  146. (* 0.5d0 (the double-float (sqrt (1+ (* 3 u)))))
  147. (- 1 (* 0.5d0 (the double-float (sqrt (- 1 (* 3 u))))))))
  148. ;;
  149. (defstruct point
  150. (x 0.0d0 :type double-float)
  151. (y 0.0d0 :type double-float)
  152. (z 0.0d0 :type double-float))
  153. (defstruct latlng
  154. (lat 0d0 :type double-float)
  155. (lng 0d0 :type double-float))
  156. (declaim (inline deg-to-rad))
  157. (defun deg-to-rad (deg)
  158. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  159. (type double-float deg))
  160. (* (/ pi 180d0) deg))
  161. (declaim (inline rad-to-deg))
  162. (defun rad-to-deg (rad)
  163. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  164. (type double-float rad))
  165. (* (/ 180d0 pi) rad))
  166. (defun from-radians (lat-rad lng-rad)
  167. (make-latlng :lat lat-rad :lng lng-rad))
  168. (defun from-degrees (lat-deg lng-deg)
  169. (make-latlng :lat (deg-to-rad lat-deg) :lng (deg-to-rad lng-deg)))
  170. (defun to-degrees (latlng)
  171. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  172. (type latlng latlng))
  173. (with-slots (lat lng) latlng
  174. (cons (rad-to-deg lat) (rad-to-deg lng))))
  175. (defun latlng-to-point (latlng)
  176. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  177. (type latlng latlng))
  178. (with-slots (lat lng) latlng
  179. (let* ((phi lat)
  180. (theta lng)
  181. (cos-phi (cos phi)))
  182. (make-point :x (* (cos theta) cos-phi)
  183. :y (* (sin theta) cos-phi)
  184. :z (sin phi)))))
  185. (defun point-lat (p)
  186. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  187. (type point p))
  188. (with-slots (x y z) p
  189. (atan z (sqrt (+ (* x x) (* y y))))))
  190. (defun point-lng (p)
  191. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  192. (type point p))
  193. (with-slots (x y) p
  194. (atan y x)))
  195. (defun point-to-lat-lng (p)
  196. (declare (type point p))
  197. (from-radians (point-lat p) (point-lng p)))
  198. (declaim (inline dot))
  199. (defun dot (p1 p2)
  200. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  201. (type point p1 p2))
  202. (+ (* (point-x p1) (point-x p2))
  203. (* (point-y p1) (point-y p2))
  204. (* (point-z p1) (point-z p2))))
  205. (defparameter +face-uvw-axes+
  206. (make-array '(6 3) :element-type 'point :initial-contents
  207. (list
  208. (list (make-point :y 1d0) (make-point :z 1d0) (make-point :x 1d0))
  209. (list (make-point :x -1d0) (make-point :z 1d0) (make-point :y 1d0))
  210. (list (make-point :x -1d0) (make-point :y -1d0) (make-point :z 1d0))
  211. (list (make-point :z -1d0) (make-point :y -1d0) (make-point :x -1d0))
  212. (list (make-point :z -1d0) (make-point :x 1d0) (make-point :y -1d0))
  213. (list (make-point :y 1d0) (make-point :x 1d0) (make-point :z -1d0))))
  214. "The U,V,W axes for each face.")
  215. (defun get-xyz-face (p)
  216. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  217. (type point p))
  218. (with-slots (x y z) p
  219. (cond
  220. ((and (> (abs x) (abs y))
  221. (> (abs x) (abs z)))
  222. (if (>= x 0) 0 3))
  223. ((and (> (abs y) (abs x))
  224. (> (abs y) (abs z)))
  225. (if (>= y 0) 1 4))
  226. (t
  227. (if (>= z 0) 2 5)))))
  228. (declaim (inline get-uvw-axis))
  229. (defun get-uvw-axis (face axis)
  230. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  231. (type (simple-array point *) +face-uvw-axes+)
  232. (type face face axis))
  233. (aref +face-uvw-axes+ face axis))
  234. (declaim (inline get-norm))
  235. (defun get-norm (face)
  236. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  237. (type face face))
  238. (get-uvw-axis face 2))
  239. (defun valid-face-xyz-to-uv (face p)
  240. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  241. (type point p)
  242. (type face face))
  243. (assert (> (dot (get-norm face) p) 0))
  244. (with-slots (x y z) p
  245. (ecase face
  246. (0 (values (/ y x) (/ z x)))
  247. (1 (values (/ (- x) y) (/ z y)))
  248. (2 (values (/ (- x) z) (/ (- y) z)))
  249. (3 (values (/ z x) (/ y x)))
  250. (4 (values (/ z y) (/ (- x) y)))
  251. (5 (values (/ (- y) z) (/ (- x) z))))))
  252. (defun xyz-to-face-uv (p)
  253. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  254. (type point p))
  255. (let ((face (get-xyz-face p)))
  256. (multiple-value-bind (u v)
  257. (valid-face-xyz-to-uv face p)
  258. (values face u v))))
  259. ;; The following lookup tables are used to convert efficiently between an
  260. ;; (i,j) cell index and the corresponding position along the Hilbert curve.
  261. ;; "lookup_pos" maps 4 bits of "i", 4 bits of "j", and 2 bits representing the
  262. ;; orientation of the current cell into 8 bits representing the order in which
  263. ;; that subcell is visited by the Hilbert curve, plus 2 bits indicating the
  264. ;; new orientation of the Hilbert curve within that subcell. (Cell
  265. ;; orientations are represented as combination of kSwapMask and kInvertMask.)
  266. ;;
  267. ;; "lookup_ij" is an inverted table used for mapping in the opposite
  268. ;; direction.
  269. ;;
  270. ;; We also experimented with looking up 16 bits at a time (14 bits of position
  271. ;; plus 2 of orientation) but found that smaller lookup tables gave better
  272. ;; performance. (2KB fits easily in the primary cache.)
  273. (defconstant +lookup-bits+ 4)
  274. (defvar *lookup-pos* (make-array (ash 1 (+ 2 (* +lookup-bits+ 2))) :element-type '(unsigned-byte 16)))
  275. (defvar *lookup-ij* (make-array (ash 1 (+ 2 (* +lookup-bits+ 2))) :element-type '(unsigned-byte 16)))
  276. (defparameter +ij-to-pos+
  277. ;; (0,0) (0,1) (1,0) (1,1)
  278. #(#(0 1 3 2) ; canonical order
  279. #(0 3 1 2) ; axes swapped
  280. #(2 3 1 0) ; bits inverted
  281. #(2 1 3 0)); swapped & inverted
  282. "IJtoPos[orientation][ij] -> pos")
  283. (defparameter +pos-to-ij+
  284. ;; 0 1 2 3
  285. #(#(0 1 3 2) ; canonical order: (0,0), (0,1), (1,1), (1,0)
  286. #(0 2 3 1) ; axes swapped: (0,0), (1,0), (1,1), (0,1)
  287. #(3 2 0 1) ; bits inverted: (1,1), (1,0), (0,0), (0,1)
  288. #(3 1 0 2)); swapped & inverted: (1,1), (0,1), (0,0), (1,0)
  289. "PosToIJ[orientation][pos] -> ij")
  290. (defparameter +pos-to-orient+
  291. (make-array 4 :element-type '(unsigned-byte 8)
  292. :initial-contents (list +swap-mask+ 0 0 (logior +swap-mask+ +invert-mask+)))
  293. "PosToOrientation[pos] -> orientation_modifier")
  294. (defun init-lookup ()
  295. (labels ((init-lookup-cell (level i j orig-orient pos orient)
  296. (if (= level +lookup-bits+)
  297. (let ((ij (+ (ash i +lookup-bits+) j)))
  298. (setf (aref *lookup-pos* (+ (ash ij 2) orig-orient)) (+ (ash pos 2) orient))
  299. (setf (aref *lookup-ij* (+ (ash pos 2) orig-orient)) (+ (ash ij 2) orient)))
  300. (let ((level (1+ level))
  301. (i (ash i 1))
  302. (j (ash j 1))
  303. (pos (ash pos 2))
  304. (r (aref +pos-to-ij+ orient)))
  305. (init-lookup-cell level (+ i (ash (aref r 0) -1)) (+ j (logand (aref r 0) 1))
  306. orig-orient pos (logxor orient (aref +pos-to-orient+ 0)))
  307. (init-lookup-cell level (+ i (ash (aref r 1) -1)) (+ j (logand (aref r 1) 1))
  308. orig-orient (+ pos 1) (logxor orient (aref +pos-to-orient+ 1)))
  309. (init-lookup-cell level (+ i (ash (aref r 2) -1)) (+ j (logand (aref r 2) 1))
  310. orig-orient (+ pos 2) (logxor orient (aref +pos-to-orient+ 2)))
  311. (init-lookup-cell level (+ i (ash (aref r 3) -1)) (+ j (logand (aref r 3) 1))
  312. orig-orient (+ pos 3) (logxor orient (aref +pos-to-orient+ 3)))))))
  313. (init-lookup-cell 0 0 0 0 0 0)
  314. (init-lookup-cell 0 0 0 +swap-mask+ 0 +swap-mask+)
  315. (init-lookup-cell 0 0 0 +invert-mask+ 0 +invert-mask+)
  316. (init-lookup-cell 0 0 0 (logior +swap-mask+ +invert-mask+) 0 (logior +swap-mask+ +invert-mask+))))
  317. (eval-when (:execute :compile-toplevel :load-toplevel)
  318. (init-lookup))
  319. (declaim (inline lsb32))
  320. (defun lsb32 (n)
  321. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  322. (type (integer 0 #xFFFFFFFF) n))
  323. (loop with rc of-type (integer 0 31) = 31
  324. for i from 4 downto 0
  325. for shift of-type (integer 0 16) = (ash 1 4) then (ash shift -1)
  326. for x = (logand #xFFFFFFFF (ash n shift))
  327. when (not (zerop x))
  328. do (setf n x rc (- rc shift))
  329. finally (return rc)))
  330. (declaim (inline lsb62))
  331. (defun lsb62 (n)
  332. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  333. (type fixnum n))
  334. (let ((bottombits (logand #xFFFFFFFF n)))
  335. (if (zerop bottombits)
  336. (+ 32 (the (integer 0 31) (lsb32 (ash n -32))))
  337. (lsb32 bottombits))))
  338. (declaim (inline find-lsb-set))
  339. (defun find-lsb-set (num)
  340. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  341. (type cell-id num))
  342. (lsb62 num)
  343. ; (or (loop for i upto +pos-bits+ when (logbitp i num) return i) 0)
  344. )
  345. (declaim (inline log2floor32))
  346. (defun log2floor32 (n)
  347. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  348. (type (unsigned-byte 32) n))
  349. (if (zerop n) -1
  350. (loop with log of-type (integer 0 31) = 0
  351. with value of-type (integer 0 #xFFFFFFFF) = n
  352. for i from 4 downto 0
  353. for shift of-type (integer 0 16) = (ash 1 i)
  354. for x = (ash value (- shift))
  355. when (not (zerop x))
  356. do (setf value x log (+ log shift))
  357. finally (return log))))
  358. (declaim (inline log2floor62))
  359. (defun log2floor62 (n)
  360. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  361. (type fixnum n))
  362. (let ((topbits (ash n -32)))
  363. (if (zerop topbits)
  364. (log2floor32 (logand n #xFFFFFFFF))
  365. (+ 32 (the (integer 0 31) (log2floor32 topbits))))))
  366. (declaim (inline find-msb-set))
  367. (defun find-msb-set (num)
  368. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  369. (type cell-id num))
  370. (log2floor62 num))
  371. (declaim (inline cell-lsb))
  372. (defun cell-lsb (id)
  373. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  374. (type cell-id id))
  375. (logand id (1+ (lognot id))))
  376. (declaim (inline lsb-for-level))
  377. (defun lsb-for-level (level)
  378. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  379. (type level level))
  380. (ash 1 (* 2 (- +max-level+ level))))
  381. (declaim (inline cell-face))
  382. (defun cell-face (id)
  383. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  384. (type cell-id id))
  385. (ash id (- +pos-bits+)))
  386. (declaim (inline cell-pos))
  387. (defun cell-pos (id)
  388. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  389. (cell-id id))
  390. (logand id (1- (ash 1 +pos-bits+))))
  391. (declaim (inline cell-is-valid))
  392. (defun cell-is-valid (id)
  393. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  394. (cell-id id))
  395. (and (< (cell-face id) +num-faces+)
  396. (not (zerop (logand (cell-lsb id) #x5555555555555555 (1- (ash 1 +pos-bits+)))))))
  397. (defun cell-level (id)
  398. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  399. (type cell-id id))
  400. (assert (not (zerop id)))
  401. (- +max-level+
  402. (ash (find-lsb-set id) -1)))
  403. (defun from-face-ij (face i j)
  404. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  405. (type face face)
  406. (type ij i j)
  407. (type (simple-array (unsigned-byte 16) *) *lookup-pos*))
  408. (let ((n (ash face (1- +pos-bits+)))
  409. (bits (logand face +swap-mask+))
  410. (mask (1- (ash 1 +lookup-bits+))))
  411. (declare (type cell-id n))
  412. (macrolet ((get-bits (k)
  413. `(setf bits
  414. (aref *lookup-pos*
  415. (+ bits
  416. (ash (logand mask (ash i (- (* ,k +lookup-bits+)))) (+ +lookup-bits+ 2))
  417. (ash (logand mask (ash j (- (* ,k +lookup-bits+)))) 2)))
  418. n (logior n (the cell-id (ash (ash bits -2)
  419. (* ,k 2 +lookup-bits+))))
  420. bits (logand bits (logior +swap-mask+ +invert-mask+)))))
  421. (get-bits 7)
  422. (get-bits 6)
  423. (get-bits 5)
  424. (get-bits 4)
  425. (get-bits 3)
  426. (get-bits 2)
  427. (get-bits 1)
  428. (get-bits 0))
  429. (1+ (ash n 1))))
  430. (defun point-to-cell (p)
  431. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  432. (type point p))
  433. (multiple-value-bind (face u v)
  434. (xyz-to-face-uv p)
  435. (from-face-ij face
  436. (st-to-ij (uv-to-st u))
  437. (st-to-ij (uv-to-st v)))))
  438. (declaim (inline si-ti-to-st))
  439. (defun si-ti-to-st (si)
  440. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  441. (type si-ti si))
  442. (* si (/ 1d0 +max-si-ti+)))
  443. (defun face-uv-ti-xyz (face u v)
  444. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  445. (type double-float u v)
  446. (type face face))
  447. (ecase face
  448. (0 (make-point :x 1d0 :y u :z v))
  449. (1 (make-point :x (- u) :y 1d0 :z v))
  450. (2 (make-point :x (- u) :y (- v) :z 1d0))
  451. (3 (make-point :x -1d0 :y (- v) :z (- u)))
  452. (4 (make-point :x v :y -1d0 :z (- u)))
  453. (5 (make-point :x v :y u :z -1d0))))
  454. (defun face-si-ti-to-xyz (face si ti)
  455. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  456. (type si-ti si ti)
  457. (type face face))
  458. (face-uv-ti-xyz face
  459. (st-to-uv (si-ti-to-st si))
  460. (st-to-uv (si-ti-to-st ti))))
  461. (declaim (inline cell-child-position))
  462. (defun cell-child-position (id &optional level)
  463. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  464. (type cell-id id)
  465. (type (or null level) level))
  466. (unless level (setf level (cell-level id)))
  467. (assert (cell-is-valid id))
  468. (assert (>= level 1))
  469. (assert (<= level (the level (cell-level id))))
  470. (logand 3 (ash id (- (1+ (* 2 (- +max-level+ level)))))))
  471. (declaim (inline cell-is-leaf))
  472. (defun cell-is-leaf (id)
  473. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  474. (type cell-id id))
  475. (not (zerop (logand id 1))))
  476. (declaim (inline cell-is-face))
  477. (defun cell-is-face (id)
  478. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  479. (type cell-id id))
  480. (zerop (logand id (1- (lsb-for-level 0)))))
  481. (declaim (inline cell-range-min))
  482. (defun cell-range-min (id)
  483. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  484. (type cell-id id))
  485. (- id (1- (cell-lsb id))))
  486. (declaim (inline cell-range-max))
  487. (defun cell-range-max (id)
  488. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  489. (type cell-id id))
  490. (+ id (1- (cell-lsb id))))
  491. (declaim (inline cell-parent))
  492. (defun cell-parent (id &optional level)
  493. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  494. (type cell-id id)
  495. (type (or null level) level))
  496. (assert (cell-is-valid id))
  497. (if level (progn
  498. (assert (>= level 0))
  499. (assert (<= level (the level (cell-level id)))))
  500. (progn (assert (not (cell-is-face id)))))
  501. (let ((new-lsb (if level (lsb-for-level level) (ash (cell-lsb id) 2))))
  502. (logior new-lsb (logand id (1+ (lognot new-lsb))))))
  503. (declaim (inline cell-child))
  504. (defun cell-child (id pos)
  505. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  506. (type cell-id id)
  507. (type (integer 0 3) pos))
  508. (assert (cell-is-valid id))
  509. (assert (not (cell-is-leaf id)))
  510. (+ id (* (+ (* 2 pos) 1 -4) (ash (cell-lsb id) -2))))
  511. (defun cell-to-face-ij-orientation (id)
  512. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  513. (type cell-id id)
  514. (type (simple-array (unsigned-byte 16) *) *lookup-ij*))
  515. (let* ((i 0)
  516. (j 0)
  517. (face (cell-face id))
  518. (bits (logand face +swap-mask+)))
  519. (declare (type ij i j)
  520. (type face face)
  521. (type (integer 0 3) bits))
  522. (macrolet ((get-bits (k)
  523. `(let ((nbits (if (= ,k 7) (- +max-level+ (* 7 +lookup-bits+)) +lookup-bits+)))
  524. (setf bits (aref *lookup-ij*
  525. (+ bits
  526. (ash (logand (ash id (- (1+ (* ,k 2 +lookup-bits+))))
  527. (1- (ash 1 (* 2 nbits)))) 2))))
  528. (setf i (+ i (ash (ash bits (- (+ +lookup-bits+ 2)))
  529. (* ,k +lookup-bits+)))
  530. j (+ j (ash (logand (ash bits -2)
  531. (1- (ash 1 +lookup-bits+)))
  532. (* ,k +lookup-bits+)))
  533. bits (logand bits (logior +swap-mask+ +invert-mask+))))))
  534. (get-bits 7)
  535. (get-bits 6)
  536. (get-bits 5)
  537. (get-bits 4)
  538. (get-bits 3)
  539. (get-bits 2)
  540. (get-bits 1)
  541. (get-bits 0)
  542. (values face i j (logxor bits (if (zerop (logand (cell-lsb id) #x1111111111111110)) 0 +swap-mask+))))))
  543. (defun cell-get-center-face-si-ti (id)
  544. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  545. (type cell-id id))
  546. (multiple-value-bind (face i j orient) (cell-to-face-ij-orientation id)
  547. (declare (ignore orient)
  548. (type ij i j))
  549. (let ((delta (if (cell-is-leaf id) 1 (if (zerop (logand 1 (logxor i (ash id -2)))) 0 2))))
  550. (values face (+ delta (* 2 i)) (+ delta (* 2 j))))))
  551. (defun cell-to-point-raw (id)
  552. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  553. (type cell-id id))
  554. (apply #'face-si-ti-to-xyz (multiple-value-list (cell-get-center-face-si-ti id))))
  555. (defun cell-to-string (id)
  556. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  557. (type cell-id id))
  558. (format nil "~a/~{~a~}" (cell-face id)
  559. (loop for level from 1 to (the level (cell-level id))
  560. collect (cell-child-position id level))))
  561. ;;;;;;;;;
  562. ;;;
  563. (defun make-span (vector offset &optional size)
  564. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  565. (type vector vector)
  566. (type fixnum offset)
  567. (type (or null fixnum) size))
  568. (let ((length (length vector)))
  569. (assert (< offset length))
  570. (when size (assert (< (the fixnum (+ offset size)) length)))
  571. (make-array (or size (the fixnum (- length offset)))
  572. :element-type (or (cadr (type-of vector)) t)
  573. :displaced-to vector
  574. :displaced-index-offset offset)))
  575. (deftype byte-vector () `(vector (unsigned-byte 8)))
  576. (defun make-encoder (size)
  577. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  578. (type fixnum size))
  579. (make-array size :element-type '(unsigned-byte 8) :fill-pointer 0 :adjustable t))
  580. (declaim (inline encoder-length))
  581. (defun encoder-length (encoder)
  582. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  583. (type byte-vector encoder))
  584. (fill-pointer encoder))
  585. (declaim (inline encoder-avail))
  586. (defun encoder-avail (encoder)
  587. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  588. (type byte-vector encoder))
  589. (- (array-total-size encoder)
  590. (fill-pointer encoder)))
  591. (declaim (inline encoder-ensure))
  592. (defun encoder-ensure (encoder size)
  593. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  594. (type byte-vector encoder)
  595. (type fixnum size))
  596. (when (< (encoder-avail encoder) size)
  597. (adjust-array encoder (+ (fill-pointer encoder) size))))
  598. (declaim (inline encoder-put8))
  599. (defun encoder-put8 (encoder value)
  600. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  601. (type byte-vector encoder)
  602. (type (unsigned-byte 8) value))
  603. (assert (> (encoder-avail encoder) 1))
  604. (vector-push value encoder)
  605. encoder)
  606. (declaim (inline encoder-putn))
  607. (defun encoder-putn (encoder vector)
  608. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  609. (type byte-vector encoder)
  610. (type byte-vector vector))
  611. (loop for value across vector do (vector-push value encoder))
  612. encoder)
  613. (defconstant +varint-max32+ 5 "Maximum varint encoding length for uint32")
  614. (declaim (inline encoder-put-varint32))
  615. (defun encoder-put-varint32 (encoder v)
  616. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  617. (type byte-vector encoder)
  618. (type (unsigned-byte 32) v))
  619. (let ((b 128))
  620. (cond
  621. ((< v (ash 1 7)) (encoder-put8 encoder v))
  622. ((< v (ash 1 14))
  623. (encoder-put8 encoder (logand 255 (logior v b)))
  624. (encoder-put8 encoder (logand 255 (ash v -7))))
  625. ((< v (ash 1 21))
  626. (encoder-put8 encoder (logand 255 (logior v b)))
  627. (encoder-put8 encoder (logand 255 (logior (ash v -7) b)))
  628. (encoder-put8 encoder (logand 255 (ash v -14))))
  629. ((< v (ash 1 28))
  630. (encoder-put8 encoder (logand 255 (logior v b)))
  631. (encoder-put8 encoder (logand 255 (logior (ash v -7) b)))
  632. (encoder-put8 encoder (logand 255 (logior (ash v -14) b)))
  633. (encoder-put8 encoder (logand 255 (ash v -21))))
  634. (t
  635. (encoder-put8 encoder (logand 255 (logior v b)))
  636. (encoder-put8 encoder (logand 255 (logior (ash v -7) b)))
  637. (encoder-put8 encoder (logand 255 (logior (ash v -14) b)))
  638. (encoder-put8 encoder (logand 255 (logior (ash v -21) b)))
  639. (encoder-put8 encoder (logand 255 (ash v -28))))))
  640. encoder)
  641. (defconstant +varint-max64+ 10 "Maximum varint encoding length for uint64")
  642. (defun encoder-put-varint64 (encoder v)
  643. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  644. (type byte-vector encoder)
  645. (type (unsigned-byte 64) v))
  646. (if (< v (ash 1 28))
  647. (encoder-put-varint32 encoder v)
  648. (let ((x32 (logand (1- (ash 1 32)) (logior v (ash 1 7) (ash 1 21))))
  649. (y32 (logand (1- (ash 1 32)) (logior v (ash 1 14) (ash 1 28)))))
  650. (encoder-put8 encoder (logand 255 x32))
  651. (encoder-put8 encoder (logand 255 (ash y32 -7)))
  652. (encoder-put8 encoder (logand 255 (ash x32 -14)))
  653. (encoder-put8 encoder (logand 255 (ash y32 -21)))
  654. (if (< v (ash 1 35))
  655. (encoder-put8 encoder (logand 255 (ash v -28)))
  656. (progn
  657. (encoder-put8 encoder (logand 255 (logior (ash v -28) (ash 1 7))))
  658. (encoder-put-varint32 encoder (ash v -35)))))))
  659. ;;; decoder ;;;
  660. (defun make-decoder (size &key (fill-pointer 0) initial-contents initial-element displaced-to)
  661. (apply #'make-array size
  662. :element-type '(unsigned-byte 8)
  663. :fill-pointer fill-pointer
  664. (append
  665. (when initial-contents `(:initial-contents ,initial-contents))
  666. (when initial-element `(:initial-element ,initial-element))
  667. (when displaced-to `(:displaced-to ,displaced-to :displaced-index-offset ,(fill-pointer displaced-to))))))
  668. (declaim (inline decoder-avail))
  669. (defun decoder-avail (decoder)
  670. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  671. (type byte-vector decoder))
  672. (- (array-total-size decoder)
  673. (fill-pointer decoder)))
  674. (declaim (inline decoder-skip))
  675. (defun decoder-skip (decoder &optional (count 1))
  676. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  677. (type byte-vector decoder)
  678. (type fixnum count))
  679. (incf (fill-pointer decoder) count))
  680. (declaim (inline decoder-reset))
  681. (defun decoder-reset (decoder)
  682. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  683. (type byte-vector decoder))
  684. (setf (fill-pointer decoder) 0))
  685. (defun make-sub-decoder (decoder size &optional will-decode)
  686. (when (>= (decoder-avail decoder) size)
  687. (prog1 (make-decoder size :fill-pointer (if will-decode 0 size) :displaced-to decoder)
  688. (decoder-skip decoder size))))
  689. (defmacro with-decoder-reset ((decoder &optional (offset 0)) &body body)
  690. (let ((fp (gensym "FP"))
  691. (dc (gensym "DC")))
  692. `(let* ((,dc ,decoder)
  693. (,fp (fill-pointer ,dc)))
  694. (unwind-protect
  695. (progn
  696. (setf (fill-pointer ,dc) ,offset)
  697. ,@body)
  698. (setf (fill-pointer ,dc) ,fp)))))
  699. (declaim (inline decoder-get8))
  700. (defun decoder-get8 (decoder)
  701. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  702. (type byte-vector decoder))
  703. (prog1 (aref decoder (fill-pointer decoder))
  704. (decoder-skip decoder)))
  705. (declaim (inline decoder-peek))
  706. (defun decoder-peek (decoder &optional (offset 0))
  707. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  708. (type byte-vector decoder)
  709. (type fixnum offset))
  710. (aref decoder (+ (fill-pointer decoder) offset)))
  711. (deftype varint-length () `(integer 0 ,+varint-max64+))
  712. (defun decoder-get-varint64 (decoder)
  713. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  714. (type byte-vector decoder))
  715. (loop
  716. for b = (decoder-get8 decoder) then (decoder-get8 decoder)
  717. for i of-type varint-length from 0 upto (decoder-avail decoder)
  718. with result of-type (unsigned-byte 64) = 0
  719. do (incf result (the (unsigned-byte 64) (ash (if (zerop i) b (1- b)) (* i 7))))
  720. until (< b 128)
  721. finally (return result)))
  722. (defun decoder-get-varint-fixnum (decoder)
  723. (declare (optimize (speed 3) (safety 0) (debug 0) (space 0))
  724. (type byte-vector decoder))
  725. (loop
  726. for b = (decoder-get8 decoder) then (decoder-get8 decoder)
  727. for i of-type varint-length from 0 upto (decoder-avail decoder)
  728. with result of-type fixnum = 0
  729. do (incf result (the fixnum (ash (if (zerop i) b (1- b)) (* i 7))))
  730. until (< b 128)
  731. finally (return result)))
  732. ;;;
  733. ;;; encoded-uint-vector ;;;
  734. ;;;
  735. (template (<t>)
  736. (defun encode-uint-with-length (value length encoder)
  737. (declare (type <t> value)
  738. (type (integer 0 8) length)
  739. (type byte-vector encoder))
  740. (assert (>= (encoder-avail encoder) length))
  741. (loop repeat length
  742. do (encoder-put8 encoder (logand value 255))
  743. do (setf value (ash value -8)))
  744. (assert (zerop value))
  745. (values)))
  746. (defun get-uint-with-length (decoder length)
  747. (declare (type byte-vector decoder)
  748. (type (integer 0 8) length))
  749. (let ((value 0))
  750. (loop for i from (1- length) downto 0
  751. do (setf value (+ (ash value 8)
  752. (decoder-peek decoder i))))
  753. (decoder-skip decoder length)
  754. value))
  755. (defun get-type-byte-size (v-type)
  756. (values
  757. (typecase v-type
  758. (list (case (car v-type)
  759. ((array simple-array vector) (get-type-byte-size (cadr v-type)))
  760. ((unsigned-byte signed-byte) (ceiling (cadr v-type) 8))
  761. (integer (when (cadr v-type) (ceiling (log (cadr v-type) 2) 8)))
  762. (t nil)))
  763. (symbol (when (eql v-type 'fixnum) 8))
  764. (t nil))))
  765. (defun encode-uint-vector (v encoder)
  766. (declare (type vector v)
  767. (type byte-vector encoder))
  768. (let ((length (1+ (ash (find-msb-set
  769. (loop
  770. for value across v
  771. with bits = 1
  772. do (setf bits (logior bits value))
  773. finally (return bits)))
  774. -3))))
  775. (assert (<= 1 length 8))
  776. (encoder-ensure encoder (+ (* (length v) length)
  777. +varint-max64+))
  778. (encoder-put-varint64 encoder
  779. (logior (* (length v) (get-type-byte-size (type-of v)))
  780. (1- length)))
  781. (loop for value across v
  782. do (encode-uint-with-length value length encoder))
  783. encoder))
  784. (defstruct encoded-uint-vector
  785. (size 0 :type (unsigned-byte 32))
  786. (length 1 :type (integer 1 8))
  787. (bytes 8 :type (member 1 2 4 8))
  788. (data nil :type byte-vector))
  789. (defun encoded-uint-vector-init (decoder &optional (bytes 8))
  790. (declare (type byte-vector decoder)
  791. (type (member 1 2 4 8) bytes))
  792. (let ((size-len (decoder-get-varint64 decoder)))
  793. (when size-len
  794. (let* ((size (floor size-len bytes))
  795. (length (1+ (logand size-len (1- bytes))))
  796. (bytes-length (* size length))
  797. (data (make-sub-decoder decoder bytes-length)))
  798. (when data
  799. (make-encoded-uint-vector :size size :length length :bytes bytes
  800. :data data))))))
  801. (defun encoded-uint-vector-get (euv pos)
  802. (declare (type encoded-uint-vector euv)
  803. (type (unsigned-byte 32) pos))
  804. (with-slots (size data length) euv
  805. (assert (< pos size))
  806. (with-decoder-reset (data (* pos length))
  807. (get-uint-with-length data length))))
  808. (defun encoded-uint-vector-decode (euv)
  809. (declare (type encoded-uint-vector euv))
  810. (let* ((size (encoded-uint-vector-size euv))
  811. (result (make-array size :element-type '(unsigned-byte 64))))
  812. (dotimes (i size result)
  813. (setf (aref result i) (encoded-uint-vector-get euv i)))))
  814. ;; encoded-string-vector
  815. (defstruct string-vector-encoder
  816. (offsets (make-array 0 :element-type '(unsigned-byte 64) :adjustable t :fill-pointer 0)
  817. :type (vector (unsigned-byte 64)))
  818. (data (make-encoder 0) :type byte-vector))
  819. (defun string-vector-encoder-add-via-encoder (sve)
  820. (declare (type string-vector-encoder sve))
  821. (with-slots (offsets data) sve
  822. (vector-push-extend (length data) offsets)
  823. data))
  824. (defun string-vector-encoder-size (sve)
  825. (declare (type string-vector-encoder sve))
  826. (length (string-vector-encoder-offsets sve)))
  827. (defun string-vector-encoder-encode (sve encoder)
  828. (declare (type string-vector-encoder sve)
  829. (type byte-vector encoder))
  830. (with-slots (offsets data) sve
  831. (vector-push-extend (length data) offsets)
  832. (encode-uint-vector (make-span offsets 1) encoder)
  833. (encoder-ensure encoder (encoder-length data))
  834. (encoder-putn encoder data)
  835. encoder))
  836. (defstruct encoded-string-vector
  837. (offsets nil :type encoded-uint-vector)
  838. (data nil :type byte-vector))
  839. (defun encoded-string-vector-init (decoder)
  840. (declare (type byte-vector decoder))
  841. (let ((offsets (encoded-uint-vector-init decoder 8)))
  842. (when offsets
  843. (let* ((size (encoded-uint-vector-size offsets))
  844. (length (if (zerop size) 0 (encoded-uint-vector-get offsets (1- size))))
  845. (data (make-sub-decoder decoder length)))
  846. (when data
  847. (make-encoded-string-vector :offsets offsets :data data))))))
  848. (defun encoded-string-vector-size (esv)
  849. (declare (type encoded-string-vector esv))
  850. (encoded-uint-vector-size (encoded-string-vector-offsets esv)))
  851. (defun encoded-string-vector-get (esv index &optional fill-pointer)
  852. (declare (type encoded-string-vector esv)
  853. (type (unsigned-byte 32) index))
  854. (with-slots (offsets data) esv
  855. (let* ((start (if (zerop index) 0 (encoded-uint-vector-get offsets (1- index))))
  856. (length (- (encoded-uint-vector-get offsets index) start)))
  857. (with-decoder-reset (data start)
  858. (make-decoder length :displaced-to data :fill-pointer fill-pointer)))))
  859. (defun encoded-string-vector-decode (esv)
  860. (declare (type encoded-string-vector esv))
  861. (let* ((size (encoded-string-vector-size esv))
  862. (result (make-array size :element-type '(vector (unsigned-byte 8)))))
  863. (dotimes (i size result)
  864. (setf (aref result i) (encoded-string-vector-get esv i)))))
  865. ;; encoded-cell-id-vector
  866. (defstruct encoded-cell-id-vector
  867. (deltas nil :type encoded-uint-vector)
  868. (base 0 :type (unsigned-byte 64))
  869. (shift 0 :type (unsigned-byte 8)))
  870. (defun encoded-cell-id-vector-size (ecv)
  871. (declare (type encoded-cell-id-vector ecv))
  872. (with-slots (deltas) ecv
  873. (when deltas
  874. (encoded-uint-vector-size deltas))))
  875. (defun encoded-cell-id-vector-get (ecv i)
  876. (declare (type encoded-cell-id-vector ecv)
  877. (type (unsigned-byte 32) i))
  878. (with-slots (deltas base shift) ecv
  879. (+ base
  880. (ash (encoded-uint-vector-get deltas i) shift))))
  881. (defun encoded-cell-id-vector-init (decoder)
  882. (declare (type byte-vector decoder))
  883. (when (>= (decoder-avail decoder) 2)
  884. (let* ((code+len (decoder-get8 decoder))
  885. (shift-code (ash code+len -3)))
  886. (when (= shift-code 31)
  887. (setf shift-code (+ 29 (decoder-get8 decoder))))
  888. (let* ((base-len (logand code+len 7))
  889. (base (get-uint-with-length decoder base-len))
  890. shift)
  891. (when base
  892. (setf base (ash base (- 64 (* 8 (max 1 base-len)))))
  893. (if (>= shift-code 29)
  894. (setf shift (1+ (* 2 (- shift-code 29)))
  895. base (logior base (ash 1 (1- shift))))
  896. (setf shift (* 2 shift-code)))
  897. (make-encoded-cell-id-vector
  898. :deltas (encoded-uint-vector-init decoder 8)
  899. :base base
  900. :shift shift))))))
  901. (defun encoded-cell-id-vector-decode (eciv)
  902. (declare (type encoded-cell-id-vector eciv))
  903. (let* ((size (encoded-cell-id-vector-size eciv))
  904. (result (make-array size :element-type '(unsigned-byte 64))))
  905. (dotimes (i size result)
  906. (setf (aref result i) (encoded-cell-id-vector-get eciv i)))))
  907. (defun encode-cell-id-vector (v encoder)
  908. (declare (type (vector (unsigned-byte 64)) v)
  909. (type byte-vector encoder))
  910. (destructuring-bind (v-or v-and v-min v-max)
  911. (loop for cell-id across v
  912. with v-or = 0
  913. with v-and = -1
  914. do (setf v-or (logior v-or cell-id)
  915. v-and (logand v-and cell-id))
  916. maximizing cell-id into v-max
  917. minimizing cell-id into v-min
  918. finally (return (list v-or v-and v-min v-max)))
  919. (let ((e-base 0)
  920. (e-base-len 0)
  921. (e-shift 0)
  922. (e-max-delta-msb 0))
  923. (when (> v-or 0)
  924. (setf e-shift (min 56 (dpb 0 (byte 1 0) (find-lsb-set v-or))))
  925. (unless (zerop (logand v-and (ash 1 e-shift)))
  926. (incf e-shift))
  927. (let ((e-bytes (1- (ash 1 65))))
  928. (dotimes (len 8)
  929. (let* ((t-base (mask-field (byte (* 8 len) (- 64 (* 8 len))) v-min))
  930. (t-max-delta-msb (max 0 (1- (integer-length (ash (- v-max t-base)
  931. (- e-shift))))))
  932. (t-bytes (+ len (* (length v) (1+ (ash t-max-delta-msb -3))))))
  933. (when (< t-bytes e-bytes)
  934. (setf e-base t-base
  935. e-base-len len
  936. e-max-delta-msb t-max-delta-msb
  937. e-bytes t-bytes)))))
  938. (when (and (logbitp 0 e-shift)
  939. (not (= (logand e-max-delta-msb 7) 7)))
  940. (decf e-shift)))
  941. (assert (<= e-base-len 7))
  942. (assert (<= e-shift 56))
  943. (encoder-ensure encoder (+ 2 e-base-len))
  944. (let ((shift-code (ash e-shift -1)))
  945. (when (logbitp 0 e-shift)
  946. (setf shift-code (min 31 (+ shift-code 29))))
  947. (encoder-put8 encoder (logior (ash shift-code 3)
  948. e-base-len))
  949. (when (= shift-code 31)
  950. (encoder-put8 encoder (ash e-shift -1))))
  951. (encode-uint-with-length
  952. (ash e-base (- (- 64 (* 8 (max 1 e-base-len))))) e-base-len encoder)
  953. (let ((deltas (make-array (length v) :element-type '(unsigned-byte 64))))
  954. (loop for cell-id across v
  955. for i from 0
  956. do (setf (aref deltas i)
  957. (ash (- cell-id e-base) (- e-shift))))
  958. (encode-uint-vector deltas encoder)))))
  959. ;; encoded-point-vector
  960. (defstruct encoded-point-vector
  961. (size 0 :type (unsigned-byte 32))
  962. (blocks nil :type encoded-string-vector)
  963. (base 0 :type (unsigned-byte 64))
  964. (level 0 :type (unsigned-byte 8))
  965. (have-exceptions nil :type boolean))
  966. (defstruct cell-point
  967. (level 0 :type (unsigned-byte 8))
  968. (face 0 :type (unsigned-byte 8))
  969. (si 0 :type (unsigned-byte 32))
  970. (ti 0 :type (unsigned-byte 32)))
  971. (defparameter +block-shift+ 4)
  972. (defparameter +block-size+ (ash 1 +block-shift+))
  973. (defparameter +exception+ -1)
  974. (defstruct block-code
  975. (delta-bits 0 :type (signed-byte 32))
  976. (offset-bits 0 :type (signed-byte 32))
  977. (overlap-bits 0 :type (signed-byte 32)))
  978. (defun bit-mask (n)
  979. (declare (type (integer 0 64) n))
  980. (if (zerop n) 0
  981. (dpb -1 (byte n 0) 0)))
  982. (defun max-bits-for-level (level)
  983. (declare (type (integer 0 30) level))
  984. (+ (* 2 level) 3))
  985. (defun base-shift (level base-bits)
  986. (declare (type (integer 0 30) level)
  987. (type (integer 0 64) base-bits))
  988. (max 0 (- (max-bits-for-level level) base-bits)))
  989. (defun encode-point-vector-compact (points encoder)
  990. (declare (type (vector point) points)
  991. (type byte-vector encoder))
  992. (multiple-value-bind (level cell-points)
  993. (choose-best-level points)
  994. (when (< level 0)
  995. (return (encode-point-vector-fast points encoder)))
  996. (multiple-value-bind (values have-exceptions) (convert-cells-to-values cell-points level)
  997. (multiple-value-bind (base base-bits) (choose-base values level have-exceptions)
  998. (let ((num-blocks (ash (+ (length values) +block-size+ -1) (- +block-shift+)))
  999. (base-bytes (ash base-bits -3)))
  1000. (encoder-ensure encoder (+ 2 base-bytes))
  1001. (let ((last-block-count (- (length values) (* +block-size+ (1- num-blocks))))
  1002. (blocks (make-string-vector-encoder))
  1003. (exceptions (make-array 0 :element-type point :adjustable t)))
  1004. (assert (>= last-block-count 0))
  1005. (assert (<= last-block-count +block-size+))
  1006. (assert (<= base-bytes 7))
  1007. (assert (<= level 30))
  1008. (encoder-put8 (logior +encoded-point-vector-cell-ids+
  1009. (ash have-exceptions 3)
  1010. (ash (1- last-block-count) 4)))
  1011. (encoder-put8 (logior base-bytes
  1012. (ash level 3)))
  1013. (encode-uint-with-length (ash base (- (base-shift level base-bits))) base-bytes encoder)
  1014. (loop for i from 0 to (length values) step +block-size+
  1015. for block-size = (min +block-size+ (- (length values) i))
  1016. for code = (get-block-code values i block-size base have-exceptions)
  1017. do (let ((block (string-vector-encoder-add-via-encoder blocks))
  1018. (offset-bytes (ash (block-code-offset-bits code) -3))
  1019. (delta-nibbles (ash (block-code-delta-bits code) -2))
  1020. (overlap-nibbles (ash (block-code-overlap-bits code) -2)))
  1021. (encoder-ensure block (+ 1 offset-bytes (* delta-nibbles (ash +block-size+ -1))))
  1022. (assert (<= (- offset-bytes overlap-nibbles) 7))
  1023. (assert (<= overlap-nibbles 1))
  1024. (assert (<= delta-nibbles 16))
  1025. (encoder-put8 block (logior (- offset-bytes overlap-nibbles)
  1026. (ash overlap-nibbles 3)
  1027. (ash (1- delta-nibbles) 4)))
  1028. (let ((offset (1- (ash 1 65)))
  1029. (num-exceptions 0))
  1030. (dotimes (i block-size)
  1031. (let ((value (aref values (+ i j))))
  1032. (if (equalp value +exception+)
  1033. (incf num-exceptions)
  1034. (progn
  1035. (assert (>= value base))
  1036. (setf offset (min offset (- value base)))))))
  1037. (when (= num-exceptions block-size)
  1038. (setf offset))
  1039. (let ((offset-shift (- (block-code-delta-bits code)
  1040. (block-code-overlap-bits code))))
  1041. (setf offset (logand offset (lognot (bit-mask offset-shift))))
  1042. (assert (= (zerop offset) (zerop offset-bytes)))
  1043. (when (> offset 0)
  1044. (encode-uint-with-length (ash offset (- offset-shift)) offset-bytes block))
  1045. (let ((delta-bytes (ash (1+ delta-nibbles) -1)))
  1046. (setf (fill-pointer exceptions) 0)
  1047. (dotimes (j block-size)
  1048. (let ((delta 0)
  1049. (value (arerf values (+ i j))))
  1050. (if (equalp value +exception+)
  1051. (progn
  1052. (setf delta (length exceptions))
  1053. (vector-push-extend (aref points (+ i j)) exceptions))
  1054. (progn
  1055. (assert (>= value (+ offset base)))
  1056. (setf delta (- value (+ offset base)))
  1057. (when have-exceptions
  1058. (assert (<= delta (- (1- (ash 1 65)) +block-size+)))
  1059. (incf delta +block-size+))))
  1060. (assert (<= delta (bit-mask (block-code-delta-bits delta))))
  1061. (when (and (logbitp delta-nibbles 0)
  1062. (logbitp j 0))
  1063. ())
  1064. )))
  1065. ))))
  1066. ))))))