<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Shriphani 'PSP' Palakodety &#187; python</title>
	<atom:link href="http://shriphani.com/blog/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://shriphani.com/blog</link>
	<description>Weblog of an Aspiring Computer Scientist</description>
	<lastBuildDate>Sat, 20 Feb 2010 17:15:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Listener Gets a VAD</title>
		<link>http://shriphani.com/blog/2010/01/21/listener-gets-a-vad/</link>
		<comments>http://shriphani.com/blog/2010/01/21/listener-gets-a-vad/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 01:15:23 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=419</guid>
		<description><![CDATA[So, the beginning of the 4th semester in the midst of losers and overachievers and this sem promises to set my a$$ on fire. As usual, I plan to continue working under Dr. Kihara this sem so that should be interesting. Anyway, I decided to improve upon what listener offered and decided to add a [...]]]></description>
			<content:encoded><![CDATA[<p>So, the beginning of the 4th semester in the midst of losers and overachievers and this sem promises to set my a$$ on fire. As usual, I plan to continue working under Dr. Kihara this sem so that should be interesting. Anyway, I decided to improve upon what listener offered and decided to add a VAD algorithm to it. I initially chose the algorithm by moattar and homayounpur and decided that I ended up with too much to do (it might certainly be a good candidate for later, when I have more time for example). Hence, I decided to snoop around for something simpler and found this paper which seemed small and had a sort of ever changing threshold for successive frames. The paper was authored by S.Milanovic, Z. Lukac and A. Domazetovic. I still don&#8217;t think I got it exactly right though. The paper mentioned that they used counters to mark frames as silence based on what the previous frame was and I had to come with a counter upper bound for myself and finally chose to go with 10 as a good counter for such stuff. i.e. even if a particular frame doesn&#8217;t make it beyond its threshold, it still will be marked as active if the previous frame was active. This is done to accommodate situations where we end up reducing our volume at the end of a word / sentence.</p>
<p>Finally to decide whether there was speech on an overall level, I look for at least 3 instances of 18 consecutive frames being marked as active (just random picks, 18 frames allows 8 active frames and 10 additional for the counter we have and 3 looked like a good candidate at the end when I spoke my own name out).</p>
<p>And as a final measure, I also ensure that the overall intensity beats 48 dB so that someone trying to have a conversation with me is only recognized.</p>
<p>Finally, I made the switch from GeekTool to Growl as this thing kept taking a solid amount of real estate and since I have one 23&#8221; monitor and a 15&#8221; monitor, this thing is positioned outside the real estate of my laptop&#8217;s display. Growl seems like a better candidate overall and since I could get growl bindings to build on my machine finally, I think I should let growl handle this.</p>
<p>So, the only places where my VAD implementation (or my mod of whatever was in that paper) doesn&#8217;t seem to work is in surroundings with a piano (in our dorm&#8217;s lobby for example), v inconvenient but whatever, probably some time in the future, I will begin understanding DSP and spectral analysis well enough to come up with a simple VAD algorithm (as opposed to implementing something straight from a paper without any understanding of what is going on). Anyway, here is the updated script, it seems to do well recognizing speech in sort of silent settings:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="co1">#!/usr/bin/env python</span><br />
<span class="co1">#Author: Shriphani Palakodety</span><br />
<span class="co1">#Tool to aid those with noise cancellation headphones</span></p>
<p><span class="kw1">import</span> pyaudio<br />
<span class="kw1">import</span> <span class="kw3">wave</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span><br />
<span class="kw1">import</span> <span class="kw3">struct</span><br />
<span class="kw1">import</span> numpy<br />
<span class="kw1">import</span> <span class="kw3">time</span></p>
<p>Growl_exists = <span class="kw2">True</span></p>
<p><span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">import</span> Growl<br />
<span class="kw1">except</span> <span class="kw2">ImportError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;No Growl&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Growl_exists = <span class="kw2">False</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">pass</span></p>
<p>skype_on_call = <span class="kw2">False</span><br />
notifier = <span class="nu0">0</span><br />
<span class="kw1">if</span> Growl_exists:<br />
&nbsp; &nbsp; &nbsp; &nbsp; notifier = Growl.<span class="me1">GrowlNotifier</span><span class="br0">&#40;</span><span class="st0">&#8216;Listener&#8217;</span>, &nbsp;<span class="br0">&#91;</span><span class="st0">&#8216;Attention&#8217;</span>, <span class="st0">&#8216;test&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#notifier.applicationName = &#8216;Listener&#8217;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; notifier.<span class="me1">register</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> record<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Records Input From Microphone Using PyAudio&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; duration = <span class="nu0">3</span> <span class="co1">#record for 1 second. Pretty long duration don&#8217;t you think</span><br />
&nbsp; &nbsp; outfile = <span class="st0">&quot;analysis.wav&quot;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; p = pyaudio.<span class="me1">PyAudio</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; inStream = p.<span class="kw2">open</span><span class="br0">&#40;</span>format=pyaudio.<span class="me1">paInt16</span>, channels=<span class="nu0">1</span>, rate=<span class="nu0">44100</span>,<span class="kw2">input</span>=<span class="kw2">True</span>, frames_per_buffer=<span class="nu0">1024</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; out = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; upper_lim = <span class="nu0">44100</span> / <span class="nu0">1024</span> * duration <span class="co1">#upper limit of the range we record to. 44100 / 1024 sized chunk * 5 seconds</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">0</span>, upper_lim<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; data = inStream.<span class="me1">read</span><span class="br0">&#40;</span><span class="nu0">1024</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out.<span class="me1">append</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">#now the writing section where we write to file</span><br />
&nbsp; &nbsp; data = <span class="st0">&#8221;</span>.<span class="me1">join</span><span class="br0">&#40;</span>out<span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span>outfile, <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setnchannels</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setsampwidth</span><span class="br0">&#40;</span>p.<span class="me1">get_sample_size</span><span class="br0">&#40;</span>pyaudio.<span class="me1">paInt16</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setframerate</span><span class="br0">&#40;</span><span class="nu0">44100</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">writeframes</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; analyze<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>
<span class="kw1">def</span> analyze<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">if</span> skype_on_call:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Skype Call In Progress&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Listener On Hold&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><br />
&nbsp; &nbsp; inFile = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&quot;analysis.wav&quot;</span>, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span> <span class="co1">#open a wav file in read mode</span><br />
&nbsp; &nbsp; thresh = <span class="nu0">1000</span> &nbsp;<span class="co1">#establish a minimum threshold</span><br />
&nbsp; &nbsp; max_samp = <span class="nu0">0</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; decision = <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; <span class="co1">#for i in xrange(441):</span></p>
<p>&nbsp; &nbsp; inactive_counter = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; vals = inFile.<span class="me1">readframes</span><span class="br0">&#40;</span>inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="co1">#read in 30 samples</span><br />
&nbsp; &nbsp; <span class="kw2">len</span><span class="br0">&#40;</span>vals<span class="br0">&#41;</span><br />
&nbsp; &nbsp; results = <span class="kw3">struct</span>.<span class="me1">unpack</span><span class="br0">&#40;</span><span class="st0">&quot;%dh&quot;</span>%<span class="br0">&#40;</span>inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, vals<span class="br0">&#41;</span> &nbsp;<span class="co1">#unpack to get the samples</span><br />
&nbsp; &nbsp; results = <span class="br0">&#91;</span><span class="kw2">abs</span><span class="br0">&#40;</span>x<span class="br0">&#41;</span> <span class="kw1">for</span> x <span class="kw1">in</span> results<span class="br0">&#93;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">#now we need to pull 30 samples at a time (30 samples = 1 frame).</span></p>
<p>&nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">4404</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; frame = results<span class="br0">&#91;</span><span class="nu0">30</span>*i: <span class="nu0">30</span>*<span class="br0">&#40;</span>i<span class="nu0">+1</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> frame<br />
&nbsp; &nbsp; &nbsp; &nbsp; new_thresh = <span class="br0">&#40;</span>thresh * <span class="br0">&#40;</span><span class="nu0">1</span> &#8211; <span class="br0">&#40;</span><span class="nu0">2.0</span> ** <span class="nu0">-7</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp;+ &nbsp;<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="nu0">2</span> ** <span class="nu0">-8</span><span class="br0">&#41;</span> * max_samp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#check how many samples go above this new threshold</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; count = <span class="nu0">0</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> frame:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> j &gt; new_thresh:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> count / <span class="nu0">30.0</span> &gt;= <span class="nu0">0.9</span> : &nbsp; <span class="co1">#need it to beat 90%</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#frame is a candidate for speech</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; decision.<span class="me1">append</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#this is where we use a counter based implementation for labelling inactiveness</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> inactive_counter &lt; <span class="nu0">10</span> <span class="kw1">and</span> decision<span class="br0">&#91;</span><span class="nu0">-1</span><span class="br0">&#93;</span> == <span class="nu0">1</span>: <span class="co1">#we ignore silence for 10 runs</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; decision.<span class="me1">append</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inactive_counter += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inactive_counter = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; decision.<span class="me1">append</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#update the threshold and the max sample values</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; thresh = new_thresh<br />
&nbsp; &nbsp; &nbsp; &nbsp; max_samp = <span class="kw2">max</span><span class="br0">&#40;</span>frame<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="co1">#final check for characterization as speech, we use another counter</span><br />
&nbsp; &nbsp; active_counter = <span class="nu0">0</span> <span class="co1">#since the inactive counter will cause silence to be recognized as speech, we only consider speech as </span><br />
&nbsp; &nbsp; <span class="kw1">print</span> decision<br />
&nbsp; &nbsp; final_num = <span class="nu0">0</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> val <span class="kw1">in</span> decision:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> active_counter &gt;= <span class="nu0">18</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Speech!&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final_num += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; active_counter = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> val == <span class="nu0">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; active_counter += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; active_counter = <span class="nu0">0</span></p>
<p>&nbsp; &nbsp; results = <span class="br0">&#91;</span>x ** <span class="nu0">2</span> <span class="kw1">for</span> x <span class="kw1">in</span> results<span class="br0">&#93;</span><br />
&nbsp; &nbsp; intensity = <span class="nu0">20</span> * numpy.<span class="me1">log10</span><span class="br0">&#40;</span>numpy.<span class="me1">sqrt</span><span class="br0">&#40;</span><span class="kw2">sum</span><span class="br0">&#40;</span>results<span class="br0">&#41;</span>/inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">if</span> final_num &gt;= <span class="nu0">3</span> <span class="kw1">and</span> intensity &gt; <span class="nu0">48</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> Growl_exists:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notifier.<span class="me1">notify</span><span class="br0">&#40;</span><span class="st0">&#8216;Attention&#8217;</span>,<span class="st0">&#8216;Listener&#8217;</span>, <span class="st0">&#8216;Speech Detected Nearby&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Speech Detected Nearby!<span class="es0">\n</span>Someone might be calling you&quot;</span><br />
&nbsp; &nbsp; inFile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">if</span> __name__ == <span class="st0">&quot;__main__&quot;</span>:<br />
&nbsp; &nbsp; f = <span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&quot;skype_Status&quot;</span>, <span class="st0">&quot;r&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> new_line <span class="kw1">in</span> f:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> new_line == <span class="st0">&quot;PROGRESS&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; skype_on_call = <span class="kw2">True</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span> skype_on_call:<br />
&nbsp; &nbsp; &nbsp; &nbsp; analyze<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; record<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p> Anyway, it would be really convenient if I could find something about VAD algorithms and improve listener to work better for my dorm room settings. It is doing a pretty good job already but there is always scope for improvement.</p>
<p>As always, my solutions need to be convoluted and over here, I make use of applescript to check if there&#8217;s a skype call going on or not, so yeah, you can find all that <a href="http://shriphani.com/scripts/listener">here</a>.</p>
<p>Screenshots etc available on Listener&#8217;s new home: <a href="http://shriphani.com/blog/listener/">http://shriphani.com/blog/listener/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2010/01/21/listener-gets-a-vad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The One PITA</title>
		<link>http://shriphani.com/blog/2009/11/29/the-one-pita/</link>
		<comments>http://shriphani.com/blog/2009/11/29/the-one-pita/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 05:22:15 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[Daily life]]></category>
		<category><![CDATA[PITA]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=414</guid>
		<description><![CDATA[Well, it is thanksgiving break and I was so far having a decent semester, straight As in all exams (a perfect score in economics &#8211; not that I should be proud of it or anythin) and then terror strikes. Or well whatever the college version of a cataclysm is. I managed to f&#8217;kin ruin (misunderstand) [...]]]></description>
			<content:encoded><![CDATA[<p>Well, it is thanksgiving break and I was so far having a decent semester, straight As in all exams (a perfect score in economics &#8211; not that I should be proud of it or anythin) and then terror strikes. Or well whatever the college version of a cataclysm is. I managed to f&#8217;kin ruin (misunderstand) the spec on a project and I am in danger of throwing away a coveted 4.0 GPA which would have been a great reward for the long hours of study I have put in + a retooling of my schedule so I have the multitasking capability of a mule and those $$ my parents spend so their son can enjoy a pain free life in a first world country and try to make them proud. Well, as it happens, I managed to (or at least I think &#8211; the scores are not yet out) misunderstand a spec AAAAARRRGGHH! In a datastructures course, I mastered AVL &amp; Red-Black trees, spent hours trying to tweak my implementations, did well on the exam and managed to blow it when it came to reading a text file and filling an array. I just wonder how I even pull this stuff off. With Grad School apps coming in 2 years, what will I have to show  &#8211;  a carelessness in even reading specs seriously that puts doubts on the efficacy of my research methodology, I just hope I don&#8217;t cause major problems for myself.</p>
<p>Well, in case this doesn&#8217;t make sense, I managed to misunderstand a technique to populate an array with data (the data structs would work with this but oh no, in my interest to take the maximum from this course, I devoted long hours to getting the data structs right). There is a very good chance that the part I screwed up would end up being insignificant but that is not the point. The point is that once again my grade is going to shuttle between the first two letters of the english alphabet.</p>
<p>Anyway, in all this self hatred that I have been building up for myself, I have managed to learn some cool stuff in Dr. Kihara&#8217;s lab. The work there is pleasant, I can feel good boasting about it and when I talk to my friends&#8217; parents, I can make them believe I am going to find a solution to poverty in 4 years and find a cure for cancer in my spare time (you can see I am not popular).</p>
<p>However, a weird question I was dealing with was that most of the stuff I have written for my work is in Python and it would be cool if I could call it from Java since there are a bunch of people in the lab who use it. I am not looking for something complicated, just want to call a bunch of methods from a Python module. JPype and Jython seem to the things I should be looking for but with my awesome constraints (Python 2.6 should be supported, It should make coffee etc), I will need to use my Uber-GOOGLE-SKILLZ.</p>
<p>Anyway, this blog has managed to get to pagerank 0 (I will interpret that as the pagerank o loner being relevant ) and I am now a suggestion on Google (yay! my plan for world domination is in full swing!)</p>
<p>And I love this Charlie dude who bites his bro&#8217;s finger, as for kanye, well even the prez thinks he&#8217;s a jackass:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/FMbVPMzSqYY&amp;hl=en_US&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/FMbVPMzSqYY&amp;hl=en_US&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/11/29/the-one-pita/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tinkering With A New Project</title>
		<link>http://shriphani.com/blog/2009/09/18/tinkering-with-a-new-project/</link>
		<comments>http://shriphani.com/blog/2009/09/18/tinkering-with-a-new-project/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 16:46:57 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=401</guid>
		<description><![CDATA[During the vacation this summer, I began working on creating an app that would help me respond to calls of attention when my auditory sensory capabilities were compromised courtesy the noise cancellation capabilities of my Bose headsets. Well, I managed to make a few mods to that script, used a touch of applescript (thank god [...]]]></description>
			<content:encoded><![CDATA[<p>During the vacation this summer, I began working on creating an app that would help me respond to calls of attention when my auditory sensory capabilities were compromised courtesy the noise cancellation capabilities of my Bose headsets. Well, I managed to make a few mods to that script, used a touch of applescript (thank god OS X apps are scriptable) and introduced a bunch of new behaviors:</p>
<p>-&gt; When a Skype call is in progress, the app stops listening.</p>
<p>Ok, not a bunch, just one. Also, this is not exactly an app you should be using since it relies too much on quirks in my own computing environment. Anyway, for more details you can head over to <a href="http://shriphani.com/Shriphani_Website/Listener.html" target="_blank">http://shriphani.com/Shriphani_Website/Listener.html</a>.</p>
<p>So, a few screenshots:</p>

<a href='http://shriphani.com/blog/2009/09/18/tinkering-with-a-new-project/screen-shot-2009-09-18-at-12-41-10-pm/' title='Screen shot 2009-09-18 at 12.41.10 PM'><img width="150" height="150" src="http://shriphani.com/blog/wp-content/uploads/2009/09/Screen-shot-2009-09-18-at-12.41.10-PM-150x150.png" class="attachment-thumbnail" alt="" title="Screen shot 2009-09-18 at 12.41.10 PM" /></a>
<a href='http://shriphani.com/blog/2009/09/18/tinkering-with-a-new-project/screen-shot-2009-09-18-at-12-42-39-pm/' title='Screen shot 2009-09-18 at 12.42.39 PM'><img width="150" height="150" src="http://shriphani.com/blog/wp-content/uploads/2009/09/Screen-shot-2009-09-18-at-12.42.39-PM-150x150.png" class="attachment-thumbnail" alt="" title="Screen shot 2009-09-18 at 12.42.39 PM" /></a>
<a href='http://shriphani.com/blog/2009/09/18/tinkering-with-a-new-project/screen-shot-2009-09-18-at-12-43-40-pm/' title='Screen shot 2009-09-18 at 12.43.40 PM'><img width="150" height="150" src="http://shriphani.com/blog/wp-content/uploads/2009/09/Screen-shot-2009-09-18-at-12.43.40-PM-150x150.png" class="attachment-thumbnail" alt="" title="Screen shot 2009-09-18 at 12.43.40 PM" /></a>

<p>Apart from that, I also wrote a protein function matching script as part of my research this semester. I will be putting it up soon. Wow, I have been more productive in these three weeks than all of last year.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/09/18/tinkering-with-a-new-project/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bio-Informatics</title>
		<link>http://shriphani.com/blog/2009/09/04/bio-informatics/</link>
		<comments>http://shriphani.com/blog/2009/09/04/bio-informatics/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 17:20:22 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=377</guid>
		<description><![CDATA[It has been an amazing first week at college here. First, I began working with Prof Kihara and got to see a whopping 160 thousand (!) annotations. The coolest part is that I got to see a few protein function prediction algorithms (I get to code! Yippee!). Well, at one point I had to whip [...]]]></description>
			<content:encoded><![CDATA[<p>It has been an amazing first week at college here. First, I began working with Prof Kihara and got to see a whopping 160 thousand (!) annotations. The coolest part is that I got to see a few protein function prediction algorithms (I get to code! Yippee!). Well, at one point I had to whip up my own factorial function (since I can&#8217;t use Python2.6 which has a math.factorial courtesy lab machines). Well, I modded a bit of the code I found at http://en.literateprograms.org/Factorials_with_prime_factorization_%28Python%29 (which helped me a lot, thanks). And then I mixed it up with <a href="http://shriphani.com/blog/2008/04/09/prime-numbers-miller-rabin/" target="_blank">my miller rabin implementation</a> and had a bit of fun :D.</p>
<p>So the slightly modded version of the factorial script should look like <a href="http://shriphani.com/scripts/factorial.py" target="_blank">this</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/09/04/bio-informatics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First DSP Attempts</title>
		<link>http://shriphani.com/blog/2009/06/26/first-dsp-attempts/</link>
		<comments>http://shriphani.com/blog/2009/06/26/first-dsp-attempts/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 13:51:02 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=349</guid>
		<description><![CDATA[Well, since my last post on detecting calls of attention using my microphone, I have been paying attention to DSP since it seems to be one cool topic to spend 3 months on. So, I decided to begin reading the dspguide and found some cool stuff which I decided to tinker with. After reading about [...]]]></description>
			<content:encoded><![CDATA[<p>Well, since my last post on detecting calls of attention using my microphone, I have been paying attention to DSP since it seems to be one cool topic to spend 3 months on. So, I decided to begin reading the <a href="http://www.dspguide.com/">dspguide</a> and found some cool stuff which I decided to tinker with. After reading about convolution, I decided to implement some basic filters that would help me amplify, add echoes and so on. First, implementations of convolution, the input side algorithm and the output side algorithm:</p>
<p><strong>The input side algorithm:</strong></p>
<p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> convolute_inside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> output_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> input_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; len_out_signal = <span class="kw2">len</span><span class="br0">&#40;</span>input_signal<span class="br0">&#41;</span>+<span class="kw2">len</span><span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><span class="nu0">-1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; output_signal = <span class="br0">&#91;</span><span class="nu0">0</span> <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span>len_out_signal<span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>input_signal<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output_signal<span class="br0">&#91;</span>i+j<span class="br0">&#93;</span> = output_signal<span class="br0">&#91;</span>i+j<span class="br0">&#93;</span> + input_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span>*impulse_response<span class="br0">&#91;</span>j<span class="br0">&#93;</span><br />
&nbsp;</div>
</p>
<p><strong>The output side algorithm:</strong></p>
<p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> convolute_outside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> output_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> input_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; len_out_signal = <span class="kw2">len</span><span class="br0">&#40;</span>input_signal<span class="br0">&#41;</span>+<span class="kw2">len</span><span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><span class="nu0">-1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span>len_out_signal<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output_signal.<span class="me1">append</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span>len_out_signal<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#print i, j</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw1">not</span> <span class="br0">&#40;</span>i-j<span class="br0">&#41;</span>&lt;<span class="nu0">0</span> <span class="kw1">and</span> <span class="kw1">not</span> <span class="br0">&#40;</span>i-j<span class="br0">&#41;</span>&gt;len<span class="br0">&#40;</span>input_signal<span class="br0">&#41;</span><span class="nu0">-1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span> += impulse_response<span class="br0">&#91;</span>j<span class="br0">&#93;</span> * input_signal<span class="br0">&#91;</span>i-j<span class="br0">&#93;</span></p>
<p>&nbsp;</p></div>
</p>
<p>Next, using appropriate filters, we can add echoes and amplify the input signal. So, we first need to read in a wav file. Using my previous script, that should be simple:<br />
<strong>Reading a wav file:</strong></p>
<p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> readWavFile<span class="br0">&#40;</span><span class="kw2">input</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; inFile = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span><span class="kw2">input</span>, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sample_rate = inFile.<span class="me1">getframerate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; total_samples = inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; vals = inFile.<span class="me1">readframes</span><span class="br0">&#40;</span>total_samples<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; inFile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">struct</span>.<span class="me1">unpack</span><span class="br0">&#40;</span><span class="st0">&quot;%dh&quot;</span>%<span class="br0">&#40;</span>total_samples<span class="br0">&#41;</span>, vals<span class="br0">&#41;</span><br />
&nbsp;</div>
</p>
<p>This next function adds an echo to the input signal:<br />
<strong>Add an echo:</strong></p>
<p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> add_echo<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Amounts to scaling and shifting the delta function and then adding it to a delta function&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#considering the intensity of the echo to be 60% of that of the original signal and delayed by 1000 samples:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response = <span class="br0">&#91;</span><span class="nu0">0</span> <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">1003</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="co1">#shifted and scaled delta function + delta function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response<span class="br0">&#91;</span><span class="nu0">-1</span><span class="br0">&#93;</span> = <span class="nu0">0.6</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; convolute_inside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span></p>
<p>&nbsp;</p></div>
</p>
<p>The above function considers that an echo occurs a 1000 samples after the current one and with an intensity 6 tenths of the original signal. Since testing this becomes a serious pain, I decided to test my echo function using a different input signal and impulse response (echo is 6/10 of the original intensity and 4 samples away). </p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> add_new_echo<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Amounts to scaling and shifting the delta function and then adding it to a delta function&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#considering the intensity of the echo to be 60% of that of the original signal and delayed by 4 samples:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0.6</span><span class="br0">&#93;</span> <span class="co1">#shifted and scaled delta function + delta function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; convolute_inside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span></p>
<p>input_signal = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span><span class="br0">&#93;</span><br />
<span class="co1">#print input_signal</span><br />
add_new_echo<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> output_signal<br />
&nbsp;</div>
<p>The output of this is:</p>
<pre>
mouse-den% python convolution.py
[1, 2, 3, 4, 0.59999999999999998, 1.2, 1.7999999999999998, 2.3999999999999999]
</pre>
<p>The impulse response for amplifying a signal would be a scaled delta function, so:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> amplify<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Make the impulse function a scaled delta function&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response = <span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; convolute_inside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><br />
&nbsp;</div>
<p>The code to write to a wave file should be pretty straightforward:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> writeWavFile<span class="br0">&#40;</span>out<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span>out, <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">setnchannels</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">setsampwidth</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">setframerate</span><span class="br0">&#40;</span><span class="nu0">44100</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; data = <span class="st0">&quot;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>output_signal<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data += <span class="kw3">struct</span>.<span class="me1">pack</span><span class="br0">&#40;</span><span class="st0">&#8216;h&#8217;</span>, output_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">writeframes</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
<p>So, here is the test wave file: <a href='http://shriphani.com/blog/wp-content/uploads/2009/06/test.wav'>test.wav</a></p>
<p>And the amplified wav file: <a href='http://shriphani.com/blog/wp-content/uploads/2009/06/output1.wav'>output1.wav</a></p>
<p>Now, to the part where we try to figure out if a signal contains another signal.</p>
<p>Turns out, to do that, you just need to obtain the cross-correlation of the input signal and the waveform we already have.</p>
<p>So, the code to do this for a signal that goes like [1,2,3,4] is:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> cross_correlate<span class="br0">&#40;</span>input_file=<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Cross correlate, obtain the graph and find the peak&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> input_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> output_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#input_signal = record() #this procedure reads in the signal we need to find</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; input_signal = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span>,<span class="nu0">11</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">1</span>,<span class="nu0">10</span>,<span class="nu0">5</span>,<span class="nu0">2</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span><span class="br0">&#93;</span> <span class="co1">#read in our signal</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response.<span class="me1">reverse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; convolute_outside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> output_signal<br />
&nbsp;</div>
<p>This results in a signal that looks like:</p>
<pre>[4, 11, 20, 30, 64, 44, 26, 15, 43, 52, 44, 26, 9, 2]</pre>
<p>So, I had to figure out an algorithm to detect the peak and I found one on stackoverflow.com and it goes like this:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>output_signal<span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; travel = output_signal<span class="br0">&#91;</span>i<span class="nu0">+1</span><span class="br0">&#93;</span> &#8211; output_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rise = output_signal<span class="br0">&#91;</span><span class="kw2">len</span><span class="br0">&#40;</span>output_signal<span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#93;</span> &#8211; output_signal<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>travel/rise<span class="br0">&#41;</span> &gt; <span class="nu0">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#print output_signal[i]</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; peak_options<span class="br0">&#91;</span>output_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#93;</span>=i</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> peak_options<span class="br0">&#91;</span><span class="kw2">max</span><span class="br0">&#40;</span>peak_options.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>&nbsp; &nbsp;<br />
&nbsp;</div>
<p>In other news, I am going to work in Prof. Kihara&#8217;s bio-informatics laboratory this fall and I hope it works out.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/06/26/first-dsp-attempts/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://shriphani.com/blog/wp-content/uploads/2009/06/test.wav" length="117292" type="audio/x-wav" />
<enclosure url="http://shriphani.com/blog/wp-content/uploads/2009/06/output1.wav" length="117292" type="audio/x-wav" />
		</item>
		<item>
		<title>WAV Files, Spring Semester, Research Hopes, IPL,</title>
		<link>http://shriphani.com/blog/2009/05/26/wav-files-spring-semester-research-hopes-ip/</link>
		<comments>http://shriphani.com/blog/2009/05/26/wav-files-spring-semester-research-hopes-ip/#comments</comments>
		<pubDate>Tue, 26 May 2009 04:21:47 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=338</guid>
		<description><![CDATA[UPDATE 02/13/2010: Most recent version of this script is now moved to: http://shriphani.com/blog/listener.
EDIT: An updated version of this script along with tools to improve the user experience can be obtained at http://shriphani.com/Shriphani_Website/Listener.html
After an looooong time, I&#8217;ve decided to put finger on keyboard (I think that sounds stupid). Considering that I now use BOSE headphones which [...]]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE 02/13/2010: </strong>Most recent version of this script is now moved to: <a href="http://shriphani.com/blog/listener">http://shriphani.com/blog/listener</a>.</p>
<p><strong>EDIT: </strong>An updated version of this script along with tools to improve the user experience can be obtained at <a href="http://shriphani.com/Shriphani_Website/Listener.html">http://shriphani.com/Shriphani_Website/Listener.html</a></p>
<p>After an looooong time, I&#8217;ve decided to put finger on keyboard (I think that sounds stupid). Considering that I now use BOSE headphones which cut me off from the outside world when I am listening to anything (I use the triport headphones; not the Quietcomfort), it has been a bit hard to respond to all the calls for attention over here (no one usually wants me to pay attention and that&#8217;s how it works best). So I decided that it would be better if I could use the mic on my mac to check if someone was calling me. This is the first time I have tinkered with .wav files and I am sure that I am doing loads of things wrong. First, I decided to use PyAudio, PortAudio&#8217;s Python bindings, to record audio from the microphone, save it to a wav file and then open it and analyze etc. So with help from the Examples that come bundled with PyAudio, here is the code to record from the inbuilt microphone:</p>
<p><strong>Recording:</strong></p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">def</span> record<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Records Input From Microphone Using PyAudio&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; duration = <span class="nu0">1</span> <span class="co1">#record for 1 second. Pretty long duration don&#8217;t you think</span><br />
&nbsp; &nbsp; outfile = <span class="st0">&quot;analysis.wav&quot;</span></p>
<p>&nbsp; &nbsp; p = pyaudio.<span class="me1">PyAudio</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; inStream = p.<span class="kw2">open</span><span class="br0">&#40;</span>format=pyaudio.<span class="me1">paInt16</span>, channels=<span class="nu0">1</span>, rate=<span class="nu0">44100</span>,<span class="kw2">input</span>=<span class="kw2">True</span>, frames_per_buffer=<span class="nu0">1024</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;recording has begun&quot;</span><br />
&nbsp; &nbsp; out = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; upper_lim = <span class="nu0">44100</span> / <span class="nu0">1024</span> * duration <span class="co1">#upper limit of the range we record to. 44100 / 1024 sized chunk * 5 seconds</span></p>
<p>&nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">0</span>, upper_lim<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; data = inStream.<span class="me1">read</span><span class="br0">&#40;</span><span class="nu0">1024</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out.<span class="me1">append</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="co1">#now the writing section where we write to file</span></p>
<p>&nbsp; &nbsp; data = <span class="st0">&#8221;</span>.<span class="me1">join</span><span class="br0">&#40;</span>out<span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span>outfile, <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setnchannels</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setsampwidth</span><span class="br0">&#40;</span>p.<span class="me1">get_sample_size</span><span class="br0">&#40;</span>pyaudio.<span class="me1">paInt16</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setframerate</span><span class="br0">&#40;</span><span class="nu0">44100</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">writeframes</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
<p>Then, I opened the wav file and read the first 2000 values from it and obtained the root mean square amplitude and then obtained the intensity of sound using the following snippet:</p>
<p><strong>Analyzing</strong></p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">def</span> analyze<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; inFile = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&quot;analysis.wav&quot;</span>, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span> <span class="co1">#open a wav file in read mode</span><br />
&nbsp; &nbsp; sample_rate = inFile.<span class="me1">getframerate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; total_samples = inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; fftLength = <span class="nu0">128</span><br />
&nbsp; &nbsp; fft_num = <span class="br0">&#40;</span>total_samples/fftLength<span class="br0">&#41;</span> <span class="nu0">-2</span><br />
&nbsp; &nbsp; vals = inFile.<span class="me1">readframes</span><span class="br0">&#40;</span><span class="nu0">2000</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; results = <span class="kw3">struct</span>.<span class="me1">unpack</span><span class="br0">&#40;</span><span class="st0">&quot;%dh&quot;</span>%<span class="br0">&#40;</span><span class="nu0">2000</span><span class="br0">&#41;</span>, vals<span class="br0">&#41;</span><br />
&nbsp; &nbsp; results = <span class="br0">&#91;</span>x**<span class="nu0">2</span> <span class="kw1">for</span> x <span class="kw1">in</span> results<span class="br0">&#93;</span><br />
&nbsp; &nbsp; intensity = <span class="nu0">20</span> * numpy.<span class="me1">log10</span><span class="br0">&#40;</span>numpy.<span class="me1">sqrt</span><span class="br0">&#40;</span><span class="kw2">sum</span><span class="br0">&#40;</span>results<span class="br0">&#41;</span>/<span class="nu0">2000</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>intensity &gt; <span class="nu0">55</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Someone might be calling you&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; curtime = <span class="kw3">time</span>.<span class="me1">localtime</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Current Time: %d:%d:%d&quot;</span>%<span class="br0">&#40;</span>curtime<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>, curtime<span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span>, curtime<span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Intensity: &quot;</span>+<span class="kw2">str</span><span class="br0">&#40;</span>intensity<span class="br0">&#41;</span> + <span class="st0">&quot; dB<span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; inFile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
<p>I chose 55 dB because well 55 dB seems to be the right intensity of sound you would hear if you were conversing with someone 1 meter away.</p>
<p>The next thing to do would be to repeat this action over and over again. I decided to use something like:</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">while</span> <span class="kw2">True</span>:<br />
&nbsp; &nbsp; record<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; analyze<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; sleep<span class="br0">&#40;</span><span class="nu0">2.0</span><span class="br0">&#41;</span></div>
<p>I am not sure what went wrong there but when it ran the second time it gave me an &#8220;internal PortAudio Error&#8221; which pissed me off. However, using BASH to handle the endless loop worked and I could achieve the desired functionality using something like:</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">while</span> <span class="br0">&#91;</span> <span class="st0">&quot;true&quot;</span> <span class="br0">&#93;</span><br />
<span class="kw1">do</span><br />
&nbsp; python audio_analysis.py<br />
&nbsp; <span class="kw2">sleep</span> <span class="nu0">2</span><br />
<span class="kw1">done</span></div>
<p>This might be the wrong way to go about it but it works at least&#8230;..</p>
<p>Also, I thought growl would be something cool to have and I decided that I would go out there and get it use Growl to notify me but for some screwed up reason I cannot build Growl&#8217;s Python bindings using the Enthought Python Distribution which I use. I can however build it using Python 2.6 (and I still use the Numpy that comes with EPD). I get errors like:</p>
<pre>running install
running build
running build_py
running build_ext
building '_growlImage' extension
gcc -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk -g -L/usr/local/lib -L/Library/Frameworks/Python.framework/Versions/4.3.0/lib -bundle -undefined dynamic_lookup build/temp.macosx-10.3-fat-2.5/growlImage.o -o build/lib.macosx-10.3-fat-2.5/_growlImage.so -framework Cocoa
ld: in /Developer/SDKs/MacOSX10.4u.sdk/Library/Frameworks/Python.framework/Versions/4.3.0/lib/libz.1.dylib, file is not of required architecture for architecture ppc
collect2: ld returned 1 exit status
lipo: can't open input file: /var/tmp//ccNgltEc.out (No such file or directory)
error: command 'gcc' failed with exit status 1</pre>
<p>I think that I am unable to generate a universal binary there and as a result I can&#8217;t use Growl. Anyway, I have two screens and I can leave a terminal window open on one of those to see what&#8217;s going on in the surroundings. So sample run:</p>
<pre>cm92:scripts shriphani$ ./repeat.sh
Someone might be calling you
Current Time: 11:55:22
Intensity: 56.9166929341 dB

Someone might be calling you
Current Time: 11:55:33
Intensity: 72.6820018669 dB

Someone might be calling you
Current Time: 11:55:51
Intensity: 56.7505666696 dB

Someone might be calling you
Current Time: 11:55:54
Intensity: 55.571208569 dB

Someone might be calling you
Current Time: 11:55:58
Intensity: 60.0388858371 dB

Someone might be calling you
Current Time: 11:56:1
Intensity: 56.3460220002 dB</pre>
<p>These results were obtained in the following situations:</p>
<ul>
<li>The TV running.</li>
<li>My mom calling me.</li>
</ul>
<p>Anyway, in other news, I managed to end up with a GPA of 3.85 overall thanks to a series of mistakes towards the end of the semester and lost the 4.0&#8230;&#8230;.. it is depressing, but I&#8217;ll just put that behind me for now.</p>
<p>And I&#8217;m also trying to find a spot in Prof Kihara&#8217;s computational bio lab&#8230;.. I hope I get to do some research next semester.</p>
<p>The spring was not full of disappointment, I got to meet some awesome professors in the honors seminar (in which I skipped most of the student presentations except the one I was supposed to speak in). I got to meet Prof. Wagstaff who has a prime number named after him, I got to meet Prof Kihara and others.</p>
<p>Congrats to the Deccan Chargers for their excellent performance in the Indian Premier League. Thanks for rewarding our unyielding support by bringing the trophy to Hyderabad.</p>
<p>Now I&#8217;ve got to go and entertain myself with Combat Arms.</p>
<p>UPDATE: The script can be obtained at: <a href="http://shriphani.com/scripts/audio_analysis.py" target="_blank">Script to Record+Analyze</a> and <a href="http://shriphani.com/scripts/repeat.sh" target="_blank">Script to Repeat action</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/05/26/wav-files-spring-semester-research-hopes-ip/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hebb&#8217;s Rule</title>
		<link>http://shriphani.com/blog/2009/02/09/hebbs-rule/</link>
		<comments>http://shriphani.com/blog/2009/02/09/hebbs-rule/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 00:58:30 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[College]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=321</guid>
		<description><![CDATA[This post is slightly psychology influenced. Well, in the Psychology class I have been taking this semester (Introduction To Cognitive Learning), I was taught about Neural Networks and a certain Hebb&#8217;s Rule which allows a network to remember a previous configuration and use this configuration to interpret new information. We use the following model to [...]]]></description>
			<content:encoded><![CDATA[<p>This post is slightly psychology influenced. Well, in the Psychology class I have been taking this semester (Introduction To Cognitive Learning), I was taught about Neural Networks and a certain Hebb&#8217;s Rule which allows a network to remember a previous configuration and use this configuration to interpret new information. We use the following model to represent a cell:</p>
<p>1. A cell (neuron) has only two activation states: On or Off.</p>
<ul>
<li> On: Cell has high firing rate. (High number of action potentials fired in unit time).</li>
<li> Off: Cell has low firing rate.</li>
</ul>
<p>2. Cell weights are reciprocal. Weights symbolize the size of the synapse between two cells. Greater size = greater strength.</p>
<p>3. If cells fire simultaneously, they develop positive weights. The active cells (activation = on) inhibit the inactive cells (develop negative weights.</p>
<p>4. The network organizes itself based on sensory input. And new sensory info is interpreted by previously developed weights.</p>
<p>5. The network updates itself one at a time.</p>
<p>6. The activation of a cell can be determined by the following formula:</p>
<p>1 if &sum;w<sub>ij</sub>a<sub>j</sub> &gt; 0<br />
0 otherwise</p>
<p>The weights lend a sort of memory to the network since weights influence the interpretation of subsequent sensory input.</p>
<p>Based on these rules, I wrote something that simulated a network that implemented the Hebb&#8217;s rule.</p>
<p>First, we need to describe a neuron. Our neurons represent an uppercase letter of the english alphabet. We also need a way to represent the weights with each of the other neurons.</p>
<p>So a basic class to describe a neuron:</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">class</span> Neuron:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, a, weight_dict<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;A Represents The Cell&#8217;</span>s Content<span class="st0">&#8221;</span><span class="st0">&#8216;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.content = a #what letter of the alphabet a cell represents<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.weights = weight_dict #only contains contents of each neuron.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.state = 0 #activation state initially on.</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; def __str__(self):<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &quot;Activation: &quot;+str(self.state)+&quot;<span class="es0">\n</span>Weights: &quot;+str(self.weights)</span></div>
<p>Now, the network has a collection of neurons (26 in our case which signify each letter of the alphabet). Hence, the init method for the neuron class:</p>
<div class="dean_ch" style="white-space: nowrap;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">neurons</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">flush</span> = <span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="co1">#weight calculator while updating activities</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">possibilities</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> char <span class="kw1">in</span> <span class="kw3">string</span>.<span class="me1">uppercase</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">flush</span><span class="br0">&#91;</span>char<span class="br0">&#93;</span> = <span class="nu0">0</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> letter <span class="kw1">in</span> <span class="kw3">string</span>.<span class="me1">uppercase</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; weights = <span class="kw3">copy</span>.<span class="kw3">copy</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">flush</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; weights.<span class="me1">pop</span><span class="br0">&#40;</span>letter<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a = Neuron<span class="br0">&#40;</span>letter, weights<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">neurons</span>.<span class="me1">append</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span></div>
<p>Now that we have a network that is populated, we need a method that receives input and figures out the changes in the weights between cells (or the strength of the connection between cells). This method is then fed by another method that figures out the overall change in the weights and computer which cells are active:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> recvInput<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a = <span class="kw2">raw_input</span><span class="br0">&#40;</span><span class="st0">&quot;Sensory Interface: &quot;</span><span class="br0">&#41;</span> <span class="co1">#Get a word</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> a != <span class="st0">&quot;QUIT&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = <span class="kw2">list</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> neuron <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">neurons</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char = b<span class="br0">&#91;</span>i<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> neuron.<span class="me1">content</span> == char:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; neuron.<span class="me1">state</span> = <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reqd_list = b<span class="br0">&#91;</span><span class="nu0">0</span>:i<span class="br0">&#93;</span>+b<span class="br0">&#91;</span>i<span class="nu0">+1</span>:<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> char <span class="kw1">in</span> <span class="kw3">string</span>.<span class="me1">uppercase</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> char <span class="kw1">in</span> reqd_list:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; neuron.<span class="me1">weights</span><span class="br0">&#91;</span>char<span class="br0">&#93;</span>+=<span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> neuron.<span class="me1">weights</span>.<span class="me1">has_key</span><span class="br0">&#40;</span>char<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; neuron.<span class="me1">weights</span><span class="br0">&#91;</span>char<span class="br0">&#93;</span>-=<span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span></p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">checkInfo</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">possibleInfo</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;The possible interpretations of this input might be anagrams of the subsets of: <span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="kw2">self</span>.<span class="me1">possibilities</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a = <span class="kw2">raw_input</span><span class="br0">&#40;</span><span class="st0">&quot;Sensory Interface: &quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> checkInfo<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; possibilities = <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> neuron <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">neurons</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> neuron.<span class="me1">state</span> == <span class="nu0">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> info <span class="kw1">in</span> neuron.<span class="me1">weights</span>.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">flush</span><span class="br0">&#91;</span>info<span class="br0">&#93;</span> += neuron.<span class="me1">weights</span><span class="br0">&#91;</span>info<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="kw2">self</span>.<span class="me1">flush</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> neuron <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">neurons</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">self</span>.<span class="me1">flush</span><span class="br0">&#91;</span>neuron.<span class="me1">content</span><span class="br0">&#93;</span> &gt; <span class="nu0">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; neuron.<span class="me1">state</span> = <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; neuron.<span class="me1">state</span> = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> char <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">flush</span>.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">flush</span><span class="br0">&#91;</span>char<span class="br0">&#93;</span> = <span class="nu0">0</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> possibleInfo<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">possibilities</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> neuron <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">neurons</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> neuron.<span class="me1">state</span> == <span class="nu0">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">possibilities</span>.<span class="me1">append</span><span class="br0">&#40;</span>neuron.<span class="me1">content</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p>Then we run this network with:</p>
<div class="dean_ch" style="white-space: nowrap;">
words = Network<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>words.<span class="me1">recvInput</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p>Before I run this, let me mention that this thing only accepts uppercase letters and breaks if a letter is repeated in a word. This is because neurons rarely have their own axon connected to their own dendrite (neurons are not connected to themselves).</p>
<p>So, a sample run:</p>
<pre>
tark-b-183:scripts shriphani\> python hebb.py
Sensory Interface: HELP
{'A': -4, 'C': -4, 'B': -4, 'E': 3, 'D': -4, 'G': -4, 'F': -4, 'I': -4, 'H': 3, 'K': -4, 'J': -4, 'M': -4, 'L': 3, 'O': -4, 'N': -4, 'Q': -4, 'P': 3, 'S': -4, 'R': -4, 'U': -4, 'T': -4, 'W': -4, 'V': -4, 'Y': -4, 'X': -4, 'Z': -4}
The possible interpretations of this input might be anagrams of the subsets of: 

['E', 'H', 'L', 'P']
Sensory Interface: LOSER
{'A': -9, 'C': -9, 'B': -9, 'E': 7, 'D': -9, 'G': -9, 'F': -9, 'I': -9, 'H': -2, 'K': -9, 'J': -9, 'M': -9, 'L': 7, 'O': 0, 'N': -9, 'Q': -9, 'P': -2, 'S': 0, 'R': 0, 'U': -9, 'T': -9, 'W': -9, 'V': -9, 'Y': -9, 'X': -9, 'Z': -9}
The possible interpretations of this input might be anagrams of the subsets of: 

['E', 'L']
Sensory Interface: HOMELY
{'A': -12, 'C': -12, 'B': -12, 'E': 9, 'D': -12, 'G': -12, 'F': -12, 'I': -12, 'H': 4, 'K': -12, 'J': -12, 'M': -1, 'L': 9, 'O': 4, 'N': -12, 'Q': -12, 'P': -6, 'S': -6, 'R': -6, 'U': -12, 'T': -12, 'W': -12, 'V': -12, 'Y': -1, 'X': -12, 'Z': -12}
The possible interpretations of this input might be anagrams of the subsets of: 

['E', 'H', 'L', 'O']
Sensory Interface: LOSER
{'A': -17, 'C': -17, 'B': -17, 'E': 13, 'D': -17, 'G': -17, 'F': -17, 'I': -17, 'H': -5, 'K': -17, 'J': -17, 'M': -9, 'L': 13, 'O': 8, 'N': -17, 'Q': -17, 'P': -11, 'S': 1, 'R': 1, 'U': -17, 'T': -17, 'W': -17, 'V': -17, 'Y': -9, 'X': -17, 'Z': -17}
The possible interpretations of this input might be anagrams of the subsets of: 

['E', 'L', 'O', 'R', 'S']
</pre>
<p>So we observe that in the first case, four neurons were activated. The word &#8220;LOSER&#8221; led to H and P being deactivated because the synapse weakened. The next input &#8220;HOMELY&#8221; causes H and O to activate because O began developing positive weights with other cells and when LOSER was submitted as input and developed a strong enough connection when it was seen in another sensory input. When LOSER is flashed again, it leads to H being forgotten and causes R and S to activate. </p>
<p>Now, a particular case which (I think) indicates the use of this &#8220;learning&#8221; technique is when we are playing scrabble. Assume that I have words such as NEAR in my memory and when I see N and E on a board, I should be able to complete these words. Watch:</p>
<pre>
Sensory Interface: NEAR
{'A': 3, 'C': -4, 'B': -4, 'E': 3, 'D': -4, 'G': -4, 'F': -4, 'I': -4, 'H': -4, 'K': -4, 'J': -4, 'M': -4, 'L': -4, 'O': -4, 'N': 3, 'Q': -4, 'P': -4, 'S': -4, 'R': 3, 'U': -4, 'T': -4, 'W': -4, 'V': -4, 'Y': -4, 'X': -4, 'Z': -4}
The possible interpretations of this input might be anagrams of the subsets of: 

['A', 'E', 'N', 'R']
Sensory Interface: NE
{'A': 1, 'C': -6, 'B': -6, 'E': 4, 'D': -6, 'G': -6, 'F': -6, 'I': -6, 'H': -6, 'K': -6, 'J': -6, 'M': -6, 'L': -6, 'O': -6, 'N': 4, 'Q': -6, 'P': -6, 'S': -6, 'R': 1, 'U': -6, 'T': -6, 'W': -6, 'V': -6, 'Y': -6, 'X': -6, 'Z': -6}
The possible interpretations of this input might be anagrams of the subsets of: 

['A', 'E', 'N', 'R']
Sensory Interface:
</pre>
<p>Well, this semester, I have already been taught some insanely great stuff. I have a bunch of exams coming up. Great scores will be the perfect way to make an awesome semester even better.</p>
<p>The script can be downloaded <a href="http://shriphani.com/scripts/hebb.py" target="_blank">here</a>.<br />
The material here was used from Professor Greg Francis&#8217; <a href="http://www1.psych.purdue.edu/~gfrancis/Classes/PSY200/L08.pdf" target="_blank">notes on Neural Learning</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/02/09/hebbs-rule/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Post&#8217;s Machine Emulator</title>
		<link>http://shriphani.com/blog/2009/01/17/posts-machine-emulator/</link>
		<comments>http://shriphani.com/blog/2009/01/17/posts-machine-emulator/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 19:42:35 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=313</guid>
		<description><![CDATA[I was bored as usual and since Combat Arms has begun to slip in my list of pastimes, I decided to write a Post&#8217;s Machine Emulator as described in the booklet by V. A. Uspensky titled &#8220;Post&#8217;s Machine&#8221; ( Amazon Link
This machine has a tape (infinitely long) and the reel has cells which can be [...]]]></description>
			<content:encoded><![CDATA[<p>I was bored as usual and since Combat Arms has begun to slip in my list of pastimes, I decided to write a Post&#8217;s Machine Emulator as described in the booklet by V. A. Uspensky titled &#8220;Post&#8217;s Machine&#8221; ( <a href="http://www.amazon.com/Posts-Machine-V-Uspensky/dp/0828523886/ref=sr_1_6?ie=UTF8&amp;s=books&amp;qid=1232212383&amp;sr=1-6" target="_blank">Amazon Link</a></p>
<p>This machine has a tape (infinitely long) and the reel has cells which can be marked or unmarked. I decided to represent a marked cell with a &#8220;1&#8243; and an unmarked cell as &#8220;0&#8243;.</p>
<p>The head of this machine can move both ways and can mark and at the same time remove the mark from the other side.</p>
<p>The machine can be instructed using the syntax:</p>
<pre>number, action, jump</pre>
<p>The position of the head is indicated by a structure \&#8221;[]\&#8221; around the cell. Example:</p>
<pre>Initial Stage
.....[0], 0, 0, 0, 0, .....</pre>
<p>I used the &#8220;&#8230;..&#8221; to indicate that the remnant cells are all unmarked.</p>
<p>So here are the Head and Tape classes:</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">class</span> Cell:<br />
&nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Class describing the cell of a tape&#8217;</span><span class="st0">&#8221;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, mark=<span class="nu0">0</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Each cell is unmarked by default&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mark</span> = mark</p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> setMark<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mark</span> = <span class="nu0">1</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> remMark<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mark</span> = <span class="nu0">0</span> </p>
<p><span class="kw1">class</span> Tape:<br />
&nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Class describing the infinite reel in the machine&#8217;</span><span class="st0">&#8221;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Each tape has an infinite number of cells both ways&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">reel</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span>: <span class="co1">#we display only the required elements at a time</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cell = Cell<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">reel</span>.<span class="me1">append</span><span class="br0">&#40;</span>cell<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__str__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; printstr = <span class="st0">&quot;&#8230;..&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> cell <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">reel</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printstr += <span class="kw2">str</span><span class="br0">&#40;</span>cell.<span class="me1">mark</span><span class="br0">&#41;</span>+<span class="st0">&quot;,&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; printstr += <span class="st0">&quot;&#8230;..&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> printstr</p>
<p><span class="kw1">class</span> Head:<br />
&nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Class describing the head&#8217;</span><span class="st0">&#8221;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, tape, position=<span class="nu0">0</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">position</span> = position<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">tape</span> = tape</p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> moveLeft<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">self</span>.<span class="me1">position</span> != <span class="nu0">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">position</span> -= <span class="nu0">1</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; extension = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; extension.<span class="me1">append</span><span class="br0">&#40;</span>Cell<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">tape</span> = extension + tape.<span class="me1">reel</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> etchMark<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">tape</span>.<span class="me1">reel</span><span class="br0">&#91;</span><span class="kw2">self</span>.<span class="me1">position</span><span class="br0">&#93;</span>.<span class="me1">setMark</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> remMark<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">tape</span>.<span class="me1">reel</span><span class="br0">&#91;</span><span class="kw2">self</span>.<span class="me1">position</span><span class="br0">&#93;</span>.<span class="me1">remMark</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> moveRight<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">self</span>.<span class="me1">position</span> == <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">tape</span>.<span class="me1">reel</span><span class="br0">&#41;</span> &#8211; <span class="nu0">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">tape</span>.<span class="me1">reel</span>.<span class="me1">append</span><span class="br0">&#40;</span>Cell<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">position</span> += <span class="nu0">1</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> getPosition<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">self</span>.<span class="me1">position</span></div>
<p>Then comes the Machine class which takes a tape as an argument. So that you can insert your own tape or use the default tape:</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">class</span> Machine:<br />
&nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Class describing the Post Machine&#8217;</span><span class="st0">&#8221;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, tape<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">tape</span> = tape<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">head</span> = Head<span class="br0">&#40;</span>tape<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="kw3">commands</span> = <span class="br0">&#123;</span><span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> parseInstruction<span class="br0">&#40;</span><span class="kw2">self</span>, number, action, jump<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Instruction is of form &quot;[number, action, jump]&quot;&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="kw3">commands</span><span class="br0">&#91;</span>number<span class="br0">&#93;</span> = <span class="br0">&#91;</span>action, jump<span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> beginExecution<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; instruction = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; action = <span class="kw2">self</span>.<span class="kw3">commands</span><span class="br0">&#91;</span>instruction<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> action != <span class="st0">&quot;exit&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> action == <span class="st0">&quot;&lt;&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">head</span>.<span class="me1">moveLeft</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> action == <span class="st0">&quot;&gt;&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">head</span>.<span class="me1">moveRight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> action == <span class="st0">&quot;mark&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">head</span>.<span class="me1">etchMark</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> action == <span class="st0">&quot;unmark&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">head</span>.<span class="me1">remMark</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="kw2">self</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; instruction = <span class="kw2">self</span>.<span class="kw3">commands</span><span class="br0">&#91;</span>instruction<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; action = <span class="kw2">self</span>.<span class="kw3">commands</span><span class="br0">&#91;</span>instruction<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__str__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;This returns tape with the head displayed&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; a = <span class="kw2">str</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">tape</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; posn = <span class="kw2">self</span>.<span class="me1">head</span>.<span class="me1">getPosition</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; temp = <span class="st0">&quot;&#8230;..&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">tape</span>.<span class="me1">reel</span><span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> i == posn:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp += <span class="st0">&quot;[&quot;</span>+<span class="kw2">str</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">tape</span>.<span class="me1">reel</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">mark</span><span class="br0">&#41;</span>+<span class="st0">&quot;], &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp += <span class="kw2">str</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">tape</span>.<span class="me1">reel</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">mark</span><span class="br0">&#41;</span> + <span class="st0">&quot;, &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; temp += <span class="st0">&quot;&#8230;..&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> temp</div>
<p>Next comes a function that reads an input file for instructions:</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">def</span> run<span class="br0">&#40;</span>input_file<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; infile = <span class="kw2">open</span><span class="br0">&#40;</span>input_file, <span class="st0">&#8216;r&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; b = infile.<span class="me1">readlines</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> instruction <span class="kw1">in</span> b:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; splits = instruction.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;,&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number = <span class="kw2">int</span><span class="br0">&#40;</span>splits<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">strip</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; action = splits<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">strip</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> action == <span class="st0">&quot;exit&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a.<span class="me1">parseInstruction</span><span class="br0">&#40;</span>number, action, <span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jump = <span class="kw2">int</span><span class="br0">&#40;</span>splits<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span>.<span class="me1">strip</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a.<span class="me1">parseInstruction</span><span class="br0">&#40;</span>number, action, jump<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span> <span class="kw2">KeyError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><br />
&nbsp; &nbsp; infile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; a.<span class="me1">beginExecution</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
<p>A bunch of instructions which need to be written to some file:</p>
<pre>0, &gt;, 2
1, &lt;, 0
2, &gt;, 3
3, &gt;, 4
4, &gt;, 5
5, mark, 6
6, &gt;, 7
7, exit</pre>
<p>The output:</p>
<pre>
pal-178-222:~ shriphani$ python post.py
Initial Stage
.....[0], 0, 0, 0, 0, .....
File: input_file
.....0, [0], 0, 0, 0, .....
.....0, 0, [0], 0, 0, .....
.....0, 0, 0, [0], 0, .....
.....0, 0, 0, 0, [0], .....
.....0, 0, 0, 0, [1], .....
.....0, 0, 0, 0, 1, [0], .....
pal-178-222:~ shriphani$ python post.py
</pre>
<p>The full script can be obtained at <a href="http://shriphani.com/scripts/post.py" target="_blank">http://shriphani.com/scripts/post.py</a></p>
<p>Well, later.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/01/17/posts-machine-emulator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RPN Calculator &#8211; Keeping Boredom Away</title>
		<link>http://shriphani.com/blog/2009/01/14/rpn-calculator/</link>
		<comments>http://shriphani.com/blog/2009/01/14/rpn-calculator/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 20:09:35 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[Daily life]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=308</guid>
		<description><![CDATA[Alright, those who know me well are bound to ask, 19 credit hours and you are bored? Answer: Yes. It is still the first week and we don&#8217;t seem to have gotten beyond the &#8220;introduce your loser self to the other non-interested members of the class&#8221; and since I have only 1 programming intensive course [...]]]></description>
			<content:encoded><![CDATA[<p>Alright, those who know me well are bound to ask, 19 credit hours and you are bored? Answer: Yes. It is still the first week and we don&#8217;t seem to have gotten beyond the &#8220;introduce your loser self to the other non-interested members of the class&#8221; and since I have only 1 programming intensive course this semester, I should have lots of time to kill. </p>
<p>Well, my first script this semester is an RPN calculator. Totally useless for the vast majority of people out there but they know what to expect from someone who likes theoretical computer science.</p>
<p>So, I first began with a stack &#8211; in this case an array. I then keep populating it with numbers and every time the state of the stack changes, it prints out the current state.</p>
<p>If an operation is entered (only +, -, * and /), it performs the operation, replaces the appropriate positions in the stack and then prints out the current state.</p>
<p>Here is the code, Its been a while since I wrote any OOP stuff in Python and the &#8220;self&#8221; especially feels weird after an entire semester of Java&#8230;</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="co1">#!/usr/bin/env python</span><br />
<span class="co1">#Author: Shriphani Palakodety</span><br />
<span class="co1">#Mail: shriphani@shriphani.com</span><br />
<span class="co1">#RPN Calculator</span></p>
<p><span class="kw1">class</span> Machine:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, stack=<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> modifyStack<span class="br0">&#40;</span><span class="kw2">self</span>, element<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;add to stack if input is float else run operation or complain&#8217;</span><span class="st0">&#8221;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">self</span>.<span class="me1">isOperator</span><span class="br0">&#40;</span>element<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">operate</span><span class="br0">&#40;</span>element<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">printStack</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> <span class="kw2">self</span>.<span class="me1">isFloat</span><span class="br0">&#40;</span>element<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span>.<span class="me1">append</span><span class="br0">&#40;</span>element<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">printStack</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Only numbers and operators&quot;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> isFloat<span class="br0">&#40;</span><span class="kw2">self</span>, char<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Checks whether the last item entered in the stack is a float or not&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">float</span><span class="br0">&#40;</span>char<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span> <span class="kw2">ValueError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">False</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">True</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> isOperator<span class="br0">&#40;</span><span class="kw2">self</span>, char<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Checks whether the last item entered in the stack is an operator or not&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> char == <span class="st0">&#8216;+&#8217;</span> <span class="kw1">or</span> char == <span class="st0">&#8216;-&#8217;</span> <span class="kw1">or</span> char == <span class="st0">&#8216;*&#8217;</span> <span class="kw1">or</span> char == <span class="st0">&#8216;/&#8217;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">True</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">False</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> operate<span class="br0">&#40;</span><span class="kw2">self</span>, <span class="kw3">operator</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Perform the stated operation on the last two elements in the stack&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; operand1 = <span class="kw2">float</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">stack</span><span class="br0">&#91;</span><span class="nu0">-1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; operand2 = <span class="kw2">float</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">stack</span><span class="br0">&#91;</span><span class="nu0">-2</span><span class="br0">&#93;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span>.<span class="me1">pop</span><span class="br0">&#40;</span><span class="nu0">-1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span>.<span class="me1">pop</span><span class="br0">&#40;</span><span class="nu0">-1</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">operator</span>==<span class="st0">&#8216;+&#8217;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span>.<span class="me1">append</span><span class="br0">&#40;</span>operand1+operand2<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> <span class="kw3">operator</span>==<span class="st0">&#8216;-&#8217;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span>.<span class="me1">append</span><span class="br0">&#40;</span>operand2-operand1<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> <span class="kw3">operator</span>==<span class="st0">&#8216;*&#8217;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span>.<span class="me1">append</span><span class="br0">&#40;</span>operand1*operand2<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> <span class="kw3">operator</span>==<span class="st0">&#8216;/&#8217;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span>.<span class="me1">append</span><span class="br0">&#40;</span><span class="kw2">float</span><span class="br0">&#40;</span>operand2<span class="br0">&#41;</span>/<span class="kw2">float</span><span class="br0">&#40;</span>operand1<span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;God only knows what operation you have typed in&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">stack</span> += <span class="br0">&#91;</span>operand2, operand1<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">printStack</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">def</span> printStack<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="kw2">self</span>.<span class="me1">stack</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="kw1">def</span> kickOff<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; calc = Machine<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="kw2">True</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a = <span class="kw2">raw_input</span><span class="br0">&#40;</span><span class="st0">&#8216;Input: &#8216;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> a != <span class="st0">&#8221;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; calc.<span class="me1">modifyStack</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; calc.<span class="me1">printStack</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">raise</span> <span class="kw2">SystemExit</span></p>
<p>
<span class="kw1">print</span><span class="st0">&quot;Press Enter to Quit<span class="es0">\n</span>&quot;</span><br />
kickOff<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p>The calculator in action:</p>
<pre>
pal-179-083:~ shriphani$ python rpn.py
Press Enter to Quit

Input: 1
['1']
Input: 2
['1', '2']
Input: 3
['1', '2', '3']
Input: 4
['1', '2', '3', '4']
Input: 5
['1', '2', '3', '4', '5']
Input: +
['1', '2', '3', 9.0]
Input: h
Only numbers and operators
Input: -
['1', '2', -6.0]
Input:
['1', '2', -6.0]
</pre>
<p>In other news, I am really pissed with Picasa since I can&#8217;t see how many people have viewed my pics (<a href="http://picasaweb.google.com/shriphanip">http://picasaweb.google.com/shriphanip</a> in case you are interested), I have begun filling my playlists with songs played at apple keynotes and in apple ads. Friends say this is an obsession with everything with the Apple stamp on it. I basically don&#8217;t care. </p>
<p>There has always been this one question bugging me since last semester. In Java:</p>
<div class="dean_ch" style="white-space: nowrap;">
&nbsp;<span class="kw2">class</span> Test<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> a = <span class="nu0">012345</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>When I run this:</p>
<pre>
pal-179-083:~ shriphani$ java Test
5349
pal-179-083:~ shriphani$
</pre>
<p>What is happening here?</p>
<p>Anyway, looking forward to this semester. Hope my GPA stays at 4.0</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/01/14/rpn-calculator/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Boyer &#8211; Moore String Search (Good Suffix Shift)</title>
		<link>http://shriphani.com/blog/2008/12/07/boyer-moore-string-search-good-suffix-shift/</link>
		<comments>http://shriphani.com/blog/2008/12/07/boyer-moore-string-search-good-suffix-shift/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 22:09:27 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=290</guid>
		<description><![CDATA[The next string search algorithm I am going to cover seems pretty cool since the match is made in a reverse fashion. We check if the last character in the keyword equals some character in the text and decrease from that point on.As a result, a mismatch is detected extremely fast and this is also [...]]]></description>
			<content:encoded><![CDATA[<p>The next string search algorithm I am going to cover seems pretty cool since the match is made in a reverse fashion. We check if the last character in the keyword equals some character in the text and decrease from that point on.As a result, a mismatch is detected extremely fast and this is also the reason why this algorithm is performs beautifully when the keyword is longer.</p>
<p>Now, when a mismatch occurs, the position where we look for the next character is determined by a table of values mapping each character in the keyword to an integer. Example, we find an &#8220;a&#8221; in the text which at a particular state is sitting atop an M in the keyword, we shift the position in the text by the corresponding number in our table and look again.</p>
<p>Here is how we generate the table:</p>
<div class="dean_ch" style="white-space: nowrap;">
bcs = <span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="co1">#the table</span></p>
<p><span class="kw1">def</span> goodSuffixShift<span class="br0">&#40;</span>key<span class="br0">&#41;</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="nu0">-1</span>, <span class="nu0">-1</span>, <span class="nu0">-1</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> key<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="kw1">not</span> <span class="kw1">in</span> bcs.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bcs<span class="br0">&#91;</span>key<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#93;</span> = <span class="kw2">len</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span>-i<span class="nu0">-1</span><br />
&nbsp;</div>
<p>Next, comes the actual search:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> search<span class="br0">&#40;</span>text, key<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; i = <span class="kw2">len</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="nu0">-1</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; index = <span class="kw2">len</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span> <span class="nu0">-1</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; j = i</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="kw2">True</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="kw2">str</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span> + <span class="st0">&quot;, &quot;</span> + <span class="kw2">str</span><span class="br0">&#40;</span>j<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> i == <span class="nu0">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> j <span class="co1">#if every character in the keyword matches, return current position in text</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> j &gt; <span class="kw2">len</span><span class="br0">&#40;</span>text<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;not found&quot;</span> <span class="co1">#if we run out of the string while searching, there is no chance&#8230;</span></p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> text<span class="br0">&#91;</span>j<span class="br0">&#93;</span> != key<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="kw1">and</span> text<span class="br0">&#91;</span>j<span class="br0">&#93;</span> <span class="kw1">not</span> <span class="kw1">in</span> bcs.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j += <span class="kw2">len</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span> <span class="co1">#If there isn&#8217;t a match and we don&#8217;t have a switch value in our table, don&#8217;t bother looking for characters in the middle and start matching again</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = index</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> text<span class="br0">&#91;</span>j<span class="br0">&#93;</span> != key<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="kw1">and</span> text<span class="br0">&#91;</span>j<span class="br0">&#93;</span> <span class="kw1">in</span> bcs.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j += bcs<span class="br0">&#91;</span>text<span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="br0">&#93;</span> <span class="co1">#move forward as table says and start looking again</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = index</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j -= <span class="nu0">1</span> <span class="co1">#in case a match is found, check for the character to the left</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i -= <span class="nu0">1</span></p>
<p>&nbsp;</p></div>
<p>Here are some sample runs:</p>
<div class="dean_ch" style="white-space: nowrap;">
key_list = <span class="br0">&#91;</span><span class="st0">&quot;POWER&quot;</span>, <span class="st0">&quot;HOUSE&quot;</span>, <span class="st0">&quot;COMP&quot;</span>, <span class="st0">&quot;SCIENCE&quot;</span>, <span class="st0">&quot;SHRIPHANI&quot;</span>, <span class="st0">&quot;BRUAH&quot;</span><span class="br0">&#93;</span></p>
<p>text = <span class="st0">&quot;SHRIPHANI IS A COMPUTER SCIENCE POWERHOUSE&quot;</span></p>
<p><span class="kw1">for</span> key <span class="kw1">in</span> key_list:<br />
&nbsp; &nbsp; &nbsp; &nbsp; goodSuffixShift<span class="br0">&#40;</span>key<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> key + <span class="st0">&quot; location: &quot;</span> + <span class="kw2">str</span><span class="br0">&#40;</span>search<span class="br0">&#40;</span>text, key<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bcs = <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp;</div>
<p>The output:</p>
<pre>
tark-b-120:scripts shriphani$ python boyer_moore.py
POWER location: 32
HOUSE location: 37
COMP location: 15
SCIENCE location: 24
SHRIPHANI location: 0
BRUAH location: not found
</pre>
<p>You can get the entire script at <a href="http://shriphani.com/scripts/boyer_moore.py" target="blank">http://shriphani.com/scripts/boyer_moore.py</a>.</p>
<p>Got to get back to Psychology and GUI stuff in Java. Anyway, GUIs are for losers, CLI FTW !!!</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2008/12/07/boyer-moore-string-search-good-suffix-shift/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
