<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8812827877261189081</id><updated>2026-05-11T05:19:04.314-07:00</updated><category term="Garbage collection"/><category term="Apache Harmony"/><category term="JVM"/><category term="Programming"/><category term="Threading"/><category term="Google Android"/><category term="Asynchronous"/><category term="Multi-core"/><category term="Deep learning"/><category term="Managed Runtime"/><category term="Neural network"/><title type='text'>Xiao-Feng Li</title><subtitle type='html'>On runtime technology and programming languages</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default?start-index=26&amp;max-results=25'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>70</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-5301972049290168258</id><published>2025-08-24T20:04:00.000-07:00</published><updated>2025-08-24T20:04:26.522-07:00</updated><title type='text'>Architecture Design of the Runtime Engine of Google A2A (Agent to Agent)</title><content type='html'>&lt;p&gt;The Google Agent-to-Agent (A2A) protocol enables collaboration between heterogeneous AI agents by exposing any server-side agent as a standardized interface to its clients. The A2A runtime engine is designed as a proxy agent: it does not need to know the internal implementation of the actual agent but instead provides a uniform way for clients to interact with it.&lt;/p&gt;&lt;p&gt;This proxy pattern is the foundation of the A2A server’s architecture:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;It proxies responses from the underlying agent to the client.&lt;/li&gt;&lt;li&gt;It manages execution state and message history in a consistent manner.&lt;/li&gt;&lt;li&gt;It supports multiple communication modes (streaming, non-streaming, notifications).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The detailed analysis is given in my presentation in&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://xiaofeng.info/presentations/Runtime-Engine-of-Google-A2A.pdf&quot; target=&quot;_blank&quot;&gt;Architecture Design of the Runtime Engine of Google A2A&lt;/a&gt;&amp;nbsp;[1].&lt;/p&gt;&lt;p&gt;[1] https://xiaofeng.info/presentations/Runtime-Engine-of-Google-A2A.pdf&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/5301972049290168258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/5301972049290168258' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5301972049290168258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5301972049290168258'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2025/08/runtime-engine-of-Google-A2A.html' title='Architecture Design of the Runtime Engine of Google A2A (Agent to Agent)'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-5126493049279128968</id><published>2020-05-26T21:09:00.000-07:00</published><updated>2020-05-26T21:09:27.508-07:00</updated><title type='text'>Survey and discussions on trusted execution environment (TEE)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I wrote a &lt;a href=&quot;http://home.apache.org/~xli/presentations/tee.pdf&quot;&gt;survey on current implementations of trusted execution environment&lt;/a&gt; (TEE), and discussed the properties of different technologies and proposed two newer approaches.&lt;br /&gt;
&lt;br /&gt;
In the survey, I categorized the current technologies into the following groups:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;TPM (trusted computing module) based solution, such as Intel TXT, AMD SKINIT&lt;/li&gt;
&lt;li&gt;Coprocessor based solution, such as Intel ME, Apple secure enclave&lt;/li&gt;
&lt;li&gt;Privileged mode based solution, such as Intel SMM, ARM TrustZone&lt;/li&gt;
&lt;li&gt;Virtualization based solution, such as Microsoft VSM, seL4/NOVA&lt;/li&gt;
&lt;li&gt;Total memory encryption based solution, such as AMD SEV, Intel MKTME&lt;/li&gt;
&lt;li&gt;User secure enclave (regional memory encryption) based solution, such as Intel SGX, RISC-V Sanctum&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
To build a successful TEE, isolation is the fundamental approach. If isolation is unachievable, a component has to be introduced for authorization - this is the ultimate security solution, like in the web. Encryption is only a rescue when the end points do not trust each other, or the data path can be intercepted/snooped, which is known as authentication.&lt;br /&gt;
&lt;br /&gt;
A hardware-based solution for authorization can be plausible in the end. Before that, one app per encrypted VM or one secure enclave per app is the most close solution.&lt;br /&gt;
&lt;br /&gt;
One step back, unless an all-path encryption is available, all of the solutions for TEE need a kernel component in TCB, be it in the enclave, or hypervisor, or whatever.&lt;br /&gt;
&lt;br /&gt;
For the kernel, a capability-based microkernel or the like is always desirable for the purpose of security, and a verified kernel can improve the security.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/5126493049279128968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/5126493049279128968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5126493049279128968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5126493049279128968'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2020/05/survey-and-discussions-on-trusted.html' title='Survey and discussions on trusted execution environment (TEE)'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-4382459193030663421</id><published>2020-05-26T19:01:00.000-07:00</published><updated>2020-05-27T12:21:29.785-07:00</updated><title type='text'>Design of next generation OS</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I put together my thoughts on the &lt;a href=&quot;http://home.apache.org/~xli/presentations/future_OS_design.pdf&quot;&gt;design of next generation OS&lt;/a&gt;&amp;nbsp;towards a connected world - in sense of connected devices, connected services and connected people. There are already lots of good progresses in the right direction.&lt;br /&gt;
&lt;br /&gt;
To facilitate the connected world, OS should be designed with mindset in the following three dimensions:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;From individual-oriented to group-oriented, with a distributed and connected framework;&lt;/li&gt;
&lt;li&gt;From application-oriented to service-oriented, with the full support of service-oriented API;&lt;/li&gt;
&lt;li&gt;From traditional I/O-oriented UI to context-aware UI, with natural and intuitive interactions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
These are not just thoughts, but actually the OS trends seen in the reality, including my personal project experiences.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/4382459193030663421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/4382459193030663421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/4382459193030663421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/4382459193030663421'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2020/05/design-of-next-generation-os.html' title='Design of next generation OS'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-7342130302860981765</id><published>2019-10-22T18:26:00.002-07:00</published><updated>2019-10-30T14:30:16.178-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Asynchronous"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Threading"/><title type='text'>Discussions on Asynchronous Programming APIs</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
I put together a slide deck &lt;a href=&quot;http://people.apache.org/~xli/presentations/async_programming_APIs.pdf&quot;&gt;discussing the Asynchronous Programming APIs&lt;/a&gt;, focusing on the rationalities of the APIs design and their evolutions from single async op blocking syscall through resumable function based synchronous programming,&amp;nbsp; including select, epoll, kqueue, callback, promise, await, etc. Here is the content in the summary slide:&lt;br /&gt;
&lt;br /&gt;
Asynchronous programming API design aims to improve both productivity and scalability:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Productivity is achieved largely through “synchronous” programming constructs;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Scalability is achieved by overlapping async operations with processor execution;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;The key of the API design is to allow a single thread to issue multiple outstanding async operations so that any ready result can enable certain code execution, hence minimal processor idle time;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;This enables pure user level solution that is platform agnostic, and then thread pool is largely an orthogonal multiplier;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;The APIs have evolved from synchronous &lt;b&gt;system call&lt;/b&gt; to synchronous &lt;b&gt;user call&lt;/b&gt; while maintaining all the async benefits;&lt;/li&gt;
&lt;li&gt;Two levels of scheduling: user coroutines and kernel threads, exploiting the best of green threads and async APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/7342130302860981765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/7342130302860981765' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/7342130302860981765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/7342130302860981765'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2019/10/discussions-on-asynchronous-programming.html' title='Discussions on Asynchronous Programming APIs'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-2240532249978288898</id><published>2019-10-09T20:57:00.000-07:00</published><updated>2019-10-30T14:27:26.048-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Asynchronous"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Threading"/><title type='text'>Asynchronous callback, and its relation with event-driven and coroutines</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div class=&quot;post-text&quot; itemprop=&quot;text&quot;&gt;
(This is my answer to a question in stackoverflow.com regarding the general implementation techniques of asynchronous callback.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;TL;DR: To implement asynchronous callback is basically to allow the control flow to proceed without blocking for the callback. Before the callback function is finally called, the control flow is free to execute anything that has no dependence on the callback&#39;s result, e.g., the caller can proceed as if the callback function has returned (without using its result), or the caller may yield its control to other functions.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Since the question is for general implementation rather than a 
specific language, my answer tries to be as general as to cover the 
implementation commonalities.&lt;br /&gt;
&lt;br /&gt;
Different languages have different implementations for asynchronous callbacks, but the principles are the same. &lt;b&gt;The key is to decouple the control flow from the code executed&lt;/b&gt;.
 They correspond to the execution context (like a thread of control with
 a runtime stack) and the executed task. Traditionally the control flow of the program forms a linear (or contiguous) call chain. (Signal handler is an exception, but signal emission is already asynchronous.) With asynchronous 
callbacks, they are decoupled.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. The principles&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
To decouple the control flow from the code, it is helpful to think of
 every asynchronous callback as a conditional task. When the code 
registers an asynchronous callback, it virtually installs the task&#39;s 
condition in the system. The callback function is then invoked when the 
condition is satisfied. To support this, a condition monitoring 
mechanism and a task scheduler are needed, so that, &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The programmer does not need to track the callback&#39;s condition;&lt;br /&gt; &lt;/li&gt;
&lt;li&gt;Before the condition is satisfied, the program may proceed to
execute other code that does not depend on the callback&#39;s result, without blocking on the condition;&lt;/li&gt;
&lt;li&gt;Once the condition is satisfied, the callback is guaranteed to
execute. The programmer does not need to schedule its execution;&lt;/li&gt;
&lt;li&gt;After the callback is executed, its result is accessible to the caller.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;2. Implementation for Portability&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
For example, if your code needs to process the data from a network 
connection, you do not need to write the code checking the connection 
state. You only registers a callback that will be invoked once the data 
is available for processing. The dirty work of connection checking is 
left to the language implementation, which is known to be tricky 
especially when we talk about scalability and portability.&lt;br /&gt;
&lt;br /&gt;
The language 
implementation may employ asynchronous io, nonblocking io or a thread pool or whatever 
techniques to check the network state for you, and once the data is 
ready, the callback function is then scheduled to execute. Here the 
control flow of your code looks like directly going from the callback 
registration to the callback execution, because the language hides the 
intermediate steps. This is the portability story.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Implementation for Scalability&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
To hide the dirty work is only part of the whole story. The other 
part is that, your code itself does not need to block waiting for the 
task condition. It does not make sense to wait for one connection&#39;s data
 when you have lots of network connections simultaneously and some of 
them may already have data ready. The control flow of your code can 
simply register the callback, and then moves on with other tasks (e.g., 
the callbacks whose conditions have been satisfied), knowing that the 
registered callbacks will be executed anyway when their data are 
available.&lt;br /&gt;
&lt;br /&gt;
If to satisfy the callback&#39;s condition does not involve much 
of the CPU (e.g., waiting for a timer, or waiting for the data from 
network), and the callback function itself is light-weighted, then 
single CPU (or single thread) is able to process
 lots of callbacks concurrently, such as incoming network requests 
processing. Here the control flow may look like jumping from one 
callback to another. This is the scalability story.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4. Implementation for Parallelism&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes, the callbacks are not pending for non-blocking IO 
condition, but for blocking operations such as page fault; or the 
callbacks do not rely on any condition, but are pure computation logics.
 In this case, asynchronous callback does not save you the CPU waiting 
time (because there is no idle waiting). But since asynchronous callback
 implies that the callback function can be executed in parallel either with the
 caller task or other callbacks (subject to certain data sharing and 
synchronization constraints), the language implementation can dispatch 
the callback tasks to different threads, achieving the benefits of 
parallelism, if the platform has more than one hardware thread context. 
It still improves scalability.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5. Implementation for Productivity&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The productivity with asynchronous callback may not be very positive 
when the code need to deal with chained callbacks, i.e., when callbacks 
register other callbacks in recursive way, known as callback hell. There
 are ways to rescue.&lt;br /&gt;
&lt;br /&gt;
The semantics of an asynchronous callback can be explored so as to 
substitute the hopeless nested callbacks with other language constructs.
 Basically there can be two different views of callbacks:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;From data flow point of view: asynchronous callback = event + task. To register a callback essentially 
generates an event that will emit when the task condition is satisfied. In this view, the 
chained callbacks are just events whose processing triggers other event emission. It can be 
naturally implemented in &lt;b&gt;event-driven&lt;/b&gt; programming, where the task 
execution is driven by events. Promise and Observable may also be 
regarded as event-driven concept. When multiple events are ready concurrently, their 
associated tasks can be executed concurrently as well.&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;From control flow point of view: to register a callback yields 
the control to other code, and the callback execution just resumes the 
control flow once its condition is satisfied. In this view, chained 
asynchronous callbacks are just resumable functions. Multiple callbacks can be written as one after another in 
traditional &quot;synchronous&quot; way, with yield/await operation in between. It becomes &lt;b&gt;coroutine&lt;/b&gt;.&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
I haven&#39;t discussed the implementation of data passing between the 
asynchronous callback and its caller, but that is usually not difficult 
if using shared memory where caller and callback can share&amp;nbsp; data. Actually Golang&#39;s 
channel can also be considered in line of yield/await but with its focus
 on data passing.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/2240532249978288898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/2240532249978288898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/2240532249978288898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/2240532249978288898'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2019/10/asynchronous-call-event-driven-and.html' title='Asynchronous callback, and its relation with event-driven and coroutines'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-284659907498930426</id><published>2019-10-04T11:43:00.004-07:00</published><updated>2019-10-12T11:33:48.258-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Threading"/><title type='text'>Differences between data race and race condition</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;(This is my answer to the question in stackoverflow.com:&lt;/span&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt; &quot;Are “data races” and “race condition” actually the same thing in context of concurrent programming&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;?&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;TL;DR: The distinction between data race and race condition depends on the nature of problem formulation, and where to draw the boundary between undefined behavior and well-defined but indeterminate behavior. The current distinction is conventional and best reflects the interface between processor architect and programming language. &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Semantics&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Data race specifically refers to the non-synchronized conflicting &quot;memory accesses&quot; (or actions, or operations) to the same memory location. If there is no conflict in the memory accesses, while there is still indeterminate behavior caused by operation ordering, that is a race condition. (If there is no memory shared by different threads that may run on multiple cores, the problem discussed here does not exist.)&lt;br /&gt;
&lt;br /&gt;
Note &quot;memory accesses&quot; here have specific meaning. They refer to the &quot;pure&quot; memory load or store actions, without any additional semantics applied. For example, a memory store from one thread does not (necessarily) know how long it takes for the data to be written into the memory, and finally propagates to another thread. For another example, a memory store to one location before another store to another location by the same thread does not (necessarily) guarantee the first data written in the memory be ahead of the second. As a result, the order of those pure memory accesses are not (necessarily) able to be &quot;&lt;b&gt;reasoned&lt;/b&gt;&quot; by program developers, and anything could happen, unless otherwise well defined.&lt;br /&gt;
&lt;br /&gt;
When the &quot;memory accesses&quot; are well defined in terms of ordering through synchronization, additional semantics can ensure that, even if the timing of the memory accesses are indeterminate, their order can be &quot;&lt;b&gt;reasoned&lt;/b&gt;&quot; through the synchronizations. Note, although the ordering between the memory accesses can be reasoned, they are not necessarily determinate, hence the race condition.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Why the difference?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
But if the order is still indeterminate in race condition, why bother to distinguish it from data race? The reason is in practical rather than theoretical. It is because the distinction does exist in the interface between the programming language and processor architecture. &lt;br /&gt;
&lt;br /&gt;
A memory load/store instruction in modern architecture is usually implemented as &quot;pure&quot; memory access, due to the nature of out-of-order pipeline, speculation, multi-level of cache, cpu-ram interconnection, especially multi-core, etc. There are lots of factors leading to indeterminate timing and ordering. To enforce ordering for every memory instruction incurs huge penalty, especially in a processor design that supports multi-core. So the ordering semantics are provided with additional instructions like various barriers (or fences). &lt;br /&gt;
&lt;br /&gt;
Data race is the situation of processor instruction execution without additional fences to help reasoning the ordering of conflicting memory accesses. The result is not only indeterminate, but also possibly very weird, e.g., two writes to the same word location by different threads may result with each writing half of the word, or may only operate upon their locally cached values. -- These are undefined behavior, from the programmer&#39;s point of view. But they are (usually) well defined from the processor architect&#39;s point of view. &lt;br /&gt;
&lt;br /&gt;
Programmers have to have a way to &lt;b&gt;reason &lt;/b&gt;their code execution. Data race is something they cannot make sense, therefore should always avoid (normally). That is why the language specifications that are low level enough usually define data race as undefined behavior, different from the well-defined memory behavior of race condition. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Language memory models&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Different processors may have different memory access behavior, i.e., processor memory model. It is awkward for programmers to study the memory model of every modern processor and then develop programs that can benefit from them. It is desirable if the language can define a memory model so that the programs of that language always behave as expected as the memory model defines. That is why Java and C++ have their memory models defined. It is the burden of the compiler/runtime developers to ensure the language memory models are enforced across different processor architectures.&lt;br /&gt;
&lt;br /&gt;
Actually it is (almost) impossible for a programming language to support shared memory multithreading/multicore without a memory model defined implicitly or explicitly, because otherwise there is no defined way to reason the behavior of shared data accesses. It is possible to exert the memory model through a library (outside of the language itself), but that won&#39;t work without a very strict programming model that effectively permeates the memory model into the language.&lt;br /&gt;
&lt;br /&gt;
That said, if a language does not want to expose the low level behavior of the processor (and is willing to sacrifice certain performance benefits of the modern architectures), they can choose to define a memory model that completely hide the details of &quot;pure&quot; memory accesses, but apply ordering semantics for all their memory operations. Then the compiler/runtime developers may choose to treat every memory variable as volatile in all processor architectures. For these languages (that support shared memory across threads), there are no data races, but may still be race conditions, even with a language of complete sequential consistence.&lt;br /&gt;
&lt;br /&gt;
On the other hand, the processor memory model can be stricter (or less relaxed, or at higher level), e.g., implementing sequential consistency as early-days processor did. Then all memory operations are ordered, and no data race exists for any languages running in the processor. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4. Conclusion&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Back to the original question, IMHO it is fine to define data race as a special case of race condition, and race condition at one level may become data race at a higher level. It depends on the nature of problem formulation, and where to draw the boundary between undefined behavior and well-defined but indeterminate behavior. Just the current convention defines the boundary at language-processor interface, does not necessarily mean that is always and must be the case; but the current convention probably best reflects the state-of-the-art interface (and wisdom) between processor architect and programming language.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/284659907498930426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/284659907498930426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/284659907498930426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/284659907498930426'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2019/10/differences-between-data-race-and-race.html' title='Differences between data race and race condition'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-1242992172923345622</id><published>2018-04-18T11:50:00.001-07:00</published><updated>2018-04-18T11:52:02.896-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Deep learning"/><category scheme="http://www.blogger.com/atom/ns#" term="Neural network"/><title type='text'>Evolution of RNN network designs</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
The following is my answer to a question in stackexchange: why LSTM uses two paths (from current time step to the next) well GRU uses only one.&lt;br /&gt;
&lt;br /&gt;
To understand the intuition behind, one should probably know the evolution of the algorithms.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. RNN&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
An RNN network initially wants to model the sequence of inputs. By sharing the network parameters between the individual inputs, and using the output of previous input as part of the input for next computation, the sequence state can be accumulated along with the sequence, virtually achieving a variable-depth network.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For this purpose, the most straightforward network design is to build a path between the hidden nodes (i.e., from the output of the hidden node to the input of it in the subsequent time-step).&lt;br /&gt;
&lt;div class=&quot;MathJax_Display&quot; style=&quot;border: 0px; box-sizing: inherit; font-family: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 1em 0em; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; text-align: center; vertical-align: baseline; width: 667px;&quot;&gt;
&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot; display=&amp;quot;block&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;σ&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;+&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;g&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;x&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-1-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-1&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 11.225em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 9.336em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.669em , 1009.28em , 2.892em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.497em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-2&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-3&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-4&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-5&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-6&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-7&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;σ&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.058em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-8&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-9&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-10&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-11&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-12&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-13&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-14&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-15&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-16&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-17&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-18&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-19&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-20&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-21&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-22&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;x&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-23&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-24&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.503em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1.27em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.33em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;span class=&quot;MJX_Assistive_MathML MJX_Assistive_MathML_Block&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: content-box; clip: rect(1px , 1px , 1px , 1px); display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; left: 0px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; top: 0px; transition: none; vertical-align: 0px; width: 168.375px;&quot;&gt;&lt;math display=&quot;block&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;/math&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
Here, both&amp;nbsp;&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-2-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-size: 15px; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-25&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.447em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.669em , 1000.45em , 2.892em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.497em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-26&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-27&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.503em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1.203em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.33em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&amp;nbsp;and&amp;nbsp;&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;g&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-3-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-size: 15px; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-28&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.614em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.503em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.892em , 1000.45em , 2.892em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.497em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-29&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-30&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.503em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0.937em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.33em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&amp;nbsp;are parameters, hence&amp;nbsp;&lt;strong style=&quot;border: 0px; box-sizing: inherit; font-family: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;single path&lt;/strong&gt;&amp;nbsp;suffices. This design is powerful enough to encode all the history information. But it has a problem of vanishing or exploding gradient.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Leaky Unit&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;One way among others to overcome the problem is to use the leaky unit that provides linear self-connection in following way:&lt;br /&gt;
&lt;div class=&quot;MathJax_Display&quot; style=&quot;border: 0px; box-sizing: inherit; font-family: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 1em 0em; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; text-align: center; vertical-align: baseline; width: 667px;&quot;&gt;
&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot; display=&amp;quot;block&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;+&amp;lt;/mo&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mover&amp;gt;&amp;lt;mi&amp;gt;x&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;^&amp;lt;/mo&amp;gt;&amp;lt;/mover&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-4-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-31&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 12.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 10.447em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.614em , 1010.45em , 2.892em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.497em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-32&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-33&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-34&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-35&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-36&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-37&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-38&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-39&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-40&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-41&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-42&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-43&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-44&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-45&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-46&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-47&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-48&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-49&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-50&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-51&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-52&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-53&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.114em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-54&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-55&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;munderover&quot; id=&quot;MathJax-Span-56&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.447em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-57&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;x&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.114em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -4.053em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0em; width: 0.392em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-58&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;̂&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0em; line-height: normal; margin: 0px 0px 0px -0.275em; padding: 0px; position: static; transition: none; vertical-align: 0em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0em;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-59&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.503em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1.337em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.33em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 0px; box-sizing: inherit; clear: both; font-stretch: inherit; line-height: inherit; margin-bottom: 1em; padding: 0px; vertical-align: baseline;&quot;&gt;
Now since&lt;span style=&quot;color: #242729; font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;background-color: rgba(252, 251, 248, 0.9); font-size: 15px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;msup&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;n&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msup&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;n&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;+&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-5-Frame&quot; role=&quot;presentation&quot; style=&quot;background-color: rgba(252 , 251 , 248 , 0.9); border: 0px; box-sizing: inherit; color: #242729; direction: ltr; display: inline; float: none; font-family: inherit; font-size: 15px; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-60&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 8.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 7.114em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.669em , 1007.06em , 2.892em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.497em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-61&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-62&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-63&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-64&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-65&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-66&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.947em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.45em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-67&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.503em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -4.386em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-68&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-69&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-70&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-71&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-72&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-73&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-74&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-75&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-76&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-77&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-78&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-79&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-80&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-81&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-82&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.503em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1.27em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.33em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;span style=&quot;color: #242729; font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;background-color: rgba(252, 251, 248, 0.9); font-size: 15px;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;with f being near one, the far distant history has no problem to be passed along. When f being near zero, the history can be quickly forgotten.&lt;span style=&quot;background-color: rgba(252 , 251 , 248 , 0.9); border: 0px; box-sizing: content-box; color: #242729; display: inline-block; font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; white-space: nowrap; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
Leaky unit is a clever design. Then the problem is how to decide the value of f. It can be a constant, or a parameter, or a function of the history info. (It does not make much sense for f to be a function of the input.) When we use a function for f, the function is called a gating function. Depending on the choice of f, leaky unit can be &lt;b&gt;single or two paths&lt;/b&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;3. LSTM&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The idea of using a gate function of the history info requires &lt;b&gt;introducing another path &lt;/b&gt;between steps (i.e., from the output of hidden node to the input of the gating function.) So you have,&lt;br /&gt;
&lt;div class=&quot;MathJax_Display&quot; style=&quot;border: 0px; box-sizing: inherit; font-family: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 1em 0em; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; text-align: center; vertical-align: baseline; width: 667px;&quot;&gt;
&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot; display=&amp;quot;block&amp;quot;&amp;gt;&amp;lt;mtable columnalign=&amp;quot;right left right left right left right left right left right left&amp;quot; rowspacing=&amp;quot;3pt&amp;quot; columnspacing=&amp;quot;0em 2em 0em 2em 0em 2em 0em 2em 0em 2em 0em&amp;quot; displaystyle=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;mtr&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;mi&amp;gt;&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;σ&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;h&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;,&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;x&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;/mtr&amp;gt;&amp;lt;/mtable&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-12-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-101&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 7.447em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 6.169em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.225em , 1005.95em , 2.614em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.164em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-102&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtable&quot; id=&quot;MathJax-Span-103&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 5.892em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.56em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.56em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: absolute; right: 0em; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-104&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-105&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-106&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.45em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-107&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.281em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-108&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1005.28em , 4.447em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.558em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 5.336em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1005.28em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-109&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-110&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-111&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-112&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-113&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;σ&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.058em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-114&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-115&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.614em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.5em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-116&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;h&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.503em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-117&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-118&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-119&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-120&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-121&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-122&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-123&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-124&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;x&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-125&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-126&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.169em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1.403em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.397em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
And you know this is LSTM, if you have,&lt;br /&gt;
&lt;div class=&quot;MathJax_Display&quot; style=&quot;border: 0px; box-sizing: inherit; font-family: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 1em 0em; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; text-align: center; vertical-align: baseline; width: 667px;&quot;&gt;
&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot; display=&amp;quot;block&amp;quot;&amp;gt;&amp;lt;mtable columnalign=&amp;quot;right left right left right left right left right left right left&amp;quot; rowspacing=&amp;quot;3pt&amp;quot; columnspacing=&amp;quot;0em 2em 0em 2em 0em 2em 0em 2em 0em 2em 0em&amp;quot; displaystyle=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;mtr&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;mi&amp;gt;&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;+&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;i&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mover&amp;gt;&amp;lt;mi&amp;gt;x&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;^&amp;lt;/mo&amp;gt;&amp;lt;/mover&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;/mtr&amp;gt;&amp;lt;mtr&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;h&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;mi&amp;gt;&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;o&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;/mtr&amp;gt;&amp;lt;mtr&amp;gt;&amp;lt;mtd /&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;mi&amp;gt;&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;/mtr&amp;gt;&amp;lt;/mtable&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-13-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-127&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 10.614em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 8.836em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(-0.108em , 1008.67em , 3.947em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.164em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-128&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtable&quot; id=&quot;MathJax-Span-129&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 8.503em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(2.225em , 1000.78em , 5.725em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -4.164em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.781em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.73em , 4.336em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: absolute; right: 0em; top: -5.331em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-130&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-131&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-132&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-133&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-134&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.78em , 4.336em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: absolute; right: 0em; top: -3.942em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-162&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-163&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-164&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.781em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.5em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-165&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;h&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.503em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-166&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.836em , 1000em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: absolute; right: 0em; top: -2.608em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-178&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-179&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.169em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(2.281em , 1007.73em , 6.114em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.781em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -4.497em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 7.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.114em , 1007.73em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -5.331em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-135&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-136&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-137&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-138&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-139&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.45em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-140&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.281em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-141&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-142&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-143&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-144&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-145&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-146&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-147&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-148&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-149&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-150&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-151&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.28em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-152&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.281em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-153&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-154&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-155&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.114em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-156&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-157&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;munderover&quot; id=&quot;MathJax-Span-158&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.447em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-159&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;x&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.114em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -4.053em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0em; width: 0.392em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-160&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;̂&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0em; line-height: normal; margin: 0px 0px 0px -0.275em; padding: 0px; position: static; transition: none; vertical-align: 0em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0em;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-161&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1003.73em , 4.336em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.942em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-167&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-168&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-169&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-170&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-171&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.781em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-172&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;o&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.503em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-173&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-174&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-175&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-176&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-177&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.725em , 1001em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.608em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-180&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-181&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-182&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-183&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-184&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-185&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.503em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.169em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.603em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -1.997em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;/div&gt;
With gating functions, the network can control very well how long and how short the memory should be. LSTM uses the output&amp;nbsp;&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;h&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-14-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-size: 15px; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-186&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 1.947em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.614em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.336em , 1001.61em , 2.558em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.164em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-187&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-188&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.614em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.5em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-189&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;h&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.503em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-190&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-191&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-192&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-193&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-194&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.169em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1.27em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.33em; width: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;to gate not only the hidden node connection, but also the input and,&amp;nbsp;&lt;strong style=&quot;border: 0px; box-sizing: inherit; font-family: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;especially the output from&amp;nbsp;&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-15-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-stretch: inherit; font-variant: inherit; font-weight: normal; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-195&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.892em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.558em , 1000.73em , 2.503em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.164em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-196&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-197&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-198&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-199&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-200&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-201&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.169em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0.87em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.263em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&amp;nbsp;to&amp;nbsp;&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;h&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-16-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-stretch: inherit; font-variant: inherit; font-weight: normal; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-202&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.947em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.781em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.336em , 1000.78em , 2.503em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.164em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-203&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-204&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.781em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.5em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-205&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;h&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.503em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-206&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-207&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-208&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.169em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1.137em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.263em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;/strong&gt;, which makes the two paths hard to be merged into one. Then&amp;nbsp;&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;h&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-17-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-size: 15px; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-209&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.947em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.781em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(1.336em , 1000.78em , 2.503em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.164em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-210&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-211&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.781em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.5em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-212&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;h&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.503em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-213&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-214&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-215&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.169em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1.137em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -0.263em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&amp;nbsp;is supposed to encode best the information for both long and short memory.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4. GRU&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
As such, you definitely can use the cell state to compute the gating functions, but the original setup is more straightforward - with clean separation between gating and cell state. Inspired by the idea, one can come up with different designs.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
GRU is then designed to &lt;b&gt;use single path&lt;/b&gt;, by removing the output gating and output the cell state directly. Then the cell state can be used by the subsequent step for both state update and gating function computation. You can interpret it differently anyway. For example, the reset gate in GRU can be considered as a shifted output gate of LSTM: it shifts from the output of this step (in LSTM) to the input of next step (in GRU).&lt;br /&gt;
&lt;div class=&quot;MathJax_Display&quot; style=&quot;border: 0px; box-sizing: inherit; font-family: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 1em 0em; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; text-align: center; vertical-align: baseline; width: 667px;&quot;&gt;
&lt;span class=&quot;MathJax&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot; display=&amp;quot;block&amp;quot;&amp;gt;&amp;lt;mtable columnalign=&amp;quot;right left right left right left right left right left right left&amp;quot; rowspacing=&amp;quot;3pt&amp;quot; columnspacing=&amp;quot;0em 2em 0em 2em 0em 2em 0em 2em 0em 2em 0em&amp;quot; displaystyle=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;mtr&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;mi&amp;gt;&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;+&amp;lt;/mo&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;⋅&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mover&amp;gt;&amp;lt;mi&amp;gt;x&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;^&amp;lt;/mo&amp;gt;&amp;lt;/mover&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;/mtr&amp;gt;&amp;lt;mtr&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;f&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;mi&amp;gt;&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;=&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;σ&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;c&amp;lt;/mi&amp;gt;&amp;lt;mrow class=&amp;quot;MJX-TeXAtom-ORD&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;−&amp;lt;/mo&amp;gt;&amp;lt;mn&amp;gt;1&amp;lt;/mn&amp;gt;&amp;lt;/mrow&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo&amp;gt;,&amp;lt;/mo&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;x&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;t&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;/mtr&amp;gt;&amp;lt;mtr&amp;gt;&amp;lt;mtd /&amp;gt;&amp;lt;mtd&amp;gt;&amp;lt;mi&amp;gt;&amp;lt;/mi&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;mo&amp;gt;.&amp;lt;/mo&amp;gt;&amp;lt;/mtd&amp;gt;&amp;lt;/mtr&amp;gt;&amp;lt;/mtable&amp;gt;&amp;lt;/math&amp;gt;&quot; id=&quot;MathJax-Element-18-Frame&quot; role=&quot;presentation&quot; style=&quot;border: 0px; box-sizing: inherit; direction: ltr; display: inline; float: none; font-family: inherit; font-stretch: inherit; font-variant: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; position: relative; vertical-align: baseline; white-space: nowrap; word-spacing: normal; word-wrap: normal;&quot; tabindex=&quot;0&quot;&gt;&lt;nobr aria-hidden=&quot;true&quot; style=&quot;border: 0px; box-sizing: inherit; line-height: normal; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; padding: 0px; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;math&quot; id=&quot;MathJax-Span-216&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 13.447em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-size: 18px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 11.169em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(-0.108em , 1011em , 3.947em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.164em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-217&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtable&quot; id=&quot;MathJax-Span-218&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 10.892em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(2.281em , 1000.73em , 5.836em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -4.219em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.73em , 4.336em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: absolute; right: 0em; top: -5.331em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-219&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-220&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-221&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-222&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-223&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.56em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: absolute; right: 0em; top: -3.942em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-255&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-256&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-257&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.45em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-258&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.281em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-259&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.836em , 1000em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: absolute; right: 0em; top: -2.553em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-278&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-279&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.225em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(2.281em , 1010.11em , 6.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.725em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -4.553em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 10.114em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.114em , 1010.11em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -5.331em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-224&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-225&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-226&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-227&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-228&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.45em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-229&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.281em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-230&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-231&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-232&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-233&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-234&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-235&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-236&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-237&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-238&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-239&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-240&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-241&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-242&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-243&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1000.45em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-244&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;f&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.169em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.281em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-245&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-246&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-247&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-248&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.281em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.114em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-249&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-250&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;munderover&quot; id=&quot;MathJax-Span-251&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.447em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-252&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;x&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.114em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -4.053em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0em; width: 0.392em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-253&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;̂&amp;nbsp;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0em; line-height: normal; margin: 0px 0px 0px -0.275em; padding: 0px; position: static; transition: none; vertical-align: 0em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0em;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-254&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.169em , 1005.23em , 4.392em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.942em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-260&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-261&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-262&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-263&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-264&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.336em; position: static; transition: none; vertical-align: 0px;&quot;&gt;σ&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.058em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-265&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-266&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 1.558em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-267&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;texatom&quot; id=&quot;MathJax-Span-268&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-269&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-270&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-271&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mn&quot; id=&quot;MathJax-Span-272&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-273&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;msubsup&quot; id=&quot;MathJax-Span-274&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 0px; line-height: normal; margin: 0px; padding: 0px; position: relative; transition: none; vertical-align: 0px; width: 0.725em;&quot;&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.392em , 1000.45em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.997em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-275&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;x&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0.447em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -3.831em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-276&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Italic; font-size: 12.726px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;t&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 1px; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0.003em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-277&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; clip: rect(3.725em , 1001em , 4.169em , -999.997em); font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; left: 0em; line-height: normal; margin: 0px; padding: 0px; position: absolute; top: -2.553em; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mtd&quot; id=&quot;MathJax-Span-280&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mrow&quot; id=&quot;MathJax-Span-281&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;span class=&quot;mi&quot; id=&quot;MathJax-Span-282&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-283&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-284&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mo&quot; id=&quot;MathJax-Span-285&quot; style=&quot;border: 0px; box-sizing: content-box; display: inline; font-family: STIXGeneral-Regular; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: normal; margin: 0px; padding: 0px 0px 0px 0.169em; position: static; transition: none; vertical-align: 0px;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.003em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.558em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 2.169em; line-height: normal; margin: 0px; padding: 0px; position: static; transition: none; vertical-align: 0px; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border-left-style: solid; border-width: 0px; box-sizing: content-box; display: inline-block; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; height: 4.67em; line-height: normal; margin: 0px; overflow: hidden; padding: 0px; position: static; transition: none; vertical-align: -1.997em; width: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 0px; box-sizing: inherit; clear: both; font-stretch: inherit; line-height: inherit; margin-bottom: 1em; padding: 0px; vertical-align: baseline;&quot;&gt;
A figure is better than thousand words.&lt;br /&gt;
&lt;a href=&quot;https://i.stack.imgur.com/55Ab8.png&quot; rel=&quot;nofollow noreferrer&quot; style=&quot;background-color: rgba(252, 251, 248, 0.9); border: 0px; box-sizing: inherit; color: #d4876c; cursor: pointer; font-family: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img alt=&quot;Illustration of the difference between LSTM and GRU&quot; src=&quot;https://i.stack.imgur.com/55Ab8.png&quot; style=&quot;border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; max-width: 100%; padding: 0px; vertical-align: baseline;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
You can further simplify GRU with fewer gates, for example, with the same update gate for reset gate. The point is, from the viewpoint of &quot;path&quot;, there is no essential difference no matter if it is one or two.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/1242992172923345622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/1242992172923345622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/1242992172923345622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/1242992172923345622'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2018/04/evolution-of-rnn-net-designs.html' title='Evolution of RNN network designs'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-267017460761994415</id><published>2012-10-18T23:39:00.001-07:00</published><updated>2012-10-18T23:40:20.277-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JVM"/><category scheme="http://www.blogger.com/atom/ns#" term="Managed Runtime"/><title type='text'>Managed Runtime Technology: General Introduction</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I gave a presentation to a software group on runtime technology: &lt;a href=&quot;http://people.apache.org/~xli/presentations/managed-runtime-introduction.pdf&quot;&gt;Managed Runtime Technology: General Introduction&lt;/a&gt;.[1] 

The main contents are:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Evolution of Virtual Machines and Runtime Systems
&lt;/li&gt;
&lt;li&gt;Modern Programming and Managed Runtime Systems
&lt;/li&gt;
&lt;li&gt;Differences between a managed runtime system and a traditional runtime system
&lt;/li&gt;
&lt;li&gt;Overview of Execution Engine (EE) and Memory Management (MM)
&lt;/li&gt;
&lt;/ul&gt;
[1] http://people.apache.org/~xli/presentations/managed-runtime-introduction.pdf
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/267017460761994415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/267017460761994415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/267017460761994415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/267017460761994415'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2012/10/managed-runtime-technology-general.html' title='Managed Runtime Technology: General Introduction'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-5637246638974569945</id><published>2012-10-18T23:32:00.003-07:00</published><updated>2012-10-18T23:33:08.217-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google Android"/><title type='text'>Android overview - from a system design perspective</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I gave a presentation to a research lab on Android design: &lt;a href=&quot;http://people.apache.org/~xli/presentations/Android-design-overview.pdf&quot;&gt;Android overview - from a system design perspective&lt;/a&gt; [1].

The summary bullets are:&lt;br /&gt;
&lt;br /&gt;
Smartphone OS has to be open and elegant 
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Comprehensive and consistent API
&lt;/li&gt;
&lt;li&gt;Service oriented framework to back the API specification
&lt;/li&gt;
&lt;li&gt;App components are wired into the framework
&lt;/li&gt;
&lt;li&gt;HAL to hide hardware differences
&lt;/li&gt;
&lt;li&gt;UID/process based security support to apps - leverage the mature model
&lt;/li&gt;
&lt;li&gt;Traditional OS kernel for platform management
&lt;/li&gt;
&lt;/ul&gt;
[1] http://people.apache.org/~xli/presentations/Android-design-overview.pdf
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/5637246638974569945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/5637246638974569945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5637246638974569945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5637246638974569945'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2012/10/android-overview-from-system-design.html' title='Android overview - from a system design perspective'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-2942714710812037461</id><published>2012-07-03T01:18:00.000-07:00</published><updated>2012-07-03T01:23:25.545-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google Android"/><title type='text'>Comparison and Analysis of the Three Programming Models in Google Android</title><content type='html'>Smartphone and tablet are becoming more like personal computer. It is important to understand the pros and cons of different programming models in these kinds of mobile devices. In order to fully understand their implications to the platform architecture and their technical correlation, we develop variants of the same representative Android application in all of the three sets of APIs provided in Google Android, i.e., the Java SDK, C++ NDK, and the new powerful Renderscript. Based on the same application, we conduct detailed apple-to-apple analysis, with focus on hands-on programming convenience, runtime behavior, and technical correlation of the different programming models. We find that the current programming models provided in Android can be improved. We propose a unified solution that we expect to satisfy the requirement of both programmability and performance as a programming model, and also maintain the applications’ security and portability when deployed in mobile devices.
&lt;br&gt;
&lt;br&gt;
The paper can be found at http://people.apache.org/~xli/papers/applc2012-android-programming-models.pdf [1]
&lt;br&gt;
&lt;br&gt;
[1] Xi Qian, Guangyu Zhu, Xiao-Feng Li, Comparison and Analysis of the Three Programming Models in Google Android, First Asia-Pacific Programming Languages and Compilers Workshop (APPLC), in conjunction with PLDI 2012, Beijing, China, June 14, 2012</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/2942714710812037461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/2942714710812037461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/2942714710812037461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/2942714710812037461'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2012/07/comparison-and-analysis-of-three.html' title='Comparison and Analysis of the Three Programming Models in Google Android'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-1884557326441945951</id><published>2011-11-23T18:24:00.000-08:00</published><updated>2011-11-23T18:24:39.421-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google Android"/><title type='text'>Quantify and optimize the user experience of Google Android</title><content type='html'>Traditional performance evaluation methodology has been quite mature and somehow sophisticated with hardware support in micro-architecture and lots of tools available. But the evaluation methodology for user experience is not yet well established. The root causes are two-fold:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Before mobile client prevails recently, the user experience of a computing system was basically just GUI + performance. When it came to user experience, people thought mostly about human-computer-interface with various media approaches such as speech, virtual reality etc. that had never become the mainstream or actual reality.&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;The traditional user experience research has been mostly focused on user subjective perception. So the academia on this front spent their efforts in perceptual model, eye-tracking, polls, sweating, etc. that are not directly useful to software engineering.  &lt;br /&gt;
&lt;/ol&gt;The community did not realize that, there have been already enough room for the industry to software engineering the user experience - based on the established industry principles in responsiveness, smoothness, coherence, accuracy/fuzziness, etc.

I have recently prepared a series of slide decks on the software engineering methodology of &quot;user experience optimization&quot; with Google Android: 
&lt;ul&gt;&lt;li&gt; Overall methodology of &lt;a href=&quot;http://people.apache.org/~xli/presentations/Android-user-experience-optimization-external.pdf&quot;&gt;quantify and optimize User Interactions with Android devices&lt;/a&gt;.&lt;br /&gt;
&lt;li&gt; The &lt;a href=&quot;http://people.apache.org/~xli/presentations/Android-workload-suite-external.pdf&quot;&gt;Android Workload Suite&lt;/a&gt; used for Android user interactions evaluation.&lt;br /&gt;
&lt;li&gt; The &lt;a href=&quot;http://people.apache.org/~xli/presentations/Android-UXtune-toolkit-external.pdf&quot;&gt;Android UXtune toolkit&lt;/a&gt; used to assist the analysis and optimization of Android user interactions.&lt;br /&gt;
&lt;/ul&gt;
The content is available in my homepage at Apache: &lt;a href=&quot;http://people.apache.org/~xli/&quot;&gt;http://people.apache.org/~xli/&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/1884557326441945951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/1884557326441945951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/1884557326441945951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/1884557326441945951'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2011/11/quantify-and-optimize-user-experience.html' title='Quantify and optimize the user experience of Google Android'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-6845307890202732179</id><published>2009-08-04T22:26:00.000-07:00</published><updated>2012-06-04T22:35:31.455-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Transactional memory regarded not good programming model</title><content type='html'>After I posted my blog entry &lt;a href=&quot;http://xiao-feng.blogspot.com/2007/04/can-transactional-memory-be-new.html&quot;&gt;Can &quot;transactional memory&quot; be a new programming model?&lt;/a&gt; two years ago, I have been watching closely on the opinions from academia on TM as a programming model. Recently I read two papers on the same topic, one from Bohem [2] arguing that TM should only be an implementation technique, the other from C. J. Rossbach, et al [3] demonstrated with experiments that programming with TM is not necessarily easier than with coarse-grained locks.&lt;br /&gt;&lt;br /&gt;[1] Can &quot;transactional memory &quot; be a new programming model? http://xiao-feng.blogspot.com/2007/04/can-transactional-memory-be-new.html&lt;br /&gt;[2] Hans-J. Boehm, Transactional Memory Should Be an Implementation Technique, Not a Programming Interface, HotPar, Berkeley, CA. March 30, 2009&lt;br /&gt;[3] Christopher J. Rossbach, Owen S. Hofmann, and Emmett Witchel, Is Transactional Programming Actually Easier? 8th Annual Workshop on Duplicating, Deconstructing, and Debunking (WDDD), Austin, Texas June 2009</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/6845307890202732179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/6845307890202732179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/6845307890202732179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/6845307890202732179'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2009/08/transactional-memory-regarded-not-good.html' title='Transactional memory regarded not good programming model'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-5373370774170171332</id><published>2009-04-14T19:15:00.000-07:00</published><updated>2012-06-04T22:36:30.126-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache Harmony"/><category scheme="http://www.blogger.com/atom/ns#" term="Garbage collection"/><category scheme="http://www.blogger.com/atom/ns#" term="JVM"/><title type='text'>A quick guide on Tick - the Harmony concurrent GC</title><content type='html'>I&#39;ve written a &lt;a href=&quot;http://people.apache.org/~xli/presentations/harmony_tick_concurrent_gc.pdf&quot;&gt; slide deck on Tick &lt;/a&gt; [1], the Harmony concurrent GC we developed. Tick has been there in Harmony for about one year, now I got some time to put down its design and implementation. I do not expect people can immediately understand all the internals of Tick after reading the guide, but it should help those who want to dive into Tick or those who want to write their own concurrent GC. The immediate target of this document to help the GSoC2009 project with Tick.&lt;br /&gt;&lt;br /&gt;Concurrent GC is a super-set of stop-the-world GC, in my opinion. It meets all the challenges in a STW GC and many beyond. The key challenges in my mind (based on my experience with Tick) are: &lt;br /&gt;&lt;br /&gt;1. The interaction between mutators and collectors. Here in my slides I refer as the phase transition control. The idea was not so clear at the beginning of Tick development, but we then realized it is simply boiled down into a central state-machine control by mutator. &lt;br /&gt;&lt;br /&gt;2. The termination control. It is easy to understand that to terminate the marking process, we need guarantee the global root set, collector local mark stacks, mutator local remember sets, and global remember set all be empty. But there are two subtleties in real implementations. a) the checks must be in order; b) concurrent access to mutator local remset by mutator and collector.&lt;br /&gt;&lt;br /&gt;3. The collection triggering scheduler. It can not collect too early so as to waste the system resource when there are lots of free memory; also it can not be too late to become virtually STW collection, hence losing all the Tick design target. A proper triggering scheduler should consider both space and timing issues.&lt;br /&gt;&lt;br /&gt;4. Keep collection overhead small. Concurrent GC wants to achieve short pause time, the expense is to lower the overall system throughput. It is a challenge to balance the design between pause time and system throughput. For example, to improve the performance, multiple collectors can be deployed in parallel.&lt;br /&gt;&lt;br /&gt;I would like to spend more time to document the internals of Tick. Stay tuned.&lt;br /&gt;&lt;br /&gt;[1] http://people.apache.org/~xli/presentations/harmony_tick_concurrent_gc.pdf</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/5373370774170171332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/5373370774170171332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5373370774170171332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5373370774170171332'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2009/04/quick-guide-on-tick-harmony-concurrent.html' title='A quick guide on Tick - the Harmony concurrent GC'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-7110965773839990682</id><published>2009-04-01T05:25:00.000-07:00</published><updated>2012-06-04T22:35:31.459-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Two Harmony project proposals for GSoC 2009</title><content type='html'>Check link below [1] for application process. For Harmony projects, it is required to discuss the proposal in the mailing list dev@harmony.apache.org .&lt;br /&gt;&lt;br /&gt;&lt;B&gt;1. Modularize Harmony JIT by separating JET as a standalone JIT compiler&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;So far the JIT component (called Jitrino) of Harmony has virtually two JIT implementations: JET and OPT. Jitrino.JET is a fast but non-optimizing JIT, and Jitrino.OPT is an optimizing JIT. The code base of JET and OPT shares lots of code hence they are mixed in one module. This is undesirable for situations where people need only JET, for fast compilation, for small footprint. This project proposes to create a standalone JET-based JIT module for Harmony. It does not require to remove JET from Jitrino, but to create a new JIT module with JET. This project is also a very good exercise to examine the JIT modularity design, the interface between JIT and other components, the interaction between multiple co-existing JIT modules.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;2. Implement WeakReference support in Harmony concurrent GC&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;Harmony already has a concurrent GC (called Tick, with three concurrent GC algorithms). It runs well with standard benchmarks. The only remaining unfinished feature is WeakReference support . Weakly referenced object (i.e., referent) is accessed through get() interface. That means, get() operation can make a weakly reachable referent strongly reachable. During concurrent collection, the system must monitor the get() operation to catch this change of reachability, otherwise the referent could be reclaimed. This project also includes to integrate the WeakReference processing with Finalization process. Other optimizations in Tick are also desirable, such as to reduce the amount of floating garbage.&lt;br /&gt;&lt;br /&gt;[1] http://wiki.apache.org/general/SummerOfCode2009</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/7110965773839990682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/7110965773839990682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/7110965773839990682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/7110965773839990682'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2009/04/two-harmony-project-proposals-for-gsoc.html' title='Two Harmony project proposals for GSoC 2009'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-2006575849610037875</id><published>2008-08-23T06:11:00.000-07:00</published><updated>2012-06-04T22:34:56.692-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Threading"/><title type='text'>Thread mapping: 1:1 vs M:N</title><content type='html'>This is an old essay I wrote about 7 years ago, when I was investigating what kind of thread mapping is better for a runtime system (especially the ORP [1] JVM I was working on). It is worth to put it here as one of the series of blog articles. I edited it a little bit to incorporate some new information.&lt;br /&gt;&lt;br /&gt;I discussed the concept of thread mapping, 1:1 or M:N, in blog entry: What is a thread. [2] M:N thread binding is &quot;conceivably&quot; better than 1:1 because of cheap context switch. It is believed to be cheap because it does not need to involve OS kernel operations for user level thread switch. So an M:N threading normally has following setting: there are processor number pf kernel threads; unlimited number of user threads multiplexes over the kernel threads. Since kernel context switches are expensive, it&#39;s expected there are no kernel thread context switches at all except OS kernel process scheduling. All the context switches are expected to happen only in the user-level scheduler. As a comparison, in 1:1 threading all the context switches happen in kernel.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;&lt;font size=+1&gt;1. Context Switch&lt;/font&gt;&lt;/B&gt;&lt;br /&gt;But this conception is not necessarily true. The kernel thread context switch has no more operations than user thread context switch, except that, kernel switch requires to trap into the kernel. So the only additional overhead is the system call. But if we study the real nature of context switch, we can see the truth is not so obvious.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Scenario 1: Blocking operations&lt;/B&gt; &lt;br /&gt;Context switches mostly happen when a thread is doing some I/O operations and blocks in kernel. Since it blocks in kernel, it&#39;s natural to schedule on-site by the kernel to context switch to another kernel thread; this is the approach of 1:1 binding. The trapping overhead is there already. &lt;br /&gt;&lt;br /&gt;In M:N mapping, there are two ways to continue another user thread in the same kernel thread context:&lt;br /&gt;&lt;br /&gt;1. Scheduler activation implemented in kernel. When a blocking happens, kernel can vector the event to user scheduler via an upcall. Then the user scheduler can determine which user thread to schedule next. But this is cumbersome because it requires one upcall which is an extra overhead compared to the kernel scheduling; and the user scheduler is not necessarily as efficient as kernel scheduler due to the immaturity compared to the OS kernel shceudler;&lt;br /&gt;&lt;br /&gt;2. Non-blocking system call. If OS doesn&#39;t provide scheduler activation, the only way to continue a user thread when another blocks is to use non-blocking system call. That is, whenever a thread is calling a possibly blocking syscall, it first polls it to check if it is going to block. If it is, the user scheduler will schedule another thread, and polls again in next scheduling cycle. This solution seems ok, but the polling itself is a system call, which involves everything in a blocking system call except the context switch. So user-level scheduling consists of a non-blocking system call + user thread context switch. The cost is equal to a blocking system call + kernel context switch. &lt;br /&gt;&lt;br /&gt;Although it is no better, this is the ideal case of user-level scheduling. In common cases, the non-blocking simulation of blocking syscall involves much more than stated here. It usually requires a syscall to save the current blocking status of the file descriptor and another syscall to restore it, before and after the polling respectively. And the next scheduling cycle may repeat these operations again to check if the blocking condition is resolved. As a comparison, kernel scheduling is much simpler and cleaner, where the blocking thread is simply put into sleep, and then waken up till the blocking condition is known resolved. &lt;br /&gt;&lt;br /&gt;The reason for this complexity of non-blocking syscall simulation is easy to understand: user scheduler knows nothing about kernel status. It has to use syscall to figure out the blocking status. Better asynchronous I/O support can help to solve the problem, where the user scheduler is notified by the kernel for the async processing, and a completion notification is sent by the kernel upon the processing is finished. This kind of interaction between user threads and kernel is implemented in Windows NT4.0 and Solaris10 and their later as I/O Completion Port. &lt;br /&gt;&lt;br /&gt;&lt;B&gt;Scenario 2: Synchronization&lt;/B&gt; &lt;br /&gt;Another scenario of thread blocking is caused by the synchronizations among threads. This is the case where all the scheduling can be done at user level, since the synchronization implementation could all be in the user runtime. If the synchronization usage is extensive in the application and the contention is intensive, user level scheduling can bring some performance advantage. But again, it is not that simple.&lt;br /&gt;&lt;br /&gt;1. Normally, in the application domain, a highly contending application is unusual and considered sub-optimal in its design. For example, the highly contended SPECpbob was substituted by rarely contended SPECjbb2000. (Note, lots of synchronization operations do not mean lots of contention. They are completely two different issues.) Actually, some source said the thread blockings caused by synchronization take only very minor ratio in all the blockings (&lt; 5%).&lt;br /&gt;&lt;br /&gt;2. Even it is good to use user-level scheduling for thread synchronization blocking, a threading library has to deal with process level mutex, which makes the thread synchronization implementation complicated and less efficient as expected. (Futexes helped here.) &lt;br /&gt;&lt;br /&gt;This is the scenario supporting the idea of M:N mapping; well the benefits are not convincing enough.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Scenario 3: Uncaught exceptions&lt;/B&gt;&lt;br /&gt;There are lots of situations where thread blockings are hard to be simulated with non-blocking operations, e.g. page fault. Page fault happens in kernel, and is hard to predict. Neither scheduler activation nor a non-blocking wrapper can work around it easily except just be blocked in kernel. This limits the concurrency achievable.&lt;br /&gt;&lt;br /&gt;As stated earlier, the problem is due to the limited information known at user level. Lots of things like processor affinity, intelligent scheduling for hyperthreads or NUMA optimizations, scheduling based on system load outside of the process, etc. are almost impossible. Scheduler activation can help but not a complete solution.&lt;br /&gt;&lt;br /&gt;Moreover, a problem is, all of the scheduling supports are always existing in kernel scheduler. To achieve the scheduling capability at user-level, those supports have to be duplicated at user-level. &lt;br /&gt;&lt;br /&gt;&lt;B&gt;&lt;font size=+1&gt;2. Cooperative user threads&lt;/font&gt;&lt;/B&gt;&lt;br /&gt;Even if the user-level scheduling is effective, is it really a good thing? People may think that user scheduler is better because the user threads are cooperative, and they guess that &quot;cooperative&quot; sounds like a better behavior pattern than preemptive.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Number of scheduling units&lt;/b&gt;&lt;br /&gt;It is easy to believe that best performance is normally achieved when there are equal number of processors and scheduling units (kernel threads). User threads sharing a kernel thread are bound to a processor, and do not need preemptiveness. But this problem is, in nowadays operating system, there are always many running processes at the same time. So even if user threads are cooperative, the kernel thread containing them is already preempted from time to time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Thread cooperation&lt;/b&gt;&lt;br /&gt;It could really be a good thing if user threads are really cooperative without much extra cost. Unfortunately, since a non-preemptive scheduler depends on application behavior for scheduling, it normally requires the application be aware of the scheduling and yields voluntarily; Otherwise it is easy to be deadlocked or starved. But this awareness is burdensome to the developer and usually does not exist at all. The threading runtime can not always be able to insert yields properly. &lt;br /&gt;&lt;br /&gt;Different from many people&#39;s expectation, the preemptive scheduling is more intuitive to application developer than the cooperative one. (The situation is different from the mechanism of stop-the-world for GC in runtime system. I will discuss it later).&lt;br /&gt;&lt;br /&gt;More importantly, preemption might be necessary for any environment where real-time or soft real-time responsiveness is needed, both for rouge-thread cases and for cases where the processor resource has to be given up due to a higher priority thread needing it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resource sharing&lt;/b&gt;&lt;br /&gt;An advantage of user threads in one kernel thread might be that, the threads can share everything of the system resource, esp. including the page table and TLB slots, which could lead to better performance due to less misses. Well, the situation is, kernel threads can share these resources too. (This feature needs architectural support. AFAIK, Linux does pretty good on IA32 processor.)  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Thread creation/cancellation&lt;/b&gt;&lt;br /&gt;One important claimed advantage of user thread is the creation and cancellation cost of user thread is low. This is mostly true if the thread runtime is implemented correctly. But its importance is largely reduced due to its user thread nature. Being not a separate system scheduling unit, it is unclear what is the intention to create tons of user threads that are only running within one kernel thread container. They will compete for the precious time slice of the single kernel thread. &lt;br /&gt;&lt;br /&gt;In reality, most systems do not create or cancel lots of threads in short time. In cases when lots of threads are needed, the applications may want to reduce the creation overhead with thread pooling. Lots of threads creation doesn&#39;t necessarily mean lots of concurrency. They may just start and finish frequently. And even if there are lots of concurrency, it&#39;s hard to be leveraged because it has to be implemented by scheduling efficiency, which is not so good for user-level threading as we discussed above. &lt;br /&gt;&lt;br /&gt;&lt;B&gt;&lt;font size=+1&gt;3. Obvious disadvantages&lt;/font&gt;&lt;/B&gt;&lt;br /&gt;In spite of the suspicious &quot;advantages&quot; of M:N threading discussed above, user-level scheduler has some obvious disadvantages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Duplication of the schedulers&lt;/b&gt;&lt;br /&gt;M:N requires two schedulers which basically do same work, one at user level and one in kernel. This is undesirable. It requires frequent data communications between kernel and user space for scheduling information transference. &lt;br /&gt;&lt;br /&gt;One subtler point is, the duplication takes more space in both Dcache and Icache for scheduling than a single scheduler. It is highly undesirable if cache misses are caused by the schedulers but the application, because a L2 cache miss could be more expensive than a kernel thread switch. Then the additional scheduler might become a trouble maker! In this case, to save kernel trappings does not justify a user-scheduler, which is more truen when the processors are providing faster and faster kernel trapping execution.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Thread local data maintenance&lt;/b&gt; &lt;br /&gt;M:N has to maintain thread specific data, which are already provided by kernel for kernel thread, such as the TLS data, error number. To provide the same feature for user threads is not straightforward, because, for example, the error number is returned for system call failure and supported by kernel. User-level support degrades system performance and increases system complexity.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;System info oblivious&lt;/b&gt; &lt;br /&gt;Kernel scheduler is close to underlying platform and architecture. It can take advantage of their features. This is difficult for user thread library because it&#39;s a layer at user level. User threads are second-order entities in the system. If a kernel thread uses a GDT slot for TLS data, a user thread perhaps can only use an LDT slot for TLS data. With increasingly more supports available from the new processors for threading/scheduling (Hyperthreading, NUMA, many-core), the second order nature seriously limits the ability of M:N threading. &lt;br /&gt;&lt;br /&gt;This is what I thought on the thread mapping issues. It is a long article, and thanks for reaching here. There are some contents in the original essay that I do not include here. Those are some considerations on the threading needs in a runtime system, such as whether we need suspend/resume API, better inter-thread signaling, etc. I might discuss them in future.&lt;br /&gt;&lt;br /&gt;[1] Open Runtime Platform, http://orp.sourceforge.net &lt;br /&gt;[2] What is a thread? http://xiao-feng.blogspot.com/2008/08/what-is-thread.html</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/2006575849610037875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/2006575849610037875' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/2006575849610037875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/2006575849610037875'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/08/thread-mapping-11-vs-mn.html' title='Thread mapping: 1:1 vs M:N'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-8680950075758825200</id><published>2008-08-17T06:39:00.000-07:00</published><updated>2012-06-04T22:34:56.704-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Threading"/><title type='text'>What is thread escape analysis?</title><content type='html'>In last blog entry, I discussed &quot;thread local data&quot; [1]. I mentioned that if some data are known to be thread local, some optimizations can be applied to the application manually or automatically.&lt;br /&gt;&lt;br /&gt;One optimization is, we can put the thread local data into registers. Register is thread local anyway, so the semantics are kept. Register access is much faster than memory access, so this optimization can improve the performance. In compiler, this is done with register allocation, scalar replacement (i.e., use scalars to replace non-scalar data fields, such as array or class), etc. &lt;br /&gt;&lt;br /&gt;Thread local data can be be put on runtime stack as well. Stack is also in memory as heap space, but stack has an advantage that data on it are freed automatically when the stack frame is cleared (when a method returns). In this case, the data actually are not only thread local, but also method local, which is more strict condition than thread local. (some people claim that stack-allocated data have better access locality, but my experience did not confirm that.)&lt;br /&gt;&lt;br /&gt;Even if the thread local data can not be put into register or stack, there are still optimizations applicable. For example, garbage in thread local data can be recycled without stopping other threads for root enumeration. (Well, technique still needed to enumerate roots in global variables).&lt;br /&gt;&lt;br /&gt;No matter where they are, all the thread local data have an important optimizing opportunity: They do not need any locking operations for mutual exclusive access. This is important because locking operation usually is very expensive. &lt;br /&gt;&lt;br /&gt;Then the question is how the compiler can identify some data are thread local automatically. This is called escape analysis. The compiler analyzes the source code to find if the reference of an object is passed to other thread. This analysis has to be conservative to guarantee the correctness. For example, usually when a reference is written to a global variable, it is considered escaping, because the global variable could be read be other thread.&lt;br /&gt;&lt;br /&gt;Escape analysis can also be conducted at runtime without compiler static analysis. That is, when an object is created, it is set thread local to its creating thread. Then the system monitors all the accesses to this object. If it detects any other thread tries to access the object, the system then marks the object to be escaping. This technique is called escape detection instead of escape analysis sometimes. Some of the thread local data optimizations can still be applied to the dynamically detected thread local data, but some static optimizations might not be suitable.&lt;br /&gt;&lt;br /&gt;&quot;Thread local&quot; actually is not necessarily restricted to &quot;accesses&quot;. Many operations can be the property of &quot;thread local&quot;. For example, if an object is only locked by one thread, it is called thread local lock. Thread local lock can be eliminated, even the object itself is accessed by multiple threads. So thread local data is more restrictive than thread local object. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] What is thread local data? http://xiao-feng.blogspot.com/2008/08/what-is-thread-local-data.html</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/8680950075758825200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/8680950075758825200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/8680950075758825200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/8680950075758825200'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/08/what-is-thread-escape-analysis.html' title='What is thread escape analysis?'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-4678124290075428263</id><published>2008-08-17T03:03:00.000-07:00</published><updated>2012-06-04T22:34:56.697-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Threading"/><title type='text'>What is thread local data?</title><content type='html'>Thread local data refer to those data owned by one thread. Normally &quot;owned&quot; here means the data are only accessed by that thread. Sometimes, it is also called thread-private data, thread-specific data, thread-local storage, etc. Thread local data are interesting because the property of being owned by a single thread can be utilized to improve the application&#39;s performance or the program design.&lt;br /&gt;&lt;br /&gt;There are basically three kinds of thread local data. They are:&lt;ul&gt;&lt;br /&gt;&lt;li&gt; Registers. The registers can only be accessed by single thread (or process, depending on the context) normally. (Yes, some processors have global registers, and even the common registers can be accessed with tricks, but those are out of the scope of my discussion here.)&lt;br /&gt;&lt;li&gt; Stack. This is known to be associated with a specific thread. Sometimes a thread is identified by its stack.&lt;br /&gt;&lt;li&gt; Thread-local heap. Within the shared heap space, a region can be owned by a single thread.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Registers and stack are system-supported thread local data, as we discussed in &quot;What is a thread?&quot; [1]. They cannot be accessed by other threads by design. &lt;br /&gt;&lt;br /&gt;Thread-local heap is different. It is supported not by design, but by convention, because heap is sharable to all threads. A heap region is local to one thread means either of the following two situations:&lt;br /&gt;1. The region is not accessible to other threads. The region can be protected by virtual memory mechanism or whatever technique to enforce the convention, or it is simply a rule complied by all the threads.&lt;br /&gt;2. The region is accessible to all threads, but only one thread actually accesses it (up to the moment). This property of the data is called &quot;non-escape&quot;, i.e., they are confined to a single thread&#39;s territory. Once the data are accessed by other thread, it becomes &quot;escape&quot;. (We will discuss &quot;escape&quot; and &quot;escape analysis&quot; later.)&lt;br /&gt;&lt;br /&gt;Different from the registers or the stack, there is no default system support for thread local heap. Programmers need some way to define, to find, and to use thread local heap. Since every thread can claim thread local regions, they should be able to find its own regions with same API like my_region(). The solution is, we can put the region pointer into the same register or the same stack slot of different threads. Since the registers and the stack are system-supported thread local data, even using the same register name or stack slot, different threads will access their own registers or stack slots. So they can get their own region pointers from the same API my_region(). This is how the current thread libraries implement &quot;thread local storage&quot; or &quot;thread specific data&quot;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] What is a Thread? http://xiao-feng.blogspot.com/2008/08/what-is-thread.html</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/4678124290075428263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/4678124290075428263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/4678124290075428263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/4678124290075428263'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/08/what-is-thread-local-data.html' title='What is thread local data?'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-109737427357728913</id><published>2008-08-17T02:22:00.001-07:00</published><updated>2012-06-04T22:34:56.687-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Threading"/><title type='text'>What is a thread?</title><content type='html'>Some of my friends are confused by all kinds of concepts around thread, such as system thread, kernel thread, native thread, user-level thread, application thread, java thread, software thread, hardware thread, simultaneous multithread (SMT), hyperthread (HT), helper thread, etc, etc.  &lt;br /&gt;&lt;br /&gt;So what a thread is?&lt;br /&gt;&lt;br /&gt;A thread is nothing but a control flow of execution. It is an concept only valid in control-flow machine, because only then is there control flow. Then what is control flow? Or in other words, how to represent a control flow. In my opinion, only two entities are essential to represent a control flow. They are the program counter and the stack.&lt;br /&gt;&lt;br /&gt;Program counter points to next instruction to execute. Stack stores the temporary execution result. To be a meaningful stack, a stack pointer is needed pointing to the next location to store the execution result.&lt;br /&gt;&lt;br /&gt;Program counter and the stack can uniquely identify a control flow of an execution. They cannot be shared with other threads (except for some extreme cases). All of other computing resources can be shared between threads, such as heap, code, processor, etc. Hence, program counter and the stack are called the thread context. &lt;br /&gt;&lt;br /&gt;That means, if a system provides threading support, it should at least provide a way to distinct one thread context from another, be it in software, hardware or hybrid. If processor hardware provides thread context support, it is hardware thread. Different hardware threads can share same processor pipeline (SMT) or use different pipelines, depending on the design. HT is an implementation of SMT. Any control-flow processor must provide at least one thread context; otherwise, there would be no control flow. &lt;br /&gt;&lt;br /&gt;If the processor has only one thread context, threading support still can be provided by software. That is, multiple software threads can multiplex over the same thread context. When a software thread is scheduled to run, its context is loaded from the memory into the hardware thread context. If it is scheduled off the processor, its context is saved into the memory.  &lt;br /&gt;&lt;br /&gt;Software thread design has an implication. Since the thread context loading/storing (or switch) is conducted by software, it requires the software thread design to guarantee that there are chances to conduct the switch operation (or thread scheduling). An easy way to implement is to leverage hardware interrupt. Once the software receives a hardware interrupt (timer or whatever), it executes the interrupt handler and within the handler, it schedules the threads. &lt;br /&gt;&lt;br /&gt;Sometimes, the timer is too long to wait. For example, when a thread is sleeping, before a timer handler is executed, no other thread can be scheduled. This is not desirable. A straightforward solution is, if a thread wants to sleep, it always invokes the scheduler, then the scheduler can switch on another thread. &lt;br /&gt;&lt;br /&gt;Now that multiple software threads can share the same hardware context, it is not hard to think that, a software thread context can also be multiplexed by another level of multiple software threads. This is true. So conceptually, software threads can be built with infinite levels, every higher level threads multiplex the contexts of its next level threads. &lt;br /&gt;&lt;br /&gt;Also a natural corollary is, a thread is only a thread in your level of discussion. It could contain multiple threads in a higher-level of discussion. Well, although this is true, people do not really build many levels of software threading libraries. Usually there are only two levels, one level shares the hardware context, and the other level shares the software context.&lt;br /&gt;&lt;br /&gt;This is reasonable. The most important reason is, all the software threads in one level are treated as a single thread in the next level, so they are scheduled as one thread in the next level. That means, they total only share the time slice of a single thread in the next level. If the next level thread is scheduled off the processor, none of them can be continuing. This is inconvenient. &lt;br /&gt;&lt;br /&gt;More inconvenient is, sometimes, only one thread wants to sleep, but all the other threads have to sleep with it together, because they are treated as a single thread in the next level scheduler who sees the sleep operation. This issue can be partially solved with non-blocking sleep.  That is, when a thread wants to sleep, it does not really sleep in the sense of the next level scheduler. It only sleeps in the eyes of its level&#39;s scheduler. This scheduler will schedule another thread at the same level. From the next-level thread scheduler&#39;s point of view, the thread is just continuing without sleep at all. In threading terminology, all the blocking operations (such as sleeping) in one level are implemented as non-blocking in its next level. (Well, this requires the system support for non-blocking operations, such as socket snooping, etc.)&lt;br /&gt;&lt;br /&gt;Only operating system kernel really takes control of the execution engine (i.e., the processor or the pipeline). So the time slice concept is only really meaningful to the kernel. That means, only the threading at kernel level can really manipulate all the resources. Higher levels of software threads should always try to leverage the support of kernel threading. This is the fundamental reason why we want at most one additional level of threading above kernel threads. &lt;br /&gt;&lt;br /&gt;Kernel threads are exposed to user applications through threading APIs. They are called native threads by the applications, such as NPTL or Linuxthreads in Linux, and WinThreads in Windows. The threading library implemented on top of native threads is called user-level threading. For the inconvenience we discussed above, not so many software today employ user-level threads. &lt;br /&gt;&lt;br /&gt;User-level threads have its own advantages in certain scenarios. For example, multiple user threads never run in parallel on multiple processors/cores, because they are actually just single thread from OS&#39; point of view.&lt;br /&gt;&lt;br /&gt;Java thread is thread in another dimension. It is actually a language concept. It can implemented in any of threading mechanisms discussed above. Previously before Java, all the threading supports are kind of independent of programming languages. They are just system supports, and any languages can utilize if they want. Java takes a different approach that, it builds threading concept in its language. This is important for program semantic correctness. Hans had a PLDI paper with title &quot;Threads Cannot be Implemented as a Library&quot; [1]. And people are trying to introduce threading as a language construct into more languages.&lt;br /&gt;&lt;br /&gt;[1] Hans Boehm, Threads Cannot be Implemented as a Library, www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/109737427357728913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/109737427357728913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/109737427357728913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/109737427357728913'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/08/what-is-thread.html' title='What is a thread?'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-1073679165045421030</id><published>2008-04-09T08:09:00.000-07:00</published><updated>2012-06-04T22:36:30.112-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache Harmony"/><category scheme="http://www.blogger.com/atom/ns#" term="Garbage collection"/><category scheme="http://www.blogger.com/atom/ns#" term="JVM"/><title type='text'>Quick hacking guide for Harmony GC development</title><content type='html'>I just wrote &lt;a href=&quot;http://people.apache.org/~xli/presentations/harmony_gc_source.pdf&quot;&gt;an introduction on Harmony GC source code&lt;/a&gt;. It serves as a quick hacking guide. It&#39;s subject to changes based on the comments or questions received. Hope this is useful for the students who are applying for GSoC projects related to GC.&lt;br /&gt;&lt;br /&gt;The doc is at http://people.apache.org/~xli/presentations/harmony_gc_source.pdf</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/1073679165045421030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/1073679165045421030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/1073679165045421030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/1073679165045421030'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/04/quick-hacking-guide-for-harmony-gc.html' title='Quick hacking guide for Harmony GC development'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-5941266186019116790</id><published>2008-04-04T02:29:00.000-07:00</published><updated>2012-06-04T22:34:12.099-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Garbage collection"/><category scheme="http://www.blogger.com/atom/ns#" term="JVM"/><title type='text'>Parallel Garbage Collection</title><content type='html'>Recently, I gave a talk on &quot;&lt;a href=&quot;http://people.apache.org/~xli/presentations/parallel_garbage_collection.pdf&quot;&gt;Parallel Garbage Collection&lt;/a&gt;&quot;[1] (2008-03-28) in &lt;a href=&quot;http://gelato.org/etws/program/index.php&quot;&gt;Shanghai Many-Core Workshop 2008&lt;/a&gt;, arranged by gelato.org. &lt;br /&gt;&lt;br /&gt;The presentation discussed some common issues in STW parallel GC algorithms: &lt;ol&gt;&lt;br /&gt;&lt;li&gt;Traversal of object connection graph&lt;br /&gt;&lt;li&gt;Order of object copying&lt;br /&gt;&lt;li&gt;Phases of heap compaction&lt;br /&gt;&lt;li&gt;Marking of live object&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I also briefly mentioned several threading issues with garbage collection.&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Thread local objects&lt;br /&gt;&lt;li&gt;Finalizer processing&lt;br /&gt;&lt;li&gt;Concurrent collection&lt;br /&gt;&lt;li&gt;GC and transactional memory&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;[1]http://people.apache.org/~xli/presentations/parallel_garbage_collection.pdf</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/5941266186019116790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/5941266186019116790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5941266186019116790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5941266186019116790'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/04/parallel-garbage-collection.html' title='Parallel Garbage Collection'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-7642446820470856520</id><published>2008-03-23T18:45:00.001-07:00</published><updated>2012-06-04T22:35:31.464-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Harmony project proposals for Google Summer of Code 2008</title><content type='html'>&lt;a href=&quot;http://code.google.com/soc/2008&quot;&gt;Google Summer of Code 2008&lt;/a&gt; is open for &lt;a href=&quot;http://code.google.com/p/google-summer-of-code/wiki/AdviceforStudents&quot;&gt;student applications&lt;/a&gt;. Harmony has following proposals together with other &lt;a href=&quot;http://wiki.apache.org/general/SummerOfCode2008&quot;&gt;ASF projects&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-gc-1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Implement the &quot;Compressor&quot; GC proposed by Kermany and Petrank&lt;br /&gt;&lt;br /&gt;Keywords: Java, memory management, GC&lt;br /&gt;&lt;br /&gt;Description: The Compressor garbage collector [1] is a compacting GC that leverages virtual memory support in underlying OS. It compacts the heap in two passes.&lt;br /&gt;[1] Haim Kermany, Erez Petrank: The Compressor: concurrent, incremental, and parallel compaction. PLDI 2006.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Xiao-Feng Li (xiaofeng.li (a) gmail com)&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-gc-2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Implement the &quot;Mapping Collector&quot; proposed by Wegiel and Krintz&lt;br /&gt;&lt;br /&gt;Keywords: Java, memory management, GC&lt;br /&gt;&lt;br /&gt;Description: The Mapping Collector [1] utilizes the virtual memory support in a novel way so that it can compact the heap without moving the objects or fixing the references.&lt;br /&gt;[1] Michal Wegiel and Chandra Krintz, The Mapping Collector: Virtual Memory Support for Generational, Parallel, and Concurrent Compaction, ASPLOS 2008.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Xiao-Feng Li (xiaofeng.li (a) gmail com)&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-gc-3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Write a graphical front-end for Harmony memory management&lt;br /&gt;&lt;br /&gt;Keywords:Java, memory management, GC&lt;br /&gt;&lt;br /&gt;Description: Harmony runtime needs a graphic front-end visualizing the memory management activities and the runtime status. It can be standalone or better an Eclipse plugin. It can be online display of the runtime execution, or offline processing of the log.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Xiao-Feng Li (xiaofeng.li (a) gmail com)&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-gc-4&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Unify the native memory management of Harmony DRLVM&lt;br /&gt;&lt;br /&gt;Keywords: Java, virtual machine, memory management, GC&lt;br /&gt;&lt;br /&gt;Description: DRLVM uses inconsistent APIs for native memory management, such as APR or malloc or mmap. It is desirable to have a unified API for native memory management. Hopefully the runtime native memory usage can be managed with a global view and then optimized. This layer could be extended to provide the API for Java heap native management as well.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Xiao-Feng Li (xiaofeng.li (a) gmail com)&lt;br /&gt;Andrey Yakushev (andrey.yakushev (a) gmail com )&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-gc-5&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Build a garbage collector for C/C++ programs on the top of Harmony&lt;br /&gt;&lt;br /&gt;Keywords: C, C++, memory management, GC&lt;br /&gt;&lt;br /&gt;Description: One may notice a lack of open source effective parallel GC implementation for C/C++ programs. For example, Parrot (Perl 6) community expressed an [WWW] interest in attaching our GC to their code base. If numbers would show some benefit, we might get other adopters of our code base. Successful completion of GC library on the top of Harmony would teach a person in refactoring skills and give a good background in garbage collection.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Alexei Fedotov; Xiao-Feng Li (xiaofeng.li (a) gmail com)&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-tools-1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Implement &quot;Bundle Tool&quot;, a tool to make binary snapshots of Java applications with Harmony&lt;br /&gt;&lt;br /&gt;Keywords: Java, tools&lt;br /&gt;&lt;br /&gt;Description: There is no simple way for Harmony users to define the list of needed classes, jars and native libraries for their applications. Create a tool that creates a Harmony package with the classes and native libraries used by specific application or work flow. First of all this application should collect data from one or multiple application runs and then create a Harmony bundle without unneeded classes and native code.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Egor Pasko; Mark Hindess&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-tools-2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Implement a Java developer&#39;s command line tool&lt;br /&gt;&lt;br /&gt;Keywords: Java, tools&lt;br /&gt;&lt;br /&gt;Description: Harmony is missing several of the tools that ship with the JDK, including jar, jconsole, javaws and policytool. For this task you would implement one of these tools, either in Java or C/C++ if preferred.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Sian January; Mark Hindess&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-vm-1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Support invokedynamic bytecode instruction in Harmony VM and JIT&lt;br /&gt;&lt;br /&gt;Keywords: C++, java, virtual machine, JIT, bytecode, dynamic languages&lt;br /&gt;&lt;br /&gt;Description: Support the [WWW] invokedynamic instruction i.e. the ideas of [WWW] JSR 292 draft. And implement basic support for a dynamic language like Python, Ruby, JavaScript as a proof of concept. We want this language to have dynamic typing, reasonable user base, usable standard library, a set of compatibility tests. Students are free to choose the actual dynamic language. We will discuss the reasoning behind the choice. The code involved is C (VM part) C++ (JIT) and probably some class library part in Java. The task is rather challenging for the summer, hence, will require a lot of interaction with the team on the tricky details. Lots of fun guaranteed.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Egor Pasko&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-vm-2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Integrate Harmony and Jikes RVM&lt;br /&gt;&lt;br /&gt;Keywords: Java, virtual machine, VM&lt;br /&gt;&lt;br /&gt;Description: [WWW] Jikes RVM is a research virtual machine that has been a test bed for many JVM and GC developments. This project will look to integrate the Harmony class libraries with Jikes RVM. This will require work on the VM interfaces (the Jikes RVM is a Java-in-Java VM meaning that current VM interfaces are written in Java rather than native code) as well as exploring how Jikes RVM can be integrated with Harmony&#39;s threading and other runtime models.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Ian Rogers; Tim Ellison (t.p.ellison (a) gmail com)&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-jit-1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Refactor Java Bytecode Translator in Harmony JIT&lt;br /&gt;&lt;br /&gt;Keywords: C++, JIT, bytecode, compilers, Java&lt;br /&gt;&lt;br /&gt;Description: The optimizing JIT (Jitrino.OPT) parses Java bytecode on early stages of method compilation to produce Internal Representation to allow further stages to optimize it. This code is well-tested, but not easy to extend (for example, not easy to teach JIT to understand new types of instructions) The major inconvenience is that translator makes things too complicated by trying to optimize on the fly. The task is to refactor the Java-Bytecode-Translator in the Jitrino.OPT to make the code cleaner and simplify the data structures used. Move optimization to a separate stage. Take care of correctly mapping line number info from bytecode into JIT instructions. Code is C++, but not a tricky style. The student will get an in-depth knowledge of Java bytecode, overall knowledge of just-in-time compilation techniques.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Egor Pasko&lt;br /&gt;&lt;br /&gt;Status: Unassigned&lt;br /&gt;&lt;br /&gt;======================================&lt;br /&gt;&lt;b&gt;Subject ID: harmony-demo-1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Title: Make [WWW] FreeCol game playable on Harmony&lt;br /&gt;&lt;br /&gt;Keywords: Java, games, graphics&lt;br /&gt;&lt;br /&gt;Description: For someone who is interested in a graphical user interface development, enabling one of the most popular strategic games may be an interesting task. Since client API development is not finished, the one who would choose this task might learn designing of areas related to image processing, code development, bug fixing and refactoring. See for [WWW] details on the current status of the project. BTW, you may want to replace [WWW] FreeCol enabling with enabling of your favorite application, and this is welcome.&lt;br /&gt;&lt;br /&gt;Possible Mentors: Alexei Fedotov&lt;br /&gt;&lt;br /&gt;Status: Unassigned</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/7642446820470856520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/7642446820470856520' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/7642446820470856520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/7642446820470856520'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/03/harmony-project-proposals-for-google.html' title='Harmony project proposals for Google Summer of Code 2008'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-7438290427605555388</id><published>2008-03-23T17:33:00.000-07:00</published><updated>2012-06-04T22:34:12.103-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Garbage collection"/><category scheme="http://www.blogger.com/atom/ns#" term="JVM"/><title type='text'>Parallel Compacting Garbage Collectors and their phases</title><content type='html'>I discussed several best known compacting GC sequential algorithm [1]. Now I&#39;d like to focus on the phases of parallel compactors.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Parallel LISP2 Sliding Compactor&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It has four main phases (or heap passes), as shown below.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9sYuOwwMA4nfr_ixxj07Ai88E90YIKdsw5kyGjGRQnK-Mi3fuHPqnmYDYYPrTfuPrEdBzgD0BDxUCQP2gzoJiSrIr5wRDbri6zLdhZZ5scGXVEwU3Q3Hw1WtohxRuzPn-FPejPDc1QRhi/s1600-h/image002.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9sYuOwwMA4nfr_ixxj07Ai88E90YIKdsw5kyGjGRQnK-Mi3fuHPqnmYDYYPrTfuPrEdBzgD0BDxUCQP2gzoJiSrIr5wRDbri6zLdhZZ5scGXVEwU3Q3Hw1WtohxRuzPn-FPejPDc1QRhi/s320/image002.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5181104759541959922&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The key to parallel LISP2 Compactor is to build a dependence list between a target block and its source blocks whose live objects are copied to the target block. The dependence list is built in the first phase when target address is computed.&lt;br /&gt;&lt;br /&gt;LISP2 Compactor stores target address in object header. It has to update the references before moving objects. And it has to put the reference-fixing phase between object-repointing and object-moving phases.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. IBM&#39;s Moving Compactor&lt;/b&gt;&lt;br /&gt;It has three heap passes [2]. &lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPUB_LUQDzKoinQoZwPylBXTEsgBflC9h5XFOYbbqMeWA9Z0T3ZRcg34hmaQ82NSMSDtv4caRM5yT268WIdigjcbzxXpEAGvTqXfELY7mlzAH8Iih_89SI2QboaluhXSVzvkIBE09sr-6F/s1600-h/image004.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPUB_LUQDzKoinQoZwPylBXTEsgBflC9h5XFOYbbqMeWA9Z0T3ZRcg34hmaQ82NSMSDtv4caRM5yT268WIdigjcbzxXpEAGvTqXfELY7mlzAH8Iih_89SI2QboaluhXSVzvkIBE09sr-6F/s320/image004.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5181104965700390146&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The key of Moving Compactor is, it uses an &lt;b&gt;offset table&lt;/b&gt;, which stores the target address of the live objects. This avoids the overwriting of the target address info by a moved object, so that the references in heap can be updated any time (in any phase). Here it fixes the references after object moving phase. &lt;br /&gt;&lt;br&gt;&lt;br /&gt;A note added on 2009-1-15: Recently (2009-1-12), one of the authors of this compactor, Diab Abuaiadh, told me the following in his email: &quot;It is simple to convert the algorithm to a one (heap) pass compaction by delaying moving the objects from first phase to second phase. This involves minor changes to the original algorithm. This change reduces the pause time while it has no negative impact on the locality of reference&quot;. Diab did not disclose the details about the &quot;minor changes&quot; required. It is unknown how similar it is to the STW Compactor of Compressor described below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. STW Compactor of Compressor&lt;/b&gt;&lt;br /&gt;The Stop-the-world compactor of Compressor [3] has 2 heap passes and 1 mark-bit table pass, hence having 2.5 phases if we consider the mark table traversal much more light-weighted.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDC6NxVeNPDseCV0USnNK9J7El27V7hwRsKV4ZGUt-uXDsWFubJv7zVpnsKv3krEMyEA3pa4GEo_C96JUNUzct9smScfU5UnhjzAcioWktWVULMAIxQZtmIsTU0JIJqqQYwK7N1YTJ5XqK/s1600-h/image006.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDC6NxVeNPDseCV0USnNK9J7El27V7hwRsKV4ZGUt-uXDsWFubJv7zVpnsKv3krEMyEA3pa4GEo_C96JUNUzct9smScfU5UnhjzAcioWktWVULMAIxQZtmIsTU0JIJqqQYwK7N1YTJ5XqK/s320/image006.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5181105077369539858&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The key of Compressor is that it computes object target address without traversing the heap; instead, it goes through a separate &lt;b&gt;mark table&lt;/b&gt;, which encodes the location and &lt;b&gt;size&lt;/b&gt; of live objects. &lt;br /&gt;&lt;br /&gt;Compressor combines the object-moving and reference-fixing phases into one. This is impossible in IBM&#39;s Moving compactor, because there the target address was not ready for all live object during object-moving.&lt;br /&gt;&lt;br /&gt;Sliding Compactor and Moving Compactor do not need the separate mark-bit table.&lt;br /&gt;&lt;br /&gt;Compressor is an improvement by combining the Sliding Compactor and Moving Compactor. Compared to Sliding Compactor, Compressor contracts the Object-repointing phase into a mark-bit table traversal by employing the mark-bit table. It writes the target address in an offset table. Then it can combine the object-moving and reference-fixing phases into one. So algorithm-wise, Compressor is similar to Sliding Compactor -- but optimized with two additional data structures (mark table and offset table).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Mapping Collector&lt;/b&gt;&lt;br /&gt;Mapping collector optimizes the phases further [4]. It does not move objects, hence no reference-fixing either. The idea is to simply unmap the pages that hold only garbage. These pages can be found by traversing mark-bit table. So it has one heap pass for marking and a mark-bit table pass, might be considered as to have 1.5 phases.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYNoC8F4-rjGPEMxxsGQnO850irYIaCjDHrjF9HJm3jzsuuvLXbmPLKN80Ug3qok9HYEgRML2BTBkDHsggf1UNtEY_CUZslGKknycuMBqAmEQYif6qBDF-J0Re4zdbbNEOWNYSMLc7i9pG/s1600-h/image008.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYNoC8F4-rjGPEMxxsGQnO850irYIaCjDHrjF9HJm3jzsuuvLXbmPLKN80Ug3qok9HYEgRML2BTBkDHsggf1UNtEY_CUZslGKknycuMBqAmEQYif6qBDF-J0Re4zdbbNEOWNYSMLc7i9pG/s320/image008.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5181105193333656866&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The key of Mapping Collector is, it leverages OS&#39;s virtual memory support. It leverages a fact (or an important observation): object address is virtual address, to move a object means changing virtual address. But it is still virtual. While the goal of garbage collection is to free up the physical memory, it is good enough if we can free the memory occupied by the garbage. The only issue is, we should be able to expand the virtual space in one end of the heap to achieve a large contiguous free area. Then it attains the two goals of a compacting GC: &lt;br /&gt;a) to squeeze the garbage space out of the heap; Mapping Collector implements by unmapping the pages holding garbage.&lt;br /&gt;b) to get a contiguous free area; Mapping Collector implements by mapping the pages in one end of the heap.&lt;br /&gt;&lt;br /&gt;The blog entry stops here. The last words I would put are: the phases of the compactors do not necessarily imply their performance in a linear way. There are some other factors impacting the overall achieved performance besides phases, such as space overhead.&lt;br /&gt;&lt;br /&gt;[1] http://xiao-feng.blogspot.com/2007/04/sequential-compacting-garbage-collector.html&lt;br /&gt;[2]Diab Abuaiadh, Yoav Ossia, Erez Petrank, and Uri Silbershtein. An efficient parallel heap compaction algorithm. In OOPSLA&#39;04.&lt;br /&gt;[3]Haim Kermany, Erez Petrank: The Compressor: concurrent, incremental, and parallel compaction. PLDI 2006.&lt;br /&gt;[4]Michal Wegiel and Chandra Krintz, The Mapping Collector: Virtual Memory Support for Generational, Parallel, and Concurrent Compaction, ASPLOS 2008.</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/7438290427605555388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/7438290427605555388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/7438290427605555388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/7438290427605555388'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/03/parallel-compacting-garbage-collectors.html' title='Parallel Compacting Garbage Collectors and their phases'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9sYuOwwMA4nfr_ixxj07Ai88E90YIKdsw5kyGjGRQnK-Mi3fuHPqnmYDYYPrTfuPrEdBzgD0BDxUCQP2gzoJiSrIr5wRDbri6zLdhZZ5scGXVEwU3Q3Hw1WtohxRuzPn-FPejPDc1QRhi/s72-c/image002.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-900592501596028692</id><published>2008-02-29T07:05:00.000-08:00</published><updated>2012-06-04T22:36:30.134-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache Harmony"/><category scheme="http://www.blogger.com/atom/ns#" term="Garbage collection"/><title type='text'>[Harmony GC Internal] SemiSpace garbage collector</title><content type='html'>Harmony has implemented a variant of the semi-space garbage collector with dynamic from-space and to-space size so as to get the best possible performance.&lt;br /&gt;&lt;br /&gt;The idea of the semi-space GC is to partition the space into two halves. Mutators always allocate in the from-space; when it is full, collectors copy the live objects from the from-space to the to-space,  and then flip the roles of the two half spaces.&lt;br /&gt;&lt;br /&gt;The advantage of the semi-space GC is that, it is a full copying GC, which is known to be efficient when the objects surviving ratio is low. There are basically two usage models of semi-space GC: one is to avoid the compacting collection, the other is to act as a generational collection.&lt;br /&gt;&lt;br /&gt;To avoid the compacting collection requires to reserve to-space for copying. But it should be as small as possible to keep high heap utilization. We only need to reserve adequate to-space and leave the rest space to from-space.&lt;br /&gt;&lt;br /&gt;To leverage the generational property requires to copy the survivors from from-space to to-space. But we do not want to copy the long-live objects back and forth between the two half-spaces many times. We should promote the long-live objects out of the semi-space generation to another mature object space.&lt;br /&gt;&lt;br /&gt;The ideas above brought us the Harmony semi-space GC design. Below is the heap layout and minor collection illustrations.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyo-2p_gXvC3WRY_GomiUUuuXAr3-60jocbqgysDGQhPzPop3rugrEcfstT8lS4AVUxbvDIAIyALlMD5IhqwWGxaGvQk2y9GlLS5Xl2pXRnbhsnWnQgcmrbxY8iaXibd8UotKa_50rkjhc/s1600-h/SemiSpace-GC-a.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyo-2p_gXvC3WRY_GomiUUuuXAr3-60jocbqgysDGQhPzPop3rugrEcfstT8lS4AVUxbvDIAIyALlMD5IhqwWGxaGvQk2y9GlLS5Xl2pXRnbhsnWnQgcmrbxY8iaXibd8UotKa_50rkjhc/s320/SemiSpace-GC-a.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5172593854962713346&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0T55NiVwMXnyO-p-EVeQP7VmOYs1w3WocaLVfGkP_TeD_MMXAnXXRj-uHthewnMTqvHUnVC-RwdliaascG_Qz2RX6WQ0C-yfTErWrePRoYiY8H14LMi7B-fTWLFnNzrxYjI011aCD69pO/s1600-h/SemiSpace-GC-b.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0T55NiVwMXnyO-p-EVeQP7VmOYs1w3WocaLVfGkP_TeD_MMXAnXXRj-uHthewnMTqvHUnVC-RwdliaascG_Qz2RX6WQ0C-yfTErWrePRoYiY8H14LMi7B-fTWLFnNzrxYjI011aCD69pO/s320/SemiSpace-GC-b.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5172594086890947346&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NOS is always used for mutator allocation. Part of from-space is occupied by the survivors from last minor collection, the rest of the from-space is also used for mutator allocation. To-space is empty reserved for next minor collection. In a minor collection, the survivors of the newly allocated objects since last collection are copied to the to-space. The last-time survivors in from-space will be promoted to MOS, when they are older than a certain age. In current implementation, the age threshold is simply set to be one. That&#39;s good enough in our experiments. &lt;br /&gt;&lt;br /&gt;When the survivors are promoted to MOS, the boundary between MOS and NOS is shifted to NOS size so as to reserve some MOS space for next time survivor promotion. &lt;br /&gt;&lt;br /&gt;With careful design and tuning, we can give the MOS reserve space and the to-space only adequate sizes for copying accommodation. The problem is how about if the size is not enough in certain collection due to the application behavior change. &lt;br /&gt;&lt;br /&gt;In Harmony GC, if the to-space is not enough to hold all the new survivors, they can be copied to MOS directly as the older survivors. If the MOS reserve space is not enough to hold all survivors (old or new) promoted, a fallback mechanism is used. That is, the minor collection will switch to a entire-heap compacting collection, which will compact all the live objects in heap to the low end of MOS.</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/900592501596028692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/900592501596028692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/900592501596028692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/900592501596028692'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/02/harmony-gc-internal-semi-space-garbage.html' title='[Harmony GC Internal] SemiSpace garbage collector'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyo-2p_gXvC3WRY_GomiUUuuXAr3-60jocbqgysDGQhPzPop3rugrEcfstT8lS4AVUxbvDIAIyALlMD5IhqwWGxaGvQk2y9GlLS5Xl2pXRnbhsnWnQgcmrbxY8iaXibd8UotKa_50rkjhc/s72-c/SemiSpace-GC-a.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-3206739999884189492</id><published>2008-02-06T23:28:00.000-08:00</published><updated>2008-02-23T01:19:31.976-08:00</updated><title type='text'>Linux内核管理风格 (Linux kernel management style)</title><content type='html'>（中文翻译：Xiao-Feng Li）&lt;br /&gt;&lt;br /&gt;这个短文档介绍了Linux内核所偏爱的（或“造作的”--看你问谁了）管理风格。目的是与文档《CodingStyle》的内容在某种程度上相呼应，主要是为了避免一遍又一遍地回答[1]同样（或类似）的问题。&lt;br /&gt;&lt;br /&gt;管理风格非常个人化，很难量化，比几条简单的关于编码风格的规定要难多了，因此这个文档与实际可能有联系，也可能没有联系。开始写时只是闹着玩的，不过也不能说它完全没用。这个只能由你自己决定了。&lt;br /&gt;&lt;br /&gt;顺便说一句，当提到“内核管理者”时，指的是技术带头人，而不是公司里的那些传统的管理人员。如果你在你们公司里要签单、或者对你们部门的预算有点儿概念的话，那你基本上可以肯定不是内核管理者。因此这里的建议可能不一定对你有用。&lt;br /&gt;&lt;br /&gt;首先，我建议你买一本《高度成功人士的七个习惯》，_不_要读它。烧掉它，这是一个很重要的象征性姿态。&lt;br /&gt;&lt;br /&gt;[1] 本文档并没有真地回答什么问题，而是要让提问题的人不得不明白：我们并不知道答案是什么。&lt;br /&gt;&lt;br /&gt;好吧，下面开讲：&lt;br /&gt;&lt;br /&gt;                第一章：决定&lt;br /&gt;&lt;br /&gt;大家都以为是管理者在做决定，而且以为做决定很重要。以为决定越大、越难，管理者就一定越高层。这看起来很深刻也很明显，其实不一定正确。&lt;br /&gt;&lt;br /&gt;问题的诀窍在于_避免_做决定。特别是当有人对你说“请选择(a)或(b)，我们真地需要你做出决定”时，你作为一个管理者就有麻烦了。因为你管理的人应该比你知道更多的细节，如果他们需要你来做出技术决定，你一定麻烦大了。显然你没有能力替他们做出决定。&lt;br /&gt;&lt;br /&gt;（推论：如果你的手下不比你了解更多的细节，你一样死定了，尽管死的原因与前面完全不同。这种情况下，看起来你不适合这个管理工作，应该是_他们_来管理你的才华才对。）&lt;br /&gt;&lt;br /&gt;因此问题的诀窍是_避免_做决定，至少避免做大的、难的决定。可以做一些小的、没有什么后果的决定，这会让你看起来象是知道你自己在做什么。所以内核管理者要做的就是把大的、难的决定转变成没人在意的小问题。&lt;br /&gt;&lt;br /&gt;需要明白的是，大决定和小决定之间的真正区别在于：你是否可以在后来修正你的决定。任何决定都可以变成一个小决定，只要你能确保下面这条：即在你可能错了的时候（你_一定_会错的），你总能回过头将其影响消除。这样，突然之间，你变得具有两倍的管理才能：你做出了_两个_没有后果的决定--一个错误的_和_一个正确的。&lt;br /&gt;&lt;br /&gt;而且人们甚至会认为这是真正的领袖素质（咳，狗屁，咳）。&lt;br /&gt;&lt;br /&gt;这样，避免做决定的关键就变成了如何避免做任何不能挽回的事情。不要被堵在一个无处逃生的死胡同。死胡同里的耗子会很危险--而一个死胡同里的管理者就太可怜了。&lt;br /&gt;&lt;br /&gt;实践证明，由于_在任何情况下_都没有人会蠢到真得让内核管理者去承担巨大的财政责任，因此Linux内核中的决定通常是很容易挽回的。既然你没有机会糟蹋掉一大笔你还不起的钱，你需要挽回的也就是一个技术决定而已；而对技术决定来说，挽回措施也相当容易：只需要告诉别人你是一个手生的笨蛋，说你很抱歉，然后去除那些你让大家在过去的一年里做的没用的东西。立刻，你一年前所做的决定就根本不是一个大决定了，因为它的影响可以被轻易地消除。&lt;br /&gt;&lt;br /&gt;实践证明有些人对这个方法不是很适应，由于下面的两个原因：&lt;br /&gt; - 承认自己是个白痴比想像的要难。我们都要维护自己的形象，到大庭广众之下说自己错了有时候的确非常困难。&lt;br /&gt; - 对那些可怜的底层工程师来说，要别人告诉他们去年做的东西完全没用会有些难度。尽管实际的_工作_本身可以简单地删除掉，你却可能不可挽回地失去那个工程师的信任。记住：“不可挽回”是我们首要竭力避免的，因此你的决定最终还是成了一个大决定。&lt;br /&gt;&lt;br /&gt;比较愉快的是，这两个问题的难度都可以被有效地降低：只要你实现承认自己不是特别明白；并在实施之前告诉大家，你的决定很初步，很有可能是错的。你应该一直保留改变主意的权利，并让大家非常_清楚_这一点。其实，在你还没有做蠢事之前承认自己愚蠢，要比做了之后要容易的多。&lt;br /&gt;&lt;br /&gt;这样，当最终被证明是件蠢事时，人们最多也就转转眼睛，说“唉，他又犯傻了”。&lt;br /&gt;&lt;br /&gt;这种事先承认没有把握的做法，也会让那些真正干活的人好好想想是否值得做这件事。千万记住，如果连_他们_都不能肯定，你一定不要用许诺的方法来鼓励他们，即承诺他们的工作会被加到Linux内核中。还是要让他们在启动一项大任务之前深思熟虑一下。&lt;br /&gt;&lt;br /&gt;记住：他们会比你知道更多的细节，而且他们通常认为他们对一切相关问题都已了然于胸。这个时候，管理者最好不要再去给他们吃定心丸了，而是给他们一剂用挑剔的眼光审视任务的苦口良药。&lt;br /&gt;&lt;br /&gt;顺便提一句，另一种避免做决定的办法是简单地嗔怪道：“我们不能两个都做吗？”并做出一副可怜相。相信我，这的确有效。如果还不清楚到底那个方法更好，他们最终一定会搞清楚的。很可能的结果是，两个小组都对结论感到失望并就此放弃。&lt;br /&gt;&lt;br /&gt;放弃听起来似乎是个失败，但这通常是一个信号，表明两个项目都有问题，而两个小组的成员都不能下决定的原因可能就是因为他们都错了。这样你最后倒成了香饽饽，而且你还避免了又一个可能让你死菜的决定。&lt;br /&gt;&lt;br /&gt;                第二章：人&lt;br /&gt;&lt;br /&gt;大多数人是白痴，做为管理者，你必须面对现实、和他们周旋。或许更重要的是，_他们_必须要和_你_周旋。&lt;br /&gt;&lt;br /&gt;事实证明，虽然消除技术错误很容易，消除人性的混乱却不容易。你必须与别人的个性共处--以及与你自己的个性共处。&lt;br /&gt;&lt;br /&gt;不过，要准备成为一个内核管理者，你最好记着不要断了自己的后路、殃及无辜、或与太多的内核开发者作对。事实证明，与人闹翻很容易，可再想和好就不容易了。因此“闹翻”立刻可以归类为“不可挽回”的行为；按照第一章，绝对应该避免。&lt;br /&gt;&lt;br /&gt;有几条简单的规则：&lt;br /&gt; (1) 不要称呼别人“蠢货” （至少不要在公开场合）&lt;br /&gt; (2) 当你忘了(1)时，就学会道歉&lt;br /&gt;&lt;br /&gt;(1)的问题是它太容易违反了。你可以有一万种不同的方式骂别人“蠢货”[2]，有时候你甚至都没有意识到，而且哪一次你都是不可抑制地义愤填膺。&lt;br /&gt;&lt;br /&gt;而且你越是相信你是对的（面对现实吧，你其实可以称呼_任何人_“蠢货”，而且你总_会_是对的），事后道歉对你来说会越难。&lt;br /&gt;&lt;br /&gt;要解决这个问题，你只有两个选择：&lt;br /&gt; - 成为道歉高手&lt;br /&gt; - 把你的“爱”均匀播洒，让大家觉得你的出手是公平的。你得有点儿创意，这样他们有时候可能还会觉得挺好玩儿的。&lt;br /&gt;&lt;br /&gt;希望靠着礼貌把一切摆平是不可能的。没有人会信任一个明显隐藏自己真实性情的人。&lt;br /&gt;&lt;br /&gt;[2]保罗西蒙过去唱《失去爱人方法五十种》，那是因为很明白，《告诉一个开发者是蠢货的方法一万种》听起来没有前者那么有韵味。不过我相信他考虑过后者。&lt;br /&gt;&lt;br /&gt;                第三章：人 II - 好的那类&lt;br /&gt;&lt;br /&gt;既然事实表明大多数人都是白痴，那结论自然很可悲：你也是一位。另外，即使我们都暗自觉得自己高于普通人（承认吧，没有人认为自己是普通人甚至不如普通人），我们也要承认我们不是那只最锋利的刀子，总有人没有你那么白痴。&lt;br /&gt;&lt;br /&gt;有些人容不下聪明人。有些人则会利用他们。&lt;br /&gt;&lt;br /&gt;作为一个内核的维护者，你要确保你属于第二种。你要紧随聪明人，因为他们能让你的工作变得容易。特别是，他们能替你做决定。这就是问题所在。&lt;br /&gt;&lt;br /&gt;因此，如果你发现有人比你聪明，那就顺水推舟吧。之后你的管理任务就变成诸如“听起来不错--去搞吧”，或者“这个听起来挺好，不过那个xxx怎么样？”。特别是第二种说法，你要么能跟着学点儿“xxx”的东西，要么能显示_额外_的管理才干，因为你指出了一些聪明人没有想过的东西。不管是哪种情况，你都是赢家。&lt;br /&gt;&lt;br /&gt;值得提出的是，你要明白，在一个领域的牛人在另一个领域就不一定了。因此尽管你可能在几个不同的方向上给与引导激励，需要承认的是，他们可能只在他们自己的领域是专家，而在其它领域一无是处。值得庆幸的是，人们会自然地象被引力吸引一样被拉回他们擅长的领域。因此，只要你不是激励的太厉害，那么即使你真地在其它方向上引导了他们，也不至于造成不可挽回的后果。&lt;br /&gt;&lt;br /&gt;                第四章：责任追究&lt;br /&gt;&lt;br /&gt;任何事情都回出错，因此人们需要找个人来承担责任。不好意思，你就是这个人。&lt;br /&gt;&lt;br /&gt;承担责任其实并不困难，特别是当人们明白并不全是你的错。这给我们提醒了一种最好的承担责任的方式：承担他人的责任。你会因为替人受过而感觉高尚，他也会因为免于责任而感觉不错。那个由于你的过错而丢失了36GB色情收藏的家伙也不得不承认，你至少没有试图逃避责任。&lt;br /&gt;&lt;br /&gt;然后你要_私下里_让那个真正把事情搞砸的人（如果你能找出他来）知道，是他把事情搞砸了。并不是说他因此就可以避免以后再出问题，而是因此他知道他欠你一个人情。而且，也许更重要的是，他很可能也是那个能修正问题的人；因为，我们得承认，那个人肯定不是你。&lt;br /&gt;&lt;br /&gt;承担责任也是你能成为管理者的首要原因。这是别人愿意信任你、并给你可能的荣誉的部分原因，因为正是你能站出来说“是我搞砸了”。如果你已经遵循了前面的规则，现在说这句话对你来说应该很容易了。&lt;br /&gt;&lt;br /&gt;                &lt;br /&gt;                第五章：需要避免的东西&lt;br /&gt;&lt;br /&gt;有一件事比骂人“蠢货”更让人不能接受，那就是用假惺惺的口气叫人“蠢货”。 前者还可以道歉，后者则没有机会。别人不会再听你的了，即使在你做的很漂亮的时候。&lt;br /&gt;&lt;br /&gt;我们每个人都认为自己比别人强，当别人在充大个时，我们会错误地觉得自己_真地_被看扁了。因此，也许你在道德或智力上的确高于他人，但不要太显摆了，除非你是有意要惹恼某个人[3]。&lt;br /&gt;&lt;br /&gt;同样，也不要太礼貌或太微妙了。礼貌很容易过度从而掩盖真正的问题，而且正如人们所说：“在互联网上，没人能听出来你的微妙”。因此，还是要大张旗鼓地摆明你的观点，不能寄望人们能揣摩出你的意思。&lt;br /&gt;&lt;br /&gt;加点儿幽默能中和你的鲁直和说教。如果你过分到显得荒谬，反倒可以达到你的目的，且不会让接受者感到不爽，他只会觉得你傻的可爱。因此幽默可以帮助克服人性的障碍，而这个障碍这是我们在对待批评时所共有的。&lt;br /&gt;&lt;br /&gt;[3]提示：互联网上那些与你的工作无直接关系的讨论组是发泄对他人不满的好地方。每隔一阵儿，带着嘲弄发些讨厌的帖子加入一场论战，会让你感到神清气爽。只是别把垃圾甩在自家门口了。&lt;br /&gt;&lt;br /&gt;                第六章：为什么是我？&lt;br /&gt;&lt;br /&gt;既然你的主要任务是替人受过，并且还要痛苦地让所有的人看出来你是个生手，那么一个显然的问题是：当初干嘛要干这个？&lt;br /&gt;&lt;br /&gt;本质上说，尽管可能不会有十来岁的小姑娘（或小男孩，这里我们不需要提出甄别或扮演性别主义者）尖叫着追到你的更衣室外敲门，你也_必将_由于是“负责人”而获得巨大的个人成就感。尽管你的所谓领导其实就是竭力追上别人并在其后尽力飞奔，你就不要太在意这些了，因为所有的人仍然会认为你就是负责人。&lt;br /&gt;&lt;br /&gt;如果你能把这个问题搞定，那将是一项伟大的成就。&lt;br /&gt;&lt;br /&gt;=======================================================================&lt;br /&gt;Original from http://lwn.net/Articles/105375/&lt;br /&gt;[Posted October 6, 2004 by corbet]&lt;br /&gt;&lt;br /&gt;                Linux kernel management style&lt;br /&gt;&lt;br /&gt;This is a short document describing the preferred (or made up, depending on who you ask) management style for the linux kernel.  It&#39;s meant to mirror the CodingStyle document to some degree, and mainly written to avoid answering (*) the same (or similar) questions over and over again. &lt;br /&gt;&lt;br /&gt;Management style is very personal and much harder to quantify than simple coding style rules, so this document may or may not have anything to do with reality.  It started as a lark, but that doesn&#39;t mean that it might not actually be true. You&#39;ll have to decide for yourself.&lt;br /&gt;&lt;br /&gt;Btw, when talking about &quot;kernel manager&quot;, it&#39;s all about the technical lead persons, not the people who do traditional management inside companies.  If you sign purchase orders or you have any clue about the budget of your group, you&#39;re almost certainly not a kernel manager. These suggestions may or may not apply to you. &lt;br /&gt;&lt;br /&gt;First off, I&#39;d suggest buying &quot;Seven Habits of Highly Successful People&quot;, and NOT read it.  Burn it, it&#39;s a great symbolic gesture. &lt;br /&gt;&lt;br /&gt;(*) This document does so not so much by answering the question, but by making it painfully obvious to the questioner that we don&#39;t have a clue to what the answer is. &lt;br /&gt;&lt;br /&gt;Anyway, here goes:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Chapter 1: Decisions&lt;br /&gt;&lt;br /&gt;Everybody thinks managers make decisions, and that decision-making is important.  The bigger and more painful the decision, the bigger the manager must be to make it.  That&#39;s very deep and obvious, but it&#39;s not actually true. &lt;br /&gt;&lt;br /&gt;The name of the game is to _avoid_ having to make a decision.  In particular, if somebody tells you &quot;choose (a) or (b), we really need you to decide on this&quot;, you&#39;re in trouble as a manager.  The people you manage had better know the details better than you, so if they come to you for a technical decision, you&#39;re screwed.  You&#39;re clearly not competent to make that decision for them. &lt;br /&gt;&lt;br /&gt;(Corollary:if the people you manage don&#39;t know the details better than you, you&#39;re also screwed, although for a totally different reason. Namely that you are in the wrong job, and that _they_ should be managing your brilliance instead). &lt;br /&gt;&lt;br /&gt;So the name of the game is to _avoid_ decisions, at least the big and painful ones.  Making small and non-consequential decisions is fine, and makes you look like you know what you&#39;re doing, so what a kernel manager needs to do is to turn the big and painful ones into small things where nobody really cares. &lt;br /&gt;&lt;br /&gt;It helps to realize that the key difference between a big decision and a small one is whether you can fix your decision afterwards.  Any decision can be made small by just always making sure that if you were wrong (and you _will_ be wrong), you can always undo the damage later by backtracking.  Suddenly, you get to be doubly managerial for making _two_ inconsequential decisions - the wrong one _and_ the right one. &lt;br /&gt;&lt;br /&gt;And people will even see that as true leadership (*cough* bullshit *cough*).&lt;br /&gt;&lt;br /&gt;Thus the key to avoiding big decisions becomes to just avoiding to do things that can&#39;t be undone.  Don&#39;t get ushered into a corner from which you cannot escape.  A cornered rat may be dangerous - a cornered manager is just pitiful. &lt;br /&gt;&lt;br /&gt;It turns out that since nobody would be stupid enough to ever really let a kernel manager have huge fiscal responsibility _anyway_, it&#39;s usually fairly easy to backtrack.  Since you&#39;re not going to be able to waste huge amounts of money that you might not be able to repay, the only thing you can backtrack on is a technical decision, and there back-tracking is very easy: just tell everybody that you were an incompetent nincompoop, say you&#39;re sorry, and undo all the worthless work you had people work on for the last year.  Suddenly the decision you made a year ago wasn&#39;t a big decision after all, since it could be easily undone. &lt;br /&gt;&lt;br /&gt;It turns out that some people have trouble with this approach, for two reasons:&lt;br /&gt; - admitting you were an idiot is harder than it looks.  We all like to maintain appearances, and coming out in public to say that you were wrong is sometimes very hard indeed. &lt;br /&gt; - having somebody tell you that what you worked on for the last year wasn&#39;t worthwhile after all can be hard on the poor lowly engineers too, and while the actual _work_ was easy enough to undo by just deleting it, you may have irrevocably lost the trust of that engineer.  And remember: &quot;irrevocable&quot; was what we tried to avoid in the first place, and your decision ended up being a big one after all. &lt;br /&gt;&lt;br /&gt;Happily, both of these reasons can be mitigated effectively by just admitting up-front that you don&#39;t have a friggin&#39; clue, and telling people ahead of the fact that your decision is purely preliminary, and might be the wrong thing.  You should always reserve the right to change your mind, and make people very _aware_ of that.  And it&#39;s much easier to admit that you are stupid when you haven&#39;t _yet_ done the really stupid thing.&lt;br /&gt;&lt;br /&gt;Then, when it really does turn out to be stupid, people just roll their eyes and say &quot;Oops, he did it again&quot;.  &lt;br /&gt;&lt;br /&gt;This preemptive admission of incompetence might also make the people who actually do the work also think twice about whether it&#39;s worth doing or not.  After all, if _they_ aren&#39;t certain whether it&#39;s a good idea, you sure as hell shouldn&#39;t encourage them by promising them that what they work on will be included.  Make them at least think twice before they embark on a big endeavor. &lt;br /&gt;&lt;br /&gt;Remember: they&#39;d better know more about the details than you do, and they usually already think they have the answer to everything.  The best thing you can do as a manager is not to instill confidence, but rather a healthy dose of critical thinking on what they do. &lt;br /&gt;&lt;br /&gt;Btw, another way to avoid a decision is to plaintively just whine &quot;can&#39;t we just do both?&quot; and look pitiful.  Trust me, it works.  If it&#39;s not clear which approach is better, they&#39;ll eventually figure it out.  The answer may end up being that both teams get so frustrated by the situation that they just give up. &lt;br /&gt;&lt;br /&gt;That may sound like a failure, but it&#39;s usually a sign that there was something wrong with both projects, and the reason the people involved couldn&#39;t decide was that they were both wrong.  You end up coming up smelling like roses, and you avoided yet another decision that you could have screwed up on. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Chapter 2: People&lt;br /&gt;&lt;br /&gt;Most people are idiots, and being a manager means you&#39;ll have to deal with it, and perhaps more importantly, that _they_ have to deal with _you_. &lt;br /&gt;&lt;br /&gt;It turns out that while it&#39;s easy to undo technical mistakes, it&#39;s not as easy to undo personality disorders.  You just have to live with theirs - and yours. &lt;br /&gt;&lt;br /&gt;However, in order to prepare yourself as a kernel manager, it&#39;s best to remember not to burn any bridges, bomb any innocent villagers, or alienate too many kernel developers. It turns out that alienating people is fairly easy, and un-alienating them is hard. Thus &quot;alienating&quot; immediately falls under the heading of &quot;not reversible&quot;, and becomes a no-no according to Chapter 1.&lt;br /&gt;&lt;br /&gt;There&#39;s just a few simple rules here:&lt;br /&gt; (1) don&#39;t call people d*ckheads (at least not in public)&lt;br /&gt; (2) learn how to apologize when you forgot rule (1)&lt;br /&gt;&lt;br /&gt;The problem with #1 is that it&#39;s very easy to do, since you can say &quot;you&#39;re a d*ckhead&quot; in millions of different ways (*), sometimes without even realizing it, and almost always with a white-hot conviction that you are right. &lt;br /&gt;&lt;br /&gt;And the more convinced you are that you are right (and let&#39;s face it, you can call just about _anybody_ a d*ckhead, and you often _will_ be right), the harder it ends up being to apologize afterwards. &lt;br /&gt;&lt;br /&gt;To solve this problem, you really only have two options:&lt;br /&gt; - get really good at apologies&lt;br /&gt; - spread the &quot;love&quot; out so evenly that nobody really ends up feeling like they get unfairly targeted.  Make it inventive enough, and they might even be amused. &lt;br /&gt;&lt;br /&gt;The option of being unfailingly polite really doesn&#39;t exist. Nobody will trust somebody who is so clearly hiding his true character.&lt;br /&gt;&lt;br /&gt;(*) Paul Simon sang &quot;Fifty Ways to Lose Your Lover&quot;, because quite frankly, &quot;A Million Ways to Tell a Developer He Is a D*ckhead&quot; doesn&#39;t scan nearly as well.  But I&#39;m sure he thought about it. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Chapter 3: People II - the Good Kind&lt;br /&gt;&lt;br /&gt;While it turns out that most people are idiots, the corollary to that is sadly that you are one too, and that while we can all bask in the secure knowledge that we&#39;re better than the average person (let&#39;s face it, nobody ever believes that they&#39;re average or below-average), we should also admit that we&#39;re not the sharpest knife around, and there will be other people that are less of an idiot that you are. &lt;br /&gt;&lt;br /&gt;Some people react badly to smart people.  Others take advantage of them. &lt;br /&gt;&lt;br /&gt;Make sure that you, as a kernel maintainer, are in the second group. Suck up to them, because they are the people who will make your job easier. In particular, they&#39;ll be able to make your decisions for you, which is what the game is all about.&lt;br /&gt;&lt;br /&gt;So when you find somebody smarter than you are, just coast along.  Your management responsibilities largely become ones of saying &quot;Sounds like a good idea - go wild&quot;, or &quot;That sounds good, but what about xxx?&quot;.  The second version in particular is a great way to either learn something new about &quot;xxx&quot; or seem _extra_ managerial by pointing out something the smarter person hadn&#39;t thought about.  In either case, you win.&lt;br /&gt;&lt;br /&gt;One thing to look out for is to realize that greatness in one area does not necessarily translate to other areas.  So you might prod people in specific directions, but let&#39;s face it, they might be good at what they do, and suck at everything else.  The good news is that people tend to naturally gravitate back to what they are good at, so it&#39;s not like you are doing something irreversible when you _do_ prod them in some&lt;br /&gt;direction, just don&#39;t push too hard.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Chapter 4: Placing blame&lt;br /&gt;&lt;br /&gt;Things will go wrong, and people want somebody to blame. Tag, you&#39;re it.&lt;br /&gt;&lt;br /&gt;It&#39;s not actually that hard to accept the blame, especially if people kind of realize that it wasn&#39;t _all_ your fault.  Which brings us to the best way of taking the blame: do it for another guy. You&#39;ll feel good for taking the fall, he&#39;ll feel good about not getting blamed, and the guy who lost his whole 36GB porn-collection because of your incompetence will grudgingly admit that you at least didn&#39;t try to weasel out of it.&lt;br /&gt;&lt;br /&gt;Then make the developer who really screwed up (if you can find him) know _in_private_ that he screwed up.  Not just so he can avoid it in the future, but so that he knows he owes you one.  And, perhaps even more importantly, he&#39;s also likely the person who can fix it.  Because, let&#39;s face it, it sure ain&#39;t you. &lt;br /&gt;&lt;br /&gt;Taking the blame is also why you get to be manager in the first place. It&#39;s part of what makes people trust you, and allow you the potential glory, because you&#39;re the one who gets to say &quot;I screwed up&quot;.  And if you&#39;ve followed the previous rules, you&#39;ll be pretty good at saying that by now. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Chapter 5: Things to avoid&lt;br /&gt;&lt;br /&gt;There&#39;s one thing people hate even more than being called &quot;d*ckhead&quot;, and that is being called a &quot;d*ckhead&quot; in a sanctimonious voice.  The first you can apologize for, the second one you won&#39;t really get the chance.  They likely will no longer be listening even if you otherwise do a good job. &lt;br /&gt;&lt;br /&gt;We all think we&#39;re better than anybody else, which means that when somebody else puts on airs, it _really_ rubs us the wrong way.  You may be morally and intellectually superior to everybody around you, but don&#39;t try to make it too obvious unless you really _intend_ to irritate somebody (*). &lt;br /&gt;&lt;br /&gt;Similarly, don&#39;t be too polite or subtle about things. Politeness easily ends up going overboard and hiding the problem, and as they say, &quot;On the internet, nobody can hear you being subtle&quot;. Use a big blunt object to hammer the point in, because you can&#39;t really depend on people getting your point otherwise.&lt;br /&gt;&lt;br /&gt;Some humor can help pad both the bluntness and the moralizing.  Going overboard to the point of being ridiculous can drive a point home without making it painful to the recipient, who just thinks you&#39;re being silly.  It can thus help get through the personal mental block we all have about criticism. &lt;br /&gt;&lt;br /&gt;(*) Hint: internet newsgroups that are not directly related to your work are great ways to take out your frustrations at other people. Write insulting posts with a sneer just to get into a good flame every once in a while, and you&#39;ll feel cleansed. Just don&#39;t crap too close to home.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Chapter 6: Why me?&lt;br /&gt;&lt;br /&gt;Since your main responsibility seems to be to take the blame for other peoples mistakes, and make it painfully obvious to everybody else that you&#39;re incompetent, the obvious question becomes one of why do it in the first place?&lt;br /&gt;&lt;br /&gt;First off, while you may or may not get screaming teenage girls (or boys, let&#39;s not be judgmental or sexist here) knocking on your dressing room door, you _will_ get an immense feeling of personal accomplishment for being &quot;in charge&quot;.  Never mind the fact that you&#39;re really leading by trying to keep up with everybody else and running after them as fast as you can.  Everybody will still think you&#39;re the person in charge. &lt;br /&gt;&lt;br /&gt;It&#39;s a great job if you can hack it.</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/3206739999884189492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/3206739999884189492' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/3206739999884189492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/3206739999884189492'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/02/linux-kernel-management-style-chinese.html' title='Linux内核管理风格 (Linux kernel management style)'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8812827877261189081.post-5522308335255978921</id><published>2008-01-26T03:12:00.000-08:00</published><updated>2019-10-30T14:32:10.436-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Garbage collection"/><title type='text'>GC safe-point (or safepoint) and safe-region</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;b&gt;Root references&lt;/b&gt;&lt;br /&gt;
An object is dead really means it is useless. Only the programmer knows if an object is useless or not. In order for the program to decide if an object is useless, we can use compiler analysis, reference counting, or reachability analysis. &lt;br /&gt;
&lt;br /&gt;
Reachability analysis assumes an object is live as long as it is reachable by the mutator. If an object&#39;s reference is contained by a slot of the mutator&#39;s stack, it&#39;s directly reachable. Those objects reachable from reachable objects are also reachable. So the issue for reachability analysis is to find out the references that are directly reachable, which are root references. The set of root references is root set.&lt;br /&gt;
&lt;br /&gt;
The mutator&#39;s context has the data that are directly reachable, so to get root set is to find object references in the context. The context of a mutator refers to its stack and its register file (and some other thread-specific data). Global data are also directly reachable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Root set enumeration&lt;/b&gt;&lt;br /&gt;
Normally, if a GC uses reachability to determine an object&#39;s liveness, GC needs to get a consistent snapshot of the mutator&#39;s context, so as to enumerate the root references. This is true for both stop-the-world (STW) and concurrent GC (mostly). &quot;Consistent&quot; means the snapshot looks like taken at a single time point. A consistent snapshot of root references are necessary for correctness, otherwise some live objects might be lost. Then the question is how to get the consistent mutator&#39;s context snapshot.&lt;br /&gt;
&lt;br /&gt;
To get the consistent snapshot, a simple way is that the mutator suspends its execution during the root references enumeration. The snapshot is also consistent if the root set does not change during the enumeration process.  &lt;br /&gt;
&lt;br /&gt;
When a mutator suspends its execution, it is not necessarily able to enumerate the root references in its context, unless it book-keeps the reference information in its context. That is, it should be able to tell which stack slots have references, and which registers hold references. If GC can accurately gets the information, it is called precise root set enumeration; or it&#39;s imprecise. &lt;br /&gt;
&lt;br /&gt;
(For imprecise enumeration, GC  has to use some heuristics to conservatively guess the references from the context. So the GC is called conservative GC. This essay only discusses precise enumeration.)&lt;br /&gt;
&lt;br /&gt;
Harmony supports precise root set enumeration with GC safe-point and safe-region.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Safe-point (or safepoint)&lt;/b&gt;&lt;br /&gt;
In order to support precise enumeration, JIT compiler should do additional work, because only JIT knows exactly stack frame info and register contents. When JIT compiles a method, for every instruction, it can book-keep the root reference information in case the execution is suspended at that instruction. &lt;br /&gt;
&lt;br /&gt;
But to remember the info for every instruction is too expensive. It requires substantial space to store the information. This is also unnecessary, because only a few instructions will have the chances to be the suspension points in real execution. JIT only needs to book-keep information for those instruction points -- they are called safe-points. Safe-point means it is a safe suspension point for root set enumeration.&lt;br /&gt;
&lt;br /&gt;
Btw, the ability of a compiler to know exact stack slots&#39; information is not universally available in all programming languages. Only safe languages have the ability. For example, C/C++ doesn&#39;t.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mutator suspension&lt;/b&gt;&lt;br /&gt;
The question to safe-points is, how we can guarantee that the mutator is suspended at safe-point. &lt;br /&gt;
&lt;br /&gt;
There are basically two kinds of approaches to suspend a mutator, preemptively or voluntarily. The preemptive approach is to suspend the mutator whenever GC needs to start a collection. If it finds the mutator is suspended at an unsafe point, it will resume the mutator, rolling it forward to a safe-point. This was implemented in ORP [1], the predecessor of Harmony. But currently almost no JVM takes this approach.&lt;br /&gt;
&lt;br /&gt;
The approach used in Harmony is voluntary suspension. When GC wants to trigger a collection, it simply sets a flag; the mutators poll the flag periodically, and will suspend once they find the flag is set. Those polling points are safe-points. It&#39;s mostly JIT&#39;s responsibility to insert the pollings at proper positions. Sometimes VM also needs to have some polling points.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Polling point&lt;/b&gt;&lt;br /&gt;
So where are the right places for polling GC trigger event? As I discussed above, we do not want to have polling points for every instruction. For voluntary suspension, a more serious problem is the polling overhead. So the basic principles for polling point insertion are: Firstly, polling points should be frequent enough so that GC does not wait too long for a mutator to suspend, because other mutators might be waiting for GC to free the space in order to continue. Secondly, polling points should not be too frequent to introduce big runtime overhead. &lt;br /&gt;
&lt;br /&gt;
The best result is to have only adequate polling points that are necessary and sufficient. &lt;br /&gt;
1. The mandatory polling points are the allocation sites. Allocation can trigger collection, so allocation site has to be a safe point. &lt;br /&gt;
2. Long-time execution are always associated with method call or loop. So call sites and loop back sites are also expected polling points. &lt;br /&gt;
&lt;br /&gt;
Those are the sites for polling points in Harmony: allocation sites, call sites and loop back sites. Mostly the runtime overhead is smaller than 1%. Unfortunately we found safe-point alone is not sufficient. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Safe-region&lt;/b&gt;&lt;br /&gt;
Why is safe-point alone insufficient? The reason is we forgot the case of &quot;long time execution&quot;. We forgot it because it&#39;s actually not &quot;execution&quot;, but long time idle. There are situations when the application can not respond promptly to a GC trigger event, such as sleep, or being blocked in a system call. These operations are out of JVM&#39;s control. It can not respond to GC trigger event in that period. So we introduce safe-region to solve the problem.&lt;br /&gt;
&lt;br /&gt;
Safe-region is the section of code that no references are mutated in it, then it is safe to enumerate roots at any points of that region. In other words, the safe region is a big extended safe-point. &lt;br /&gt;
&lt;br /&gt;
In safe-point design, the mutator polling for GC event will respond if the event is triggered. It responds by setting a ready flag when it&#39;s sure to suspend. Then the GC can proceed with root set enumeration. This is a hand-shaking protocol. &lt;br /&gt;
&lt;br /&gt;
Safe-region just follows this protocol. The mutator sets the ready flag when it enters a safe-region. Before it leaves the region, it checks if GC has finished its enumeration (or collection), and no longer needs the mutator under suspension state. If it&#39;s true, it goes ahead and leaves the region; otherwise, it suspends itself as in a safe-point.&lt;br /&gt;
&lt;br /&gt;
In Harmony implementation, we insert suspend_enable and suspend_disable to delimit the scope of safe-region.&lt;br /&gt;
&lt;br /&gt;
[1] ORP (Open Runtime Platform), http://orp.sf.net ;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://xiao-feng.blogspot.com/feeds/5522308335255978921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8812827877261189081/5522308335255978921' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5522308335255978921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8812827877261189081/posts/default/5522308335255978921'/><link rel='alternate' type='text/html' href='http://xiao-feng.blogspot.com/2008/01/gc-safe-point-and-safe-region.html' title='GC safe-point (or safepoint) and safe-region'/><author><name>Xiao-Feng Li</name><uri>http://www.blogger.com/profile/08325404561142470262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFHSHNZj8GTKYXL_q8enqktZIkQXsDiijpdkkLsL2bPfUiFqSG_10vaqWSDKf6N7V3VVoxU-ke3dR305vKSkZ5TlnmqpfSHpuocasmdrFsnL8Cg9CDb09vTCbyB7bHg/s220/IMG_0163-1.jpg'/></author><thr:total>6</thr:total></entry></feed>