├── .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 | 
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 |
--------------------------------------------------------------------------------