├── .gitignore ├── README.md ├── cheatsheet.pdf ├── cheatsheet.tex ├── fonts ├── .gitignore └── Makefile └── images └── taichi-lang-logo.eps /.gitignore: -------------------------------------------------------------------------------- 1 | # built cheatsheets and handouts 2 | # ---------------------------------- 3 | cheatsheet*.pdf 4 | 5 | # TeX auxiliary files 6 | # ---------------------------------- 7 | *.aux 8 | *.log 9 | *.out 10 | *.upa 11 | 12 | *.synctex(busy) 13 | *.synctex.gz 14 | 15 | # generated figures 16 | # ---------------------------------- 17 | fonts/**/*.[ot]tf 18 | 19 | # OS specific 20 | .DS_Store 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Taichi Language Cheatsheet 2 | 3 | ## Preview for current Taichi version (v1.4.0) 4 | 5 |
6 | 7 | ![cheatsheet](https://user-images.githubusercontent.com/23307174/212649338-c6c355bc-7f32-41aa-8647-4376e1163d12.png) 8 | 9 |
10 | 11 | ## How to build 12 | 13 | 1. Go to the `fonts/` folder, run 14 | ``` 15 | make 16 | ``` 17 | to download the font files. 18 | 19 | 2. Use `xelatex` to compile the tex source file: 20 | 21 | ```bash 22 | xelatex cheatsheet.tex 23 | ``` -------------------------------------------------------------------------------- /cheatsheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taichi-dev/cheatsheet/3204ded7ca46fafb268358afb6ae3dc3c9906f39/cheatsheet.pdf -------------------------------------------------------------------------------- /cheatsheet.tex: -------------------------------------------------------------------------------- 1 | % !TeX TS-program = xelatex 2 | 3 | \documentclass[10pt,landscape,a4paper]{article} 4 | 5 | \usepackage[framemethod=TikZ]{mdframed} 6 | \mdfsetup{skipabove=0pt,skipbelow=0pt} 7 | 8 | \usepackage{multicol} 9 | \usepackage{colortbl} 10 | \usepackage{array, multirow} 11 | 12 | \usepackage[right=2.5mm, left=2.5mm, top=2.5mm, bottom=2.5mm]{geometry} 13 | \usepackage{tikz} 14 | \usepackage{graphicx} 15 | \usepackage[percent]{overpic} 16 | \graphicspath{{./images}} 17 | \usepackage[export]{adjustbox} 18 | 19 | \usepackage[framemethod=TikZ]{mdframed} 20 | \mdfsetup{skipabove=0pt,skipbelow=0pt} 21 | \usepackage{menukeys} 22 | 23 | \usepackage{xcolor} 24 | \colorlet{citecolor}{black} 25 | \colorlet{linkcolor}{black} 26 | \colorlet{urlcolor}{black} 27 | \usepackage[ 28 | bookmarks=true, 29 | breaklinks=true, 30 | pdfborder={0 0 0}, 31 | citecolor=citecolor, 32 | linkcolor=linkcolor, 33 | urlcolor=urlcolor, 34 | colorlinks=true, 35 | linktocpage=false, 36 | hyperindex=true, 37 | colorlinks=true, 38 | linktocpage=false, 39 | linkbordercolor=white]{hyperref} 40 | 41 | \usepackage{fontspec} 42 | \usepackage[fixed]{fontawesome5} 43 | \usepackage[babel=true]{microtype} 44 | \defaultfontfeatures{Ligatures=TeX} 45 | \setmainfont{Source Serif Pro}[ 46 | Path = fonts/source-serif-pro/SourceSerifPro-, 47 | Extension = .otf, 48 | UprightFont = Regular, 49 | ItalicFont = LightIt, 50 | BoldFont = Semibold, 51 | BoldItalicFont = It ] 52 | \newfontfamily\RobotoSlab{Roboto Slab}[ 53 | Path = fonts/roboto-slab/RobotoSlab-, 54 | Extension = .ttf, 55 | UprightFont = Light, 56 | BoldFont = Regular ] 57 | 58 | \definecolor{secbgcol}{HTML}{2D3E40} 59 | \definecolor{highlight}{HTML}{36A8B2} 60 | \definecolor{secftcol}{HTML}{ffffff} 61 | \definecolor{doccol}{HTML}{4cbdc7} 62 | \definecolor{myblue}{HTML}{12558c} 63 | 64 | \usepackage{listings} 65 | \definecolor{lightblue}{RGB}{240,245,255} 66 | \definecolor{darkblue}{RGB}{40,40,85} 67 | \lstset{ 68 | language=Python, 69 | backgroundcolor = \color{lightblue}, 70 | basicstyle=\tiny\ttfamily, 71 | breaklines=true, 72 | showstringspaces=false, 73 | keywordstyle=\color{green!35!black}, 74 | commentstyle=\selectfont\color{gray}, 75 | numberstyle=\color{blue}, 76 | morekeywords={constexpr}, 77 | classoffset=1, 78 | morekeywords={dense}, 79 | keywordstyle=\color{myblue}, 80 | classoffset=2, 81 | morekeywords={ 82 | ti, Vector, Matrix, Struct, kernel, quant, float, 83 | root, hash, Index, Indices, field, vector, matrix, 84 | init, ndarray, fill, types, grouped, ndrange, dynamic, 85 | from_numpy, from_torch, to_numpy, to_torch, cpu, cast, 86 | struct, vec3, kernel, assume_in_range, block_dim, layout 87 | }, 88 | keywordstyle=\color{highlight}, 89 | classoffset=3, 90 | morekeywords={place, f32, f64, u8, u16, u32, u64, i8, i16, i32, i64, f16, float, int}, 91 | keywordstyle=\color{highlight}, 92 | % moredelim=**[is][\color{red}]{@}{@}, 93 | xleftmargin=0.1cm, 94 | xrightmargin=0.1cm, 95 | frame=tlbr, 96 | framesep=0.1cm, 97 | framerule=0pt, 98 | } 99 | \newcommand{\lcode}[1]{\lstinline[basicstyle=\scriptsize\ttfamily]{#1}} 100 | \setlength\parindent{0pt} 101 | \setlength{\tabcolsep}{2pt} 102 | \baselineskip=0pt 103 | \setlength\columnsep{0.5em} 104 | 105 | \newcommand{\offset}{\vspace*{0.4em}} 106 | 107 | \newcommand{\API}[1]{\tikz[baseline=(X.base)] 108 | \node [fill=doccol, rectangle, inner sep=2pt,rounded corners=1pt] (X) 109 | {\href{#1}{\color{white}{\tiny \sffamily \textbf{DOC}}}};} 110 | 111 | 112 | \newenvironment{myboxed}[1] 113 | {\begin{mdframed}[linecolor=black, 114 | backgroundcolor=white, 115 | outerlinewidth=0.25pt, 116 | %roundcorner=0.25em, 117 | innertopmargin=1ex, 118 | topline=true, 119 | rightline=true, 120 | leftline=true, 121 | bottomline=true, 122 | linecolor=black!0, 123 | frametitleaboveskip=0.5em, 124 | frametitlebelowskip=0.5em, 125 | innerbottommargin=.5\baselineskip, 126 | innerrightmargin=.5em, 127 | innerleftmargin=.5em, 128 | %userdefinedwidth=1\textwidth, 129 | % frametitle={\scshape \bfseries \sffamily #1}, 130 | frametitle={\footnotesize\color{secftcol}\RobotoSlab \bfseries \hspace*{0mm} #1}, 131 | % frametitlerule=true, 132 | %frametitlerulecolor=red, 133 | frametitlebackgroundcolor=secbgcol, 134 | frametitlerulewidth=2pt]} 135 | {\end{mdframed}} 136 | 137 | \begin{document} 138 | \thispagestyle{empty} 139 | % \footnotesize 140 | \scriptsize 141 | \begin{multicols*}{5} 142 | 143 | \begin{overpic}[width=\columnwidth,tics=6, trim=-10 10 0 0, clip]{taichi-lang-logo.eps} 144 | \end{overpic} 145 | \vspace{\fill} 146 | 147 | \begin{myboxed}{Installation} 148 | \begin{lstlisting} 149 | pip install -U taichi # Install / upgrade 150 | ti gallery # Run demo gallery 151 | ti example # More examples 152 | \end{lstlisting} 153 | \end{myboxed} 154 | 155 | \begin{myboxed}{Quick start \hfill \API{https://docs.taichi-lang.org/docs/hello_world}} 156 | \begin{lstlisting} 157 | import taichi as ti 158 | ti.init(arch=ti.cpu) 159 | # Or use another backend 160 | # [ti.cuda, ti.vulkan, ti.opengl, ti.metal] 161 | 162 | @ti.kernel 163 | # Args and return of a kernel must be type hinted 164 | def monte_carlo_pi(n: int) -> float: 165 | total = 0 166 | for i in range(n): # A parallel for loop 167 | x = ti.random() 168 | y = ti.random() 169 | if x*x + y*y < 1: 170 | total += 1 171 | 172 | return 4 * total / n 173 | 174 | print(monte_carlo_pi(100000)) 175 | \end{lstlisting} 176 | \end{myboxed} 177 | 178 | \begin{myboxed}{Kernels and functions \hfill \API{https://docs.taichi-lang.org/docs/kernel\_function}} 179 | \offset 180 | \verb|@ti.kernel|: Entrance for Taichi's JIT to take control. Must be called from Python scope. Require type hints for the arguments and the return 181 | value. Can return at most one scalar or vector or matrix. Top-level for loops are automatically parallelized. 182 | 183 | \quad 184 | 185 | \verb|@ti.func|: Must be called by kernels or other Taichi functions. Recommend type hints for arguments and return 186 | values. Can return multiple values of scalars, vectors, matrices, and structs.\\ 187 | 188 | 189 | \textbf{Top-level for loops are automatically parallelized} 190 | \begin{lstlisting} 191 | x = ti.field(dtype=int, shape=100) 192 | @ti.kernel 193 | def loop_field(): 194 | for i in range(100): # A parallelized loop 195 | for j in range(10): # Not parallelized 196 | ... 197 | for i in x: # Also a parallelized loop 198 | x[i] = i 199 | \end{lstlisting} 200 | 201 | \textbf{Serialize a top-level for loop} 202 | \begin{lstlisting} 203 | @ti.kernel 204 | def config_loop(): 205 | # Serialize the *next* for loop 206 | ti.loop_config(serialize=True) 207 | for i in range(100): # Serial 208 | ... 209 | for i in range(100): # Parallel 210 | ... 211 | \end{lstlisting} 212 | 213 | \textbf{Interact with NumPy/PyTorch \hfill \API{https://docs.taichi-lang.org/docs/external}} 214 | \begin{lstlisting} 215 | x = numpy/torch.arange(12).reshape(3, 4) 216 | @ti.kernel 217 | def fill_array(arr: ti.types.ndarray()): 218 | print(arr.shape, arr.dtype) 219 | for i, j in arr: 220 | arr[i, j] = i + j 221 | print(arr[i, j]) 222 | 223 | fill_array(x) # zero copy if on the same device 224 | \end{lstlisting} 225 | \end{myboxed} 226 | \vspace{\fill} 227 | 228 | \begin{myboxed}{Data types \hfill \API{https://docs.taichi-lang.org/docs/type}} 229 | \offset 230 | \textbf{Primitive types} (int, unsigned int and float in C) 231 | \vspace{-2em} 232 | \begin{multicols*}{3} 233 | \begin{lstlisting} 234 | i8 # char 235 | i16 # short 236 | i32 # int 237 | i64 # long 238 | \end{lstlisting} 239 | 240 | \begin{lstlisting} 241 | u8 # uchar 242 | u16 # ushort 243 | u32 # uint 244 | u64 # ulong 245 | \end{lstlisting} 246 | 247 | \begin{lstlisting} 248 | f16 # half 249 | f32 # float 250 | f64 # double 251 | \end{lstlisting} 252 | \end{multicols*} 253 | \vspace{-1.5em} 254 | \textbf{Vector and matrix types}\offset\\ 255 | \hspace*{1mm}\raisebox{0.5pt}{\tiny$\bullet$}~\textbf{Vector}: \lcode{ti.types.vector(dim, dtype)} 256 | \begin{lstlisting} 257 | vec3 = ti.types.vector(3, float) 258 | v = vec3(1, 2, 3) 259 | \end{lstlisting} 260 | \hspace*{1mm}\raisebox{0.5pt}{\tiny$\bullet$}~\textbf{Matrix}: \lcode{ti.types.matrix(n, m, dtype)} 261 | \begin{lstlisting} 262 | mat2 = ti.types.matrix(2, 2, float) 263 | m = mat2(1, 2, 3, 4) 264 | \end{lstlisting} 265 | \textbf{Struct types}: \lcode{ti.types.struct(**kwargs)} 266 | \begin{lstlisting} 267 | sphere = ti.types.struct( 268 | center=vec3, radius=float 269 | ) 270 | s = sphere(vec3(1, 2, 3), 1.0) 271 | \end{lstlisting} 272 | 273 | \textbf{Ndarray types}: 274 | \begin{lstlisting} 275 | ti.types.ndarray( 276 | dtype, # Data type of the array, 277 | ndim # Number of field dimentions 278 | ) 279 | \end{lstlisting} 280 | \begin{lstlisting} 281 | img2d_type = ti.types.ndarray(ndim=3) 282 | noise_img = np.random.random((400, 400, 3)) 283 | 284 | @ti.kernel 285 | def process(img: img2d_type): 286 | for I in ti.grouped(img): 287 | r, g, b = img[I] 288 | ... 289 | 290 | process(noise_img) 291 | \end{lstlisting} 292 | 293 | \textbf{Typecasting} 294 | \begin{lstlisting} 295 | x = ti.f32(1) 296 | y = ti.u8(x) # Equivalent to x.cast(ti.u8) 297 | z = float(y) 298 | 299 | u = vec3(0.5, 1.0, 1.5) 300 | v = u.cast(int) # Cast each entry to int 301 | \end{lstlisting} 302 | \end{myboxed} 303 | \vspace{\fill} 304 | 305 | \begin{myboxed}{Performance tuning \hfill \API{https://docs.taichi-lang.org/docs/performance}} 306 | \textbf{Kernel profiler} (CPU and CUDA only)\offset\\ 307 | Analyze the performance of Taichi kernels 308 | \begin{lstlisting} 309 | ti.init(arch=ti.cpu, kernel_profiler=True) 310 | @ti.kernel 311 | def some_kernel(): 312 | ... 313 | 314 | some_kernel() 315 | ti.profiler.print_kernel_profiler_info() 316 | \end{lstlisting} 317 | 318 | \textbf{Configure loops}\offset\\ 319 | Set arguments in \lcode{ti.loop_config()} to control the next for loop:\\ 320 | 1. Set the number of threads in a block on GPU:\\ 321 | \lstinline[basicstyle=\scriptsize\ttfamily]{block_dim=8}.\\ 322 | 2. Set the number of threads to use on CPU:\\ 323 | \lstinline[basicstyle=\scriptsize\ttfamily]{parallelize=8}.\\ 324 | 3. Whether to let the for loop execute serially:\\ 325 | \lstinline[basicstyle=\scriptsize\ttfamily]{serialize=True}. 326 | \end{myboxed} 327 | \vspace{\fill} 328 | 329 | 330 | \begin{myboxed}{Data containers \hfill \API{https://docs.taichi-lang.org/docs/field}} 331 | \offset 332 | \textbf{Scalar field}: \lstinline[basicstyle=\scriptsize\ttfamily]{field(dtype, …)} 333 | \begin{lstlisting} 334 | f = ti.field(int, shape=(3, 3, 3)) 335 | f[0, 1, 2] = 3 # Indexing with three integers 336 | x = ti.field(int, shape=()) # 0-D field 337 | x[None] = 1.0 # Use None to index 0-D field 338 | \end{lstlisting} 339 | \textbf{Vector field}: \lstinline[basicstyle=\scriptsize\ttfamily]{Vector.field(dim, dtype, …)} 340 | \begin{lstlisting} 341 | f = ti.Vector.field(3, float, (10, 10)) 342 | f[0, 1] = 1, 2, 3 # Each entry is a 3D vector 343 | \end{lstlisting} 344 | \textbf{Matrix field}: \lstinline[basicstyle=\scriptsize\ttfamily]{Matrix.field(n, m, dtype, …)} 345 | \begin{lstlisting} 346 | f = ti.Matrix.field(2, 2, float, shape=(10, 10)) 347 | f[0, 1] = mat2(1) # Each entry is a 2x2 matrix 348 | \end{lstlisting} 349 | \textbf{Struct field}: \lstinline[basicstyle=\scriptsize\ttfamily]{obj.field(shape)} 350 | \begin{lstlisting} 351 | sphere = ti.types.struct(center=vec3, radius=float) 352 | f = sphere.field(shape=100) 353 | \end{lstlisting} 354 | 355 | \textbf{Fill a field with a scalar} 356 | \begin{lstlisting} 357 | f.fill(1) 358 | \end{lstlisting} 359 | 360 | \textbf{Copy data from/to NumPy array/PyTorch tensor} 361 | \begin{lstlisting} 362 | f.from_numpy(arr) 363 | arr = f.to_numpy() 364 | f.from_torch(tensor) 365 | tensor = f.to_torch() 366 | \end{lstlisting} 367 | 368 | \textbf{Loop over a field in parallel} 369 | \begin{lstlisting} 370 | f = ti.field(int, shape=(100, 100, 100)) 371 | @ti.kernel 372 | def loop_field(): 373 | for i, j, k in ti.ndrange(100, 100, 100): 374 | f[i, j, k] = i + j + k 375 | # Equivalent to the above 376 | for i, j, k in f: 377 | f[i, j,k] = i + j + k 378 | # Equivalent to the above 379 | for I in ti.grouped(f): 380 | # I = [i, j, k] is a 3D int vector 381 | f[I] = I[0] + I[1] + I[2] 382 | \end{lstlisting} 383 | 384 | \textbf{Switch data layout between AOS and SOA\hfill\API{https://docs.taichi-lang.org/docs/layout}} 385 | \begin{lstlisting} 386 | u = ti.Vector.field( 387 | 3, float,shape=100, layout=ti.Layout.AOS) 388 | # array of structs [x0,y0,z0,x1,y1,z1,…] 389 | v = ti.Vector.field( 390 | 3, float,shape=100, layout=ti.Layout.SOA) 391 | # struct of arrays [x0,x1,…,y0,y1,…,z0,z1,…] 392 | \end{lstlisting} 393 | \end{myboxed} 394 | 395 | 396 | \begin{myboxed}{Math functions \hfill \API{https://docs.taichi-lang.org/docs/math_module}} 397 | %\vspace{-1.5em} 398 | \begin{minipage}[c]{0.43\linewidth} 399 | \begin{lstlisting} 400 | import taichi as ti 401 | 402 | ti.cos(x) 403 | ti.sin(x) 404 | ti.acos(x) 405 | ti.asin(x) 406 | ti.atan2(y, x) 407 | ti.exp(x) 408 | ti.log(x) 409 | ti.ceil(x, dtype) 410 | ti.floor(x, dtype) 411 | ti.round(x, dtype) 412 | ti.pow(x, a) 413 | ti.tan(x) 414 | ti.tanh(x) 415 | ti.sqrt(x) 416 | ti.max(x,y, …) 417 | ti.min(x,y, …) 418 | ti.random(dtype) 419 | \end{lstlisting} 420 | \end{minipage} 421 | \quad \begin{minipage}[c]{0.52\linewidth} 422 | \begin{lstlisting} 423 | import taichi.math as tm 424 | 425 | tm.cross(u,v) 426 | tm.dot(u,v) 427 | tm.fract(x) 428 | tm.mod(x,y) 429 | tm.normalize(v) 430 | tm.smoothstep(e0,e1,x) 431 | tm.mix(x,y,a) 432 | tm.step(edge,x) 433 | tm.degrees(x) 434 | tm.radians(x) 435 | tm.clamp(x,xmin,xmax) 436 | tm.length(v) 437 | tm.log2(x) 438 | tm.inverse(mat) 439 | tm.isnan(x) 440 | tm.isinf(x) 441 | tm.sign(x) 442 | \end{lstlisting} 443 | \end{minipage} 444 | 445 | \end{myboxed} 446 | \vspace{\fill} 447 | 448 | \begin{myboxed}{Operators \hfill \API{https://docs.taichi-lang.org/docs/operator}} 449 | \offset 450 | \textbf{Arithmetic operators} 451 | \begin{lstlisting} 452 | -x, x + y, x - y, x * y, 453 | x / y, # returns a floating point. 5 / 2 = 2.5 454 | x // y # floor of x / y. 5.0 / 2.0 = 2.0 455 | x % y # remainder of x / y. x & y can be floats 456 | x ** y # x to the power of y 457 | A @ B # matrix multiplication 458 | \end{lstlisting} 459 | 460 | \textbf{Comparison operators} 461 | \begin{lstlisting} 462 | x == y, x != y, x > y, x < y, x >= y, x <= y 463 | \end{lstlisting} 464 | 465 | \textbf{Logical operators} 466 | \begin{lstlisting} 467 | not, or, and 468 | \end{lstlisting} 469 | 470 | \textbf{Bitwise operators} 471 | \begin{lstlisting} 472 | ~x, x & y, x ^ y, x | y, x << y, x >> y 473 | \end{lstlisting} 474 | \end{myboxed} 475 | 476 | \begin{myboxed}{Data-oriented programming \hfill 477 | \API{https://docs.taichi-lang.org/docs/odop}} 478 | \offset 479 | \textbf{Data-oriented class} 480 | 481 | When you have data maintained in the Python scope (such as time or user input events) and you want the kernels to track their changes, you can organize them into a data-oriented class. 482 | \begin{lstlisting} 483 | @ti.data_oriented 484 | class TiArray: 485 | def __init__(self, n): 486 | self.x = ti.field(dtype=ti.i32, shape=n) 487 | 488 | @ti.kernel 489 | def inc(self): 490 | for i in self.x: 491 | self.x[i] += 1 492 | 493 | a = TiArray(32) 494 | a.inc() 495 | \end{lstlisting} 496 | 497 | \textbf{dataclass} 498 | 499 | A dataclass is a wrapper of \lcode{ti.types.struct}. You can define Taichi functions as its methods and call these methods in the Taichi scope. 500 | \begin{lstlisting} 501 | @ti.dataclass 502 | class Sphere: 503 | center: vec3 504 | radius: float 505 | @ti.func 506 | def area(self): # A Taichi function as method 507 | return 4 * pi * self.radius**2 508 | 509 | @ti.kernel 510 | def test(): 511 | sphere = Sphere(vec3(0), radius=1.0) 512 | print(sphere.area()) 513 | \end{lstlisting} 514 | \end{myboxed} 515 | \vspace{\fill} 516 | 517 | 518 | \begin{myboxed}{Global settings \hfill 519 | \API{https://docs.taichi-lang.org/docs/global\_settings}} 520 | \offset 521 | You can config Taichi by passing arguments to the \lcode{ti.init()} call: 522 | 523 | 1. Choose a backend: \lcode{arch=ti.cuda}.\\ 524 | 2. Enable debug mode: \lcode{debug=True}.\\ 525 | 3. Set floating precision: \lcode{default_fp=ti.f64}.\\ 526 | 4. Set integer precision: \lcode{default_ip=ti.i64}.\\ 527 | 5. Set random seed: \lcode{random_seed=0}.\\ 528 | 6. Disable offline cache: \lcode{offline_cache=False}.\\ 529 | 7. Set logging level: \lcode{log_level=ti.ERROR}.\\ 530 | 8. Set pre-allocated memory size for CUDA:\\ 531 | \lcode{device_memory_GB=1.3}.\\ 532 | 9. Turn on kernel performance profiler:\\ 533 | \lcode{kernel_profiler=True}. 534 | \end{myboxed} 535 | \vspace{\fill} 536 | 537 | \begin{myboxed}{Visualization} 538 | \offset 539 | \textbf{GUI system \hfill \API{https://docs.taichi-lang.org/docs/gui_system}} 540 | \begin{lstlisting} 541 | pixels = ti.Vector.field(3, float, (640, 480)) 542 | gui = ti.GUI('Window Title', res=(640, 480)) 543 | while gui.running: 544 | gui.set_image(pixels) 545 | gui.show() 546 | \end{lstlisting} 547 | 548 | \textbf{GGUI system \hfill \API{https://docs.taichi-lang.org/docs/ggui}} 549 | \begin{lstlisting} 550 | pixels = ti.Vector.field(3, float, (640, 480)) 551 | window = ti.ui.Window('Window Title', (640, 480)) 552 | canvas = window.get_canvas() 553 | while window.running: 554 | canvas.set_image(pixels) 555 | window.show() 556 | 557 | window.save_image(filename) # save image file 558 | \end{lstlisting} 559 | 560 | \textbf{2D canvas drawing API} 561 | \begin{lstlisting} 562 | canvas.set_background_color(color) 563 | canvas.triangles(vertices, color, indices, per_vertex_color) 564 | canvas.circles(vertices, radius, color, per_vertex_color) 565 | canvas.lines(vertices, width, indices, color, per_vertex_color) 566 | \end{lstlisting} 567 | 568 | \textbf{3D scene drawing API} 569 | \begin{lstlisting} 570 | scene.lines(vertices, width, indices, color, per_vertex_color) 571 | scene.mesh(vertices, indices, normals, color, per_vertex_color) 572 | scene.particles(vertices, radius, color, per_vertex_color) 573 | \end{lstlisting} 574 | \end{myboxed} 575 | \vspace{\fill} 576 | 577 | \begin{myboxed}{Debugging \lcode{ti.init(..., debug=True)} \hfill 578 | \API{https://docs.taichi-lang.org/docs/debugging}} 579 | \offset 580 | Debug mode can help check access out-of-bound errors and allow you to \lcode{assert} in Taichi kernels on CPU and CUDA backends. 581 | \begin{lstlisting} 582 | ti.init(arch=ti.cpu, debug=True) 583 | f = ti.field(int, shape=(5, 5)) 584 | print(f[7, 7]) # Only raise error in debug mode! 585 | \end{lstlisting} 586 | \textbf{Runtime assert in Taichi kernels and functions} 587 | \begin{lstlisting} 588 | x = ti.field(dtype=ti.f32, shape=128) 589 | @ti.kernel 590 | def foo(): 591 | for i in x: 592 | assert x[i] >= 0 593 | x[i] = ti.sqrt(x[i]) 594 | \end{lstlisting} 595 | \textbf{Runtime print in Taichi kernels and functions} 596 | \begin{lstlisting} 597 | @ti.kernel 598 | def inside_taichi_scope(x: float): 599 | # print is supported on cpu, cuda 600 | # and vulkan backends 601 | print('hello', x) # Cannot use f-string 602 | \end{lstlisting} 603 | \textbf{Compile-time static-print} 604 | \begin{lstlisting} 605 | x = ti.field(ti.f32, (2, 3)) 606 | @ti.kernel 607 | def print_field_attributes(): 608 | ti.static_print(x.shape, x.dtype) 609 | \end{lstlisting} 610 | 611 | \textbf{Compile-time static-assert} 612 | \begin{lstlisting} 613 | @ti.func # Assuming dst and src are fields 614 | def copy(dst: ti.template(), src: ti.template()): 615 | ti.static_assert(dst.shape == src.shape) 616 | for I in ti.grouped(src): 617 | dst[I] = src[I] 618 | \end{lstlisting} 619 | \end{myboxed} 620 | 621 | \end{multicols*} 622 | \end{document} -------------------------------------------------------------------------------- /fonts/.gitignore: -------------------------------------------------------------------------------- 1 | .uuid 2 | -------------------------------------------------------------------------------- /fonts/Makefile: -------------------------------------------------------------------------------- 1 | FONT_DIRS := eb-garamond roboto roboto-mono roboto-slab source-code-pro source-sans-pro source-serif-pro pacifico 2 | 3 | EB_GARAMOND_ZIP := https://bitbucket.org/georgd/eb-garamond/downloads/EBGaramond-0.016.zip 4 | ROBOTO_ZIP := https://github.com/googlefonts/roboto/releases/download/v2.138/roboto-unhinted.zip 5 | ROBOTO_MONO_ZIP := https://github.com/googlefonts/RobotoMono/archive/8f651634e746da6df6c2c0be73255721d24f2372.zip 6 | ROBOTO_SLAB_ZIP := https://github.com/googlefonts/robotoslab/archive/a65e6d00d8e3e7ee2fabef844e58fa12690384d2.zip 7 | SOURCE_CODE_PRO_ZIP := https://github.com/adobe-fonts/source-code-pro/releases/download/2.038R-ro%2F1.058R-it%2F1.018R-VAR/OTF-source-code-pro-2.038R-ro-1.058R-it.zip 8 | SOURCE_SANS_PRO_ZIP := https://github.com/adobe-fonts/source-sans/releases/download/2.045R-ro%2F1.095R-it/source-sans-pro-2.045R-ro-1.095R-it.zip 9 | SOURCE_SERIF_PRO_ZIP := https://github.com/adobe-fonts/source-serif/releases/download/3.001R/source-serif-pro-3.001R.zip 10 | PACIFICO_ZIP := https://fonts.google.com/download?family=Pacifico 11 | 12 | UNZIP_FLAGS := -x "__MACOSX/*" 13 | 14 | 15 | .PHONY: default 16 | default: all 17 | 18 | .PHONY: all 19 | all: sources 20 | mkdir -p $(FONT_DIRS) 21 | cd eb-garamond && unzip -j /tmp/eb-garamond.zip "EBGaramond-0.016/otf/*.otf" $(UNZIP_FLAGS) 22 | cd roboto && unzip -j /tmp/roboto.zip "*.ttf" $(UNZIP_FLAGS) 23 | cd roboto-mono && unzip -j /tmp/roboto-mono.zip "RobotoMono-8f651634e746da6df6c2c0be73255721d24f2372/fonts/ttf/*.ttf" $(UNZIP_FLAGS) 24 | cd roboto-slab && unzip -j /tmp/roboto-slab.zip "robotoslab-a65e6d00d8e3e7ee2fabef844e58fa12690384d2/fonts/static/*.ttf" $(UNZIP_FLAGS) 25 | cd source-code-pro && unzip -j /tmp/source-code-pro.zip "*.otf" $(UNZIP_FLAGS) 26 | cd source-sans-pro && unzip -j /tmp/source-sans-pro.zip "source-sans-pro-2.045R-ro-1.095R-it/OTF/*.otf" $(UNZIP_FLAGS) 27 | cd source-serif-pro && unzip -j /tmp/source-serif-pro.zip "source-serif-pro-3.001R/OTF/*.otf" $(UNZIP_FLAGS) 28 | cd pacifico && unzip -j /tmp/pacifico.zip "*.ttf" $(UNZIP_FLAGS) 29 | 30 | .PHONY: sources 31 | sources: 32 | wget $(EB_GARAMOND_ZIP) -O /tmp/eb-garamond.zip 33 | wget $(ROBOTO_ZIP) -O /tmp/roboto.zip 34 | wget $(ROBOTO_MONO_ZIP) -O /tmp/roboto-mono.zip 35 | wget $(ROBOTO_SLAB_ZIP) -O /tmp/roboto-slab.zip 36 | wget $(SOURCE_CODE_PRO_ZIP) -O /tmp/source-code-pro.zip 37 | wget $(SOURCE_SANS_PRO_ZIP) -O /tmp/source-sans-pro.zip 38 | wget $(SOURCE_SERIF_PRO_ZIP) -O /tmp/source-serif-pro.zip 39 | wget $(PACIFICO_ZIP) -O /tmp/pacifico.zip 40 | 41 | .PHONY: clean 42 | clean: 43 | - rm $(HOME)/.cache/matplotlib/fontlist* 44 | - rm -rf $(FONT_DIRS) 45 | -------------------------------------------------------------------------------- /images/taichi-lang-logo.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 2 | %%Creator: cairo 1.16.0 (https://cairographics.org) 3 | %%CreationDate: Mon Jan 16 17:34:43 2023 4 | %%Pages: 1 5 | %%DocumentData: Clean7Bit 6 | %%LanguageLevel: 2 7 | %%BoundingBox: 0 0 252 54 8 | %%EndComments 9 | %%BeginProlog 10 | 50 dict begin 11 | /q { gsave } bind def 12 | /Q { grestore } bind def 13 | /cm { 6 array astore concat } bind def 14 | /w { setlinewidth } bind def 15 | /J { setlinecap } bind def 16 | /j { setlinejoin } bind def 17 | /M { setmiterlimit } bind def 18 | /d { setdash } bind def 19 | /m { moveto } bind def 20 | /l { lineto } bind def 21 | /c { curveto } bind def 22 | /h { closepath } bind def 23 | /re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto 24 | 0 exch rlineto 0 rlineto closepath } bind def 25 | /S { stroke } bind def 26 | /f { fill } bind def 27 | /f* { eofill } bind def 28 | /n { newpath } bind def 29 | /W { clip } bind def 30 | /W* { eoclip } bind def 31 | /BT { } bind def 32 | /ET { } bind def 33 | /BDC { mark 3 1 roll /BDC pdfmark } bind def 34 | /EMC { mark /EMC pdfmark } bind def 35 | /cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def 36 | /Tj { show currentpoint cairo_store_point } bind def 37 | /TJ { 38 | { 39 | dup 40 | type /stringtype eq 41 | { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse 42 | } forall 43 | currentpoint cairo_store_point 44 | } bind def 45 | /cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore 46 | cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def 47 | /Tf { pop /cairo_font exch def /cairo_font_matrix where 48 | { pop cairo_selectfont } if } bind def 49 | /Td { matrix translate cairo_font_matrix matrix concatmatrix dup 50 | /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point 51 | /cairo_font where { pop cairo_selectfont } if } bind def 52 | /Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def 53 | cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def 54 | /g { setgray } bind def 55 | /rg { setrgbcolor } bind def 56 | /d1 { setcachedevice } bind def 57 | /cairo_data_source { 58 | CairoDataIndex CairoData length lt 59 | { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def } 60 | { () } ifelse 61 | } def 62 | /cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def 63 | /cairo_image { image cairo_flush_ascii85_file } def 64 | /cairo_imagemask { imagemask cairo_flush_ascii85_file } def 65 | %%EndProlog 66 | %%BeginSetup 67 | %%EndSetup 68 | %%Page: 1 1 69 | %%BeginPageSetup 70 | %%PageBoundingBox: 0 0 252 54 71 | %%EndPageSetup 72 | q 0 0 252 54 rectclip 73 | 1 0 0 -1 0 54 cm q 74 | 1 g 75 | 0.75 w 76 | 0 J 77 | 0 j 78 | [] 0.0 d 79 | 4 M q 1 0 0 1 0 0 cm 80 | 0.375 0.375 250.5 52.5 re S Q 81 | 0.176471 0.243137 0.25098 rg 82 | 20.625 16.648 m 20.625 18.75 19.5 20.477 17.625 21.676 c 15.977 22.801 83 | 14.25 23.773 12.676 24.977 c 10.125 26.926 8.398 29.477 8.398 32.773 c 8.324 84 | 36.301 9.977 39.074 13.051 41.023 c 13.125 41.023 13.199 41.102 13.199 85 | 41.102 c 13.5 41.25 13.727 41.477 13.5 41.773 c 13.426 41.852 13.273 41.926 86 | 13.199 41.926 c 13.125 41.926 12.977 41.926 12.898 41.926 c 11.25 41.551 87 | 9.676 40.949 8.176 40.125 c 3.523 37.352 0.75 33.227 0.148 27.898 c -0.301 88 | 24.227 0.523 20.551 2.625 17.398 c 4.648 14.324 7.801 12 11.398 10.875 89 | c 13.273 10.273 15.074 10.199 16.949 10.949 c 18.074 11.398 19.051 12.148 90 | 19.727 13.199 c 20.324 14.25 20.699 15.449 20.625 16.648 c h 91 | 20.625 16.648 m f 92 | 31.648 28.801 m 31.574 30.227 31.199 31.801 29.699 32.852 c 27.898 34.125 93 | 25.648 34.051 24.301 32.625 c 23.926 32.25 23.625 31.727 23.398 31.199 94 | c 23.25 30.75 23.176 30.148 23.25 29.625 c 23.324 29.102 23.551 28.574 23.852 95 | 28.051 c 24.148 27.602 24.602 27.148 25.051 26.926 c 25.273 26.852 25.426 96 | 26.699 25.648 26.625 c 27.227 25.727 27.898 24.375 27.977 22.648 c 27.977 97 | 22.5 28.051 22.273 28.125 22.125 c 28.273 22.199 28.5 22.273 28.648 22.352 98 | c 30.602 23.852 31.648 26.023 31.648 28.801 c h 99 | 31.648 28.801 m f 100 | 82.051 26.023 m 82.801 26.023 83.477 26.176 84.074 26.551 c 85.125 24.75 101 | l 84.074 24.148 82.875 23.852 81.676 23.852 c 77.773 23.852 75.375 26.625 102 | 75.375 30 c 75.375 33.375 77.699 36.148 81.676 36.148 c 82.875 36.148 84.074 103 | 35.852 85.125 35.25 c 84.074 33.449 l 83.477 33.824 82.727 33.977 82.051 104 | 33.977 c 79.648 33.977 78.148 32.176 78.148 30 c 78.227 27.898 79.648 26.023 105 | 82.051 26.023 c h 106 | 82.051 26.023 m f 107 | 71.625 17.398 m 71.176 17.398 70.727 17.551 70.426 17.926 c 70.125 18.227 108 | 69.898 18.676 69.898 19.125 c 69.898 19.352 69.977 19.574 70.051 19.801 109 | c 70.125 20.023 70.273 20.176 70.426 20.324 c 70.574 20.477 70.801 20.625 110 | 71.023 20.699 c 71.25 20.773 71.477 20.852 71.699 20.852 c 71.926 20.852 111 | 72.148 20.773 72.375 20.699 c 72.602 20.625 72.75 20.477 72.898 20.324 112 | c 73.051 20.176 73.199 19.949 73.273 19.801 c 73.352 19.574 73.426 19.352 113 | 73.426 19.125 c 73.426 18.898 73.352 18.676 73.273 18.449 c 73.199 18.227 114 | 73.051 18.074 72.898 17.926 c 72.75 17.773 72.523 17.625 72.301 17.551 115 | c 72.074 17.477 71.852 17.398 71.625 17.398 c h 116 | 71.625 17.398 m f 117 | 70.273 35.852 m 71.102 35.852 l 71.625 35.852 72.074 35.625 72.449 35.324 118 | c 72.824 34.949 72.977 34.5 72.977 34.051 c 72.977 24.301 l 70.273 24.301 119 | l h 120 | 70.273 35.852 m f 121 | 93.824 23.852 m 92.176 23.852 90.977 24.449 90.227 25.5 c 90.227 15.227 122 | l 87.523 16.801 l 87.523 35.926 l 90.227 35.926 l 90.227 29.023 l 90.227 123 | 26.699 91.801 25.801 93.301 25.801 c 94.648 25.801 95.176 26.699 95.176 124 | 28.273 c 95.176 35.926 l 96 35.926 l 96.523 35.926 96.977 35.699 97.352 125 | 35.398 c 97.727 35.023 97.875 34.574 97.875 34.125 c 97.875 28.727 l 97.875 126 | 25.875 96.602 23.852 93.824 23.852 c h 127 | 93.824 23.852 m f 128 | 115.574 17.324 m 112.875 18.898 l 112.875 35.926 l 115.574 35.926 l h 129 | 115.574 17.324 m f 130 | 48 35.852 m 50.699 35.852 l 50.699 19.949 l 48 20.398 l 48 34.199 l f 131 | 64.426 25.875 m 63.977 25.273 63.449 24.75 62.699 24.375 c 62.023 24 61.273 132 | 23.852 60.449 23.926 c 56.773 23.926 54.602 26.699 54.602 30.074 c 54.602 133 | 33.449 56.852 36.227 60.449 36.227 c 62.699 36.227 63.898 34.727 64.352 134 | 34.273 c 64.352 36 l 65.25 36 l 65.773 36 66.227 35.773 66.602 35.477 c 135 | 66.977 35.102 67.125 34.648 67.125 34.199 c 67.125 24.449 l 64.426 24.449 136 | l h 137 | 60.977 33.977 m 58.727 33.977 57.301 32.176 57.301 30 c 57.301 27.824 58.648 138 | 26.023 60.977 26.023 c 63.227 26.023 64.648 27.824 64.648 30 c 64.574 32.176 139 | 63.227 33.977 60.977 33.977 c h 140 | 60.977 33.977 m f 141 | 133.949 25.875 m 133.5 25.273 132.977 24.75 132.227 24.375 c 131.551 24 142 | 130.801 23.852 129.977 23.926 c 126.301 23.926 124.125 26.699 124.125 30.074 143 | c 124.125 33.449 126.375 36.227 129.977 36.227 c 132.227 36.227 133.426 144 | 34.727 133.875 34.273 c 133.875 36 l 134.699 36 l 135.227 36 135.676 35.773 145 | 136.051 35.477 c 136.426 35.102 136.574 34.648 136.574 34.199 c 136.574 146 | 24.449 l 133.875 24.449 l h 147 | 130.5 33.977 m 128.25 33.977 126.824 32.176 126.824 30 c 126.824 27.824 148 | 128.176 26.023 130.5 26.023 c 132.75 26.023 134.176 27.824 134.176 30 c 149 | 134.102 32.176 132.75 33.977 130.5 33.977 c h 150 | 130.5 33.977 m f 151 | 102.375 20.852 m 102.602 20.852 102.824 20.773 103.051 20.699 c 103.273 152 | 20.625 103.426 20.477 103.574 20.324 c 103.727 20.176 103.875 19.949 103.949 153 | 19.801 c 104.023 19.574 104.102 19.352 104.102 19.125 c 104.102 18.898 154 | 104.023 18.676 103.949 18.449 c 103.875 18.227 103.727 18.074 103.574 17.926 155 | c 103.426 17.773 103.199 17.625 102.977 17.551 c 102.75 17.477 102.523 156 | 17.398 102.301 17.398 c 101.852 17.398 101.398 17.551 101.102 17.926 c 100.801 157 | 18.227 100.574 18.676 100.574 19.125 c 100.574 19.352 100.648 19.574 100.727 158 | 19.801 c 100.801 20.023 100.949 20.176 101.102 20.324 c 101.25 20.477 101.477 159 | 20.625 101.699 20.699 c 101.926 20.773 102.148 20.852 102.375 20.852 c 160 | h 161 | 102.375 20.852 m f 162 | 101.023 35.852 m 101.852 35.852 l 102.375 35.852 102.824 35.625 103.199 163 | 35.324 c 103.574 34.949 103.727 34.5 103.727 34.051 c 103.727 24.301 l 164 | 101.023 24.301 l h 165 | 101.023 35.852 m f 166 | 146.176 23.852 m 144.523 23.852 143.324 24.449 142.574 25.5 c 142.574 24.227 167 | l 139.875 24.227 l 139.875 35.852 l 142.574 35.852 l 142.574 28.949 l 142.574 168 | 26.625 144.148 25.727 145.648 25.727 c 147 25.727 147.523 26.625 147.523 169 | 28.199 c 147.523 35.852 l 148.352 35.852 l 148.875 35.852 149.324 35.625 170 | 149.699 35.324 c 150.074 34.949 150.227 34.5 150.227 34.051 c 150.227 28.648 171 | l 150.227 25.875 148.949 23.852 146.176 23.852 c h 172 | 146.176 23.852 m f 173 | 43.574 18.824 m 55.199 18.824 l 55.199 19.352 l 55.199 19.801 55.051 20.176 174 | 54.676 20.551 c 54.375 20.852 53.926 21 53.477 21 c 43.648 21 l h 175 | 43.574 18.824 m f 176 | 115.574 33.523 m 122.699 33.523 l 122.699 34.051 l 122.699 34.5 122.477 177 | 34.949 122.176 35.324 c 121.801 35.625 121.352 35.852 120.898 35.852 c 178 | 115.574 35.852 l h 179 | 115.574 33.523 m f 180 | 162.977 25.875 m 162.523 25.273 162 24.75 161.25 24.375 c 160.5 24 159.824 181 | 23.852 159 23.926 c 155.324 23.926 153.148 26.699 153.148 30.074 c 153.148 182 | 33.449 155.398 36.227 159 36.227 c 161.25 36.227 162.449 34.727 162.898 183 | 34.273 c 162.898 36.824 l 162.898 39 161.477 39.898 159.824 39.898 c 158.477 184 | 39.898 157.125 39.227 156.227 38.699 c 155.25 40.5 l 156.301 41.102 158.023 185 | 41.926 160.199 41.926 c 163.199 41.926 165.824 40.574 165.824 36.75 c 165.824 186 | 24.227 l 163.125 24.227 l h 187 | 155.926 30 m 155.926 32.176 157.273 33.977 159.602 33.977 c 161.852 33.977 188 | 163.273 32.176 163.273 30 c 163.273 27.824 161.926 26.023 159.602 26.023 189 | c 157.273 26.023 155.926 27.824 155.926 30 c h 190 | 155.926 30 m f* 191 | 0.211765 0.658824 0.701961 rg 192 | 183.301 27.074 m 182.699 27.074 182.102 26.926 181.648 26.699 c 181.199 193 | 26.398 180.824 26.102 180.602 25.574 c 180.375 25.125 180.227 24.523 180.227 194 | 23.926 c 180.227 23.699 l 180.227 23.102 180.375 22.5 180.602 22.051 c 195 | 180.824 21.602 181.199 21.227 181.648 20.926 c 182.102 20.625 182.625 20.477 196 | 183.227 20.477 c 183.676 20.477 184.051 20.551 184.426 20.699 c 184.801 197 | 20.852 185.102 21 185.398 21.227 c 185.398 22.727 l 184.5 22.727 l 184.352 198 | 21.75 l 184.273 21.676 184.125 21.602 184.051 21.602 c 183.898 21.523 183.824 199 | 21.523 183.676 21.449 c 183.523 21.449 183.375 21.375 183.227 21.375 c 200 | 182.852 21.375 182.551 21.449 182.25 21.676 c 181.949 21.824 181.801 22.125 201 | 181.648 22.426 c 181.5 22.727 181.426 23.176 181.426 23.625 c 181.426 23.852 202 | l 181.426 24.301 181.5 24.75 181.648 25.051 c 181.801 25.426 182.023 25.648 203 | 182.324 25.801 c 182.625 25.949 182.926 26.102 183.301 26.102 c 183.523 204 | 26.102 183.676 26.102 183.898 26.023 c 184.051 25.949 184.273 25.949 184.426 205 | 25.875 c 184.574 24.977 l 185.477 24.977 l 185.477 26.477 l 185.25 26.625 206 | 184.949 26.773 184.574 26.852 c 184.125 27.074 183.75 27.074 183.301 27.074 207 | c h 208 | 186.523 27 m 186.523 26.25 l 187.199 26.102 l 187.199 21 l 186.523 20.852 209 | l 186.523 20.102 l 188.398 20.102 l 188.398 22.801 l 188.551 22.574 188.773 210 | 22.426 189 22.273 c 189.227 22.125 189.449 22.125 189.75 22.125 c 190.199 211 | 22.125 190.648 22.273 190.875 22.574 c 191.176 22.875 191.324 23.398 191.324 212 | 24 c 191.324 26.023 l 192 26.176 l 192 26.926 l 189.602 26.926 l 189.602 213 | 26.176 l 190.199 26.023 l 190.199 23.926 l 190.199 23.551 190.125 23.324 214 | 189.977 23.176 c 189.824 23.023 189.602 22.949 189.375 22.949 c 189.227 215 | 22.949 189 23.023 188.852 23.102 c 188.699 23.176 188.551 23.324 188.477 216 | 23.477 c 188.477 26.102 l 189.074 26.25 l 189.074 27 l h 217 | 195.074 27.074 m 194.625 27.074 194.25 27 193.875 26.773 c 193.574 26.551 218 | 193.273 26.324 193.125 25.949 c 192.977 25.574 192.824 25.199 192.824 24.75 219 | c 192.824 24.602 l 192.824 24.148 192.898 23.699 193.125 23.324 c 193.273 220 | 22.949 193.574 22.648 193.875 22.5 c 194.176 22.273 194.551 22.199 195 221 | 22.199 c 195.449 22.199 195.824 22.273 196.051 22.426 c 196.352 22.574 196.574 222 | 22.875 196.727 23.176 c 196.875 23.477 196.949 23.852 196.949 24.301 c 223 | 196.949 24.977 l 194.102 24.977 l 194.102 25.199 194.176 25.426 194.25 25.574 224 | c 194.324 25.727 194.477 25.875 194.625 26.023 c 194.773 26.102 195 26.176 225 | 195.227 26.176 c 195.449 26.176 195.676 26.176 195.898 26.102 c 196.125 226 | 26.023 196.273 25.949 196.5 25.801 c 196.875 26.551 l 196.648 26.699 196.426 227 | 26.852 196.125 26.926 c 195.824 27.074 195.449 27.074 195.074 27.074 c 228 | h 229 | 194.102 24.148 m 195.824 24.148 l 195.824 24 l 195.824 23.773 195.824 23.625 230 | 195.75 23.477 c 195.676 23.324 195.602 23.176 195.449 23.102 c 195.301 231 | 23.023 195.148 22.949 195 22.949 c 194.852 22.949 194.699 23.023 194.551 232 | 23.102 c 194.398 23.176 194.324 23.324 194.25 23.477 c 194.176 23.773 194.102 233 | 23.926 194.102 24.148 c h 234 | 199.648 27.074 m 199.199 27.074 198.824 26.926 198.523 26.699 c 198.227 235 | 26.477 198.148 26.102 198.148 25.648 c 198.148 25.352 198.227 25.125 198.375 236 | 24.898 c 198.523 24.676 198.75 24.523 199.125 24.375 c 199.426 24.227 199.801 237 | 24.148 200.324 24.148 c 201 24.148 l 201 23.773 l 201 23.551 200.926 23.324 238 | 200.773 23.176 c 200.625 23.023 200.398 22.949 200.176 22.949 c 200.023 239 | 22.949 199.875 22.949 199.801 23.023 c 199.648 23.023 199.574 23.102 199.5 240 | 23.176 c 199.426 23.773 l 198.523 23.773 l 198.523 22.574 l 198.75 22.426 241 | 199.051 22.273 199.352 22.199 c 199.648 22.125 199.949 22.051 200.324 22.051 242 | c 200.926 22.051 201.449 22.199 201.75 22.5 c 202.125 22.801 202.273 23.176 243 | 202.273 23.699 c 202.273 25.727 l 202.273 25.801 202.273 25.875 202.273 244 | 25.949 c 202.273 26.023 202.273 26.102 202.273 26.102 c 202.727 26.176 245 | l 202.727 26.926 l 201.227 26.926 l 201.227 26.852 201.148 26.773 201.148 246 | 26.625 c 201.148 26.551 201.074 26.398 201.074 26.324 c 200.926 26.551 247 | 200.699 26.699 200.551 26.773 c 200.25 27 199.949 27.074 199.648 27.074 248 | c h 249 | 199.949 26.176 m 200.176 26.176 200.324 26.102 200.551 26.023 c 200.699 250 | 25.949 200.852 25.801 200.926 25.648 c 200.926 24.898 l 200.25 24.898 l 251 | 199.949 24.898 199.727 24.977 199.574 25.125 c 199.426 25.273 199.352 25.426 252 | 199.352 25.648 c 199.352 25.801 199.426 25.949 199.5 26.023 c 199.648 26.176 253 | 199.801 26.176 199.949 26.176 c h 254 | 205.426 27.074 m 204.977 27.074 204.676 26.926 204.449 26.699 c 204.227 255 | 26.477 204.074 26.102 204.074 25.574 c 204.074 23.023 l 203.398 23.023 256 | l 203.398 22.199 l 204.074 22.199 l 204.074 21.074 l 205.273 21.074 l 205.273 257 | 22.199 l 206.176 22.199 l 206.176 23.023 l 205.273 23.023 l 205.273 25.574 258 | l 205.273 25.801 205.352 25.875 205.426 26.023 c 205.5 26.102 205.648 26.176 259 | 205.727 26.176 c 205.801 26.176 205.875 26.176 205.949 26.176 c 206.023 260 | 26.176 206.102 26.176 206.176 26.176 c 206.324 27 l 206.176 27.074 206.023 261 | 27.074 205.875 27.074 c 205.727 27.074 205.574 27.074 205.426 27.074 c 262 | h 263 | 212.102 27.074 m 211.727 27.074 211.426 27.074 211.125 27 c 210.824 26.926 264 | 210.523 26.852 210.227 26.699 c 210.227 25.426 l 211.051 25.426 l 211.199 265 | 26.102 l 211.352 26.176 211.426 26.176 211.574 26.25 c 211.727 26.324 211.875 266 | 26.324 212.023 26.324 c 212.324 26.324 212.551 26.25 212.699 26.176 c 212.852 267 | 26.102 212.926 25.949 212.926 25.801 c 212.926 25.648 212.852 25.5 212.699 268 | 25.426 c 212.551 25.352 212.324 25.199 211.949 25.125 c 211.352 24.977 269 | 210.977 24.824 210.676 24.602 c 210.375 24.375 210.301 24.074 210.301 23.699 270 | c 210.301 23.398 210.375 23.176 210.523 22.949 c 210.676 22.727 210.898 271 | 22.574 211.125 22.426 c 211.426 22.273 211.727 22.199 212.176 22.199 c 272 | 212.551 22.199 212.852 22.199 213.148 22.273 c 213.449 22.352 213.676 22.426 273 | 213.898 22.574 c 213.898 23.852 l 213 23.852 l 212.852 23.25 l 212.773 274 | 23.176 212.699 23.176 212.551 23.102 c 212.398 23.102 212.324 23.023 212.176 275 | 23.023 c 211.949 23.023 211.727 23.102 211.648 23.176 c 211.5 23.25 211.426 276 | 23.398 211.426 23.551 c 211.426 23.625 211.426 23.699 211.5 23.773 c 211.574 277 | 23.852 211.648 23.926 211.727 24 c 211.875 24.074 212.023 24.148 212.324 278 | 24.148 c 212.926 24.301 213.375 24.449 213.602 24.676 c 213.898 24.898 279 | 213.977 25.199 213.977 25.574 c 213.977 26.023 213.824 26.324 213.523 26.625 280 | c 213.227 26.926 212.773 27.074 212.102 27.074 c h 281 | 215.102 27 m 215.102 26.25 l 215.773 26.102 l 215.773 21 l 215.102 20.852 282 | l 215.102 20.102 l 216.977 20.102 l 216.977 22.801 l 217.125 22.574 217.352 283 | 22.426 217.574 22.273 c 217.801 22.125 218.023 22.125 218.324 22.125 c 284 | 218.773 22.125 219.227 22.273 219.449 22.574 c 219.75 22.875 219.898 23.398 285 | 219.898 24 c 219.898 26.023 l 220.5 26.176 l 220.5 26.926 l 218.102 26.926 286 | l 218.102 26.176 l 218.699 26.023 l 218.699 23.926 l 218.699 23.551 218.625 287 | 23.324 218.477 23.176 c 218.324 23.023 218.102 22.949 217.875 22.949 c 288 | 217.727 22.949 217.5 23.023 217.352 23.102 c 217.199 23.176 217.051 23.324 289 | 216.977 23.477 c 216.977 26.102 l 217.5 26.25 l 217.5 27 l h 290 | 223.648 27.074 m 223.199 27.074 222.824 27 222.449 26.773 c 222.148 26.551 291 | 221.852 26.324 221.699 25.949 c 221.551 25.574 221.398 25.199 221.398 24.75 292 | c 221.398 24.602 l 221.398 24.148 221.477 23.699 221.699 23.324 c 221.852 293 | 22.949 222.148 22.648 222.449 22.5 c 222.75 22.273 223.125 22.199 223.574 294 | 22.199 c 224.023 22.199 224.398 22.273 224.625 22.426 c 224.926 22.574 295 | 225.148 22.875 225.301 23.176 c 225.449 23.477 225.523 23.852 225.523 24.301 296 | c 225.523 24.977 l 222.676 24.977 l 222.676 25.199 222.75 25.426 222.824 297 | 25.574 c 222.898 25.727 223.051 25.875 223.199 26.023 c 223.352 26.102 298 | 223.574 26.176 223.801 26.176 c 224.023 26.176 224.25 26.176 224.477 26.102 299 | c 224.699 26.023 224.852 25.949 225.074 25.801 c 225.449 26.551 l 225.227 300 | 26.699 225 26.852 224.699 26.926 c 224.398 27.074 224.023 27.074 223.648 301 | 27.074 c h 302 | 222.676 24.148 m 224.398 24.148 l 224.398 24 l 224.398 23.773 224.398 23.625 303 | 224.324 23.477 c 224.25 23.324 224.176 23.176 224.023 23.102 c 223.875 304 | 23.023 223.727 22.949 223.574 22.949 c 223.426 22.949 223.273 23.023 223.125 305 | 23.102 c 222.977 23.176 222.898 23.324 222.824 23.477 c 222.75 23.773 222.676 306 | 23.926 222.676 24.148 c h 307 | 228.977 27.074 m 228.523 27.074 228.148 27 227.773 26.773 c 227.477 26.551 308 | 227.176 26.324 227.023 25.949 c 226.875 25.574 226.727 25.199 226.727 24.75 309 | c 226.727 24.602 l 226.727 24.148 226.801 23.699 227.023 23.324 c 227.176 310 | 22.949 227.477 22.648 227.773 22.5 c 228.074 22.273 228.449 22.199 228.898 311 | 22.199 c 229.352 22.199 229.727 22.273 229.949 22.426 c 230.25 22.574 230.477 312 | 22.875 230.625 23.176 c 230.773 23.477 230.852 23.852 230.852 24.301 c 313 | 230.852 24.977 l 228 24.977 l 228 25.199 228.074 25.426 228.148 25.574 c 314 | 228.227 25.727 228.375 25.875 228.523 26.023 c 228.676 26.102 228.898 26.176 315 | 229.125 26.176 c 229.352 26.176 229.574 26.176 229.801 26.102 c 230.023 316 | 26.023 230.176 25.949 230.398 25.801 c 230.773 26.551 l 230.551 26.699 317 | 230.324 26.852 230.023 26.926 c 229.648 27.074 229.352 27.074 228.977 27.074 318 | c h 319 | 228 24.148 m 229.727 24.148 l 229.727 24 l 229.727 23.773 229.727 23.625 320 | 229.648 23.477 c 229.574 23.324 229.5 23.176 229.352 23.102 c 229.199 23.023 321 | 229.051 22.949 228.898 22.949 c 228.75 22.949 228.602 23.023 228.449 23.102 322 | c 228.301 23.176 228.227 23.324 228.148 23.477 c 228 23.773 228 23.926 323 | 228 24.148 c h 324 | 233.773 27.074 m 233.324 27.074 233.023 26.926 232.801 26.699 c 232.574 325 | 26.477 232.426 26.102 232.426 25.574 c 232.426 23.023 l 231.75 23.023 l 326 | 231.75 22.199 l 232.426 22.199 l 232.426 21.074 l 233.625 21.074 l 233.625 327 | 22.199 l 234.523 22.199 l 234.523 23.023 l 233.625 23.023 l 233.625 25.574 328 | l 233.625 25.801 233.699 25.875 233.773 26.023 c 233.852 26.102 234 26.176 329 | 234.074 26.176 c 234.148 26.176 234.227 26.176 234.301 26.176 c 234.375 330 | 26.176 234.449 26.176 234.523 26.176 c 234.676 27 l 234.523 27.074 234.375 331 | 27.074 234.227 27.074 c 234.074 27.074 233.926 27.074 233.773 27.074 c 332 | h 333 | 233.773 27.074 m f 334 | 182.477 36 m 180.676 31.199 l 180.227 31.125 l 180.227 30.676 l 181.875 335 | 30.676 l 181.875 31.125 l 181.426 31.199 l 182.625 34.574 l 182.773 35.023 336 | l 182.926 34.574 l 184.125 31.199 l 183.602 31.125 l 183.602 30.676 l 185.25 337 | 30.676 l 185.25 31.125 l 184.801 31.199 l 183 36 l h 338 | 187.574 36.074 m 187.199 36.074 186.898 36 186.602 35.852 c 186.301 35.699 339 | 186.148 35.477 186 35.176 c 185.852 34.875 185.773 34.5 185.773 34.125 340 | c 185.773 33.977 l 185.773 33.602 185.852 33.301 186 33 c 186.148 32.699 341 | 186.375 32.477 186.602 32.324 c 186.824 32.176 187.125 32.102 187.426 32.102 342 | c 187.801 32.102 188.102 32.176 188.324 32.324 c 188.551 32.477 188.773 343 | 32.699 188.852 32.926 c 189 33.227 189 33.523 189 33.824 c 189 34.273 l 344 | 186.449 34.273 l 186.449 34.5 186.523 34.727 186.602 34.949 c 186.676 35.176 345 | 186.824 35.324 186.977 35.398 c 187.125 35.477 187.352 35.551 187.574 35.551 346 | c 187.801 35.551 188.023 35.551 188.25 35.477 c 188.398 35.398 188.625 347 | 35.324 188.699 35.176 c 189 35.625 l 188.852 35.773 188.699 35.852 188.398 348 | 36 c 188.25 36 187.949 36.074 187.574 36.074 c h 349 | 186.602 33.602 m 188.398 33.602 l 188.398 33.523 l 188.398 33.301 188.398 350 | 33.148 188.324 33 c 188.25 32.852 188.176 32.699 188.023 32.625 c 187.875 351 | 32.551 187.727 32.477 187.5 32.477 c 187.352 32.477 187.199 32.551 187.051 352 | 32.625 c 186.898 32.699 186.824 32.852 186.75 33 c 186.676 33.227 186.602 353 | 33.375 186.602 33.602 c h 354 | 190.125 36 m 190.125 35.551 l 190.727 35.477 l 190.727 32.625 l 190.125 355 | 32.551 l 190.125 32.102 l 191.398 32.102 l 191.477 32.625 l 191.477 32.699 356 | l 191.551 32.477 191.699 32.324 191.926 32.25 c 192.074 32.102 192.301 357 | 32.102 192.523 32.102 c 192.602 32.102 192.676 32.102 192.75 32.102 c 192.824 358 | 32.102 192.898 32.102 192.898 32.102 c 192.824 32.773 l 192.301 32.773 359 | l 192.074 32.773 191.926 32.773 191.852 32.926 c 191.699 33 191.625 33.148 360 | 191.551 33.301 c 191.551 35.551 l 192.148 35.625 l 192.148 36 l h 361 | 195.301 36.074 m 195 36.074 194.773 36.074 194.551 36 c 194.324 35.926 362 | 194.102 35.852 193.801 35.773 c 193.801 34.801 l 194.324 34.801 l 194.477 363 | 35.398 l 194.625 35.477 194.773 35.477 194.852 35.551 c 195 35.551 195.148 364 | 35.551 195.301 35.551 c 195.602 35.551 195.824 35.477 195.898 35.398 c 365 | 196.051 35.324 196.125 35.176 196.125 34.949 c 196.125 34.801 196.051 34.648 366 | 195.898 34.574 c 195.75 34.5 195.523 34.352 195.227 34.273 c 194.773 34.199 367 | 194.398 34.051 194.176 33.824 c 193.949 33.676 193.875 33.375 193.875 33.074 368 | c 193.875 32.852 193.949 32.699 194.023 32.477 c 194.176 32.324 194.324 369 | 32.176 194.551 32.102 c 194.773 32.023 195 31.949 195.301 31.949 c 195.602 370 | 31.949 195.824 31.949 196.051 32.023 c 196.273 32.102 196.426 32.176 196.574 371 | 32.324 c 196.574 33.227 l 196.051 33.227 l 195.898 32.699 l 195.824 32.625 372 | 195.75 32.625 195.602 32.551 c 195.449 32.551 195.375 32.477 195.227 32.477 373 | c 195 32.477 194.852 32.551 194.699 32.625 c 194.551 32.699 194.477 32.852 374 | 194.477 33 c 194.477 33.074 194.477 33.148 194.551 33.227 c 194.625 33.301 375 | 194.699 33.375 194.773 33.375 c 194.926 33.449 195.074 33.449 195.301 33.523 376 | c 195.824 33.676 196.199 33.824 196.426 34.051 c 196.648 34.273 196.727 377 | 34.5 196.727 34.801 c 196.727 35.102 196.574 35.398 196.352 35.625 c 196.273 378 | 36 195.824 36.074 195.301 36.074 c h 379 | 197.852 36 m 197.852 35.551 l 198.449 35.477 l 198.449 32.625 l 197.852 380 | 32.551 l 197.852 32.102 l 199.199 32.102 l 199.199 35.477 l 199.801 35.551 381 | l 199.801 36 l h 382 | 198.449 31.051 m 198.449 30.301 l 199.199 30.301 l 199.199 31.051 l h 383 | 202.5 36.074 m 202.125 36.074 201.824 36 201.523 35.852 c 201.227 35.699 384 | 201.074 35.477 200.926 35.102 c 200.773 34.801 200.699 34.426 200.699 34.051 385 | c 200.699 33.977 l 200.699 33.602 200.773 33.227 200.926 32.926 c 201.074 386 | 32.625 201.301 32.398 201.523 32.176 c 201.824 32.023 202.125 31.949 202.5 387 | 31.949 c 202.875 31.949 203.176 32.023 203.477 32.176 c 203.773 32.324 388 | 203.926 32.551 204.074 32.926 c 204.227 33.227 204.301 33.602 204.301 33.977 389 | c 204.301 34.051 l 204.301 34.426 204.227 34.801 204.074 35.102 c 203.926 390 | 35.398 203.699 35.625 203.477 35.773 c 203.176 36 202.875 36.074 202.5 391 | 36.074 c h 392 | 202.5 35.551 m 202.727 35.551 202.949 35.477 203.102 35.398 c 203.25 35.25 393 | 203.398 35.102 203.477 34.875 c 203.551 34.648 203.625 34.426 203.625 34.125 394 | c 203.625 34.051 l 203.625 33.75 203.551 33.523 203.477 33.301 c 203.398 395 | 33.074 203.25 32.926 203.102 32.773 c 202.949 32.625 202.727 32.551 202.5 396 | 32.551 c 202.273 32.551 202.051 32.625 201.898 32.773 c 201.75 32.926 201.602 397 | 33.074 201.523 33.301 c 201.449 33.523 201.375 33.75 201.375 34.051 c 201.375 398 | 34.125 l 201.375 34.426 201.449 34.648 201.523 34.875 c 201.602 35.102 399 | 201.75 35.25 201.898 35.398 c 202.125 35.477 202.273 35.551 202.5 35.551 400 | c h 401 | 205.273 36 m 205.273 35.551 l 205.875 35.477 l 205.875 32.625 l 205.273 402 | 32.551 l 205.273 32.102 l 206.551 32.102 l 206.625 32.699 l 206.773 32.477 403 | 206.926 32.324 207.148 32.25 c 207.375 32.102 207.602 32.102 207.824 32.102 404 | c 208.273 32.102 208.574 32.25 208.801 32.477 c 209.023 32.699 209.176 405 | 33.074 209.176 33.602 c 209.176 35.551 l 209.773 35.625 l 209.773 36 l 207.824 406 | 36 l 207.824 35.551 l 208.426 35.477 l 208.426 33.523 l 208.426 33.148 407 | 208.352 32.926 208.199 32.773 c 208.051 32.625 207.824 32.551 207.602 32.551 408 | c 207.375 32.551 207.227 32.625 207.074 32.699 c 206.926 32.773 206.773 409 | 32.926 206.699 33.074 c 206.699 35.398 l 207.301 35.477 l 207.301 36 l 410 | h 411 | 214.949 37.727 m 214.727 37.574 214.5 37.426 214.273 37.199 c 214.051 36.977 412 | 213.898 36.676 213.676 36.375 c 213.523 36.074 213.375 35.699 213.227 35.25 413 | c 213.148 34.801 213.074 34.352 213.074 33.898 c 213.074 33.449 213.148 414 | 33 213.227 32.551 c 213.301 32.102 213.449 31.727 213.676 31.426 c 213.824 415 | 31.125 214.051 30.824 214.273 30.602 c 214.5 30.375 214.727 30.227 214.949 416 | 30.074 c 215.102 30.523 l 214.949 30.676 214.801 30.824 214.648 31.051 417 | c 214.5 31.273 214.352 31.5 214.273 31.801 c 214.125 32.102 214.051 32.398 418 | 213.977 32.773 c 213.898 33.148 213.898 33.523 213.898 33.977 c 213.898 419 | 34.051 l 213.898 34.5 213.898 34.875 213.977 35.25 c 214.051 35.625 214.125 420 | 35.926 214.273 36.227 c 214.426 36.523 214.5 36.75 214.648 36.977 c 214.801 421 | 37.199 214.949 37.352 215.102 37.5 c h 422 | 216.074 36 m 216.074 35.551 l 216.898 35.477 l 216.898 31.5 l 216.074 31.5 423 | l 216.074 31.051 l 217.648 30.75 l 217.648 35.551 l 218.477 35.625 l 218.477 424 | 36 l h 425 | 219.602 37.125 m 219.227 36.824 l 219.375 36.676 219.449 36.449 219.449 426 | 36.301 c 219.523 36.148 219.523 35.926 219.523 35.699 c 219.523 35.176 427 | l 220.273 35.176 l 220.273 35.699 l 220.273 35.926 220.199 36.227 220.125 428 | 36.449 c 219.977 36.75 219.824 36.977 219.602 37.125 c h 429 | 223.125 36 m 223.125 35.551 l 223.727 35.477 l 223.727 34.801 l 221.324 430 | 34.801 l 221.324 34.426 l 223.648 30.75 l 224.398 30.75 l 224.398 34.273 431 | l 225.148 34.273 l 225.148 34.875 l 224.398 34.875 l 224.398 35.551 l 225 432 | 35.625 l 225 36 l h 433 | 222.074 34.199 m 223.727 34.199 l 223.727 31.727 l 223.648 31.949 l h 434 | 226.352 37.125 m 225.977 36.824 l 226.125 36.676 226.199 36.449 226.199 435 | 36.301 c 226.273 36.148 226.273 35.926 226.273 35.699 c 226.273 35.176 436 | l 227.023 35.176 l 227.023 35.699 l 227.023 35.926 226.949 36.227 226.875 437 | 36.449 c 226.727 36.75 226.574 36.977 226.352 37.125 c h 438 | 229.949 36.074 m 229.426 36.074 229.051 35.926 228.676 35.551 c 228.375 439 | 35.176 228.227 34.648 228.227 33.977 c 228.227 32.699 l 228.227 32.023 440 | 228.375 31.5 228.676 31.125 c 228.977 30.75 229.426 30.602 229.949 30.602 441 | c 230.477 30.602 230.926 30.75 231.227 31.125 c 231.523 31.5 231.676 32.023 442 | 231.676 32.699 c 231.676 33.977 l 231.676 34.648 231.523 35.176 231.227 443 | 35.551 c 230.852 35.926 230.477 36.074 229.949 36.074 c h 444 | 229.949 35.551 m 230.25 35.551 230.477 35.398 230.699 35.176 c 230.852 445 | 34.949 230.926 34.574 230.926 34.125 c 230.926 32.551 l 230.926 32.102 230.852 446 | 31.727 230.699 31.5 c 230.551 31.273 230.324 31.125 229.949 31.125 c 229.648 447 | 31.125 229.426 31.273 229.199 31.5 c 229.051 31.727 228.977 32.102 228.977 448 | 32.551 c 228.977 34.125 l 228.977 34.574 229.051 34.949 229.199 35.176 449 | c 229.426 35.398 229.648 35.551 229.949 35.551 c h 450 | 232.727 37.727 m 232.574 37.352 l 232.727 37.199 232.875 37.051 233.023 451 | 36.824 c 233.176 36.602 233.324 36.375 233.398 36.074 c 233.551 35.773 452 | 233.625 35.477 233.699 35.102 c 233.773 34.727 233.773 34.352 233.773 33.898 453 | c 233.773 33.824 l 233.773 33.375 233.773 33 233.699 32.625 c 233.625 32.25 454 | 233.551 31.949 233.398 31.648 c 233.25 31.352 233.176 31.125 233.023 30.898 455 | c 232.875 30.676 232.727 30.523 232.574 30.375 c 232.727 30 l 232.949 30.074 456 | 233.176 30.301 233.398 30.523 c 233.625 30.75 233.773 31.051 234 31.352 457 | c 234.148 31.648 234.301 32.023 234.449 32.477 c 234.523 32.926 234.602 458 | 33.375 234.602 33.824 c 234.602 34.273 234.523 34.727 234.449 35.176 c 459 | 234.375 35.625 234.227 35.926 234 36.301 c 233.852 36.602 233.625 36.898 460 | 233.398 37.125 c 233.176 37.426 232.949 37.574 232.727 37.727 c h 461 | 232.727 37.727 m f 462 | Q Q 463 | showpage 464 | %%Trailer 465 | end 466 | %%EOF 467 | --------------------------------------------------------------------------------