<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-23679668</id><updated>2012-01-09T10:13:55.592-08:00</updated><title type='text'>Poker Coder</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-23679668.post-2549848619325640425</id><published>2012-01-09T09:18:00.000-08:00</published><updated>2012-01-09T10:13:55.606-08:00</updated><title type='text'>One Year of the Odds Oracle!</title><content type='html'>&lt;div&gt;&lt;b&gt;Summing it Up&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;It has been just about a year since the first closed beta of the Odds Oracle 0.1 came out. As of the writing of this article, we are on version 1.8.5 and just on the cusp of 2.0. User feedback has been overwhelmingly positive, and from a business perspective things are going reasonably well. This couldn't have been possible without the constant support, suggestions, questions and encouragement of Odds Oracle users - I thank you all! Below is a summary of what we have achieved together, and what I feel are the good, great, and not-so-great parts of the Odds Oracle as it stands now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;The Good&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;"Show PQL" buttons everywhere help users to make the leap from the user-interface to custom PQL queries.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Multiple input/output sources (&lt;a href="http://propokertools.com/oracle_help/hand_history_importer"&gt;hand history importer&lt;/a&gt;, &lt;a href="http://propokertools.com/oracle_help/pql_command_line"&gt;command line&lt;/a&gt;, &lt;a href="http://propokertools.com/oracle_help/pql_spreadsheets"&gt;spreadsheets&lt;/a&gt;) have made it more convenient to run simulations.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://propokertools.com/oracle_help/saved_macros"&gt;Saved ranges/macros&lt;/a&gt; save time for users with complicated pre-constructed ranges&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Multi-core support has been a (ahem) core design principle from the get-go. This has made it relatively easy for the Odds Oracle to take full advantage of the latest hardware.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://propokertools.com/oracle_help/glossary#graph"&gt;Hand vs. Range equity graphs&lt;/a&gt;. These are what people usually want when they graph equities - this is now the default graphing algorithm.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://propokertools.com/images/oracle_help/interactive_stats_sample.png"&gt;Interactive hand stats on flop/turn&lt;/a&gt; - while not pretty to look at, this allows slicing-and-dicing of hand types in a way that would be too cumbersome otherwise.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;The Great&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://propokertools.com/oracle_help/walkthrough_3"&gt;"Ask the Oracle"&lt;/a&gt;. Being able to ask probability questions using pull-down menus is awesome. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://propokertools.com/pql"&gt;PQL&lt;/a&gt; was a big gamble, and it has paid off. PQL powers almost everything in the Odds Oracle and the website. As a result, there is a fairly straightforward correspondence between elements in the UI and generated PQL queries (this is something that will be made more explicit in 2.0)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://propokertools.com/oracle_help/range_of_hands#generic_syntax_documentation"&gt;Generic range syntax&lt;/a&gt; has turned out to be a big winner. Having one syntax available for everything has proven a boon, especially for people who play multiple games.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;The core re-write of December, 2010 was definitely worth it. I've learned a lot since propokertools.com opened its doors several years ago, and starting over with this accumulated knowledge has made the code-base smaller, faster, and easier to work with. For users, that means new features can come out faster.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;The Not So Great&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;The focus on the 0.x and 1.x series of the Odds Oracle has been to create an ever-increasing set of questions that can be answered. As a result, not enough time and effort has been spent on creating a better user experience. Specifically:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The range pickers are rudimentary at best. &lt;/li&gt;&lt;li&gt;The feature set is too spread out over different windows (range pickers, hand explorers, main window, equity/graph/ask the oracle/common questions buttons...). As a result, the common denominator of most of the Odds Oracle (that would be PQL) is somewhat obscured.&lt;/li&gt;&lt;li&gt;Ask the Oracle is too limited in its current form. Ideally, there should be a 1:1 correspondence between PQL and the UI - any PQL query you can write you should be able to construct in the UI (no, the PQL runner and CLI don't count!)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;What's in Store for 2.0&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My goals for 2.0 in priority order are:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Create a streamlined UI, allowing users to do most of what they want in a single window without the need to write custom PQL.&lt;/li&gt;&lt;li&gt;Create best-in-class range pickers.&lt;/li&gt;&lt;li&gt;Continue to increase the power of PQL by adding more core functions and features.&lt;/li&gt;&lt;li&gt;Spend some time working on marketing. &lt;/li&gt;&lt;li&gt;Create more instructional materials (videos, docs, ebooks?)&lt;/li&gt;&lt;li&gt;Make the UI look prettier.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have comments, questions, complaints, burning feature requests, or just want to shoot the breeze, please feel free to leave a comment here or on the free &lt;a href="http://forum.propokertools.com/"&gt;ProPokerTools Forum&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Here's to a productive 2012!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;- Dan @ ProPokerTools&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-2549848619325640425?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/2549848619325640425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=2549848619325640425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/2549848619325640425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/2549848619325640425'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2012/01/one-year-of-odds-oracle.html' title='One Year of the Odds Oracle!'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-3179380576619029121</id><published>2011-04-27T14:30:00.000-07:00</published><updated>2011-04-27T14:47:46.555-07:00</updated><title type='text'>AK vs half-dead pair (User Request)</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;I got a fun question from a user today. "How does AK (suited or unsuited) fare against any pair assuming that one of the pair's set outs are dead?"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;We can answer this with a little PQL hackery. I say "hackery" because there isn't a way to connect dead cards with other hand ranges in PQL at the moment. We will perform an all in equity simulation with AK vs any pair. If the pair gets quads by the river, we throw out the sim, since one of the set cards is supposed to be dead. If the pair does not get a matching card by the river, we keep the sim, since the dead card never appeared. If the pair hits exactly one of its set cards but doesn't have quads, we have a 50/50 chance that the sim should be thrown out. Here's where the hack comes in -  we can just throw out all sims in this case where one of the pair cards is a heart, as 50% of pairs have a heart in them. Note that if the pair is Aces or Kings, then we should not be able to hit the board at all, so we need to exclude that as well.&lt;br /&gt;&lt;br /&gt;Here is the &lt;a href="http://propokertools.com/pql"&gt;PQL&lt;/a&gt; query I came up with:&lt;div id=":ua"&gt;&lt;wbr&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;select avg(riverEquity(hero))&lt;br /&gt;from game='holdem', hero='AK', villain='AA-22', syntax='Generic'&lt;br /&gt;where&lt;br /&gt;case handBoardIntersections(villain, river)&lt;br /&gt;  when 0 then true&lt;br /&gt;  when 2 then inRange(villain,'*!h!AA-KK')&lt;br /&gt;end&lt;br /&gt;and not (handtype(villain, river) = quads)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Answer - AK has 48% equity.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-3179380576619029121?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/3179380576619029121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=3179380576619029121' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/3179380576619029121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/3179380576619029121'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2011/04/ak-vs-half-dead-pair-user-request.html' title='AK vs half-dead pair (User Request)'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-7185401414630010840</id><published>2011-04-19T12:31:00.000-07:00</published><updated>2011-04-20T19:17:25.564-07:00</updated><title type='text'>Whence PQL?</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;"A-ha!" vs. "Ho-hum"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;In the popular imagination, innovation comes from a flash of genius - a sudden, almost supernatural insight that often catches the inventor himself unawares. In reality, most innovation is far more mundane - small, incremental (and often obvious) improvements combine to make something new possible. Indeed, almost everything "new" on propokertools.com has found its genesis in incremental improvements - new games, graphs, and tools that build on what came before. After all, the very first version of propokertools.com was an answer to the question "What would an online version of PokerStove look like?"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://propokertools.com/pql"&gt;PQL&lt;/a&gt; is the exception - it is the closest I've come to a "Eureka" moment yet.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Three as One&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here are three questions that have been answerable at one time or another via propokertools:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Given that player one has XX, player two has YY, and the board is ZZZ, what is the all-in equity for player one?&lt;/li&gt;&lt;li&gt;Given that player one has XX, player two has YY, and the board is ZZZ, how often does player one have at least two pair by the river?&lt;/li&gt;&lt;li&gt;Given that player one has XX, player two has YY, and the board is ZZZ, what does the graph of equities look like for player one?&lt;/li&gt;&lt;/ul&gt;Notice anything? These questions all have the same setup, namely "Given that p1 has ..., p2 has...". Let's call this the &lt;span style="font-style: italic;"&gt;situation&lt;/span&gt;. After each situation, there is a question, which we can refer to as, well, the &lt;span style="font-style: italic;"&gt;question. &lt;/span&gt;The three questions can all be rewritten as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Given situation S, what is the answer to question Q?&lt;/li&gt;&lt;/ul&gt;In programmer-speak, we can say that we have &lt;span style="font-style: italic;"&gt;abstracted out&lt;/span&gt; the concept of a &lt;span style="font-style: italic;"&gt;situation&lt;/span&gt; and a &lt;span style="font-style: italic;"&gt;question.&lt;/span&gt; This process of abstraction is one of the principal (some would say &lt;span style="font-style: italic;"&gt;the&lt;/span&gt; principal) jobs of a programmer. And there is nothing particularly noteworthy about the abstraction above - any programmer worth her salt would spot it almost immediately.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Exposing the Abstraction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I spent a few weeks rewriting propokertools in December of 2010 (yes, all of propokertools (except for razz) got rewritten). One of the first things I did after throwing out several years' worth of accumulated cruft was to see how easy it would be to answer new poker questions with my re-written code. I began to write small programs to answer questions like "Given situation S, how often does player one win when he was an underdog before the flop?" and "Given situation R, how often is the winning hand a straight or better?". These programs were, for the most part, satisfyingly short and sweet. At first, I thought I would expose these little mini-programs as individual tools on the website. Then it hit me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Why not let the users ask the questions?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;Enter the DSL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;"DSL" stands for "domain-specific language". A DSL is a language, usually small, used to describe a very particular area, or domain. For a somewhat contrived example of a DSL in action, one need only step up to the counter at a popular chain of coffee-shops during the morning rush. "Half-caf grande iced americano" means "using half regular beans and half decaffeinated beans, brew an espresso and dump it in a large to-go container, adding ice cubes and cold water." The key behind a successful DSL is that it is concise and unambiguous. An even more concise version of our coffee DSL can be seen behind the counter, as the people at the cash-registers write only a few characters of text on each coffee cup to completely describe what is to be brewed.&lt;br /&gt;&lt;br /&gt;Another DSL you may be familiar with is the ProPokerTools "range of hands" DSL. For instance, in omaha, "AA**" means a hand with at least two aces in it.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;Why Invent What You Can Steal?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;To allow users to ask custom questions, I needed to create a new DSL. I had a number of requirements:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Need to be able to ask multiple questions&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Need to be able to compose questions using boolean operators (such as AND, OR, and NOT)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Need to be able to fully describe the situation&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Need a semantics that is easy to explain&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;As it happens, there is a language that has been used for decades in another domain that provides pretty much all of what we want. That language is SQL, or Structured Query Language. SQL is the industry-standard way to query databases. While the correspondence between SQL and our poker situation is not perfect, it is good enough, and given the availability of free tools around SQL, it became the obvious choice. Thus was born PQL - Poker Query Language.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Eating Your Own Dog Food&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The most obvious way to make sure PQL was truly useful was to use it myself. As a result, all of the major features on the website and in the downloadable Odds Oracle are powered by PQL queries.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-7185401414630010840?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/7185401414630010840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=7185401414630010840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/7185401414630010840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/7185401414630010840'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2011/04/whence-pql.html' title='Whence PQL?'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-7728199283310368548</id><published>2011-01-03T10:52:00.000-08:00</published><updated>2011-01-03T10:55:50.589-08:00</updated><title type='text'></title><content type='html'>&lt;span style="font-size:130%;"&gt;Downloadable ProPokerTools 0.1 is done!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;I promised myself I would release a downloadable version &lt;/span&gt;of ProPokerTools in 2010. The bad news? I did not reach my goal. The good news? I am only three days late. A random pool of users have been selected from those who submitted a survey from the propokertools website. Check your inbox!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-7728199283310368548?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/7728199283310368548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=7728199283310368548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/7728199283310368548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/7728199283310368548'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2011/01/downloadable-propokertools-0.html' title=''/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-5157526070771586125</id><published>2010-12-01T15:45:00.001-08:00</published><updated>2010-12-01T15:48:40.567-08:00</updated><title type='text'>Generating all 3-way holdem matchups</title><content type='html'>By user request, I have generated equities for all 3-way races between holdem hand types (ex 22 vs. AJs vs KQo) and stored the values in a file. My new quad-core laptop is still catching its breath from the effort. If you would like the results (warning - 15+Meg file), please email propokertools support and I'll send it your way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-5157526070771586125?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/5157526070771586125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=5157526070771586125' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/5157526070771586125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/5157526070771586125'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2010/12/generating-all-3-way-holdem-matchups.html' title='Generating all 3-way holdem matchups'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-9136821469736453863</id><published>2010-07-05T13:53:00.000-07:00</published><updated>2010-07-05T13:56:55.122-07:00</updated><title type='text'></title><content type='html'>&lt;span style="font-size:130%;"&gt;Another (smaller) razz fix&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fixed a bug today involving dependent probabilities in razz. In a nutshell, hands with range syntax in both the first two and last cards were overweighting paired cards on seventh street. Thanks to the folks on &lt;a href="http://forumserver.twoplustwo.com/20/stud/3-6-razz-did-i-play-poorly-817059/"&gt;this thread&lt;/a&gt; for bringing this to my attention.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-9136821469736453863?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/9136821469736453863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=9136821469736453863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/9136821469736453863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/9136821469736453863'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2010/07/another-smaller-razz-fix-fixed-bug.html' title=''/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-2938799683634203890</id><published>2010-04-06T10:24:00.000-07:00</published><updated>2010-04-06T14:53:54.750-07:00</updated><title type='text'>Fixing Razz</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;Trying to Get it Right&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Joel Spolsky wrote a famous piece on &lt;a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html"&gt;how to do job interviews.&lt;/a&gt; His mantra throughout the article is that you want to hire people who are "Smart" and "Get Things Done" (I hope he hasn't copyrighted these phrases yet). To these two attributes,  I would humbly add "Tries to Get It Right", though I'm hardly the first one to suggest this. When hiring a software engineer, you want someone who does his best to get it right the first time, and if necessary, gets it right the second or third or fourth time if things go wrong.&lt;br /&gt;&lt;br /&gt;And things will go wrong. When it is discovered, for instance, that something he has written is based on faulty assumptions, your engineer shouldn't react too defensively, at least not for long. Ideally, he should look like someone just punched him in the gut, and then he should scramble to fix whatever it is that needs fixing, throwing away reams of code as necessary.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Enough with the Digression, What Needs Fixing?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thanks to a number of posters on the 2+2 forums (the thread is &lt;a href="http://forumserver.twoplustwo.com/20/stud/razz-3-6-did-he-pair-often-enough-raise-733268/"&gt;here&lt;/a&gt; -  the discussion starts toward the middle of page two), a highly counter-intuitive result was brought to my attention involving randomized razz simulations. In a sense, it isn't a bug - the code is actually performing the way I intended it. No, it is worse than a bug - it is a behavior, hidden from the user, which gives results different from what, in almost all cases, was probably intended.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;The Old Approach&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On the &lt;a href="http://propokertools.com/simulations?g=rz"&gt;propokertools razz simulator&lt;/a&gt;, you can enter ranges of hands for each player. For instance, if you have a2 with a 9 up, and you see an early raiser showing a seven with a bunch of low cards following, you might put him on a range of 'a seven up with two downcards seven or lower without any duplicates'. &lt;a href="http://propokertools.com/simulations/show?d=kj524&amp;amp;g=rz&amp;amp;h1=a29&amp;amp;h2=%287-7-7%29"&gt;Here is a link to this situation in propokertools&lt;/a&gt; with some dead cards added, assuming everyone but the raiser folds to you. Our simulation gives a29 around 42% all-in equity in this situation.&lt;br /&gt;&lt;br /&gt;"But how are the random hands generated?" you ask. Fair enough. Essentially, for each possible rank in each hand, a selection is made randomly. Then, some statistics are performed to ensure a fair probability for that choice (please pardon the hand-waving here as this part of the algorithm is not important for the purposes of this discussion). Then, the next rank is chosen, etc. etc.&lt;br /&gt;&lt;br /&gt;For instance, for our a29 hand, we always choose an ace, a two, and a nine, since no 'range of hands' syntax was employed for any of the cards.&lt;br /&gt;&lt;br /&gt;For the (7-7-7) hand, we first choose a rank for the first downcard at random (lets say 6), then the second downcard( lets say 4), and then we always choose a 7 for the third card. Great, we chose 647. (If the second card chosen happened to also be a 6, we would have had to start over, as our range stipulates no duplicate ranks in the first three cards).&lt;br /&gt;&lt;br /&gt;So, we have two 'real' hands a29 vs 647 - we can now deal out the rest of the cards for each hand and see who won (or if there was a tie).&lt;br /&gt;&lt;br /&gt;Wash/rinse/repeat 600,000 times and VOILA! 42% equity.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Investigating the Old Approach&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's say we race "(3-3-)45678" vs "A345678" with no dead cards. The Old Approach involves picking a random rank for each of the "3-" cards.&lt;br /&gt;&lt;br /&gt;For the first card, if we randomly pick a deuce, then our choices for the next card are an ace or a three, with equal probability. We win with the ace and lose with the three, giving 50% equity on average when we pick a deuce for the first card.&lt;br /&gt;&lt;br /&gt;For the first card, if we randomly pick an ace, we then have four ways to pick a deuce and three ways to pick a three for the second card. Picking a deuce for the second card nets a win, and a three gets a tie. So, on average, we win 4 times and tie 3 times for every seven random ace picks.&lt;br /&gt;&lt;br /&gt;For the first card, if we randomly pick a three, the situation is the opposite of picking an ace. We lose 4 times and tie 3 times for every seven times this happens.&lt;br /&gt;&lt;br /&gt;It should be obvious at this point that the Old Approach gives us 50% equity on average, which matches our intuition nicely.&lt;br /&gt;&lt;br /&gt;Now, for the problem scenario lets race &lt;/span&gt;&lt;span style="font-size:100%;"&gt;"(3-2-)45678" vs "A345678". Notice that the only thing I did was change the second rank of the first hand from '3-' to '2-'.  This causes the equities to change from being even to being 2 to 1. That's right - with the Old Approach, the  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;"(3-2-)45678" gets 66.66% equity. I now quote from jbrennan's post on 2+2 which efficiently explains why this is the case:&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;the simulator would seem to do this:&lt;br /&gt;&lt;br /&gt;A2 -- valid hand&lt;br /&gt;A3 -- NOT valid (second card not a deuce or less)&lt;br /&gt;2A -- valid hand&lt;br /&gt;23 -- NOT valid (second card not a deuce or less)&lt;br /&gt;3A -- valid hand&lt;br /&gt;32 -- valid hand&lt;br /&gt;&lt;br /&gt;Since A2, 2A, or 32 can each happen 12 ways, and 3A can happen 9 ways, we end up with 45 possible hands -- 24 winners, 12 losers, and 9 ties. That matches up exactly with the output of the simulator&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;The Problem with the Old Approach&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The difference in equity between the '(3-3-)' '(3-2-) hands is highly counter-intuitive. In both cases, it seems pretty clear that the person running the simulation intended 'two downcards 3 or lower that are different'. That person most certainly did NOT mean 'look at the first downcard - if it is a three or lower, look at the second downcard - if a nonmatching ace or deuce, play the hand'.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Downcards should not be ordered.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The New Approach&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I scrapped the old random razz hand generation code and instead retrofitted the existing, well-used code for generating hands in hold'em and omaha. Here is the algorithm that translates a 'suitless' razz simulation into a 'suitfull' one.&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Examine each rank in the simulation.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;For cards where only one rank is possible (dead cards, ranks in hands like 'a23'), pick a card from the deck with the appropriate rank and assign it as part of the range. Remove that card from the deck.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;For cards where more than one rank is possible, assign a range consisting of the specified ranks and any suit.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Remove any sequences of ranks in hands that violate the 'no pairs' constraints (the parentheses used to force no duplicates)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Race!&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;Here is an example of the procedure applied to "A345678" vs "(3-3-)45678"&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Assigning arbitrary suits to non-range-based ranks, we have "As3s4s5s6s7s8s" vs "(3-3-)4h5h6h7h8h, and As3s4s5s6s7s8s4h5h6h7h8h are removed from the deck.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Assigning ranges, we have  "As3s4s5s6s7s8s" vs  "[3*|2*|a*][3*|2*|a*]4s5s6s7s8s" (where * indicates any suit). (I will not list all of the possibilities for the second hand here).&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Remove hands that violate the constraints (hands like 33..., 22... from hand two).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;We're done!&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;You can walk through these steps yourself and see that the ranges do not change if you alter the (3-3) to read (3-2) - the equities are 50% for both simulations.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-2938799683634203890?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/2938799683634203890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=2938799683634203890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/2938799683634203890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/2938799683634203890'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2010/04/fixing-razz.html' title='Fixing Razz'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-8824086352156680772</id><published>2010-04-02T10:23:00.001-07:00</published><updated>2010-04-02T10:43:17.461-07:00</updated><title type='text'>ProPokerTools gets a Makeover</title><content type='html'>&lt;span style="font-size:130%;"&gt;ProPokerTools gets a Makeover&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;ProPokerTools has been around for a while now, and I've been humbled by the continued encouragement and support of the poker community. I've generally been proud of the work I've done on the site, and in general I would categorize it as a successful web app.&lt;br /&gt;&lt;br /&gt;Except for one aspect - the, um, WEB part of it. Yeah.&lt;br /&gt;&lt;br /&gt;Though undoubtedly useful,  the design felt dated from day one. In all honesty, I had only a rudimentary understanding of how to design web interfaces when I began. Scratch that - I had NO IDEA how to design a web interface. Now I can confidently say that my web design skills have advanced from nonexistent to merely mediocre. Progress!&lt;br /&gt;&lt;br /&gt;I hope you like the new implementation of the &lt;a href="http://propokertools.com/simulations"&gt;ProPokerTools Simulator&lt;/a&gt;. I certainly find it easier to use and nicer to look at, but then again, not everyone is like me. If you have any feedback, any feedback at all, please email support at propokertools dot com or leave a comment here.&lt;br /&gt;&lt;br /&gt;Depending on how things go (and how donations/advertising works out), I may be hiring a friend who is actually GOOD at ui design to do a once over of the site. At the very least I should be able to get a decent logo out of him. Stay tuned.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;New Front-end, Same Back-end Goodness&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;I'm using a &lt;a href="http://rubyonrails.org/"&gt;more modern&lt;/a&gt; technology for serving up the ProPokerTools web pages, but the actual simulation code has not changed. I made this change for two reasons:&lt;br /&gt;&lt;br /&gt;1) I actually know a few things about the newer framework, as I work with it in one of my day jobs.&lt;br /&gt;2) I can implement changes to the site far, far more rapidly than before.&lt;br /&gt;&lt;br /&gt;So far the switchover has proved (relatively) painless. Kudos to the folks at &lt;a href="http://rimuhosting.com"&gt;RimuHosting&lt;/a&gt; for keeping my servers running.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-8824086352156680772?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/8824086352156680772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=8824086352156680772' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/8824086352156680772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/8824086352156680772'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2010/04/propokertools-gets-makeover.html' title='ProPokerTools gets a Makeover'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-115522758697112457</id><published>2006-08-10T09:08:00.000-07:00</published><updated>2006-08-10T09:33:06.983-07:00</updated><title type='text'>Well that's embarassing...</title><content type='html'>Last night I did something I rarely do. I complained about my bad run at poker -  to my wife, no less (who is an angel and very supportive). "I  just feel like I can't beat this game anymore," is something I recall saying. "Did I ever know how to play?" She was very nice, but had to leave for an outing with a friend.  So what did I do? I played poker online, of course.&lt;br /&gt;&lt;br /&gt;I entered a $33 limit hold'em tournament, which was already a mistake, as I had intended to enter a no-limit tournament.  There were 60 players. Going into the final table, I was one of the top four stacks. By the time we got down to two players, my opponent had a 9-1 chip lead.&lt;br /&gt;&lt;br /&gt;I won.&lt;br /&gt;&lt;br /&gt;Moral of the story? I guess I should complain about my bad luck more often...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-115522758697112457?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/115522758697112457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=115522758697112457' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/115522758697112457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/115522758697112457'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2006/08/well-thats-embarassing.html' title='Well that&apos;s embarassing...'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-115395577448231943</id><published>2006-07-26T16:13:00.000-07:00</published><updated>2006-07-26T16:16:14.503-07:00</updated><title type='text'>Downloadable Hand Orderings</title><content type='html'>By popular demand, here are the generated hand orderings as described in &lt;a href="http://pokercoder.blogspot.com/2006/07/towards-meaningful-ordering-of-hands.html"&gt;this blog entry :&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.propokertools.com/simulator/heordering.txt"&gt;Hold'em hand ordering&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.propokertools.com/simulator/ohordering.txt"&gt;Omaha-hi hand ordering&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.propokertools.com/simulator/o8ordering.txt"&gt;Omaha-hi/lo hand ordering&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-115395577448231943?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/115395577448231943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=115395577448231943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/115395577448231943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/115395577448231943'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2006/07/downloadable-hand-orderings.html' title='Downloadable Hand Orderings'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-115300843704157471</id><published>2006-07-15T15:50:00.000-07:00</published><updated>2006-07-26T16:01:59.216-07:00</updated><title type='text'>Towards a Meaningful Ordering of Hands</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Overview&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Many poker books include chapters with hand rankings, and many software tools (including some at propokertools.com) support specifying the top N% of hands. Almost immediately the question arises - how do we create a meaningful ordering of hands?&lt;br /&gt;&lt;br /&gt;One possibility is to use human judgement in creating hand rankings. This has worked fairly well in strategy books on hold'em, partly because the game is reasonably well understood, and partly because there are only a small number of distinct hold'em hands (169 to be exact).  For omaha, it is not practical to list all the hands in a chart, as there are 16,432 distinct hands. Some authors have come up with point systems for evaluating omaha hand strength, and others have given general guidelines.&lt;br /&gt;&lt;br /&gt;A second possibility is to race each possible hand against a set of random hands (say, two or three). Up until recently, propokertools.com used this approach. It is very easy to generate an ordering this way with less than a hundred lines of computer code, and the result will have no human biases.  Upon inspection, however, the results leave something to be desired. This is not surprising, as random hands are rarely played in practice.&lt;br /&gt;&lt;br /&gt;A third possibility is described by Billings, Davidson, Schaeffer and Szafron in &lt;a href="http://www.cs.ualberta.ca/%7Eduane/pdf/2002aij.pdf"&gt;"The challenge of poker"&lt;/a&gt; (a paper in "Artificial Intelligence"). At propokertools.com, we use hand orderings inspired by their approach. We created an evolutionary computer simulation, whereby the set of "good hands" is gradually refined, and hands are ranked against other "good hands".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Evolution Program&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To generate the ordering for each game:&lt;br /&gt;&lt;br /&gt;Perform the following computation a total of ten times:&lt;br /&gt;For each possible hand h:&lt;br /&gt;Do the following many times (where "many" doubles each iteration):&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Deal the hand h, and add one chip to the pot&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Deal one random hand b, and add one chip to the pot (to simulate a "blind" hand)&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Deal eight random hands. For each "good" hand (defined later), add one chip to the pot (to simulate a player calling). For all the rest, fold the hand&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Deal a board, and award the pot to the winner(s)&lt;/li&gt;&lt;/ul&gt;We define a "good" hand as one which, on average, wins more than one chip from the pot. Put another way, a "good" hand is one that does better than break-even.  For the first iteration, all hands are considered "good" hands. As the simulation is run, the set of good hands shrinks, and by the seventh iteration or so it becomes fairly stable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Some Interesting Results&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Top 15 hands by game&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hold'em : AA, KK, QQ, JJ, AKs, TT, AKo, AQs, 99, AJs&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Omaha hi (all double suited): AAJJ, AATT, AAQQ, AAJT, AA55, AAKK, AA44, AA66, AA99, AA77&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Omaha hi/lo: AxAy2x3y, AxAy2x4y, AxAy2x5y, AxAy2x2y, AxAy3x4y, AxAy2z3x, AxAy2x6y, AxAy2x3z, AxAy3x5y, AxAy2z4x&lt;/li&gt;&lt;/ul&gt;Speaking subjectively, these results look pretty good to me. For hold'em, I might put AQo ahead of AJs. For omaha, the numerical results are very close - this is not surprising given the relatively large set of hands possible. A small bit of random variation could easily have moved some hands up or down a few spots.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Percentage of "good" hands by game after the last iteration&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hold'em: 13% of hands are "good" (last "good" hand is KJo)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Omaha hi: 15% of hands are "good" (last "good" hand is QxQyJz3x)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Omaha hi/lo: 15.5% of hands are "good" (last "good" hand is AxJxTx4x)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Profitability of "best" hand by game&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hold'em: AA rates 2.046&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Omaha hi: AAJJ double suited rates 1.568&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Omaha hi/lo: AA23 double suited rates 1.571&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Limitations of this Approach&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As with any approach based on all hands going to river, caution must be used when interpreting the results. Furthermore, as our method uses random results, the generated orderings will be different each time our evolution program is run. In the future we will be performing experiments to see how much variation there is from run to run. We also plan on running the evolution program for games with less than 10 players to see what differences arise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-115300843704157471?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/115300843704157471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=115300843704157471' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/115300843704157471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/115300843704157471'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2006/07/towards-meaningful-ordering-of-hands.html' title='Towards a Meaningful Ordering of Hands'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23679668.post-114184484871541083</id><published>2006-03-08T10:45:00.000-08:00</published><updated>2010-04-02T10:22:00.425-07:00</updated><title type='text'>Mission statement</title><content type='html'>Before I jump head first into my first "real" post, I thought it would be good to describe the purpose of this blog. In approximate order of importance, are&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Commentary on the continuing development of &lt;a href="http://www.propokertools.com/"&gt;ProPokerTools&lt;/a&gt;, my web-based poker application suite&lt;/li&gt;&lt;li&gt;Examples of how to use ProPokerTools in a blog&lt;/li&gt;&lt;li&gt;Random commentary.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That's pretty much it. Hope you enjoy it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23679668-114184484871541083?l=pokercoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pokercoder.blogspot.com/feeds/114184484871541083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23679668&amp;postID=114184484871541083' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/114184484871541083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23679668/posts/default/114184484871541083'/><link rel='alternate' type='text/html' href='http://pokercoder.blogspot.com/2006/03/mission-statement.html' title='Mission statement'/><author><name>ProPokerTools</name><uri>http://www.blogger.com/profile/05492268575430803313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_alualghV9uw/TThr4Qu5g3I/AAAAAAAAAAU/cnzecPJBUVU/S220/icontightcrop.png'/></author><thr:total>1</thr:total></entry></feed>
